From 104e92b7760d587b98a44f1e47f696187870080a Mon Sep 17 00:00:00 2001
From: Robert Goldmann <deadlocker@gmx.de>
Date: Mon, 30 Jul 2018 13:05:42 +0200
Subject: [PATCH] #259 - started working on ui

---
 .../controller/SettingsController.java        | 17 +++--
 .../budgetmaster/database/AccountMatch.java   | 43 ++++++++++++
 .../budgetmaster/services/HelpersService.java | 12 ++++
 src/main/resources/languages/_de.properties   |  4 ++
 src/main/resources/languages/_en.properties   |  4 ++
 src/main/resources/static/css/dark/style.css  |  6 +-
 src/main/resources/static/css/style.css       |  6 +-
 src/main/resources/templates/import.ftl       | 66 +++++++++++++++++++
 8 files changed, 150 insertions(+), 8 deletions(-)
 create mode 100644 src/main/java/de/deadlocker8/budgetmaster/database/AccountMatch.java
 create mode 100644 src/main/resources/templates/import.ftl

diff --git a/src/main/java/de/deadlocker8/budgetmaster/controller/SettingsController.java b/src/main/java/de/deadlocker8/budgetmaster/controller/SettingsController.java
index 76d257470..7d6d657cb 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/controller/SettingsController.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/controller/SettingsController.java
@@ -2,8 +2,10 @@ package de.deadlocker8.budgetmaster.controller;
 
 import de.deadlocker8.budgetmaster.authentication.User;
 import de.deadlocker8.budgetmaster.authentication.UserRepository;
+import de.deadlocker8.budgetmaster.database.AccountMatch;
 import de.deadlocker8.budgetmaster.database.Database;
 import de.deadlocker8.budgetmaster.database.DatabaseParser;
+import de.deadlocker8.budgetmaster.entities.Account;
 import de.deadlocker8.budgetmaster.entities.Settings;
 import de.deadlocker8.budgetmaster.repositories.AccountRepository;
 import de.deadlocker8.budgetmaster.repositories.SettingsRepository;
@@ -32,6 +34,8 @@ import javax.servlet.ServletOutputStream;
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
 import java.io.UnsupportedEncodingException;
+import java.util.ArrayList;
+import java.util.List;
 
 
 @Controller
@@ -165,9 +169,8 @@ public class SettingsController extends BaseController
 	}
 
 	@RequestMapping(value = "/settings/database/delete", method = RequestMethod.POST)
-	public String deleteDatabase(Model model,
-								 @RequestParam("verificationCode") String verificationCode,
-								 @RequestParam("verificationUserInput") String verificationUserInput)
+	public String deleteDatabase(@RequestParam("verificationCode") String verificationCode,
+								  @RequestParam("verificationUserInput") String verificationUserInput)
 	{
 		if(verificationUserInput.equals(verificationCode))
 		{
@@ -203,15 +206,17 @@ public class SettingsController extends BaseController
 			String jsonString = new String(file.getBytes());
 			DatabaseParser importer = new DatabaseParser(jsonString);
 			Database database = importer.parseDatabaseFromJSON();
+
+			model.addAttribute("database", database);
+			model.addAttribute("availableAccounts", accountRepository.findAllByOrderByNameAsc());
+			return "import";
 		}
 		catch(Exception e)
 		{
 			e.printStackTrace();
+
 			model.addAttribute("errorImportDatabase", e.getMessage());
 			return "settings";
 		}
-
-		//TODO redirect to account combination page
-		return "redirect:/settings";
 	}
 }
