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 59b29e411407fb3b5ba3432c9e83e1e1bfa5c626..e5c8749e90d394f78802cab96282832f5b437f44 100644 --- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/transactions/TransactionImportController.java +++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/transactions/TransactionImportController.java @@ -91,6 +91,7 @@ public class TransactionImportController extends BaseController } model.addAttribute(ModelAttributes.CATEGORIES, categoryService.getAllEntitiesAsc()); + model.addAttribute(TransactionModelAttributes.SUGGESTIONS_JSON, transactionService.getNameSuggestionsJson()); model.addAttribute(ModelAttributes.CSV_IMPORT_SETTINGS, csvImportSettingsService.getCsvImportSettings()); return ReturnValues.TRANSACTION_IMPORT; diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/transactions/TransactionService.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/transactions/TransactionService.java index 7580ed7746c15f951d2e2e2dc517a9faab80cb80..a54b1cdb1bbd97133d69f91ac5fc81e2c033a6b9 100644 --- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/transactions/TransactionService.java +++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/transactions/TransactionService.java @@ -295,12 +295,16 @@ public class TransactionService implements Resettable model.addAttribute(TransactionModelAttributes.CATEGORIES, categoryService.getAllEntitiesAsc()); model.addAttribute(TransactionModelAttributes.ACCOUNTS, accounts); model.addAttribute(TransactionModelAttributes.TRANSACTION, item); + model.addAttribute(TransactionModelAttributes.SUGGESTIONS_JSON, getNameSuggestionsJson()); + } + public String getNameSuggestionsJson() + { final List<Transaction> allByOrderByDateDesc = getRepository().findAllByOrderByDateDesc(); final List<String> nameSuggestions = allByOrderByDateDesc.stream() .map(Transaction::getName) .distinct() .toList(); - model.addAttribute(TransactionModelAttributes.SUGGESTIONS_JSON, GSON.toJson(nameSuggestions)); + return GSON.toJson(nameSuggestions); } } diff --git a/BudgetMasterServer/src/main/resources/static/js/transactionImport.js b/BudgetMasterServer/src/main/resources/static/js/transactionImport.js index 5c048b1628262116d3bd3d169d80141a70486a57..9dbca023839451a6c232f91f4afce87a775dc76f 100644 --- a/BudgetMasterServer/src/main/resources/static/js/transactionImport.js +++ b/BudgetMasterServer/src/main/resources/static/js/transactionImport.js @@ -12,10 +12,24 @@ $(document).ready(function() order: [[1, 'desc']], info: false, scrollX: true, - scrollY: true, + scrollY: false, columnDefs: [ { orderable: false, targets: 5} ], language: { search: '' , searchPlaceholder: localizedSearch}, }); + + if(transactionNameSuggestions !== undefined) + { + let nameElements = document.querySelectorAll('.autocomplete'); + let autoCompleteInstances = M.Autocomplete.init(nameElements, { + data: transactionNameSuggestions, + }); + + // prevent tab traversal for dropdown (otherwise "tab" needs to be hit twice to jump from name input to amount input) + for(let i = 0; i < autoCompleteInstances.length; i++) + { + autoCompleteInstances[i].dropdown.dropdownEl.tabIndex = -1; + } + } }); \ No newline at end of file diff --git a/BudgetMasterServer/src/main/resources/templates/transactions/newTransactionMacros.ftl b/BudgetMasterServer/src/main/resources/templates/transactions/newTransactionMacros.ftl index a6bfaec7f38b21c76b9e36d58537df15180667b8..6e67af6474a4fc63c12c4cef4d5d35825ec31df9 100644 --- a/BudgetMasterServer/src/main/resources/templates/transactions/newTransactionMacros.ftl +++ b/BudgetMasterServer/src/main/resources/templates/transactions/newTransactionMacros.ftl @@ -62,6 +62,10 @@ </div> </div> + <@insertNameSuggestions/> +</#macro> + +<#macro insertNameSuggestions> <script> transactionNameSuggestions = {}; var nameSuggestions = ${suggestionsJSON}; diff --git a/BudgetMasterServer/src/main/resources/templates/transactions/transactionImport.ftl b/BudgetMasterServer/src/main/resources/templates/transactions/transactionImport.ftl index f963b0f5b29344aca07f7ce2091feb61235f8e06..7d9ee3d8c8ed6784da038fb2b720c59ff7ff3772 100644 --- a/BudgetMasterServer/src/main/resources/templates/transactions/transactionImport.ftl +++ b/BudgetMasterServer/src/main/resources/templates/transactions/transactionImport.ftl @@ -15,6 +15,7 @@ <@navbar.navbar "importCSV" settings/> <#import "transactionsMacros.ftl" as transactionMacros> + <#import "newTransactionMacros.ftl" as newTransactionMacros> <#import "../helpers/customSelectMacros.ftl" as customSelectMacros> <main> @@ -246,14 +247,14 @@ <tbody> <#list csvTransactions as csvTransaction> - <@renderCsvRow csvTransaction csvTransaction?index/> + <@renderCsvTransaction csvTransaction csvTransaction?index/> </#list> </tbody> </table> </div> </#macro> -<#macro renderCsvRow csvTransaction index> +<#macro renderCsvTransaction csvTransaction index> <tr class="transaction-import-row <#if csvTransaction.getStatus().name() == 'SKIPPED'>transaction-import-row-skipped</#if>"> <form name="NewTransactionInPlace" method="POST" action="<@s.url '/transactionImport/' + index + '/newTransactionInPlace'/>"> <input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/> @@ -264,7 +265,7 @@ </td> <td data-order="${csvTransaction.getName()}" data-search="${csvTransaction.getName()}"> <div class="input-field no-margin-top no-margin-bottom"> - <input class="no-margin-bottom" type="text" name="name" required value="${csvTransaction.getName()}" <#if csvTransaction.getStatus().name() == 'SKIPPED'>disabled</#if>> + <input class="no-margin-bottom autocomplete" type="text" name="name" autocomplete="off" required value="${csvTransaction.getName()}" <#if csvTransaction.getStatus().name() == 'SKIPPED'>disabled</#if>> </div> </td> <td data-order="${csvTransaction.getDescription()}" data-search="${csvTransaction.getDescription()}"> @@ -302,6 +303,8 @@ </td> </form> </tr> + + <@newTransactionMacros.insertNameSuggestions/> </#macro> <#macro showColumnSettingsErrors>