Merge branch 'roller-5.2.0' into bootstrap-ui # Conflicts: # README.md # app/pom.xml # app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/BookmarkEdit.java # app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/FolderEdit.java # app/src/main/webapp/WEB-INF/jsps/admin/GlobalConfig.jsp # app/src/main/webapp/WEB-INF/jsps/core/CreateWeblog.jsp # app/src/main/webapp/WEB-INF/jsps/core/MainMenu.jsp # app/src/main/webapp/WEB-INF/jsps/editor/Bookmarks.jsp # app/src/main/webapp/WEB-INF/jsps/editor/Categories.jsp # app/src/main/webapp/WEB-INF/jsps/editor/Comments.jsp # app/src/main/webapp/WEB-INF/jsps/editor/EntryEdit.jsp # app/src/main/webapp/WEB-INF/jsps/editor/MediaFileSidebar.jsp # app/src/main/webapp/WEB-INF/jsps/taglibs-struts2.jsp # app/src/main/webapp/WEB-INF/jsps/tiles/menu.jsp
Project: http://git-wip-us.apache.org/repos/asf/roller/repo Commit: http://git-wip-us.apache.org/repos/asf/roller/commit/129af05a Tree: http://git-wip-us.apache.org/repos/asf/roller/tree/129af05a Diff: http://git-wip-us.apache.org/repos/asf/roller/diff/129af05a Branch: refs/heads/bootstrap-ui Commit: 129af05ac3db7a5cc4951bfbe650bc0cf8974f85 Parents: a175b0d 6173b33 Author: Dave Johnson <[email protected]> Authored: Sun Oct 8 13:32:48 2017 -0400 Committer: Dave Johnson <[email protected]> Committed: Sun Oct 8 13:32:48 2017 -0400 ---------------------------------------------------------------------- .gitignore | 2 +- NOTICE.txt | 2 +- README.md | 54 +++- app/pom.xml | 318 +++++++++++-------- .../weblogger/planet/ui/PlanetConfig.java | 2 + .../weblogger/planet/ui/PlanetGroups.java | 2 + .../planet/ui/PlanetSubscriptions.java | 2 + .../roller/weblogger/ui/core/RollerContext.java | 154 ++++----- .../weblogger/ui/struts2/admin/CacheInfo.java | 2 + .../struts2/admin/GlobalCommentManagement.java | 2 + .../ui/struts2/admin/GlobalConfig.java | 2 + .../ui/struts2/admin/PingTargetEdit.java | 2 + .../weblogger/ui/struts2/admin/PingTargets.java | 2 + .../weblogger/ui/struts2/admin/UserAdmin.java | 2 + .../weblogger/ui/struts2/admin/UserEdit.java | 2 + .../weblogger/ui/struts2/core/CreateWeblog.java | 2 + .../weblogger/ui/struts2/core/Install.java | 2 + .../roller/weblogger/ui/struts2/core/Login.java | 2 + .../weblogger/ui/struts2/core/MainMenu.java | 2 + .../ui/struts2/core/OAuthAuthorize.java | 2 + .../weblogger/ui/struts2/core/OAuthKeys.java | 2 + .../weblogger/ui/struts2/core/Profile.java | 2 + .../weblogger/ui/struts2/core/Register.java | 2 + .../roller/weblogger/ui/struts2/core/Setup.java | 2 + .../ui/struts2/editor/BookmarkEdit.java | 5 +- .../weblogger/ui/struts2/editor/Bookmarks.java | 2 + .../ui/struts2/editor/BookmarksImport.java | 2 + .../weblogger/ui/struts2/editor/Categories.java | 2 + .../ui/struts2/editor/CategoryEdit.java | 2 + .../ui/struts2/editor/CategoryRemove.java | 2 + .../weblogger/ui/struts2/editor/Comments.java | 2 + .../weblogger/ui/struts2/editor/Entries.java | 2 + .../struts2/editor/EntryAddWithMediaFile.java | 2 + .../weblogger/ui/struts2/editor/EntryEdit.java | 2 + .../ui/struts2/editor/EntryRemove.java | 2 + .../weblogger/ui/struts2/editor/FolderEdit.java | 4 +- .../ui/struts2/editor/Maintenance.java | 2 + .../ui/struts2/editor/MediaFileAdd.java | 2 + .../ui/struts2/editor/MediaFileEdit.java | 2 + .../struts2/editor/MediaFileImageChooser.java | 2 + .../ui/struts2/editor/MediaFileImageDim.java | 2 + .../ui/struts2/editor/MediaFileView.java | 2 + .../ui/struts2/editor/MemberResign.java | 2 + .../weblogger/ui/struts2/editor/Members.java | 2 + .../ui/struts2/editor/MembersInvite.java | 2 + .../weblogger/ui/struts2/editor/Pings.java | 2 + .../ui/struts2/editor/StylesheetEdit.java | 2 + .../ui/struts2/editor/TemplateEdit.java | 2 + .../ui/struts2/editor/TemplateRemove.java | 2 + .../weblogger/ui/struts2/editor/Templates.java | 2 + .../ui/struts2/editor/TemplatesRemove.java | 2 + .../weblogger/ui/struts2/editor/ThemeEdit.java | 2 + .../ui/struts2/editor/WeblogConfig.java | 2 + .../ui/struts2/editor/WeblogRemove.java | 2 + .../roller/weblogger/util/PasswordUtility.java | 2 +- app/src/main/resources/log4j2.xml | 32 ++ .../roller/weblogger/config/roller.properties | 2 +- .../main/resources/sql/510-to-520-migration.vm | 2 +- app/src/main/resources/struts.xml | 223 ++++++++----- .../webapp/WEB-INF/jsps/admin/CacheInfo.jsp | 4 +- .../webapp/WEB-INF/jsps/admin/GlobalConfig.jsp | 4 +- .../webapp/WEB-INF/jsps/admin/PingTargets.jsp | 2 +- .../webapp/WEB-INF/jsps/admin/PlanetConfig.jsp | 4 +- .../webapp/WEB-INF/jsps/admin/PlanetGroups.jsp | 2 +- .../WEB-INF/jsps/admin/PlanetSubscriptions.jsp | 4 +- .../webapp/WEB-INF/jsps/admin/UserAdmin.jsp | 2 +- .../main/webapp/WEB-INF/jsps/admin/UserEdit.jsp | 8 +- .../main/webapp/WEB-INF/jsps/core/MainMenu.jsp | 30 +- .../webapp/WEB-INF/jsps/editor/Bookmarks.jsp | 6 +- .../webapp/WEB-INF/jsps/editor/Categories.jsp | 8 +- .../webapp/WEB-INF/jsps/editor/Comments.jsp | 3 +- .../main/webapp/WEB-INF/jsps/editor/Entries.jsp | 2 +- .../webapp/WEB-INF/jsps/editor/EntryEdit.jsp | 2 +- .../webapp/WEB-INF/jsps/editor/EntrySidebar.jsp | 18 +- .../WEB-INF/jsps/editor/MediaFileAddSuccess.jsp | 4 +- .../WEB-INF/jsps/editor/MediaFileEdit.jsp | 23 +- .../jsps/editor/MediaFileImageChooser.jsp | 6 +- .../WEB-INF/jsps/editor/MediaFileSidebar.jsp | 2 +- .../WEB-INF/jsps/editor/MediaFileView.jsp | 4 +- .../WEB-INF/jsps/editor/MediaFileViewLight.jsp | 4 +- .../main/webapp/WEB-INF/jsps/editor/Members.jsp | 2 +- .../WEB-INF/jsps/editor/MembersSidebar.jsp | 2 +- .../main/webapp/WEB-INF/jsps/editor/Pings.jsp | 2 +- .../webapp/WEB-INF/jsps/editor/Templates.jsp | 2 +- .../WEB-INF/jsps/editor/TemplatesRemove.jsp | 2 +- .../webapp/WEB-INF/jsps/taglibs-struts2.jsp | 4 + app/src/main/webapp/WEB-INF/jsps/tiles/menu.jsp | 3 +- .../main/webapp/WEB-INF/jsps/tiles/messages.jsp | 10 +- .../WEB-INF/jsps/tiles/tiles-tabbedpage.jsp | 2 +- app/src/main/webapp/WEB-INF/web.xml | 9 +- assembly-release/pom.xml | 4 +- assembly-release/sign-release.sh | 12 +- assembly-release/src/main/assembly/standard.xml | 2 +- .../groovy/examples/rollerapi/createtestdata.gy | 34 +- .../scripting/groovy/examples/rollerapi/groovy | 14 +- .../groovy/examples/rollerapi/listusers.gy | 8 +- .../examples/rollerapi/roller-custom.properties | 8 +- docs/roller-install-guide.odt | Bin 1623069 -> 1618019 bytes docs/roller-template-guide.odt | Bin 245040 -> 238805 bytes docs/roller-user-guide.odt | Bin 2744390 -> 2740075 bytes it-selenium/pom.xml | 44 ++- .../roller/selenium/AbstractRollerPage.java | 29 +- .../roller/selenium/InitialLoginTestIT.java | 5 +- .../roller/selenium/core/CreateWeblogPage.java | 4 +- .../apache/roller/selenium/core/LoginPage.java | 4 +- .../roller/selenium/core/MainMenuPage.java | 6 +- .../roller/selenium/core/RegisterPage.java | 13 +- .../apache/roller/selenium/core/SetupPage.java | 9 +- .../roller/selenium/core/WelcomePage.java | 5 +- .../roller/selenium/editor/EntryAddPage.java | 3 +- .../roller/selenium/editor/EntryEditPage.java | 3 +- .../roller/selenium/view/BlogHomePage.java | 3 +- .../selenium/view/SingleBlogEntryPage.java | 2 +- .../test/resources/roller-jettyrun.properties | 2 +- pom.xml | 28 +- 115 files changed, 865 insertions(+), 451 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/roller/blob/129af05a/README.md ---------------------------------------------------------------------- diff --cc README.md index 97ef69e,0953102..19f2f68 --- a/README.md +++ b/README.md @@@ -1,17 -1,54 +1,69 @@@ -# Apache Roller +Rollarcus: bootstrap-ui branch +=== + +This branch __bootstrap-ui__ re-writes the Roller editor/admin user-interface (UI) using Bootstrap. + +Status +--- +The Edit-Entry and Entries pages have been converted over and you can see screen-shots of what they look like below. + +That's all +--- +Want to contribute? Shoot me a PR. + +Screen-shots +--- - You can find some screenshots of the work so far on Flickr: ++ ++You can find some screenshots of the work so far on Flickr: +[Roller UI with Bootstrap](https://www.flickr.com/photos/snoopdave/albums/72157666773620323) ++ ++ ++# A Branch of Apache Roller + + [Apache Roller](http://roller.apache.org) is a Java-based, full-featured, + multi-user and group-blog server suitable for blog sites large and small. + Roller is typically run with Apache Tomcat and MySQL. + Roller is made up of the following Maven projects: + + * _roller-project_: Top level project + * _app_: Roller Weblogger webapp, JSP pages, Velocity templates + * _assembly-release_: Used to create official distributions of Roller + * _docs_: Roller documentation in ODT format + * _it-selenium_: Integrated browser tests for Roller using Selenium + + ## Documentation + + The Roller Install, User and Template Guides are available in ODT format + (for OpenOffice or LibraOffice): + + * https://github.com/apache/roller/tree/master/docs + + ## For more information + + Hit the Roller Confluence wiki: + + * How to build and run Roller: https://cwiki.apache.org/confluence/x/EM4 + * How to contribute to Roller: https://cwiki.apache.org/confluence/x/2hsB + * How to make a release of Roller: https://cwiki.apache.org/confluence/x/gycB + * Other developer resources: https://cwiki.apache.org/confluence/x/D84 + + ## Quick start + + Assuming you've got a UNIX shell, Java, Maven and Git: + + Get the code: + + $ git clone https://github.com/apache/roller.git + + Build and test the code: + + $ cd roller + $ mvn clean install + + Run Roller in Jetty with Derby database: + + $ cd app + $ mvn jetty:run + + Browse to http://localhost:8080/roller + - - - - - http://git-wip-us.apache.org/repos/asf/roller/blob/129af05a/app/pom.xml ---------------------------------------------------------------------- diff --cc app/pom.xml index ab06f3d,1875d32..f762d6d --- a/app/pom.xml +++ b/app/pom.xml @@@ -262,23 -351,17 +351,22 @@@ limitations under the License </dependency> <dependency> - <groupId>com.rometools</groupId> - <artifactId>rome-fetcher</artifactId> - <version>${rome.version}</version> - <scope>compile</scope> + <groupId>com.jgeppert.struts2.bootstrap</groupId> + <artifactId>struts2-bootstrap-plugin</artifactId> + <version>2.0.3</version> + </dependency> + + <dependency> + <groupId>xml-security</groupId> + <artifactId>xmlsec</artifactId> + <version>1.3.0</version> </dependency> - <!-- Java EE deps --> - <dependency> - <groupId>javax.servlet</groupId> - <artifactId>jstl</artifactId> - <version>1.2</version> + <groupId>com.rometools</groupId> + <artifactId>rome-fetcher</artifactId> + <version>${rome.version}</version> + <scope>compile</scope> </dependency> <dependency> http://git-wip-us.apache.org/repos/asf/roller/blob/129af05a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/admin/GlobalConfig.java ---------------------------------------------------------------------- diff --cc app/src/main/java/org/apache/roller/weblogger/ui/struts2/admin/GlobalConfig.java index 9ab3d79,39c3a0b..b730b2d --- a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/admin/GlobalConfig.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/admin/GlobalConfig.java @@@ -45,22 -47,23 +46,23 @@@ import org.apache.struts2.interceptor.S /** * Action which handles editing of global configuration. */ + @AllowedMethods({"execute","save"}) public class GlobalConfig extends UIAction implements ParameterAware, ServletRequestAware { - + private static Log log = LogFactory.getLog(GlobalConfig.class); - + // the request parameters private Map<String, String[]> params = Collections.emptyMap(); - + // map of config properties private Map<String, RuntimeConfigProperty> properties = Collections.emptyMap(); - + // the runtime config def used to populate the display private ConfigDef globalConfigDef = null; - + // list of comment plugins private List<WeblogEntryCommentPlugin> pluginsList = Collections.emptyList(); - + // comment plugins that are enabled. this is what the html form submits to private String[] commentPlugins = new String[0]; http://git-wip-us.apache.org/repos/asf/roller/blob/129af05a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/BookmarkEdit.java ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/roller/blob/129af05a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/Bookmarks.java ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/roller/blob/129af05a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/CategoryEdit.java ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/roller/blob/129af05a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/FolderEdit.java ---------------------------------------------------------------------- diff --cc app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/FolderEdit.java index bbecdfa,b2a8084..d947e49 --- a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/FolderEdit.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/FolderEdit.java @@@ -27,17 -27,16 +27,19 @@@ import org.apache.roller.weblogger.busi import org.apache.roller.weblogger.pojos.WeblogBookmarkFolder; import org.apache.roller.weblogger.ui.struts2.util.UIAction; import org.apache.roller.weblogger.util.cache.CacheManager; +import org.apache.struts2.interceptor.ServletResponseAware; + import org.apache.struts2.convention.annotation.AllowedMethods; import org.apache.struts2.interceptor.validation.SkipValidation; +import javax.servlet.http.HttpServletResponse; + /** * Edit a new or existing folder. */ + @AllowedMethods({"execute","save"}) -public class FolderEdit extends UIAction { - +public class FolderEdit extends UIAction implements ServletResponseAware { - ++ private static Log log = LogFactory.getLog(FolderEdit.class); // bean for managing form data http://git-wip-us.apache.org/repos/asf/roller/blob/129af05a/app/src/main/resources/struts.xml ---------------------------------------------------------------------- diff --cc app/src/main/resources/struts.xml index 8020f7c,125dc14..39489c4 --- a/app/src/main/resources/struts.xml +++ b/app/src/main/resources/struts.xml @@@ -157,12 -173,25 +173,26 @@@ <!-- Weblogger Admin UI (includes planet) --> - <package name="weblogger-admin" namespace="/roller-ui/admin" extends="weblogger"> - - <action name="globalConfig!*" method="{1}" + <package name="weblogger-admin" namespace="/roller-ui/admin" extends="weblogger" > + + <global-allowed-methods> + clear, + disable, + delete, + deleteConfirm, + enable, + execute, + firstSave, + save, + query, + delete, + update + </global-allowed-methods> + + <action name="globalConfig" class="org.apache.roller.weblogger.ui.struts2.admin.GlobalConfig"> <result name="success" type="tiles">.GlobalConfig</result> + <result name="error" type="tiles">.GlobalConfig</result> </action> <action name="userAdmin" http://git-wip-us.apache.org/repos/asf/roller/blob/129af05a/app/src/main/webapp/WEB-INF/jsps/admin/GlobalConfig.jsp ---------------------------------------------------------------------- diff --cc app/src/main/webapp/WEB-INF/jsps/admin/GlobalConfig.jsp index 6097456,7ec9c39..3f668c4 --- a/app/src/main/webapp/WEB-INF/jsps/admin/GlobalConfig.jsp +++ b/app/src/main/webapp/WEB-INF/jsps/admin/GlobalConfig.jsp @@@ -17,127 -17,96 +17,127 @@@ --%> <%@ include file="/WEB-INF/jsps/taglibs-struts2.jsp" %> -<p class="subtitle"><s:text name="configForm.subtitle" /></p> -<p><s:text name="configForm.prompt" /></p> +<p class="subtitle"><s:text name="configForm.subtitle"/></p> +<p><s:text name="configForm.prompt"/></p> -<s:form action="globalConfig!save"> - <s:hidden name="salt" /> - <table class="formtableNoDesc"> - +<s:form action="globalConfig!save" theme="bootstrap" cssClass="form-horizontal"> + + <s:hidden name="salt"/> + - <s:iterator id="dg" value="globalConfigDef.displayGroups"> + <s:iterator var="dg" value="globalConfigDef.displayGroups"> - - <tr> - <td colspan="3"><h2><s:text name="%{#dg.key}" /></h2></td> - </tr> - + + <h2><s:text name="%{#dg.key}"/></h2> + - <s:iterator id="pd" value="#dg.propertyDefs"> + <s:iterator var="pd" value="#dg.propertyDefs"> - - <tr> - <td class="label"><s:text name="%{#pd.key}" /></td> - - <%-- special condition for comment plugins --%> - <s:if test="#pd.name == 'users.comments.plugins'"> - <td class="field"><s:checkboxlist theme="roller" list="pluginsList" - name="commentPlugins" listKey="id" listValue="name" /></td> - </s:if> - - <%-- special condition for front page blog --%> - <s:elseif test="#pd.name == 'site.frontpage.weblog.handle'"> - <td class="field"> - <select name='<s:property value="#pd.name"/>'> - <option value=''> - <s:text name="configForm.none" /> - </option> <s:iterator var="weblog" value="weblogs"> - <option value='<s:property value="#weblog.handle"/>' - <s:if test='properties[#pd.name].value == #weblog.handle'>selected='true'</s:if> > - <s:property value="#weblog.name"/> - </option> - </s:iterator> - </select> - </td> - </s:elseif> - - <%-- "string" type means use a simple textbox --%> - <s:elseif test="#pd.type == 'string'"> - <td class="field"><input type="text" name='<s:property value="#pd.name"/>' - value='<s:property value="properties[#pd.name].value"/>' size="35" /></td> - </s:elseif> - - <%-- "text" type means use a full textarea --%> - <s:elseif test="#pd.type == 'text'"> - <td class="field"> - <textarea name='<s:property value="#pd.name"/>' - rows="<s:property value="#pd.rows"/>" - cols="<s:property value="#pd.cols"/>"><s:property value="properties[#pd.name].value"/> - </textarea> - </td> - </s:elseif> - - <%-- "boolean" type means use a checkbox --%> - <s:elseif test="#pd.type == 'boolean'"> - <s:if test="properties[#pd.name].value == 'true'"> - <td class="field"><input type="checkbox" - name='<s:property value="#pd.name"/>' CHECKED></td> - </s:if> - <s:else> - <td class="field"><input type="checkbox" - name='<s:property value="#pd.name"/>'></td> - </s:else> - </s:elseif> - - <%-- if it's something we don't understand then use textbox --%> - <s:else> - <td class="field"><input type="text" - name='<s:property value="#pd.name"/>' size="50" /></td> - </s:else> - - <td class="description"><%-- <s:text name="" /> --%></td> - </tr> - + + <%-- special condition for comment plugins --%> + <s:if test="#pd.name == 'users.comments.plugins'"> + <s:checkboxlist label="%{getText(#pd.key)}" name="commentPlugins" + list="pluginsList" listKey="id" listValue="name"/> + </s:if> + + <%-- special condition for front page blog --%> + <s:elseif test="#pd.name == 'site.frontpage.weblog.handle'"> + <s:select name="%{#pd.name}" label="%{getText(#pd.key)}" + list="weblogs" listKey="handle" listValue="name"/> + </s:elseif> + + <%-- "string" type means use a simple textbox --%> + <s:elseif test="#pd.type == 'string'"> + <s:textfield name="%{#pd.name}" label="%{getText(#pd.key)}" size="35" + value="%{properties[#pd.name].value}"/> + </s:elseif> + + <%-- "text" type means use a full textarea --%> + <s:elseif test="#pd.type == 'text'"> + <s:textarea name="%{#pd.name}" label="%{getText(#pd.key)}" rows="#pd.rows" cols="#pd.cols" + value="%{properties[#pd.name].value}"/> + </s:elseif> + + <%-- "boolean" type means use a checkbox --%> + <s:elseif test="#pd.type == 'boolean'"> + <s:if test="properties[#pd.name].value == 'true'"> + <s:checkbox name="%{#pd.name}" label="%{getText(#pd.key)}" checked="checked" /> + </s:if> + <s:if test="properties[#pd.name].value == 'false'"> + <s:checkbox name="%{#pd.name}" label="%{getText(#pd.key)}" /> + </s:if> + </s:elseif> + + <s:elseif test="#pd.type == 'integer'"> + <div class="form-group "> + <label class="col-sm-3 control-label" + for='globalConfig_<s:property value="#pd.nameWithUnderbars" />'> + <s:text name="%{#pd.key}"/> + </label> + <div class="col-sm-9 controls"> + <input type="number" name='<s:property value="#pd.name" />' + size="35" value="30" id='globalConfig_<s:property value="#pd.nameWithUnderbars" />' + class="form-control integer" onkeyup="formChanged()" /> + </div> + </div> + </s:elseif> + + <s:elseif test="#pd.type == 'float'"> + <div class="form-group "> + <label class="col-sm-3 control-label" + for='globalConfig_<s:property value="#pd.nameWithUnderbars" />'> + <s:text name="%{#pd.key}"/> + </label> + <div class="col-sm-9 controls"> + <input type="number" name='<s:property value="#pd.name" />' + size="35" value="30" id='globalConfig_<s:property value="#pd.nameWithUnderbars" />' + class="form-control float" onkeyup="formChanged()" /> + </div> + </div> + </s:elseif> + + <%-- if it's something we don't understand then use textbox --%> + <s:else> + <s:textfield name="%{#pd.name}" label="%{getText(#pd.key)}" size="35" + value="%{properties[#pd.name].value}" /> + </s:else> + </s:iterator> - - <tr> - <td colspan="2"> </td> - </tr> - </s:iterator> - </table> - - <div class="control"> - <input class="buttonBox" type="submit" value="<s:text name="generic.save"/>"/> - </div> - + <input id="saveButton" class="btn" type="submit" value="<s:text name="generic.save"/>"/> + </s:form> + + +<script type="text/javascript"> + + function formChanged() { + + var saveBookmarkButton = $('#saveButton:first'); + + var error = false; + + $("input").each( function() { + + var isInteger = $(this).hasClass("integer"); + + if ( $(this).attr("type") == "number") { + + if ( isNaN( this.valueAsNumber )) { + $(this).css("background", "#FBB") + error = true; + + } else if ( isInteger && !Number.isInteger( this.valueAsNumber ) ) { + $(this).css("background", "#FBB") + error = true; + + } else { + $(this).css("background", "white") + } + } + + }); + + saveBookmarkButton.attr("disabled", error ); + } + +</script> + http://git-wip-us.apache.org/repos/asf/roller/blob/129af05a/app/src/main/webapp/WEB-INF/jsps/core/MainMenu.jsp ---------------------------------------------------------------------- diff --cc app/src/main/webapp/WEB-INF/jsps/core/MainMenu.jsp index da126a9,eb565f8..f042398 --- a/app/src/main/webapp/WEB-INF/jsps/core/MainMenu.jsp +++ b/app/src/main/webapp/WEB-INF/jsps/core/MainMenu.jsp @@@ -57,115 -57,125 +57,115 @@@ <%-- if we have weblogs, then loop through and list them --%> <s:if test="! existingPermissions.isEmpty"> - <s:iterator id="perms" value="existingPermissions"> + <s:iterator var="perms" value="existingPermissions"> - <div class="well yourWeblogBox"> - <div class="yourWeblogBox"> - - <span class="mm_weblog_name"><img src='<c:url value="/images/folder.png"/>' /> <s:property value="#perms.weblog.name" /></span> - - <table class="mm_table" width="100%" cellpadding="0" cellspacing="0"> - <tr> - <td valign="top"> - - <table cellpadding="0" cellspacing="0"> - - <tr> - <td class="mm_subtable_label"><s:text name='yourWebsites.weblog'/></td> - <td><a href='<s:property value="#perms.weblog.absoluteURL" />'> - <s:property value="#perms.weblog.absoluteURL" /> - </a></td> - </tr> - - <tr> - <td class="mm_subtable_label"><s:text name='yourWebsites.permission'/></td> - <td><s:if test='#perms.hasAction("admin")' >ADMIN</s:if> - <s:if test='#perms.hasAction("post")' >AUTHOR</s:if> - <s:if test='#perms.hasAction("edit_draft")' >LIMITED</s:if></td> - </tr> - - <tr> - <td class="mm_subtable_label"><s:text name='generic.description' /></td> - <td><s:property value="#perms.weblog.about" escapeHtml="false" /></td> - </tr> - - <tr> - <td class="mm_subtable_label"><s:text name='yourWebsites.userCount' /></td> - <td><s:property value="#perms.weblog.userCount" /></td> - </tr> - - <tr> - <td class="mm_subtable_label"><s:text name='yourWebsites.todaysHits' /></td> - <td><s:property value="#perms.weblog.todaysHits" /></td> - </tr> - - </table> - - </td> - - <td class="mm_table_actions" width="20%" align="left" > - - <s:url action="entryAdd" namespace="/roller-ui/authoring" var="newEntry"> - <s:param name="weblog" value="#perms.weblog.handle" /> - </s:url> - <img src='<s:url value="/images/table_edit.png"/>' /> - <s:a href="%{newEntry}"><s:text name="yourWebsites.newEntry" /></s:a> - <br /> - - <%-- Show Entries link with count for users above LIMITED permission --%> - <s:if test='!(#perms.hasAction("edit_draft"))'> - <s:url action="entries" namespace="/roller-ui/authoring" var="editEntries"> - <s:param name="weblog" value="#perms.weblog.handle" /> - </s:url> - <img src='<s:url value="/images/table_multiple.png"/>' /> - <s:a href="%{editEntries}"><s:text name="yourWebsites.editEntries" /> (<s:property value="#perms.weblog.entryCount" />)</s:a> - <br /> - </s:if> - - <%-- Show Comments link with count for users above LIMITED permission --%> - <s:if test='!(#perms.hasAction("edit_draft"))'> - <s:url action="comments" namespace="/roller-ui/authoring" var="manageComments"> - <s:param name="weblog" value="#perms.weblog.handle" /> - </s:url> - <img src='<s:url value="/images/page_white_edit.png"/>' /> - <s:a href="%{manageComments}"><s:text name="yourWebsites.manageComments" /> (<s:property value="#perms.weblog.commentCount" />)</s:a> - <br /> - </s:if> - - <%-- Only admins get access to theme and config settings --%> - <s:if test='#perms.hasAction("admin")'> - - <%-- And only show theme option if custom themes are enabled --%> - <s:if test="getProp('themes.customtheme.allowed')"> - <s:if test="#perms.weblog.editorTheme == 'custom'"> - <s:url action="templates" namespace="/roller-ui/authoring" var="weblogTheme"> - <s:param name="weblog" value="#perms.weblog.handle" /> - </s:url> - </s:if> - <s:else> - <s:url action="themeEdit" namespace="/roller-ui/authoring" var="weblogTheme"> - <s:param name="weblog" value="#perms.weblog.handle" /> - </s:url> - </s:else> - <img src='<s:url value="/roller-ui/images/layout.png"/>' /> - <a href='<s:property value="weblogTheme" />'> - <s:text name="yourWebsites.theme" /></a> - <br /> - </s:if> - - <s:url action="weblogConfig" namespace="/roller-ui/authoring" var="manageWeblog"> - <s:param name="weblog" value="#perms.weblog.handle" /> - </s:url> - <img src='<s:url value="/images/cog.png"/>' /> - <a href='<s:property value="manageWeblog" />'> - <s:text name="yourWebsites.manage" /></a> - <br /> - </s:if> - - <%-- don't allow last admin to resign from blog --%> - <s:if test='!(#perms.hasAction("admin") && #perms.weblog.adminUserCount == 1)'> - <img src='<c:url value="/images/delete.png"/>' /> - <s:url action="memberResign" namespace="/roller-ui/authoring" var="resignWeblog"> - <s:param name="weblog" value="#perms.weblog.handle" /> - </s:url> - <a href='<s:property value="resignWeblog" />'> - <s:text name='yourWebsites.resign' /> - </a> - </s:if> - - </td> - </tr> - </table> ++ <div class="well yourWeblogBox"> + + <h3 class="mm_weblog_name"> + <span class="glyphicon glyphicon-folder-open" aria-hidden="true"></span> + <s:property value="#perms.weblog.name" /> + </h3> + + <p> <a href='<s:property value="#perms.weblog.absoluteURL" />'> + <s:property value="#perms.weblog.absoluteURL" /></a></p> + - <p><s:property value="#perms.weblog.about" escape="false" /></p> - ++ <p><s:property value="#perms.weblog.about" escapeHtml="false" /></p> ++ + <p>You have + <s:if test='#perms.hasAction("admin")'>ADMIN</s:if> + <s:if test='#perms.hasAction("post")'>AUTHOR</s:if> + <s:if test='#perms.hasAction("edit_draft")'>LIMITED</s:if> + <s:text name='yourWebsites.permission'/></p> + <div class="btn-group" role="group" aria-label="..."> + + <%-- New entry button --%> - <s:url action="entryAdd" namespace="/roller-ui/authoring" id="newEntry"> ++ <s:url action="entryAdd" namespace="/roller-ui/authoring" var="newEntry"> + <s:param name="weblog" value="#perms.weblog.handle"/> + </s:url> + <s:a href="%{newEntry}" cssClass="btn btn-default"> + <span class="glyphicon glyphicon-pencil" aria-hidden="true"></span> + <s:text name="yourWebsites.newEntry"/> + </s:a> + + <s:if test='!(#perms.hasAction("edit_draft"))'> + + <%-- Show Entries button with count for users above LIMITED permission --%> - <s:url action="entries" namespace="/roller-ui/authoring" id="editEntries"> ++ <s:url action="entries" namespace="/roller-ui/authoring" var="editEntries"> + <s:param name="weblog" value="#perms.weblog.handle"/> + </s:url> + <s:a href="%{editEntries}" cssClass="btn btn-default"> + <span class="glyphicon glyphicon-list" aria-hidden="true"></span> + <s:text name="yourWebsites.editEntries"/> + <span class="badge"><s:property value="#perms.weblog.entryCount"/></span> + </s:a> + + </s:if> + + <s:if test='!(#perms.hasAction("edit_draft"))'> + + <%-- Show Comments button with count for users above LIMITED permission --%> - <s:url action="comments" namespace="/roller-ui/authoring" id="manageComments"> ++ <s:url action="comments" namespace="/roller-ui/authoring" var="manageComments"> + <s:param name="weblog" value="#perms.weblog.handle"/> + </s:url> + <s:a href="%{manageComments}" cssClass="btn btn-default"> + <span class="glyphicon glyphicon-comment" aria-hidden="true"></span> + <s:text name="yourWebsites.manageComments"/> + <span class="badge"><s:property value="#perms.weblog.commentCount"/></span> + </s:a> + + </s:if> + + + <%-- Only admins get access to theme and config settings --%> + <s:if test='#perms.hasAction("admin")'> + + <%-- And only show theme option if custom themes are enabled --%> + <s:if test="getProp('themes.customtheme.allowed')"> + <s:if test="#perms.weblog.editorTheme == 'custom'"> - <s:url action="templates" namespace="/roller-ui/authoring" id="weblogTheme"> ++ <s:url action="templates" namespace="/roller-ui/authoring" var="weblogTheme"> + <s:param name="weblog" value="#perms.weblog.handle" /> + </s:url> + </s:if> + <s:else> - <s:url action="themeEdit" namespace="/roller-ui/authoring" id="weblogTheme"> ++ <s:url action="themeEdit" namespace="/roller-ui/authoring" var="weblogTheme"> + <s:param name="weblog" value="#perms.weblog.handle" /> + </s:url> + </s:else> + <a href='<s:property value="weblogTheme" />' class="btn btn-default"> + <span class="glyphicon glyphicon-eye-open" aria-hidden="true"></span> + <s:text name="yourWebsites.theme" /> + </a> + </s:if> + + <%-- settings button --%> - <s:url action="weblogConfig" namespace="/roller-ui/authoring" id="manageWeblog"> ++ <s:url action="weblogConfig" namespace="/roller-ui/authoring" var="manageWeblog"> + <s:param name="weblog" value="#perms.weblog.handle"/> + </s:url> + <a href='<s:property value="manageWeblog" />' class="btn btn-default"> + <span class="glyphicon glyphicon-cog" aria-hidden="true"></span> + <s:text name="yourWebsites.manage"/> + </a> + + </s:if> + + <%-- don't allow last admin to resign from blog --%> + <s:if test='!(#perms.hasAction("admin") && #perms.weblog.adminUserCount == 1)'> + + <button type="button" class="btn btn-default"> + <span class="glyphicon glyphicon-trash" aria-hidden="true"></span> - <s:url action="memberResign" namespace="/roller-ui/authoring" id="resignWeblog"> ++ <s:url action="memberResign" namespace="/roller-ui/authoring" var="resignWeblog"> + <s:param name="weblog" value="#perms.weblog.handle"/> + </s:url> + <a href='<s:property value="resignWeblog" />'> + <s:text name='yourWebsites.resign'/> + </a> + </button> + + </s:if> + + </div> + </div> </s:iterator> http://git-wip-us.apache.org/repos/asf/roller/blob/129af05a/app/src/main/webapp/WEB-INF/jsps/editor/Bookmarks.jsp ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/roller/blob/129af05a/app/src/main/webapp/WEB-INF/jsps/editor/Categories.jsp ---------------------------------------------------------------------- diff --cc app/src/main/webapp/WEB-INF/jsps/editor/Categories.jsp index 0f159ff,ed9c43f..6140a4b --- a/app/src/main/webapp/WEB-INF/jsps/editor/Categories.jsp +++ b/app/src/main/webapp/WEB-INF/jsps/editor/Categories.jsp @@@ -23,244 -35,71 +23,244 @@@ </s:text> </p> <p class="pagetip"> - <s:text name="categoriesForm.rootPrompt" /> + <s:text name="categoriesForm.rootPrompt"/> </p> - <%-- Form is a table of categories each with checkbox --%> <s:form action="categories!move"> - <s:hidden name="salt" /> - <s:hidden name="weblog" /> - <s:hidden name="categoryId" /> + <s:hidden name="salt"/> + <s:hidden name="weblog"/> + <s:hidden name="categoryId"/> + + <table class="rollertable table table-striped" width="100%"> - <table class="rollertable"> - <tr class="rollertable"> - <th class="rollertable" width="15%"><s:text name="generic.name" /></th> - <th class="rollertable" width="40%"><s:text name="generic.description" /></th> - <th class="rollertable" width="31%"><s:text name="categoriesForm.imageUrl" /></th> - <th class="rollertable" width="7%"><s:text name="generic.edit" /></th> - <th class="rollertable" width="7%"><s:text name="categoriesForm.remove" /></th> + <th width="30%"><s:text name="generic.name"/></th> + <th width="50%"><s:text name="generic.description"/></th> + <th width="10%"><s:text name="generic.edit"/></th> + <th width="10%"><s:text name="categoriesForm.remove"/></th> </tr> - + <s:if test="AllCategories != null && !AllCategories.isEmpty"> - - <%-- Categories --%> - <s:iterator var="category" value="AllCategories" status="rowstatus"> - <s:if test="#rowstatus.odd == true"> - <tr class="rollertable_odd"> - </s:if> - <s:else> - <tr class="rollertable_even"> - </s:else> - - <td class="rollertable"><s:property value="#category.name" /></td> - - <td class="rollertable"><s:property value="#category.description" /></td> - - <td class="rollertable"><s:property value="#category.image" /></td> - - <td class="rollertable" align="center"> - <s:url var="editUrl" action="categoryEdit"> - <s:param name="weblog" value="%{actionWeblog.handle}" /> - <s:param name="bean.id" value="#category.id" /> - </s:url> - <s:a href="%{editUrl}"><img src='<s:url value="/images/page_white_edit.png"/>' border="0" alt="icon" /></s:a> - </td> - - <td class="rollertable" align="center"> - <s:if test="AllCategories.size() > 1"> - <s:url var="removeUrl" action="categoryRemove"> - <s:param name="weblog" value="%{actionWeblog.handle}" /> - <s:param name="removeId" value="#category.id" /> - </s:url> - <s:a href="%{removeUrl}"><img src='<s:url value="/images/delete.png"/>' border="0" alt="icon" /></s:a> - </s:if> - </td> - - </tr> - </s:iterator> - + - <s:iterator id="category" value="AllCategories" status="rowstatus"> ++ <s:iterator var="category" value="AllCategories" status="rowstatus"> + <tr> + <td><s:property value="#category.name"/></td> + + <td><s:property value="#category.description"/></td> + + <td align="center"> + + <s:set name="categoryId" value="#category.id" /> + <s:set name="categoryName" value="#category.name" /> + <s:set name="categoryDesc" value="#category.description" /> + <s:set name="categoryImage" value="#category.image" /> + <a href="#" onclick="showCategoryEditModal( + '<s:property value="categoryId" />', + '<s:property value="categoryName"/>', + '<s:property value="categoryDesc"/>', + '<s:property value="categoryImage"/>' )"> + <span class="glyphicon glyphicon-edit"></span> + </a> - ++ + </td> + + <td class="rollertable" align="center"> + <s:if test="AllCategories.size() > 1"> - ++ + <s:set name="categoryId" value="#category.id" /> + <s:set name="categoryName" value="#category.name" /> + <s:set name="categoryInUse" value="#category.inUse.toString()" /> + <a href="#" onclick="showCategoryDeleteModal( + '<s:property value="categoryId" />', + '<s:property value="categoryName" />', + <s:property value="categoryInUse"/> )" > + <span class="glyphicon glyphicon-trash"></span> + </a> - ++ + </s:if> + </td> + + </tr> + </s:iterator> + </s:if> + <s:else> <tr> - <td style="vertical-align:middle" colspan="6"><s:text name="categoriesForm.noresults" /></td> + <td style="vertical-align:middle" colspan="6"><s:text name="categoriesForm.noresults"/></td> </tr> </s:else> - + </table> - + </s:form> + + +<%-- ============================================================= --%> +<%-- add/edit category modal --%> + +<div id="category-edit-modal" class="modal fade category-edit-modal" tabindex="-1" role="dialog"> + + <div class="modal-dialog modal-lg"> + + <div class="modal-content"> + + <div class="modal-header"> + <h3 id="category-edit-title"></h3> + </div> + + <div class="modal-body"> + <s:form action="#" id="categoryEditForm" theme="bootstrap" cssClass="form-horizontal"> + <s:hidden name="salt"/> + <s:hidden name="weblog"/> + <s:hidden name="bean.id"/> + + <%-- action needed here because we are using AJAX to post this form --%> + <s:hidden name="action:categoryEdit!save" value="save"/> + + <s:textfield name="bean.name" label="%{getText('generic.name')}" maxlength="255"/> + <s:textfield name="bean.description" label="%{getText('generic.description')}"/> + <s:textfield name="bean.image" label="%{getText('categoryForm.image')}"/> + </s:form> + </div> + + <div class="modal-footer"> + <p id="feedback-area-edit"></p> + <button onclick="submitEditedCategory()" class="btn btn-primary"> + <s:text name="generic.save"/> + </button> + <button type="button" class="btn" data-dismiss="modal"> + <s:text name="generic.cancel"/> + </button> + </div> + + </div> + </div> +</div> + +<script> + + var feedbackAreaEdit = $("#feedback-area-edit"); + + function showCategoryEditModal( id, name, desc, image ) { + feedbackAreaEdit.html(""); + $('#category-edit-title').html('<s:text name="categoryForm.edit.title" />'); + + $('#categoryEditForm_bean_id').val(id); + $('#categoryEditForm_bean_name').val(name); + $('#categoryEditForm_bean_description').val(desc); + $('#categoryEditForm_bean_image').val(image); + + $('#category-edit-modal').modal({show: true}); + } + + function submitEditedCategory() { + + // if name is empty reject and show error message + if ($("#categoryEditForm_bean_name").val().trim() == "") { + feedbackAreaEdit.html('<s:text name="categoryForm.requiredFields" />'); + feedbackAreaEdit.css("color", "red"); + return; + } + + // post category via AJAX + $.ajax({ + method: 'post', + url: "categoryEdit!save.rol", + data: $("#categoryEditForm").serialize(), + context: document.body + + }).done(function (data) { + + // kludge: scrape response status from HTML returned by Struts + var alertEnd = data.indexOf("ALERT_END"); + if (data.indexOf('<s:text name="categoryForm.error.duplicateName" />') < alertEnd) { + feedbackAreaEdit.css("color", "red"); + feedbackAreaEdit.html('<s:text name="categoryForm.error.duplicateName" />'); + + } else { + feedbackAreaEdit.css("color", "green"); + feedbackAreaEdit.html('<s:text name="generic.success" />'); + $('#category-edit-modal').modal("hide"); + location.reload(true); + } + + }).error(function (data) { + feedbackAreaEdit.html('<s:text name="generic.error.check.logs" />'); + feedbackAreaEdit.css("color", "red"); + }); + } + +</script> + + +<%-- ============================================================= --%> +<%-- delete confirmation modal --%> + +<div id="delete-category-modal" class="modal fade delete-category-modal" tabindex="-1" role="dialog"> + + <div class="modal-dialog modal-lg"> + + <div class="modal-content"> + + <div class="modal-header"> + <h3> + <s:text name="categoryDeleteOK.removeCategory"/>: + <span id="category-name"></span> + </h3> + </div> + + <s:form action="categoryRemove!remove" theme="bootstrap" cssClass="form-horizontal"> + <s:hidden name="salt"/> + <s:hidden name="weblog"/> + <s:hidden name="removeId"/> + + <div class="modal-body"> + + <div id="category-in-use" class="alert alert-danger" role="alert" style="display:none"> + <p> + <s:text name="categoryDeleteOK.warningCatInUse"/> + <s:text name="categoryDeleteOK.youMustMoveEntries"/> + </p> + <s:text name="categoryDeleteOK.moveToWhere"/> + <s:select name="targetCategoryId" list="allCategories" listKey="id" listValue="name"/> + </div> + + <div id="category-empty" style="display:none"> + <p><s:text name="categoryDeleteOK.noEntriesInCat"/></p> + </div> + + <p> <strong><s:text name="categoryDeleteOK.areYouSure"/></strong> </p> + </div> + + <div class="modal-footer"> + <s:submit cssClass="btn" value="%{getText('generic.yes')}"/> + <button type="button" class="btn btn-default btn-primary" data-dismiss="modal"> + <s:text name="generic.no" /> + </button> + </div> + + </s:form> + + </div> + </div> +</div> + +<script> + + function showCategoryDeleteModal( id, name, inUse ) { + $('#categoryRemove_removeId').val(id); + $('#categoryEdit_bean_name').val(name); + $('#category-name').html(name); + if ( inUse ) { + $('#category-in-use').css('display','block'); + $('#category-emtpy').css('display', 'none'); + } else { + $('#category-in-use').css('display', 'none'); + $('#category-emtpy').css('display', 'block'); + } + $('#delete-category-modal').modal({show: true}); + } + +</script> http://git-wip-us.apache.org/repos/asf/roller/blob/129af05a/app/src/main/webapp/WEB-INF/jsps/editor/Comments.jsp ---------------------------------------------------------------------- diff --cc app/src/main/webapp/WEB-INF/jsps/editor/Comments.jsp index e950843,929d72e..03dedcf --- a/app/src/main/webapp/WEB-INF/jsps/editor/Comments.jsp +++ b/app/src/main/webapp/WEB-INF/jsps/editor/Comments.jsp @@@ -200,144 -246,122 +200,143 @@@ </tr> - <%-- ========================================================= --%> -<%-- Loop through comments --%> -<%-- ========================================================= --%> + <%-- ========================================================= --%> + <%-- Loop through comments --%> + + <%-- it is a bit funky to use checkbox list here, but using checkbox didn't work for me :( + we are effectively just creating a checkbox list of 1 item for each iteration of our collection. --%> - <s:iterator id="comment" value="pager.items" status="rowstatus"> + <s:iterator var="comment" value="pager.items" status="rowstatus"> <tr> <s:if test="actionName == 'comments'"> + <%-- only blog admins (not the global admin) can approve blog comments --%> <td> - <%-- a bit funky to use checkbox list here, but using checkbox didn't work for me :( - we are effectively just creating a checkbox list of 1 item for each iteration of our collection --%> - <s:checkboxlist name="bean.approvedComments" list="{#comment}" listKey="id" listValue="name" /> + <s:checkboxlist name="bean.approvedComments" theme="simple" cssClass="comment-select" + list="{#comment}" listKey="id" listValue="name"/> </td> </s:if> <td> - <%-- a bit funky to use checkbox list here, but using checkbox didn't work for me :( - we are effectively just creating a checkbox list of 1 item for each iteration of our collection --%> - <s:checkboxlist name="bean.spamComments" list="{#comment}" listKey="id" listValue="name" /> + <s:checkboxlist name="bean.spamComments" label="" theme="simple" cssClass="comment-select" + list="{#comment}" listKey="id" listValue="name"/> </td> <td> - <%-- a bit funky to use checkbox list here, but using checkbox didn't work for me :( - we are effectively just creating a checkbox list of 1 item for each iteration of our collection --%> - <s:checkboxlist name="bean.deleteComments" list="{#comment}" listKey="id" listValue="name" /> + <s:checkboxlist name="bean.deleteComments" label="" theme="simple" cssClass="comment-select" + list="{#comment}" listKey="id" listValue="name"/> </td> - <%-- ======================================================== --%> - <%-- Display comment details and text --%> + <%-- ======================================================== --%> + <%-- Display comment details and text --%> - <%-- <td> with style if comment is spam or pending --%> + <%-- <td> with style if comment is spam or pending --%> <s:if test="#comment.status.name() == 'SPAM'"> - <td class="spamcomment"> - </s:if> - <s:elseif test="#comment.status.name() == 'PENDING'"> - <td class="pendingcomment"> - </s:elseif> - <s:else> - <td> - </s:else> + <td class="spamcomment"> + </s:if> + <s:elseif test="#comment.status.name() == 'PENDING'"> + <td class="pendingcomment"> + </s:elseif> + <s:else> + <td> + </s:else> - <%-- comment details table in table --%> - <table class="innertable" > + <%-- comment details table in table --%> + <table class="innertable"> <tr> <td class="viewbody"> - <div class="viewdetails bot"> - <div class="details"> - <s:text name="commentManagement.entryTitled" /> : - <a href='<s:property value="#comment.weblogEntry.permalink" />'> - <s:property value="#comment.weblogEntry.title" /></a> - </div> - <div class="details"> - <s:text name="commentManagement.commentBy" /> : - <s:if test="#comment.email != null && #comment.name != null"> - <s:text name="commentManagement.commentByBoth" > - <s:param><s:property value="#comment.name" /></s:param> - <s:param><s:property value="#comment.email" /></s:param> - <s:param><s:property value="#comment.email" /></s:param> - <s:param><s:property value="#comment.remoteHost" /></s:param> - </s:text> + + <div class="viewdetails bot"> + + <div class="details"> + <s:text name="commentManagement.entryTitled"/> : + <a href='<s:property value="#comment.weblogEntry.permalink" />'> + <s:property value="#comment.weblogEntry.title"/></a> + </div> + + <div class="details"> + <s:text name="commentManagement.commentBy"/> : + <s:if test="#comment.email != null && #comment.name != null"> + <s:text name="commentManagement.commentByBoth"> + <s:param><s:property value="#comment.name"/></s:param> + <s:param><s:property value="#comment.email"/></s:param> + <s:param><s:property value="#comment.email"/></s:param> + <s:param><s:property value="#comment.remoteHost"/></s:param> + </s:text> + </s:if> + <s:elseif test="#comment.email == null && #comment.name == null"> + <s:text name="commentManagement.commentByIP"> + <s:param><s:property value="#comment.remoteHost"/></s:param> + </s:text> + </s:elseif> + <s:else> + <s:text name="commentManagement.commentByName"> + <s:param><s:property value="#comment.name"/></s:param> + <s:param><s:property value="#comment.remoteHost"/></s:param> + </s:text> + </s:else> + </div> + + <s:if test="#comment.url != null && !#comment.url.equals('')"> + <div class="details"> + <s:text name="commentManagement.commentByURL"/> : + <a href='<s:property value="#comment.url" />'> + <str:truncateNicely upper="60" appendToEnd="..."><s:property + value="#comment.url"/></str:truncateNicely></a> + </div> </s:if> - <s:elseif test="#comment.email == null && #comment.name == null"> - <s:text name="commentManagement.commentByIP" > - <s:param><s:property value="#comment.remoteHost" /></s:param> - </s:text> - </s:elseif> - <s:else> - <s:text name="commentManagement.commentByName" > - <s:param><s:property value="#comment.name" /></s:param> - <s:param><s:property value="#comment.remoteHost" /></s:param> - </s:text> - </s:else> - </div> - <s:if test="#comment.url != null && !#comment.url.equals('')"> + <div class="details"> - <s:text name="commentManagement.commentByURL" /> : - <a href='<s:property value="#comment.url" />'> - <str:truncateNicely upper="60" appendToEnd="..."><s:property value="#comment.url" /></str:truncateNicely></a> + <s:text name="commentManagement.postTime"/> : + <s:date name="#comment.postTime"/> </div> - </s:if> - <div class="details"> - <s:text name="commentManagement.postTime" /> : - <s:date name="#comment.postTime"/> + </div> - - </div> - <div class="viewdetails bot"> - <div class="details bot"> - <s:if test="#comment.content.length() > 1000"> - <div class="bot" id="comment-<s:property value="#comment.id"/>"> - <str:truncateNicely upper="1000" appendToEnd="..."> - <s:property value="#comment.content" escapeHtml="true" /> - </str:truncateNicely> - </div> - <div id="link-<s:property value="#comment.id"/>"> - <a onclick='readMoreComment("<s:property value="#comment.id"/>")'><s:text name="commentManagement.readmore" /></a> - </div> - </s:if> - <s:else> - <span width="200px" id="comment-<s:property value="#comment.id"/>"><s:property value="#comment.content" escapeHtml="true" /></span> - </s:else> - </div> - <s:if test="actionName == 'comments'"> - <div class="details"> - <a id="editlink-<s:property value="#comment.id"/>" onclick='editComment("<s:property value="#comment.id"/>")'> - <s:text name="generic.edit" /> - </a> - </div> - <div class="details"> - <span id="savelink-<s:property value="#comment.id"/>" style="display: none"> - <a onclick='saveComment("<s:property value="#comment.id"/>")'><s:text name="generic.save" /></a> | + <div class="viewdetails bot"> + + <div class="details bot"> + + <s:if test="#comment.content.length() > 1000"> + <div class="bot" id="comment-<s:property value="#comment.id"/>"> + <str:truncateNicely upper="1000" appendToEnd="..."> + <s:property value="#comment.content" escape="true"/> + </str:truncateNicely> + </div> + <div id="link-<s:property value="#comment.id"/>"> + <a onclick='readMoreComment("<s:property + value="#comment.id"/>")'><s:text + name="commentManagement.readmore"/></a> + </div> + </s:if> + <s:else> + <span width="200px" + id="comment-<s:property value="#comment.id"/>"><s:property + value="#comment.content" escape="true"/></span> + </s:else> + </div> + + <s:if test="actionName == 'comments'"> + <div class="details"> + <a id="editlink-<s:property value="#comment.id"/>" + onclick='editComment("<s:property value="#comment.id"/>")'> + <s:text name="generic.edit"/> + </a> + </div> + <div class="details"> + <span id="savelink-<s:property value="#comment.id"/>" + style="display: none"> + <a onclick='saveComment("<s:property value="#comment.id"/>")'><s:text + name="generic.save"/></a> | </span> - <span id="cancellink-<s:property value="#comment.id"/>" style="display: none"> - <a onclick='editCommentCancel("<s:property value="#comment.id"/>")'><s:text name="generic.cancel" /></a> + <span id="cancellink-<s:property value="#comment.id"/>" + style="display: none"> + <a onclick='editCommentCancel("<s:property + value="#comment.id"/>")'><s:text name="generic.cancel"/></a> </span> - </div> - </s:if> - </div> + </div> + </s:if> + + </div> </tr> - </table> <%-- end comment details table in table --%> + </table> + <%-- end comment details table in table --%> </td> </tr> </s:iterator> http://git-wip-us.apache.org/repos/asf/roller/blob/129af05a/app/src/main/webapp/WEB-INF/jsps/editor/Entries.jsp ---------------------------------------------------------------------- diff --cc app/src/main/webapp/WEB-INF/jsps/editor/Entries.jsp index 3dbc294,eac0689..198de1d --- a/app/src/main/webapp/WEB-INF/jsps/editor/Entries.jsp +++ b/app/src/main/webapp/WEB-INF/jsps/editor/Entries.jsp @@@ -77,9 -121,15 +77,9 @@@ <th class="rollertable" width="5%"> <s:text name="weblogEntryQuery.category" /> </th> - <th class="rollertable" width="5%"> - </th> - <th class="rollertable" width="5%"> - </th> - <th class="rollertable" width="5%"> - </th> </tr> - <s:iterator id="post" value="pager.items"> + <s:iterator var="post" value="pager.items"> <%-- <td> with style if comment is spam or pending --%> <s:if test="#post.status.name() == 'DRAFT'"> <tr class="draftentry"> http://git-wip-us.apache.org/repos/asf/roller/blob/129af05a/app/src/main/webapp/WEB-INF/jsps/editor/EntryEdit.jsp ---------------------------------------------------------------------- diff --cc app/src/main/webapp/WEB-INF/jsps/editor/EntryEdit.jsp index c489d0e,7d00385..5867b02 --- a/app/src/main/webapp/WEB-INF/jsps/editor/EntryEdit.jsp +++ b/app/src/main/webapp/WEB-INF/jsps/editor/EntryEdit.jsp @@@ -336,28 -277,26 +336,28 @@@ <s:if test="actionName == 'entryEdit'"> <span style="float:right"> <s:url var="removeUrl" action="entryRemove"> - <s:param name="weblog" value="actionWeblog.handle" /> - <s:param name="removeId" value="%{entry.id}" /> + <s:param name="weblog" value="actionWeblog.handle"/> + <s:param name="removeId" value="%{entry.id}"/> </s:url> - <input type="button" value="<s:text name='weblogEdit.deleteEntry'/>" onclick="window.location='<s:property value="removeUrl" escapeHtml="false" />'" /> + <input class="btn btn-danger" type="button" + value="<s:text name='weblogEdit.deleteEntry'/>" - onclick="window.location='<s:property value="removeUrl" escape="false"/>'"/> ++ onclick="window.location='<s:property value="removeUrl" escapeHtml="false"/>'"/> </span> </s:if> - </div> - + <%-- ================================================================== --%> - <%-- Trackback control --%> + <%-- Trackback control <s:if test="actionName == 'entryEdit' && userAnAuthor"> - <br /> - <h2><s:text name="weblogEdit.trackback" /></h2> - <s:text name="weblogEdit.trackbackUrl" /> - <br /> + <br/> + <h2><s:text name="weblogEdit.trackback"/></h2> + <s:text name="weblogEdit.trackbackUrl"/> + <br/> <s:textfield name="trackbackUrl" size="80" maxlength="255" style="width:35%"/> - <s:submit value="%{getText('weblogEdit.sendTrackback')}" action="entryEdit!trackback" /> + <s:submit value="%{getText('weblogEdit.sendTrackback')}" action="entryEdit!trackback"/> </s:if> + --%> </s:form> http://git-wip-us.apache.org/repos/asf/roller/blob/129af05a/app/src/main/webapp/WEB-INF/jsps/editor/EntrySidebar.jsp ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/roller/blob/129af05a/app/src/main/webapp/WEB-INF/jsps/editor/MediaFileSidebar.jsp ---------------------------------------------------------------------- diff --cc app/src/main/webapp/WEB-INF/jsps/editor/MediaFileSidebar.jsp index 89bc95d,f80a084..9de1166 --- a/app/src/main/webapp/WEB-INF/jsps/editor/MediaFileSidebar.jsp +++ b/app/src/main/webapp/WEB-INF/jsps/editor/MediaFileSidebar.jsp @@@ -32,8 -32,8 +32,8 @@@ <s:param name="weblog" value="%{actionWeblog.handle}" /> <s:param name="directoryName" value="%{directoryName}" /> </s:url> - <a href='<s:property escape="false" value="%{mediaFileAddURL}" />' + <a href='<s:property escapeHtml="false" value="%{mediaFileAddURL}" />' - <s:if test="actionName.equals('mediaFileAdd')">style='font-weight:bold;'</s:if> > + <s:if test="actionName.equals('mediaFileAdd')"> style='font-weight:bold;'</s:if> > <s:text name="mediaFileSidebar.add" /> </a> http://git-wip-us.apache.org/repos/asf/roller/blob/129af05a/app/src/main/webapp/WEB-INF/jsps/editor/MediaFileView.jsp ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/roller/blob/129af05a/app/src/main/webapp/WEB-INF/jsps/taglibs-struts2.jsp ---------------------------------------------------------------------- diff --cc app/src/main/webapp/WEB-INF/jsps/taglibs-struts2.jsp index 9156adc,2520111..75144a0 --- a/app/src/main/webapp/WEB-INF/jsps/taglibs-struts2.jsp +++ b/app/src/main/webapp/WEB-INF/jsps/taglibs-struts2.jsp @@@ -15,18 -15,14 +15,22 @@@ copyright in this work, please see the NOTICE file in the top level directory of this distribution. --%> ++ + <meta charset="UTF-8"> + <meta http-equiv="Content-type" content="text/html; charset=UTF-8"> -<% response.setContentType("text/html;charset=UTF-8"); %> -<%@ page language="java" contentType="text/html;charset=UTF-8" %> ++ +<% response.setContentType("text/html; charset=UTF-8"); %> + +<%@ page language="java" contentType="text/html; charset=UTF-8" %> + <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %> -<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %> <%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %> -<%@ taglib uri="/struts-tags" prefix="s" %> + +<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %> <%@ taglib uri="http://jakarta.apache.org/taglibs/string-1.1" prefix="str" %> -<%@ taglib tagdir="/WEB-INF/tags" prefix="tags"%> + +<%@ taglib uri="/struts-tags" prefix="s" %> +<%@ taglib uri="/struts-bootstrap-tags" prefix="sboo" %> + +<%@ taglib tagdir="/WEB-INF/tags" prefix="tags" %> http://git-wip-us.apache.org/repos/asf/roller/blob/129af05a/app/src/main/webapp/WEB-INF/jsps/tiles/menu.jsp ---------------------------------------------------------------------- diff --cc app/src/main/webapp/WEB-INF/jsps/tiles/menu.jsp index 6166efb,d75f34f..5579f8d --- a/app/src/main/webapp/WEB-INF/jsps/tiles/menu.jsp +++ b/app/src/main/webapp/WEB-INF/jsps/tiles/menu.jsp @@@ -17,50 -17,44 +17,51 @@@ --%> <%@ include file="/WEB-INF/jsps/taglibs-struts2.jsp" %> - <s:set name="tabMenu" value="menu"/> + <s:set var="tabMenu" value="menu"/> <s:if test="#tabMenu != null"> -<table class="menuTabTable" cellspacing="0" > -<tr> -<s:iterator var="tab" value="#tabMenu.tabs" > - <s:if test="#tab.selected"> - <s:set var="selectedTab" value="#tab" /> - <td class="menuTabSelected"> - </s:if> - <s:else> - <td class="menuTabUnselected"> - </s:else> - <div class="menu-tr"> - <div class="menu-tl"> - <a href="<s:url action="%{#tab.action}"><s:param name="weblog" value="actionWeblog.handle"/></s:url>"><s:text name="%{#tab.key}" /></a> - </div> - </div> - </td> - <td class="menuTabSeparator"></td> -</s:iterator> -</tr> -</table> - -<table class="menuItemTable" cellspacing="0" > - <tr> - <td class="padleft"> - <s:iterator var="tabItem" value="#selectedTab.items" status="stat"> - <s:if test="!#stat.first">|</s:if> - <s:if test="#tabItem.selected"> - <a class="menuItemSelected" href="<s:url action="%{#tabItem.action}"><s:param name="weblog" value="actionWeblog.handle"/></s:url>"><s:text name="%{#tabItem.key}" /></a> - </s:if> - <s:else> - <a class="menuItemUnselected" href="<s:url action="%{#tabItem.action}"><s:param name="weblog" value="actionWeblog.handle"/></s:url>"><s:text name="%{#tabItem.key}" /></a> - </s:else> ++<<<<<<< HEAD + <%-- + <nav class="navbar navbar-default"> + <div class="container-fluid"> + <div id="navbar" class="navbar-collapse collapse"> + <ul class="nav navbar-nav"> + + <s:iterator id="tab" value="#tabMenu.tabs"> + <li class="dropdown"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" + aria-haspopup="true" aria-expanded="false"> + <s:text name="%{#tab.key}"/> <span class="caret"></span> + </a> + <ul class="dropdown-menu"> + <s:iterator id="tabItem" value="#tab.items" status="stat"> + <li> + <a href="<s:url action="%{#tabItem.action}"><s:param name="weblog" value="actionWeblog.handle"/></s:url>"> + <s:text name="%{#tabItem.key}"/> + </a> + </li> + </s:iterator> + </ul> + </li> + </s:iterator> + + </ul> + </div> <!--/.nav-collapse --> + </div> <!--/.container-fluid --> + </nav> + + <s:iterator id="tab" value="#tabMenu.tabs"> + + <h3><s:text name="%{#tab.key}"/></h3> + + <div class="list-group"> + <s:iterator id="tabItem" value="#tab.items" status="stat"> + <a class="list-group-item" href="<s:url action="%{#tabItem.action}"><s:param name="weblog" value="actionWeblog.handle"/></s:url>"> + <s:text name="%{#tabItem.key}"/></a> </s:iterator> - </td> - </tr> -</table> + </div> + </s:iterator> + --%> + </s:if> http://git-wip-us.apache.org/repos/asf/roller/blob/129af05a/app/src/main/webapp/WEB-INF/jsps/tiles/messages.jsp ---------------------------------------------------------------------- diff --cc app/src/main/webapp/WEB-INF/jsps/tiles/messages.jsp index ad2e9c6,f881191..8716ddc --- a/app/src/main/webapp/WEB-INF/jsps/tiles/messages.jsp +++ b/app/src/main/webapp/WEB-INF/jsps/tiles/messages.jsp @@@ -26,14 -26,14 +26,14 @@@ <%-- Error Messages --%> <s:if test="!actionErrors.isEmpty || !fieldErrors.isEmpty"> - <div id="errors" class="errors"> + <div id="errors" class="alert alert-danger"> <ul> - <s:iterator id="actionError" value="actionErrors"> - <li><s:property value="#actionError" escape="false" /></li> + <s:iterator var="actionError" value="actionErrors"> + <li><s:property value="#actionError" escapeHtml="false" /></li> </s:iterator> - <s:iterator id="fieldErrorName" value="fieldErrors.keySet()"> - <s:iterator id="fieldErrorValue" value="fieldErrors[#fieldErrorName]"> - <li><s:property value="#fieldErrorValue" escape="false" /></li> + <s:iterator var="fieldErrorName" value="fieldErrors.keySet()"> + <s:iterator var="fieldErrorValue" value="fieldErrors[#fieldErrorName]"> + <li><s:property value="#fieldErrorValue" escapeHtml="false" /></li> </s:iterator> </s:iterator> </ul> http://git-wip-us.apache.org/repos/asf/roller/blob/129af05a/app/src/main/webapp/WEB-INF/jsps/tiles/tiles-tabbedpage.jsp ---------------------------------------------------------------------- diff --cc app/src/main/webapp/WEB-INF/jsps/tiles/tiles-tabbedpage.jsp index 7a735d1,1299132..8073292 --- a/app/src/main/webapp/WEB-INF/jsps/tiles/tiles-tabbedpage.jsp +++ b/app/src/main/webapp/WEB-INF/jsps/tiles/tiles-tabbedpage.jsp @@@ -16,51 -16,52 +16,51 @@@ directory of this distribution. --%> <%@ include file="/WEB-INF/jsps/taglibs-struts2.jsp" %> - <!doctype html> + <!DOCTYPE html> <html> - <head> - <meta charset="utf-8"> - <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <link rel="icon" href="<%= request.getContextPath() %>/favicon.ico" type="image/x-icon"> - <title><s:property value="getProp('site.shortName')"/>: <s:property value="pageTitle" /></title> +<head> + <meta charset="utf-8"> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <link rel="icon" href="<%= request.getContextPath() %>/favicon.ico" type="image/x-icon"> + <title><s:property value="getProp('site.shortName')"/>: <s:property value="pageTitle"/></title> + <tiles:insertAttribute name="head"/> + <style> <tiles:insertAttribute name="styles" /> </style> +</head> +<body> - <tiles:insertAttribute name="head" /> - <style> - <tiles:insertAttribute name="styles" /> - </style> - </head> - <body> - <div id="banner"> - <tiles:insertAttribute name="bannerStatus" /> - </div> - - <div id="menu"> - <h1><s:property value="pageTitle" /></h1> - <tiles:insertAttribute name="menu" /> - </div> - - <div id="content"> - <div id="leftcontent_wrap"> - <div id="leftcontent"> - </div> - </div> - - <div id="centercontent_wrap"> - <div id="centercontent"> - <tiles:insertAttribute name="messages" /> - <tiles:insertAttribute name="content" /> - </div> +<tiles:insertAttribute name="bannerStatus"/> + +<div class="row"> + <div class="col-md-8 roller-column-left"> + <div class="panel panel-default"> + <div class="panel-body"> + <tiles:insertAttribute name="messages"/> + <h2 class="roller-page-title"><s:property value="pageTitle"/></h2> + <tiles:insertAttribute name="content"/> </div> - - <div id="rightcontent_wrap"> - <div id="rightcontent"> - <tiles:insertAttribute name="sidebar" /> - </div> + </div> + </div> + <div class="col-md-4 roller-column-right"> + <div class="panel panel-default"> + <div class="panel-body"> + <s:if test="authenticatedUser != null || actionWeblog != null"> + <tiles:insertAttribute name="userStatus"/> + </s:if> </div> </div> - - <div id="footer"> - <tiles:insertAttribute name="footer" /> + <div class="panel panel-default"> + <div class="panel-body"> + <tiles:insertAttribute name="sidebar"/> + </div> </div> - - </body> + </div> +</div> + +<footer class="footer"> + <div class="container"> + <tiles:insertAttribute name="footer"/> + </div> +</footer> + +</body> </html> http://git-wip-us.apache.org/repos/asf/roller/blob/129af05a/app/src/main/webapp/WEB-INF/web.xml ----------------------------------------------------------------------