\ No newline at end of file
diff --git a/src/main/java/de/deadlocker8/budgetmaster/database/AccountMatch.java b/src/main/java/de/deadlocker8/budgetmaster/database/AccountMatch.java
new file mode 100644
index 000000000..57d9654fe
--- /dev/null
+++ b/src/main/java/de/deadlocker8/budgetmaster/database/AccountMatch.java
@@ -0,0 +1,43 @@
+package de.deadlocker8.budgetmaster.database;
+
+import de.deadlocker8.budgetmaster.entities.Account;
+
+public class AccountMatch
+{
+	private Account accountSource;
+	private Account accountDestination;
+
+	public AccountMatch(Account accountSource)
+	{
+		this.accountSource = accountSource;
+	}
+
+	public Account getAccountSource()
+	{
+		return accountSource;
+	}
+
+	public void setAccountSource(Account accountSource)
+	{
+		this.accountSource = accountSource;
+	}
+
+	public Account getAccountDestination()
+	{
+		return accountDestination;
+	}
+
+	public void setAccountDestination(Account accountDestination)
+	{
+		this.accountDestination = accountDestination;
+	}
+
+	@Override
+	public String toString()
+	{
+		return "AccountMatch{" +
+				"accountSource=" + accountSource.getName() +
+				", accountDestination=" + accountDestination.getName() +
+				'}';
+	}
+}
\ No newline at end of file
diff --git a/src/main/java/de/deadlocker8/budgetmaster/services/HelpersService.java b/src/main/java/de/deadlocker8/budgetmaster/services/HelpersService.java
index 142b05359..61b76954f 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/services/HelpersService.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/services/HelpersService.java
@@ -1,5 +1,6 @@
 package de.deadlocker8.budgetmaster.services;
 
+import de.deadlocker8.budgetmaster.database.AccountMatch;
 import de.deadlocker8.budgetmaster.entities.Account;
 import de.deadlocker8.budgetmaster.entities.Payment;
 import de.deadlocker8.budgetmaster.entities.Settings;
@@ -254,4 +255,15 @@ public class HelpersService
 	{
 		return settingsService.getSettings();
 	}
+
+	public List<AccountMatch> getAccountMatches(List<Account> accounts)
+	{
+		List<AccountMatch> accountMatches = new ArrayList<>();
+		for(Account account : accounts)
+		{
+			accountMatches.add(new AccountMatch(account));
+		}
+
+		return accountMatches;
+	}
 }
\ No newline at end of file
diff --git a/src/main/resources/languages/_de.properties b/src/main/resources/languages/_de.properties
index a636b3f4e..107a11711 100644
--- a/src/main/resources/languages/_de.properties
+++ b/src/main/resources/languages/_de.properties
@@ -87,6 +87,10 @@ info.title.database.delete=Datenbank l
 info.header.text.database.delete=Soll die Datenbank wirklich unwiderruflich gel�scht werden?
 info.text.database.delete=Zur Best�tigung gib folgenden Code ein:\t{0}
 info.title.database.import.dialog=Datenbank importieren
+info.subtitle.database.import=Konten zuordnen
+info.database.import.source=Buchungen aus
+info.database.import.destination=importieren in
+info.database.import.or=oder
 
 # WARNING
 warning.text.account.delete=Das Konto "{0}" kann nicht gel�scht werden, da mindestens ein Konto existieren muss. Um dieses Konto zu l�schen musst du zuerst ein neues anlegen.
diff --git a/src/main/resources/languages/_en.properties b/src/main/resources/languages/_en.properties
index f61310a23..87ebc8068 100644
--- a/src/main/resources/languages/_en.properties
+++ b/src/main/resources/languages/_en.properties
@@ -87,6 +87,10 @@ info.title.database.delete=Delete Database
 info.header.text.database.delete=Do you really want to delete the database? This can''t be undone.
 info.text.database.delete=Please enter the following code for verification:\t{0}
 info.title.database.import.dialog=Import database
+info.subtitle.database.import=Assign accounts
+info.database.import.source=Import payments from
+info.database.import.destination=to
+info.database.import.or=or
 
 # WARNING
 warning.text.account.delete=The account "{0}" could not be deleted, because at least one account must exist at all time. You have to create a new account in order to delete this one.
diff --git a/src/main/resources/static/css/dark/style.css b/src/main/resources/static/css/dark/style.css
index fd2fa5e2a..cdfb10063 100644
--- a/src/main/resources/static/css/dark/style.css
+++ b/src/main/resources/static/css/dark/style.css
@@ -130,7 +130,7 @@ main {
     color: rgba(255, 255, 255, 0.87);
 }
 
