Some fixes for themes

pull/20/head
Jens Pelzetter 2022-01-19 14:57:06 +01:00
parent 39dbe43d1d
commit ba96a3c280
12 changed files with 238 additions and 15 deletions

View File

@ -1,11 +1,21 @@
<!DOCTYPE html>
<html>
<head>
<title>Default Template</title>
<link href="${themeUrl}/styles/librecms.css" rel="stylesheet" />
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Default Template</title>
</head>
<body>
<p>This theme works.</p>
<pre>${themeUrl}</pre>
<div class="container">
<p>This theme works.</p>
<dl>
<dt>application</dt>
<dd>${application}</dd>
<dt>themeUrl</dt>
<dd>${themeUrl}</dd>
<dt>view</dt>
<dd>${view!""}</dd>
</dl>
</div>
</body>
</html>

View File

@ -0,0 +1,22 @@
<!DOCTYPE html>
<html>
<head>
<link href="${themeUrl}/styles/librecms.css" rel="stylesheet" />
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Default Template</title>
</head>
<body>
<div class="container">
<h1>Index page</h1>
<p>This theme works.</p>
<dl>
<dt>application</dt>
<dd>${application}</dd>
<dt>themeUrl</dt>
<dd>${themeUrl}</dd>
<dt>view</dt>
<dd>${view!""}</dd>
</dl>
</div>
</body>
</html>

View File

@ -55,6 +55,30 @@
]
}
}
},
"index-page": {
"description": {
"values": {
"value": [
{
"lang": "en",
"value": "Template for the index page of a site."
}
]
}
},
"name": "index-page",
"path": "templates/index-page.html.ftl",
"title": {
"values": {
"value": [
{
"lang": "en",
"value": "Index Page"
}
]
}
}
}
},
@ -62,6 +86,11 @@
"default": {
"default": "default",
"@default": "default"
},
"pages": {
"index": "index-page",
"default": "default",
"@default": "default"
}
}
}

View File

