Newer
Older
<html>
<head>
<#import "../helpers/header.ftl" as header>
<#import "../helpers/validation.ftl" as validation>
<@header.globals/>
<@header.header "BudgetMaster - ${locale.getString('menu.transactions.import')}"/>
<@header.style "transactions"/>
<@header.style "transactionImport"/>
<#import "/spring.ftl" as s>
</head>
<@header.body>
<#import "../helpers/navbar.ftl" as navbar>
<@navbar.navbar "importCSV" settings/>
<#import "transactionsMacros.ftl" as transactionMacros>
<main>
<div class="card main-card background-color">
<div class="container">
<div class="section center-align">
<div class="headline"><i class="fas fa-file-csv"></i> ${locale.getString("menu.transactions.import")}</div>
</div>
</div>
<@header.content>

Robert Goldmann
committed
<#if csvRows??>
<div class="col s12 m12 l8 offset-l2 headline-small text-green truncate">
<i class="fas fa-file-csv"></i> ${csvImport.getFileName()}
</div>
</div>
<div class="row center-align">
<div class="col s12">
<@header.buttonLink url='/transactionImport/cancel' icon='clear' localizationKey='cancel' color='red' classes='text-white'/>
</div>
</div>
<#else>
<@csvUpload/>
</#if>
</div>

Robert Goldmann
committed
<#if csvTransactions??>
<@renderCsvTransactions/>
<#elseif csvRows?? >
<div class="container">
<div class="section center-align">
<div class="headline-small">${locale.getString("transactions.import.matchColumns")}</div>
</div>
</div>
<@columnSettings/>
</@header.content>
</div>
</main>
<!-- Scripts-->
<#import "../helpers/scripts.ftl" as scripts>
<@scripts.scripts/>
<script src="<@s.url '/js/transactionImport.js'/>"></script>
</@header.body>
</html>
<#macro csvUpload>
<form id="form-csv-import" name="CsvImport" method="POST" action="<@s.url '/transactionImport/upload'/>" enctype="multipart/form-data" accept-charset="UTF-8">
<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/>
<div class="row">
<div class="col s12 m12 l8 offset-l2 file-field input-field">
<div class="btn background-blue">
<i class="fas fa-file-csv"></i>
<input id="inputCsvImport" type="file" accept=".csv" name="file">
</div>
<div class="file-path-wrapper">
<input class="file-path validate" type="text">
</div>
</div>
</div>
<div class="input-field col s4 l2 offset-l3">
<input id="separator" type="text" name="separator" <@validation.validation "separator" "center-align"/> value="<#if csvImport??>${csvImport.separator()}</#if>">
<label class="input-label" for="separator">${locale.getString("transactions.import.separator")}</label>
</div>
<div class="input-field col s4 l2">
<input id="encoding" type="text" name="encoding" <@validation.validation "encoding" "center-align"/> value="<#if csvImport??>${csvImport.encoding()?upper_case}</#if>">
<label class="input-label" for="encoding">${locale.getString("transactions.import.encoding")}</label>
</div>
<div class="input-field col s4 l2">
<input id="numberOfLinesToSkip" type="number" name="numberOfLinesToSkip" min="0" name="numberOfLinesToSkip" <@validation.validation "numberOfLinesToSkip" "center-align"/> value="<#if csvImport??>${csvImport.numberOfLinesToSkip()?c}</#if>">
<label class="input-label" for="numberOfLinesToSkip">${locale.getString("transactions.import.numberOfLinesToSkip")}</label>
</div>
<div class="row">
<div class="col s12 center-align">
<@header.buttonSubmit name='action' icon='cloud_upload' localizationKey='settings.database.import' id='button-confirm-csv-import' classes='text-white'/>
</div>
</div>
</form>
</#macro>

Robert Goldmann
committed
<#macro columnSettings>

