Categories page is complete with add, edit and delete category in place.
Project: http://git-wip-us.apache.org/repos/asf/roller/repo Commit: http://git-wip-us.apache.org/repos/asf/roller/commit/5bd3c532 Tree: http://git-wip-us.apache.org/repos/asf/roller/tree/5bd3c532 Diff: http://git-wip-us.apache.org/repos/asf/roller/diff/5bd3c532 Branch: refs/heads/bootstrap-ui Commit: 5bd3c5329dfb3293c375c05f41096bbf00508e53 Parents: 53ae365 Author: Dave Johnson <[email protected]> Authored: Sun Dec 27 15:20:44 2015 -0500 Committer: Dave Johnson <[email protected]> Committed: Sun Dec 27 15:20:44 2015 -0500 ---------------------------------------------------------------------- .../ui/struts2/editor/CategoryEdit.java | 20 +++- .../resources/ApplicationResources.properties | 9 +- .../main/webapp/WEB-INF/jsps/core/login-css.jsp | 23 ++++ .../webapp/WEB-INF/jsps/editor/Categories.jsp | 112 +++++++++++-------- .../WEB-INF/jsps/editor/CategoriesSidebar.jsp | 74 +++++++++--- .../main/webapp/WEB-INF/jsps/tiles/messages.jsp | 2 + .../WEB-INF/jsps/tiles/tiles-simplepage.jsp | 1 - app/src/main/webapp/WEB-INF/tiles.xml | 1 + app/src/main/webapp/roller-ui/styles/roller.css | 18 ++- 9 files changed, 186 insertions(+), 74 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/roller/blob/5bd3c532/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/CategoryEdit.java ---------------------------------------------------------------------- diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/CategoryEdit.java b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/CategoryEdit.java index 99fbc9f..a146196 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/CategoryEdit.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/CategoryEdit.java @@ -62,10 +62,12 @@ public class CategoryEdit extends UIAction { public void myPrepare() { - if (StringUtils.isEmpty(bean.getId())) { + + if ( isAdd() ) { // Create and initialize new, not-yet-saved category category = new WeblogCategory(); category.setWeblog(getActionWeblog()); + } else { try { WeblogEntryManager wmgr = WebloggerFactory.getWeblogger().getWeblogEntryManager(); @@ -90,7 +92,7 @@ public class CategoryEdit extends UIAction { } private boolean isAdd() { - return actionName.equals("categoryAdd"); + return StringUtils.isEmpty( bean.getId() ); } /** @@ -132,10 +134,16 @@ public class CategoryEdit extends UIAction { } public void myValidate() { - // make sure new name is not a duplicate of an existing category - if ((isAdd() || !category.getName().equals(bean.getName())) && - category.getWeblog().hasCategory(bean.getName())) { - addError("categoryForm.error.duplicateName", bean.getName()); + + if ( isAdd() ) { + if ( getActionWeblog().hasCategory( bean.getName() ) ) { + addError("categoryForm.error.duplicateName", bean.getName()); + } + } else { + WeblogCategory wc = getActionWeblog().getWeblogCategory(bean.getName()); + if ( wc != null && !wc.getId().equals( bean.getId() )) { + addError("categoryForm.error.duplicateName", bean.getName()); + } } } http://git-wip-us.apache.org/repos/asf/roller/blob/5bd3c532/app/src/main/resources/ApplicationResources.properties ---------------------------------------------------------------------- diff --git a/app/src/main/resources/ApplicationResources.properties b/app/src/main/resources/ApplicationResources.properties index 2b753ce..250fe3e 100644 --- a/app/src/main/resources/ApplicationResources.properties +++ b/app/src/main/resources/ApplicationResources.properties @@ -33,9 +33,10 @@ generic.save=Save generic.edit=Edit generic.delete=Delete generic.tagline=Tagline -generic.error.check.logs=Roller system error - Have administrator check Roller logs for more information. +generic.error.check.logs=System error - check logs for more information. generic.changes.saved=Changes saved generic.toggle=Toggle +generic.success=Success # ------------------------------------------------------------- BookmarkForm.jsp @@ -135,11 +136,11 @@ categoryForm.edit.subtitle=Editing category categoryForm.add.title=Add Category categoryForm.add.subtitle=Adding category categoryForm.image=Image URL -categoryForm.created=Category "{0}" created +categoryForm.created=Category created categoryForm.changesSaved=Category "{0}" updated -categoryForm.error.duplicateName=Category name "{0}" already in use, please choose another +categoryForm.error.duplicateName=Category name already in use categoryForm.removed=Category "{0}" deleted -categoryForm.requiredFields={0} is required. +categoryForm.requiredFields=Name is required. # errors from validation Category.error.nameNull=Name is a required field http://git-wip-us.apache.org/repos/asf/roller/blob/5bd3c532/app/src/main/webapp/WEB-INF/jsps/core/login-css.jsp ---------------------------------------------------------------------- diff --git a/app/src/main/webapp/WEB-INF/jsps/core/login-css.jsp b/app/src/main/webapp/WEB-INF/jsps/core/login-css.jsp new file mode 100644 index 0000000..1cd65ea --- /dev/null +++ b/app/src/main/webapp/WEB-INF/jsps/core/login-css.jsp @@ -0,0 +1,23 @@ +<%-- + 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. +--%> + +.roller-page-title { + margin-top: 0px; + margin-bottom: 5px; + text-align: center; +} http://git-wip-us.apache.org/repos/asf/roller/blob/5bd3c532/app/src/main/webapp/WEB-INF/jsps/editor/Categories.jsp ---------------------------------------------------------------------- diff --git a/app/src/main/webapp/WEB-INF/jsps/editor/Categories.jsp b/app/src/main/webapp/WEB-INF/jsps/editor/Categories.jsp index b45ccfd..03d6f4e 100644 --- a/app/src/main/webapp/WEB-INF/jsps/editor/Categories.jsp +++ b/app/src/main/webapp/WEB-INF/jsps/editor/Categories.jsp @@ -84,7 +84,7 @@ <a href="#" onclick="showCategoryDeleteModal( '<s:property value="categoryId" />', '<s:property value="categoryName" />', - '<s:property value="categoryInUse"/>' )" > + <s:property value="categoryInUse"/> )" > <span class="glyphicon glyphicon-trash"></span> </a> @@ -116,70 +116,92 @@ <div class="modal-content"> - <s:set var="mainAction">categoryEdit</s:set> - <div class="modal-header"> - <h3><s:text name="categoryForm.edit.title" /></h3> - <p class="pagetip"> - <s:text name="categoryForm.requiredFields"> - <s:param><s:text name="generic.name"/></s:param> - </s:text> - </p> + <h3 id="category-edit-title"></h3> </div> - - <s:form action="categoryEdit!save" theme="bootstrap" cssClass="form-horizontal"> - <s:hidden name="salt"/> - <s:hidden name="weblog"/> - <s:hidden name="bean.id"/> - <div class="modal-body"> - <s:textfield name="bean.name" label="%{getText('generic.name')}" maxlength="255"/> + <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')}"/> - </div> + <s:textfield name="bean.image" label="%{getText('categoryForm.image')}"/> + </s:form> + </div> - <div class="modal-footer"> - <s:submit cssClass="btn btn-primary" - value="%{getText('generic.save')}" action="%{#mainAction}!save"/> - <button type="button" class="btn" data-dismiss="modal"> - <s:text name="generic.cancel" /> - </button> - </div> - </s:form> + <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 ) { - $('#categoryEdit_bean_id').val(id); - $('#categoryEdit_bean_name').val(name); - $('#categoryEdit_bean_description').val(desc); - $('#categoryEdit_bean_image').val(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() { - $('form > input').keyup(function() { + 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) { - var empty = false; - $('form > input').each(function() { - if ($(this).val() == '') { - empty = true; - } - }); + // 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" />'); - if (empty) { - $('#register').attr('disabled', 'disabled'); } else { - $('#register').removeAttr('disabled'); + 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> http://git-wip-us.apache.org/repos/asf/roller/blob/5bd3c532/app/src/main/webapp/WEB-INF/jsps/editor/CategoriesSidebar.jsp ---------------------------------------------------------------------- diff --git a/app/src/main/webapp/WEB-INF/jsps/editor/CategoriesSidebar.jsp b/app/src/main/webapp/WEB-INF/jsps/editor/CategoriesSidebar.jsp index 2aa0d4e..81a0b7a 100644 --- a/app/src/main/webapp/WEB-INF/jsps/editor/CategoriesSidebar.jsp +++ b/app/src/main/webapp/WEB-INF/jsps/editor/CategoriesSidebar.jsp @@ -25,6 +25,7 @@ <s:set name="categoryName" value="#post.name"/> <s:set name="categoryDesc" value="#post.description"/> <s:set name="categoryImage" value="#post.image"/> + <a href="#" onclick="showCategoryAddModal()"> <span class="glyphicon glyphicon-plus"></span> <s:text name="categoriesForm.addCategory"/> @@ -32,6 +33,7 @@ </p> +<%-- <div id="category-add-modal" class="modal fade category-add-modal" tabindex="-1" role="dialog"> <div class="modal-dialog modal-lg"> @@ -39,55 +41,93 @@ <div class="modal-content"> <div class="modal-header"> - <h3> <s:text name="categoryForm.add.title"/> </h3> + <h3><s:text name="categoryForm.add.title"/></h3> </div> <div class="modal-body"> <s:form id="categoryAddForm" theme="bootstrap" cssClass="form-horizontal"> <s:hidden name="salt"/> <s:hidden name="weblog"/> - <s:textfield name="bean.name" label="%{getText('generic.name')}" maxlength="255"/> + + <s:hidden name="action:categoryAdd!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:textfield name="bean.image" label="%{getText('categoryForm.image')}"/> </s:form> </div> <div class="modal-footer"> + <p id="feedback-area"></p> <button onclick="submitNewCategory()" class="btn btn-primary"> - <s:text name="generic.save" /> + <s:text name="generic.save"/> </button> <button type="button" class="btn" data-dismiss="modal"> - <s:text name="generic.cancel" /> + <s:text name="generic.cancel"/> </button> </div> </div> </div> </div> +--%> <script> - function showCategoryAddModal( postId, postTitle ) { - $('#category-add-modal').modal({show: true}); + + var feedbackArea = $("#feedback-area"); + + function showCategoryAddModal() { + + feedbackAreaEdit.html(""); + $('#category-edit-title').html('<s:text name="categoryForm.add.title" />'); + + $('#categoryEditForm_bean_id').val(""); + $('#categoryEditForm_bean_name').val(""); + $('#categoryEditForm_bean_description').val(""); + $('#categoryEditForm_bean_image').val(""); + + $('#category-edit-modal').modal({show: true}); } + +</script> + + <%-- function submitNewCategory() { // if name is empty reject and show error message - if ( $("#categoryAdd_bean_name").val().trim() == "" ) { - alert("Name is required"); + if ( $("#categoryAddForm_bean_name").val().trim() == "" ) { + feedbackArea.html('<s:text name="categoryForm.requiredFields" />'); + feedbackArea.css("color", "red"); return; } - - // post category via Ajax + + + // post category via AJAX $.ajax({ - url: "categoryAdd!save", + method: 'post', + url: "categoryEdit!save.rol", data: $("#categoryAddForm").serialize(), context: document.body + }).done(function(data) { - alert("Done"); + + // 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 ) { + feedbackArea.css("color", "red"); + feedbackArea.html('<s:text name="categoryForm.error.duplicateName" />'); + + } else { + feedbackArea.css("color", "green"); + feedbackArea.html('<s:text name="categoryForm.created" />'); + $('#category-add-modal').modal("hide"); + } + + }).error(function(data) { + feedbackArea.html('<s:text name="generic.error.check.logs" />'); + feedbackArea.css("color", "red"); }); - - // if post failed, then show error messages - - // else dismiss modal } + </script> +--%> http://git-wip-us.apache.org/repos/asf/roller/blob/5bd3c532/app/src/main/webapp/WEB-INF/jsps/tiles/messages.jsp ---------------------------------------------------------------------- diff --git a/app/src/main/webapp/WEB-INF/jsps/tiles/messages.jsp b/app/src/main/webapp/WEB-INF/jsps/tiles/messages.jsp index 164ca5a..ad2e9c6 100644 --- a/app/src/main/webapp/WEB-INF/jsps/tiles/messages.jsp +++ b/app/src/main/webapp/WEB-INF/jsps/tiles/messages.jsp @@ -39,3 +39,5 @@ </ul> </div> </s:if> + +<!-- ALERT_END: this comment needed for CategoriesSidebar.jsp --> http://git-wip-us.apache.org/repos/asf/roller/blob/5bd3c532/app/src/main/webapp/WEB-INF/jsps/tiles/tiles-simplepage.jsp ---------------------------------------------------------------------- diff --git a/app/src/main/webapp/WEB-INF/jsps/tiles/tiles-simplepage.jsp b/app/src/main/webapp/WEB-INF/jsps/tiles/tiles-simplepage.jsp index 2a0fa41..bbbcc09 100644 --- a/app/src/main/webapp/WEB-INF/jsps/tiles/tiles-simplepage.jsp +++ b/app/src/main/webapp/WEB-INF/jsps/tiles/tiles-simplepage.jsp @@ -34,7 +34,6 @@ <h1 class="roller-page-title"><s:property value="pageTitle"/></h1> <tiles:insertAttribute name="messages"/> - <tiles:insertAttribute name="content"/> </body> http://git-wip-us.apache.org/repos/asf/roller/blob/5bd3c532/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 5168c0e..ea7877d 100644 --- a/app/src/main/webapp/WEB-INF/tiles.xml +++ b/app/src/main/webapp/WEB-INF/tiles.xml @@ -90,6 +90,7 @@ <!-- core pages (and associates) --> <definition name=".Login" extends=".tiles-simplepage" > <put-attribute name="content" value="/WEB-INF/jsps/core/Login.jsp" /> + <put-attribute name="styles" value="/WEB-INF/jsps/core/Login-css.jsp" /> </definition> <definition name=".Register" extends=".tiles-simplepage" > http://git-wip-us.apache.org/repos/asf/roller/blob/5bd3c532/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 bd7b185..a828574 100644 --- a/app/src/main/webapp/roller-ui/styles/roller.css +++ b/app/src/main/webapp/roller-ui/styles/roller.css @@ -37,7 +37,18 @@ table { padding-right: 1em; } -.date-form { margin: 10px; } +.date-form { + margin: 10px; +} + +.fade { + opacity: 0; + -webkit-transition: opacity 1.25s linear; + -moz-transition: opacity 1.25s linear; + -ms-transition: opacity 1.25s linear; + -o-transition: opacity 1.25s linear; + transition: opacity 1.25s linear; +} /* main menu */ @@ -152,6 +163,11 @@ table.innertable tr .viewbody .bot { padding-bottom: 10px; } +/* categories */ + +#feedback-area { + float: left; +} /* sign-in */
