UI for editing Persons and ContactableEntities

pull/10/head
Jens Pelzetter 2021-05-31 20:50:42 +02:00
parent 1d0e1e0ec6
commit 07af86a955
6 changed files with 411 additions and 9 deletions

View File

@ -202,6 +202,7 @@ public abstract class AbstractContactableEntityEditStep
@AuthorizationRequired @AuthorizationRequired
@Transactional(Transactional.TxType.REQUIRED) @Transactional(Transactional.TxType.REQUIRED)
public String setPostalAddress( public String setPostalAddress(
@FormParam("postalAddressIdentifier")
final String postalAddressIdentifier final String postalAddressIdentifier
) { ) {
final Identifier identifier = identifierParser final Identifier identifier = identifierParser

View File

@ -18,15 +18,19 @@
*/ */
package org.librecms.ui.contentsections.assets; package org.librecms.ui.contentsections.assets;
import org.libreccm.l10n.GlobalizationHelper;
import org.librecms.assets.PostalAddress; import org.librecms.assets.PostalAddress;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Locale;
import java.util.Map; import java.util.Map;
import java.util.Optional;
import javax.enterprise.context.RequestScoped; import javax.enterprise.context.RequestScoped;
import javax.inject.Inject;
import javax.inject.Named; import javax.inject.Named;
/** /**
@ -37,6 +41,9 @@ import javax.inject.Named;
@Named("CmsContactableEditStepModel") @Named("CmsContactableEditStepModel")
public class ContactableEntityEditStepModel { public class ContactableEntityEditStepModel {
@Inject
private GlobalizationHelper globalizationHelper;
private Map<String, String> availableContactEntryKeys; private Map<String, String> availableContactEntryKeys;
private List<ContactEntryListItemModel> contactEntries; private List<ContactEntryListItemModel> contactEntries;
@ -69,8 +76,24 @@ public class ContactableEntityEditStepModel {
return postalAddress; return postalAddress;
} }
public String getPostalAddressType() {
return PostalAddress.class.getName();
}
protected void setPostalAddress(final PostalAddress postalAddress) { protected void setPostalAddress(final PostalAddress postalAddress) {
this.postalAddress = postalAddress; this.postalAddress = postalAddress;
} }
public String getPostalAddressCountry() {
return Optional
.ofNullable(postalAddress)
.map(PostalAddress::getIsoCountryCode)
.map(code -> new Locale("", code))
.map(
locale -> locale.getDisplayCountry(
globalizationHelper.getNegotiatedLocale()
)
).orElse("");
}
} }

View File

@ -3,11 +3,73 @@
xmlns:bootstrap="http://xmlns.jcp.org/jsf/composite/components/bootstrap" xmlns:bootstrap="http://xmlns.jcp.org/jsf/composite/components/bootstrap"
xmlns:c="http://xmlns.jcp.org/jsp/jstl/core" xmlns:c="http://xmlns.jcp.org/jsp/jstl/core"
xmlns:libreccm="http://xmlns.jcp.org/jsf/composite/components/libreccm" xmlns:libreccm="http://xmlns.jcp.org/jsf/composite/components/libreccm"
xmlns:librecms="http://xmlns.jcp.org/jsf/composite/components/librecms"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets"> xmlns:ui="http://xmlns.jcp.org/jsf/facelets">
<ui:composition> <ui:composition>
<h3>#{CmsAssetsStepsDefaultMessagesBundle['contactable.contactentries.title']}</h3> <h3>#{CmsAssetsStepsDefaultMessagesBundle['contactable.contactentries.title']}</h3>
<div class="text-right">
<button class="btn btn-primary"
data-toggle="modal"
data-target="#add-contactentry-dialog"
type="button">
<bootstrap:svgIcon icon="plus-circle" />
<span class="sr-only">#{CmsAssetsStepsDefaultMessagesBundle['contactable.contactentries.add.label']}</span>
</button>
</div>
<div aria-hidden="true"
aria-labelledby="#add-contactentry-dialog-title"
class="modal fade"
id="add-contactentry-dialog"
tabindex="-1">
<div class="modal-dialog">
<form action="#{actionBaseUrl}/contactentries"
class="modal-content"
method="post">
<div class="modal-header">
<h4 class="modal-header"
id="add-contactentry-dialog-title">
#{CmsAssetsStepsDefaultMessagesBundle['contactable.contactentries.add.title']}
</h4>
<button
aria-label="#{CmsAssetsStepsDefaultMessagesBundle['contactable.contactentry.add.close']}"
class="close"
data-dismiss="modal"
type="button">
<bootstrap:svgIcon icon="x" />
</button>
</div>
<div class="modal-body">
<bootstrap:formGroupSelect
help="#{CmsAssetsStepsDefaultMessagesBundle['contactable.contactentry.add.entrykey.help']}"
inputId="entryKey"
label="#{CmsAssetsStepsDefaultMessagesBundle['contactable.contactentry.add.entrykey.label']}"
name="entryKey"
options="#{CmsContactableEditStepModel.availableContactEntryKeys}"
/>
<bootstrap:formGroupText
help="#{CmsAssetsStepsDefaultMessagesBundle['contactable.contactentry.add.entryvalue.help']}"
inputId="entryValue"
label="#{CmsAssetsStepsDefaultMessagesBundle['contactable.contactentry.add.entryvalue.label']}"
name="entryValue"
/>
</div>
<div class="modal-footer">
<button class="btn btn-warning"
data-dismiss="modal"
type="button">
#{CmsAssetsStepsDefaultMessagesBundle['contactable.contactentries.add.close']}
</button>
<button class="btn btn-success"
type="submit">
#{CmsAssetsStepsDefaultMessagesBundle['contactable.postaladdress.add.submit']}
</button>
</div>
</form>
</div>
</div>
<table> <table>
<thead> <thead>
<tr> <tr>
@ -19,25 +81,223 @@
<tbody> <tbody>
<c:forEach items="#{CmsContactableEditStepModel.contactEntries}" <c:forEach items="#{CmsContactableEditStepModel.contactEntries}"
var="entry"> var="entry">
<tr data-entrykey="#{entry.entryKey}"> <tr data-entrykey="#{entry.entryKey}"
id="#{entry.contactEntryId}">
<td>#{entry.entryKeyLabel}</td> <td>#{entry.entryKeyLabel}</td>
<td>#{entry.value}</td> <td>#{entry.value}</td>
<td> <td>
<button class="btn btn-primary" <button class="btn btn-primary"
data-toggle="modal"
data-target="#edit-contactntry-dialog-#{entry.contactEntryId}"
type="button"> type="button">
<bootstrap:svgIcon icon="pen" /> <bootstrap:svgIcon icon="pen" />
<span class="sr-only">#{CmsAssetsStepsDefaultMessagesBundle['contactable.contactentries.edit']}</span> <span class="sr-only">#{CmsAssetsStepsDefaultMessagesBundle['contactable.contactentries.edit']}</span>
</button> </button>
<div aria-hidden="true"
aria-labelledby="edit-contactntry-dialog-#{entry.contactEntryId}-title"
class="modal fade"
tabindex="-1">
<div class="modal-content">
<form action="#{actionBaseUrl}/contactentries/#{entry.order}"
class="modal-content"
method="post">
<div class="modal-header">
<h4 class="modal-title"
id="edit-contactntry-dialog-#{entry.contactEntryId}-title">
#{CmsAssetsStepsDefaultMessagesBundle['contactable.contactentries.edit.title']}
</h4>
<button
aria-label="#{CmsAssetsStepsDefaultMessagesBundle['contactable.contactentries.edit.close']}"
class="close"
data-dismiss="modal"
type="button">
<bootstrap:svgIcon icon="x" />
</button>
</div>
<div class="modal-body">
<bootstrap:formGroupSelect
help="#{CmsAssetsStepsDefaultMessagesBundle['contactable.contactentry.edit.entrykey.help']}"
inputId="entryKey"
label="#{CmsAssetsStepsDefaultMessagesBundle['contactable.contactentry.edit.entrykey.label']}"
name="entryKey"
options="#{CmsContactableEditStepModel.availableContactEntryKeys}"
selectedOptions="#{[entry.entryKey]}"
/>
<bootstrap:formGroupText
help="#{CmsAssetsStepsDefaultMessagesBundle['contactable.contactentry.edit.entryvalue.help']}"
inputId="entryValue"
label="#{CmsAssetsStepsDefaultMessagesBundle['contactable.contactentry.edit.entryvalue.label']}"
name="entryValue"
value="#{entry.value}"
/>
</div>
<div class="modal-footer">
<button class="btn btn-warning"
data-dismiss="modal"
type="button">
#{CmsAssetsStepsDefaultMessagesBundle['contactable.contactentries.edit.close']}
</button>
<button class="btn btn-success"
type="submit">
#{CmsAssetsStepsDefaultMessagesBundle['contactable.postaladdress.edit.submit']}
</button>
</div>
</form>
</div>
</div>
<button class="btn btn-danger" <button class="btn btn-danger"
data-toggle="modal"
data-target="#remove-contactentry-dialog-#{entry.contactEntryId}"
type="button"> type="button">
<bootstrap:svgIcon icon="x-circle" /> <bootstrap:svgIcon icon="x-circle" />
<span class="sr-only">#{CmsAssetsStepsDefaultMessagesBundle['contactable.contactentries.remove']}</span> <span class="sr-only">#{CmsAssetsStepsDefaultMessagesBundle['contactable.contactentries.remove']}</span>
</button> </button>
<div aria-hidden="true"
aria-labelledby="remove-contactentry-dialog-#{entry.contactEntryId}-title"
class="modal fade"
tabindex="-1">
<div class="modal-dialog">
<form action="#{actionBaseUrl}/contactentries/#{entry.order}/@remove"
class="modal-content"
method="post">
<div class="modal-header">
<h4 class="modal-title"
id="remove-contactentry-dialog-#{entry.contactEntryId}-title">
#{CmsAssetsStepsDefaultMessagesBundle['contactable.contactentries.remove.title']}
</h4>
<button
aria-label="#{CmsAssetsStepsDefaultMessagesBundle['contactable.contactentries.remove.close']}"
class="close"
data-dismiss="modal"
type="button">
<bootstrap:svgIcon icon="x" />
</button>
</div>
<div class="modal-body">
<p>
#{CmsDefaultStepsMessageBundle.getMessage('contactable.contactentries.remove.message', [entry.entryKeyLabel, entry.value])}
</p>
</div>
<div class="modal-footer">
<button class="btn btn-secondary"
data-dismiss="modal"
type="button">
#{CmsAssetsStepsDefaultMessagesBundle['contactable.contactentries.remove.close']}
</button>
<button class="btn btn-danger"
type="submit">
#{CmsAssetsStepsDefaultMessagesBundle['contactable.contactentries.remove.submit']}
</button>
</div>
</form>
</div>
</div>
</td> </td>
</tr> </tr>
</c:forEach> </c:forEach>
</tbody> </tbody>
</table> </table>
<h3>#{CmsAssetsStepsDefaultMessagesBundle['contactable.postaladdress.title']}</h3>
<librecms:assetPicker
action="#{actionBaseUrl}/postaladdress"
assetType="#{CmsContactableEditStepModel.postalAddressType}"
assetPickerId="postaladdress-picker"
contentSection="#{ContentSectionModel.sectionName}"
formParamName="postalAddressIdentifier"
/>
<c:choose>
<c:when test="#{CmsContactableEditStepModel.postalAddress == null}">
<div class="text-right">
<librecms:assetPickerButton
assetPickerId="postaladdress-picker"
/>
</div>
<p>#{CmsAssetsStepsDefaultMessagesBundle['contactable.postaladdress.none']}</p>
</c:when>
<c:otherwise>
<div class="text-right">
<librecms:assetPickerButton
assetPickerId="postaladdress-picker"
/>
<button class="btn btn-danger"
data-toggle="modal"
data-target="#remove-postaladdress-dialog"
type="button">
<bootstrap:svgIcon icon="x-circle" />
<span class="sr-only">#{CmsAssetsStepsDefaultMessagesBundle['contactable.postaladdress.remove.label']}</span>
</button>
</div>
<div aria-hidden="true"
aria-labelledby="remove-postaladdress-dialog-title"
class="modal fade"
id="remove-postaladdress-dialog"
tabindex="-1">
<div class="modal-dialog">
<form action="#{actionBaseUrl}/postaladdress/@remove"
class="modal-content"
method="post">
<div class="modal-header">
<h4 class="modal-title"
id="remove-postaladdress-dialog-title">
#{CmsAssetsStepsDefaultMessagesBundle['contactable.postaladdress.remove.title']}
</h4>
<button
aria-label="#{CmsAssetsStepsDefaultMessagesBundle['contactable.postaladdress.remove.close']}"
class="close"
data-dismiss="modal"
type="button">
<bootstrap:svgIcon icon="x" />
</button>
</div>
<div class="modal-body">
<p>
#{CmsAssetsStepsDefaultMessagesBundle['contactable.postaladdress.remove.message']}
</p>
</div>
<div class="modal-footer">
<button class="btn btn-secondary"
data-dismiss="modal"
type="button">
#{CmsAssetsStepsDefaultMessagesBundle['contactable.postaladdress.remove.close']}
</button>
<button class="btn btn-danger"
type="submit">
#{CmsAssetsStepsDefaultMessagesBundle['contactable.postaladdress.remove.submit']}
</button>
</div>
</form>
</div>
</div>
<dl>
<div>
<dt>#{CmsAssetsStepsDefaultMessagesBundle['contactable.postaladdress.address']}</dt>
<dd>
<pre>#{CmsContactableEditStepModel.postalAddress.address}</pre>
</dd>
</div>
<div>
<dt>#{CmsAssetsStepsDefaultMessagesBundle['contactable.postaladdress.postalcode']}</dt>
<dd>#{CmsContactableEditStepModel.postalAddress.postalCode}</dd>
</div>
<div>
<dt>#{CmsAssetsStepsDefaultMessagesBundle['contactable.postaladdress.city']}</dt>
<dd>#{CmsContactableEditStepModel.postalAddress.city}</dd>
</div>
<div>
<dt>#{CmsAssetsStepsDefaultMessagesBundle['contactable.postaladdress.state']}</dt>
<dd>#{CmsContactableEditStepModel.postalAddress.state}</dd>
</div>
<div>
<dt>#{CmsAssetsStepsDefaultMessagesBundle['contactable.postaladdress.country']}</dt>
<dd>#{CmsContactableEditStepModel.postalAddressCountry}) (#{CmsContactableEditStepModel.postalAddress.isoCountryCode})</dd>
</div>
</dl>
</c:otherwise>
</c:choose>
</ui:composition> </ui:composition>
</html> </html>

View File

@ -30,14 +30,15 @@
aria-labelledby="add-personname-dialog-title" aria-labelledby="add-personname-dialog-title"
class="modal fade" class="modal fade"
id="add-personname-dialog" id="add-personname-dialog"
tab accesskey="-1" tabindex="-1"
> >
<div class="modal-dialog"> <div class="modal-dialog">
<form action="#{mvc.basePath}/#{ContentSectionModel.sectionName}/asset/#{CmsSelectedAssetModel.assetPath}/@person-edit/personnames/@add" <form action="#{mvc.basePath}/#{ContentSectionModel.sectionName}/asset/#{CmsSelectedAssetModel.assetPath}/@person-edit/personnames/@add"
class="modal-content" class="modal-content"
method="post"> method="post">
<div class="modal-header"> <div class="modal-header">
<h4 id="add-personname-dialog-title"> <h4 class="modal-title"
id="add-personname-dialog-title">
#{CmsAssetsStepsDefaultMessagesBundle['person.personname.add.dialog.title']} #{CmsAssetsStepsDefaultMessagesBundle['person.personname.add.dialog.title']}
</h4> </h4>
<button <button
@ -205,7 +206,7 @@
value="true"/> value="true"/>
<p> <p>
#{CmsAssetsStepsDefaultMessagesBundle['person.personname.remove.dialog.message']} #{CmsAssetsStepsDefaultMessagesBundle.getMessage('person.personname.remove.dialog.message', [personName.prefix, personName.surname, personName.givenName, personName.suffix])}
</p> </p>
<dl> <dl>
<div> <div>
@ -246,7 +247,14 @@
</tbody> </tbody>
</table> </table>
<ui:include src="../edit-contactable.xhtml" /> <ui:include src="../edit-contactable.xhtml">
<ui:param name="actionBaseUrl"
value="#{mvc.basePath}/#{ContentSectionModel.sectionName}/assets/#{CmsSelectedAssetModel.assetPath}/@person-edit" />
<ui:param name="contactEntryAction"
value="#{mvc.basePath}/#{ContentSectionModel.sectionName}/assets/#{CmsSelectedAssetModel.assetPath}/@person-edit/contactentries" />
<ui:param name="postalAddressAction"
value="#{mvc.basePath}/#{ContentSectionModel.sectionName}/assets/#{CmsSelectedAssetModel.assetPath}/@person-edit/postaladdress" />
</ui:include>
</ui:define> </ui:define>

View File

@ -208,3 +208,58 @@ fileasset.editstep.file.type=File Type
fileasset.editstep.file.size=File size fileasset.editstep.file.size=File size
editstep.legalmetadata.rights.remove.submit=Remove editstep.legalmetadata.rights.remove.submit=Remove
fileasset.editstep.file.upload.label=Upload file fileasset.editstep.file.upload.label=Upload file
contactable.contactentries.title=Contact Entries
contactable.contactentries.add.label=Add contact entry
contactable.contactentries.add.title=Add contact entry
contactable.contactentry.add.close=Cancel
contactable.contactentry.add.entrykey.help=Type of the contact entry.
contactable.contactentry.add.entrykey.label=Type
contactable.contactentry.add.entryvalue.help=Value of the contact entry.
contactable.contactentry.add.entryvalue.label=Value
contactable.postaladdress.add.submit=Add contact entry
contactable.contactentries.cols.key=Type
contactable.contactentries.cols.value=Value
contactable.contactentries.cols.actions=Actions
contactable.contactentries.edit=Edit
contactable.contactentries.remove=Remove contact entry
contactable.contactentries.edit.title=Edit contact entry
contactable.contactentries.edit.close=Cancel
contactable.contactentry.edit.entrykey.help=Type of the contact entry.
contactable.contactentry.edit.entryvalue.help=Value of the contact entry.
contactable.contactentry.edit.entrykey.label=Type
contactable.contactentry.edit.entryvalue.label=Value
contactable.postaladdress.edit.submit=Save
contactable.contactentries.remove.title=Remove contact entry
contactable.contactentries.remove.close=Cancel
contactable.contactentries.remove.message=Are your sure to remove the following contact data entry: {0}: {1}?
contactable.contactentries.remove.submit=Remove contact entry
contactable.postaladdress.title=Postal Address
contactable.postaladdress.none=No postal address assigned yet.
contactable.postaladdress.remove.label=Remove postal address
contactable.postaladdress.remove.title=Remove Postal Address
contactable.postaladdress.remove.close=Cancel
contactable.postaladdress.remove.message=Are your sure that you want to remove the postal address?
contactable.postaladdress.remove.submit=Remove postal address
contactable.postaladdress.address=Address
contactable.postaladdress.postalcode=Postal Code
contactable.postaladdress.city=City
contactable.postaladdress.state=State
contactable.postaladdress.country=Country
person.editstep.header=Edit person {0}
person.personnames=Names of the person
person.personname.add=Add person name
person.personname.add.dialog.title=Add Person Name
person.personname.prefix.help=Prefixes of the name, for example german doctoral degrees like Dr. rer. nat. or Dr.-Ing.
person.personname.prefix.label=Prefix
person.personname.surname.help=The surname/family name of the person.
person.personname.surname.label=Surname
person.personname.givenname.help=The name of the person.
person.personname.suffix.help=Suffixes of the name, for example Ph.D.
person.personname.suffix.label=Suffix
person.personname.edit.dialog.close=Cancel
person.personname.edit.dialog.submit=Add name
person.personname.remove=Remove person name
person.personname.remove.dialog.title=Remove Person Name
person.personname.remove.dialog.close=Cancel
person.personname.remove.dialog.message=Are you sure to remove the following person name: {0} {1} {2} {3}?
person.personname.remove.dialog.submit=Remove name

View File

@ -208,3 +208,58 @@ fileasset.editstep.file.type=Dateityp
fileasset.editstep.file.size=Gr\u00f6\u00dfe der Datei fileasset.editstep.file.size=Gr\u00f6\u00dfe der Datei
editstep.legalmetadata.rights.remove.submit=Entfernen editstep.legalmetadata.rights.remove.submit=Entfernen
fileasset.editstep.file.upload.label=Datei hochladen fileasset.editstep.file.upload.label=Datei hochladen
contactable.contactentries.title=Kontaktdaten
contactable.contactentries.add.label=Kontaktdaten hinzuf\u00fcgen
contactable.contactentries.add.title=Kontaktdaten hinzuf\u00fcgen
contactable.contactentry.add.close=Abbrechen
contactable.contactentry.add.entrykey.help=Typ des Kontaktdaten-Eintrages.
contactable.contactentry.add.entrykey.label=Typ
contactable.contactentry.add.entryvalue.help=Wert des Kontaktdaten-Eintrages.
contactable.contactentry.add.entryvalue.label=Wert
contactable.postaladdress.add.submit=Eintrag hinzuf\u00fcgen
contactable.contactentries.cols.key=Typ
contactable.contactentries.cols.value=Wert
contactable.contactentries.cols.actions=Aktionen
contactable.contactentries.edit=Bearbeiten
contactable.contactentries.remove=Kontaktdateneintrag entfernen
contactable.contactentries.edit.title=Kontaktdaten-Eintrag bearbeiten
contactable.contactentries.edit.close=Abbrechen
contactable.contactentry.edit.entrykey.help=Typ des Kontaktdaten-Eintrages.
contactable.contactentry.edit.entryvalue.help=Wert des Kontaktdaten-Eintrages.
contactable.contactentry.edit.entrykey.label=Typ
contactable.contactentry.edit.entryvalue.label=wert
contactable.postaladdress.edit.submit=Speichern
contactable.contactentries.remove.title=Kontaktdateneintrag entfernen
contactable.contactentries.remove.close=Abbrechen
contactable.contactentries.remove.message=Sind Sie sicher, dass die den folgenden Kontaktdaten-Eintrag entfernen wollen: {0}: {1}?
contactable.contactentries.remove.submit=Kontaktdateneintrag entfernen
contactable.postaladdress.title=Postanschrift
contactable.postaladdress.none=Es wurde noch keine Postanschrift zugewiesen.
contactable.postaladdress.remove.label=Postanschrift entfernen
contactable.postaladdress.remove.title=Postanschrift entfernen
contactable.postaladdress.remove.close=Abbrechen
contactable.postaladdress.remove.message=Sind Sie sicher, dass Sie die Postanschift entfernen wollen?
contactable.postaladdress.remove.submit=Postanschrift entfernen
contactable.postaladdress.address=Adresse
contactable.postaladdress.postalcode=Postleitzahl
contactable.postaladdress.city=Ort
contactable.postaladdress.state=Bundesstaat
contactable.postaladdress.country=Land
person.editstep.header=Person {0} bearbeiten
person.personnames=Namen der Person
person.personname.add=Namen hinzuf\u00fcgen
person.personname.add.dialog.title=Namen hinzuf\u00fcgen
person.personname.prefix.help=Prefixe des Namens, z.B. Doktorgrade wie Dr. rer. nat. or Dr.-Ing.
person.personname.prefix.label=Prefix
person.personname.surname.help=Der Nachname/Familienname der Person.
person.personname.surname.label=Familienname
person.personname.givenname.help=Der Name der Person.
person.personname.suffix.help=Suffixe des Namens, zum Beispiel Ph.D.
person.personname.suffix.label=Suffix
person.personname.edit.dialog.close=Abbrechen
person.personname.edit.dialog.submit=Namen hinzuf\u00fcgen
person.personname.remove=Namen entfernen
person.personname.remove.dialog.title=Namen entfernen
person.personname.remove.dialog.close=Abbrechen
person.personname.remove.dialog.message=Sind Sie sicher, dass Sie den folgenden Namen entfernen wollen: {0} {1} {2} {3}?
person.personname.remove.dialog.submit=Namen entfernen