Skip to content

Commit

Permalink
Add support for remoteUrl node attribute, using html5 postMessage to …
Browse files Browse the repository at this point in the history
…communicate with remote service loaded via iframe.
  • Loading branch information
gschueler committed Oct 15, 2010
1 parent 238cef3 commit 0044b41
Show file tree
Hide file tree
Showing 2 changed files with 169 additions and 7 deletions.
43 changes: 38 additions & 5 deletions rundeckapp/grails-app/views/framework/_nodes.gsp
@@ -1,5 +1,5 @@
<g:set var="ukey" value="${g.rkey()}"/>
<table cellpadding="0" cellspacing="0" width="100%">
<%@ page import="com.dtolabs.rundeck.core.dispatcher.DataContextUtils" %><g:set var="ukey" value="${g.rkey()}"/>
<table cellpadding="0" cellspacing="0" width="100%" id="nodesTable">

<% def seen=false %>
<g:each in="${nodes.keySet().sort()}" var="nodekey" status="i">
Expand Down Expand Up @@ -48,9 +48,22 @@
${node.description}
</span>

<g:if test="${node.attributes?.editUrl}">
<a href="${node.attributes?.editUrl}" target="_new">Edit...</a>
<g:if test="${node.attributes?.remoteUrl}">
<g:set var="nodecontextdata" value="${DataContextUtils.nodeData(node)}"/>
<%
nodecontextdata.project=nodedata.project.name
%>
<g:set var="remoteUrl" value="${DataContextUtils.replaceDataReferences(node.attributes?.remoteUrl,[node:nodecontextdata])}" />
<span class="action " title="Edit this node via remote URL..." onclick='doRemoteEdit("${node.nodename.encodeAsJavaScript()}","${remoteUrl.encodeAsJavaScript()}");'>Edit&hellip;</span>
</g:if>
<g:elseif test="${node.attributes?.editUrl}">
<g:set var="nodecontextdata" value="${DataContextUtils.nodeData(node)}"/>
<%
nodecontextdata.project=nodedata.project.name
%>
<g:set var="editUrl" value="${DataContextUtils.replaceDataReferences(node.attributes?.editUrl,[node:nodecontextdata])}" />
<a href="${editUrl}" target="_blank" title="Opens a link to edit this node at a remote site.">Edit</a>
</g:elseif>

<g:if test="${expanddetail}">
<g:link controller="reports" action="index" params="${[nodeFilter:node.nodename]}" title="View Events for Node ${node.nodename}">
Expand Down Expand Up @@ -82,4 +95,24 @@
if(typeof(initTooltipForElements)=='function'){
initTooltipForElements('tr.node_entry span.node_ident');
}
</g:javascript>
</g:javascript>

<div id="remoteEditholder" style="display:none" class="popout">
<span id="remoteEditHeader">
<span class="welcomeMessage">Edit node: <g:img file="icon-small-Node.png" width="16px" height="16px"/><span id="editNodeIdent"></span></span>
</span>
<span class="toolbar" id="remoteEditToolbar">
<span class="action " onclick="_rdeckNodeEditCompleted();" title="Close the remote edit box and discard any changes"><g:img file="icon-tiny-removex-gray.png" /> Cancel and close</span>
</span>
<div id="remoteEditResultHolder" class="info message" style="display:none">
<span id="remoteEditResultText" class="info message" >
</span>
<span class="action " onclick="_rdeckNodeEditCompleted();"> Continue&hellip;</span>
</div>
<div id="remoteEditError" class="error note" style="display:none">
</div>
<div id="remoteEditWait" style="display:none"></div>
<div id="remoteEditTarget" >

