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>
