...
Code Block |
---|
## @noparams
#set ( $Integer = 0 )
#set ( $requestedSearch = "" )
#set ( $requestedSearch = $req.getParameter('requestedSearch') )
#set ( $requestedSpaces = "" )
#set ( $requestedSpaces = $req.getParameter('requestedSpaces') )
#set ( $replace = "" )
#set ( $replace = $req.getParameter('replace') )
#set ( $requestedReplace = "" )
#set ( $requestedReplace = $req.getParameter('requestedReplace') )
#set ( $continue = "" )
#set ( $continue = $req.getParameter('continue') )
#set ( $escapedRequestedSearch = $generalUtil.escapeXml($requestedSearch) )
#set ( $escapedRequestedReplace = $generalUtil.escapeXml($requestedReplace) )
#set ( $requestCharacter = "?" )
#if ( $content.getUrlPath().contains("?") )
#set ( $requestCharacter = "&" )
#end
<script>
var qs = (function(a) {
if (a == "") return {};
var b = {};
for (var i = 0; i < a.length; ++i) {
var p=a[i].split('=', 2);
if (p.length == 1)
b[p[0]] = "";
else
b[p[0]] = decodeURIComponent(p[1].replace(/\+/g, " "));
}
return b;
})(window.location.search.substr(1).split('&'));
function htmlEncode( html ) {
return document.createElement( 'a' ).appendChild( document.createTextNode( html ) ).parentNode.innerHTML;
};
</script>
#if ( $requestedSearch == "" )
<form class="aui top-label" onsubmit="return false;">
<div class="field-group top-label">
<label for="requested-search">Enter Search Terms:</label>
<input id="requested-search" class="text long-field" type="text" name="requestedSearch">
</div>
<div class="field-group">
<input id="replace" type="checkbox" onclick="jQuery('#requested-replace').val('');jQuery('#replace-fields').toggle();">
<span>Do Search/Replace</span>
</div>
<div class="field-group" id="replace-fields" style="display:none;">
<label for="requested-replace">Text to replace:</label>
<input id="requested-replace" class="text long-field" type="text" name="requestedReplace">
</div>
<script> jQuery(function() { if (document.getElementById('replace').checked) { jQuery('#replace-fields').show(); } }); </script> ## show replace field if user hits back button
<div class="field-group">
<label for="requestedSpaces">Spaces to search:</label>
<select class="select" id="requestedSpaces" name="requestedSpaces" multiple>
#set ( $allSpaces = $spaceManager.getAllSpaces() )
#foreach ( $space in $allSpaces )
#if ( $space.isGlobal() )
<option value="$space.key">$space.name - $space.key</option>
#end
#end
</div>
<button class="button submit" onclick="window.location = '$content.getUrlPath()' + '${requestCharacter}requestedSearch=' + encodeURIComponent(document.getElementById('requested-search').value) + '&requestedSpaces=' + jQuery('#requestedSpaces').select2('val').join() + '&replace=' + jQuery('#replace').is(':checked') + '&requestedReplace=' + encodeURIComponent(document.getElementById('requested-replace').value);">Search</button>
</form>
<script>
jQuery("#requestedSpaces").auiSelect2();
</script>
#elseif ( $requestedSearch != "" && $replace == "false" )
#set ( $searchTerm = $requestedSearch )
#foreach ( $spaceKey in $requestedSpaces.split(",") )
#set ( $space = $spaceManager.getSpace($spaceKey) )
<p> Pages containing "${escapedRequestedSearch}" in $space.name </p>
#set ( $spacePages = $pageManager.getPages($space, true) )
<table>
<thead>
<tr>
<th>
<p>Page</p>
</th>
<th>
</th>
</tr>
</thead>
<tbody>
#foreach ($page in $spacePages)
#set ( $pageId = $page.id )
#set ( $pageMarkup = $page.getBodyAsString() )
#if ( $permissionHelper.canView($action.remoteUser, $page) && $pageMarkup.contains($searchTerm) )
#set ( $quoteEscapedPageMarkup = $pageMarkup.replaceAll($generalUtil.urlDecode("%22"), """) )
<tr>
<td>
<p><a href="$action.getGlobalSettings().getBaseUrl()$page.getUrlPath()" target="_blank">$page.title</a></p>
<input style="display:none;" class="page-checkbox" type="checkbox" id="page-$pageId" original="$quoteEscapedPageMarkup">
</td>
<td>
<button id="preview${pageId}" class="aui-button">Preview</button>
<button class="aui-button" onclick="window.open(contextPath + '/pages/editpage.action?pageId=$pageId', '_blank');">Edit</button>
<script>
var dialog${pageId} = new AJS.Dialog({
width: 840,
height: 640,
id: "dialog${pageId}",
closeOnOutsideClick: true
});
dialog${pageId}.addHeader("Preview");
var originalMarkup = jQuery("#page-${pageId}").attr("original");
var originalMarkupArray = originalMarkup.split(jQuery('<textarea/>').html(qs["requestedSearch"]).text());
var previewMarkup = jQuery('<pre style="white-space: pre-wrap;white-space: -moz-pre-wrap;white-space: -pre-wrap;white-space: -o-pre-wrap;word-wrap: break-word;"></pre>');
var replaceElement = '<span style="background-color: #ddfade;">' + htmlEncode(qs["requestedSearch"]) + '</span>';
jQuery.each( originalMarkupArray, function(i, val) {
jQuery(previewMarkup).append(jQuery('<span>' + htmlEncode(val) + '</span>' + replaceElement));
});
jQuery('span', previewMarkup).last().remove();
dialog${pageId}.addPanel("SinglePanel", previewMarkup, "singlePanel");
dialog${pageId}.addButton("Close", function (dialog${pageId}) {
dialog${pageId}.hide();
});
jQuery("#preview${pageId}").click(function() {
dialog${pageId}.gotoPage(0);
dialog${pageId}.gotoPanel(0);
dialog${pageId}.show();
});
</script>
</td>
</tr>
#end
#end
</tbody>
</table>
#end
<p> </p>
<button class="aui-button" onclick="window.location = '$content.getUrlPath()'">New Search</button>
#elseif ( $requestedSearch != "" && $replace == "true" && $continue == "" )
<button class="aui-button" onclick="jQuery('.page-checkbox').prop('checked', true);">Select All</button>
<button class="aui-button" onclick="jQuery('.page-checkbox').prop('checked', false);">Select None</button>
#set ( $searchResultCount = 0 )
#set ( $searchTerm = $requestedSearch )
#foreach ( $spaceKey in $requestedSpaces.split(",") )
#set ( $space = $spaceManager.getSpace($spaceKey) )
<p> Pages containing "${escapedRequestedSearch}" in $space.name </p>
#set ( $spacePages = $pageManager.getPages($space, true) )
<table>
<thead>
<colgroup> ## To prevent table from being sortable
</colgroup>
<tr>
<th>
<p>Page</p>
</th>
<th>
<button class="aui-button" onclick="jQuery('.page-checkbox[space=\'$space.key\']').click();">X</button>
</th>
<th>
</th>
</tr>
</thead>
<tbody>
#foreach ($page in $spacePages)
#set ( $pageId = $page.id )
#set ( $pageMarkup = $page.getBodyAsString() )
#if ( $permissionHelper.canView($action.remoteUser, $page) && $pageMarkup.contains($searchTerm) )
#set ( $searchResultCount = $searchResultCount + 1 )
<tr>
<td>
<p><a href="$action.getGlobalSettings().getBaseUrl()$page.getUrlPath()" target="_blank">$page.title</a></p>
</td>
<td>
#if ( $permissionHelper.canEdit($action.remoteUser, $page) )
#set ( $replacedPageMarkup = $pageMarkup.replaceAll($requestedSearch, $requestedReplace) )
#set ( $newPageMarkup = $replacedPageMarkup.replaceAll($generalUtil.urlDecode("%22"), """) ) ## %22 = "
#set ( $newPageMarkup = $newPageMarkup.replaceAll(" ", " ") ) ## because of some sort of bug where is replaced with Â
#set ( $quoteEscapedPageMarkup = $pageMarkup.replaceAll($generalUtil.urlDecode("%22"), """) )
<input class="page-checkbox unchanged" type="checkbox" id="page-$pageId" pageid="$pageId" version="$page.version" title="$page.title" parent="$page.parent.id" space="$space.key" content="$newPageMarkup" original="$quoteEscapedPageMarkup" checked="checked">
<span class="aui-lozenge">unchanged</span>
#else
<span class="aui-lozenge aui-lozenge-current">cannot edit</span>
#end
</td>
<td>
<button id="preview${pageId}" class="aui-button">Preview</button>
<button class="aui-button" onclick="window.open(contextPath + '/pages/editpage.action?pageId=$pageId', '_blank');">Edit</button>
<button style="display:none;" id="undo-${pageId}" class="aui-button" onclick="window.open(contextPath + '/pages/revertpagebacktoversion.action?pageId=${pageId}&version=$page.version', '_blank');">Undo</button>
<script>
var dialog${pageId} = new AJS.Dialog({
width: 840,
height: 640,
id: "dialog${pageId}",
closeOnOutsideClick: true
});
dialog${pageId}.addHeader("Preview");
var originalMarkup = jQuery("#page-${pageId}").attr("original");
var originalMarkupArray = originalMarkup.split(jQuery('<textarea/>').html(qs["requestedSearch"]).text());
var previewMarkup = jQuery('<pre style="white-space: pre-wrap;white-space: -moz-pre-wrap;white-space: -pre-wrap;white-space: -o-pre-wrap;word-wrap: break-word;"></pre>');
var replaceElement = '<span style="background-color: #ddfade;">' + htmlEncode(qs["requestedReplace"]) + '</span>';
if (qs["requestedReplace"] === "") { replaceElement = '<span style="background-color: #ddfade;">[blank]</span>' } ## so there is something to show if replacement field is blank
jQuery.each( originalMarkupArray, function(i, val) {
jQuery(previewMarkup).append(jQuery('<span>' + htmlEncode(val) + '</span>' + replaceElement));
});
jQuery('span', previewMarkup).last().remove();
dialog${pageId}.addPanel("SinglePanel", previewMarkup, "singlePanel");
dialog${pageId}.addButton("Close", function (dialog${pageId}) {
dialog${pageId}.hide();
});
jQuery("#preview${pageId}").click(function() {
dialog${pageId}.gotoPage(0);
dialog${pageId}.gotoPanel(0);
dialog${pageId}.show();
});
</script>
</td>
</tr>
#end
#end
</tbody>
</table>
#end
<p> Found $searchResultCount results. You are about to replace "${escapedRequestedSearch}" with "${escapedRequestedReplace}" on all selected pages. Continue? </p>
<p> </p>
<button class="aui-button" onclick="replaceText()">Continue</button>
<button class="aui-button" onclick="window.location = '$content.getUrlPath()'">New Search</button>
<script>
function replaceText(){searchReplace(jQuery(".page-checkbox.unchanged:checked").first())}
function searchReplace(a){var c=[],b={};b.id=jQuery(a).attr("pageid");b.version=jQuery(a).attr("version");b.title=jQuery(a).attr("title");b.space=jQuery(a).attr("space");b.content=jQuery(a).attr("content");b.parentId=jQuery(a).attr("parent");c.push(b);jQuery.ajax({dataType:"json",contentType:"application/json",type:"POST",url:contextPath+"/rpc/json-rpc/confluenceservice-v2/storePage",data:JSON.stringify(c),success:function(c){c.hasOwnProperty("id")?(jQuery(a).removeClass("unchanged").addClass("changed"),
jQuery(a).next().removeClass("aui-lozenge-current").removeClass("aui-lozenge-error").addClass("aui-lozenge-complete").html("updated"),jQuery("#undo-"+b.id).show(),a=jQuery("input[type='checkbox'].page-checkbox.unchanged:checked").first()):(jQuery(a).removeClass("unchanged").addClass("error"),jQuery(a).next().removeClass("aui-lozenge-complete").removeClass("aui-lozenge-current").addClass("aui-lozenge-error").html("error"),console.log(c),a=jQuery(".page-checkbox.unchanged:checked").first());0<a.length&&
searchReplace(a)}})};
</script>
#end |