Category management for CMS admin

Former-commit-id: b6bf21bc6aeb054c962012ef41c911cc03c35ad2
pull/10/head
Jens Pelzetter 2021-02-18 21:33:26 +01:00
parent 32d79121a6
commit f8d7da1fde
5 changed files with 287 additions and 15 deletions

View File

@ -628,6 +628,31 @@ public class CategoriesController {
}
}
@POST
@Path("/{context}/categories/@subcategories")
@AuthorizationRequired
@Transactional(Transactional.TxType.REQUIRED)
public String addSubcategory(
@PathParam("sectionIdentifier") final String sectionIdentifier,
@PathParam("context") final String context,
@FormParam("categoryName") final String categoryName,
@FormParam("uniqueId") final String uniqueId,
@FormParam("isEnabled") final String isEnabled,
@FormParam("isVisible") final String isVisible,
@FormParam("isAbstract") final String isAbstract
) {
return addSubcategory(
sectionIdentifier,
context,
"/",
categoryName,
uniqueId,
isEnabled,
isVisible,
isAbstract
);
}
@POST
@Path("/{context}/categories/{categoryPath:(.+)?}/@subcategories")
@AuthorizationRequired
@ -650,9 +675,10 @@ public class CategoriesController {
final Category subCategory = new Category();
subCategory.setName(categoryName);
subCategory.setUniqueId(uniqueId);
subCategory.setEnabled(Objects.equals("true", isEnabled));
subCategory.setVisible(Objects.equals("true", isVisible));
subCategory.setAbstractCategory(Objects.equals("true", isAbstract));
subCategory.setEnabled(Objects.equals("on", isEnabled));
subCategory.setVisible(Objects.equals("on", isVisible));
subCategory.setAbstractCategory(Objects.equals("on", isAbstract));
categoryRepo.save(subCategory);
categoryManager.addSubCategoryToCategory(subCategory, category);
return String.format(
"redirect:/%s/categorysystems/%s/categories/%s",

View File

@ -184,15 +184,6 @@
</div>
</div>
<!--<h2>#{CmsAdminMessages.getMessage("contentsection.categorysystems.category.titles.heading", [CategorySystemModel.selectedCategory.name])}</h2>-->
<ul>
<c:forEach items="#{CategorySystemModel.selectedCategory.unusedTitleLocales}" var="locale">
<li>
<code>#{locale}</code>
</li>
</c:forEach>
</ul>
<pre>#{CategorySystemModel.selectedCategory.hasUnusedTitleLocales}</pre>
<libreccm:localizedStringEditor addMethod="#{mvc.basePath}/#{ContentSectionModel.sectionName}/categorysystems/#{CategorySystemModel.selectedCategorySystem.context}/categories#{CategorySystemModel.selectedCategory.path}/@title/add"
addButtonLabel="#{CmsAdminMessages['contentsection.categorysystems.category.titles.add.label']}"
addDialogCancelLabel="#{CmsAdminMessages['contentsection.categorysystems.category.titles.add.cancel']}"
@ -227,7 +218,6 @@
unusedLocales="#{CategorySystemModel.selectedCategory.unusedTitleLocales}"
values="#{CategorySystemModel.selectedCategory.localizedTitles}" />
<!--<h2>#{CmsAdminMessages.getMessage("contentsection.categorysystems.category.descriptions.heading", [CategorySystemModel.selectedCategory.name])}</h2>-->
<libreccm:localizedStringEditor addMethod="#{mvc.basePath}/#{ContentSectionModel.sectionName}/categorysystems/#{CategorySystemModel.selectedCategorySystem.context}/categories#{CategorySystemModel.selectedCategory.path}/@description/add"
addButtonLabel="#{CmsAdminMessages['contentsection.categorysystems.category.descriptions.add.label']}"
addDialogCancelLabel="#{CmsAdminMessages['contentsection.categorysystems.category.descriptions.add.cancel']}"
@ -263,6 +253,190 @@
useTextarea="true"
values="#{CategorySystemModel.selectedCategory.localizedDescriptions}" />
<h2 id="subcategories-section">#{CmsAdminMessages['contentsection.categorysystems.category.subcategories.heading']}</h2>
<div class="mb-2">
<div class="text-right">
<button class="btn btn-secondary"
data-target="#add-subcategory-dialog"
data-toggle="modal"
type="button">
<bootstrap:svgIcon icon="plus-circle" />
<span>#{CmsAdminMessages['contentsections.categorysystems.category.subcategories.add']}</span>
</button>
</div>
<div aria-describedby="add-subcategory-dialog-title"
aria-hidden="true"
class="modal fade"
id="add-subcategory-dialog"
tabindex="-1">
<div class="modal-dialog">
<form action="#{mvc.basePath}/#{ContentSectionModel.sectionName}/categorysystems/#{CategorySystemModel.selectedCategorySystem.context}/categories#{CategorySystemModel.selectedCategory.path}/@subcategories"
class="modal-content"
method="post">
<div class="modal-header">
<h3 class="modal-title"
id="add-subcategory-dialog-title">
#{CmsAdminMessages['contentsections.categorysystems.category.subcategories.add.title']}
</h3>
<button aria-label="#{CmsAdminMessages['contentsections.categorysystems.category.subcategories.add.close']}"
class="close"
data-dismiss="modal"
type="button" >
<span aria-hidden="true">&times;</span>
</button>
</div>
<div class="modal-body">
<bootstrap:formGroupText help="#{CmsAdminMessages['contentsections.categorysystems.category.subcategories.add.name.help']}"
inputId="name"
label="#{CmsAdminMessages['contentsections.categorysystems.category.subcategories.add.name.label']}"
name="categoryName"
pattern="[\\w-.]*"
required="true" />
<bootstrap:formGroupText help="#{CmsAdminMessages['contentsections.categorysystems.category.subcategories.add.uniqueId.help']}"
inputId="uniqueId"
label="#{CmsAdminMessages['contentsections.categorysystems.category.subcategories.add.label']}"
name="uniqueId"
required="false" />
<bootstrap:formCheck label="#{CmsAdminMessages['contentsections.categorysystems.category.subcategories.add.enabled.label']}"
inputId="enabled"
name="isEnabled" />
<bootstrap:formCheck label="#{CmsAdminMessages['contentsections.categorysystems.category.subcategories.add.visible.label']}"
inputId="visible"
name="isVisible" />
<bootstrap:formCheck label="#{CmsAdminMessages['contentsections.categorysystems.category.subcategories.add.abstractCategory.label']}"
inputId="abstractCategory"
name="isAbstract" />
</div>
<div class="modal-footer">
<button class="btn btn-warning"
data-dismiss="modal"
type="button">
#{CmsAdminMessages['contentsections.categorysystems.category.subcategories.add.close']}
</button>
<button class="btn btn-success"
type="submit">
#{CmsAdminMessages['contentsections.categorysystems.category.subcategories.add.submit']}
</button>
</div>
</form>
</div>
</div>
</div>
<c:choose>
<c:when test="#{CategorySystemModel.selectedCategory.subCategories.isEmpty()}">
<p>
#{CmsAdminMessages['contentsections.categorysystems.category.subcategories.none']}
</p>
</c:when>
<c:otherwise>
<table class="table table-hover contentsections categories-table">
<thead>
<tr>
<th scope="col">
#{CmsAdminMessages['contentsections.categorysystems.category.subcategories.name']}
</th>
<th scope="col">
#{CmsAdminMessages['contentsections.categorysystems.category.subcategories.enabled']}
</th>
<th>
#{CmsAdminMessages['contentsections.categorysystems.category.subcategories.visible']}
</th>
<th>
#{CmsAdminMessages['contentsections.categorysystems.category.subcategories..abstract']}
</th>
<th class="actions-col text-center"
colspan="3">
#{CmsAdminMessages['contentsections.categorysystems.category.subcategories.actions']}
</th>
</tr>
</thead>
<tbody>
<c:forEach items="#{CategorySystemModel.selectedCategory.subCategories}"
var="category">
<tr>
<td>
<a href="#{mvc.basePath}/#{ContentSectionModel.sectionName}/categorysystems/#{CategorySystemModel.selectedCategorySystem.context}/categories#{category.path}">
#{category.name}
</a>
</td>
<td>
<c:choose>
<c:when test="#{category.enabled}">
#{CmsAdminMessages['contentsections.categorysystems.category.subcategories.enabled.yes']}
</c:when>
<c:otherwise>
#{CmsAdminMessages['contentsections.categorysystems.category.subcategories.enabled.no']}
</c:otherwise>
</c:choose>
</td>
<td>
<c:choose>
<c:when test="#{category.visible}">
#{CmsAdminMessages['contentsections.categorysystems.category.subcategories.visible.yes']}
</c:when>
<c:otherwise>
#{CmsAdminMessages['contentsections.categorysystems.category.subcategories.visible.no']}
</c:otherwise>
</c:choose>
</td>
<td>
<c:choose>
<c:when test="#{category.abstractCategory}">
#{CmsAdminMessages['contentsections.categorysystems.category.subcategories.abstract.yes']}
</c:when>
<c:otherwise>
#{CmsAdminMessages['contentsections.categorysystems.category.subcategories.abstract.no']}
</c:otherwise>
</c:choose>
</td>
<td class="actions-order-col">
<c:if test="#{category.categoryOrder != 1}">
<form action="#{mvc.basePath}/#{ContentSectionModel.sectionName}/categorysystems/#{CategorySystemModel.selectedCategorySystem.context}/categories#{category.path}/@order"
method="post">
<input name="direction"
value="DECREASE"
type="hidden" />
<button class="btn btn-info"
type="submit">
<bootstrap:svgIcon icon="caret-up-fill" />
<span class="sr-only">#{CmsAdminMessages['contentsections.categorysystems.category.subcategories.reorder.decrease']}</span>
</button>
</form>
</c:if>
</td>
<td class="actions-order-col">
<c:if test="#{category.categoryOrder lt (CategorySystemModel.selectedCategory.subCategories.size())}">
<form action="#{mvc.basePath}/#{ContentSectionModel.sectionName}/categorysystems/#{CategorySystemModel.selectedCategorySystem.context}/categories#{category.path}/@order"
method="post">
<input name="direction"
value="INCREASE"
type="hidden" />
<button class="btn btn-info"
type="submit">
<bootstrap:svgIcon icon="caret-down-fill" />
<span class="sr-only">#{CmsAdminMessages['contentsections.categorysystems.category.subcategories.reorder.increase']}</span>
</button>
</form>
</c:if>
</td>
<td class="actions-delete-col">
<libreccm:deleteDialog
actionTarget="#{mvc.basePath}/#{ContentSectionModel.sectionName}/categorysystems/#{CategorySystemModel.selectedCategorySystem.context}/categories#{category.path}/@delete"
buttonText="#{CmsAdminMessages['contentsections.categorysystems.category.subcategories.delete']}"
buttonTextClass="text-center"
cancelLabel="#{CmsAdminMessages['contentsections.categorysystems.category.subcategories.delete.cancel']}"
confirmLabel="#{CmsAdminMessages['contentsections.categorysystems.category.subcategories.delete.confirm']}"
dialogId="categories-subcategories-#{category.categoryId}-delete"
dialogTitle="#{CmsAdminMessages['contentsections.categorysystems.category.subcategories.delete.title']}"
message="#{CmsAdminMessages.getMessage('contentsections.categorysystems.category.subcategories.delete.message', [category.path])}"
/>
</td>
</tr>
</c:forEach>
</tbody>
</table>
</c:otherwise>
</c:choose>
</div>
</div>
</div>

View File

@ -171,7 +171,7 @@ contentsecton.categorysystems.category.properties.edit.dialog.cancel=Cancel
contentsecton.categorysystems.category.properties.edit.dialog.save=Save
contentsecton.categorysystems.category.properties.edit.dialog.name.help=Name of the category. May only contain the letters, numbers and hypens.
contentsecton.categorysystems.category.properties.edit.dialog.name.label=Name
contentsecton.categorysystems.category.properties.edit.dialog.unique_id.help=Unique ID of the new category. Should be unique for the complete category system
contentsecton.categorysystems.category.properties.edit.dialog.unique_id.help=Unique ID of the category. Should be unique for the complete category system
contentsecton.categorysystems.category.properties.edit.dialog.unique_id.label=Unique ID
contentsecton.categorysystems.category.properties.edit.dialog.enabled.label=Enabled
contentsecton.categorysystems.category.properties.edit.dialog.visible.label=Visible?
@ -231,3 +231,34 @@ contentsection.categorysystems.category.descriptions.add.add.title=Add localized
contentsection.categorysystems.category.titles.value.heading=Localized title
contentsection.categorysystems.category.descriptions.value.heading=Localized description
contentsection.categorysystems.category.descriptions.title=Localized Descriptions
contentsection.categorysystems.category.subcategories.heading=Subcategories
contentsections.categorysystems.category.subcategories.add=Add subcategory
contentsections.categorysystems.category.subcategories.none=No subcategories
contentsections.categorysystems.category.subcategories.name=Name
contentsections.categorysystems.category.subcategories.enabled=Enabled?
contentsections.categorysystems.category.subcategories.visible=Visible?
contentsections.categorysystems.category.subcategories..abstract=Abstract?
contentsections.categorysystems.category.subcategories.actions=Actions
contentsections.categorysystems.category.subcategories.enabled.yes=Yes
contentsections.categorysystems.category.subcategories.enabled.no=No
contentsections.categorysystems.category.subcategories.visible.yes=Yes
contentsections.categorysystems.category.subcategories.visible.no=No
contentsections.categorysystems.category.subcategories.abstract.yes=Yes
contentsections.categorysystems.category.subcategories.abstract.no=No
contentsections.categorysystems.category.subcategories.reorder.decrease=Up
contentsections.categorysystems.category.subcategories.reorder.increase=Down
contentsections.categorysystems.category.subcategories.delete=Delete
contentsections.categorysystems.category.subcategories.delete.cancel=Cancel
contentsections.categorysystems.category.subcategories.delete.confirm=Delete category
contentsections.categorysystems.category.subcategories.delete.title=Confirm category deletion
contentsections.categorysystems.category.subcategories.delete.message=Are you sure to delete category {0}?
contentsections.categorysystems.category.subcategories.add.title=Add subcategory
contentsections.categorysystems.category.subcategories.add.close=Cancel
contentsections.categorysystems.category.subcategories.add.submit=Create new subcategory
contentsections.categorysystems.category.subcategories.add.name.help=Name of the new subcategory. May only contain the letters, numbers and hypens.
contentsections.categorysystems.category.subcategories.add.name.label=Name
contentsections.categorysystems.category.subcategories.add.uniqueId.help=Unique ID of the new subcategory. Should be unique for the complete category system
contentsections.categorysystems.category.subcategories.add.label=Unique ID
contentsections.categorysystems.category.subcategories.add.enabled.label=Enabled?
contentsections.categorysystems.category.subcategories.add.visible.label=Visible?
contentsections.categorysystems.category.subcategories.add.abstractCategory.label=Abstract?

View File

@ -232,3 +232,34 @@ contentsection.categorysystems.category.descriptions.locale.description=Lokalisi
contentsection.categorysystems.category.titles.value.heading=Lokalisierter Titel
contentsection.categorysystems.category.descriptions.value.heading=Lokalisierte Beschreibung
contentsection.categorysystems.category.descriptions.title=Lokaliserte Beschreibungen
contentsection.categorysystems.category.subcategories.heading=Subkategorien
contentsections.categorysystems.category.subcategories.add=Subkategorie hinzuf\u00fcgen
contentsections.categorysystems.category.subcategories.none=Keine Subkategorien
contentsections.categorysystems.category.subcategories.name=Name
contentsections.categorysystems.category.subcategories.enabled=Aktiv?
contentsections.categorysystems.category.subcategories.visible=Sichtbar?
contentsections.categorysystems.category.subcategories..abstract=Abstrakt?
contentsections.categorysystems.category.subcategories.actions=Aktionen
contentsections.categorysystems.category.subcategories.enabled.yes=Ja
contentsections.categorysystems.category.subcategories.enabled.no=Nein
contentsections.categorysystems.category.subcategories.visible.yes=Ja
contentsections.categorysystems.category.subcategories.visible.no=Nein
contentsections.categorysystems.category.subcategories.abstract.yes=Ja
contentsections.categorysystems.category.subcategories.abstract.no=Nein
contentsections.categorysystems.category.subcategories.reorder.decrease=Hoch
contentsections.categorysystems.category.subcategories.reorder.increase=Runter
contentsections.categorysystems.category.subcategories.delete=L\u00f6schen
contentsections.categorysystems.category.subcategories.delete.cancel=Abbrechen
contentsections.categorysystems.category.subcategories.delete.confirm=Kategorie l\u00f6schen
contentsections.categorysystems.category.subcategories.delete.title=L\u00f6schen der Kategorie best\u00e4tigen
contentsections.categorysystems.category.subcategories.delete.message=Sind Sie sicher, dass Sie die Kategorie {0} l\u00f6schen wollen?
contentsections.categorysystems.category.subcategories.add.title=Subkategorie hinzuf\u00fcgen
contentsections.categorysystems.category.subcategories.add.close=Abbrechen
contentsections.categorysystems.category.subcategories.add.submit=Subkategorie anlegen
contentsections.categorysystems.category.subcategories.add.name.help=Name der neuen Unterkategorie. Darf nur Buchstaben, Zahlen und den Bindestrich enthalten.
contentsections.categorysystems.category.subcategories.add.name.label=Name
contentsections.categorysystems.category.subcategories.add.uniqueId.help=Eindeutige ID der neuen Subkategorie. Sollte innerhalb des gesamten Kategoriensystems eindeutig sein.
contentsections.categorysystems.category.subcategories.add.label=Eindeutige ID
contentsections.categorysystems.category.subcategories.add.enabled.label=Aktiv?
contentsections.categorysystems.category.subcategories.add.visible.label=Sichtbar?
contentsections.categorysystems.category.subcategories.add.abstractCategory.label=Abstrakt?

View File

@ -90,3 +90,13 @@ table.contentsections-table {
table.permissions-table td.permissions-col {
font-size: 2em;
}
table.contentsections.categories-table {
td.actions-order-col {
width: 1em;
}
td.actions-delete-col {
width: 9em;
}
}