Select Git revision
transactionImport.ftl
-
Robert Goldmann authoredRobert Goldmann authored
transactionImport.ftl 13.44 KiB
<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>
<div class="container">
<#if csvRows??>
<div class="row center-align">
<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>
<#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/>
<@renderCsvRows/>
</#if>
</@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="row">
<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>
<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>
<#macro columnSettings>
<div class="container">
<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>
</div>
</#macro>
<#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>
</#macro>
<#macro renderCsvTransactions>
<div class="container" id="transaction-import-list">
<table class="bordered centered" id="table-transaction-rows">
<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>
</tr>
<#list csvTransactions as csvTransaction>
<@renderCsvRow csvTransaction csvTransaction?index/>
</#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()}">
</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>
<#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>
</#macro>