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 */
 

Reply via email to