From 7e8420ab9d45aeb990f9a02eb4a058c4f5bc31d6 Mon Sep 17 00:00:00 2001
From: Robert Goldmann <deadlocker@gmx.de>
Date: Sat, 28 Mar 2020 14:14:34 +0100
Subject: [PATCH] Fixed #338 - added basic pages to view and manage templates

---
 .../templates/TemplateController.java         | 15 ++++++-
 src/main/resources/languages/_de.properties   |  7 +++
 src/main/resources/languages/_en.properties   |  7 +++
 src/main/resources/static/js/templates.js     |  7 +++
 .../resources/templates/templates/manage.ftl  | 43 +++++++++++++++++++
 .../templates/templates/templateFunctions.ftl | 33 ++++++++++++++
 .../templates/templates/templates.ftl         | 36 ++++++++++++++++
 7 files changed, 147 insertions(+), 1 deletion(-)
 create mode 100644 src/main/resources/static/js/templates.js
 create mode 100644 src/main/resources/templates/templates/templateFunctions.ftl
 create mode 100644 src/main/resources/templates/templates/templates.ftl

diff --git a/src/main/java/de/deadlocker8/budgetmaster/templates/TemplateController.java b/src/main/java/de/deadlocker8/budgetmaster/templates/TemplateController.java
index d6ba0b6d1..0c4c176e6 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/templates/TemplateController.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/templates/TemplateController.java
@@ -1,5 +1,7 @@
 package de.deadlocker8.budgetmaster.templates;
 
+import de.deadlocker8.budgetmaster.charts.Chart;
+import de.deadlocker8.budgetmaster.charts.ChartType;
 import de.deadlocker8.budgetmaster.controller.BaseController;
 import de.deadlocker8.budgetmaster.settings.SettingsService;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -7,6 +9,8 @@ import org.springframework.stereotype.Controller;
 import org.springframework.ui.Model;
 import org.springframework.web.bind.annotation.GetMapping;
 
+import java.util.ArrayList;
+
 
 @Controller
 public class TemplateController extends BaseController
@@ -20,9 +24,18 @@ public class TemplateController extends BaseController
 	}
 
 	@GetMapping("/templates")
-	public String index(Model model)
+	public String showTemplates(Model model)
+	{
+		model.addAttribute("settings", settingsService.getSettings());
+		model.addAttribute("templates", new ArrayList<>());
+		return "templates/templates";
+	}
+
+	@GetMapping("/templates/manage")
+	public String manage(Model model)
 	{
 		model.addAttribute("settings", settingsService.getSettings());
+		model.addAttribute("templates", new ArrayList<>());
 		return "templates/manage";
 	}
 }
\ No newline at end of file
diff --git a/src/main/resources/languages/_de.properties b/src/main/resources/languages/_de.properties
index 2102c5c11..5c6db1ce6 100644
--- a/src/main/resources/languages/_de.properties
+++ b/src/main/resources/languages/_de.properties
@@ -50,6 +50,8 @@ title.filter=Filter
 title.charts=Diagramme
 title.chart.new=Neues Diagramm
 title.chart.edit=Diagramm bearbeiten
+title.template.new=Neue Vorlage
+title.template.edit=Vorlage bearbeiten
 
 # MISC
 category.none=Keine Kategorie
@@ -101,6 +103,8 @@ info.text.transaction.delete=Möchtest du die Buchung "{0}" wirklich unwiderrufl
 info.text.transaction.repeating.delete=Möchtest du die Buchung "{0}" wirklich unwiderruflich löschen? <br>Hinweis: Es handelt sich um eine wiederholende Buchung. Beim Löschen dieser Buchung werden alle zugehörigen Wiederholungen ebenfalls gelöscht!
 info.title.chart.delete=Diagramm löschen
 info.text.chart.delete=Möchtest du das Diagramm "{0}" wirklich unwiderruflich löschen?
+info.title.template.delete=Vorlage löschen
+info.text.template.delete=Möchtest du die Vorlage "{0}" wirklich unwiderruflich löschen?
 
 info.title.database.delete=Datenbank löschen
 info.header.text.database.delete=Soll die Datenbank wirklich unwiderruflich gelöscht werden?<br>Hinweis: Beim Löschen der Datenbank werden alle Buchungen, Kategorien und Konten unwiderruflich gelöscht.
