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> <!DOCTYPE html>
<html> <html>
<head> <head>
<title>Default Template</title>
<link href="${themeUrl}/styles/librecms.css" rel="stylesheet" /> <link href="${themeUrl}/styles/librecms.css" rel="stylesheet" />
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Default Template</title>
</head> </head>
<body> <body>
<p>This theme works.</p> <div class="container">
<pre>${themeUrl}</pre> <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> </body>
</html> </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": "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(); return pageForCategory.get();
} else { } else {
final Page page = new Page(); final Page page = new Page();
page.setDisplayName(category.getDisplayName());
pageRepo.save(page); pageRepo.save(page);
categoryManager.addObjectToCategory(page, categoryManager.addObjectToCategory(page,
category, category,

View File

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

View File

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

View File

@ -360,6 +360,7 @@ public class PagesController {
pageDetailsModel.setCategoryPath( pageDetailsModel.setCategoryPath(
categoryManager.getCategoryPath(category) categoryManager.getCategoryPath(category)
); );
pageDetailsModel.setDisplayName(page.getDisplayName());
pageDetailsModel.setPageProperties( pageDetailsModel.setPageProperties(
page page
.getProperties() .getProperties()
@ -374,6 +375,58 @@ public class PagesController {
return "org/librecms/ui/cms/page-details.xhtml"; 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 @POST
@Path("/{pagesInstance}/{category:[\\w\\-@/]+}/@remove") @Path("/{pagesInstance}/{category:[\\w\\-@/]+}/@remove")
@AuthorizationRequired @AuthorizationRequired
@ -602,6 +655,7 @@ public class PagesController {
node.setCategoryPath(categoryManager.getCategoryPath(category)); node.setCategoryPath(categoryManager.getCategoryPath(category));
node.setCategoryName(category.getName()); node.setCategoryName(category.getName());
node.setPageAssigned(pageResult.isPresent()); node.setPageAssigned(pageResult.isPresent());
node.setDisplayName(pageResult.map(Page::getDisplayName).orElse(""));
node.setProperties( node.setProperties(
pageResult pageResult

View File

@ -49,6 +49,73 @@
</div> </div>
</c:if> </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"> <div class="text-right mb-2">
<button class="btn btn-secondary" <button class="btn btn-secondary"
data-toggle="modal" data-toggle="modal"
@ -88,7 +155,7 @@
class="form-control" class="form-control"
id="property-key" id="property-key"
name="propertyKey" name="propertyKey"
pattern="^([a-z0-9-_]*)$" pattern="^([a-zA-Z0-9-_]*)$"
required="true" required="true"
type="text" /> type="text" />
<span class="form-text text-muted" <span class="form-text text-muted"

View File

@ -72,6 +72,12 @@
<dd> <dd>
#{node.categoryPath} #{node.categoryPath}
</dd> </dd>
<dt>
#{CmsAdminMessages['pages.page.details.dialog.displayname.label']}
</dt>
<dd>
#{node.displayName}
</dd>
<dt> <dt>
#{CmsAdminMessages['pages.page.details.dialog.properties.label']} #{CmsAdminMessages['pages.page.details.dialog.properties.label']}
</dt> </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.confirm=Delete document
contentsection.documentfolder.actions.delete_item.dialog.title=Confirm deletation of 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}? 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.confirm=Dokument l\u00f6schen
contentsection.documentfolder.actions.delete_item.dialog.title=L\u00f6schen des Dokumentes best\u00e4tigen 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? 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; 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.List;
import java.util.Map; import java.util.Map;
import java.util.Objects; import java.util.Objects;
@ -41,6 +32,15 @@ import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.Response; import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriInfo; 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. * 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("contextPath", servletContext.getContextPath());
models.put("themeName", themeInfo.getName()); models.put("themeName", themeInfo.getName());
models.put("themeVersion", themeInfo.getVersion()); models.put("themeVersion", themeInfo.getVersion());
@ -156,6 +157,7 @@ public class ThemesMvc {
themeInfo.getVersion() themeInfo.getVersion()
) )
); );
models.put("view", view);
return String.format( return String.format(
"/@themes/%s/%s/%s", "/@themes/%s/%s/%s",