Skip to content
Snippets Groups Projects
Commit 3a8e7734 authored by Robert Goldmann's avatar Robert Goldmann
Browse files

#724 - collect column access errors and display them

parent 7221c5c2
Branches
Tags
No related merge requests found
...@@ -7,6 +7,7 @@ import de.deadlocker8.budgetmaster.controller.BaseController; ...@@ -7,6 +7,7 @@ import de.deadlocker8.budgetmaster.controller.BaseController;
import de.deadlocker8.budgetmaster.services.HelpersService; import de.deadlocker8.budgetmaster.services.HelpersService;
import de.deadlocker8.budgetmaster.transactions.csvimport.*; import de.deadlocker8.budgetmaster.transactions.csvimport.*;
import de.deadlocker8.budgetmaster.utils.Mappings; import de.deadlocker8.budgetmaster.utils.Mappings;
import de.thecodelabs.utils.util.Localization;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller; import org.springframework.stereotype.Controller;
import org.springframework.ui.Model; import org.springframework.ui.Model;
...@@ -33,7 +34,7 @@ public class TransactionImportController extends BaseController ...@@ -33,7 +34,7 @@ public class TransactionImportController extends BaseController
private static class ReturnValues private static class ReturnValues
{ {
public static final String TRANSACTION_IMPORT = "transactions/transactionImport"; public static final String TRANSACTION_IMPORT = "TRANSACTIONS/transactionImport";
public static final String REDIRECT_IMPORT = "redirect:/transactionImport"; public static final String REDIRECT_IMPORT = "redirect:/transactionImport";
public static final String REDIRECT_CANCEL = "redirect:/transactionImport/cancel"; public static final String REDIRECT_CANCEL = "redirect:/transactionImport/cancel";
public static final String NEW_TRANSACTION_NORMAL = "transactions/newTransactionNormal"; public static final String NEW_TRANSACTION_NORMAL = "transactions/newTransactionNormal";
...@@ -51,6 +52,8 @@ public class TransactionImportController extends BaseController ...@@ -51,6 +52,8 @@ public class TransactionImportController extends BaseController
public static final String CSV_TRANSACTIONS = "csvTransactions"; public static final String CSV_TRANSACTIONS = "csvTransactions";
public static final String ERROR_UPLOAD = "errorUpload"; public static final String ERROR_UPLOAD = "errorUpload";
public static final String ERROR_UPLOAD_FILE = "errorUploadFile"; public static final String ERROR_UPLOAD_FILE = "errorUploadFile";
public static final String ERRORS_COLUMN_SETTINGS = "errorsColumnSettings";
} }
private final TransactionService transactionService; private final TransactionService transactionService;
...@@ -150,14 +153,25 @@ public class TransactionImportController extends BaseController ...@@ -150,14 +153,25 @@ public class TransactionImportController extends BaseController
final List<CsvRow> csvRows = (List<CsvRow>) attribute; final List<CsvRow> csvRows = (List<CsvRow>) attribute;
final List<CsvTransaction> csvTransactions = new ArrayList<>(); final List<CsvTransaction> csvTransactions = new ArrayList<>();
for(CsvRow csvRow : csvRows) final List<String> errors = new ArrayList<>();
for(int i = 0; i < csvRows.size(); i++)
{
final CsvRow csvRow = csvRows.get(i);
try
{ {
final String date = csvRow.getColumns().get(csvColumnSettings.columnDate() - 1); final String date = csvRow.getColumns().get(csvColumnSettings.columnDate() - 1);
final String name = csvRow.getColumns().get(csvColumnSettings.columnName() - 1); final String name = csvRow.getColumns().get(csvColumnSettings.columnName() - 1);
final String amount = csvRow.getColumns().get(csvColumnSettings.columnAmount() - 1); final String amount = csvRow.getColumns().get(csvColumnSettings.columnAmount() - 1);
csvTransactions.add(new CsvTransaction(date, name, amount, CsvTransactionStatus.PENDING)); csvTransactions.add(new CsvTransaction(date, name, amount, CsvTransactionStatus.PENDING));
} }
catch(IndexOutOfBoundsException e)
{
LOGGER.error("Invalid access to column", e);
errors.add(Localization.getString("transactions.import.error.column", i, csvRow));
}
}
request.setAttribute(RequestAttributeNames.ERRORS_COLUMN_SETTINGS, errors, RequestAttributes.SCOPE_SESSION);
request.setAttribute(RequestAttributeNames.CSV_TRANSACTIONS, csvTransactions, RequestAttributes.SCOPE_SESSION); request.setAttribute(RequestAttributeNames.CSV_TRANSACTIONS, csvTransactions, RequestAttributes.SCOPE_SESSION);
return ReturnValues.REDIRECT_IMPORT; return ReturnValues.REDIRECT_IMPORT;
...@@ -255,6 +269,7 @@ public class TransactionImportController extends BaseController ...@@ -255,6 +269,7 @@ public class TransactionImportController extends BaseController
request.removeAttribute(RequestAttributeNames.CSV_TRANSACTIONS, RequestAttributes.SCOPE_SESSION); request.removeAttribute(RequestAttributeNames.CSV_TRANSACTIONS, RequestAttributes.SCOPE_SESSION);
request.removeAttribute(RequestAttributeNames.ERROR_UPLOAD, RequestAttributes.SCOPE_SESSION); request.removeAttribute(RequestAttributeNames.ERROR_UPLOAD, RequestAttributes.SCOPE_SESSION);
request.removeAttribute(RequestAttributeNames.ERROR_UPLOAD_FILE, RequestAttributes.SCOPE_SESSION); request.removeAttribute(RequestAttributeNames.ERROR_UPLOAD_FILE, RequestAttributes.SCOPE_SESSION);
request.removeAttribute(RequestAttributeNames.ERRORS_COLUMN_SETTINGS, RequestAttributes.SCOPE_SESSION);
} }
private Optional<CsvTransaction> getTransactionByIndex(WebRequest request, Integer index) private Optional<CsvTransaction> getTransactionByIndex(WebRequest request, Integer index)
......
...@@ -380,6 +380,7 @@ transactions.import.status.pending=ausstehend ...@@ -380,6 +380,7 @@ transactions.import.status.pending=ausstehend
transactions.import.status.imported=importiert transactions.import.status.imported=importiert
transactions.import.status.skipped=übersprungen transactions.import.status.skipped=übersprungen
transactions.import.actions=Aktionen transactions.import.actions=Aktionen
transactions.import.error.column=Zugeordnete Spalten in Zeile {0} (Zählung beginnt relativ zu Anzahl übersprungener Zeilen) nicht gefunden: {1}
repeating.button.add=Wiederholung hinzufügen repeating.button.add=Wiederholung hinzufügen
repeating.button.remove=Wiederholung entfernen repeating.button.remove=Wiederholung entfernen
......
...@@ -369,7 +369,7 @@ transaction.new.label.repeating=Repeating ...@@ -369,7 +369,7 @@ transaction.new.label.repeating=Repeating
transaction.new.label.repeating.all=Every transaction.new.label.repeating.all=Every
transactions.recurring.headline=Active Recurring Transactions transactions.recurring.headline=Active Recurring Transactions
transactions.recurring.placeholder=No active recurring transactions transactions.recurring.placeholder=No active recurring transactions
transactions.import.matchColumns=Match columns transactions.import.matchColumns=Associate columns
transactions.import.column=Column transactions.import.column=Column
transactions.import.separator=Separator transactions.import.separator=Separator
transactions.import.encoding=Encoding transactions.import.encoding=Encoding
...@@ -379,6 +379,7 @@ transactions.import.status.pending=pending ...@@ -379,6 +379,7 @@ transactions.import.status.pending=pending
transactions.import.status.imported=imported transactions.import.status.imported=imported
transactions.import.status.skipped=skipped transactions.import.status.skipped=skipped
transactions.import.actions=Actions transactions.import.actions=Actions
transactions.import.error.column=Associated columns not found in row {0} (counting starts relative to the number of skipped rows): {1}
repeating.button.add=Add repetition repeating.button.add=Add repetition
repeating.button.remove=Remove repetition repeating.button.remove=Remove repetition
......
...@@ -4,4 +4,6 @@ $(document).ready(function() ...@@ -4,4 +4,6 @@ $(document).ready(function()
direction: 'left', direction: 'left',
hoverEnabled: false hoverEnabled: false
}); });
$('.collapsible').collapsible();
}); });
\ No newline at end of file
...@@ -6,6 +6,7 @@ ...@@ -6,6 +6,7 @@
<@header.header "BudgetMaster - ${locale.getString('menu.transactions.import')}"/> <@header.header "BudgetMaster - ${locale.getString('menu.transactions.import')}"/>
<@header.style "transactions"/> <@header.style "transactions"/>
<@header.style "transactionImport"/> <@header.style "transactionImport"/>
<@header.style "collapsible"/>
<#import "/spring.ftl" as s> <#import "/spring.ftl" as s>
</head> </head>
<@header.body> <@header.body>
...@@ -43,6 +44,7 @@ ...@@ -43,6 +44,7 @@
<#if csvTransactions??> <#if csvTransactions??>
<@renderCsvTransactions/> <@renderCsvTransactions/>
<@showColumnSettingsErrors/>
<#elseif csvRows?? > <#elseif csvRows?? >
<div class="container"> <div class="container">
<div class="section center-align"> <div class="section center-align">
...@@ -217,7 +219,7 @@ ...@@ -217,7 +219,7 @@
</td> </td>
<td>${csvTransaction.getAmount()}</td> <td>${csvTransaction.getAmount()}</td>
<td> <td>
<@header.buttonSubmit name='action' icon='save' localizationKey='' classes='text-white'/> <@header.buttonSubmit name='action' icon='save' localizationKey='' classes='text-white'/>&nbsp;
<div class="fixed-action-btn edit-transaction-button"> <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"> <a class="btn-floating btn-flat waves-effect waves-light no-padding text-default edit-transaction-button-link">
<i class="material-icons">edit</i> <i class="material-icons">edit</i>
...@@ -243,6 +245,35 @@ ...@@ -243,6 +245,35 @@
</tr> </tr>
</#macro> </#macro>
<#macro showColumnSettingsErrors>
<#if errorsColumnSettings?has_content>
<div class="container">
<div class="row">
<div class="col s12">
<ul class="collapsible">
<li>
<div class="collapsible-header bold">
<i class="fas fa-exclamation-triangle text-red"></i>
${locale.getString("info.database.import.result.errors")}
</div>
<div class="collapsible-body">
<table class="bordered">
<#list errorsColumnSettings as error>
<tr>
<td><i class="fas fa-exclamation-triangle text-red"></i></td>
<td>${error}</td>
</tr>
</#list>
</table>
</div>
</li>
</ul>
</div>
</div>
</div>
</#if>
</#macro>
<#macro statusBanner status> <#macro statusBanner status>
<#if status.name() == "PENDING"> <#if status.name() == "PENDING">
<#assign bannerClasses="background-blue text-white"> <#assign bannerClasses="background-blue text-white">
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment