From 3cd7bfa85abcb779e4a646ba9880b63c7da4d55f Mon Sep 17 00:00:00 2001 From: Robert Goldmann <deadlocker@gmx.de> Date: Wed, 11 Jan 2023 23:14:30 +0100 Subject: [PATCH] #724 - allow in place editing of transaction name and saving --- .../TransactionImportController.java | 46 +++++++++++--- .../csvimport/CsvTransaction.java | 7 ++- .../transactions/transactionImport.ftl | 61 +++++++++++-------- 3 files changed, 79 insertions(+), 35 deletions(-) diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/transactions/TransactionImportController.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/transactions/TransactionImportController.java index 314888174..d405b46fe 100644 --- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/transactions/TransactionImportController.java +++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/transactions/TransactionImportController.java @@ -198,6 +198,43 @@ public class TransactionImportController extends BaseController final CsvTransaction csvTransaction = transactionOptional.get(); csvTransaction.setStatus(CsvTransactionStatus.IMPORTED); + final Transaction newTransaction = createTransactionFromCsvTransaction(csvTransaction); + + // TODO use csvTransaction.getDate() instead of debug date + transactionService.prepareModelNewOrEdit(model, false, LocalDate.now(), false, newTransaction, accountService.getAllActivatedAccountsAsc()); + + if(type.equals("transfer")) + { + return ReturnValues.NEW_TRANSACTION_TRANSFER; + } + return ReturnValues.NEW_TRANSACTION_NORMAL; + } + + @PostMapping("/{index}/newTransactionInPlace") + public String newTransactionInPlace(WebRequest request, + @PathVariable("index") Integer index, + @ModelAttribute("NewTransactionInPlace") CsvTransaction newCsvTransaction) + { + final Optional<CsvTransaction> transactionOptional = getTransactionByIndex(request, index); + if(transactionOptional.isEmpty()) + { + return ReturnValues.REDIRECT_IMPORT; + } + + final CsvTransaction csvTransaction = transactionOptional.get(); + csvTransaction.setStatus(CsvTransactionStatus.IMPORTED); + + // update original CsvTransaction attributes with values from user (from newCsvTransaction) + csvTransaction.setName(newCsvTransaction.getName()); + + final Transaction newTransaction = createTransactionFromCsvTransaction(csvTransaction); + transactionService.getRepository().save(newTransaction); + + return ReturnValues.REDIRECT_IMPORT; + } + + private Transaction createTransactionFromCsvTransaction(CsvTransaction csvTransaction) + { final Transaction newTransaction = new Transaction(); // TODO parse first // newTransaction.setDate(csvTransaction.getDate()); @@ -208,14 +245,7 @@ public class TransactionImportController extends BaseController newTransaction.setAccount(helpers.getCurrentAccountOrDefault()); newTransaction.setCategory(categoryService.findByType(CategoryType.NONE)); - // TODO use csvTransaction.getDate() instead of debug date - transactionService.prepareModelNewOrEdit(model, false, LocalDate.now(), false, newTransaction, accountService.getAllActivatedAccountsAsc()); - - if(type.equals("transfer")) - { - return ReturnValues.NEW_TRANSACTION_TRANSFER; - } - return ReturnValues.NEW_TRANSACTION_NORMAL; + return newTransaction; } private void removeAllAttributes(WebRequest request) diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/transactions/csvimport/CsvTransaction.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/transactions/csvimport/CsvTransaction.java index 073da472e..0e698def1 100644 --- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/transactions/csvimport/CsvTransaction.java +++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/transactions/csvimport/CsvTransaction.java @@ -5,7 +5,7 @@ import java.util.Objects; public final class CsvTransaction { private final String date; - private final String name; + private String name; private final String amount; private CsvTransactionStatus status; @@ -27,6 +27,11 @@ public final class CsvTransaction return name; } + public void setName(String name) + { + this.name = name; + } + public String getAmount() { return amount; diff --git a/BudgetMasterServer/src/main/resources/templates/transactions/transactionImport.ftl b/BudgetMasterServer/src/main/resources/templates/transactions/transactionImport.ftl index c162a70f8..c31894679 100644 --- a/BudgetMasterServer/src/main/resources/templates/transactions/transactionImport.ftl +++ b/BudgetMasterServer/src/main/resources/templates/transactions/transactionImport.ftl @@ -206,32 +206,41 @@ <#macro renderCsvRow csvTransaction index> <tr> - <td><@statusBanner csvTransaction.getStatus()/></td> - <td>${csvTransaction.getDate()}</td> - <td>${csvTransaction.getName()}</td> - <td>${csvTransaction.getAmount()}</td> - <td> - <div class="fixed-action-btn edit-transaction-button"> - <a class="btn-floating btn-flat waves-effect waves-light no-padding text-default edit-transaction-button-link"> - <i class="material-icons">edit</i> - </a> - <ul class="new-transaction-button-list"> - <li> - <a href="<@s.url '/transactionImport/' + index + '/newTransaction/normal'/>" class="btn-floating btn mobile-fab-tip no-wrap">${locale.getString("title.transaction.new", locale.getString("title.transaction.new.normal"))}</a> - <a href="<@s.url '/transactionImport/' + index + '/newTransaction/normal'/>" class="btn-floating btn background-orange"><i class="material-icons">payment</i></a> - </li> - <li> - <a href="<@s.url '/transactionImport/' + index + '/newTransaction/transfer'/>" class="btn-floating btn mobile-fab-tip no-wrap">${locale.getString("title.transaction.new", locale.getString("title.transaction.new.transfer"))}</a> - <a href="<@s.url '/transactionImport/' + index + '/newTransaction/transfer'/>" class="btn-floating btn background-green-dark"><i class="material-icons">swap_horiz</i></a> - </li> - <li> - <a href="<@s.url '/transactionImport/' + index + '/newFromTemplate'/>" class="btn-floating btn mobile-fab-tip no-wrap">${locale.getString("title.transaction.new", locale.getString("title.transaction.new.from.template"))}</a> - <a href="<@s.url '/transactionImport/' + index + '/newFromTemplate'/>" class="btn-floating btn background-blue-baby"><i class="material-icons">file_copy</i></a> - </li> - </ul> - </div> - <@header.buttonFlat url='/transactionImport/' + index + '/skip' icon='block' localizationKey='' classes="no-padding text-default button-request-transaction-import-skip"/> - </td> + <form name="NewTransactionInPlace" method="POST" action="<@s.url '/transactionImport/' + index + '/newTransactionInPlace'/>"> + <input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/> + <td><@statusBanner csvTransaction.getStatus()/></td> + <td>${csvTransaction.getDate()}</td> + <td> + <div class="input-field"> + <input id="name-${index}" type="text" name="name" required value="${csvTransaction.getName()}"> + <label class="input-label" for="name-${index}">${locale.getString("transaction.new.label.name")}</label> + </div> + </td> + <td>${csvTransaction.getAmount()}</td> + <td> + <@header.buttonSubmit name='action' icon='save' localizationKey='' classes='text-white'/> + <div class="fixed-action-btn edit-transaction-button"> + <a class="btn-floating btn-flat waves-effect waves-light no-padding text-default edit-transaction-button-link"> + <i class="material-icons">edit</i> + </a> + <ul class="new-transaction-button-list"> + <li> + <a href="<@s.url '/transactionImport/' + index + '/newTransaction/normal'/>" class="btn-floating btn mobile-fab-tip no-wrap">${locale.getString("title.transaction.new", locale.getString("title.transaction.new.normal"))}</a> + <a href="<@s.url '/transactionImport/' + index + '/newTransaction/normal'/>" class="btn-floating btn background-orange"><i class="material-icons">payment</i></a> + </li> + <li> + <a href="<@s.url '/transactionImport/' + index + '/newTransaction/transfer'/>" class="btn-floating btn mobile-fab-tip no-wrap">${locale.getString("title.transaction.new", locale.getString("title.transaction.new.transfer"))}</a> + <a href="<@s.url '/transactionImport/' + index + '/newTransaction/transfer'/>" class="btn-floating btn background-green-dark"><i class="material-icons">swap_horiz</i></a> + </li> + <li> + <a href="<@s.url '/transactionImport/' + index + '/newFromTemplate'/>" class="btn-floating btn mobile-fab-tip no-wrap">${locale.getString("title.transaction.new", locale.getString("title.transaction.new.from.template"))}</a> + <a href="<@s.url '/transactionImport/' + index + '/newFromTemplate'/>" class="btn-floating btn background-blue-baby"><i class="material-icons">file_copy</i></a> + </li> + </ul> + </div> + <@header.buttonFlat url='/transactionImport/' + index + '/skip' icon='block' localizationKey='' classes="no-padding text-default button-request-transaction-import-skip"/> + </td> + </form> </tr> </#macro> -- GitLab