Converted Ping Target management pages to Struts Bootstrap.
diff --git a/app/src/main/resources/struts.xml b/app/src/main/resources/struts.xml
index 8ab6f6a..3f302f1 100644
--- a/app/src/main/resources/struts.xml
+++ b/app/src/main/resources/struts.xml
@@ -569,29 +569,7 @@
<result name="list" type="chain">templates</result>
<result name="input" type="tiles">.TemplateEdit</result>
</action>
-
- <action name="templateRemove"
- class="org.apache.roller.weblogger.ui.struts2.editor.TemplateRemove">
- <result name="confirm" type="tiles">.TemplateRemove</result>
- <result name="cancel" type="redirectAction">
- <param name="actionName">templates</param>
- <param name="weblog">${weblog}</param>
- </result>
- <result name="success" type="chain">templates</result>
- </action>
-
- <action name="templatesRemove"
- class="org.apache.roller.weblogger.ui.struts2.editor.TemplatesRemove">
- <result name="input" type="tiles">.TemplatesRemove</result>
- <result name="confirm" type="tiles">.TemplatesRemove</result>
- <result name="success" type="chain">templates</result>
- <result name="cancel" type="redirectAction">
- <param name="actionName">templates</param>
- <param name="weblog">${weblog}</param>
- </result>
- <result name="error" type="chain">templates</result>
- </action>
-
+
<action name="members"
class="org.apache.roller.weblogger.ui.struts2.editor.Members">
<result name="list" type="tiles">.Members</result>
diff --git a/app/src/main/webapp/WEB-INF/jsps/admin/PingTargetEdit.jsp b/app/src/main/webapp/WEB-INF/jsps/admin/PingTargetEdit.jsp
index be84eb7..48ee4ef 100644
--- a/app/src/main/webapp/WEB-INF/jsps/admin/PingTargetEdit.jsp
+++ b/app/src/main/webapp/WEB-INF/jsps/admin/PingTargetEdit.jsp
@@ -27,33 +27,52 @@
<s:set var="subtitleKey">pingTargetAdd.subtitle</s:set>
</s:else>
-<p class="subtitle">
-<s:text name="%{#subtitleKey}"/>
-</p>
+<p class="subtitle"> <s:text name="%{#subtitleKey}"/> </p>
-<s:form>
- <s:hidden name="salt" />
- <s:if test="actionName == 'commonPingTargetEdit'">
- <%-- bean for add does not have a bean id yet --%>
- <s:hidden name="bean.id" />
- </s:if>
+<s:form theme="bootstrap" cssClass="form-horizontal">
+ <s:hidden name="salt"/>
- <div class="formrow">
- <label for="name" class="formrow"><s:text name="generic.name" /></label>
- <s:textfield name="bean.name" size="30" maxlength="30" style="width:50%"/>
- </div>
+ <s:if test="actionName == 'commonPingTargetEdit'"> <s:hidden name="bean.id"/> </s:if>
- <div class="formrow">
- <label for="pingUrl" class="formrow"><s:text name="pingTarget.pingUrl" /></label>
- <s:textfield name="bean.pingUrl" size="100" maxlength="255" style="width:50%"/>
- </div>
+ <s:textfield name="bean.name" size="30" maxlength="30" style="width:50%"
+ onchange="validate()" onkeyup="validate()"
+ label="%{getText('generic.name')}" />
- <p/>
+ <s:textfield name="bean.pingUrl" size="100" maxlength="255" style="width:50%"
+ onchange="validate()" onkeyup="validate()"
+ label="%{getText('pingTarget.pingUrl')}" />
- <div class="formrow">
- <label for="" class="formrow"> </label>
- <s:submit value="%{getText('generic.save')}" action="%{#mainAction}!save"/>
- <s:submit value="%{getText('generic.cancel')}" action="commonPingTargets" />
- </div>
+ <s:submit id="save-button" cssClass="btn btn-default"
+ value="%{getText('generic.save')}" action="%{#mainAction}!save"/>
+
+ <s:submit cssClass="btn" value="%{getText('generic.cancel')}" action="commonPingTargets"/>
</s:form>
+
+<script type="application/javascript">
+
+ function validate() {
+ var savePingTargetButton = $('#save-button:first');
+ var name = $('#commonPingTargetAdd_bean_name:first').val().trim();
+ var url = $('#commonPingTargetAdd_bean_pingUrl:first').val().trim();
+ if ( name.length > 0 && url.length > 0 && isValidUrl(url) ) {
+ savePingTargetButton.attr("disabled", false);
+ } else {
+ savePingTargetButton.attr("disabled", true);
+ }
+ }
+
+ 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;
+ }
+ }
+
+ $( document ).ready(function() {
+ var savePingTargetButton = $('#save-button:first');
+ savePingTargetButton.attr("disabled", true);
+ });
+
+</script>
diff --git a/app/src/main/webapp/WEB-INF/jsps/admin/PingTargetRemove.jsp b/app/src/main/webapp/WEB-INF/jsps/admin/PingTargetRemove.jsp
deleted file mode 100644
index 93fb9b7..0000000
--- a/app/src/main/webapp/WEB-INF/jsps/admin/PingTargetRemove.jsp
+++ /dev/null
@@ -1,42 +0,0 @@
-<%--
- 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.
---%>
-<%@ include file="/WEB-INF/jsps/taglibs-struts2.jsp" %>
-
-<h2>
- <s:text name="pingTarget.confirmRemoveTitle"/>
-</h2>
-
-<p/>
-<s:text name="pingTarget.confirmCommonRemove" />
-<p/>
-
-<table>
- <tr><td><s:text name="generic.name" /> </td><td><b><s:property value="pingTarget.name" /></b></td></tr>
- <tr><td><s:text name="pingTarget.pingUrl" /> </td><td><b><s:property value="pingTarget.pingUrl" /></b></td></tr>
-</table>
-
-<br/>
-
-<div class="control">
- <s:form>
- <s:hidden name="salt" />
- <s:hidden name="pingTargetId" />
- <s:submit value="%{getText('generic.yes')}" action="commonPingTargets!delete"/>
- <s:submit value="%{getText('generic.cancel')}" action="commonPingTargets"/>
- </s:form>
-</div>
diff --git a/app/src/main/webapp/WEB-INF/jsps/admin/PingTargets.jsp b/app/src/main/webapp/WEB-INF/jsps/admin/PingTargets.jsp
index 94c20f6..d0e1892 100644
--- a/app/src/main/webapp/WEB-INF/jsps/admin/PingTargets.jsp
+++ b/app/src/main/webapp/WEB-INF/jsps/admin/PingTargets.jsp
@@ -17,89 +17,131 @@
--%>
<%@ include file="/WEB-INF/jsps/taglibs-struts2.jsp" %>
-<p class="subtitle">
- <s:text name="commonPingTargets.subtitle" />
-</p>
+<p class="subtitle"><s:text name="commonPingTargets.subtitle"/></p>
-<p/><s:text name="commonPingTargets.explanation"/><p/>
+<p><s:text name="commonPingTargets.explanation"/></p>
-<table class="rollertable">
+<table class="rollertable table table-striped">
-<%-- Headings --%>
-<tr class="rollertable">
- <th class="rollertable" width="20%%"><s:text name="generic.name" /></th>
- <th class="rollertable" width="55%"><s:text name="pingTarget.pingUrl" /></th>
- <th class="rollertable" width="15%" colspan="2"><s:text name="pingTarget.autoEnabled" /></th>
- <th class="rollertable" width="5%"><s:text name="generic.edit" /></th>
- <th class="rollertable" width="5%"><s:text name="pingTarget.remove" /></th>
-</tr>
-
-<%-- Listing of current common targets --%>
-<s:iterator var="pingTarget" value="pingTargets" status="rowstatus">
-
- <s:if test="#rowstatus.odd == true">
- <tr class="rollertable_odd">
- </s:if>
- <s:else>
- <tr class="rollertable_even">
- </s:else>
-
- <td class="rollertable"><s:property value="#pingTarget.name" /></td>
-
- <td class="rollertable"><s:property value="#pingTarget.pingUrl" /></td>
-
- <!-- TODO: Use icons here -->
- <td class="rollertable" align="center" >
- <s:if test="#pingTarget.autoEnabled">
- <span style="color: #00aa00; font-weight: bold;"><s:text name="pingTarget.enabled"/></span>
- </s:if>
- <s:else>
- <span style="color: #aaaaaa; font-weight: bold;"><s:text name="pingTarget.disabled"/></span>
- </s:else>
- </td>
-
- <!-- TODO: Use icons here -->
- <td class="rollertable" align="center" >
- <s:if test="#pingTarget.autoEnabled">
- <s:url var="disablePing" action="commonPingTargets!disable">
- <s:param name="pingTargetId" value="#pingTarget.id" />
- </s:url>
- <s:a href="%{disablePing}"><s:text name="pingTarget.disable"/></s:a>
- </s:if>
- <s:else>
- <s:url var="enablePing" action="commonPingTargets!enable">
- <s:param name="pingTargetId" value="#pingTarget.id" />
- </s:url>
- <s:a href="%{enablePing}"><s:text name="pingTarget.enable"/></s:a>
- </s:else>
- </td>
-
- <td class="rollertable" align="center">
- <s:url var="editPing" action="commonPingTargetEdit">
- <s:param name="bean.id" value="#pingTarget.id" />
- </s:url>
- <s:a href="%{editPing}">
- <img src='<c:url value="/images/page_white_edit.png"/>' border="0" alt="<s:text name="generic.edit" />" />
- </s:a>
- </td>
-
- <td class="rollertable" align="center">
- <s:url var="removePing" action="commonPingTargets!deleteConfirm">
- <s:param name="pingTargetId" value="#pingTarget.id" />
- </s:url>
- <s:a href="%{removePing}">
- <img src='<c:url value="/images/delete.png"/>' border="0" alt="<s:text name="pingTarget.remove" />" />
- </s:a>
- </td>
-
+ <%-- Headings --%>
+ <tr class="rollertable">
+ <th class="rollertable" width="20%%"><s:text name="generic.name"/></th>
+ <th class="rollertable" width="55%"><s:text name="pingTarget.pingUrl"/></th>
+ <th class="rollertable" width="15%" colspan="2"><s:text name="pingTarget.autoEnabled"/></th>
+ <th class="rollertable" width="5%"><s:text name="generic.edit"/></th>
+ <th class="rollertable" width="5%"><s:text name="pingTarget.remove"/></th>
</tr>
-</s:iterator>
+
+ <%-- Listing of current common targets --%>
+ <s:iterator var="pingTarget" value="pingTargets" status="rowstatus">
+
+ <tr class="rollertable_odd">
+
+ <td class="rollertable"><s:property value="#pingTarget.name"/></td>
+
+ <td class="rollertable"><s:property value="#pingTarget.pingUrl"/></td>
+
+ <td class="rollertable" align="center">
+ <s:if test="#pingTarget.autoEnabled">
+ <span style="color: #00aa00; font-weight: bold;"><s:text name="pingTarget.enabled"/></span>
+ </s:if>
+ <s:else>
+ <span style="color: #aaaaaa; font-weight: bold;"><s:text name="pingTarget.disabled"/></span>
+ </s:else>
+ </td>
+
+ <td class="rollertable" align="center">
+ <s:if test="#pingTarget.autoEnabled">
+ <s:url var="disablePing" action="commonPingTargets!disable">
+ <s:param name="pingTargetId" value="#pingTarget.id"/>
+ </s:url>
+ <s:a href="%{disablePing}">
+ <s:text name="pingTarget.disable"/>
+ </s:a>
+ </s:if>
+ <s:else>
+ <s:url var="enablePing" action="commonPingTargets!enable">
+ <s:param name="pingTargetId" value="#pingTarget.id"/>
+ </s:url>
+ <s:a href="%{enablePing}">
+ <s:text name="pingTarget.enable"/></s:a>
+ </s:else>
+ </td>
+
+ <td class="rollertable" align="center">
+ <s:url var="editPing" action="commonPingTargetEdit">
+ <s:param name="bean.id" value="#pingTarget.id"/>
+ </s:url>
+ <s:a href="%{editPing}">
+ <span class="glyphicon glyphicon-edit" aria-hidden="true"> </span>
+ </s:a>
+ </td>
+
+ <td class="rollertable" align="center">
+ <s:url var="removePing" action="commonPingTargets!deleteConfirm">
+ <s:param name="pingTargetId" value="#pingTarget.id"/>
+ </s:url>
+ <a href="#" onclick="showDeleteModal('<s:property value="#pingTarget.id"/>')">
+ <span class="glyphicon glyphicon-trash" aria-hidden="true"> </span>
+ </a>
+ </td>
+
+ </tr>
+ </s:iterator>
</table>
<div style="padding: 4px; font-weight: bold;">
<s:url var="addPing" action="commonPingTargetAdd">
- <s:param name="weblog" value="actionWeblog.handle" />
+ <s:param name="weblog" value="actionWeblog.handle"/>
</s:url>
- <img src='<s:url value="/images/add.png"/>' border="0" alt="icon" /><s:a href="%{addPing}"><s:text name="pingTarget.addTarget" /></s:a>
+ <s:a href="%{addPing}">
+ <span class="glyphicon glyphicon-plus-sign" aria-hidden="true"> </span>
+ <s:text name="pingTarget.addTarget"/>
+ </s:a>
</div>
+
+
+<div id="delete-ping-target-modal" class="modal fade ping-target-modal" tabindex="-1" role="dialog">
+
+ <div class="modal-dialog modal-lg">
+
+ <div class="modal-content">
+
+ <s:form theme="bootstrap" cssClass="form-horizontal">
+ <s:hidden name="salt"/>
+ <s:hidden id="removeId" name="pingTargetId"/>
+
+ <div class="modal-header">
+ <div class="modal-title">
+ <h3><s:text name="pingTarget.confirmRemoveTitle"/></h3>
+ </div>
+ </div>
+
+ <div class="modal-body">
+ <s:text name="pingTarget.confirmCommonRemove"/>
+ </div>
+
+ <div class="modal-footer">
+ <s:submit cssClass="btn btn-danger"
+ value="%{getText('generic.yes')}" action="commonPingTargets!delete"/>
+ <s:submit cssClass="btn btn-default"
+ value="%{getText('generic.cancel')}" action="commonPingTargets"/>
+ </div>
+
+ </s:form>
+
+ </div>
+
+ </div>
+
+</div>
+
+
+<script>
+ function showDeleteModal( removeId ) {
+ $('#removeId').val(removeId);
+ $('#delete-ping-target-modal').modal({show: true});
+ }
+</script>
+
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 3c2e364..928e93c 100644
--- a/app/src/main/webapp/WEB-INF/jsps/editor/Bookmarks.jsp
+++ b/app/src/main/webapp/WEB-INF/jsps/editor/Bookmarks.jsp
@@ -112,50 +112,45 @@
<%-- Bookmarks --%>
<s:iterator var="bookmark" value="folder.bookmarks" status="rowstatus">
- <s:if test="#rowstatus.odd == true">
- <tr class="rollertable_odd">
- </s:if>
- <s:else>
- <tr class="rollertable_even">
- </s:else>
+ <tr class="rollertable_odd">
- <td class="rollertable center" style="vertical-align:middle">
- <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 class="rollertable center" style="vertical-align:middle">
+ <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="40" upper="50">
- <s:property value="#bookmark.name"/>
- </str:truncateNicely>
- </td>
+ <td>
+ <str:truncateNicely lower="40" upper="50">
+ <s:property value="#bookmark.name"/>
+ </str:truncateNicely>
+ </td>
- <td>
- <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>
+ <td>
+ <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">
+
+ <a href="#" onclick="editBookmark(
+ '<s:property value="#bookmark.id"/>',
+ '<s:property value="#bookmark.name"/>',
+ '<s:property value="#bookmark.url"/>',
+ '<s:property value="#bookmark.feedUrl"/>',
+ '<s:property value="#bookmark.description"/>',
+ '<s:property value="#bookmark.image"/>' )">
+ <span class="glyphicon glyphicon-edit"></span>
</a>
- </s:if>
- </td>
-
- <td align="center">
-
- <a href="#" onclick="editBookmark(
- '<s:property value="#bookmark.id"/>',
- '<s:property value="#bookmark.name"/>',
- '<s:property value="#bookmark.url"/>',
- '<s:property value="#bookmark.feedUrl"/>',
- '<s:property value="#bookmark.description"/>',
- '<s:property value="#bookmark.image"/>' )">
- <span class="glyphicon glyphicon-edit"></span>
- </a>
-
- </td>
+ </td>
</tr>
@@ -277,7 +272,7 @@
function nameChanged() {
var newName = $("#bookmarks_folder_name:first").val();
- if (newName && newName != originalName && newName.trim().length > 0) {
+ if (newName && newName !== originalName && newName.trim().length > 0) {
renameButton.attr("disabled", false);
renameButton.addClass("btn-success");
@@ -345,7 +340,7 @@
function onMoveToFolder() {
var bookmarksForm = $("#bookmarks")[0];
- bookmarksForm.action = "bookmarks!move.rol";
+ bookmarksForm.action = "bookmarks!move.rol";
bookmarksForm.submit();
}
@@ -354,7 +349,7 @@
var bookmarksForm = $("#bookmarks")[0];
var folderEditForm = $("#folderEditForm")[0];
- if ("new_blogroll" == bookmarksForm.viewFolderId.value) {
+ if ("new_blogroll" === bookmarksForm.viewFolderId.value) {
newBlogroll();
} else {
@@ -458,7 +453,7 @@
var feedbackAreaBlogrollEdit = $("#feedback-area-blogroll-edit");
// if name is empty reject and show error message
- if ($("#folderEditForm_bean_name").val().trim() == "") {
+ if ($("#folderEditForm_bean_name").val().trim() === "") {
feedbackAreaBlogrollEdit.html('<s:text name="bookmarksForm.blogroll.requiredFields" />');
feedbackAreaBlogrollEdit.css("color", "red");
return;
@@ -763,7 +758,7 @@
var elem = $('#bookmark_required_fields:first');
var message = '';
- if (name.length > 0 && url.length > 0 && badUrls.length == 0) {
+ if (name.length > 0 && url.length > 0 && badUrls.length === 0) {
saveBookmarkButton.attr("disabled", false);
message = '<s:text name="generic.looksGood" />';
@@ -775,7 +770,7 @@
} else {
saveBookmarkButton.attr("disabled", true);
- if (name.length == 0 || url.length == 0) {
+ if (name.length === 0 || url.length === 0) {
message = '<s:text name="bookmarkForm.required" />';
}
if (badUrls.length > 0) {