@@ -313,6 +317,9 @@ home.menu.transactions=Buchungen sind das zentrale Element von BudgetMaster. Gib
 home.menu.transactions.action.manage=Buchungsverwaltung
 home.menu.transactions.action.new=Neue Buchung anlegen
 
+home.menu.templates.action.manage=Vorlagenverwaltung
+home.menu.templates.action.show=Vorlagen ansehen
+
 home.menu.charts=Visualisiere deine Daten in verschiedenen Diagrammen. Nutze die mitgelieferten Diagrammtypen oder definiere deine eigenen Diagramme.
 home.menu.charts.action.manage=Diagrammverwaltung
 home.menu.charts.action.show=Diagramme ansehen
diff --git a/src/main/resources/languages/_en.properties b/src/main/resources/languages/_en.properties
index b3c0e3a03..d09dd8cb0 100644
--- a/src/main/resources/languages/_en.properties
+++ b/src/main/resources/languages/_en.properties
@@ -50,6 +50,8 @@ title.filter=Filter
 title.charts=Charts
 title.chart.new=New Chart
 title.chart.edit=Edit Chart
+title.template.new=New Template
+title.template.edit=Edit Template
 
 # MISC
 category.none=No Category
@@ -101,6 +103,8 @@ info.text.transaction.delete=Do you really want to delete the entry "{0}"? This
 info.text.transaction.repeating.delete=Do you really want to delete the entry "{0}"? This can''t be undone.<br>Note: This transaction is a repeating transaction. Deleting this transaction will delete all related occurrences too!
 info.title.chart.delete=Delete Chart
 info.text.chart.delete=Do you really want to delete the chart "{0}"?
+info.title.template.delete=Delete Template
+info.text.template.delete=Do you really want to delete the template "{0}"?
 
 info.title.database.delete=Delete Database
 info.header.text.database.delete=Do you really want to delete the database? This can''t be undone.<br>Note: Deleting the database will delete all transactions, categories and accounts permanently.
@@ -313,6 +317,9 @@ home.menu.transactions=Transactions are the key element of BudgetMaster. Give th
 home.menu.transactions.action.manage=Manage transactions
 home.menu.transactions.action.new=Create a transaction
 
+home.menu.templates.action.manage=Manage templates
+home.menu.templates.action.show=Show templates
+
 home.menu.charts=Visualize your data by using charts. You can choose an included default chart or define your own.
 home.menu.charts.action.manage=Manage charts
 home.menu.charts.action.show=Show charts
diff --git a/src/main/resources/static/js/templates.js b/src/main/resources/static/js/templates.js
new file mode 100644
index 000000000..155f140df
--- /dev/null
+++ b/src/main/resources/static/js/templates.js
@@ -0,0 +1,7 @@
+$(document).ready(function()
+{
+    if($("#modalConfirmDelete").length)
+    {
+        $('#modalConfirmDelete').modal('open');
+    }
+});
\ No newline at end of file
diff --git a/src/main/resources/templates/templates/manage.ftl b/src/main/resources/templates/templates/manage.ftl
index a5d670871..2d91051a4 100644
--- a/src/main/resources/templates/templates/manage.ftl
+++ b/src/main/resources/templates/templates/manage.ftl
@@ -8,6 +8,8 @@
         <#import "../helpers/navbar.ftl" as navbar>
         <@navbar.navbar "templates" settings/>
 
+        <#import "templateFunctions.ftl" as templateFunctions>
+
         <main>
             <div class="card main-card background-color">
                 <div class="container">
@@ -15,10 +17,51 @@
                         <div class="headline">${locale.getString("menu.templates")}</div>
                     </div>
                 </div>
+                <br>
+                <@templateFunctions.buttons/>
+                <br>
+                <div class="container">
+                    <#if templates?size == 0>
+                        <div class="headline center-align">${locale.getString("placeholder")}</div>
+                    <#else>
+                        <table class="bordered">
+                            <thead>
+                                <tr>
+                                    <th>${locale.getString("chart.new.label.name")}</th>
+                                    <th>${locale.getString("chart.actions")}</th>
+                                </tr>
+                            </thead>
+                            <#list templates as template>
+                                <tr>
+                                    <td>${template.getName()}</td>
+                                    <td>
+                                        <a href="<@s.url '/templates/${template.ID?c}/edit'/>" class="btn-flat no-padding text-color"><i class="material-icons left">edit</i></a>
+                                        <a href="<@s.url '/templates/${template.ID?c}/requestDelete'/>" class="btn-flat no-padding text-color"><i class="material-icons left">delete</i></a>
+                                    </td>
+                                </tr>
+                            </#list>
+                        </table>
+                    </#if>
+                </div>
             </div>
