Configuration UI for managing the usable contact data entry keys

pull/10/head
Jens Pelzetter 2021-06-10 20:57:19 +02:00
parent 00c8cbc5ae
commit e18d5e29c1
11 changed files with 322 additions and 8 deletions

View File

@ -28,6 +28,8 @@ import javax.persistence.AssociationOverride;
import javax.persistence.Column;
import javax.persistence.Embedded;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
@ -57,6 +59,7 @@ public class ContactEntryKey
@Id
@Column(name = "KEY_ID")
@GeneratedValue(strategy = GenerationType.AUTO)
private long keyId;
@Column(name = "ENTRY_KEY", length = 255)

View File

@ -39,31 +39,26 @@ public class ContactEntryKeyRepository
@Override
public Class<ContactEntryKey> getEntityClass() {
return ContactEntryKey.class;
}
@Override
public String getIdAttributeName() {
return "keyId";
}
@Override
public Long getIdOfEntity(final ContactEntryKey entity) {
return entity.getKeyId();
}
@Override
public boolean isNew(final ContactEntryKey entity) {
return entity.getKeyId() == 0;
}
@Transactional(Transactional.TxType.REQUIRED)
public Optional<ContactEntryKey> findByEntryKey(final String entryKey) {
try {
return Optional.of(
getEntityManager()

View File

@ -320,7 +320,7 @@ public class ConfigurationContactEntryKeysController {
}
@POST
@Path("/{contactEntryKey}/label/@add/{locale}")
@Path("/{contactEntryKey}/label/@edit/{locale}")
@AuthorizationRequired
@Transactional(Transactional.TxType.REQUIRED)
public String editEntryLabel(
@ -368,7 +368,7 @@ public class ConfigurationContactEntryKeysController {
public String removeEntryLabel(
@PathParam("sectionIdentifier") final String sectionIdentifierParam,
@PathParam("contactEntryKey") final String entryKey,
@FormParam("locale") final String localeParam
@PathParam("locale") final String localeParam
) {
final Optional<ContentSection> sectionResult = sectionsUi
.findContentSection(sectionIdentifierParam);

View File

@ -74,6 +74,7 @@ public class ContentSectionApplication extends Application {
classes.add(AssetFolderController.class);
classes.add(CategoriesController.class);
classes.add(ConfigurationController.class);
classes.add(ConfigurationContactEntryKeysController.class);
classes.add(ConfigurationDocumentTypesController.class);
classes.add(ConfigurationLifecyclesController.class);
classes.add(ConfigurationRolesController.class);

View File

@ -66,6 +66,10 @@ public class SelectedContactEntryKeyModel {
protected void setUnusedLabelLocales(final List<String> unusedLabelLocales) {
this.unusedLabelLocales = new ArrayList<>(unusedLabelLocales);
}
public boolean getHasUnusedLabelLocales() {
return !unusedLabelLocales.isEmpty();
}
public Map<String, String> getLabels() {
return Collections.unmodifiableMap(labels);

View File

@ -30,6 +30,12 @@
#{CmsAdminMessages['contentsection.configuration.workflows.title']}
</a>
</li>
<li class="nav-item">
<a class="nav-link #{activeConfPage == 'contactentrykeys' ? 'active' : ''}"
href="#{mvc.basePath}/#{ContentSectionModel.sectionName}/configuration/contactentrykeys">
#{CmsAdminMessages['contentsection.configuration.contactentrykeys.title']}
</a>
</li>
</ul>
</ui:composition>
</html>

View File

@ -0,0 +1,27 @@
<!DOCTYPE html [<!ENTITY times '&#215;'>]>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:bootstrap="http://xmlns.jcp.org/jsf/composite/components/bootstrap"
xmlns:c="http://xmlns.jcp.org/jsp/jstl/core"
xmlns:libreccm="http://xmlns.jcp.org/jsf/composite/components/libreccm"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets">
<ui:composition template="/WEB-INF/views/org/librecms/ui/content-section/contentsection.xhtml">
<ui:param name="activePage" value="folderBrowser" />
<ui:param name="title" value="#{CmsAdminMessages['contentsection.configuration.contactentrykey.not_found.title']}" />
<ui:define name="breadcrumb">
<li class="breadcrumb-item">
#{CmsAdminMessages['contentsections.list.label']}
</li>
</ui:define>
<ui:define name="main">
<div class="container">
<div class="alert alert-danger" contactentrykey="alert">
#{CmsAdminMessages.getMessage('contentsection.configuration.contactentrykey.not_found', [entryKey])}
</div>
</div>
</ui:define>
</ui:composition>
</html>

View File

@ -0,0 +1,72 @@
<!DOCTYPE html [<!ENTITY times '&#215;'>]>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:bootstrap="http://xmlns.jcp.org/jsf/composite/components/bootstrap"
xmlns:c="http://xmlns.jcp.org/jsp/jstl/core"
xmlns:libreccm="http://xmlns.jcp.org/jsf/composite/components/libreccm"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets">
<ui:composition template="/WEB-INF/views/org/librecms/ui/contentsection/contentsection.xhtml">
<ui:param name="activePage" value="configuration" />
<ui:param name="title"
value="#{CmsAdminMessages['contentsection.configuration.contactentrykeys.title']}" />
<ui:define name="breadcrumb">
<li class="breadcrumb-item">
<a href="#{mvc.basePath}/#{ContentSectionModel.sectionName}/configuration">
#{CmsAdminMessages['contentsection.configuration.title']}
</a>
</li>
<li class="breadcrumb-item">
<a href="#{mvc.basePath}/#{ContentSectionModel.sectionName}/configuration/contactentrykeys">
#{CmsAdminMessages['contentsection.configuration.contactentrykeys.title']}
</a>
</li>
<li aria-current="page" class="breadcrumb-item">
#{CmsAdminMessages['contentsection.configuration.contactentrykeys.breadcrumbs']} #{CmsSelectedContactEntryKeyModel.key}
</li>
</ui:define>
<ui:define name="main">
<div class="container">
<ui:include src="configuration-tabs.xhtml">
<ui:param name="activeConfPage" value="contactentrykeys" />
</ui:include>
<h1>#{CmsAdminMessages.getMessage('contentsection.configuration.contactentrykeys.contactentrykey_details.title', [CmsSelectedContactEntryKeyModel.key])}</h1>
<libreccm:localizedStringEditor
addButtonLabel="#{CmsAdminMessages['contentsection.configuration.contactentrykeys.contactentrykey_details.label.add.button']}"
addDialogCancelLabel="#{CmsAdminMessages['contentsection.configuration.contactentrykeys.contactentrykey_details.label.add.cancel']}"
addDialogLocaleSelectHelp="#{CmsAdminMessages['contentsection.configuration.contactentrykeys.contactentrykey_details.label.locale.help']}"
addDialogLocaleSelectLabel="#{CmsAdminMessages['contentsection.configuration.contactentrykeys.contactentrykey_details.label.locale.label']}"
addDialogSubmitLabel="#{CmsAdminMessages['contentsection.configuration.contactentrykeys.contactentrykey_details.label.add.submit']}"
addDialogTitle="#{CmsAdminMessages['contentsection.configuration.contactentrykeys.contactentrykey_details.label.add.title']}"
addDialogValueHelp="#{CmsAdminMessages['contentsection.configuration.contactentrykeys.contactentrykey_details.label.value.help']}"
addDialogValueLabel="#{CmsAdminMessages['contentsection.configuration.contactentrykeys.contactentrykey_details.label.value.label']}"
addMethod="#{mvc.basePath}/#{ContentSectionModel.sectionName}/configuration/contactentrykeys/#{CmsSelectedContactEntryKeyModel.key}/label/@add"
editButtonLabel="#{CmsAdminMessages['contentsection.configuration.contactentrykeys.contactentrykey_details.label.edit.button']}"
editDialogCancelLabel="#{CmsAdminMessages['contentsection.configuration.contactentrykeys.contactentrykey_details.label.edit.cancel']}"
editDialogSubmitLabel="#{CmsAdminMessages['contentsection.configuration.contactentrykeys.contactentrykey_details.label.edit.submit']}"
editDialogTitle="#{CmsAdminMessages['contentsection.configuration.contactentrykeys.contactentrykey_details.label.edit.title']}"
editDialogValueHelp="#{CmsAdminMessages['contentsection.configuration.contactentrykeys.contactentrykey_details.label.edit.value.help']}"
editDialogValueLabel="#{CmsAdminMessages['contentsection.configuration.contactentrykeys.contactentrykey_details.label.edit.value.label']}"
editMethod="#{mvc.basePath}/#{ContentSectionModel.sectionName}/configuration/contactentrykeys/#{CmsSelectedContactEntryKeyModel.key}/label/@edit"
editorId="contactentrykey-label"
hasUnusedLocales="#{CmsSelectedContactEntryKeyModel.hasUnusedLabelLocales}"
headingLevel="2"
objectIdentifier="#{CmsSelectedContactEntryKeyModel.key}"
removeButtonLabel="#{CmsAdminMessages['contentsection.configuration.contactentrykeys.contactentrykey_details.label.remove.button']}"
removeDialogCancelLabel="#{CmsAdminMessages['contentsection.configuration.contactentrykeys.contactentrykey_details.label.remove.cancel']}"
removeDialogSubmitLabel="#{CmsAdminMessages['contentsection.configuration.contactentrykeys.contactentrykey_details.label.remove.submit']}"
removeDialogText="#{CmsAdminMessages['contentsection.configuration.contactentrykeys.contactentrykey_details.label.remove.text']}"
removeDialogTitle="#{CmsAdminMessages['contentsection.configuration.contactentrykeys.contactentrykey_details.label.remove.title']}"
removeMethod="#{mvc.basePath}/#{ContentSectionModel.sectionName}/configuration/contactentrykeys/#{CmsSelectedContactEntryKeyModel.key}/label/@remove"
title="#{CmsAdminMessages['contentsection.configuration.contactentrykeys.contactentrykey_details.label.title']}"
unusedLocales="#{CmsSelectedContactEntryKeyModel.unusedLabelLocales}"
values="#{CmsSelectedContactEntryKeyModel.labels}"
/>
</div>
</ui:define>
</ui:composition>
</html>

View File

@ -0,0 +1,132 @@
<!DOCTYPE html [<!ENTITY times '&#215;'>]>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:bootstrap="http://xmlns.jcp.org/jsf/composite/components/bootstrap"
xmlns:c="http://xmlns.jcp.org/jsp/jstl/core"
xmlns:libreccm="http://xmlns.jcp.org/jsf/composite/components/libreccm"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets">
<ui:composition template="/WEB-INF/views/org/librecms/ui/contentsection/contentsection.xhtml">
<ui:param name="activePage" value="configuration" />
<ui:param name="title"
value="#{CmsAdminMessages['contentsection.configuration.contactentrykeys.title']}" />
<ui:define name="breadcrumb">
<li class="breadcrumb-item">
<a href="#{mvc.basePath}/#{ContentSectionModel.sectionName}/configuration">
#{CmsAdminMessages['contentsection.configuration.title']}
</a>
</li>
<li aria-current="page" class="breadcrumb-item">
#{CmsAdminMessages['contentsection.configuration.contactentrykeys.title']}
</li>
</ui:define>
<ui:define name="main">
<div class="container">
<ui:include src="configuration-tabs.xhtml">
<ui:param name="activeConfPage" value="contactentrykeys" />
</ui:include>
<h1>#{CmsAdminMessages['contentsection.configuration.contactentrykeys.title']}</h1>
<c:if test="#{not empty errors}">
<c:forEach items="#{errors}" var="error">
<div class="alert alert-danger" role="alert">
#{error}
</div>
</c:forEach>
</c:if>
<div class="mb-2">
<div class="text-right">
<button class="btn btn-primary"
data-toggle="modal"
data-target="#add-contactentrykey-dialog"
type="button">
<bootstrap:svgIcon icon="plus-circle" />
<span>#{CmsAdminMessages['contentsection.configuration.contactentrykeys.add']}</span>
</button>
</div>
<div aria-hidden="true"
aria-labelledby="add-contacentrykey-dialog-title"
class="modal fade"
id="add-contactentrykey-dialog"
tabindex="-1">
<div class="modal-dialog">
<form action="#{mvc.basePath}/#{ContentSectionModel.sectionName}/configuration/contactentrykeys/@add"
class="modal-content"
method="post">
<div class="modal-header">
<h2 class="modal-title"
id="add-contactentrykey-dialog-title">
#{CmsAdminMessages.getMessage('contentsection.configuration.contactentrykeys.add.dialog.title', [ContentSectionModel.sectionName])}
</h2>
<button aria-label="#{CmsAdminMessages['contentsection.configuration.contactentrykeys.add.dialog.close']}"
class="close"
data-dismiss="modal"
type="button">
<bootstrap:svgIcon icon="x" />
</button>
</div>
<div class="modal-body">
<bootstrap:formGroupText
help="#{CmsAdminMessages['contentsection.configuration.contactentrykeys.add.dialog.entrykey.help']}"
inputId="add-contactentryke-dialog-entrykey"
label="#{CmsAdminMessages['contentsection.configuration.contactentrykeys.add.dialog.entrykey.label']}"
name="contactEntryKey" />
</div>
<div class="modal-footer">
<button class="btn btn-warning"
data-dismiss="modal"
type="button">
#{CmsAdminMessages['contentsection.configuration.contactentrykeys.add.dialog.close']}
</button>
<button class="btn btn-primary"
type="submit" >
#{CmsAdminMessages['contentsection.configuration.contactentrykeys.add.dialog.submit']}
</button>
</div>
</form>
</div>
</div>
</div>
<table class="table table-hover contactentrykeys-table">
<thead>
<tr>
<th scope="col">
#{CmsAdminMessages['contentsection.configuration.contactentrykeys.table.cols.entrykey']}
</th>
<th class="text-center" colspan="2">
#{CmsAdminMessages['contentsection.configuration.contactentrykeys.table.cols.actions']}
</th>
</tr>
</thead>
<tbody>
<c:forEach items="#{CmsContactEntryKeysTableModel.contactEntrykeys}"
var="entryKey">
<tr>
<td>
<a href="#{mvc.basePath}/#{ContentSectionModel.sectionName}/configuration/contactentrykeys/#{entryKey.entryKey}">
#{entryKey.entryKey}
</a>
</td>
<td class="del-col">
<libreccm:deleteDialog
actionTarget="#{mvc.basePath}/#{ContentSectionModel.sectionName}/configuration/contactentrykeys/#{entryKey.entryKey}/@delete"
buttonText="#{CmsAdminMessages['contentsection.configuration.contactentrykeys.delete_button.label']}"
cancelLabel="#{CmsAdminMessages['contentsection.configuration.contactentrykeys.delete_dialog.cancel']}"
confirmLabel="#{CmsAdminMessages['contentsection.configuration.contactentrykeys.delete_dialog.confirm']}"
dialogId="contactentrykeys-#{contactentrykey.uuid}-delete-dialog"
dialogTitle="#{CmsAdminMessages['contentsection.configuration.contactentrykeys.delete_dialog.title']}"
message="#{CmsAdminMessages.getMessage('contentsection.configuration.contactentrykeys.delete_dialog.message', [ContentSectionModel.sectionName, entryKey.entryKey])}"
/>
</td>
</tr>
</c:forEach>
</tbody>
</table>
</div>
</ui:define>
</ui:composition>
</html>

View File

@ -796,3 +796,40 @@ contentsection.assets.createstep.breadcrumb=Create {0} asset
contentsection.assets.createstep.not_available.message=Unable to create new asset of type {2} in folder {1} of content section{0}. Create step for asset type {2} not available.
contentsection.configuration.contactentrykeys.title=Contact Entry Keys
contentsection.configuration.contactentrykeys.description=Configure the possible keys for contact data entries.
contentsection.configuration.contactentrykeys.add=Add Contact Entry Key
contentsection.configuration.contactentrykeys.add.dialog.close=Cancel
contentsection.configuration.contactentrykeys.add.dialog.entrykey.help=The internal key.
contentsection.configuration.contactentrykeys.add.dialog.entrykey.label=Entry Key
contentsection.configuration.contactentrykeys.add.dialog.submit=Add
contentsection.configuration.contactentrykeys.table.cols.entrykey=Possible Contact Entry Entries
contentsection.configuration.contactentrykeys.table.cols.actions=Actions
contentsection.configuration.contactentrykeys.delete_button.label=Delete Contact Entry Key
contentsection.configuration.contactentrykeys.delete_dialog.cancel=Cancel
contentsection.configuration.contactentrykeys.delete_dialog.confirm=Delete
contentsection.configuration.contactentrykeys.delete_dialog.title=Remove Contact Entry Key
contentsection.configuration.contactentrykeys.delete_dialog.message=Are you sure to delete the Contact Data Entry Key {1}?
contentsection.configuration.contactentrykeys.contactentrykey_details.title=Details of Contact Data Entry Key {0}
contentsection.configuration.contactentrykeys.contactentrykey_details.label.title=Localized labels
contentsection.configuration.contactentrykeys.contactentrykey_details.label.add.button=Add localized label
contentsection.configuration.contactentrykeys.contactentrykey_details.label.add.cancel=Cancel
contentsection.configuration.contactentrykeys.contactentrykey_details.label.locale.help=The language of the localized label for the contact data entry key.
contentsection.configuration.contactentrykeys.contactentrykey_details.label.locale.label=Locale
contentsection.configuration.contactentrykeys.contactentrykey_details.label.add.submit=Add label
contentsection.configuration.contactentrykeys.contactentrykey_details.label.add.title=Add localized label
contentsection.configuration.contactentrykeys.contactentrykey_details.label.value.help=The localized label for the contact data entry key.
contentsection.configuration.contactentrykeys.contactentrykey_details.label.value.label=Label
contentsection.configuration.contactentrykeys.contactentrykey_details.label.edit.button=Edit
contentsection.configuration.contactentrykeys.contactentrykey_details.label.edit.cancel=Cancel
contentsection.configuration.contactentrykeys.contactentrykey_details.label.edit.submit=Save
contentsection.configuration.contactentrykeys.contactentrykey_details.label.edit.title=Edit localized label
contentsection.configuration.contactentrykeys.contactentrykey_details.label.edit.value.help=The localized label for the contact data entry key.
contentsection.configuration.contactentrykeys.contactentrykey_details.label.edit.value.label=Label
contentsection.configuration.contactentrykeys.contactentrykey_details.label.remove.button=Remove
contentsection.configuration.contactentrykeys.contactentrykey_details.label.remove.cancel=Cancel
contentsection.configuration.contactentrykeys.contactentrykey_details.label.remove.submit=Remove localized label
contentsection.configuration.contactentrykeys.contactentrykey_details.label.remove.text=Are you sure to remove to following localized label:
contentsection.configuration.contactentrykeys.contactentrykey_details.label.remove.title=Remove localized label
contentsection.configuration.contactentrykey.not_found.title=Contact Data Entry Key not found
contentsection.configuration.contactentrykey.not_found=Contact Data Entry Key {0} not found.
contentsection.configuration.contactentrykeys.add.dialog.title=Add Contact Entry Key
contentsection.configuration.contactentrykeys.breadcrumbs=Contact Entry Keys

View File

@ -795,5 +795,42 @@ contentsection.assets.asset_type.not_available.message=Kein Asset Typ {1} f\u00f
contentsection.assets.createstep.not_available.title=Kein Formular zum Erstellen verf\u00fcgbar
contentsection.assets.createstep.breadcrumb={0} asset anlegen
contentsection.assets.createstep.not_available.message=Anlegen eines Assets vom Type {2} in Ordner {1} der Content Section {0} nicht m\u00f6glich. Formular zum Anlegen von Assets des Types {2} nicht verf\u00fcgbar.
contentsection.configuration.contactentrykeys.title=Kontaktdaten-Schl\u00fcssel
contentsection.configuration.contactentrykeys.title=Kontaktdaten-Angaben
contentsection.configuration.contactentrykeys.description=Verwalten der m\u00f6glichen Kontaktdaten-Angaben.
contentsection.configuration.contactentrykeys.add=M\u00f6gliche Kontaktdaten-Angabe hinzuf\u00fcgen
contentsection.configuration.contactentrykeys.add.dialog.close=Abbrechen
contentsection.configuration.contactentrykeys.add.dialog.entrykey.help=Der interne Schl\u00fcssel.
contentsection.configuration.contactentrykeys.add.dialog.entrykey.label=Schl\u00fcssel f\u00fcr die Angabe
contentsection.configuration.contactentrykeys.add.dialog.submit=Hinzuf\u00fcgen
contentsection.configuration.contactentrykeys.table.cols.entrykey=M\u00f6gliche Kontaktdaten-Angaben
contentsection.configuration.contactentrykeys.table.cols.actions=Aktionen
contentsection.configuration.contactentrykeys.delete_button.label=Entfernen
contentsection.configuration.contactentrykeys.delete_dialog.cancel=Abbrechen
contentsection.configuration.contactentrykeys.delete_dialog.confirm=L\u00f6schen
contentsection.configuration.contactentrykeys.delete_dialog.title=M\u00f6gliche Kontaktdaten-Angaben entfernen
contentsection.configuration.contactentrykeys.delete_dialog.message=Sind Sie sicher, dass Sie die Kontaktdaten-Angabe {1} l\u00f6schen m\u00f6chten?
contentsection.configuration.contactentrykeys.contactentrykey_details.title=Details der Kontaktdaten-Angabe {0}
contentsection.configuration.contactentrykeys.contactentrykey_details.label.title=Lokalisierte Label
contentsection.configuration.contactentrykeys.contactentrykey_details.label.add.button=Lokalisiertes Label hinzuf\u00fcgen
contentsection.configuration.contactentrykeys.contactentrykey_details.label.add.cancel=Abbrechen
contentsection.configuration.contactentrykeys.contactentrykey_details.label.locale.help=Die Sprache des lokaliserte Label f\u00fcr die Kontaktdaten-Angabe.
contentsection.configuration.contactentrykeys.contactentrykey_details.label.locale.label=Sprache
contentsection.configuration.contactentrykeys.contactentrykey_details.label.add.submit=Label hinzuf\u00fcgen
contentsection.configuration.contactentrykeys.contactentrykey_details.label.add.title=Lokalisertes Label hinzuf\u00fcgen
contentsection.configuration.contactentrykeys.contactentrykey_details.label.value.help=Das lokaliserte Label f\u00fcr die Kontaktdaten-Angabe.
contentsection.configuration.contactentrykeys.contactentrykey_details.label.value.label=Label
contentsection.configuration.contactentrykeys.contactentrykey_details.label.edit.button=Bearbeiten
contentsection.configuration.contactentrykeys.contactentrykey_details.label.edit.cancel=Abbrechen
contentsection.configuration.contactentrykeys.contactentrykey_details.label.edit.submit=Speichern
contentsection.configuration.contactentrykeys.contactentrykey_details.label.edit.title=Lokalisiertes Label bearbeiten
contentsection.configuration.contactentrykeys.contactentrykey_details.label.edit.value.help=Das lokaliserte Label f\u00fcr die Kontaktdaten-Angabe.
contentsection.configuration.contactentrykeys.contactentrykey_details.label.edit.value.label=Label
contentsection.configuration.contactentrykeys.contactentrykey_details.label.remove.button=Entfernen
contentsection.configuration.contactentrykeys.contactentrykey_details.label.remove.cancel=Abbrechen
contentsection.configuration.contactentrykeys.contactentrykey_details.label.remove.submit=Lokalisiertes Label entfernen
contentsection.configuration.contactentrykeys.contactentrykey_details.label.remove.text=Sind Sie sicher, dass das folgende lokaliserte Label entfernen wollen:
contentsection.configuration.contactentrykeys.contactentrykey_details.label.remove.title=Lokalisiertes Label entfernen
contentsection.configuration.contactentrykey.not_found.title=Kontaktdaten-Angabe nicht gefunden
contentsection.configuration.contactentrykey.not_found=Kontaktdaten-Angabe {0} nicht gefunden.
contentsection.configuration.contactentrykeys.add.dialog.title=M\u00f6gliche Kontaktdaten-Angabe hinzuf\u00fcgen
contentsection.configuration.contactentrykeys.breadcrumbs=Kontaktdaten-Angaben