This commit is contained in:
Francesco 2023-09-24 18:26:55 +02:00
parent 2d2f24f1e3
commit 0f94d5287f
8 changed files with 99 additions and 33 deletions

View File

@ -40,10 +40,11 @@ public class DbAdminAutoConfiguration {
public DataSource internalDataSource() { public DataSource internalDataSource() {
DataSourceBuilder<?> dataSourceBuilder = DataSourceBuilder.create(); DataSourceBuilder<?> dataSourceBuilder = DataSourceBuilder.create();
dataSourceBuilder.driverClassName("org.h2.Driver"); dataSourceBuilder.driverClassName("org.h2.Driver");
if (props.isTestMode()) if (props.isTestMode()) {
dataSourceBuilder.url("jdbc:h2:mem:test"); dataSourceBuilder.url("jdbc:h2:mem:test");
else } else {
dataSourceBuilder.url("jdbc:h2:file:./dbadmin_internal"); dataSourceBuilder.url("jdbc:h2:file:./dbadmin_internal");
}
dataSourceBuilder.username("sa"); dataSourceBuilder.username("sa");
dataSourceBuilder.password("password"); dataSourceBuilder.password("password");

View File

@ -19,6 +19,7 @@ import org.springframework.util.MultiValueMap;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
@ -39,6 +40,8 @@ import tech.ailef.dbadmin.external.dto.QueryFilter;
import tech.ailef.dbadmin.external.exceptions.InvalidPageException; import tech.ailef.dbadmin.external.exceptions.InvalidPageException;
import tech.ailef.dbadmin.external.misc.Utils; import tech.ailef.dbadmin.external.misc.Utils;
import tech.ailef.dbadmin.internal.model.UserAction; import tech.ailef.dbadmin.internal.model.UserAction;
import tech.ailef.dbadmin.internal.model.UserSetting;
import tech.ailef.dbadmin.internal.repository.UserSettingsRepository;
import tech.ailef.dbadmin.internal.service.UserActionService; import tech.ailef.dbadmin.internal.service.UserActionService;
/** /**
@ -59,12 +62,9 @@ public class DefaultDbAdminController {
@Autowired @Autowired
private UserActionService userActionService; private UserActionService userActionService;
// @Autowired
// private ActionRepository repo;
//
// @Autowired
// private CustomActionRepositoryImpl customRepo;
@Autowired
private UserSettingsRepository userSettingsRepo;
/** /**
* Home page with list of schemas * Home page with list of schemas
@ -456,7 +456,15 @@ public class DefaultDbAdminController {
return "settings"; return "settings";
} }
// @Transactional("internalTransactionManager") @PostMapping("/settings")
public String settings(@RequestParam Map<String, String> params, Model model) {
for (String paramName : params.keySet()) {
userSettingsRepo.save(new UserSetting(paramName, params.get(paramName)));
}
model.addAttribute("activePage", "settings");
return "settings";
}
private UserAction saveAction(UserAction action) { private UserAction saveAction(UserAction action) {
return userActionService.save(action); return userActionService.save(action);
} }

View File

@ -8,6 +8,7 @@ import org.springframework.web.bind.annotation.ModelAttribute;
import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletRequest;
import tech.ailef.dbadmin.external.DbAdminProperties; import tech.ailef.dbadmin.external.DbAdminProperties;
import tech.ailef.dbadmin.internal.UserConfiguration;
/** /**
* This class registers some ModelAttribute objects that are * This class registers some ModelAttribute objects that are
@ -19,6 +20,9 @@ public class GlobalController {
@Autowired @Autowired
private DbAdminProperties props; private DbAdminProperties props;
@Autowired
private UserConfiguration userConf;
/** /**
* A multi valued map containing the query parameters. It is used primarily * A multi valued map containing the query parameters. It is used primarily
* in building complex URL when performing faceted search with multiple filters. * in building complex URL when performing faceted search with multiple filters.
@ -44,4 +48,10 @@ public class GlobalController {
public String getRequestUrl(HttpServletRequest request) { public String getRequestUrl(HttpServletRequest request) {
return request.getRequestURI(); return request.getRequestURI();
} }
@ModelAttribute("userConf")
public UserConfiguration getUserConf() {
return userConf;
} }
}

View File

@ -0,0 +1,30 @@
package tech.ailef.dbadmin.internal;
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import tech.ailef.dbadmin.internal.model.UserSetting;
import tech.ailef.dbadmin.internal.repository.UserSettingsRepository;
@Component
public class UserConfiguration {
@Autowired
private UserSettingsRepository repo;
public String get(String settingName) {
Optional<UserSetting> setting = repo.findById(settingName);
if (setting.isPresent())
return setting.get().getSettingValue();
return defaultValues().get(settingName);
}
private Map<String, String> defaultValues() {
Map<String, String> values = new HashMap<>();
values.put("brandName", "Spring Boot Database Admin");
return values;
}
}

View File

@ -8,7 +8,15 @@ public class UserSetting {
@Id @Id
private String id; private String id;
private String value; private String settingValue;
public UserSetting() {
}
public UserSetting(String id, String settingValue) {
this.id = id;
this.settingValue = settingValue;
}
public String getId() { public String getId() {
return id; return id;
@ -18,12 +26,12 @@ public class UserSetting {
this.id = id; this.id = id;
} }
public String getValue() { public String getSettingValue() {
return value; return settingValue;
} }
public void setValue(String value) { public void setSettingValue(String settingValue) {
this.value = value; this.settingValue = settingValue;
} }
} }

View File

@ -6,6 +6,6 @@ import org.springframework.stereotype.Repository;
import tech.ailef.dbadmin.internal.model.UserSetting; import tech.ailef.dbadmin.internal.model.UserSetting;
@Repository @Repository
public interface UserSettingsRepository extends JpaRepository<UserSetting, Integer> { public interface UserSettingsRepository extends JpaRepository<UserSetting, String> {
} }

View File

@ -31,7 +31,9 @@
<nav class="navbar fixed-top navbar-expand-lg bg-accent color-white" th:fragment="navbar"> <nav class="navbar fixed-top navbar-expand-lg bg-accent color-white" th:fragment="navbar">
<div class="container-fluid"> <div class="container-fluid">
<a class=" fw-bold navbar-brand" href="/"><i class="bi bi-hexagon-fill"></i> Spring Boot DB Admin Panel</a> <a class=" fw-bold navbar-brand" href="/"><i class="bi bi-hexagon-fill"></i>
[[ ${userConf.get('brandName')} ]]
</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation"> <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span> <span class="navbar-toggler-icon"></span>
</button> </button>
@ -77,7 +79,18 @@
</div> </div>
</a> </a>
</li> </li>
<li th:class="${#strings.equals(activePage, 'settings') ? 'active' : ''}">
<a th:href="|/${baseUrl}/settings|">
<div class="d-flex align-items-center">
<div class="menu-icon">
<i class="bi bi-gear"></i>
</div>
<div class="menu-entry-text d-none d-md-block">
Settings
</div>
</div>
</a>
</li>
<!-- <!--
<li th:class="${#strings.equals(activePage, 'console') ? 'active' : ''}"> <li th:class="${#strings.equals(activePage, 'console') ? 'active' : ''}">
<a href="/live"> <a href="/live">
@ -103,18 +116,6 @@
</div> </div>
</a> </a>
</li> </li>
<li th:class="${#strings.equals(activePage, 'settings') ? 'active' : ''}">
<a th:href="|/${baseUrl}/settings|">
<div class="d-flex align-items-center">
<div class="menu-icon">
<i class="bi bi-gear"></i>
</div>
<div class="menu-entry-text d-none d-md-block">
Settings
</div>
</div>
</a>
</li>
--> -->
</ul> </ul>
</div> </div>

View File

@ -17,7 +17,7 @@
<div class="w-100 d-flex inner-navigation"> <div class="w-100 d-flex inner-navigation">
<a href="#" class="active"> <a href="#" class="active">
<div class="ui-tab ps-5 pe-5 p-3"> <div class="ui-tab ps-5 pe-5 p-3">
<i class="bi bi-database pe-2"></i> APPEARANCE <i class="bi bi-database pe-2"></i> GENERAL
</div> </div>
</a> </a>
<a href="#"> <a href="#">
@ -29,7 +29,15 @@
</div> </div>
</div> </div>
<div class="box with-navigation"> <div class="box with-navigation">
SETTINGS <h3 class="fw-bold">General</h3>
<form th:action="|/${baseUrl}/settings|" method="POST">
<label for="brandName">Brand name</label>
<span class="m-0 p-0 text-muted">What appears in the top bar</span>
<input class="form-control mt-2" type="text"
id="brandName" name="brandName"
th:value="${userConf.get('brandName')}">
<button class="ui-btn btn btn-primary mt-3">Save</button>
</form>
</div> </div>
</div> </div>
</div> </div>