</div>
</div>
133 changes: 131 additions & 2 deletions rundeckapp/grails-app/views/framework/nodes.gsp
@@ -1,5 +1,6 @@
<html>
<head>
<g:set var="rkey" value="${g.rkey()}" />
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<meta name="layout" content="base"/>
<meta name="tabpage" content="nodes"/>
Expand Down Expand Up @@ -45,6 +46,122 @@
_setFilterSuccess(response,name);
}});
}
var remoteSite;
//remote edit loader
function doRemoteEdit(name,url){
//create iframe for url
var hold=$('remoteEditholder');
var tgt=$('remoteEditTarget');
var ident=$('editNodeIdent');
ident.innerHTML=name;
var ifm = document.createElement('iframe');
ifm.width="640px";
ifm.height="480px";
ifm.src=url;
remoteSite=url;
tgt.hide();
tgt.appendChild(ifm);
var errhold=$('remoteEditError');
errhold.innerHTML="";
errhold.hide();
$('remoteEditResultHolder').hide();
_rdeckNodeEditWaiting();
}
var waitingStart=false;
var waitingStartTimer;
var remoteTimeoutSecs=30;
function _rdeckNodeEditStartTimeout(){
if(waitingStart){
_rdeckNodeEditFinishedError("Remote editor did not load in "+remoteTimeoutSecs+" seconds. There may be an error or the server is unavailable.");
}
}
function _rdeckNodeEditDoneWaiting(){
waitingStart=false;
clearTimeout(waitingStartTimer);
$('remoteEditWait').hide();
}
function _rdeckNodeEditWaiting(){
waitingStart=true;
waitingStartTimer=setTimeout(_rdeckNodeEditStartTimeout,remoteTimeoutSecs*1000);
$('remoteEditWait').show();
$('remoteEditWait').loading();
$('nodesTable').hide();
$('${rkey}nodesfilterholder').hide();
$('remoteEditholder').show();
}
function _rdeckNodeEditStarted(){
_rdeckNodeEditDoneWaiting();
var hold=$('remoteEditholder');
var tgt=$('remoteEditTarget');
tgt.show();
$('nodesTable').hide();
$('${rkey}nodesfilterholder').hide();
hold.show();
}
function _rdeckNodeEditFinished(changed){
_rdeckNodeEditDoneWaiting();
if(changed){
$('remoteEditResultText').innerHTML="Node changes were saved successfully.";
}else{
$('remoteEditResultText').innerHTML="Node changes were not saved.";
}
var tgt=$('remoteEditTarget');
tgt.innerHTML="";
tgt.hide();
$('remoteEditToolbar').hide();
$('remoteEditResultHolder').show();
}
function _rdeckNodeEditCompleted(){
_rdeckNodeEditDoneWaiting();
var hold=$('remoteEditholder');
var tgt=$('remoteEditTarget');
tgt.innerHTML="";
hold.hide();
$('remoteEditToolbar').show();
$('nodesTable').show();
$('${rkey}nodesfilterholder').show();
var errhold=$('remoteEditError');
errhold.innerHTML="";
errhold.hide();
}
function _rdeckNodeEditFinishedError(msg){
_rdeckNodeEditDoneWaiting();
var hold=$('remoteEditholder');
var tgt=$('remoteEditTarget');
$('remoteEditWait').hide();
tgt.innerHTML="";
var errhold=$('remoteEditError');
errhold.innerHTML="Remote edit reported an error: "+msg;
errhold.show();
}
function onmessage(msg){
var data=msg.data;
var origin=msg.origin;
if(data.startsWith('rundeck:node:edit:started')){
_rdeckNodeEditStarted();
}else if(data.startsWith('rundeck:node:edit:true')){
_rdeckNodeEditFinished(true);
}else if(data.startsWith('rundeck:node:edit:error')){
var err=data.substring('rundeck:node:edit:error'.length);
if(err.startsWith(":")){
err=err.substring(1);
}
_rdeckNodeEditFinishedError(err?err:"The remote editor reported an error");
}else if(data.startsWith('rundeck:node:edit:')){
_rdeckNodeEditFinished(false);
}else{
_rdeckNodeEditFinishedError("Unexpected response: "+data);
}
}
if (typeof window.addEventListener != 'undefined') {
window.addEventListener('message', onmessage, false);
} else if (typeof window.attachEvent != 'undefined') {
window.attachEvent('onmessage', onmessage);
}
</script>
<style type="text/css">
.detail_content{
Expand All @@ -62,10 +179,22 @@
.node_entry .project{
}
#remoteEditholder{
margin: 0px 20px 0 20px;
}
#remoteEditholder iframe{
border:0;
}
#remoteEditholder .toolbar{
margin:4px;
}
#remoteEditholder #remoteEditWait{
margin:10px;
}
</style>
</head>
<body>
<g:set var="rkey" value="${g.rkey()}" />

<g:if test="${session.user && User.findByLogin(session.user)?.nodefilters}">
<g:set var="filterset" value="${User.findByLogin(session.user)?.nodefilters}"/>
Expand Down Expand Up @@ -114,7 +243,7 @@
</g:if>
<td style="text-align:left;vertical-align:top;" id="${rkey}nodescontent">
<g:if test="${!params.nofilters}">
<div style="margin-bottom: 5px;">
<div style="margin-bottom: 5px;" id="${rkey}nodesfilterholder">
<g:if test="${wasfiltered}">

<g:if test="${!params.compact}">
Expand Down

0 comments on commit 0044b41

Please sign in to comment.