From e8dc47c06234a1bcb49a18a7d476b29479f10397 Mon Sep 17 00:00:00 2001
From: Robert Goldmann <deadlocker@gmx.de>
Date: Tue, 15 Sep 2020 22:09:25 +0200
Subject: [PATCH] #528 - readonly accounts should not be selectable as default
 account + default account should not be able to set to readonly

---
 .../budgetmaster/accounts/AccountController.java         | 7 +++++--
 .../budgetmaster/accounts/AccountService.java            | 9 +++++++--
 src/main/resources/static/css/dark/style.css             | 6 ++++++
 src/main/resources/static/css/style.css                  | 6 ++++++
 src/main/resources/templates/accounts/accounts.ftl       | 8 +++++---
 5 files changed, 29 insertions(+), 7 deletions(-)

diff --git a/src/main/java/de/deadlocker8/budgetmaster/accounts/AccountController.java b/src/main/java/de/deadlocker8/budgetmaster/accounts/AccountController.java
index c593719bd..54cd57729 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/accounts/AccountController.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/accounts/AccountController.java
@@ -65,8 +65,11 @@ public class AccountController extends BaseController
 		}
 
 		final Account account = accountOptional.get();
-		account.setReadOnly(!account.isReadOnly());
-		accountService.getRepository().save(account);
+		if(!account.isDefault())
+		{
+			account.setReadOnly(!account.isReadOnly());
+			accountService.getRepository().save(account);
+		}
 
 		String referer = request.getHeader("Referer");
 		if(referer.contains("database/import"))
diff --git a/src/main/java/de/deadlocker8/budgetmaster/accounts/AccountService.java b/src/main/java/de/deadlocker8/budgetmaster/accounts/AccountService.java
index 0fa660732..525f7ccff 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/accounts/AccountService.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/accounts/AccountService.java
@@ -149,8 +149,6 @@ public class AccountService implements Resetable
 
 	public void setAsDefaultAccount(int ID)
 	{
-		unsetDefaultForAllAccounts();
-
 		Optional<Account> accountToSelectOptional = accountRepository.findById(ID);
 		if(accountToSelectOptional.isEmpty())
 		{
@@ -158,6 +156,13 @@ public class AccountService implements Resetable
 		}
 
 		Account accountToSelect = accountToSelectOptional.get();
+		if(accountToSelect.isReadOnly())
+		{
+			return;
+		}
+
+		unsetDefaultForAllAccounts();
+
 		accountToSelect.setDefault(true);
 		accountRepository.save(accountToSelect);
 	}
diff --git a/src/main/resources/static/css/dark/style.css b/src/main/resources/static/css/dark/style.css
index 807ec5467..206878b18 100644
--- a/src/main/resources/static/css/dark/style.css
+++ b/src/main/resources/static/css/dark/style.css
@@ -612,6 +612,12 @@ input[type="radio"]:not(:checked) + span::before, [type="radio"]:not(:checked) +
     color: #2E79B9;
 }
 
+.placeholder-icon {
+    display: inline-block;
+    width: 1.3rem;
+    margin-right: 15px;
+}
+
 .invisible {
     opacity: 0;
 }
diff --git a/src/main/resources/static/css/style.css b/src/main/resources/static/css/style.css
index 8a988dd3d..1ad8cb5c4 100644
--- a/src/main/resources/static/css/style.css
+++ b/src/main/resources/static/css/style.css
@@ -527,6 +527,12 @@ input[type="radio"]:checked + span::after, [type="radio"].with-gap:checked + spa
     color: #2E79B9;
 }
 
+.placeholder-icon {
+    display: inline-block;
+    width: 1.3rem;
+    margin-right: 15px;
+}
+
 .invisible {
     opacity: 0;
 }
diff --git a/src/main/resources/templates/accounts/accounts.ftl b/src/main/resources/templates/accounts/accounts.ftl
index 6a865e4fe..73b5a452b 100644
--- a/src/main/resources/templates/accounts/accounts.ftl
+++ b/src/main/resources/templates/accounts/accounts.ftl
@@ -24,17 +24,19 @@
                             <#if (account.getType().name() == "CUSTOM")>
                                 <tr>
                                     <td>
-                                        <a href="<@s.url '/accounts/${account.getID()?c}/setAsDefault'/>" class="btn-flat no-padding text-color tooltipped" data-position="left" data-tooltip="${locale.getString("account.tooltip.default")}"><i class="material-icons left"><#if account.isDefault()>star<#else>star_border</#if></i></a>
-
                                         <#if account.isReadOnly()>
                                             <#assign toolTipText = locale.getString("account.tooltip.readonly.activate")/>
                                             <#assign lockIcon = '<i class="fas fa-lock"></i>'/>
+                                            <div class="placeholder-icon"></div>
                                         <#else>
                                             <#assign toolTipText = locale.getString("account.tooltip.readonly.deactivate")/>
                                             <#assign lockIcon = '<i class="fas fa-lock-open"></i>'/>
+                                            <a href="<@s.url '/accounts/${account.getID()?c}/setAsDefault'/>" class="btn-flat no-padding text-color tooltipped" data-position="left" data-tooltip="${locale.getString("account.tooltip.default")}"><i class="material-icons left"><#if account.isDefault()>star<#else>star_border</#if></i></a>
                                         </#if>
 
-                                        <a href="<@s.url '/accounts/${account.getID()?c}/toggleReadOnly'/>" class="btn-flat no-padding text-color tooltipped" data-position="left" data-tooltip="${toolTipText}">${lockIcon}</a>
+                                        <#if !account.isDefault()>
+                                            <a href="<@s.url '/accounts/${account.getID()?c}/toggleReadOnly'/>" class="btn-flat no-padding text-color tooltipped" data-position="right" data-tooltip="${toolTipText}">${lockIcon}</a>
+                                        </#if>
                                     </td>
                                     <td>${account.getName()}</td>
                                     <td>
-- 
GitLab