Save invoice then choose mark paid, shown discard changes

This commit is contained in:
Hillel Coren 2022-09-15 09:15:55 +03:00
parent 342da329d4
commit ce9e83aae0
35 changed files with 35 additions and 192 deletions

View File

@ -17,58 +17,36 @@ import 'package:invoiceninja_flutter/constants.dart';
import 'package:invoiceninja_flutter/data/models/account_model.dart';
import 'package:invoiceninja_flutter/data/models/models.dart';
import 'package:invoiceninja_flutter/redux/auth/auth_state.dart';
import 'package:invoiceninja_flutter/redux/client/client_selectors.dart';
import 'package:invoiceninja_flutter/redux/client/client_state.dart';
import 'package:invoiceninja_flutter/redux/company/company_state.dart';
import 'package:invoiceninja_flutter/redux/company_gateway/company_gateway_selectors.dart';
import 'package:invoiceninja_flutter/redux/company_gateway/company_gateway_state.dart';
import 'package:invoiceninja_flutter/redux/credit/credit_selectors.dart';
import 'package:invoiceninja_flutter/redux/credit/credit_state.dart';
import 'package:invoiceninja_flutter/redux/dashboard/dashboard_state.dart';
import 'package:invoiceninja_flutter/redux/design/design_selectors.dart';
import 'package:invoiceninja_flutter/redux/design/design_state.dart';
import 'package:invoiceninja_flutter/redux/document/document_state.dart';
import 'package:invoiceninja_flutter/redux/expense/expense_selectors.dart';
import 'package:invoiceninja_flutter/redux/expense/expense_state.dart';
import 'package:invoiceninja_flutter/redux/expense_category/expense_category_selectors.dart';
import 'package:invoiceninja_flutter/redux/expense_category/expense_category_state.dart';
import 'package:invoiceninja_flutter/redux/group/group_selectors.dart';
import 'package:invoiceninja_flutter/redux/group/group_state.dart';
import 'package:invoiceninja_flutter/redux/invoice/invoice_selectors.dart';
import 'package:invoiceninja_flutter/redux/invoice/invoice_state.dart';
import 'package:invoiceninja_flutter/redux/payment/payment_selectors.dart';
import 'package:invoiceninja_flutter/redux/payment/payment_state.dart';
import 'package:invoiceninja_flutter/redux/payment_term/payment_term_selectors.dart';
import 'package:invoiceninja_flutter/redux/payment_term/payment_term_state.dart';
import 'package:invoiceninja_flutter/redux/product/product_selectors.dart';
import 'package:invoiceninja_flutter/redux/product/product_state.dart';
import 'package:invoiceninja_flutter/redux/project/project_selectors.dart';
import 'package:invoiceninja_flutter/redux/project/project_state.dart';
import 'package:invoiceninja_flutter/redux/quote/quote_selectors.dart';
import 'package:invoiceninja_flutter/redux/quote/quote_state.dart';
import 'package:invoiceninja_flutter/redux/recurring_expense/recurring_expense_selectors.dart';
import 'package:invoiceninja_flutter/redux/recurring_expense/recurring_expense_state.dart';
import 'package:invoiceninja_flutter/redux/recurring_invoice/recurring_invoice_selectors.dart';
import 'package:invoiceninja_flutter/redux/recurring_invoice/recurring_invoice_state.dart';
import 'package:invoiceninja_flutter/redux/static/static_state.dart';
import 'package:invoiceninja_flutter/redux/subscription/subscription_selectors.dart';
import 'package:invoiceninja_flutter/redux/subscription/subscription_state.dart';
import 'package:invoiceninja_flutter/redux/task/task_selectors.dart';
import 'package:invoiceninja_flutter/redux/task/task_state.dart';
import 'package:invoiceninja_flutter/redux/task_status/task_status_selectors.dart';
import 'package:invoiceninja_flutter/redux/task_status/task_status_state.dart';
import 'package:invoiceninja_flutter/redux/tax_rate/tax_rate_selectors.dart';
import 'package:invoiceninja_flutter/redux/tax_rate/tax_rate_state.dart';
import 'package:invoiceninja_flutter/redux/token/token_selectors.dart';
import 'package:invoiceninja_flutter/redux/token/token_state.dart';
import 'package:invoiceninja_flutter/redux/ui/entity_ui_state.dart';
import 'package:invoiceninja_flutter/redux/ui/list_ui_state.dart';
import 'package:invoiceninja_flutter/redux/ui/pref_state.dart';
import 'package:invoiceninja_flutter/redux/ui/ui_state.dart';
import 'package:invoiceninja_flutter/redux/user/user_state.dart';
import 'package:invoiceninja_flutter/redux/vendor/vendor_selectors.dart';
import 'package:invoiceninja_flutter/redux/vendor/vendor_state.dart';
import 'package:invoiceninja_flutter/redux/webhook/webhook_selectors.dart';
import 'package:invoiceninja_flutter/redux/webhook/webhook_state.dart';
import 'package:invoiceninja_flutter/ui/app/screen_imports.dart';
import 'package:invoiceninja_flutter/ui/credit/credit_screen.dart';
@ -87,15 +65,12 @@ import 'package:invoiceninja_flutter/ui/webhook/edit/webhook_edit_vm.dart';
import 'package:invoiceninja_flutter/utils/colors.dart';
import 'package:invoiceninja_flutter/utils/formatting.dart';
import 'package:invoiceninja_flutter/utils/platforms.dart';
// STARTER: import - do not remove comment
import 'package:invoiceninja_flutter/redux/transaction/transaction_state.dart';
import 'package:invoiceninja_flutter/ui/transaction/edit/transaction_edit_vm.dart';
import 'package:invoiceninja_flutter/redux/transaction/transaction_selectors.dart';
import 'package:invoiceninja_flutter/redux/bank_account/bank_account_state.dart';
import 'package:invoiceninja_flutter/redux/purchase_order/purchase_order_state.dart';
import 'package:invoiceninja_flutter/ui/purchase_order/edit/purchase_order_edit_vm.dart';
import 'package:invoiceninja_flutter/redux/purchase_order/purchase_order_selectors.dart';
// STARTER: import - do not remove comment
part 'app_state.g.dart';
@ -702,64 +677,54 @@ abstract class AppState implements Built<AppState, AppStateBuilder> {
bool hasChanges() {
switch (uiState.currentRoute) {
case ClientEditScreen.route:
return hasClientChanges(clientUIState.editing, clientState.map);
return clientUIState.editing.isChanged == true;
case ProductEditScreen.route:
return hasProductChanges(productUIState.editing, productState.map);
return productUIState.editing.isChanged == true;
case InvoiceEditScreen.route:
return hasInvoiceChanges(invoiceUIState.editing, invoiceState.map);
return invoiceUIState.editing.isChanged == true;
case PaymentEditScreen.route:
return hasPaymentChanges(paymentUIState.editing, paymentState.map);
return paymentUIState.editing.isChanged == true;
case QuoteEditScreen.route:
return hasQuoteChanges(quoteUIState.editing, quoteState.map);
return quoteUIState.editing.isChanged == true;
case ProjectEditScreen.route:
return hasProjectChanges(projectUIState.editing, projectState.map);
return projectUIState.editing.isChanged == true;
case TaskEditScreen.route:
return hasTaskChanges(taskUIState.editing, taskState.map);
return taskUIState.editing.isChanged == true;
case VendorEditScreen.route:
return hasVendorChanges(vendorUIState.editing, vendorState.map);
return vendorUIState.editing.isChanged == true;
case ExpenseEditScreen.route:
return hasExpenseChanges(expenseUIState.editing, expenseState.map);
return expenseUIState.editing.isChanged == true;
case GroupEditScreen.route:
return hasGroupChanges(groupUIState.editing, groupState.map);
return groupUIState.editing.isChanged == true;
case TaxRateEditScreen.route:
return hasTaxRateChanges(taxRateUIState.editing, taxRateState.map);
return taxRateUIState.editing.isChanged == true;
case CompanyGatewayEditScreen.route:
return hasCompanyGatewayChanges(
companyGatewayUIState.editing, companyGatewayState.map);
return companyGatewayUIState.editing.isChanged == true;
case CreditEditScreen.route:
return hasCreditChanges(creditUIState.editing, creditState.map);
return creditUIState.editing.isChanged == true;
// STARTER: has changes - do not remove comment
case TransactionEditScreen.route:
return hasTransactionChanges(
transactionUIState.editing, transactionState.map);
return transactionUIState.editing.isChanged == true;
case PurchaseOrderEditScreen.route:
return hasPurchaseOrderChanges(
purchaseOrderUIState.editing, purchaseOrderState.map);
return purchaseOrderUIState.editing.isChanged == true;
case RecurringExpenseEditScreen.route:
return hasRecurringExpenseChanges(
recurringExpenseUIState.editing, recurringExpenseState.map);
return recurringExpenseUIState.editing.isChanged == true;
case SubscriptionEditScreen.route:
return hasSubscriptionChanges(
subscriptionUIState.editing, subscriptionState.map);
return subscriptionUIState.editing.isChanged == true;
case TaskStatusEditScreen.route:
return hasTaskStatusChanges(
taskStatusUIState.editing, taskStatusState.map);
return taskStatusUIState.editing.isChanged == true;
case ExpenseCategoryEditScreen.route:
return hasExpenseCategoryChanges(
expenseCategoryUIState.editing, expenseCategoryState.map);
return expenseCategoryUIState.editing.isChanged == true;
case RecurringInvoiceEditScreen.route:
return hasRecurringInvoiceChanges(
recurringInvoiceUIState.editing, recurringInvoiceState.map);
return recurringInvoiceUIState.editing.isChanged == true;
case WebhookEditScreen.route:
return hasWebhookChanges(webhookUIState.editing, webhookState.map);
return webhookUIState.editing.isChanged == true;
case TokenEditScreen.route:
return hasTokenChanges(tokenUIState.editing, tokenState.map);
return tokenUIState.editing.isChanged == true;
case PaymentTermEditScreen.route:
return hasPaymentTermChanges(
paymentTermUIState.editing, paymentTermState.map);
return paymentTermUIState.editing.isChanged == true;
case DesignEditScreen.route:
return hasDesignChanges(designUIState.editing, designState.map);
return designUIState.editing.isChanged == true;
}
if (uiState.isInSettings) {

View File

@ -86,12 +86,6 @@ List<String> filteredCompanyGatewaysSelector(
return gatewaysIds;
}
bool hasCompanyGatewayChanges(CompanyGatewayEntity companyGateway,
BuiltMap<String, CompanyGatewayEntity> companyGatewayMap) =>
companyGateway.isNew
? companyGateway.isChanged
: companyGateway != companyGatewayMap[companyGateway.id];
var memoizedCalculateCompanyGatewayProcessed = memo2(
(String companyGatewayId, BuiltMap<String, PaymentEntity> paymentMap) =>
calculateCompanyGatewayProcessed(

View File

@ -238,7 +238,3 @@ EntityStats creditStatsForUser(
return EntityStats(countActive: countActive, countArchived: countArchived);
}
bool hasCreditChanges(
InvoiceEntity credit, BuiltMap<String, InvoiceEntity> creditMap) =>
credit.isNew ? credit.isChanged : credit != creditMap[credit.id];

View File

@ -64,10 +64,6 @@ List<String> filteredDesignsSelector(BuiltMap<String, DesignEntity> designMap,
return list;
}
bool hasDesignChanges(
DesignEntity design, BuiltMap<String, DesignEntity> designMap) =>
design.isNew ? design.isChanged : design != designMap[design.id];
String getDesignIdForClientByEntity(
{AppState state, String clientId, EntityType entityType}) {
final client = state.clientState.get(clientId);

View File

@ -381,7 +381,3 @@ EntityStats expenseStatsForUser(
return EntityStats(countActive: countActive, countArchived: countArchived);
}
bool hasExpenseChanges(
ExpenseEntity expense, BuiltMap<String, ExpenseEntity> expenseMap) =>
expense.isNew ? expense.isChanged : expense != expenseMap[expense.id];

View File

@ -124,8 +124,3 @@ EntityStats expenseStatsForExpenseCategory(
return EntityStats(countActive: countActive, countArchived: countArchived);
}
bool hasExpenseCategoryChanges(ExpenseCategoryEntity expenseCategory,
BuiltMap<String, ExpenseCategoryEntity> expenseCategoryMap) =>
expenseCategory.isNew
? expenseCategory.isChanged
: expenseCategory != expenseCategoryMap[expenseCategory.id];

View File

@ -89,7 +89,3 @@ EntityStats clientStatsForGroup(
return EntityStats(countActive: countActive, countArchived: countArchived);
}
bool hasGroupChanges(
GroupEntity group, BuiltMap<String, GroupEntity> groupMap) =>
group.isNew ? group.isChanged : group != groupMap[group.id];

View File

@ -350,7 +350,3 @@ int precisionForInvoice(AppState state, InvoiceEntity invoice) {
final currency = state.staticState.currencyMap[client.currencyId];
return currency?.precision ?? 2;
}
bool hasInvoiceChanges(
InvoiceEntity invoice, BuiltMap<String, InvoiceEntity> invoiceMap) =>
invoice.isNew ? invoice.isChanged : invoice != invoiceMap[invoice.id];

View File

@ -211,7 +211,3 @@ EntityStats paymentStatsForUser(
return EntityStats(countActive: countActive, countArchived: countArchived);
}
bool hasPaymentChanges(
PaymentEntity payment, BuiltMap<String, PaymentEntity> paymentMap) =>
payment.isNew ? payment.isChanged : payment != paymentMap[payment.id];

View File

@ -68,9 +68,3 @@ List<String> filteredPaymentTermsSelector(
return list;
}
bool hasPaymentTermChanges(PaymentTermEntity paymentTerm,
BuiltMap<String, PaymentTermEntity> paymentTermMap) =>
paymentTerm.isNew
? paymentTerm.isChanged
: paymentTerm != paymentTermMap[paymentTerm.id];

View File

@ -154,6 +154,3 @@ List<String> filteredProductsSelector(
return list;
}
bool hasProductChanges(
ProductEntity product, BuiltMap<String, ProductEntity> productMap) =>
product.isNew ? product.isChanged : product != productMap[product.id];

View File

@ -273,7 +273,3 @@ EntityStats projectStatsForUser(
return EntityStats(countActive: countActive, countArchived: countArchived);
}
bool hasProjectChanges(
ProjectEntity project, BuiltMap<String, ProjectEntity> projectMap) =>
project.isNew ? project.isChanged : project != projectMap[project.id];

View File

@ -198,8 +198,3 @@ EntityStats purchaseOrderStatsForVendor(
return EntityStats(countActive: countActive, countArchived: countArchived);
}
bool hasPurchaseOrderChanges(InvoiceEntity purchaseOrder,
BuiltMap<String, InvoiceEntity> purchaseOrderMap) =>
purchaseOrder.isNew
? purchaseOrder.isChanged
: purchaseOrder != purchaseOrderMap[purchaseOrder.id];

View File

@ -180,7 +180,3 @@ EntityStats quoteStatsForUser(
return EntityStats(countActive: countActive, countArchived: countArchived);
}
bool hasQuoteChanges(
InvoiceEntity quote, BuiltMap<String, InvoiceEntity> quoteMap) =>
quote.isNew ? quote.isChanged : quote != quoteMap[quote.id];

View File

@ -271,9 +271,3 @@ EntityStats recurringExpenseStatsForExpense(
return EntityStats(countActive: countActive, countArchived: countArchived);
}
bool hasRecurringExpenseChanges(ExpenseEntity recurringExpense,
BuiltMap<String, ExpenseEntity> recurringExpenseMap) =>
recurringExpense.isNew
? recurringExpense.isChanged
: recurringExpense != recurringExpenseMap[recurringExpense.id];

View File

@ -215,9 +215,3 @@ EntityStats recurringInvoiceStatsForSubscription(
return EntityStats(countActive: countActive, countArchived: countArchived);
}
bool hasRecurringInvoiceChanges(InvoiceEntity recurringInvoice,
BuiltMap<String, InvoiceEntity> recurringInvoiceMap) =>
recurringInvoice.isNew
? recurringInvoice.isChanged
: recurringInvoice != recurringInvoiceMap[recurringInvoice.id];

View File

@ -87,9 +87,3 @@ List<String> filteredSubscriptionsSelector(
return list;
}
bool hasSubscriptionChanges(SubscriptionEntity subscription,
BuiltMap<String, SubscriptionEntity> subscriptionMap) =>
subscription.isNew
? subscription.isChanged
: subscription != subscriptionMap[subscription.id];

View File

@ -468,6 +468,3 @@ EntityStats taskStatsForUser(
return EntityStats(countActive: countActive, countArchived: countArchived);
}
bool hasTaskChanges(TaskEntity task, BuiltMap<String, TaskEntity> taskMap) =>
task.isNew ? task.isChanged : task != taskMap[task.id];

View File

@ -153,12 +153,6 @@ EntityStats taskStatsForTaskStatus(
return EntityStats(countActive: countActive, countArchived: countArchived);
}
bool hasTaskStatusChanges(TaskStatusEntity taskStatus,
BuiltMap<String, TaskStatusEntity> taskStatusMap) =>
taskStatus.isNew
? taskStatus.isChanged
: taskStatus != taskStatusMap[taskStatus.id];
String defaultTaskStatusId(BuiltMap<String, TaskStatusEntity> taskStatusMap) {
final statusIds = taskStatusMap.keys.where((statusId) {
final status = taskStatusMap[statusId];

View File

@ -69,7 +69,3 @@ List<String> filteredTaxRatesSelector(
return list;
}
bool hasTaxRateChanges(
TaxRateEntity taxRate, BuiltMap<String, TaxRateEntity> taxRateMap) =>
taxRate.isNew ? taxRate.isChanged : taxRate != taxRateMap[taxRate.id];

View File

@ -76,7 +76,3 @@ List<String> filteredTokensSelector(
return list;
}
bool hasTokenChanges(
TokenEntity token, BuiltMap<String, TokenEntity> tokenMap) =>
token.isNew ? token.isChanged : token != tokenMap[token.id];

View File

@ -107,9 +107,3 @@ List<String> filteredTransactionsSelector(
return list;
}
bool hasTransactionChanges(TransactionEntity transaction,
BuiltMap<String, TransactionEntity> transactionMap) =>
transaction.isNew
? transaction.isChanged
: transaction != transactionMap[transaction.id];

View File

@ -129,7 +129,3 @@ double calculateVendorBalance(String vendorId, String currencyId,
return total;
}
bool hasVendorChanges(
VendorEntity vendor, BuiltMap<String, VendorEntity> vendorMap) =>
vendor.isNew ? vendor.isChanged : vendor != vendorMap[vendor.id];

View File

@ -77,7 +77,3 @@ List<String> filteredWebhooksSelector(
return list;
}
bool hasWebhookChanges(
WebhookEntity webhook, BuiltMap<String, WebhookEntity> webhookMap) =>
webhook.isNew ? webhook.isChanged : webhook != webhookMap[webhook.id];

View File

@ -19,7 +19,6 @@ import 'package:invoiceninja_flutter/utils/localization.dart';
import 'package:invoiceninja_flutter/utils/strings.dart';
import 'package:material_design_icons_flutter/material_design_icons_flutter.dart';
import 'package:url_launcher/url_launcher.dart';
import 'package:url_launcher/url_launcher_string.dart';
class ClientViewFullwidth extends StatefulWidget {
const ClientViewFullwidth({

View File

@ -18,7 +18,6 @@ import 'package:invoiceninja_flutter/main_app.dart';
import 'package:invoiceninja_flutter/redux/app/app_actions.dart';
import 'package:invoiceninja_flutter/redux/app/app_state.dart';
import 'package:invoiceninja_flutter/redux/credit/credit_actions.dart';
import 'package:invoiceninja_flutter/redux/credit/credit_selectors.dart';
import 'package:invoiceninja_flutter/redux/ui/ui_actions.dart';
import 'package:invoiceninja_flutter/ui/app/dialogs/error_dialog.dart';
import 'package:invoiceninja_flutter/ui/credit/edit/credit_edit.dart';
@ -100,7 +99,7 @@ class CreditEditVM extends AbstractInvoiceEditVM {
}
if (credit.isOld &&
!hasCreditChanges(credit, state.creditState.map) &&
credit.isChanged == false &&
action != null &&
action.isClientSide) {
handleEntityAction(credit, action);

View File

@ -9,7 +9,6 @@ import 'package:flutter_redux/flutter_redux.dart';
import 'package:flutter_styled_toast/flutter_styled_toast.dart';
import 'package:http/http.dart';
import 'package:invoiceninja_flutter/redux/document/document_actions.dart';
import 'package:invoiceninja_flutter/redux/expense/expense_selectors.dart';
import 'package:invoiceninja_flutter/utils/localization.dart';
import 'package:redux/redux.dart';
@ -154,7 +153,7 @@ class ExpenseEditVM extends AbstractExpenseEditVM {
final navigator = navigatorKey.currentState;
if (expense.isOld &&
!hasExpenseChanges(expense, state.expenseState.map) &&
expense.isChanged == false &&
action != null &&
action.isClientSide) {
handleEntityAction(expense, action);

View File

@ -19,7 +19,6 @@ import 'package:invoiceninja_flutter/main_app.dart';
import 'package:invoiceninja_flutter/redux/app/app_actions.dart';
import 'package:invoiceninja_flutter/redux/app/app_state.dart';
import 'package:invoiceninja_flutter/redux/invoice/invoice_actions.dart';
import 'package:invoiceninja_flutter/redux/invoice/invoice_selectors.dart';
import 'package:invoiceninja_flutter/redux/ui/ui_actions.dart';
import 'package:invoiceninja_flutter/ui/app/dialogs/error_dialog.dart';
import 'package:invoiceninja_flutter/ui/invoice/edit/invoice_edit.dart';
@ -153,7 +152,7 @@ class InvoiceEditVM extends AbstractInvoiceEditVM {
}
if (invoice.isOld &&
!hasInvoiceChanges(invoice, state.invoiceState.map) &&
invoice.isChanged == false &&
action != null &&
action.isClientSide) {
handleEntityAction(invoice, action);

View File

@ -10,7 +10,6 @@ import 'package:flutter_styled_toast/flutter_styled_toast.dart';
import 'package:http/http.dart';
import 'package:invoiceninja_flutter/redux/document/document_actions.dart';
import 'package:invoiceninja_flutter/redux/purchase_order/purchase_order_actions.dart';
import 'package:invoiceninja_flutter/redux/purchase_order/purchase_order_selectors.dart';
import 'package:invoiceninja_flutter/ui/purchase_order/edit/purchase_order_edit.dart';
import 'package:invoiceninja_flutter/ui/purchase_order/view/purchase_order_view_vm.dart';
import 'package:invoiceninja_flutter/utils/localization.dart';
@ -99,8 +98,7 @@ class PurchaseOrderEditVM extends AbstractInvoiceEditVM {
return null;
}
if (purchaseOrder.isOld &&
!hasPurchaseOrderChanges(
purchaseOrder, state.purchaseOrderState.map) &&
purchaseOrder.isChanged == false &&
action != null &&
action.isClientSide) {
handleEntityAction(purchaseOrder, action);

View File

@ -18,7 +18,6 @@ import 'package:invoiceninja_flutter/main_app.dart';
import 'package:invoiceninja_flutter/redux/app/app_actions.dart';
import 'package:invoiceninja_flutter/redux/app/app_state.dart';
import 'package:invoiceninja_flutter/redux/quote/quote_actions.dart';
import 'package:invoiceninja_flutter/redux/quote/quote_selectors.dart';
import 'package:invoiceninja_flutter/redux/ui/ui_actions.dart';
import 'package:invoiceninja_flutter/ui/app/dialogs/error_dialog.dart';
import 'package:invoiceninja_flutter/ui/invoice/edit/invoice_edit_vm.dart';
@ -99,7 +98,7 @@ class QuoteEditVM extends AbstractInvoiceEditVM {
return null;
}
if (quote.isOld &&
!hasQuoteChanges(quote, state.quoteState.map) &&
quote.isChanged == false &&
action != null &&
action.isClientSide) {
handleEntityAction(quote, action);

View File

@ -16,7 +16,6 @@ import 'package:invoiceninja_flutter/data/models/models.dart';
import 'package:invoiceninja_flutter/redux/app/app_actions.dart';
import 'package:invoiceninja_flutter/redux/app/app_state.dart';
import 'package:invoiceninja_flutter/redux/recurring_expense/recurring_expense_actions.dart';
import 'package:invoiceninja_flutter/redux/recurring_expense/recurring_expense_selectors.dart';
import 'package:invoiceninja_flutter/redux/ui/ui_actions.dart';
import 'package:invoiceninja_flutter/ui/app/dialogs/error_dialog.dart';
import 'package:invoiceninja_flutter/ui/expense/edit/expense_edit.dart';
@ -133,8 +132,7 @@ class RecurringExpenseEditVM extends AbstractExpenseEditVM {
final recurringExpense = store.state.recurringExpenseUIState.editing;
final localization = AppLocalization.of(context);
if (recurringExpense.isOld &&
!hasRecurringExpenseChanges(
recurringExpense, state.recurringExpenseState.map) &&
recurringExpense.isChanged == false &&
action != null &&
action.isClientSide) {
handleEntityAction(recurringExpense, action);

View File

@ -18,7 +18,6 @@ import 'package:invoiceninja_flutter/main_app.dart';
import 'package:invoiceninja_flutter/redux/app/app_actions.dart';
import 'package:invoiceninja_flutter/redux/app/app_state.dart';
import 'package:invoiceninja_flutter/redux/recurring_invoice/recurring_invoice_actions.dart';
import 'package:invoiceninja_flutter/redux/recurring_invoice/recurring_invoice_selectors.dart';
import 'package:invoiceninja_flutter/redux/ui/ui_actions.dart';
import 'package:invoiceninja_flutter/ui/app/dialogs/error_dialog.dart';
import 'package:invoiceninja_flutter/ui/invoice/edit/invoice_edit_vm.dart';
@ -100,8 +99,7 @@ class RecurringInvoiceEditVM extends AbstractInvoiceEditVM {
return null;
}
if (recurringInvoice.isOld &&
!hasRecurringInvoiceChanges(
recurringInvoice, state.recurringInvoiceState.map) &&
recurringInvoice.isChanged == false &&
action != null &&
action.isClientSide) {
handleEntityAction(recurringInvoice, action);

View File

@ -7,7 +7,6 @@ import 'package:flutter/material.dart';
// Package imports:
import 'package:flutter_redux/flutter_redux.dart';
import 'package:flutter_styled_toast/flutter_styled_toast.dart';
import 'package:invoiceninja_flutter/redux/task/task_selectors.dart';
import 'package:redux/redux.dart';
// Project imports:
@ -98,7 +97,7 @@ class TaskEditVM {
}
if (task.isOld &&
!hasTaskChanges(task, state.taskState.map) &&
task.isChanged == false &&
action != null &&
action.isClientSide) {
handleEntityAction(task, action);

View File

@ -187,7 +187,7 @@ else
# Link in new module
echo "app_state: import"
comment="STARTER: import - do not remove comment"
code="import 'package:${package}\/redux\/${module_snake}\/${module_snake}_state.dart';import 'package:${package}\/ui\/${module_snake}\/edit\/${module_snake}_edit_vm.dart';import 'package:${package}\/redux\/${module_snake}\/${module_snake}_selectors.dart';${lineBreak}"
code="import 'package:${package}\/redux\/${module_snake}\/${module_snake}_state.dart';import 'package:${package}\/ui\/${module_snake}\/edit\/${module_snake}_edit_vm.dart';${lineBreak}"
sed -i -e "s/$comment/$code${lineBreak}$comment/g" ./lib/redux/app/app_state.dart
echo "app_state: list"
@ -214,7 +214,7 @@ else
echo "app_state: has changes"
comment="STARTER: has changes - do not remove comment"
code="case ${Module}EditScreen.route: return has${Module}Changes(${module_camel}UIState.editing, ${module_camel}State.map);${lineBreak}"
code="case ${Module}EditScreen.route: return has${module_camel}UIState.editing.isChanged == true;${lineBreak}"
sed -i -e "s/$comment/$comment${lineBreak}$code/g" ./lib/redux/app/app_state.dart
for (( idx=${#fieldsArray[@]}-1 ; idx>=0 ; idx-- )) ; do

View File

@ -90,7 +90,3 @@ List<String> filteredStubsSelector(
return list;
}
bool hasStubChanges(
StubEntity stub, BuiltMap<String, StubEntity> stubMap) =>
stub.isNew ? stub.isChanged : stub != stubMap[stub.id];