Repository: roller Updated Branches: refs/heads/bootstrap-ui 96a006503 -> 48e970895
Convert stylesheet edit page to Struts 2 Bootstrap and rework UI logic Project: http://git-wip-us.apache.org/repos/asf/roller/repo Commit: http://git-wip-us.apache.org/repos/asf/roller/commit/48e97089 Tree: http://git-wip-us.apache.org/repos/asf/roller/tree/48e97089 Diff: http://git-wip-us.apache.org/repos/asf/roller/diff/48e97089 Branch: refs/heads/bootstrap-ui Commit: 48e970895e06008ff6ef981adf59ea6ea916c576 Parents: 96a0065 Author: Dave Johnson <[email protected]> Authored: Sun Aug 26 10:46:47 2018 -0400 Committer: Dave Johnson <[email protected]> Committed: Sun Aug 26 10:46:47 2018 -0400 ---------------------------------------------------------------------- .../ui/struts2/editor/StylesheetEdit.java | 326 +++++++++---------- .../resources/ApplicationResources.properties | 65 ++-- app/src/main/resources/struts.xml | 1 + .../WEB-INF/jsps/editor/StylesheetEdit.jsp | 143 ++++---- .../WEB-INF/jsps/tiles/tiles-tabbedpage.jsp | 17 +- app/src/main/webapp/WEB-INF/tiles.xml | 13 +- app/src/main/webapp/roller-ui/styles/roller.css | 2 +- .../business/CustomTemplateRenditionTest.java | 4 +- .../weblogger/business/ThemeManagerTest.java | 64 ++++ 9 files changed, 357 insertions(+), 278 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/roller/blob/48e97089/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/StylesheetEdit.java ---------------------------------------------------------------------- diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/StylesheetEdit.java b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/StylesheetEdit.java index a206b05..861a152 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/StylesheetEdit.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/StylesheetEdit.java @@ -18,31 +18,27 @@ package org.apache.roller.weblogger.ui.struts2.editor; -import java.util.Date; - import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.roller.weblogger.WebloggerException; import org.apache.roller.weblogger.business.WeblogManager; +import org.apache.roller.weblogger.business.Weblogger; import org.apache.roller.weblogger.business.WebloggerFactory; +import org.apache.roller.weblogger.business.themes.SharedTheme; import org.apache.roller.weblogger.business.themes.ThemeManager; -import org.apache.roller.weblogger.pojos.CustomTemplateRendition; +import org.apache.roller.weblogger.pojos.*; import org.apache.roller.weblogger.pojos.TemplateRendition.RenditionType; -import org.apache.roller.weblogger.pojos.TemplateRendition; -import org.apache.roller.weblogger.pojos.Theme; -import org.apache.roller.weblogger.pojos.ThemeTemplate; import org.apache.roller.weblogger.pojos.ThemeTemplate.ComponentType; -import org.apache.roller.weblogger.pojos.Weblog; -import org.apache.roller.weblogger.pojos.WeblogTemplate; -import org.apache.roller.weblogger.pojos.WeblogTheme; import org.apache.roller.weblogger.ui.struts2.util.UIAction; import org.apache.roller.weblogger.util.cache.CacheManager; import org.apache.struts2.convention.annotation.AllowedMethods; +import java.util.Date; + /** * Action which handles editing for a weblog stylesheet override template. */ -// TODO: make this work @AllowedMethods({"execute","move","delete","revert"}) +// TODO: make this work @AllowedMethods({"execute","copyStylesheet","delete","revert"}) public class StylesheetEdit extends UIAction { private static final long serialVersionUID = 4657591015852311907L; @@ -56,13 +52,8 @@ public class StylesheetEdit extends UIAction { private String contentsStandard = null; private String contentsMobile = null; - private boolean sharedTheme; - - // read by JSP to determine if user just deleted his shared theme customized stylesheet - private boolean sharedStylesheetDeleted; - - // Do we have a custom stylesheet already for a shared theme - private boolean sharedThemeCustomStylesheet = false; + // if shared theme, is a stylesheet supported? + private boolean sharedThemeStylesheet = false; public StylesheetEdit() { this.actionName = "stylesheetEdit"; @@ -72,91 +63,26 @@ public class StylesheetEdit extends UIAction { @Override public void myPrepare() { - sharedTheme = !WeblogTheme.CUSTOM.equals(getActionWeblog().getEditorTheme()); - sharedStylesheetDeleted = false; - ThemeTemplate stylesheet = null; - try { - stylesheet = getActionWeblog().getTheme().getStylesheet(); - } catch (WebloggerException ex) { - log.error("Error looking up stylesheet on weblog - " - + getActionWeblog().getHandle(), ex); - } + sharedThemeStylesheet = false; + + WeblogManager weblogManager = WebloggerFactory.getWeblogger().getWeblogManager(); + ThemeManager themeManager = WebloggerFactory.getWeblogger().getThemeManager(); - if (stylesheet != null) { - log.debug("custom stylesheet path is - " + stylesheet.getLink()); + if ( isSharedTheme() ) { try { - setTemplate(WebloggerFactory.getWeblogger().getWeblogManager() - .getTemplateByLink(getActionWeblog(), stylesheet.getLink())); - - if (getTemplate() == null) { - log.debug("custom stylesheet not found, creating it"); - - // template doesn't exist yet, so create it - WeblogTemplate stylesheetTmpl = new WeblogTemplate(); - stylesheetTmpl.setWeblog(getActionWeblog()); - stylesheetTmpl.setAction(ThemeTemplate.ComponentType.STYLESHEET); - stylesheetTmpl.setName(stylesheet.getName()); - stylesheetTmpl.setDescription(stylesheet.getDescription()); - stylesheetTmpl.setLink(stylesheet.getLink()); - stylesheetTmpl.setHidden(false); - stylesheetTmpl.setNavbar(false); - stylesheetTmpl.setLastModified(new Date()); - - // create renditions for available rendition types - TemplateRendition sCode = stylesheet.getTemplateRendition(RenditionType.STANDARD); - if (sCode != null) { - CustomTemplateRendition standardRendition = new CustomTemplateRendition( - stylesheetTmpl, RenditionType.STANDARD); - standardRendition.setTemplate(sCode.getTemplate()); - standardRendition.setTemplateLanguage(sCode.getTemplateLanguage()); - WebloggerFactory.getWeblogger().getWeblogManager() - .saveTemplateRendition(standardRendition); - } - - TemplateRendition mCode = stylesheet.getTemplateRendition(RenditionType.MOBILE); - if (mCode != null) { - CustomTemplateRendition mobileRendition = new CustomTemplateRendition( - stylesheetTmpl, RenditionType.MOBILE); - mobileRendition.setTemplate(mCode.getTemplate()); - mobileRendition.setTemplateLanguage(mCode - .getTemplateLanguage()); - WebloggerFactory.getWeblogger().getWeblogManager() - .saveTemplateRendition(mobileRendition); - } - - WebloggerFactory.getWeblogger().getWeblogManager() - .saveTemplate(stylesheetTmpl); - setTemplate(stylesheetTmpl); - WebloggerFactory.getWeblogger().flush(); - - - // success message - addMessage("stylesheetEdit.create.success"); - } + SharedTheme themeName = themeManager.getTheme(getActionWeblog().getEditorTheme()); + sharedThemeStylesheet = themeName.getStylesheet() != null; - // See if we're using a shared theme with a custom stylesheet - if (!WeblogTheme.CUSTOM.equals(getActionWeblog() - .getEditorTheme()) - && getActionWeblog().getTheme().getStylesheet() != null) { - - ThemeTemplate override = WebloggerFactory - .getWeblogger() - .getWeblogManager() - .getTemplateByLink( - getActionWeblog(), - getActionWeblog().getTheme() - .getStylesheet().getLink()); - - if (override != null) { - sharedThemeCustomStylesheet = true; - } - } + ThemeTemplate themeStylesheet = themeName.getStylesheet(); + + WeblogTemplate weblogStylesheet = + weblogManager.getTemplateByLink(getActionWeblog(), themeStylesheet.getLink()); + + setTemplate( weblogStylesheet ); } catch (WebloggerException ex) { - log.error( - "Error finding/adding stylesheet template from weblog - " - + getActionWeblog().getHandle(), ex); + log.error("Error looking up shared theme name on weblog - " + getActionWeblog().getHandle(), ex); } } } @@ -165,17 +91,16 @@ public class StylesheetEdit extends UIAction { * Show stylesheet edit page. */ public String execute() { + if (template != null) { try { if (getTemplate().getTemplateRendition(RenditionType.STANDARD) != null) { - setContentsStandard(getTemplate().getTemplateRendition( - RenditionType.STANDARD).getTemplate()); + setContentsStandard(getTemplate().getTemplateRendition( RenditionType.STANDARD).getTemplate()); } else { setContentsStandard(""); } if (getTemplate().getTemplateRendition(RenditionType.MOBILE) != null) { - setContentsMobile(getTemplate().getTemplateRendition( - RenditionType.MOBILE).getTemplate()); + setContentsMobile(getTemplate().getTemplateRendition( RenditionType.MOBILE).getTemplate()); } if (log.isDebugEnabled()) { log.debug("Standard: " + getContentsStandard() + " Mobile: " @@ -188,10 +113,83 @@ public class StylesheetEdit extends UIAction { return INPUT; } + public String copyStylesheet() { + + WeblogManager weblogManager = WebloggerFactory.getWeblogger().getWeblogManager(); + ThemeManager themeManager = WebloggerFactory.getWeblogger().getThemeManager(); + + ThemeTemplate stylesheet = null; + + try { + SharedTheme themeName = themeManager.getTheme(getActionWeblog().getEditorTheme()); + stylesheet = themeName.getStylesheet(); + + } catch (WebloggerException ex) { + + } + + log.debug("custom stylesheet path is - " + stylesheet.getLink()); + try { + setTemplate( weblogManager.getTemplateByLink(getActionWeblog(), stylesheet.getLink())); + + if (getTemplate() == null) { + log.debug("custom stylesheet not found, creating it"); + + WeblogTemplate stylesheetTmpl = new WeblogTemplate(); + stylesheetTmpl.setWeblog(getActionWeblog()); + stylesheetTmpl.setAction(ComponentType.STYLESHEET); + stylesheetTmpl.setName(stylesheet.getName()); + stylesheetTmpl.setDescription(stylesheet.getDescription()); + stylesheetTmpl.setLink(stylesheet.getLink()); + stylesheetTmpl.setHidden(false); + stylesheetTmpl.setNavbar(false); + stylesheetTmpl.setLastModified(new Date()); + + // create renditions for available rendition types: standard and mobile + + TemplateRendition sCode = stylesheet.getTemplateRendition(RenditionType.STANDARD); + if (sCode != null) { + CustomTemplateRendition standardRendition = new CustomTemplateRendition( + stylesheetTmpl, RenditionType.STANDARD); + standardRendition.setTemplate(sCode.getTemplate()); + standardRendition.setTemplateLanguage(sCode.getTemplateLanguage()); + weblogManager.saveTemplateRendition(standardRendition); + } + + TemplateRendition mCode = stylesheet.getTemplateRendition(RenditionType.MOBILE); + if (mCode != null) { + CustomTemplateRendition mobileRendition = + new CustomTemplateRendition(stylesheetTmpl, RenditionType.MOBILE); + mobileRendition.setTemplate(mCode.getTemplate()); + mobileRendition.setTemplateLanguage(mCode.getTemplateLanguage()); + weblogManager.saveTemplateRendition(mobileRendition); + } + + weblogManager.saveTemplate(stylesheetTmpl); + setTemplate(stylesheetTmpl); + + WebloggerFactory.getWeblogger().flush(); + + // success message + addMessage("stylesheetEdit.create.success"); + } + + } catch (WebloggerException ex) { + log.error("Error finding/adding stylesheet template from weblog - " + + getActionWeblog().getHandle(), ex); + addError("generic.error.check.logs"); + } + + return revert(); + } + /** * Save an existing stylesheet. */ public String save() { + + WeblogManager weblogManager = WebloggerFactory.getWeblogger().getWeblogManager(); + if (!hasActionErrors()) { try { @@ -202,26 +200,21 @@ public class StylesheetEdit extends UIAction { if (stylesheet.getTemplateRendition(RenditionType.STANDARD) != null) { // if we have a template, then set it - CustomTemplateRendition tc = stylesheet - .getTemplateRendition(RenditionType.STANDARD); + CustomTemplateRendition tc = stylesheet.getTemplateRendition(RenditionType.STANDARD); tc.setTemplate(getContentsStandard()); - WebloggerFactory.getWeblogger().getWeblogManager() - .saveTemplateRendition(tc); + weblogManager.saveTemplateRendition(tc); + } else { // otherwise create it, then set it - CustomTemplateRendition tc = new CustomTemplateRendition( - stylesheet, RenditionType.STANDARD); + CustomTemplateRendition tc = new CustomTemplateRendition( stylesheet, RenditionType.STANDARD); tc.setTemplate(""); - WebloggerFactory.getWeblogger().getWeblogManager() - .saveTemplateRendition(tc); + weblogManager.saveTemplateRendition(tc); } if (stylesheet.getTemplateRendition(RenditionType.MOBILE) != null) { - CustomTemplateRendition tc = stylesheet - .getTemplateRendition(RenditionType.MOBILE); + CustomTemplateRendition tc = stylesheet.getTemplateRendition(RenditionType.MOBILE); tc.setTemplate(getContentsMobile()); - WebloggerFactory.getWeblogger().getWeblogManager() - .saveTemplateRendition(tc); + weblogManager.saveTemplateRendition(tc); } // save template and flush @@ -248,53 +241,54 @@ public class StylesheetEdit extends UIAction { * Revert the stylesheet to its original state. UI provides this only for shared themes. */ public String revert() { - if (sharedTheme && !hasActionErrors()) { + + WeblogManager weblogManager = WebloggerFactory.getWeblogger().getWeblogManager(); + + if (isSharedTheme() && !hasActionErrors()) { try { WeblogTemplate stylesheet = getTemplate(); // lookup the theme used by this weblog - ThemeManager tmgr = WebloggerFactory.getWeblogger() - .getThemeManager(); + ThemeManager tmgr = WebloggerFactory.getWeblogger() .getThemeManager(); Theme theme = tmgr.getTheme(getActionWeblog().getEditorTheme()); stylesheet.setLastModified(new Date()); if (stylesheet.getTemplateRendition(RenditionType.STANDARD) != null) { - TemplateRendition templateCode = theme.getStylesheet() - .getTemplateRendition(RenditionType.STANDARD); + + TemplateRendition templateCode = + theme.getStylesheet().getTemplateRendition(RenditionType.STANDARD); + // if we have a template, then set it - CustomTemplateRendition existingTemplateCode = stylesheet - .getTemplateRendition(RenditionType.STANDARD); - existingTemplateCode - .setTemplate(templateCode.getTemplate()); - WebloggerFactory.getWeblogger().getWeblogManager() - .saveTemplateRendition(existingTemplateCode); + CustomTemplateRendition existingTemplateCode = + stylesheet.getTemplateRendition(RenditionType.STANDARD); + + existingTemplateCode.setTemplate(templateCode.getTemplate()); + weblogManager.saveTemplateRendition(existingTemplateCode); } if (stylesheet.getTemplateRendition(RenditionType.MOBILE) != null) { - TemplateRendition templateCode = theme.getStylesheet() - .getTemplateRendition(RenditionType.MOBILE); - CustomTemplateRendition existingTemplateCode = stylesheet - .getTemplateRendition(RenditionType.MOBILE); - existingTemplateCode - .setTemplate(templateCode.getTemplate()); + + TemplateRendition templateCode = + theme.getStylesheet().getTemplateRendition(RenditionType.MOBILE); + CustomTemplateRendition existingTemplateCode = + stylesheet.getTemplateRendition(RenditionType.MOBILE); + + existingTemplateCode.setTemplate(templateCode.getTemplate()); } // save template and flush - WebloggerFactory.getWeblogger().getWeblogManager() - .saveTemplate(stylesheet); + weblogManager.saveTemplate(stylesheet); WebloggerFactory.getWeblogger().flush(); // notify caches CacheManager.invalidate(stylesheet); // success message - addMessage("stylesheetEdit.revert.success", - stylesheet.getName()); + addMessage("stylesheetEdit.revert.success", stylesheet.getName()); } catch (WebloggerException ex) { - log.error("Error updating stylesheet template for weblog - " - + getActionWeblog().getHandle(), ex); + log.error("Error updating stylesheet template for weblog - " + getActionWeblog().getHandle(), ex); addError("generic.error.check.logs"); } } @@ -305,19 +299,18 @@ public class StylesheetEdit extends UIAction { * set theme to default stylesheet, ie delete it. */ public String delete() { - if (template != null && sharedTheme && !hasActionErrors()) { + if (template != null && isSharedTheme() && !hasActionErrors()) { try { // Delete template and flush - WeblogManager mgr = WebloggerFactory.getWeblogger() - .getWeblogManager(); + WeblogManager weblogManager = WebloggerFactory.getWeblogger().getWeblogManager(); // Remove template and page codes - mgr.removeTemplate(template); + weblogManager.removeTemplate(template); Weblog weblog = getActionWeblog(); // save updated weblog and flush - mgr.saveWeblog(weblog); + weblogManager.saveWeblog(weblog); // notify caches CacheManager.invalidate(template); @@ -326,15 +319,12 @@ public class StylesheetEdit extends UIAction { WebloggerFactory.getWeblogger().flush(); // success message - addMessage("stylesheetEdit.default.success", - template.getName()); + addMessage("stylesheetEdit.default.success", template.getName()); template = null; - sharedStylesheetDeleted = true; } catch (Exception e) { - log.error("Error deleting stylesheet template for weblog - " - + getActionWeblog().getHandle(), e); + log.error("Error deleting stylesheet template for weblog - " + getActionWeblog().getHandle(), e); addError("generic.error.check.logs"); } } @@ -343,7 +333,6 @@ public class StylesheetEdit extends UIAction { /** * Checks if is custom theme. - * * @return true, if is custom theme */ public boolean isCustomTheme() { @@ -351,8 +340,19 @@ public class StylesheetEdit extends UIAction { } /** + * Checks if is shared theme. + * @return true, if is shared theme + */ + public boolean isSharedTheme() { + return !isCustomTheme(); + } + + public boolean isSharedThemeStylesheet() { + return sharedThemeStylesheet; + } + + /** * Gets the template. - * * @return the template */ public WeblogTemplate getTemplate() { @@ -361,9 +361,7 @@ public class StylesheetEdit extends UIAction { /** * Sets the template. - * - * @param template - * the new template + * @param template the new template */ public void setTemplate(WeblogTemplate template) { this.template = template; @@ -371,7 +369,6 @@ public class StylesheetEdit extends UIAction { /** * Gets the contents standard. - * * @return the contents standard */ public String getContentsStandard() { @@ -380,9 +377,7 @@ public class StylesheetEdit extends UIAction { /** * Sets the contents standard. - * - * @param contents - * the new contents standard + * @param contents the new contents standard */ public void setContentsStandard(String contents) { this.contentsStandard = contents; @@ -390,7 +385,6 @@ public class StylesheetEdit extends UIAction { /** * Gets the contents mobile. - * * @return the contents mobile */ public String getContentsMobile() { @@ -399,29 +393,9 @@ public class StylesheetEdit extends UIAction { /** * Sets the contents mobile. - * - * @param contents - * the new contents mobile + * @param contents the new contents mobile */ public void setContentsMobile(String contents) { this.contentsMobile = contents; } - - /** - * Checks if using a shared theme with a custom stylesheet. - * - * @return true, if checks if shared theme and custom stylesheet - */ - public boolean isSharedThemeCustomStylesheet() { - return sharedThemeCustomStylesheet; - } - - /** - * Checks if user just deleted his custom shared stylesheet - * - * @return true, if custom shared stylesheet was deleted. - */ - public boolean isSharedStylesheetDeleted() { - return sharedStylesheetDeleted; - } } http://git-wip-us.apache.org/repos/asf/roller/blob/48e97089/app/src/main/resources/ApplicationResources.properties ---------------------------------------------------------------------- diff --git a/app/src/main/resources/ApplicationResources.properties b/app/src/main/resources/ApplicationResources.properties index 09747fd..da0e07b 100644 --- a/app/src/main/resources/ApplicationResources.properties +++ b/app/src/main/resources/ApplicationResources.properties @@ -1216,30 +1216,53 @@ statCount.weblogDayHits=Today''s hit count # ------------------------------------------------------------------ Stylesheet Editor stylesheetEdit.title=Stylesheet + stylesheetEdit.subtitle=Edit weblog custom stylesheet -stylesheetEdit.tip=This form allows you to edit the stylesheet for your theme. -stylesheetEdit.revertTip=If you run into any problems you don''t know how to \ -fix you can start over at any time by clicking the restore button. Please <b>backup</b> your stylesheet! -stylesheetEdit.revertTip1=<font color="red">If you have not customized your stylesheet here, \ -please use the <em>Shared Theme</em> default by clicking the delete stylesheet button. \ -This will ensure you are using the latest version and any changes will be picked up.</font> -stylesheetEdit.revert=Restore Stylesheet -stylesheetEdit.delete=Delete Stylesheet +stylesheetEdit.copyStylesheet=Copy Stylesheet +stylesheetEdit.copyStylesheetTip=Copy Shared Theme's stylesheet into your weblog so you can edit it. + +stylesheetEdit.standard=Standard + +stylesheetEdit.mobile=Mobile + +stylesheetEdit.tip=This form allows you to edit the customizable CSS Stylesheet for your theme. + +stylesheetEdit.youCanCustomize=\ + <p><b>You can customize!</b> \ + The theme you are using provides a customizable stylesheet. If you make changes to it \ + here you will see those changes reflected in the theme pages that include the stylesheet.</p> \ + <p>You can also choose to <b>Revert</b> your copy of the stylesheet so that it matches the default one from \ + the theme. Or you can <b>Delete</b> your copy so that this weblog will use the Shared Theme's stylesheet instead.</p> + +stylesheetEdit.sharedThemeWithStylesheet=\ + <p>The <b>Shared Theme</b> you are using provides a customizable stylesheet.</p> \ + <p>Would you like to copy that stylesheet into your weblog so you can edit it?</p> + +stylesheetEdit.sharedThemeNoStylesheetSupport=\ + <p>The <b>Shared Theme</b> you are using does not provide a customizable stylesheet.</p> \ + <p>Choose another theme if you want to be able to customize your CSS.</p> + +stylesheetEdit.customThemeNoStylesheet=\ + The <b>Custom Theme</b> you are using does not provide a customizable stylesheet, but since \ + you are using a Custom Theme, you can add any stylesheets and new templates that you wish. + +stylesheetEdit.revert=Revert +stylesheetEdit.revertTip=Reverts this weblog's copy to match the Shared Theme's default stylesheet. + +stylesheetEdit.delete=Delete +stylesheetEdit.deleteTip=Delete's this weblog's copy setup weblog to use the Shared Theme's default stylesheet. stylesheetEdit.create.success=Custom stylesheet created successfully. + stylesheetEdit.save.success=Stylesheet updated successfully. + stylesheetEdit.revert.success=Stylesheet reverted successfully. -stylesheetEdit.default.success=Stylesheet deleted successfully. Your theme is now using the Shared Theme default. -stylesheetEdit.noOverridableStylesheetAvailable=\ -The theme you''re using does not define a customizable stylesheet in its descriptor. You can choose another shared theme, or for \ - custom themes, create the stylesheet on the templates tab instead. +stylesheetEdit.default.success=Stylesheet deleted successfully. Your theme is now using the Shared Theme default. -stylesheetEdit.canRecreateStylesheetOverride=Note: clicking the stylesheet tab again will \ -recreate a custom override stylesheet from the theme default. +stylesheetEdit.confirmDelete=Are you sure you want to delete your stylesheet and use the themes default instead? -stylesheetEdit.confirmDelete=Are you sure you want to delete your stylesheet? stylesheetEdit.confirmRevert=Are you sure you want to revert your stylesheet to the theme default? # ------------------------------------------------------------------ Tabbed Menu @@ -1321,12 +1344,16 @@ themeEditor.previewDescription=Before you update your theme you can use <b>Previ themeEditor.importWarning=WARNING: Updating your custom theme <b>will overwrite</b> \ some of your existing templates. + themeEditor.importRequired=Since this is the first time using a custom theme, \ Roller will copy the templates from your existing Shared Theme so you can edit them. -themeEditor.importAndOverwriteTemplates=Import the Shared Theme selected above and overwrite existing custom theme. -themeEditor.existingTemplatesWarning=<b>This blog already has a custom theme defined so you need to make a choice</b>. \ - Do you want to switch back to using that theme, or do you want to over write that theme with the \ - Shared Theme that is selected above? + +themeEditor.importAndOverwriteTemplates=Import the Shared Theme selected above and overwrite \ + existing custom theme. + +themeEditor.existingTemplatesWarning=<b>This blog already has a custom theme defined so you need to \ + make a choice</b>. Do you want to switch back to using that theme, or do you want to over write that \ + theme with the Shared Theme currently in use? themeEditor.setTheme.success=Theme set to {0} themeEditor.setCustomTheme.success=Shared theme {0} imported into custom templates themeEditor.setCustomTheme.instructions=Use the Stylesheet and Templates tabs above to edit your custom theme. http://git-wip-us.apache.org/repos/asf/roller/blob/48e97089/app/src/main/resources/struts.xml ---------------------------------------------------------------------- diff --git a/app/src/main/resources/struts.xml b/app/src/main/resources/struts.xml index 00258b2..b96672d 100644 --- a/app/src/main/resources/struts.xml +++ b/app/src/main/resources/struts.xml @@ -282,6 +282,7 @@ <global-allowed-methods> add, cancel, + copyStylesheet, createNewDirectory, execute, delete, http://git-wip-us.apache.org/repos/asf/roller/blob/48e97089/app/src/main/webapp/WEB-INF/jsps/editor/StylesheetEdit.jsp ---------------------------------------------------------------------- diff --git a/app/src/main/webapp/WEB-INF/jsps/editor/StylesheetEdit.jsp b/app/src/main/webapp/WEB-INF/jsps/editor/StylesheetEdit.jsp index 7196d51..aa1b4b8 100644 --- a/app/src/main/webapp/WEB-INF/jsps/editor/StylesheetEdit.jsp +++ b/app/src/main/webapp/WEB-INF/jsps/editor/StylesheetEdit.jsp @@ -19,92 +19,107 @@ <p class="subtitle"><s:text name="stylesheetEdit.subtitle" /></p> -<s:if test="template == null"> - <div class="notification"> - <s:if test="sharedStylesheetDeleted"> - <%-- clicking the stylesheet tab will recreate your custom override stylesheet ... --%> - <s:text name="stylesheetEdit.canRecreateStylesheetOverride" /> - </s:if> - <s:else> - <%-- shared theme does not offer a stylesheet ... --%> - <s:text name="stylesheetEdit.noOverridableStylesheetAvailable" /> - </s:else> - </div> -</s:if> -<s:else> - <p class="pagetip"> - <s:text name="stylesheetEdit.tip" /> - <s:if test="!customTheme"> - <s:text name="stylesheetEdit.revertTip" /> - <s:if test="sharedThemeCustomStylesheet"> - <br /><br /><s:text name="stylesheetEdit.revertTip1" /> - </s:if> - </s:if> - </p> - <s:form action="stylesheetEdit!save"> +<s:if test="template != null"> + + <s:text name="stylesheetEdit.youCanCustomize" /> + + <s:form action="stylesheetEdit!save" theme="bootstrap" cssClass="form-vertical"> <s:hidden name="salt" /> <s:hidden name="weblog" /> - <%-- ================================================================== --%> <%-- Tabs for each of the two content areas: Standard and Mobile --%> + <ul id="template-code-tabs" class="nav nav-tabs" role="tablist" style="margin-bottom: 1em"> + + <li role="presentation" class="active"> + <a href="#tabStandard" aria-controls="home" role="tab" data-toggle="tab"> + <em><s:text name="stylesheetEdit.standard"/></em> + </a> + </li> - <div id="template-code-tabs"> - <ul> - <li class="selected"><a href="#tabStandard"><em>Standard</em></a></li> <s:if test="contentsMobile != null"> - <li><a href="#tabMobile"><em>Mobile</em></a></li> + <li role="presentation"> + <a href="#tabMobile" aria-controls="home" role="tab" data-toggle="tab"> + <em><s:text name="stylesheetEdit.mobile"/></em> + </a> + </li> </s:if> + </ul> - <div> - <div id="tabStandard"> + + <%-- Tab content for each of the two content areas: Standard and Mobile --%> + <div class="tab-content"> + + <div role="tabpanel" class="tab-pane active" id="tabStandard"> <s:textarea name="contentsStandard" cols="80" rows="30" cssStyle="width:100%" /> </div> + <s:if test="contentsMobile != null"> - <div id="tabMobile"> + <div role="tabpanel" class="tab-pane" id="tabMobile"> <s:textarea name="contentsMobile" cols="80" rows="30" cssStyle="width:100%" /> </div> </s:if> - </div> + </div> - <%-- ================================================================== --%> <%-- Save, Close and Resize text area buttons--%> + <s:submit value="%{getText('generic.save')}" cssClass="btn btn-success" /> - <table style="width:100%"> - <tr> - <td> - <s:submit value="%{getText('generic.save')}" /> - <s:if test="!customTheme"> - <s:submit value="%{getText('stylesheetEdit.revert')}" onclick="revertStylesheet();return false;" /> - </s:if> - <%-- Only delete if we have no custom templates ie website.customStylesheetPath=null --%> - <s:if test="sharedThemeCustomStylesheet"> - <s:submit value="%{getText('stylesheetEdit.delete')}" onclick="deleteStylesheet();return false;" /> - </s:if> - </td> - </tr> - </table> + <s:if test="!customTheme"> + <s:submit value="%{getText('stylesheetEdit.revert')}" cssClass="btn" + onclick="revertStylesheet();return false;" + tooltip="%{getText('stylesheetEdit.revertTip')}" /> + </s:if> + + <%-- Only delete if we have no custom templates ie website.customStylesheetPath=null --%> + <s:if test="sharedThemeStylesheet"> + <s:submit value="%{getText('stylesheetEdit.delete')}" cssClass="btn btn-danger" + onclick="deleteStylesheet();return false;" + tooltip="%{getText('stylesheetEdit.deleteTip')}" /> + </s:if> </s:form> - <script> - function revertStylesheet() { - if (window.confirm('<s:text name="stylesheetEdit.confirmRevert"/>')) { - document.stylesheetEdit.action = "<s:url action='stylesheetEdit!revert' />"; +</s:if> +<s:elseif test="sharedTheme"> + + <s:if test="sharedThemeStylesheet"> + + <s:text name="stylesheetEdit.sharedThemeWithStylesheet" /> + + <s:form action="stylesheetEdit!copyStylesheet" theme="bootstrap" cssClass="form-vertical"> + <s:hidden name="salt" /> + <s:hidden name="weblog" /> + <s:submit value="%{getText('stylesheetEdit.copyStylesheet')}" cssClass="btn btn-success" + tooltip="%{getText('stylesheetEdit.createStylesheetTip')}" /> + </s:form> + + </s:if> + <s:else> + <p><s:text name="stylesheetEdit.sharedThemeNoStylesheetSupport" /></p> + </s:else> + +</s:elseif> +<s:else> + <s:text name="stylesheetEdit.customThemeNoStylesheet" /> +</s:else> + +<script type="text/javascript"> + + function revertStylesheet() { + if (window.confirm('<s:text name="stylesheetEdit.confirmRevert"/>')) { + document.stylesheetEdit.action = "<s:url action='stylesheetEdit!revert' />"; + document.stylesheetEdit.submit(); + } + }; + <s:if test="%{sharedThemeStylesheet}"> + function deleteStylesheet() { + if (window.confirm('<s:text name="stylesheetEdit.confirmDelete"/>')) { + document.stylesheetEdit.action = "<s:url action='stylesheetEdit!delete' />"; document.stylesheetEdit.submit(); } }; - <s:if test="%{sharedThemeCustomStylesheet}"> - function deleteStylesheet() { - if (window.confirm('<s:text name="stylesheetEdit.confirmDelete"/>')) { - document.stylesheetEdit.action = "<s:url action='stylesheetEdit!delete' />"; - document.stylesheetEdit.submit(); - } - }; - </s:if> - $(function() { - $( "#template-code-tabs" ).tabs(); - }); - </script> -</s:else> + </s:if> + +</script> + http://git-wip-us.apache.org/repos/asf/roller/blob/48e97089/app/src/main/webapp/WEB-INF/jsps/tiles/tiles-tabbedpage.jsp ---------------------------------------------------------------------- diff --git a/app/src/main/webapp/WEB-INF/jsps/tiles/tiles-tabbedpage.jsp b/app/src/main/webapp/WEB-INF/jsps/tiles/tiles-tabbedpage.jsp index 8073292..9d8d957 100644 --- a/app/src/main/webapp/WEB-INF/jsps/tiles/tiles-tabbedpage.jsp +++ b/app/src/main/webapp/WEB-INF/jsps/tiles/tiles-tabbedpage.jsp @@ -30,7 +30,10 @@ <tiles:insertAttribute name="bannerStatus"/> +<tilesx:useAttribute name="sidebar"> + <div class="row"> + <div class="col-md-8 roller-column-left"> <div class="panel panel-default"> <div class="panel-body"> @@ -40,6 +43,7 @@ </div> </div> </div> + <div class="col-md-4 roller-column-right"> <div class="panel panel-default"> <div class="panel-body"> @@ -48,12 +52,17 @@ </s:if> </div> </div> - <div class="panel panel-default"> - <div class="panel-body"> - <tiles:insertAttribute name="sidebar"/> + + <c:if test="${sidebar == '/WEB-INF/jsps/tiles/empty.jsp'}"> + <div class="panel panel-default"> + <div class="panel-body"> + <tiles:insertAttribute name="sidebar"/> + </div> </div> - </div> + </c:if> + </div> + </div> <footer class="footer"> http://git-wip-us.apache.org/repos/asf/roller/blob/48e97089/app/src/main/webapp/WEB-INF/tiles.xml ---------------------------------------------------------------------- diff --git a/app/src/main/webapp/WEB-INF/tiles.xml b/app/src/main/webapp/WEB-INF/tiles.xml index eef1052..429954f 100644 --- a/app/src/main/webapp/WEB-INF/tiles.xml +++ b/app/src/main/webapp/WEB-INF/tiles.xml @@ -44,17 +44,6 @@ <put-attribute name="footer" value="/WEB-INF/jsps/tiles/footer.jsp" /> </definition> - <definition name=".tiles-simple-tabbedpage" template="/WEB-INF/jsps/tiles/tiles-simple-tabbedpage.jsp"> - <put-attribute name="bannerStatus" value="/WEB-INF/jsps/tiles/bannerStatus.jsp" /> - <put-attribute name="userStatus" value="/WEB-INF/jsps/tiles/userStatus.jsp" /> - <put-attribute name="head" value="/WEB-INF/jsps/tiles/head.jsp" /> - <put-attribute name="styles" value="/WEB-INF/jsps/tiles/empty.jsp" /> - <put-attribute name="menu" value="/WEB-INF/jsps/tiles/menu.jsp" /> - <put-attribute name="messages" value="/WEB-INF/jsps/tiles/messages.jsp" /> - <put-attribute name="content" value="${content}" /> - <put-attribute name="footer" value="/WEB-INF/jsps/tiles/footer.jsp" /> - </definition> - <definition name=".tiles-simplepage" template="/WEB-INF/jsps/tiles/tiles-simplepage.jsp"> <put-attribute name="banner" value="/WEB-INF/jsps/tiles/empty.jsp" /> <put-attribute name="bannerStatus" value="/WEB-INF/jsps/tiles/bannerStatus.jsp" /> @@ -358,7 +347,7 @@ <put-attribute name="styles" value="/WEB-INF/jsps/tiles/empty.jsp" /> </definition> - <definition name=".ThemeEdit" extends=".tiles-simple-tabbedpage" > + <definition name=".ThemeEdit" extends=".tiles-tabbedpage" > <put-attribute name="head" value="/WEB-INF/jsps/tiles/head.jsp" /> <put-attribute name="content" value="/WEB-INF/jsps/editor/ThemeEdit.jsp" /> </definition> http://git-wip-us.apache.org/repos/asf/roller/blob/48e97089/app/src/main/webapp/roller-ui/styles/roller.css ---------------------------------------------------------------------- diff --git a/app/src/main/webapp/roller-ui/styles/roller.css b/app/src/main/webapp/roller-ui/styles/roller.css index 319a59a..0fced51 100644 --- a/app/src/main/webapp/roller-ui/styles/roller.css +++ b/app/src/main/webapp/roller-ui/styles/roller.css @@ -306,6 +306,6 @@ div.image-controls input { } #sharedChooser, #customChooser { - height: 10em; + height: 13em; } http://git-wip-us.apache.org/repos/asf/roller/blob/48e97089/app/src/test/java/org/apache/roller/weblogger/business/CustomTemplateRenditionTest.java ---------------------------------------------------------------------- diff --git a/app/src/test/java/org/apache/roller/weblogger/business/CustomTemplateRenditionTest.java b/app/src/test/java/org/apache/roller/weblogger/business/CustomTemplateRenditionTest.java index fe76dff..ba45b24 100644 --- a/app/src/test/java/org/apache/roller/weblogger/business/CustomTemplateRenditionTest.java +++ b/app/src/test/java/org/apache/roller/weblogger/business/CustomTemplateRenditionTest.java @@ -32,8 +32,8 @@ import org.apache.roller.weblogger.pojos.User; import org.apache.roller.weblogger.pojos.Weblog; import org.apache.roller.weblogger.pojos.WeblogTemplate; -public class CustomTemplateRenditionTest extends TestCase{ - public static Log log = LogFactory.getLog(WeblogPageTest.class); +public class CustomTemplateRenditionTest extends TestCase { + public static Log log = LogFactory.getLog(CustomTemplateRenditionTest.class); User testUser = null; Weblog testWeblog = null; http://git-wip-us.apache.org/repos/asf/roller/blob/48e97089/app/src/test/java/org/apache/roller/weblogger/business/ThemeManagerTest.java ---------------------------------------------------------------------- diff --git a/app/src/test/java/org/apache/roller/weblogger/business/ThemeManagerTest.java b/app/src/test/java/org/apache/roller/weblogger/business/ThemeManagerTest.java new file mode 100644 index 0000000..e7bb9c8 --- /dev/null +++ b/app/src/test/java/org/apache/roller/weblogger/business/ThemeManagerTest.java @@ -0,0 +1,64 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. The ASF licenses this file to You + * under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. For additional information regarding + * copyright in this work, please see the NOTICE file in the top level + * directory of this distribution. + */ + +package org.apache.roller.weblogger.business; + + +import junit.framework.Test; +import junit.framework.TestCase; +import junit.framework.TestSuite; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.roller.weblogger.TestUtils; +import org.apache.roller.weblogger.business.themes.ThemeManager; +import org.apache.roller.weblogger.pojos.*; + +public class ThemeManagerTest extends TestCase { + public static Log log = LogFactory.getLog(ThemeManagerTest.class); + + public ThemeManagerTest(String name) { + super(name); + } + + public static Test suite() { + return new TestSuite(CustomTemplateRenditionTest.class); + } + + + public void setUp() throws Exception { + TestUtils.setupWeblogger(); + } + + public void tearDown() throws Exception { + } + + public void testThemeAssumptions() throws Exception { + + ThemeManager themeManager = WebloggerFactory.getWeblogger().getThemeManager(); + themeManager.initialize(); + + assertNotNull( themeManager.getTheme("basic") ); + assertNotNull( themeManager.getTheme("basic").getStylesheet() ); + assertNull( themeManager.getTheme("frontpage").getStylesheet() ); + } + +} + + + +
