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 2c1dfcbdc81a22db18b597cf7e91c926f320ee92..e935ea0fe22cd3f427c828cabc28eec1ff21693f 100644 --- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/transactions/TransactionImportController.java +++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/transactions/TransactionImportController.java @@ -203,6 +203,19 @@ public class TransactionImportController extends BaseController return ReturnValues.REDIRECT_IMPORT; } + @GetMapping("/{index}/undoSkip") + public String undoSkip(WebRequest request, @PathVariable("index") Integer index) + { + final Optional<CsvTransaction> transactionOptional = getTransactionByIndex(request, index); + if(transactionOptional.isEmpty()) + { + return ReturnValues.REDIRECT_IMPORT; + } + + transactionOptional.get().setStatus(CsvTransactionStatus.PENDING); + return ReturnValues.REDIRECT_IMPORT; + } + @GetMapping("/{index}/newTransaction/{type}") public String newTransaction(WebRequest request, @PathVariable("index") Integer index, diff --git a/BudgetMasterServer/src/main/resources/templates/transactions/transactionImport.ftl b/BudgetMasterServer/src/main/resources/templates/transactions/transactionImport.ftl index 6f346846087e36fe8c66377cdcf86b0c4231a9ff..f08232c7ae6d14bfd6f1f6f64f6f0aaf9feee999 100644 --- a/BudgetMasterServer/src/main/resources/templates/transactions/transactionImport.ftl +++ b/BudgetMasterServer/src/main/resources/templates/transactions/transactionImport.ftl @@ -262,27 +262,31 @@ </td> <td data-order="${currencyService.getCurrencyString(csvTransaction.getAmount())}" data-search="${currencyService.getCurrencyString(csvTransaction.getAmount())}">${currencyService.getCurrencyString(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 text-default">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"/> + <#if csvTransaction.getStatus().name() == 'SKIPPED'> + <@header.buttonFlat url='/transactionImport/' + index + '/undoSkip' icon='do_disturb_off' localizationKey='' classes="no-padding text-default button-request-transaction-import-undo-skip"/> + <#else> + <@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 text-default">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='do_not_disturb_on' localizationKey='' classes="no-padding text-default button-request-transaction-import-skip"/> + </#if> </td> </form> </tr> diff --git a/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/integration/selenium/CsvImportTest.java b/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/integration/selenium/CsvImportTest.java index 475a0aaa76fc6318b9ab6096536a73717873acdf..c80818406dfc1ce1fdf4ed32ea61614ddff4e65a 100644 --- a/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/integration/selenium/CsvImportTest.java +++ b/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/integration/selenium/CsvImportTest.java @@ -278,6 +278,28 @@ class CsvImportTest extends SeleniumTestBase assertThat(driver.findElement(By.className("transaction-import-row-skipped")).isDisplayed()).isTrue(); } + @Test + void test_undoSkipRow() + { + uploadAndSetColumnSettings(); + List<WebElement> rows = driver.findElements(By.className("transaction-import-row")); + + // skip + rows.get(0).findElement(By.className("button-request-transaction-import-skip")).click(); + WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(5)); + wait.until(ExpectedConditions.visibilityOfElementLocated(By.className("transaction-import-row-skipped"))); + + assertThat(driver.findElement(By.className("transaction-import-row-skipped")).isDisplayed()).isTrue(); + + // undo skip + rows = driver.findElements(By.className("transaction-import-row")); + rows.get(0).findElement(By.className("button-request-transaction-import-undo-skip")).click(); + wait = new WebDriverWait(driver, Duration.ofSeconds(5)); + wait.until(ExpectedConditions.invisibilityOfElementLocated(By.className("transaction-import-row-skipped"))); + + assertThat(driver.findElements(By.className("transaction-import-row-skipped"))).isEmpty(); + } + @Test void test_saveInPlace() {