+
+            <#if currentTemplate??>
+                <!-- confirm delete modal -->
+                <div id="modalConfirmDelete" class="modal background-color">
+                    <div class="modal-content">
+                        <h4>${locale.getString("info.title.template.delete")}</h4>
+                        <p>${locale.getString("info.text.template.delete", currentTemplate.getName())}</p>
+                    </div>
+                    <div class="modal-footer background-color">
+                        <a href="<@s.url '/templates/manage'/>" class="modal-action modal-close waves-effect waves-light red btn-flat white-text">${locale.getString("cancel")}</a>
+                        <a href="<@s.url '/templates/${currentTemplate.getID()?c}/delete'/>" class="modal-action modal-close waves-effect waves-light green btn-flat white-text">${locale.getString("info.title.template.delete")}</a>
+                    </div>
+                </div>
+            </#if>
         </main>
 
         <#import "../helpers/scripts.ftl" as scripts>
         <@scripts.scripts/>
+        <script src="<@s.url '/js/templates.js'/>"></script>
     </body>
 </html>
\ No newline at end of file
diff --git a/src/main/resources/templates/templates/templateFunctions.ftl b/src/main/resources/templates/templates/templateFunctions.ftl
new file mode 100644
index 000000000..c022a1599
--- /dev/null
+++ b/src/main/resources/templates/templates/templateFunctions.ftl
@@ -0,0 +1,33 @@
+<#import "/spring.ftl" as s>
+
+<#macro buttonNew>
+    <a href="<@s.url '/templates/newTemplate'/>" class="waves-effect waves-light btn budgetmaster-blue"><i class="material-icons left">add</i>${locale.getString("title.template.new")}</a>
+</#macro>
+
+<#macro buttonShow>
+    <a href="<@s.url '/templates'/>" class="waves-effect waves-light btn budgetmaster-blue"><i class="material-icons left">file_copy</i>${locale.getString("home.menu.templates.action.show")}</a>
+</#macro>
+
+<#macro buttons>
+    <div class="row hide-on-small-only valign-wrapper">
+        <div class="col s6 right-align">
+            <@buttonNew/>
+        </div>
+        <div class="col s6 left-align">
+            <@buttonShow/>
+        </div>
+    </div>
+
+    <div class="hide-on-med-and-up center-align">
+        <div class="row center-align">
+            <div class="row center-align">
+                <div class="col s12">
+                    <@buttonShow/>
+                </div>
+            </div>
+            <div class="col s12">
+                <@buttonNew/>
+            </div>
+        </div>
+    </div>
+</#macro>
\ No newline at end of file
diff --git a/src/main/resources/templates/templates/templates.ftl b/src/main/resources/templates/templates/templates.ftl
new file mode 100644
index 000000000..66b14c203
--- /dev/null
+++ b/src/main/resources/templates/templates/templates.ftl
@@ -0,0 +1,36 @@
+<html>
+    <head>
+        <#import "../helpers/header.ftl" as header>
+        <@header.header "BudgetMaster"/>
+        <#import "/spring.ftl" as s>
+    </head>
+    <body class="budgetmaster-blue-light">
+        <#import "../helpers/navbar.ftl" as navbar>
+        <@navbar.navbar "templates" settings/>
+
+        <#import "templateFunctions.ftl" as templateFunctions>
+
+        <main>
+            <div class="card main-card background-color">
+                <div class="container">
+                    <div class="section center-align">
+                        <div class="headline">${locale.getString("menu.templates")}</div>
+                    </div>
+                </div>
+                <br>
+                <div class="center-align"><a href="<@s.url '/templates/manage'/>" class="waves-effect waves-light btn budgetmaster-blue"><i class="material-icons left">edit</i>${locale.getString("home.menu.templates.action.manage")}</a></div>
+                <br>
+                <div class="container">
+                    <#if templates?size == 0>
+                        <div class="headline center-align">${locale.getString("placeholder")}</div>
+                    <#else>
+                    </#if>
+                </div>
+            </div>
+        </main>
+
+        <#import "../helpers/scripts.ftl" as scripts>
+        <@scripts.scripts/>
+        <script src="<@s.url '/js/templates.js'/>"></script>
+    </body>
+</html>
\ No newline at end of file
-- 
GitLab