-.btn {
+.btn, .btn-flat {
     text-transform: capitalize;
 }
 
@@ -452,6 +452,10 @@ input[type="radio"]:not(:checked) + label::before, [type="radio"]:not(:checked)
     color: #FFFFFF;
 }
 
+.import-text {
+    color: #4CABD3;
+}
+
 .hidden {
     display: none;
 }
diff --git a/src/main/resources/static/css/style.css b/src/main/resources/static/css/style.css
index 2f8f21ac5..c87844eff 100644
--- a/src/main/resources/static/css/style.css
+++ b/src/main/resources/static/css/style.css
@@ -109,7 +109,7 @@ main {
     color: rgba(0, 0, 0, 0.87);
 }
 
-.btn {
+.btn, .btn-flat {
     text-transform: capitalize;
 }
 
@@ -389,6 +389,10 @@ input[type="radio"]:checked + label::after, [type="radio"].with-gap:checked + la
     color: #AAAAAA !important;
 }
 
+.import-text {
+    color: #2E79B9;
+}
+
 .hidden {
     display: none;
 }
diff --git a/src/main/resources/templates/import.ftl b/src/main/resources/templates/import.ftl
new file mode 100644
index 000000000..568921687
--- /dev/null
+++ b/src/main/resources/templates/import.ftl
@@ -0,0 +1,66 @@
+<html>
+    <head>
+        <#import "header.ftl" as header>
+        <@header.header "BudgetMaster"/>
+    </head>
+    <body class="budgetmaster-blue-light">
+        <#import "navbar.ftl" as navbar>
+        <@navbar.navbar "settings"/>
+
+        <main>
+            <div class="card main-card background-color">
+                <div class="container">
+                    <div class="section center-align">
+                        <div class="headline">${locale.getString("info.title.database.import.dialog")}</div>
+                        <div>${locale.getString("info.subtitle.database.import")}</div>
+                    </div>
+                </div>
+                <div class="container">
+                    <#import "validation.ftl" as validation>
+                    <form name="Import" action="/settings/database/import" method="post">
+                        <input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/>
+
+                        <table class="bordered">
+                            <#list helpers.getAccountMatches(database.getAccounts()) as accountMatch>
+                                <tr>
+                                    <td class="import-text">${locale.getString("info.database.import.source")}</td>
+                                    <td>${accountMatch.getAccountSource().getName()}</td>
+                                    <td class="import-text">${locale.getString("info.database.import.destination")}</td>
+                                    <td>
+                                        <select>
+                                            <#list availableAccounts as account>
+                                                <option value="${account.getName()}">${account.getName()}</option>
+                                            </#list>
+                                        </select>
+                                    </td>
+                                    <td class="import-text">${locale.getString("info.database.import.or")}</td>
+                                    <td>
+                                        <a href="/accounts/newAccount" class="btn waves-effect waves-light budgetmaster-blue"><i class="material-icons left">add</i>${locale.getString("title.account.new")}</a>
+                                    </td>
+                                </tr>
+                            </#list>
+                        </table>
+                        <#if availableAccounts?size == 0>
+                            <div class="headline center-align">${locale.getString("placeholder")}</div>
+                        </#if>
+
+                        <br>
+
+                        <#-- buttons -->
+                        <div class="row">
+                            <div class="col s12 m12 l4 offset-l4 center-align">
+                                <button class="btn waves-effect waves-light budgetmaster-blue" type="submit" name="action">
+                                    <i class="material-icons left">unarchive</i>${locale.getString("settings.database.import")}
+                                </button>
+                            </div>
+                        </div>
+                    </form>
+                </div>
+            </div>
+        </main>
+
+        <!-- Scripts-->
+        <#import "scripts.ftl" as scripts>
+        <@scripts.scripts/>
+    </body>
+</html>
\ No newline at end of file
-- 
GitLab