@ -101,6 +101,7 @@ public class PageManager {
return pageForCategory.get();
} else {
final Page page = new Page();
page.setDisplayName(category.getDisplayName());
pageRepo.save(page);
categoryManager.addObjectToCategory(page,
category,

View File

@ -33,6 +33,8 @@ import javax.inject.Named;
@Named("CmsPageDetailsModel")
public class PageDetailsModel {
private String displayName;
private String site;
private String categoryDomain;
@ -43,6 +45,14 @@ public class PageDetailsModel {
private List<PagePropertyModel> pageProperties;
public String getDisplayName() {
return displayName;
}
protected void setDisplayName(final String displayName) {
this.displayName = displayName;
}
public String getSite() {
return site;
}

View File

@ -20,9 +20,7 @@ package org.librecms.ui;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
*
@ -40,6 +38,8 @@ public class PageTreeNodeModel {
private boolean pageAssigned;
private String displayName;
private List<PagePropertyModel> properties;
public PageTreeNodeModel() {
@ -86,6 +86,14 @@ public class PageTreeNodeModel {
public void setPageAssigned(final boolean pageAssigned) {
this.pageAssigned = pageAssigned;
}
public String getDisplayName() {
return displayName;
}
public void setDisplayName(final String displayName) {
this.displayName = displayName;
}
public List<PagePropertyModel> getProperties() {
return Collections.unmodifiableList(properties);

View File

@ -360,6 +360,7 @@ public class PagesController {
pageDetailsModel.setCategoryPath(
categoryManager.getCategoryPath(category)
);
pageDetailsModel.setDisplayName(page.getDisplayName());
pageDetailsModel.setPageProperties(
page
.getProperties()
@ -373,6 +374,58 @@ public class PagesController {
return "org/librecms/ui/cms/page-details.xhtml";
}
@POST
@Path("/{pagesInstance}/{category:[\\w\\-@/]+}/@details")
@AuthorizationRequired
@RequiresPrivilege(CoreConstants.PRIVILEGE_ADMIN)
@Transactional(Transactional.TxType.REQUIRED)
public String updatePageDetails(
@PathParam("pagesInstance") final String pagesInstance,
@PathParam("category") final String categoryParam,
@FormParam("displayName") final String displayName
) {
final Optional<Pages> pagesResult = findPages(pagesInstance);
if (pagesResult.isEmpty()) {
return showPagesNotFound(pagesInstance);
}
final Pages pages = pagesResult.get();
initPagesDetailsModel(pages);
final Optional<Category> categoryResult;
if ("@root".equals(categoryParam)) {
categoryResult = categoryRepo.findByPath(
pages.getCategoryDomain(),
"/"
);
} else {
categoryResult = categoryRepo.findByPath(
pages.getCategoryDomain(),
categoryParam
);
}
if (categoryResult.isEmpty()) {
models.put("categoryNotFound", true);
models.put(
"categoryDomain", pages.getCategoryDomain().getDomainKey()
);
models.put("category", categoryParam);
return showPagesDetails(pagesInstance);
}
final Category category = categoryResult.get();
final Page page = pageManager.findPageForCategory(category);
page.setDisplayName(displayName);
pageRepo.save(page);
return String.format(
"redirect:/pages/%s/%s/@details",
pagesInstance,
categoryParam
);
}
@POST
@Path("/{pagesInstance}/{category:[\\w\\-@/]+}/@remove")
@ -602,6 +655,7 @@ public class PagesController {
node.setCategoryPath(categoryManager.getCategoryPath(category));
node.setCategoryName(category.getName());
node.setPageAssigned(pageResult.isPresent());
node.setDisplayName(pageResult.map(Page::getDisplayName).orElse(""));
node.setProperties(
pageResult

View File

@ -49,6 +49,73 @@
</div>
</c:if>
<p>
#{CmsAdminMessages['pages.page.details.displayname']}:
#{CmsPageDetailsModel.displayName}
<button class="btn btn-primary"
data-toggle="modal"
data-target="#edit-displayname-dialog"
type="button">
<bootstrap:svgIcon icon="pen" />
<span class="sr-only">#{CmsAdminMessages['pages.page.details.displayname.edit']}</span>
</button>
</p>
<div aria-hidden="true"
aria-describedby="edit-displayname-dialog-title"
class="modal fade"
id="edit-displayname-dialog"
tab-index="-1">
<div class="modal-dialog">
<form action="#{mvc.basePath}/pages/ID-#{CmsPagesDetailsModel.pagesId}/#{CmsPageDetailsModel.categoryPath}/@details"
class="modal-content"
method="post">
<div class="modal-header">
<h2 class="modal-title"
id="edit-displayname-dialog-title">
#{CmsAdminMessages['pages.page.details.displayname.edit']}
</h2>
<button aria-label="#{CmsAdminMessages['pages.page.details.displayname.dialog.close']}"
class="close"
data-dismiss="modal"
type="button">
<bootstrap:svgIcon icon="x-circle" />
</button>
</div>
<div class="modal-body">
<div class="form-group">
<label for="displayname">
#{CmsAdminMessages['pages.page.details.displayname.dialog.displayname.label']}
</label>
<input aria-describedby="displayname-help"
class="form-control"
id="displayname"
name="displayName"
pattern="^([a-zA-Z0-9-_]*)$"
required="true"
type="text"
value="#{CmsPageDetailsModel.displayName}" />
<span class="form-text text-muted"
id="displyname-help">
#{CmsAdminMessages['pages.page.details.displayname.dialog.displayname.help']}
</span>
</div>
</div>
<div class="modal-footer">
<button class="btn btn-danger"
data-dismiss="modal"
type="button">
#{CmsAdminMessages['pages.page.details.displayname.dialog.close']}
</button>
<button class="btn btn-success"
type="submit">
#{CmsAdminMessages['pages.page.details.displayname.dialog.submit']}
</button>
</div>
</form>
</div>
</div>
<div class="text-right mb-2">
<button class="btn btn-secondary"
data-toggle="modal"
@ -88,7 +155,7 @@
class="form-control"
id="property-key"
name="propertyKey"
pattern="^([a-z0-9-_]*)$"
pattern="^([a-zA-Z0-9-_]*)$"
required="true"
type="text" />
<span class="form-text text-muted"

View File

@ -72,6 +72,12 @@
<dd>
#{node.categoryPath}
</dd>
<dt>
#{CmsAdminMessages['pages.page.details.dialog.displayname.label']}
</dt>
<dd>
#{node.displayName}
</dd>
<dt>
#{CmsAdminMessages['pages.page.details.dialog.properties.label']}
</dt>

View File

@ -1023,3 +1023,10 @@ contentsection.documentfolder.actions.delete_item.cancel=Cancel
contentsection.documentfolder.actions.delete_item.confirm=Delete document
contentsection.documentfolder.actions.delete_item.dialog.title=Confirm deletation of document
contentsection.documentfolder.actions.delete_item.dialog.message=Are you sure to delete the document {0}/{1}?
pages.page.details.displayname=Display name (view)
pages.page.details.displayname.dialog.close=Cancel
pages.page.details.displayname.dialog.displayname.label=Display name
pages.page.details.displayname.dialog.displayname.help=The display name of the page. Also the view used by the theme for displaying the page.
pages.page.details.displayname.dialog.submit=Save
pages.page.details.displayname.edit=Edit display name
pages.page.details.dialog.displayname.label=Display name

View File

@ -1024,3 +1024,10 @@ contentsection.documentfolder.actions.delete_item.cancel=Abbrechen
contentsection.documentfolder.actions.delete_item.confirm=Dokument l\u00f6schen
contentsection.documentfolder.actions.delete_item.dialog.title=L\u00f6schen des Dokumentes best\u00e4tigen
contentsection.documentfolder.actions.delete_item.dialog.message=Sind Sie sicher, dass Sie das Dokument {0}/{1} l\u00f6schen wollen?
pages.page.details.displayname=Display name (view)
pages.page.details.displayname.dialog.close=Abbrechen
pages.page.details.displayname.dialog.displayname.label=Display name
pages.page.details.displayname.dialog.displayname.help=The display name of the page. Also the view used by the theme for displaying the page.
pages.page.details.displayname.dialog.submit=Speichern
pages.page.details.displayname.edit=Display Name bearbeiten
pages.page.details.dialog.displayname.label=Display Name

View File

@ -18,15 +18,6 @@
*/
package org.libreccm.theming.mvc;
import org.libreccm.core.CoreConstants;
import org.libreccm.sites.Site;
import org.libreccm.sites.SiteRepository;
import org.libreccm.theming.ThemeInfo;
import org.libreccm.theming.ThemeVersion;
import org.libreccm.theming.Themes;
import org.libreccm.theming.manifest.ThemeManifest;
import org.libreccm.theming.manifest.ThemeTemplate;
import java.util.List;
import java.util.Map;
import java.util.Objects;
@ -41,6 +32,15 @@ import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriInfo;
import org.libreccm.core.CoreConstants;
import org.libreccm.sites.Site;
import org.libreccm.sites.SiteRepository;
import org.libreccm.theming.ThemeInfo;
import org.libreccm.theming.ThemeVersion;
import org.libreccm.theming.Themes;
import org.libreccm.theming.manifest.ThemeManifest;
import org.libreccm.theming.manifest.ThemeTemplate;
/**
* Main integration point for MVC application with the theme system.
*
@ -144,6 +144,7 @@ public class ThemesMvc {
)
);
models.put("application", application);
models.put("contextPath", servletContext.getContextPath());
models.put("themeName", themeInfo.getName());
models.put("themeVersion", themeInfo.getVersion());
@ -156,6 +157,7 @@ public class ThemesMvc {
themeInfo.getVersion()
)
);
models.put("view", view);
return String.format(
"/@themes/%s/%s/%s",