parent
83cfd6be6c
commit
c1bcd77b03
|
|
@ -0,0 +1,54 @@
|
|||
package org.librecms.ui.contentsections;
|
||||
|
||||
import org.libreccm.security.AuthorizationRequired;
|
||||
|
||||
import java.net.URI;
|
||||
import java.net.URISyntaxException;
|
||||
|
||||
import javax.inject.Inject;
|
||||
import javax.mvc.Controller;
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import javax.transaction.Transactional;
|
||||
import javax.ws.rs.GET;
|
||||
import javax.ws.rs.Path;
|
||||
import javax.ws.rs.WebApplicationException;
|
||||
import javax.ws.rs.core.Response;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||
*/
|
||||
@Controller
|
||||
@Path("/")
|
||||
public class ContentSectionController {
|
||||
|
||||
@Inject
|
||||
private HttpServletRequest request;
|
||||
|
||||
@GET
|
||||
@Path("/")
|
||||
@AuthorizationRequired
|
||||
@Transactional(Transactional.TxType.REQUIRED)
|
||||
public Response redirectToContentSectionsList() {
|
||||
try {
|
||||
return Response
|
||||
.seeOther(
|
||||
new URI(
|
||||
request.getScheme(),
|
||||
"",
|
||||
request.getServerName(),
|
||||
request.getServerPort(),
|
||||
String.format(
|
||||
"%s/@cms/contentsections",
|
||||
request.getContextPath()
|
||||
),
|
||||
"",
|
||||
""
|
||||
)
|
||||
).build();
|
||||
} catch (URISyntaxException ex) {
|
||||
throw new WebApplicationException(ex);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -5,6 +5,8 @@
|
|||
*/
|
||||
package org.librecms.ui.contentsections;
|
||||
|
||||
import com.arsdigita.cms.ui.folder.FolderPath;
|
||||
|
||||
import org.apache.logging.log4j.LogManager;
|
||||
import org.apache.logging.log4j.Logger;
|
||||
import org.libreccm.api.Identifier;
|
||||
|
|
@ -56,6 +58,9 @@ import javax.ws.rs.QueryParam;
|
|||
|
||||
import org.librecms.ui.CmsAdminMessages;
|
||||
|
||||
import javax.ws.rs.FormParam;
|
||||
import javax.ws.rs.POST;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||
|
|
@ -65,7 +70,8 @@ import org.librecms.ui.CmsAdminMessages;
|
|||
@Path("/{sectionIdentifier}/documentfolders")
|
||||
public class DocumentFolderController {
|
||||
|
||||
private static final Logger LOGGER = LogManager.getLogger(DocumentFolderController.class
|
||||
private static final Logger LOGGER = LogManager.getLogger(
|
||||
DocumentFolderController.class
|
||||
);
|
||||
|
||||
@Inject
|
||||
|
|
@ -254,6 +260,13 @@ public class DocumentFolderController {
|
|||
System.currentTimeMillis() - rowsStart
|
||||
);
|
||||
|
||||
documentFolderModel.setPath(folderPath);
|
||||
documentFolderModel.setCanCreateSubFolders(
|
||||
permissionChecker.isPermitted(
|
||||
ItemPrivileges.CREATE_NEW, folder
|
||||
)
|
||||
);
|
||||
|
||||
return "org/librecms/ui/contentsection/documentfolder/documentfolder.xhtml";
|
||||
} else {
|
||||
models.put("sectionidentifier", sectionIdentifier);
|
||||
|
|
@ -359,6 +372,89 @@ public class DocumentFolderController {
|
|||
}
|
||||
}
|
||||
|
||||
@POST
|
||||
@Path("/")
|
||||
@AuthorizationRequired
|
||||
@Transactional(Transactional.TxType.REQUIRED)
|
||||
public String newSubFolder(
|
||||
@PathParam("sectionIdentifier") final String sectionIdentifier,
|
||||
@FormParam("folderName") final String folderName
|
||||
) {
|
||||
return newSubFolder(
|
||||
sectionIdentifier, "", folderName
|
||||
);
|
||||
}
|
||||
|
||||
@POST
|
||||
@Path("/{parentFolderPath:(.+)?}")
|
||||
@AuthorizationRequired
|
||||
@Transactional(Transactional.TxType.REQUIRED)
|
||||
public String newSubFolder(
|
||||
@PathParam("sectionIdentifier") final String sectionIdentifier,
|
||||
@PathParam("parentFolderPath") final String parentFolderPath,
|
||||
@FormParam("folderName") final String folderName
|
||||
) {
|
||||
final Identifier identifier = identifierParser.parseIdentifier(
|
||||
sectionIdentifier
|
||||
);
|
||||
final Optional<ContentSection> sectionResult;
|
||||
switch (identifier.getType()) {
|
||||
case ID:
|
||||
sectionResult = sectionRepo.findById(
|
||||
Long.parseLong(identifier.getIdentifier())
|
||||
);
|
||||
break;
|
||||
case UUID:
|
||||
sectionResult = sectionRepo.findByUuid(identifier
|
||||
.getIdentifier());
|
||||
break;
|
||||
default:
|
||||
sectionResult = sectionRepo.findByLabel(identifier
|
||||
.getIdentifier());
|
||||
break;
|
||||
}
|
||||
|
||||
if (sectionResult.isPresent()) {
|
||||
final ContentSection section = sectionResult.get();
|
||||
|
||||
final Folder parentFolder;
|
||||
if (parentFolderPath.isEmpty()) {
|
||||
parentFolder = section.getRootDocumentsFolder();
|
||||
} else {
|
||||
final Optional<Folder> parentFolderResult = folderRepo
|
||||
.findByPath(section, parentFolderPath,
|
||||
FolderType.DOCUMENTS_FOLDER);
|
||||
if (parentFolderResult.isPresent()) {
|
||||
parentFolder = parentFolderResult.get();
|
||||
} else {
|
||||
models.put("contentSection", section.getLabel());
|
||||
models.put("folderPath", parentFolderPath);
|
||||
return "org/librecms/ui/contentsection/documentfolder/documentfolder-not-found.xhtml";
|
||||
}
|
||||
}
|
||||
|
||||
if (permissionChecker.isPermitted(
|
||||
ItemPrivileges.CREATE_NEW, parentFolder
|
||||
)) {
|
||||
folderManager.createFolder(folderName, parentFolder);
|
||||
|
||||
return String.format(
|
||||
"redirect:/%s/documentfolders/%s",
|
||||
sectionIdentifier,
|
||||
parentFolderPath
|
||||
);
|
||||
} else {
|
||||
models.put("sectionidentifier", sectionIdentifier);
|
||||
models.put("folderPath", parentFolderPath);
|
||||
return "org/librecms/ui/contentsection/access-denied.xhtml";
|
||||
}
|
||||
|
||||
} else {
|
||||
models.put("sectionIdentifier", sectionIdentifier);
|
||||
return "org/librecms/ui/contentsection/contentsection-not-found.xhtml";
|
||||
}
|
||||
}
|
||||
|
||||
private List<FolderTreeNode> buildFolderTree(
|
||||
final ContentSection section, final Folder currentFolder
|
||||
) {
|
||||
|
|
|
|||
|
|
@ -31,6 +31,11 @@ public class DocumentFolderModel {
|
|||
|
||||
private List<DocumentFolderBreadcrumbModel> breadcrumbs;
|
||||
|
||||
private String path;
|
||||
|
||||
private boolean canCreateSubFolders;
|
||||
|
||||
|
||||
public long getCount() {
|
||||
return count;
|
||||
}
|
||||
|
|
@ -43,7 +48,6 @@ public class DocumentFolderModel {
|
|||
return firstResult;
|
||||
}
|
||||
|
||||
|
||||
protected void setFirstResult(final int firstResult) {
|
||||
this.firstResult = firstResult;
|
||||
}
|
||||
|
|
@ -72,7 +76,6 @@ public class DocumentFolderModel {
|
|||
this.rows = new ArrayList<>(rows);
|
||||
}
|
||||
|
||||
|
||||
public List<DocumentFolderBreadcrumbModel> getBreadcrumbs() {
|
||||
return Collections.unmodifiableList(breadcrumbs);
|
||||
}
|
||||
|
|
@ -83,4 +86,20 @@ public class DocumentFolderModel {
|
|||
this.breadcrumbs = new ArrayList<>(breadcrumbs);
|
||||
}
|
||||
|
||||
public String getPath() {
|
||||
return path;
|
||||
}
|
||||
|
||||
protected void setPath(final String path) {
|
||||
this.path = path;
|
||||
}
|
||||
|
||||
public boolean isCanCreateSubFolders() {
|
||||
return canCreateSubFolders;
|
||||
}
|
||||
|
||||
protected void setCanCreateSubFolders(final boolean canCreateSubFolders) {
|
||||
this.canCreateSubFolders = canCreateSubFolders;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@
|
|||
xmlns:cms="http://xmlns.jcp.org/jsf/composite/components/cms"
|
||||
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:composition template="/WEB-INF/views/org/librecms/ui/contentsection/contentsection.xhtml">
|
||||
|
||||
<ui:param name="activePage" value="documentFolders" />
|
||||
<ui:param name="title" value="#{CmsAdminMessages['contentsection.documentfolders.title']}" />
|
||||
|
|
@ -49,30 +49,34 @@
|
|||
<div class="row">
|
||||
<div class="col-sm-3">
|
||||
<form action="#"
|
||||
class="form-inline mb-3"
|
||||
class="mb-3"
|
||||
method="get">
|
||||
<div class="form-group">
|
||||
<label class="sr-only"
|
||||
for="documentfolders-searchbox">
|
||||
#{CmsAdminMessages['contentsection.documentfolders.searchbox.label']}
|
||||
</label>
|
||||
<div class="input-group">
|
||||
<input class="form-control"
|
||||
id="documentfolders-searchbox"
|
||||
name="term"
|
||||
type="text" />
|
||||
<div class="input-group-append">
|
||||
<button class="btn btn-primary"
|
||||
type="submit">
|
||||
<bootstrap:svgIcon icon="search" />
|
||||
<span class="sr-only">#{CmsAdminMessages['contentsection.documentfolders.searchbox.submit']}</span>
|
||||
</div>
|
||||
|
||||
<label class="sr-only"
|
||||
for="documentfolders-searchbox">
|
||||
#{CmsAdminMessages['contentsection.documentfolders.searchbox.label']}
|
||||
</label>
|
||||
<div class="input-group">
|
||||
<input class="form-control"
|
||||
id="documentfolders-searchbox"
|
||||
name="term"
|
||||
type="text" />
|
||||
<div class="input-group-append">
|
||||
<button class="btn btn-primary"
|
||||
type="submit">
|
||||
<bootstrap:svgIcon icon="search" />
|
||||
<span class="sr-only">#{CmsAdminMessages['contentsection.documentfolders.searchbox.submit']}</span>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</form>
|
||||
<nav class="documentfolder foldertree">
|
||||
<h2>
|
||||
<a href="#{mvc.basePath}/#{ContentSectionModel.sectionName}/documentfolders">
|
||||
#{CmsAdminMessages["contentsection.documentfolders.root.title"]}
|
||||
</a>
|
||||
</h2>
|
||||
<ul class="list-group">
|
||||
<c:forEach items="#{ContentSectionModel.folders}"
|
||||
var="folder">
|
||||
|
|
@ -81,56 +85,7 @@
|
|||
value="#{mvc.basePath}/#{ContentSectionModel.sectionName}/documentfolders" />
|
||||
<ui:param name="folder" value="#{folder}" />
|
||||
</ui:include>
|
||||
|
||||
<!-- <cms:folderTreeNode basePath="#{mvc.basePath}/#{ContentSectionModel.sectionName}/documentfolders"
|
||||
collapsed="#{!folder.open}"
|
||||
name="#{folder.name}"
|
||||
path="#{folder.path}"
|
||||
selected="#{folder.selected}"
|
||||
subFolders="#{folder.subFolders[index]}" />-->
|
||||
<!-- <cms:folderTreeNode basePath="#{mvc.basePath}/#{ContentSectionModel.sectionName}/documentfolders"
|
||||
folder="#{folder}" />-->
|
||||
</c:forEach>
|
||||
<!-- <li class="list-group-item">
|
||||
<a class="" href="#">Folder 1</a>
|
||||
</li>
|
||||
<li class="list-group-item">
|
||||
<div class="d-flex">
|
||||
<button class="btn btn-light p-0 subfolders-toggler"
|
||||
data-toggle="collapse"
|
||||
data-target="#folder-2-subfolders"
|
||||
aria-expanded="false"
|
||||
aria-controls="folder-2-subfolders"
|
||||
type="button">
|
||||
<bootstrap:svgIcon icon="caret-right-fill" />
|
||||
<span class="sr-only">
|
||||
#{CmsAdminMessages['contentsection.documentfolder.foldersnav.subfolders.expand']}
|
||||
</span>
|
||||
</button>
|
||||
<a class="pl-0" href="#">Folder 2</a>
|
||||
</div>
|
||||
<ul class="border-0 collapse list-group "
|
||||
id="folder-2-subfolders">
|
||||
<li class="border-0 list-group-item">
|
||||
<a class="" href="#">Folder 2-1</a>
|
||||
</li>
|
||||
<li class="border-0 list-group-item">
|
||||
<a class="" href="#">Folder 2-2</a>
|
||||
</li>
|
||||
<li class="border-0 list-group-item">
|
||||
<a class="" href="#">Folder 2-3</a>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li class="list-group-item">
|
||||
<a class="" href="#">Folder 3</a>
|
||||
</li>
|
||||
<li class="list-group-item">
|
||||
<a class="" href="#">Folder 4</a>
|
||||
</li>
|
||||
<li class="list-group-item">
|
||||
<a class="" href="#">Folder 5</a>
|
||||
</li>-->
|
||||
</ul>
|
||||
</nav>
|
||||
</div>
|
||||
|
|
@ -149,7 +104,7 @@
|
|||
<div class="input-group-append">
|
||||
<button class="btn btn-secondary"
|
||||
type="submit">
|
||||
<bootstrap:svgIcon icon="search" />
|
||||
<bootstrap:svgIcon icon="filter" />
|
||||
<span class="sr-only">#{CmsAdminMessages['contentsection.documentfolder.filter.submit']}</span>
|
||||
</button>
|
||||
</div>
|
||||
|
|
@ -159,10 +114,66 @@
|
|||
${CmsAdminMessages.getMessage("contentsection.documentfolder.pageof", [DocumentFolderModel.currentPage, DocumentFolderModel.numberOfPages])}
|
||||
</p>
|
||||
<div>
|
||||
<button class="btn btn-primary" title="#{CmsAdminMessages['contentsection.documentfolder.add_subfolder']}">
|
||||
<button class="btn btn-primary"
|
||||
data-toggle="modal"
|
||||
data-target="#new-subfolder-dialog"
|
||||
title="#{CmsAdminMessages['contentsection.documentfolder.add_subfolder']}">
|
||||
<bootstrap:svgIcon icon="folder-plus" />
|
||||
<span class="sr-only">#{CmsAdminMessages['contentsection.documentfolder.add_subfolder']}</span>
|
||||
</button>
|
||||
<div aria-hidden="true"
|
||||
aria-labelledby="new-subfolder-dialog-title"
|
||||
class="modal fade"
|
||||
id="new-subfolder-dialog"
|
||||
tabindex="-1">
|
||||
<div class="modal-dialog">
|
||||
<form action="#{mvc.basePath}/#{ContentSectionModel.sectionName}/documentfolders/#{DocumentFolderModel.path}"
|
||||
class="modal-content"
|
||||
method="post">
|
||||
<div class="modal-header">
|
||||
<h2 class="modal-title"
|
||||
id="new-subfolder-dialog-title">
|
||||
#{CmsAdminMessages['contentsection.documentfolder.new_subfolder_dialog.title']}
|
||||
</h2>
|
||||
<button aria-label="#{CmsAdminMessages['contentsection.documentfolder.new_subfolder_dialog.close']}"
|
||||
class="close"
|
||||
data-dismiss="modal"
|
||||
type="button">
|
||||
<span aria-hidden="true">×</span>
|
||||
</button>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<div class="form-group">
|
||||
<label for="new-subfolder-name">
|
||||
#{CmsAdminMessages['contentsection.documentfolder.new_subfolder.name.label']}
|
||||
</label>
|
||||
<input aria-describedby="new-subfolder-name-help"
|
||||
class="form-control"
|
||||
id="new-subfolder-name"
|
||||
name="folderName"
|
||||
pattern="^([a-zA-Z0-9-_]*)$"
|
||||
type="text"
|
||||
value="" />
|
||||
<small class="form-text text-muted"
|
||||
id="new-subfolder-name-help">
|
||||
#{CmsAdminMessages['contentsection.documentfolder.new_subfolder.name.help']}
|
||||
</small>
|
||||
</div>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button class="btn btn-danger"
|
||||
data-dismiss="modal"
|
||||
type="button">
|
||||
#{CmsAdminMessages['contentsection.documentfolder.new_subfolder_dialog.close']}
|
||||
</button>
|
||||
<button class="btn btn-success"
|
||||
type="submit">
|
||||
#{CmsAdminMessages['contentsection.documentfolder.new_subfolder_dialog.submit']}
|
||||
</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
<button class="btn btn-primary" title="#{CmsAdminMessages['contentsection.documentfolder.add_document']}">
|
||||
<bootstrap:svgIcon icon="file-earmark-plus" />
|
||||
<span class="sr-only">#{CmsAdminMessages['contentsection.documentfolder.add_document']}</span>
|
||||
|
|
|
|||
|
|
@ -44,7 +44,7 @@ contentsection.documentfolder.pagination.next_page=Next page
|
|||
contentsection.not_found=No content section identifed by {0} available.
|
||||
contentsection.accessdenied=Your are not permitted to access content section {0}.
|
||||
contentsection.documentfolder.types.folder=Folder
|
||||
contentsection.documentfolder.pageof=Page {0} of {1}.
|
||||
contentsection.documentfolder.pageof=Page {0} of {1}
|
||||
contentsection.documentfolder.add_document=Create document
|
||||
contentsection.documentfolder.add_subfolder=Add subfolder
|
||||
contentsection.documentfolder.filter.label=Filter documents
|
||||
|
|
@ -53,6 +53,12 @@ contentsections.documentfolder.not_found=Not folder with path {1} found in conte
|
|||
contentsection.not_found.title=Content Section not found
|
||||
contentsection.documentfolders.searchbox.label=Search in document folders
|
||||
contentsection.documentfolders.searchbox.submit=Search
|
||||
contentsection.assetsfolders.title=Media & Data
|
||||
contentsection.assetfolders.title=Media & Data
|
||||
contentsection.categories.title=Categories & Page Trees
|
||||
contentsection.categories.configuration=Configuration
|
||||
contentsection.configuration.title=Configuration
|
||||
contentsection.documentfolder.new_subfolder_dialog.title=Create new subfolder
|
||||
contentsection.documentfolder.new_subfolder.name.label=Name
|
||||
contentsection.documentfolder.new_subfolder.name.help=The new name of the subfolder. May only contain the letters a to z and A to Z, numbers, the dash and the underscore
|
||||
contentsection.documentfolder.new_subfolder_dialog.submit=Create new subfolder
|
||||
contentsection.documentfolder.new_subfolder_dialog.close=Cancel
|
||||
contentsection.documentfolders.root.title=Documents
|
||||
|
|
|
|||
|
|
@ -44,7 +44,7 @@ contentsection.documentfolder.pagination.next_page=Eine Seite weiter
|
|||
contentsection.not_found=Keine Content Section mit dem Identifier {0} gefunden.
|
||||
contentsection.accessdenied=Sind sind nicht berechtigt auf die Content Section {0} zuzugreifen.
|
||||
contentsection.documentfolder.types.folder=Ordner
|
||||
contentsection.documentfolder.pageof=Seite {0} von {1}.
|
||||
contentsection.documentfolder.pageof=Seite {0} von {1}
|
||||
contentsection.documentfolder.add_document=Neues Dokument erstellen
|
||||
contentsection.documentfolder.add_subfolder=Unterordner erstellen
|
||||
contentsection.documentfolder.filter.label=Dokumente filtern
|
||||
|
|
@ -53,6 +53,12 @@ contentsections.documentfolder.not_found=Es wurde kein Ordner mit dem Pfad {1} i
|
|||
contentsection.not_found.title=Content Section nicht gefunden
|
||||
contentsection.documentfolders.searchbox.label=In Dokument-Ordnern suchen
|
||||
contentsection.documentfolders.searchbox.submit=Suchen
|
||||
contentsection.assetsfolders.title=Media & Data
|
||||
contentsection.assetfolders.title=Media & Data
|
||||
contentsection.categories.title=Kategorien & Seitenb\u00e4ume
|
||||
contentsection.categories.configuration=Konfiguration
|
||||
contentsection.configuration.title=Konfiguration
|
||||
contentsection.documentfolder.new_subfolder_dialog.title=Neuen Unterordner erstellen
|
||||
contentsection.documentfolder.new_subfolder.name.label=Name
|
||||
contentsection.documentfolder.new_subfolder.name.help=Der Name des neuen Ordners. Darf nur die Buchstaben a bis z und A bis Z, Ziffern, den Bindestrich und den Unterstrich enthalten.
|
||||
contentsection.documentfolder.new_subfolder_dialog.submit=Neuen Ordner anlegen
|
||||
contentsection.documentfolder.new_subfolder_dialog.close=Abbrechen
|
||||
contentsection.documentfolders.root.title=Dokumente
|
||||
|
|
|
|||
Loading…
Reference in New Issue