Robert Goldmann
committed
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
<form id="form-csv-column-settings" name="CsvColumnSettings" method="POST" action="<@s.url '/transactionImport/columnSettings'/>">
<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/>
<div class="row">
<div class="col s6 m4 offset-m2 l3 offset-l3 bold">
BudgetMaster
</div>
<div class="col s6 m4 l3 bold">
CSV
</div>
</div>
<div class="row">
<div class="col s6 m4 offset-m2 l3 offset-l3">
<div class="transaction-import-text-with-icon">
<i class="material-icons">event</i>
${locale.getString("transaction.new.label.date")}
</div>
</div>
<div class="input-field col s6 m4 l3 no-margin-top no-margin-bottom">
<input id="columnDate" type="number" min="1" max="${csvRows?size}" name="columnDate" <@validation.validation "columnDate"/> value="<#if csvColumnSettings??>${csvColumnSettings.columnDate()}</#if>">
<label class="input-label" for="columnDate">${locale.getString("transactions.import.column")}</label>
</div>
</div>
<div class="row">
<div class="col s6 m4 offset-m2 l3 offset-l3">
<div class="transaction-import-text-with-icon">
<i class="material-icons">edit</i>
${locale.getString("transaction.new.label.name")}
</div>
</div>
<div class="input-field col s6 m4 l3 no-margin-top no-margin-bottom">
<input id="columnName" type="number" min="1" max="${csvRows?size}" name="columnName" <@validation.validation "columnName"/> value="<#if csvColumnSettings??>${csvColumnSettings.columnName()}</#if>">
<label class="input-label" for="columnName">${locale.getString("transactions.import.column")}</label>
</div>
</div>
<div class="row">
<div class="col s6 m4 offset-m2 l3 offset-l3">
<div class="transaction-import-text-with-icon">
<i class="material-icons">euro</i>
${locale.getString("transaction.new.label.amount")}
</div>
</div>
<div class="input-field col s6 m4 l3 no-margin-top no-margin-bottom">
<input id="columnAmount" type="number" min="1" max="${csvRows?size}" name="columnAmount" <@validation.validation "columnAmount"/> value="<#if csvColumnSettings??>${csvColumnSettings.columnAmount()}</#if>">
<label class="input-label" for="columnAmount">${locale.getString("transactions.import.column")}</label>
</div>
</div>
<br>
<div class="row">
<div class="col s12 center-align">
<@header.buttonSubmit name='action' icon='save' localizationKey='save' id='button-confirm-csv-column-settings' classes='text-white'/>
</div>
</div>
</form>

Robert Goldmann
committed
</#macro>

Robert Goldmann
committed
<#macro renderCsvRows>
<div class="container" id="transaction-import-overview">
<table class="bordered centered">
<tr>
<#if csvRows?has_content>
<#assign numberOfColumns=csvRows[0].getColumns()?size/>
<#list 1..numberOfColumns as i>
<td class="bold">${locale.getString("transactions.import.column")} ${i?c}</td>
</#list>
</#if>
</tr>
<#list csvRows as cswRow>
<tr>
<#list cswRow.getColumns() as csvColumn>
<td>${csvColumn}</td>
</#list>
</tr>
</#list>
</table>
</div>

Robert Goldmann
committed
</#macro>
<#macro renderCsvTransactions>
<div class="container" id="transaction-import-list">
<table class="bordered centered" id="table-transaction-rows">

Robert Goldmann
committed
<tr>
<td class="bold">${locale.getString("transactions.import.status")}</td>
<td class="bold">${locale.getString("transaction.new.label.date")}</td>
<td class="bold">${locale.getString("transaction.new.label.name")}</td>
<td class="bold">${locale.getString("transaction.new.label.amount")}</td>
<td class="bold">${locale.getString("transactions.import.actions")}</td>

Robert Goldmann
committed
</tr>
<#list csvTransactions as csvTransaction>
<@renderCsvRow csvTransaction csvTransaction?index/>

Robert Goldmann
committed
</#list>
</table>
</div>
</#macro>
<#macro renderCsvRow csvTransaction index>
<tr class="<#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}"/>
<td><@statusBanner csvTransaction.getStatus()/></td>
<td>${csvTransaction.getDate()}</td>
<td>
<div class="input-field no-margin-top no-margin-bottom">
<input class="no-margin-bottom" type="text" name="name" required value="${csvTransaction.getName()}">
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
</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>

Robert Goldmann
committed
<#macro statusBanner status>
<#if status.name() == "PENDING">
<#assign bannerClasses="background-blue text-white">
<#assign bannerText=locale.getString("transactions.import.status.pending")>
<#elseif status.name() == "IMPORTED">
<#assign bannerClasses="background-green text-white">
<#assign bannerText=locale.getString("transactions.import.status.imported")>
<#elseif status.name() == "SKIPPED">
<#if settings.isUseDarkTheme()>
<#assign bannerClasses="background-grey text-black">
<#else>
<#assign bannerClasses="background-grey text-white">
</#if>
<#assign bannerText=locale.getString("transactions.import.status.skipped")>
</#if>
<div class="banner ${bannerClasses}">${bannerText}</div>