Views for managing categories

Former-commit-id: 7f02c95307
pull/7/head
Jens Pelzetter 2020-11-19 20:39:13 +01:00
parent b0e5d45680
commit 05b73665d7
15 changed files with 534 additions and 242 deletions

View File

@ -19,6 +19,7 @@
package org.libreccm.ui.admin.categories;
import org.libreccm.categorization.Category;
import org.libreccm.categorization.CategoryManager;
import org.libreccm.ui.Message;
import java.util.ArrayList;
@ -28,10 +29,10 @@ import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
import java.util.TreeMap;
import java.util.stream.Collectors;
import javax.enterprise.context.RequestScoped;
import javax.inject.Inject;
import javax.inject.Named;
import javax.transaction.Transactional;
@ -43,6 +44,9 @@ import javax.transaction.Transactional;
@Named("CategoryDetailsModel")
public class CategoryDetailsModel {
@Inject
private CategoryManager categoryManager;
private long categoryId;
private String uuid;
@ -51,6 +55,8 @@ public class CategoryDetailsModel {
private String name;
private String path;
private Map<String, String> title;
private Map<String, String> description;
@ -69,6 +75,8 @@ public class CategoryDetailsModel {
private final List<Message> messages;
private Set<String> invalidFields;
public CategoryDetailsModel() {
this.messages = new ArrayList<>();
}
@ -77,6 +85,10 @@ public class CategoryDetailsModel {
return categoryId;
}
public String getIdentifier() {
return String.format("ID-%d", categoryId);
}
public String getUuid() {
return uuid;
}
@ -89,6 +101,10 @@ public class CategoryDetailsModel {
return name;
}
public String getPath() {
return path;
}
public Map<String, String> getTitle() {
return Collections.unmodifiableMap(title);
}
@ -117,37 +133,18 @@ public class CategoryDetailsModel {
return parentCategory;
}
protected void setParentCategory(final Category parent) {
parentCategory = buildCategoryNodeModel(parent);
}
public long getCategoryOrder() {
return categoryOrder;
}
/**
* Only for testing components
* @return
*/
public Map<String, String> getOptions() {
final Map<String, String> options = new TreeMap<>();
options.put("alpha", "Option Alpha");
options.put("bravo", "Option Bravo");
options.put("charlie", "Option Charlie");
options.put("delta", "Option Delta");
options.put("echo", "Option Echo");
return options;
public boolean isNew() {
return categoryId == 0;
}
public Set<String> getSelectedOptions() {
final Set<String> selectedOptions = new HashSet<>();
selectedOptions.add("delta");
return selectedOptions;
}
public Set<String> getMultipleSelectedOptions() {
final Set<String> selectedOptions = new HashSet<>();
selectedOptions.add("delta");
selectedOptions.add("bravo");
return selectedOptions;
}
public List<Message> getMessages() {
return Collections.unmodifiableList(messages);
}
@ -156,6 +153,18 @@ public class CategoryDetailsModel {
messages.add(message);
}
public Set<String> getInvalidFields() {
return Collections.unmodifiableSet(invalidFields);
}
protected void addInvalidField(final String invalidField) {
invalidFields.add(invalidField);
}
protected void setInvalidFields(final Set<String> invalidFields) {
this.invalidFields = new HashSet<>(invalidFields);
}
@Transactional(Transactional.TxType.REQUIRED)
protected void setCategory(final Category category) {
Objects.requireNonNull(category);
@ -164,6 +173,7 @@ public class CategoryDetailsModel {
uuid = category.getUuid();
uniqueId = category.getUniqueId();
name = category.getName();
path = categoryManager.getCategoryPath(category);
title = category
.getTitle()
.getValues()
@ -192,11 +202,22 @@ public class CategoryDetailsModel {
subCategories = category
.getSubCategories()
.stream()
.map(CategoryNodeModel::new)
.map(this::buildCategoryNodeModel)
.sorted()
.collect(Collectors.toList());
parentCategory = new CategoryNodeModel(category.getParentCategory());
parentCategory = buildCategoryNodeModel(category.getParentCategory());
categoryOrder = category.getCategoryOrder();
}
private CategoryNodeModel buildCategoryNodeModel(final Category category) {
final CategoryNodeModel model = new CategoryNodeModel();
model.setCategoryId(category.getObjectId());
model.setUuid(category.getUuid());
model.setUniqueId(category.getUniqueId());
model.setName(category.getName());
model.setPath(categoryManager.getCategoryPath(category));
model.setCategoryOrder(category.getCategoryOrder());
return model;
}
}

View File

@ -76,23 +76,19 @@ public class CategoryFormController {
private boolean enabled;
@FormParam("visible")
private boolean visisble;
private boolean visible;
@FormParam("abstractCategory")
private boolean abstractCategory;
@FormParam("categoryOrder")
private long categoryOrder;
@FormParam("parentCategoryIdentifier")
private String parentCategoryIdentifier;
@POST
@Path("/new")
@Path("/{parentCategoryIdentifier}/new")
@AuthorizationRequired
@RequiresPrivilege(CoreConstants.PRIVILEGE_ADMIN)
@Transactional(Transactional.TxType.REQUIRED)
public String createCategory() {
public String createCategory(
@PathParam("parentCategoryIdentifier") final String parentCategoryIdentifier
) {
final Identifier parentIdentifier = identifierParser.parseIdentifier(
parentCategoryIdentifier
);
@ -118,9 +114,8 @@ public class CategoryFormController {
category.setUniqueId(uniqueId);
category.setName(name);
category.setEnabled(enabled);
category.setVisible(visisble);
category.setVisible(visible);
category.setAbstractCategory(abstractCategory);
category.setCategoryOrder(categoryOrder);
categoryRepository.save(category);
categoryManager.addSubCategoryToCategory(category, parentCategory);
@ -152,7 +147,7 @@ public class CategoryFormController {
final String categoryIdentifierParam
) {
final Identifier identifier = identifierParser.parseIdentifier(
parentCategoryIdentifier
categoryIdentifierParam
);
final Optional<Category> result;
switch (identifier.getType()) {
@ -175,12 +170,11 @@ public class CategoryFormController {
category.setUniqueId(uniqueId);
category.setName(name);
category.setEnabled(enabled);
category.setVisible(visisble);
category.setVisible(visible);
category.setAbstractCategory(abstractCategory);
category.setCategoryOrder(categoryOrder);
categoryRepository.save(category);
return String.format(
"redirect:categorymanager/categories/ID-%s",
category.getObjectId()

View File

@ -28,45 +28,70 @@ import java.util.Objects;
*/
public class CategoryNodeModel implements Comparable<CategoryNodeModel> {
private final long categoryId;
private long categoryId;
private final String uuid;
private String uuid;
private final String uniqueId;
private String uniqueId;
private final String name;
private String name;
private String path;
private final long categoryOrder;
public CategoryNodeModel(final Category category) {
Objects.requireNonNull(category);
categoryId = category.getObjectId();
uuid = category.getUuid();
uniqueId = category.getUniqueId();
categoryOrder = category.getCategoryOrder();
name = category.getName();
}
private long categoryOrder;
public long getCategoryId() {
return categoryId;
}
protected void setCategoryId(final long categoryId) {
this.categoryId = categoryId;
}
public String getIdentifier() {
return String.format("ID-%d", categoryId);
}
public String getUuid() {
return uuid;
}
protected void setUuid(final String uuid) {
this.uuid = uuid;
}
public String getUniqueId() {
return uniqueId;
}
protected void setUniqueId(final String uniqueId) {
this.uniqueId = uniqueId;
}
public String getName() {
return name;
}
protected void setName(final String name) {
this.name = name;
}
public String getPath() {
return path;
}
protected void setPath(final String path) {
this.path = path;
}
public long getCategoryOrder() {
return categoryOrder;
}
protected void setCategoryOrder(final long categoryOrder) {
this.categoryOrder = categoryOrder;
}
@Override
public int compareTo(final CategoryNodeModel other) {
int result = Long.compare(

View File

@ -19,7 +19,7 @@
type="String" />
<cc:attribute name="buttonText"
required="true"
shortDescription="Text for the button toggleing the modal form."
shortDescription="Text of the button toggleing the modal form."
type="String" />
<cc:attribute name="buttonTextClass"
default=""
@ -28,7 +28,7 @@
type="String" />
<cc:attribute name="dialogId"
required="true"
shortDescription="ID for the dialog."
shortDescription="ID of the dialog."
type="String" />
<cc:attribute name="method"
default="post"
@ -41,8 +41,7 @@
</cc:interface>
<cc:implementation>
<div class="#{cc.attrs.buttonTextClass}">
<button aria-labelledby="#{cc.attrs.dialogId}-title"
class="btn #{cc.attrs.buttonClass}"
<button class="btn #{cc.attrs.buttonClass}"
data-target="##{cc.attrs.dialogId}"
data-toggle="modal"
type="button">
@ -52,7 +51,9 @@
<span>#{cc.attrs.buttonText}</span>
</button>
</div>
<div class="modal fade"
<div aria-labelledby="#{cc.attrs.dialogId}-title"
aria-hidden="true"
class="modal fade"
data-backdrop="static"
id="#{cc.attrs.dialogId}"
tabindex="-1">

View File

@ -213,19 +213,24 @@
<div class="modal-header">
<c:choose>
<c:when test="#{cc.attrs.headingLevel == 1}">
<h2>#{cc.attrs.addDialogTitle}</h2>
<h2 class="modal-title"
id="#{cc.attrs.editorId}-dialog-title">#{cc.attrs.addDialogTitle}</h2>
</c:when>
<c:when test="#{cc.attrs.headingLevel == 2}">
<h3>#{cc.attrs.addDialogTitle}</h3>
<h3 class="modal-title"
id="#{cc.attrs.editorId}-dialog-title">#{cc.attrs.addDialogTitle}</h3>
</c:when>
<c:when test="#{cc.attrs.headingLevel == 3}">
<h4>#{cc.attrs.addDialogTitle}</h4>
<h4 class="modal-title"
id="#{cc.attrs.editorId}-dialog-title">#{cc.attrs.addDialogTitle}</h4>
</c:when>
<c:when test="#{cc.attrs.headingLevel == 4}">
<h5>#{cc.attrs.addDialogTitle}</h5>
<h5 class="modal-title"
id="#{cc.attrs.editorId}-dialog-title">#{cc.attrs.addDialogTitle}</h5>
</c:when>
<c:when test="#{cc.attrs.headingLevel == 5}">
<h6>#{cc.attrs.addDialogTitle}</h6>
<h6 class="modal-title"
id="#{cc.attrs.editorId}-dialog-title">#{cc.attrs.addDialogTitle}</h6>
</c:when>
<c:otherwise>
<div>#{cc.attrs.addDialogTitle}</div>

View File

@ -6,17 +6,17 @@
<ui:composition template="/WEB-INF/views/org/libreccm/ui/admin/ccm-admin.xhtml">
<ui:param name="activePage" value="categories" />
<ui:param name="title" value="#{AdminMessages['categories.label']}" />
<ui:param name="title" value="#{AdminMessages['categorymanager.label']}" />
<ui:define name="breadcrumb">
<li class="breadcrumb-item active">
#{AdminMessages['categories.label']}
#{AdminMessages['categorymanager.label']}
</li>
</ui:define>
<ui:define name="main">
<div class="container">
<h1>#{AdminMessages['categories.label']}</h1>
<h1>#{AdminMessages['categorymanager.label']}</h1>
<p>ToDo</p>
</div>
</ui:define>

View File

@ -1,25 +1,257 @@
<!DOCTYPE html>
<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:h="http://xmlns.jcp.org/jsf/html"
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/libreccm/ui/admin/ccm-admin.xhtml">
<ui:param name="activePage" value="categories" />
<ui:param name="title" value="#{AdminMessages['categories.label']}" />
<ui:param name="title" value="#{AdminMessages['categorymanager.label']}" />
<ui:define name="breadcrumb">
<li class="breadcrumb-item active">
#{AdminMessages['categorymanager.label']}
</li>
<li class="breadcrumb-item">
#{AdminMessages['categories.label']}
</li>
<li class="breadcrumb-item">
#{CategoryDetailsModel.categoryId}
</li>
</ui:define>
<ui:define name="main">
<div class="container">
<h1>#{AdminMessages['categories.label']}</h1>
<p>ToDo</p>
<h1>#{AdminMessages.getMessage('categories.details.title', [CategoryDetailsModel.path])}</h1>
<libreccm:messages messages="#{CategoryDetailsModel.messages}" />
<dl>
<div>
<dt>#{AdminMessages['categories.details.id']}</dt>
<dd>#{CategoryDetailsModel.categoryId}</dd>
</div>
<div>
<dt>#{AdminMessages['categories.details.uuid']}</dt>
<dd>#{CategoryDetailsModel.uuid}</dd>
</div>
<div>
<dt>#{AdminMessages['categories.details.uniqueId']}</dt>
<dd>#{CategoryDetailsModel.uniqueId}</dd>
</div>
<div>
<dt>#{AdminMessages['categories.details.name']}</dt>
<dd>#{CategoryDetailsModel.name}</dd>
</div>
<div>
<dt>#{AdminMessages['categories.details.enabled']}</dt>
<dd>
<c:choose>
<c:when test="#{CategoryDetailsModel.enabled}">
#{AdminMessages['categories.details.enabled.yes']}
</c:when>
<c:otherwise>
#{AdminMessages['categories.details.enabled.no']}
</c:otherwise>
</c:choose>
</dd>
</div>
<div>
<dt>#{AdminMessages['categories.details.visible']}</dt>
<dd>
<c:choose>
<c:when test="#{CategoryDetailsModel.enabled}">
#{AdminMessages['categories.details.visible.yes']}
</c:when>
<c:otherwise>
#{AdminMessages['categories.details.visible.no']}
</c:otherwise>
</c:choose>
</dd>
</div>
<div>
<dt>#{AdminMessages['categories.details.abstract_category']}</dt>
<dd>
<c:choose>
<c:when test="#{CategoryDetailsModel.enabled}">
#{AdminMessages['categories.details.abstract_category.yes']}
</c:when>
<c:otherwise>
#{AdminMessages['categories.details.abstract_category.no']}
</c:otherwise>
</c:choose>
</dd>
</div>
</dl>
<div class="mb-4">
<a class="btn btn-primary"
href="#{mvc.uri('CategoriesController#editCategory', {'categoryIdentifier': CategoryDetailsModel.identifier } )}">
<bootstrap:svgIcon icon="pen" />
<span>#{AdminMessages['categories.details.edit']}</span>
</a>
</div>
<libreccm:localizedStringEditor addMethod="CategoriesController#addTitle"
addButtonLabel="#{AdminMessages['categories.details.title.add']}"
addDialogCancelLabel="#{AdminMessages['categories.details.title.add.dialog.close']}"
addDialogLocaleSelectHelp="#{AdminMessages['categories.details.title.add.dialog.locale.help']}"
addDialogLocaleSelectLabel="#{AdminMessages['categories.details.title.add.dialog.locale.label']}"
addDialogSubmitLabel="#{AdminMessages['categories.details.title.add.dialog.submit']}"
addDialogTitle="#{AdminMessages['categories.details.title.add.dialog.title']}"
addDialogValueHelp="#{AdminMessages['categories.details.title.add.dialog.value.help']}"
addDialogValueLabel="#{AdminMessages['categories.details.title.add.dialog.value.label']}"
editButtonLabel="#{AdminMessages['categories.details.title.table.actions.edit']}"
editDialogCancelLabel="#{AdminMessages['categories.details.title.edit.dialog.close']}"
editDialogSubmitLabel="#{AdminMessages['categories.details.title.edit.dialog.submit']}"
editDialogTitle="#{AdminMessages['categories.details.title.table.actions.edit.dialog.title']}"
editDialogValueHelp="#{AdminMessages['categories.details.title.edit.dialog.value.help']}"
editDialogValueLabel="#{AdminMessages['categories.details.title.edit.dialog.value.label']}"
editMethod="CategoriesController#editTitle"
editorId="categorysystem-title"
emptyText="#{AdminMessages['categories.details.title.none']}"
hasUnusedLocales="#{CategorySystemDetailsModel.hasUnusedTitleLocales()}"
objectIdentifier="#{CategorySystemDetailsModel.identifier}"
removeButtonLabel="#{AdminMessages['categories.details.title.table.actions.remove']}"
removeDialogCancelLabel="#{AdminMessages['categories.details.title.remove.dialog.close']}"
removeDialogSubmitLabel="#{AdminMessages['categories.details.title.remove.dialog.submit']}"
removeDialogText="#{AdminMessages['categories.details.title.remove.dialog.message']}"
removeDialogTitle="#{AdminMessages['categories.details.title.table.actions.remove.dialog.title']}"
removeMethod="CategoriesController#removeTitle"
tableActionsHeading="#{AdminMessages['categories.details.title.table.headings.actions']}"
tableLocaleHeading="#{AdminMessages['categories.details.title.table.headings.locale']}"
tableValueHeading="#{AdminMessages['categories.details.title.table.headings.value']}"
title="#{AdminMessages['categories.details.title.heading']}"
unusedLocales="#{CategorySystemDetailsModel.unusedTitleLocales}"
values="#{CategorySystemDetailsModel.title}" />
<libreccm:localizedStringEditor addMethod="CategoriesController#addDescription"
addButtonLabel="#{AdminMessages['categories.details.description.add']}"
addDialogCancelLabel="#{AdminMessages['categories.details.description.add.dialog.close']}"
addDialogLocaleSelectHelp="#{AdminMessages['categories.details.description.add.dialog.locale.help']}"
addDialogLocaleSelectLabel=" #{AdminMessages['categories.details.description.add.dialog.locale.label']}"
addDialogSubmitLabel="#{AdminMessages['categories.details.description.add.dialog.submit']}"
addDialogTitle="#{AdminMessages['categories.details.description.add.dialog.title']}"
addDialogValueHelp="#{AdminMessages['categories.details.description.add.dialog.value.help']}"
addDialogValueLabel="#{AdminMessages['categories.details.description.add.dialog.value.label']}"
editButtonLabel="#{AdminMessages['categories.details.description.table.actions.edit']}"
editDialogCancelLabel="#{AdminMessages['categories.details.description.edit.dialog.close']}"
editDialogSubmitLabel="#{AdminMessages['categories.details.description.edit.dialog.submit']}"
editDialogTitle="#{AdminMessages['categories.details.description.table.actions.edit.dialog.title']}"
editDialogValueHelp="#{AdminMessages['categories.details.description.edit.dialog.value.help']}"
editDialogValueLabel="#{AdminMessages['categories.details.description.edit.dialog.value.label']}"
editMethod="CategoriesController#editDescription"
editorId="categorysystem-description"
emptyText="#{AdminMessages['categories.details.description.none']}"
hasUnusedLocales="#{CategorySystemDetailsModel.hasUnusedDescriptionLocales()}"
objectIdentifier="#{CategorySystemDetailsModel.identifier}"
removeButtonLabel="#{AdminMessages['categories.details.description.table.actions.remove']}"
removeDialogCancelLabel="#{AdminMessages['categories.details.description.remove.dialog.close']}"
removeDialogSubmitLabel="#{AdminMessages['categories.details.description.remove.dialog.submit']}"
removeDialogText="#{AdminMessages['categories.details.description.remove.dialog.message']}"
removeDialogTitle="#{AdminMessages['categories.details.description.table.actions.remove.dialog.title']}"
removeMethod="CategoriesController#removeDescription"
tableActionsHeading="#{AdminMessages['categories.details.description.table.headings.actions']}"
tableLocaleHeading="#{AdminMessages['categories.details.description.table.headings.locale']}"
tableValueHeading="#{AdminMessages['categories.details.description.table.headings.value']}"
title="#{AdminMessages['categories.details.description.heading']}"
unusedLocales="#{CategorySystemDetailsModel.unusedTitleLocales}"
useTextarea="true"
values="#{CategorySystemDetailsModel.description}" />
<h2>#{AdminMessages['categories.details.subcategories.heading']}</h2>
<div class="mb-2">
<div class="text-right">
<a class="btn btn-secondary"
href="#{mvc.uri('CategoriesController#newSubCategory', {'categoryIdentifier': CategorySystemDetailsModel.parentIdentifier})}">
<bootstrap:svgIcon icon="plus-circle" />
<span>#{AdminMessages['categories.details.subcategories.add']}</span>
</a>
</div>
</div>
<c:choose>
<c:when test="#{CategoryDetailsModel.subCategories.isEmpty()}">
<p>#{AdminMessages['categories.details.subcategories.none']}</p>
</c:when>
<c:otherwise>
<table class="table table-hover">
<thead>
<tr>
<th scope="col">
#{AdminMessages['categories.details.subcategories.table.headings.name']}
</th>
<th>
#{AdminMessages['categories.details.subcategories.table.headings.enabled']}
</th>
<th>
#{AdminMessages['categories.details.subcategories.table.headings.visible']}
</th>
<th>
#{AdminMessages['categories.details.subcategories.table.headings.abstract']}
</th>
</tr>
</thead>
<tbody>
<c:forEach items="#{CategoryDetailsModel.subCategories}"
var="category">
<tr>
<td>
<a href="#{mvc.uri('CategoriesController#getCategory', { 'categoryIdentifier': category.identifier})}">
#{category.name}
</a>
</td>
<td>
<c:choose>
<c:when test="#{category.enabled}">
#{AdminMessages['categories.details.enabled.yes']}
</c:when>
<c:otherwise>
#{AdminMessages['categories.details.enabled.no']}
</c:otherwise>
</c:choose>
</td>
<td>
<c:choose>
<c:when test="#{category.visible}">
#{AdminMessages['categories.details.visible.yes']}
</c:when>
<c:otherwise>
#{AdminMessages['categories.details.visible.no']}
</c:otherwise>
</c:choose>
</td>
<td>
<c:choose>
<c:when test="#{category.abstractCategory}">
#{AdminMessages['categories.details.abstract_category.yes']}
</c:when>
<c:otherwise>
#{AdminMessages['categories.details.abstract_category.no']}
</c:otherwise>
</c:choose>
</td>
<td>
<libreccm:deleteDialog
actionTarget="#{mvc.uri('CategoriesController#removeSubCategory', {'categoryIdentifier': category.identifier})}"
buttonText="#{AdminMeesages['categories.details.subcategories.delete']}"
buttonTextClass="text-center"
cancelLabel="#{AdminMessages['categories.details.subcategories.delete.cancel']}"
confirmLabel="#{AdminMessages['categories.details.subcategories.delete.confirm']}"
dialogId="categories-subcategories-#{category.categoryId}-delete"
dialogTitle="#{AdminMessages['categories.details.subcategories.delete.title']}"
message="#{AdminMessages.getMessage('categories.details.subcategories.delete.message', [category.path])}"
/>
</td>
</tr>
</c:forEach>
</tbody>
</c:otherwise>
</c:choose>
</div>
</ui:define>
</ui:composition>
</html>

View File

@ -7,148 +7,80 @@
<ui:composition template="/WEB-INF/views/org/libreccm/ui/admin/ccm-admin.xhtml">
<ui:param name="activePage" value="categories" />
<ui:param name="title" value="#{AdminMessages['categories.label']}" />
<ui:param name="title" value="#{AdminMessages['categorymanager.label']}" />
<ui:define name="breadcrumb">
<li class="breadcrumb-item active">
#{AdminMessages['categorymanager.label']}
</li>
<li class="breadcrumb-item">
#{AdminMessages['categories.label']}
</li>
<c:choose>
<c:when test="#{CategoryDetailsModel.new}">
<li class="breadcrumb-item active">
#{AdminMessages['categories.new.breadcrumb']}
</li>
</c:when>
<c:otherwise>
<li class="breadcrumb-item active">
#{AdminMessages.getMessage('categories.edit.breadcrumb', CategoryDetailsModel.name)}
</li>
</c:otherwise>
</c:choose>
</ui:define>
<ui:define name="main">
<div class="container">
<h1>#{AdminMessages['categories.label']}</h1>
<h1>
<c:choose>
<c:when test="#{CategoryDetailsModel.new}">
#{AdminMessage.getMessage('categories.new.label', CategoryDetailsModel.parent.path)}
</c:when>
<c:otherwise>
#{AdminMessage.getMessage('categories.edit.label', CategoryDetailsModel.path)}
</c:otherwise>
</c:choose>
#{AdminMessages['categories.label']}
</h1>
<form action="#" method="post">
<bootstrap:formGroupText help="test"
inputId="test"
label="Test"
name="test"
value="foobar bar" />
<bootstrap:formGroupNumber help="The price"
inputId="price"
label="Price"
name="price"
step="0.01"
value="10.0" />
<bootstrap:formGroupDate help="Test of date form group"
inputId="dateTest"
label="Date Test"
max="2020-11-30"
min="2020-11-02"
name="dateTest"
step="7"
value="2020-11-02" />
<bootstrap:formGroupTime help="Test of date form group"
inputId="dateTest"
label="Date Test"
max="08:00"
min="18:00"
name="dateTest"
step="900"
value="08:00" />
<bootstrap:formGroupSearch help="search test"
inputId="searchtest"
label="Search Test"
name="searchtest"
placeholder="Search" />
<bootstrap:formGroupPassword help="password test"
inputId="passwordtest"
label="Password Test"
name="passwordtest"
placeholder="Password" />
<bootstrap:formGroupEmail help="email test"
inputId="emailtest"
label="Email Test"
name="emailtest"
placeholder="foo@example.com" />
<bootstrap:formGroupTel help="Tel test"
inputId="teltest"
label="Tel Test"
name="teltest"
placeholder="00000 00000" />
<bootstrap:formGroupFile help="File test"
inputId="filetest"
label="File Test"
name="filetest" />
<bootstrap:formGroupUrl help="URL test"
inputId="urltest"
label="URL Test"
name="urltest"
placeholder="https://www.example.org/foo/bar" />
<bootstrap:formGroupColor help="Color Test"
inputId="colortest"
label="Color"
name="color" />
<bootstrap:formGroupRange help="A range"
inputId="rangetest"
label="Range"
max="20"
min="5"
name="rangetest"
step="0.1"
value="10.0" />
<bootstrap:formGroupTextarea cols="80"
help="Textarea Test"
label="Textarea"
inputId="textareatest"
name="textareatest"
rows="10" />
<bootstrap:formGroupSelect help="Select Test 1"
label="choose an option"
inputId="selecttest1"
name="selecttest1"
options="#{CategoryDetailsModel.options}" />
<bootstrap:formGroupSelect help="Select Test 2"
label="choose an option"
inputId="selecttest2"
name="selecttest2"
options="#{CategoryDetailsModel.options}"
selectedOptions="#{CategoryDetailsModel.selectedOptions}"
size="3" />
<bootstrap:formGroupSelect help="Select Test 2"
label="choose an option"
inputId="selecttest2"
multiple="true"
name="selecttest2"
options="#{CategoryDetailsModel.options}"
selectedOptions="#{CategoryDetailsModel.multipleSelectedOptions}"
size="3" />
<bootstrap:formCheck label="Are you sure?"
inputId="checkboxtest1"
name="checkboxtest1" />
<bootstrap:formGroupChecks help="Checkbox Test 1"
inputId="checkboxes1"
label="Checkboxes 1"
name="checkboxes1"
options="#{CategoryDetailsModel.options}" />
<bootstrap:formGroupChecks help="Checkbox Test2 "
inputId="checkboxes2"
label="Checkboxes 2"
name="checkboxes2"
selectedOptions="#{CategoryDetailsModel.selectedOptions}"
options="#{CategoryDetailsModel.options}" />
<bootstrap:formGroupChecks help="Checkbox Test 3"
inputId="checkboxes3"
label="Checkboxes 3"
name="checkboxes3"
selectedOptions="#{CategoryDetailsModel.multipleSelectedOptions}"
options="#{CategoryDetailsModel.options}" />
<bootstrap:formGroupRadio help="Radio Test 1"
inputId="radio1"
label="Radio 1"
name="radio1"
options="#{CategoryDetailsModel.options}" />
<bootstrap:formGroupRadio help="Radio Test 2 "
inputId="radios2"
label="Radio 2"
name="radio2"
selectedOption="charlie"
options="#{CategoryDetailsModel.options}" />
<form action="#{CategoryDetailsModel.new ? mvc.uri('CategoryFormController#createCategory', {'parentCategoryIdentifier', CategoryDetailsModel.parentCategory.identifier }) : mvc.uri('CategoryFormController#updateCategory', {'categoryIdentifier', CategoryDetailsModel.identifier })}"
method="post">
<bootstrap:formGroupText help="#{AdminMessages['categories.form.name.help']}"
inputId="name"
label="#{AdminMessages['categories.form.name.label']}"
name="name"
pattern="[\\w-.]*"
required="true" />
<bootstrap:formGroupText help="#{AdminMessages['categories.form.uniqueId.help']}"
inputId="uniqueId"
label="#{AdminMessages['categories.form.uniqueId.label']}"
name="uniqueId"
required="false" />
<bootstrap:formCheck label="#{AdminMessages['categories.form.enabled.label']}"
inputId="enabled"
name="enabled" />
<bootstrap:formCheck label="#{AdminMessages['categories.form.visible.label']}"
inputId="visible"
name="visible" />
<bootstrap:formCheck label="#{AdminMessages['categories.form.abstractCategory.label']}"
inputId="abstractCategory"
name="abstractCategory" />
<a class="btn btn-warning"
href="#{mvc.uri('CategorySystemsController#getCategorySystems')}">
#{AdminMessages['categories.form.buttons.cancel']}
</a>
<button class="btn btn-success" type="submit">
<c:choose>
<c:when test="#{CategorySystemDetailsModel.new}">
#{AdminMessages['categories.form.buttons.create']}
</c:when>
<c:otherwise>
#{AdminMessages['categories.form.buttons.save']}
</c:otherwise>
</c:choose>
</button>
</form>
<p>ToDo</p>
</div>
</ui:define>

View File

@ -4,22 +4,26 @@
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="categories" />
<ui:param name="title" value="#{AdminMessages['categories.label']}" />
<ui:param name="title" value="#{AdminMessages['categorymanager.label']}" />
<ui:define name="breadcrumb">
<li class="breadcrumb-item active">
#{AdminMessages['categories.label']}
#{AdminMessages['categorymanager.label']}
</li>
</ui:define>
<ui:define name="main">
<div class="container">
<h1>#{AdminMessages['categories.label']}</h1>
<p>ToDo</p>
<h1>#{AdminMessages['categories.not_found.title']}</h1>
<c:forEach items="#{CategoryDetailsModel.messages}" var="message">
<div class="alert alert-#{message.messageType}" role="alert">
#{message}
</div>
</c:forEach>
</div>
</ui:define>
</ui:composition>
</html>

View File

@ -9,12 +9,12 @@
<ui:composition template="/WEB-INF/views/org/libreccm/ui/admin/ccm-admin.xhtml">
<ui:param name="activePage" value="categories" />
<ui:param name="title" value="#{AdminMessages['categories.label']}" />
<ui:param name="title" value="#{AdminMessages['categorymanager.label']}" />
<ui:define name="breadcrumb">
<li class="breadcrumb-item">
<a href="#{mvc.uri('CategorySystemsController#getCategorySystems')}">
#{AdminMessages['categories.label']}
#{AdminMessages['categorymanager.label']}
</a>
</li>
<li class="breadcrumb-item active">
@ -308,8 +308,7 @@
<div class="mb-2">
<div class="text-right">
<a class="btn btn-secondary"
href="#{mvc.uri('CategoriesController#newSubCategory', {'categoryIdentifier': CategorySystemDetailsModel.rootIdentifier})}"
type="button">
href="#{mvc.uri('CategoriesController#newSubCategory', {'categoryIdentifier': CategorySystemDetailsModel.rootIdentifier})}">
<bootstrap:svgIcon icon="plus-circle" />
<span>#{AdminMessages['categorysystems.details.categories.add']}</span>
</a>
@ -378,15 +377,17 @@
</c:otherwise>
</c:choose>
</td>
<td class="text-center">
<button class="btn btn-danger"
data-target="#categorysystem-categories-#{category.uuid}-delete"
data-toggle="modal"
type="button">
<bootstrap:svgIcon icon="x-circle" />
<span>#{AdminMessages['categorysystems.details.categories.delete']}</span>
</button>
<!-- ToDo: Delete Dialog -->
<td>
<libreccm:deleteDialog
actionTarget="#{mvc.uri('CategoriesController#removeSubCategory', {'categoryIdentifier': category.identifier})}"
buttonText="#{AdminMeesages['categories.details.subcategories.delete']}"
buttonTextClass="text-center"
cancelLabel="#{AdminMessages['categories.details.subcategories.delete.cancel']}"
confirmLabel="#{AdminMessages['categories.details.subcategories.delete.confirm']}"
dialogId="categories-subcategories-#{category.categoryId}-delete"
dialogTitle="#{AdminMessages['categories.details.subcategories.delete.title']}"
message="#{AdminMessages.getMessage('categories.details.subcategories.delete.message', [category.path])}"
/>
</td>
</tr>
</c:forEach>

View File

@ -6,13 +6,13 @@
<ui:composition template="/WEB-INF/views/org/libreccm/ui/admin/ccm-admin.xhtml">
<ui:param name="activePage" value="categories" />
<ui:param name="title" value="#{AdminMessages['categories.label']}" />
<ui:param name="title" value="#{AdminMessages['categorymanager.label']}" />
<ui:define name="breadcrumb">
<li class="breadcrumb-item active">
#{AdminMessages['categories.label']}
#{AdminMessages['categorymanager.label']}
</li>
<li class="breadcrumb-item active">
<li class="breadcrumb-item">
<a href="#{mvc.uri('CategorySystemsController#getCategorySystems')}">
#{AdminMessages['categorysystems.label']}
</a>
@ -29,7 +29,6 @@
</li>
</c:otherwise>
</c:choose>
</ui:define>
<ui:define name="main">

View File

@ -6,11 +6,11 @@
<ui:composition template="/WEB-INF/views/org/libreccm/ui/admin/ccm-admin.xhtml">
<ui:param name="activePage" value="categories" />
<ui:param name="title" value="#{AdminMessages['categories.label']}" />
<ui:param name="title" value="#{AdminMessages['categorymanager.label']}" />
<ui:define name="breadcrumb">
<li class="breadcrumb-item active">
#{AdminMessages['categories.label']}
#{AdminMessages['categorymanager.label']}
</li>
</ui:define>

View File

@ -7,14 +7,14 @@
<ui:composition template="/WEB-INF/views/org/libreccm/ui/admin/ccm-admin.xhtml">
<ui:param name="activePage" value="categories" />
<ui:param name="title" value="#{AdminMessages['categories.label']}" />
<ui:param name="title" value="#{AdminMessages['categorymanager.label']}" />
<ui:define name="breadcrumb">
<li class="breadcrumb-item active">
#{AdminMessages['categories.label']}
#{AdminMessages['categorymanager.label']}
</li>
<li class="breadcrumb-item active">
#{AdminMessages['categories.label']}
#{AdminMessages['categorymanager.label']}
</li>
<li class="breadcrumb-item active">
#{AdminMessages['categorysystems.label']}

View File

@ -3,7 +3,7 @@ systeminformation.label=System Information
applications.label=Applications
applications.description=Manage application instances
imexport.label=Import/Export
categories.label=Categories Manager
categorymanager.label=Categories Manager
categories.description=Manage categories
configuration.label=Configuration
configuration.description=Manage configuration settings
@ -358,3 +358,42 @@ categorysystems.details.categories.table.headings.visible.false=No
categorysystems.details.categories.table.headings.abstract.true=Yes
categorysystems.details.categories.table.headings.abstract.false=No
categorysystems.details.categories.delete=Delete
categories.label=Categories
categories.new.label=Create new subcategory of category {0}
categories.edit.label=Edit category {0}
categories.new.breadcrumb=Create new category
categories.edit.breadcrumb=Edit category {0}
categories.form.uniqueId.help=Unique ID of the new category. Should be unique for the complete category system
categories.form.uniqueId.label=Unique ID
categories.form.name.help=Name of the category. May only contain the letters, numbers and hypens.
categories.form.name.label=Name
categories.form.enabled.label=Enabled?
categories.form.visible.label=Visible?
categories.form.abstractCategory.label=Abstract Category?
categories.form.buttons.create=Create new category
categories.form.buttons.save=Save
categories.form.buttons.cancel=Cancel
categories.not_found.title=Category not found
categories.details.title=Details of category {0}
categories.details.edit=Edit
categories.details.enabled.yes=Yes
categories.details.enabled.no=No
categories.details.visible.yes=Yes
categories.details.visible.no=No
categories.details.abstract_category.yes=Yes
categories.details.abstract_category.no=No
categories.details.enabled=Enabled?
categories.details.visible=Visible?
categories.details.abstract_category=Abstract Category?
categories.details.subcategories.heading=Subcategories
categories.details.subcategories.add=Add new subcategory
categories.details.subcategories.none=This category has no subcategories
categories.details.subcategories.table.headings.name=Name
categories.details.subcategories.table.headings.enabled=Enabled?
categories.details.subcategories.table.headings.visible=Visible?
categories.details.subcategories.table.headings.abstract=Abstract?
categories.details.subcategories.delete=Delete
categories.details.subcategories.delete.cancel=Cancel
categories.details.subcategories.delete.confirm=Delete category
categories.details.subcategories.delete.title=Delete category?
categories.details.subcategories.delete.message=Are you sure to delete category {0}?

View File

@ -3,7 +3,7 @@ systeminformation.label=System Informationen
applications.label=Anwendungen
applications.description=Verwalten der Anwendungsinstanzen
imexport.label=Import/Export
categories.label=Kategorienmanager
categorymanager.label=Kategorienmanager
categories.description=Verwaltung der Kategorien
configuration.label=Konfiguration
configuration.description=Bearbeiten der Konfiguration
@ -358,3 +358,42 @@ categorysystems.details.categories.table.headings.visible.false=Nein
categorysystems.details.categories.table.headings.abstract.true=Ja
categorysystems.details.categories.table.headings.abstract.false=Nein
categorysystems.details.categories.delete=L\u00f6schen
categories.label=Kategorien
categories.new.label=Neue Unterkategorie f\u00fcr Kategorie {0} erstellen
categories.edit.label=Kategorie {0} bearbeiten
categories.new.breadcrumb=Neue Kategorie anlegen
categories.edit.breadcrumb=Kategorie {0} bearbeiten
categories.form.uniqueId.help=Eindeutige ID der Kategorie. Sollte innerhalb des gesamten Kategoriensystems eindeutig sein.
categories.form.uniqueId.label=Eindeutige ID
categories.form.name.help=Name der Kategorie. Darf nur Buchstaben, Zahlen und den Bindestrich enthalten.
categories.form.name.label=Name
categories.form.enabled.label=Aktiv?
categories.form.visible.label=Sichtbar?
categories.form.abstractCategory.label=Abstrakte Kategorie?
categories.form.buttons.create=Neue Kategorie anlegen
categories.form.buttons.save=Speichern
categories.form.buttons.cancel=Abbrechen
categories.not_found.title=Kategorie nicht gefunden
categories.details.title=Details Kategorie {0}
categories.details.edit=Bearbeiten
categories.details.enabled.yes=Ja
categories.details.enabled.no=Nein
categories.details.visible.yes=Ja
categories.details.visible.no=Nein
categories.details.abstract_category.yes=Ja
categories.details.abstract_category.no=Nein
categories.details.enabled=Aktiv?
categories.details.visible=Sichtbar?
categories.details.abstract_category=Abstrakte Kategorie?
categories.details.subcategories.heading=Subkategorien
categories.details.subcategories.add=Neue Unterkategorie erstellen
categories.details.subcategories.none=Diese Kategorie hat keine Unterkategorien
categories.details.subcategories.table.headings.name=Name
categories.details.subcategories.table.headings.enabled=Aktiv?
categories.details.subcategories.table.headings.visible=Sichtbar?
categories.details.subcategories.table.headings.abstract=Abstrakt?
categories.details.subcategories.delete=L\u00f6schen
categories.details.subcategories.delete.cancel=Abbrechen
categories.details.subcategories.delete.confirm=Kategorie l\u00f6schen
categories.details.subcategories.delete.title=Kategorie l\u00f6schen?
categories.details.subcategories.delete.message=Sind Sie sicher, dass Sie die Kategorie {0} l\u00f6schen wollen?