Weekend's worth of work towards converting the Bookmarks page to Bootstrap, 
almost done.


Project: http://git-wip-us.apache.org/repos/asf/roller/repo
Commit: http://git-wip-us.apache.org/repos/asf/roller/commit/81168587
Tree: http://git-wip-us.apache.org/repos/asf/roller/tree/81168587
Diff: http://git-wip-us.apache.org/repos/asf/roller/diff/81168587

Branch: refs/heads/bootstrap-ui
Commit: 81168587872c2f34a0ae8a6ce79ad069ff1b15a7
Parents: 604dba3
Author: Dave Johnson <[email protected]>
Authored: Tue Jan 26 12:22:41 2016 -0500
Committer: Dave Johnson <[email protected]>
Committed: Tue Jan 26 12:22:41 2016 -0500

----------------------------------------------------------------------
 .../weblogger/ui/struts2/editor/Bookmarks.java  |   3 +-
 .../resources/ApplicationResources.properties   |  57 +-
 .../webapp/WEB-INF/jsps/editor/Bookmarks.jsp    | 576 ++++++++++++++++---
 .../WEB-INF/jsps/editor/BookmarksSidebar.jsp    |   8 +-
 .../webapp/WEB-INF/jsps/editor/Categories.jsp   |   2 +
 app/src/main/webapp/WEB-INF/tiles.xml           |   2 +-
 6 files changed, 531 insertions(+), 117 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/roller/blob/81168587/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/Bookmarks.java
----------------------------------------------------------------------
diff --git 
a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/Bookmarks.java
 
