Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

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 &quot;${escapedRequestedSearch}&quot; 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"), "&quot;") )
          <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 &quot;${escapedRequestedSearch}&quot; 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"), "&quot;") ) ## %22 = "
                #set ( $newPageMarkup = $newPageMarkup.replaceAll("&nbsp;", " ") ) ## because of some sort of bug where &nbsp; is replaced with Â
                #set ( $quoteEscapedPageMarkup = $pageMarkup.replaceAll($generalUtil.urlDecode("%22"), "&quot;") )
                <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 &quot;${escapedRequestedSearch}&quot; with &quot;${escapedRequestedReplace}&quot; 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