Settings view for configuration

ccm-docs
Jens Pelzetter 2020-10-31 19:23:36 +01:00
parent d6ba57414c
commit f8607c0fb3
7 changed files with 194 additions and 71 deletions

View File

@ -70,7 +70,7 @@ public class ConfigurationController {
models.put("configurationClasses", configurationClasses);
return "org/libreccm/ui/admin/configuration.xhtml";
return "org/libreccm/ui/admin/configuration/configuration.xhtml";
}
private ConfigurationTableEntry buildTableEntry(

View File

@ -21,9 +21,14 @@ package org.libreccm.ui.admin.configuration;
import org.libreccm.configuration.ConfigurationInfo;
import org.libreccm.configuration.ConfigurationManager;
import org.libreccm.configuration.SettingInfo;
import org.libreccm.core.CoreConstants;
import org.libreccm.l10n.GlobalizationHelper;
import org.libreccm.l10n.LocalizedTextsUtil;
import org.libreccm.security.AuthorizationRequired;
import org.libreccm.security.RequiresPrivilege;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors;
@ -31,6 +36,7 @@ import javax.enterprise.context.RequestScoped;
import javax.inject.Inject;
import javax.mvc.Controller;
import javax.mvc.Models;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
@ -52,7 +58,10 @@ public class SettingsController {
@Inject
private Models models;
@GET
@Path("/")
@AuthorizationRequired
@RequiresPrivilege(CoreConstants.PRIVILEGE_ADMIN)
public String showSettings(
@PathParam("configurationClass") final String configurationClass
) {
@ -64,25 +73,36 @@ public class SettingsController {
return "org/libreccm/ui/admin/configuration/configuration-class-not-found.xhtml";
}
final Object conf = confManager.findConfiguration(confClass);
final ConfigurationInfo confInfo = confManager.getConfigurationInfo(
confClass
);
confInfo
final LocalizedTextsUtil textUtil = globalizationHelper.getLocalizedTextsUtil(confInfo.getDescBundle());
models.put(
"confLabel",
textUtil.getText(confInfo.getTitleKey())
);
models.put(
"configurationDesc",
textUtil.getText(confInfo.getDescKey())
);
final List<SettingsTableEntry> settings = confInfo
.getSettings()
.entrySet()
.stream()
.map(info -> buildSettingsTableEntry(info.getValue(), conf))
.map(Map.Entry::getValue)
.map(this::buildSettingsTableEntry)
.sorted()
.collect(Collectors.toList());
models.put("settings", settings);
return "org/libreccm/ui/admin/configuration/settings.xhtml";
}
private SettingsTableEntry buildSettingsTableEntry(
final SettingInfo settingInfo, final Object conf
final SettingInfo settingInfo
) {
Objects.requireNonNull(settingInfo);

View File

@ -1,66 +0,0 @@
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:c="http://xmlns.jcp.org/jsp/jstl/core"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets">
<ui:composition template="/WEB-INF/views/org/libreccm/ui/admin/ccm-admin.xhtml">
<ui:param name="activePage" value="configuration" />
<ui:param name="title" value="#{AdminMessages['configuration.label']}" />
<ui:define name="breadcrumb">
<li class="breadcrumb-item active">
#{AdminMessages['configuration.label']}
</li>
</ui:define>
<ui:define name="main">
<div class="container">
<h1>#{AdminMessages['configuration.label']}</h1>
<c:forEach items="#{configurationClasses}"
var="confClass">
<div class="list-group">
<a href="#"
class="list-group-item list-group-item-action">
<div class="d-flex w-100 justify-content-between">
<h2 class="mb-1">
#{confClass.title}
</h2>
</div>
<p class="mb-1">
#{confClass.description}
</p>
</a>
</div>
</c:forEach>
<!-- <table class="table">
<thead>
<th scope="col">
#{AdminMessages['configuration.table.headings.title']}
</th>
<th scope="col">
#{AdminMessages['configuration.table.headings.description']}
</th>
</thead>
<tbody>
<c:forEach items="#{configurationClasses}"
var="confClass">
<tr>
<td>
<a href="#">
#{confClass.title}
</a>
</td>
<td>
#{confClass.description}
</td>
</tr>
</c:forEach>
</tbody>-->
<!-- </table>-->
</div>
</ui:define>
</ui:composition>
</html>

View File

@ -0,0 +1,38 @@
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:c="http://xmlns.jcp.org/jsp/jstl/core"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets">
<ui:composition template="/WEB-INF/views/org/libreccm/ui/admin/ccm-admin.xhtml">
<ui:param name="activePage" value="configuration" />
<ui:param name="title" value="#{AdminMessages['configuration.label']}" />
<ui:define name="breadcrumb">
<li class="breadcrumb-item active">
#{AdminMessages['configuration.label']}
</li>
</ui:define>
<ui:define name="main">
<div class="container">
<h1>#{AdminMessages['configuration.label']}</h1>
<div class="list-group">
<c:forEach items="#{configurationClasses}"
var="confClass">
<a class="list-group-item list-group-item-action"
href="#{mvc.uri('SettingsController#showSettings', { 'configurationClass': confClass.name })}">
<h2 class="h3 mb-1">
#{confClass.title}
</h2>
<p class="mb-1">
#{confClass.description}
</p>
</a>
</c:forEach>
</div>
</div>
</ui:define>
</ui:composition>
</html>

View File

@ -0,0 +1,111 @@
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:c="http://xmlns.jcp.org/jsp/jstl/core"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
xmlns:xlink="http://www.w3.org/1999/xlink">
<ui:composition template="/WEB-INF/views/org/libreccm/ui/admin/ccm-admin.xhtml">
<ui:param name="activePage" value="configuration" />
<ui:param name="title" value="#{AdminMessages['configuration.label']}" />
<ui:define name="breadcrumb">
<li class="breadcrumb-item">
#{AdminMessages['configuration.label']}
</li>
<li class="breadcrumb-item">>
#{confLabel}
</li>
<li class="breadcrumb-item active">>
#{AdminMessages['configuration.settings.label']}
</li>
</ui:define>
<ui:define name="main">
<div class="container">
<h1>#{confLabel}</h1>
<p>
#{confDescription}
</p>
<table class="table table-hover">
<thead>
<tr>
<th scope="col">
#{AdminMessages['configuration.settings.table.headings.label']}
</th>
<th scope="col">
#{AdminMessages['configuration.settings.table.headings.value']}
</th>
<th scope="col">
#{AdminMessages['configuration.settings.table.headings.defaultValue']}
</th>
<th scope="col" colspan="3">
#{AdminMessages['configuration.settings.table.headings.actions']}
</th>
</tr>
</thead>
<tbody>
<c:forEach items="#{settings}" var="setting">
<tr>
<td>#{setting.label}</td>
<td>
<c:choose>
<c:when test="#{setting.value == null}">
<span class="text-muted">#{setting.defaultValue}</span>
</c:when>
<c:otherwise>
<strong>
#{setting.value}
</strong>
</c:otherwise>
</c:choose>
</td>
<td>#{setting.defaultValue}</td>
<td>
<button class="btn btn-info"
title="#{AdminMessages.getMessage('configuration.settings.table.actions.info.help', [setting.label])}"
type="button">
<svg class="bi"
width="1em"
height="1em"
fill="currentColor">
<use xlink:href="#{request.contextPath}/assets/bootstrap/bootstrap-icons.svg#info-circle" />
</svg>
#{AdminMessages['configuration.settings.table.actions.info']}
</button>
</td>
<td>
<button class="btn btn-primary"
type="button">
<svg class="bi"
width="1em"
height="1em"
fill="currentColor">
<use xlink:href="#{request.contextPath}/assets/bootstrap/bootstrap-icons.svg#pen" />
</svg>
#{AdminMessages['configuration.settings.table.actions.edit']}
</button>
</td>
<td>
<button class="btn btn-danger"
title="#{AdminMessages.getMessage('configuration.settings.table.actions.reset.help', [setting.label])}"
type="button">
<svg class="bi"
width="1em"
height="1em"
fill="currentColor">
<use xlink:href="#{request.contextPath}/assets/bootstrap/bootstrap-icons.svg#x-circle" />
</svg>
#{AdminMessages['configuration.settings.table.actions.reset']}
</button>
</td>
</tr>
</c:forEach>
</tbody>
</table>
</div>
</ui:define>
</ui:composition>
</html>

View File

@ -208,3 +208,13 @@ usersgroupsroles.users.form.errors.primary_email.empty=The primary email address
usersgroupsroles.users.form.errors.primary_email.invalid=The primary email address of a user must be a valid email address
configuration.table.headings.title=Configuration
configuration.table.headings.description=Description
configuration.settings.label=Settings
configuration.settings.table.headings.label=Setting
configuration.settings.table.headings.value=Current value
configuration.settings.table.headings.defaultValue=Default Value
configuration.settings.table.headings.actions=Aktionen
configuration.settings.table.actions.info=Info
configuration.settings.table.actions.info.help=Show description of setting {0}
configuration.settings.table.actions.edit=Edit
configuration.settings.table.actions.reset.help=Reset setting {0} to default value {1}
configuration.settings.table.actions.reset=Reset

View File

@ -208,3 +208,13 @@ usersgroupsroles.users.form.errors.primary_email.empty=Die prim\u00e4re E-Mail-A
usersgroupsroles.users.form.errors.primary_email.invalid=Die prim\u00e4re E-Mail-Addresse eines Benutzers muss eine valide E-Mail-Addresse sein
configuration.table.headings.title=Konfiguration
configuration.table.headings.description=Beschreibung
configuration.settings.label=Einstellungen
configuration.settings.table.headings.label=Einstellung
configuration.settings.table.headings.value=Aktueller Wert
configuration.settings.table.headings.defaultValue=Standardwert
configuration.settings.table.headings.actions=Aktionen
configuration.settings.table.actions.info=Info
configuration.settings.table.actions.info.help=Beschreibung f\u00fcr Einstellung {0} anzeigen
configuration.settings.table.actions.edit=Bearbeiten
configuration.settings.table.actions.reset.help=Einstellung {0} auf Standardwert {1} zur\u00fccksetzen
configuration.settings.table.actions.reset=Zur\u00fccksetzen