b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/Bookmarks.java
index 77b3daa..3b91677 100644
--- 
a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/Bookmarks.java
+++ 
b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/Bookmarks.java
@@ -67,8 +67,7 @@ public class Bookmarks extends UIAction {
 
     public void myPrepare() {
         try {
-            BookmarkManager bmgr = WebloggerFactory.getWeblogger()
-                    .getBookmarkManager();
+            BookmarkManager bmgr = 
WebloggerFactory.getWeblogger().getBookmarkManager();
             if (!StringUtils.isEmpty(getFolderId())) {
                 setFolder(bmgr.getFolder(getFolderId()));
             } else {

http://git-wip-us.apache.org/repos/asf/roller/blob/81168587/app/src/main/resources/ApplicationResources.properties
----------------------------------------------------------------------
diff --git a/app/src/main/resources/ApplicationResources.properties 
b/app/src/main/resources/ApplicationResources.properties
index 250fe3e..cee7e75 100644
--- a/app/src/main/resources/ApplicationResources.properties
+++ b/app/src/main/resources/ApplicationResources.properties
@@ -30,6 +30,7 @@ generic.no=No
 generic.name=Name
 generic.description=Description
 generic.save=Save
+generic.rename=Rename
 generic.edit=Edit
 generic.delete=Delete
 generic.tagline=Tagline
@@ -37,20 +38,23 @@ generic.error.check.logs=System error - check logs for more 
information.
 generic.changes.saved=Changes saved
 generic.toggle=Toggle
 generic.success=Success
+generic.looksGood=Looks good!
 
 # ------------------------------------------------------------- 
BookmarkForm.jsp
 
 bookmarkForm.add.title=Add New Bookmark
-bookmarkForm.add.subtitle=Adding new bookmark in folder [{0}]
+bookmarkForm.add.subtitle=Adding new bookmark in folder:
 bookmarkForm.edit.title=Edit Bookmark
-bookmarkForm.edit.subtitle=Editing bookmark in folder [{0}]
+bookmarkForm.edit.subtitle=Editing bookmark in folder:
 bookmarkForm.image=Image URL
 bookmarkForm.rssUrl=Newsfeed URL
 bookmarkForm.url=Bookmark URL
 bookmarkForm.created=Bookmark "{0}" created
 bookmarkForm.updated=Bookmark "{0}" updated
+bookmarkForm.required=Name and Bookmark URL are required.
+bookmarkForm.badUrls=These URLs are invalid:
 
-bookmarkForm.requiredFields=The {0} and {1} fields are required.
+bookmarkForm.requiredFields=Name and Bookmark URL are required.
 
 # errors from validation
 Bookmark.error.nameNull=Name is a required field
@@ -68,38 +72,39 @@ bookmarkForm.error.duplicateName=Bookmark with that name 
already exists in folde
 bookmarksForm.root=root
 bookmarksForm.rootTitle=Blogroll
 
-bookmarksForm.rootPrompt=\
-This is your blog''s main bookmarks folder. \
-The bookmarks you keep here will appear in the blogroll section of your blog \
-(assuming that you are using one of the default themes). You can create \
-additional bookmark folders, but you will have to add corresponding bookmark 
display \
-macros to your weblog''s templates if you wish to display their contents.
+bookmarksForm.subtitle=Manage blogrolls in weblog <span>{0}</span>
 
-bookmarksForm.subtitle=Manage bookmarks in weblog <span>{0}</span>
+bookmarksForm.rootPrompt=This is your blog''s default blogroll. \
+The links (also known as bookmarks) you keep here will appear in the blogroll 
section of your blog \
+(assuming that you are using one of the default themes). You can create  
additional blogrolls, \
+but you will have to add corresponding blogroll display macros to your 
weblog''s templates \
+if you wish to display their contents.
 
-bookmarksForm.addBookmark=Add Bookmark
-bookmarksForm.addFolder=New Bookmark Folder
+bookmarksForm.path=Blogroll
+bookmarksForm.blogrollName=Blogroll name
+bookmarksForm.switchTo=Switch to blogroll
+bookmarksForm.deleteFolder=Delete current blogroll
+
+bookmarksForm.addBookmark=Add blogroll link
+bookmarksForm.addFolder=New blogroll
 bookmarksForm.delete=Delete selected
-bookmarksForm.delete.confirm=Delete selected bookmarks?
-bookmarksForm.deleteFolder.confirm=Delete entire folder including all its 
bookmarks?
+bookmarksForm.delete.confirm=Delete selected blogroll links?
+bookmarksForm.deleteFolder.confirm=Delete entire blogroll including all its 
links?
 bookmarksForm.url=URL
 bookmarksForm.feedurl=Newsfeed URL
-bookmarksForm.folder=Bookmark Folder
-bookmarksForm.deleteFolder=Delete folder
-bookmarksForm.viewFolder=Switch to Folder
-bookmarksForm.edit.tip=Click to modify this bookmark
-bookmarksForm.folder.edit.tip=Click to edit folder
-bookmarksForm.move=Move selected to:
-bookmarksForm.move.confirm=Move selected bookmarks?
-bookmarksForm.path=Folder
-bookmarksForm.selectAllLabel=Select all bookmarks
-bookmarksForm.selectOneLabel=Select bookmark named {0}
+bookmarksForm.folder=Blogroll
+bookmarksForm.edit.tip=Click to modify this link
+bookmarksForm.folder.edit.tip=Click to edit blogroll
+bookmarksForm.move=Move selected to
+bookmarksForm.move.confirm=Move selected link?
+bookmarksForm.selectAllLabel=Select all links
+bookmarksForm.selectOneLabel=Select blogroll named {0}
 bookmarksForm.visitLink=Visit
 bookmarksForm.visitLink.tip=Click to visit this site
 
 bookmarksForm.error.move=Error performing move, parent to child moves not 
allowed
-bookmarksForm.importBookmarks=Import bookmarks via OPML
-bookmarksForm.noresults=There are currently no folders or bookmarks
+bookmarksForm.importBookmarks=Import Blogroll via OPML
+bookmarksForm.noresults=There are currently no Blogroll links
 
 # --------------------------------------------------------- Bookmarks 
import.jsp
 

http://git-wip-us.apache.org/repos/asf/roller/blob/81168587/app/src/main/webapp/WEB-INF/jsps/editor/Bookmarks.jsp
----------------------------------------------------------------------
diff --git a/app/src/main/webapp/WEB-INF/jsps/editor/Bookmarks.jsp 
b/app/src/main/webapp/WEB-INF/jsps/editor/Bookmarks.jsp
index 4e55680..f569c98 100644
--- a/app/src/main/webapp/WEB-INF/jsps/editor/Bookmarks.jsp
+++ b/app/src/main/webapp/WEB-INF/jsps/editor/Bookmarks.jsp
@@ -17,82 +17,106 @@
 --%>
 <%@ include file="/WEB-INF/jsps/taglibs-struts2.jsp" %>
 
-<%-- JavaScript for bookmarks table --%>
-<script>
-function onDelete() {
-    if ( confirm("<s:text name='bookmarksForm.delete.confirm' />") ) {
-        document.bookmarks.submit();
-    }
-}
 
-function onDeleteFolder() {
-    if ( confirm("<s:text name='bookmarksForm.deleteFolder.confirm' />") ) {
-        document.bookmarks.action='<s:url action="bookmarks!deleteFolder" />';
-        document.bookmarks.submit();
-    }
-}
+<%--
+Blogroll link management
 
-function onMove() {
-    if ( confirm("<s:text name='bookmarksForm.move.confirm' />") ) {
-        document.bookmarks.action='<s:url action="bookmarks!move" />';
-        document.bookmarks.submit();
-    }
-}
-</script>
+We used to call them Bookmarks and Folders, now we call them blogroll links 
and blogrolls.
+--%>
+
+<%-- 
================================================================================================
 --%>
+
+<%-- Main blogroll/folder management interface, a checkbox-table with some 
buttons  --%>
+
+<p class="subtitle"> <s:text name="bookmarksForm.subtitle" > <s:param 
value="weblog" /> </s:text> </p>
 
 <s:if test="folder.name == 'default'">
-    <p class="subtitle">
-        <s:text name="bookmarksForm.subtitle" >
-            <s:param value="weblog" />
-        </s:text>
-    </p>  
-    <p class="pagetip">
-        <s:text name="bookmarksForm.rootPrompt" />
-    </p>
+    <p class="pagetip"> <s:text name="bookmarksForm.rootPrompt" /> </p>
 </s:if>
-<s:else>
-    <p class="subtitle">
-    <s:text name="bookmarksForm.path" />: <s:text name="%{folder.name}" />
-    <s:url var="editUrl" action="folderEdit">
-        <s:param name="weblog" value="%{actionWeblog.handle}" />
-        <s:param name="bean.id" value="%{folder.id}" />
-        <s:param name="folderId" value="%{folder.id}" />
-    </s:url>
-    <s:a href="%{editUrl}"> <span class="glyphicon 
glyphicon-play-circle"></span> </s:a>
-</s:else>
-
-<%-- Form is a table of folders followed by bookmarks, each with checkbox --%>
+
+
+<%-- table of blogroll links with selection checkboxes, wrapped in a form --%>
+
 <s:form action="bookmarks!delete" theme="bootstrap" cssClass="form-horizontal">
        <s:hidden name="salt" />
     <s:hidden name="weblog" />
-    <s:hidden name="folderId" /> 
-    
+    <s:hidden name="folderId" />
+
+    <%-- for default blogroll, show page "tip" and read-only folder name --%>
+
+    <s:if test="folder.name == 'default'">
+
+        <div class="form-group ">
+            <label class="col-sm-3 control-label" for="bookmarks_folder_name">
+                <s:text name="bookmarksForm.blogrollName"/>
+            </label>
+            <div class="col-sm-9 controls">
+                <div class="form-control"> <s:text name="%{folder.name}"/> 
</div>
+            </div>
+        </div>
+
+    </s:if>
+
+    <s:if test="folder.name != 'default'">
+
+        <%-- Blogroll / Folder Name --%>
+
+        <%-- for other blogrolls, show textarea so user can rename it --%>
+        <%-- don't use Struts tags here so button can be on same line as text 
input --%>
+
+        <div class="form-group ">
+            <label class="col-sm-3 control-label" for="bookmarks_folder_name">
+                <s:text name="bookmarksForm.blogrollName"/>
+            </label>
+            <div class="col-sm-9 controls">
+                <input style="width:55%; float:left" type="text" 
name="folder.name"
+                       value="<s:text name='%{folder.name}'/>" 
id="bookmarks_folder_name" class="form-control"
+                       onchange="nameChanged()"
+                       onkeyup="nameChanged()" />
+                <button type="button" id="rename_button"
+                        class="btn btn-success" style="float:left; 
margin-left:1em;"
+                        onclick="renameFolder(); return false;"
+                        onsubmit="return false;" >
+                    <s:text name="generic.rename"/>
+                </button>
+                <button type="button" id="rename_cancel"
+                        class="btn btn-default" style="float:left; 
margin-left:1em;"
+                        onclick="cancelRenameFolder(); return false;"
+                        onsubmit="return false;" >
+                    <s:text name="generic.cancel"/>
+                </button>
+            </div>
+        </div>
+
+    </s:if>
+
     <s:if test="!allFolders.isEmpty">
-        <%-- View button --%>
-        <s:submit type="button" action="bookmarks!view" 
key="bookmarksForm.viewFolder" />
 
-        <%-- Folder to View combo-box --%>
-        <s:select name="viewFolderId" list="allFolders" listKey="id" 
listValue="name" onchange="" />
+        <%-- allow user to select the bookmark folder to view --%>
+        <s:select name="viewFolderId" list="allFolders" listKey="id" 
listValue="name"
+                 label="%{getText('bookmarksForm.switchTo')}" 
onchange="changeFolder()" />
 
-        <br /><br />
     </s:if>
+
     <table class="rollertable table table-striped">
 
         <tr class="rHeaderTr">
             <th width="5%">
-                <input name="control" type="checkbox" 
onclick="toggleFunctionAll(this.checked);"
+                <input name="control" type="checkbox"
+                       onclick="toggleFunctionAll(this.checked); 
selectionChanged()"
                 title="<s:text name="bookmarksForm.selectAllLabel"/>"/>
             </th>
             <th class="rollertable" width="25%"><s:text name="generic.name" 
/></th>
-            <th class="rollertable" width="25%"><s:text 
name="bookmarksForm.url" /></th>
+            <th class="rollertable" width="70%"><s:text 
name="bookmarksForm.url" /></th>
             <th class="rollertable" width="5%"><s:text name="generic.edit" 
/></th>
-            <th class="rollertable" width="5%"><s:text 
name="bookmarksForm.visitLink" /></th>
         </tr>
         
         <s:if test="folder.bookmarks.size > 0">
         
-        <%-- Bookmarks --%>
+        <%-- Blogroll links --%>
+
         <s:iterator id="bookmark" value="folder.bookmarks" status="rowstatus">
+
             <s:if test="#rowstatus.odd == true">
                 <tr class="rollertable_odd">
             </s:if>
@@ -101,17 +125,27 @@ function onMove() {
             </s:else>
                 
                 <td class="rollertable center" style="vertical-align:middle">
-                    <input type="checkbox" name="selectedBookmarks"
-                    title="<s:text 
name="bookmarksForm.selectOneLabel"><s:param value="#bookmark.name"/></s:text>"
-                    value="<s:property value="#bookmark.id"/>" />
+                    <input type="checkbox" name="selectedBookmarks" 
onchange="selectionChanged()"
+                        title="<s:text 
name="bookmarksForm.selectOneLabel"><s:param value="#bookmark.name"/></s:text>"
+                        value="<s:property value="#bookmark.id"/>" />
                 </td>
                 
                 <td>
-                    <str:truncateNicely lower="25" upper="30" ><s:property 
value="#bookmark.name" /></str:truncateNicely>
+                    <str:truncateNicely lower="40" upper="50" >
+                        <s:property value="#bookmark.name" />
+                    </str:truncateNicely>
                 </td>
                 
                 <td>
-                    <str:truncateNicely lower="40" upper="50" ><s:property 
value="#bookmark.url" /></str:truncateNicely>
+                    <s:if test="#bookmark.url != null" >
+                        <a href='<s:property value="#bookmark.url" />' 
target='_blank' >
+                            <str:truncateNicely lower="70" upper="90" >
+                                <s:property value="#bookmark.url" />
+                            </str:truncateNicely>
+                            <span class="glyphicon 
glyphicon-play-circle"></span>
+                        </a>
+                    </s:if>
+
                 </td>
                 
                 <td align="center">
@@ -123,45 +157,419 @@ function onMove() {
                     <s:a href="%{editUrl}"> <span class="glyphicon 
glyphicon-edit"></span> </s:a>
                 </td>
                 
-                <td align="center">
-                    <s:if test="#bookmark.url != null" >
-                        <a href="<s:property value="#bookmark.url" />">
-                            <span class="glyphicon 
glyphicon-play-circle"></span>
-                        </a>
-                    </s:if>
-                </td>
-                
             </tr>
+
         </s:iterator>
         
         </s:if>
+
         <s:else>
             <tr>
-                <td style="vertical-align:middle" colspan="7"><s:text 
name="bookmarksForm.noresults" /></td>
+                <td style="vertical-align:middle; padding-top: 1em;" 
colspan="7">
+                    <s:text name="bookmarksForm.noresults" />
+                </td>
             </tr>
         </s:else>
+
     </table>
-    
-    <div class="control clearfix">
-        <s:if test="folder.bookmarks.size > 0">
-                <%-- Delete-selected button --%>
-                <input type="button" value="<s:text 
name="bookmarksForm.delete"/>" onclick="onDelete();return false;" />
-        </s:if>
 
-        <s:if test="!allFolders.isEmpty && folder.bookmarks.size > 0">
-            <%-- Move-selected button --%>
-            <s:submit value="%{getText('bookmarksForm.move')}" 
action="bookmarks!move" onclick="onMove();return false;" />
+    <%-- Add new blogroll link --%>
+    <button type="button"
+            class="btn btn-success" style="float:left; margin-right: 0.5em"
+            onclick="addBookmark();return false;">
+        <s:text name="bookmarksForm.addBookmark"/>
+    </button>
 
-            <%-- Move-to combo-box --%>
-            <s:select name="targetFolderId" list="allFolders" listKey="id" 
listValue="name" />
-        </s:if>
+    <s:if test="folder.bookmarks.size > 0">
 
-        <s:if test="folder.name != 'default'">
-            <span style="float:right">
-                <s:submit value="%{getText('bookmarksForm.deleteFolder')}"
-                          action="bookmarks!deleteFolder" 
onclick="onDeleteFolder();return false;"/>
-            </span>
-        </s:if>
-    </div>
+        <%-- Delete-selected button --%>
+        <input id="delete_selected"
+            value="<s:text name="bookmarksForm.delete"/>"
+            type="button" class="btn btn-danger" style="float:right; 
margin-right: 0.5em"
+            onclick="deleteFolder();return false;"/>
+
+    </s:if>
+
+    <s:if test="!allFolders.isEmpty && folder.bookmarks.size > 0">
+
+        <%-- Move-to combo-box --%>
+        <s:select name="targetFolderId"
+            theme="simple" cssClass="form-control" cssStyle="float:right; 
width:30%; margin-right: 5em"
+            list="allFolders" listKey="id" listValue="name"/>
+
+        <%-- Move-selected button --%>
+        <s:submit id="move_selected"
+            value="%{getText('bookmarksForm.move')}"
+            theme="simple" cssClass="btn btn-warning" cssStyle="float:right; 
margin-right: 0.5em"
+            action="bookmarks!move"
+            onclick="onMoveToFolder();return false;"/>
+
+    </s:if>
+
+    <s:if test="folder.name != 'default'">
+
+        <%-- Delete the whole blogroll --%>
+
+        <s:submit value="%{getText('bookmarksForm.deleteFolder')}"
+            theme="simple" cssClass="btn btn-danger" cssStyle="float:right; 
clear:left; margin-top:2em"
+            action="bookmarks!deleteFolder"
+            onclick="deleteFolder();return false;"/>
+
+    </s:if>
+
+</s:form>
+
+
+<%-- -------------------------------------------------------- --%>
+
+<%-- JavaScript for Main blogroll/folder management interface --%>
+
+<script>
+
+    var originalName;
+    var renameButton;
+    var renameCancel;
+    var deleteSelectedButton;
+    var moveSelectedButton;
+    var moveToSelector;
+
+    $( document ).ready(function() {
+
+        originalName = $("#bookmarks_folder_name:first").val();
+
+        if ( !originalName ) {
+            originalName = 'default';
+        }
+
+        renameButton         = $("#rename_button:first");
+        renameCancel         = $("#rename_cancel:first");
+        deleteSelectedButton = $("#delete_selected:first");
+        moveSelectedButton   = $("#move_selected:first");
+        moveToSelector       = $("#bookmarks_targetFolderId:first");
+
+        nameChanged();
+        selectionChanged();
+    });
+
+    function nameChanged() {
+        var newName = $("#bookmarks_folder_name:first").val();
+        if ( newName != originalName ) {
+            renameButton.attr("disabled", false );
+            renameButton.addClass("btn-success");
+
+            renameCancel.attr("disabled", false );
+
+        } else {
+            renameButton.attr("disabled", true );
+            renameButton.removeClass("btn-success");
+
+            renameCancel.attr("disabled", true );
+        }
+    }
+
+    function selectionChanged() {
+        var checked = false;
+        var selected = $("[name=selectedBookmarks]");
+        for ( i in selected ) {
+            if ( selected[i].checked ) {
+                checked = true;
+                break;
+            }
+        }
+        if ( checked ) {
+            deleteSelectedButton.attr("disabled", false );
+            deleteSelectedButton.addClass("btn-danger");
+
+            moveSelectedButton.attr("disabled", false );
+            moveSelectedButton.addClass("btn-warning");
+
+        } else {
+            deleteSelectedButton.attr("disabled", true );
+            deleteSelectedButton.removeClass("btn-danger");
 
+            moveSelectedButton.attr("disabled", true );
+            moveSelectedButton.removeClass("btn-warning");
+
+            moveToSelector.attr("disabled", true)
+        }
+    }
+
+    function renameFolder( event ) {
+        event.preventDefault();
+        alert("renameFolder");
+    }
+
+    function cancelRenameFolder( event ) {
+        $("#bookmarks_folder_name:first").val( originalName );
+        nameChanged();
+    }
+
+    function confirmDelete() {
+        if (confirm("<s:text name='bookmarksForm.delete.confirm' />")) {
+            document.bookmarks.submit();
+        }
+    }
+
+    function deleteFolder() {
+        if (confirm("<s:text name='bookmarksForm.deleteFolder.confirm' />")) {
+            document.bookmarks.action = '<s:url 
action="bookmarks!deleteFolder" />';
+            document.bookmarks.submit();
+        }
+    }
+
+    function onMoveToFolder() {
+        if (confirm("<s:text name='bookmarksForm.move.confirm' />")) {
+            document.bookmarks.action = '<s:url action="bookmarks!move" />';
+            document.bookmarks.submit();
+        }
+    }
+
+    function changeFolder() {
+        // user changed the blogroll/folder, post to "view" action to get new 
page
+        var bookmarksForm = $("#bookmarks")[0];
+        bookmarksForm.action = "bookmarks!view.rol";
+        bookmarksForm.submit();
+    }
+
+</script>
+
+
+<%-- 
================================================================================================
 --%>
+
+<%-- add/edit blogroll / folder form --%>
+
+<s:form name="folderEdit" cssStyle="display:none" theme="bootstrap" 
cssClass="form-horizontal">
+    <s:hidden name="salt" />
+    <s:hidden name="weblog" />
+    <s:hidden name="bean.id" />
+    <s:textfield name="bean.name" size="70" maxlength="255" />
+    <s:submit value="%{getText('generic.save')}" action="%{#mainAction}!save"/>
+    <s:submit value="%{getText('generic.cancel')}" action="folderEdit!cancel" 
/>
 </s:form>
+
+
+<%-- 
================================================================================================
 --%>
+
+<%-- add/edit blogroll link form: a modal --%>
+
+<div id="addedit-bookmark-modal" class="modal fade addedit-bookmark-modal" 
tabindex="-1" role="dialog">
+
+    <div class="modal-dialog modal-lg">
+
+        <div class="modal-content">
+
+            <div class="modal-header">
+
+                <%-- Titling, processing actions different between add and 
edit --%>
+                <s:if test="actionName == 'bookmarkEdit'">
+                    <s:set var="subtitleKey">bookmarkForm.edit.subtitle</s:set>
+                    <s:set var="mainAction">bookmarkEdit</s:set>
+                </s:if>
+                <s:else>
+                    <s:set var="subtitleKey">bookmarkForm.add.subtitle</s:set>
+                    <s:set var="mainAction">bookmarkAdd</s:set>
+                </s:else>
+
+                <h3>
+                    <s:text name="%{#subtitleKey}" > </s:text> <span 
id="subtitle_folder_name"></span>
+                </h3>
+
+                <div id="bookmark_required_fields" role="alert" class="alert">
+                    <s:text name="bookmarkForm.requiredFields" />
+                </div>
+
+            </div> <%-- modal header --%>
+
+            <s:form action="bookmark" theme="bootstrap" 
cssClass="form-horizontal">
+                <s:hidden name="salt" />
+                <s:hidden name="weblog" />
+                <%--
+                    Edit action uses folderId for redirection back to proper 
bookmarks folder on cancel
+                    (as configured in struts.xml); add action also, plus to 
know which folder to put new
+                    bookmark in.
+                --%>
+                <s:hidden name="folderId" />
+                <s:if test="actionName == 'bookmarkEdit'">
+                    <%-- bean for bookmark add does not have a bean id yet --%>
+                    <s:hidden name="bean.id" />
+                </s:if>
+
+                <div class="modal-body">
+
+                    <s:textfield name="bean.name" maxlength="255"
+                                 onchange="onBookmarkFormChanged()"
+                                 onkeyup ="onBookmarkFormChanged()"
+                                 label="%{getText('generic.name')}" />
+
+                    <s:textfield name="bean.url" maxlength="255"
+                                 onchange="onBookmarkFormChanged()"
+                                 onkeyup ="onBookmarkFormChanged()"
+                                 label="%{getText('bookmarkForm.url')}" />
+
+                    <s:textfield name="bean.feedUrl" maxlength="255"
+                                 onchange="onBookmarkFormChanged()"
+                                 onkeyup ="onBookmarkFormChanged()"
+                                 label="%{getText('bookmarkForm.rssUrl')}" />
+
+                    <s:textfield name="bean.description" maxlength="255"
+                                 onchange="onBookmarkFormChanged()"
+                                 onkeyup ="onBookmarkFormChanged()"
+                                 label="%{getText('generic.description')}" />
+
+                    <s:textfield name="bean.image" maxlength="255"
+                                 onchange="onBookmarkFormChanged()"
+                                 onkeyup ="onBookmarkFormChanged()"
+                                 label="%{getText('bookmarkForm.image')}" />
+                </div>
+
+                <div class="modal-body">
+                    <div class="modal-footer">
+                        <p id="feedback-area-edit"></p>
+                        <button type="button" id="save_bookmark" 
onclick="saveBookmark()" 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>
+
+            </s:form>
+
+        </div> <%-- modal content --%>
+
+    </div> <%-- modal dialog --%>
+
+</div> <%-- modal --%>
+
+
+<%-- ---------------------------------------------------- --%>
+
+<%-- JavaScript for add/edit blogroll link modal --%>
+
+<script>
+
+    function addBookmark() {
+
+        var saveBookmarkButton = $('#save_bookmark:first');
+        saveBookmarkButton.attr("disabled", true );
+
+        var elem = $('#bookmark_required_fields:first');
+        elem.html('<s:text name="bookmarkForm.requiredFields" />');
+        elem.removeClass("alert-success");
+        elem.removeClass("alert-danger");
+        elem.addClass("alert-info");
+
+        $('#bookmark_bean_name:first').val('');
+        $('#bookmark_bean_url:first').val('');
+        $('#bookmark_bean_image:first').val('');
+        $('#bookmark_bean_feedUrl:first').val('');
+
+        $('#subtitle_folder_name:first').html(originalName);
+
+        $('#addedit-bookmark-modal').modal({show: true});
+    }
+
+    function onBookmarkFormChanged() {
+
+        var saveBookmarkButton = $('#save_bookmark:first');
+
+        var name    = $('#bookmark_bean_name:first').val().trim();
+        var url     = $('#bookmark_bean_url:first').val().trim();
+        var image   = $('#bookmark_bean_image:first').val().trim();
+        var feedUrl = $('#bookmark_bean_feedUrl:first').val().trim();
+
+        var badUrls = [];
+
+        if ( url.length > 0 ) {
+            if ( !isValidUrl(url) ) {
+                badUrls.push("Bookmark URL")
+            }
+        }
+
+        if ( image.length > 0 ) {
+            if ( !isValidUrl(image) ) {
+                badUrls.push("Image URL")
+            }
+        }
+
+        if ( feedUrl.length > 0 ) {
+            if ( !isValidUrl(feedUrl) ) {
+                badUrls.push("Newsfeed URL")
+            }
+        }
+
+        var elem = $('#bookmark_required_fields:first');
+        var message = '';
+
+        if ( name.length > 0 && url.length > 0 && badUrls.length == 0 ) {
+            saveBookmarkButton.attr("disabled", false);
+
+            message = '<s:text name="generic.looksGood" />';
+            elem.removeClass("alert-info");
+            elem.removeClass("alert-danger");
+            elem.addClass("alert-success");
+            elem.html(message);
+
+        } else {
+            saveBookmarkButton.attr("disabled", true);
+
+            if ( name.length == 0 || url.length == 0 ) {
+                message = '<s:text name="bookmarkForm.required" />';
+            }
+            if ( badUrls.length > 0 ) {
+                message = '<s:text name="bookmarkForm.badUrls" />';
+                var sep = " ";
+                for ( i in badUrls ) {
+                    message = message + sep + badUrls[i];
+                    sep  = ", ";
+                }
+            }
+            elem.removeClass("alert-info");
+            elem.removeClass("alert-success");
+            elem.addClass("alert-danger");
+            elem.html(message);
+        }
+    }
+
+    function isValidUrl( url ) {
+        
if(/^(http|https|ftp):\/\/[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,5}(:[0-9]{1,5})?(\/.*)?$/i.test(url))
 {
+            return true;
+        } else {
+            return false;
+        }
+    }
+
+    function saveBookmark() {
+
+        var feedbackAreaEdit = $("#feedback-area-edit");
+
+        // post bookmark via AJAX
+        $.ajax({
+            method: 'post',
+            url: "bookmarkEdit!save.rol",
+            data: $("#bookmark").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="bookmarkForm.error.duplicateName" 
/>') < alertEnd) {
+                feedbackAreaEdit.css("color", "red");
+                feedbackAreaEdit.html('<s:text 
name="bookmarkForm.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>

http://git-wip-us.apache.org/repos/asf/roller/blob/81168587/app/src/main/webapp/WEB-INF/jsps/editor/BookmarksSidebar.jsp
----------------------------------------------------------------------
diff --git a/app/src/main/webapp/WEB-INF/jsps/editor/BookmarksSidebar.jsp 
b/app/src/main/webapp/WEB-INF/jsps/editor/BookmarksSidebar.jsp
index 7d3986d..f75ccb4 100644
--- a/app/src/main/webapp/WEB-INF/jsps/editor/BookmarksSidebar.jsp
+++ b/app/src/main/webapp/WEB-INF/jsps/editor/BookmarksSidebar.jsp
@@ -22,10 +22,10 @@
         <div class="menu-tl">
             
             <div class="sidebarInner">
-                
+
                 <h3><s:text name="mainPage.actions" /></h3>
                 <hr size="1" noshade="noshade" />
-                
+
                 <p>
                     <%-- Add Bookmark link --%>
                     <img src='<s:url value="/images/link_add.png"/>' 
border="0"alt="icon" />
@@ -35,7 +35,7 @@
                     </s:url>
                     <s:a href="%{addBookmark}"><s:text 
name="bookmarksForm.addBookmark" /></s:a>
                 </p>
-                
+
                 <p>
                     <%-- Add Folder link --%>
                     <img src='<s:url value="/images/folder_add.png"/>' 
border="0"alt="icon" />
@@ -45,7 +45,7 @@
                     </s:url>
                     <s:a href="%{addFolder}"><s:text 
name="bookmarksForm.addFolder" /></s:a>
                 </p>
-                
+
                 <%-- Import bookmarks --%>
                 <p>
                     <img src='<s:url value="/images/link_add.png"/>' 
border="0"alt="icon" />

http://git-wip-us.apache.org/repos/asf/roller/blob/81168587/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 d00b6fe..ad6fb62 100644
--- a/app/src/main/webapp/WEB-INF/jsps/editor/Categories.jsp
+++ b/app/src/main/webapp/WEB-INF/jsps/editor/Categories.jsp
@@ -249,6 +249,7 @@
 </div>
 
 <script>
+
     function showCategoryDeleteModal( id, name, inUse ) {
         $('#categoryRemove_removeId').val(id);
         $('#categoryEdit_bean_name').val(name);
@@ -262,4 +263,5 @@
         }
         $('#delete-category-modal').modal({show: true});
     }
+
 </script>

http://git-wip-us.apache.org/repos/asf/roller/blob/81168587/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 ea7877d..c9ef523 100644
--- a/app/src/main/webapp/WEB-INF/tiles.xml
+++ b/app/src/main/webapp/WEB-INF/tiles.xml
@@ -324,7 +324,7 @@
     
     <definition name=".Bookmarks" extends=".tiles-tabbedpage" >
         <put-attribute name="content" 
value="/WEB-INF/jsps/editor/Bookmarks.jsp" />
-        <put-attribute name="sidebar" 
value="/WEB-INF/jsps/editor/BookmarksSidebar.jsp" />
+        <put-attribute name="sidebar" value="/WEB-INF/jsps/tiles/empty.jsp" />
         <put-attribute name="styles" value="/WEB-INF/jsps/tiles/empty.jsp" />
     </definition>
     

Reply via email to