summaryrefslogtreecommitdiffstats
path: root/sandbox/kgoodson
diff options
context:
space:
mode:
authorkelvingoodson <kelvingoodson@13f79535-47bb-0310-9956-ffa450edef68>2010-03-22 17:38:59 +0000
committerkelvingoodson <kelvingoodson@13f79535-47bb-0310-9956-ffa450edef68>2010-03-22 17:38:59 +0000
commitffd0ecb3ae02c051af7b2d081cf5326d1886e5ed (patch)
tree62ab4871abd757488fb14a04588a89c21095fef9 /sandbox/kgoodson
parentbec9b7fb643e6d38928c65b0d8400e0bea4b7144 (diff)
reasonably usable now, still no workitem delete
git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@926213 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'sandbox/kgoodson')
-rw-r--r--sandbox/kgoodson/jagg/pom.xml42
-rw-r--r--sandbox/kgoodson/jagg/src/main/resources/JiraSideband.xml68
-rw-r--r--sandbox/kgoodson/jagg/src/main/resources/JiraSideband.xsd72
-rw-r--r--sandbox/kgoodson/jagg/src/main/resources/uiservices/plan.html351
4 files changed, 363 insertions, 170 deletions
diff --git a/sandbox/kgoodson/jagg/pom.xml b/sandbox/kgoodson/jagg/pom.xml
index c645fdc4fd..eb0bfe9cb4 100644
--- a/sandbox/kgoodson/jagg/pom.xml
+++ b/sandbox/kgoodson/jagg/pom.xml
@@ -106,42 +106,22 @@
</dependency>
<dependency>
- <groupId>junit</groupId>
- <artifactId>junit</artifactId>
- <version>4.5</version>
+ <groupId>net.sourceforge.htmlunit</groupId>
+ <artifactId>htmlunit</artifactId>
+ <version>2.6</version>
<scope>test</scope>
</dependency>
+
<dependency>
- <groupId>rome</groupId>
- <artifactId>rome</artifactId>
- <version>1.0</version>
- </dependency>
- <dependency>
- <groupId>javax.xml.bind</groupId>
- <artifactId>jaxb-api</artifactId>
- <version>2.0</version>
- </dependency>
-
- <dependency>
- <groupId>com.sun.xml.bind</groupId>
- <artifactId>jaxb-impl</artifactId>
- <version>2.0.3</version>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <version>4.8.1</version>
+ <scope>test</scope>
</dependency>
- <dependency>
- <groupId>org.jvnet.jaxb2_commons</groupId>
- <artifactId>runtime</artifactId>
- <version>0.4.1</version>
- </dependency>
- <dependency>
- <groupId>org.jvnet.jaxb2_commons</groupId>
- <artifactId>testing</artifactId>
- <version>0.4.1</version>
- <scope>test</scope>
- </dependency>
-
-
</dependencies>
-
+ <build>
+ <finalName>${artifactId}</finalName>
+ </build>
</project>
diff --git a/sandbox/kgoodson/jagg/src/main/resources/JiraSideband.xml b/sandbox/kgoodson/jagg/src/main/resources/JiraSideband.xml
index e2f8401d8f..503b985054 100644
--- a/sandbox/kgoodson/jagg/src/main/resources/JiraSideband.xml
+++ b/sandbox/kgoodson/jagg/src/main/resources/JiraSideband.xml
@@ -1,66 +1,18 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<ns2:plan xmlns:ns2="http://www.example.com/tracking">
+<ns2:plan xmlns:ns2="http://www.example.com/tracking" maxWorkItemID="42" projTitle="WAS SCA">
<issueBase>https://issues.apache.org/jira/browse/</issueBase>
- <milestone ID="V8 M5I14a">
- <workItem>
- <jira>TUSCANY-2850</jira>
- <jiraData ID="TUSCANY-2850">
- <title> Support binding.json-rpc for implementation.java's reference</title>
- <status>Resolved</status>
- <assignedTo>Luciano Resende</assignedTo>
- </jiraData>
- </workItem>
- <workItem>
- <jira>TUSCANY-3395</jira>
- <jiraData ID="TUSCANY-3395">
- <title> Tidying up Contribution Scanner API</title>
- <status>Resolved</status>
- <assignedTo>Luciano Resende</assignedTo>
- </jiraData>
- </workItem>
- <workItem>
- <jira>TUSCANY-3397</jira>
- <jiraData ID="TUSCANY-3397">
- <title> Add support for identifying the SCA Spec Version for contribution metadata</title>
- <status>Resolved</status>
- <assignedTo>Luciano Resende</assignedTo>
- </jiraData>
- </workItem>
- </milestone>
- <milestone ID="V8_M5I14b">
- <workItem>
- <jira>TUSCANY-3433</jira>
- <jiraData ID="TUSCANY-3433">
- <title> Import more of the basic itests from 1.x to 2.x </title>
- <status>Open</status>
- <assignedTo>Ramkumar Ramalingam</assignedTo>
- </jiraData>
- </workItem>
- <workItem>
- <jira>TUSCANY-3409</jira>
- <jiraData ID="TUSCANY-3409">
- <title> Non-Simple Property Injected with XML Fails with NullPointerException</title>
- <status>Resolved</status>
- <assignedTo>Raymond Feng</assignedTo>
- </jiraData>
- </workItem>
- <workItem>
- <jira>TUSCANY-3441</jira>
- <jiraData ID="TUSCANY-3441">
- <title> Improve mechanism for determining locality of endpoints to endpoint references</title>
- <status>Open</status>
- <assignedTo>Unassigned</assignedTo>
- </jiraData>
- </workItem>
- <workItem>
- <jira>TUSCANY-3443</jira>
- <jiraData ID="TUSCANY-3443">
- <title> Devise a away to track and spi changes we make in 2.x</title>
- <status>Open</status>
+ <milestone ID="1234"/>
+ <milestone ID="MS8">
+ <workItem ID="wi29">
+ <jira>TUSCANY-1111</jira>
+ <note>sdsdss</note>
+ <jiraData ID="TUSCANY-1111">
+ <title> Interchangeability of Java and WSDL</title>
+ <status>Closed</status>
<assignedTo>Unassigned</assignedTo>
</jiraData>
+ <link>tuscany.bluehost.ibm.com</link>
</workItem>
</milestone>
- <milestone ID="V8_M5I15a"/>
<milestone ID="MMX"/>
</ns2:plan>
diff --git a/sandbox/kgoodson/jagg/src/main/resources/JiraSideband.xsd b/sandbox/kgoodson/jagg/src/main/resources/JiraSideband.xsd
index ad3f7f8daf..ea3fe98fd0 100644
--- a/sandbox/kgoodson/jagg/src/main/resources/JiraSideband.xsd
+++ b/sandbox/kgoodson/jagg/src/main/resources/JiraSideband.xsd
@@ -20,16 +20,24 @@
<xsd:schema targetNamespace="http://www.example.com/tracking"
xmlns:jagg="http://www.example.com/tracking"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
-
- <xsd:element name="plan">
- <xsd:complexType>
- <xsd:sequence>
- <xsd:element name="issueBase" type="xsd:string" maxOccurs="1" minOccurs="0"></xsd:element>
-
-
- <xsd:element name="milestone" type="jagg:Milestone" maxOccurs="unbounded" minOccurs="0"></xsd:element>
- </xsd:sequence>
- </xsd:complexType>
+
+ <xsd:element name="plan">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="issueBase" type="xsd:string"
+ maxOccurs="1" minOccurs="0">
+ </xsd:element>
+
+
+ <xsd:element name="milestone" type="jagg:Milestone"
+ maxOccurs="unbounded" minOccurs="0">
+ </xsd:element>
+ </xsd:sequence>
+
+ <xsd:attribute name="projTitle" type="xsd:string" default="Untitled Project"></xsd:attribute>
+ <xsd:attribute name="maxWorkItemID" type="xsd:int" default="0">
+ </xsd:attribute>
+ </xsd:complexType>
</xsd:element>
@@ -42,7 +50,7 @@
</xsd:annotation>
<xsd:sequence>
- <xsd:element name="title" type="xsd:string" maxOccurs="1" minOccurs="1"></xsd:element>
+ <xsd:element name="title" type="xsd:string" maxOccurs="1" minOccurs="0"></xsd:element>
<xsd:element name="responsible" type="xsd:string"
maxOccurs="1" minOccurs="0">
</xsd:element>
@@ -98,32 +106,32 @@
<xsd:attribute name="ID" type="xsd:string"></xsd:attribute>
</xsd:complexType>
- <xsd:complexType name="Milestones">
- <xsd:sequence>
+ <xsd:complexType name="Milestones">
+ <xsd:sequence>
<xsd:element name="milestone" type="jagg:Milestone" maxOccurs="unbounded" minOccurs="0"></xsd:element>
</xsd:sequence>
</xsd:complexType>
-
- <xsd:complexType name="WorkItems">
- <xsd:sequence>
+
+ <xsd:complexType name="WorkItems">
+ <xsd:sequence>
<xsd:element name="workitem" type="jagg:WorkItem" maxOccurs="unbounded" minOccurs="0"></xsd:element>
</xsd:sequence>
</xsd:complexType>
-
-
- <xsd:complexType name="PlanDTO">
- <xsd:sequence>
- <xsd:element name="milestones" type="jagg:Milestone" maxOccurs="unbounded" minOccurs="0"></xsd:element>
- <xsd:element name="workitems" type="jagg:WorkItem" maxOccurs="unbounded" minOccurs="0"></xsd:element>
- </xsd:sequence>
+
+
+ <xsd:complexType name="PlanDTO">
+ <xsd:sequence>
+ <xsd:element name="milestones" type="jagg:Milestone" maxOccurs="unbounded" minOccurs="0"></xsd:element>
+ <xsd:element name="workitems" type="jagg:WorkItem" maxOccurs="unbounded" minOccurs="0"></xsd:element>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:complexType name="JiraData">
+ <xsd:sequence>
+ <xsd:element name="title" type="xsd:string"></xsd:element>
+ <xsd:element name="status" type="xsd:string"></xsd:element>
+ <xsd:element name="assignedTo" type="xsd:string"></xsd:element>
+ </xsd:sequence>
+ <xsd:attribute name="ID" type="xsd:string"></xsd:attribute>
</xsd:complexType>
-
- <xsd:complexType name="JiraData">
- <xsd:sequence>
- <xsd:element name="title" type="xsd:string"></xsd:element>
- <xsd:element name="status" type="xsd:string"></xsd:element>
- <xsd:element name="assignedTo" type="xsd:string"></xsd:element>
- </xsd:sequence>
- <xsd:attribute name="ID" type="xsd:string"></xsd:attribute>
- </xsd:complexType>
</xsd:schema> \ No newline at end of file
diff --git a/sandbox/kgoodson/jagg/src/main/resources/uiservices/plan.html b/sandbox/kgoodson/jagg/src/main/resources/uiservices/plan.html
index 38f5c0b273..5f72cbfc3b 100644
--- a/sandbox/kgoodson/jagg/src/main/resources/uiservices/plan.html
+++ b/sandbox/kgoodson/jagg/src/main/resources/uiservices/plan.html
@@ -1,6 +1,5 @@
<!--
* Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
@@ -20,77 +19,329 @@
<head>
<title>Plan</title>
-<script type="text/javascript" src="/dojo/dojo.js"></script>
+<script type="text/javascript" src="/dojo/dojo.js"></script> <!-- remove leading slash for webapp -->
<script type="text/javascript" src="plan.js"></script>
+<link rel="stylesheet" href="plan.css" type="text/css" media="screen"></link>
<script language="JavaScript">
//@Reference
var planView = new tuscany.sca.Reference("plan");
- var project = "TUSCANY";
- var ms;
+
+ var project = "TUSCANY"; // factor out
+ var issueBase = null;
- function plan_getResponse(plan,exception) {
+ var msmap;
+ var wimap;
+ var wi2msmap;
+ var nullms;
+ var plan;
+
+ var focusWIRow = null;
+
+ var newWI;
+ var newWI_ID = "_new_";
+
+ function WI()
+ {
+ this.ID = newWI_ID;;
+ this.jira = 'TUSCANY-';
+ this.jiraData=new Object();
+ this.jiraData.status= '';
+ this.jiraData.title= '';
+ this.jiraData.assignedTo= '';
+ this.link= '';
+ this.note='';
+ }
+
+ function MS()
+ {
+ this.ID='';
+ }
+
+
+ function plan_getResponse(p,exception) {
if(exception){
alert(exception.message);
return;
}
- ms = plan.milestone.list;
- var mscontent = "<table border=\"1\" align=\"left\">";
+
+ plan = p;
-
+ msmap = new Object();
+ wimap = new Object();
+ wi2msmap = new Object();
+ nullms = new MS();
- var mschoice = 'Add new Work Item for JIRA: <input type="text" name="JIRA" value="'+project+'-">in Milestone<select name="mschoice">';
+ newWI = new WI();
+ wi2msmap[newWI.ID] = nullms;
+
+
+
+
+ var htmlElems = new Object();
+ scanPlan(plan);
+ issueBase = plan.issueBase;
+ renderPlan(plan,htmlElems);
+
+ document.getElementById('milestones').innerHTML= htmlElems['mscontent'];
+ // document.getElementById('mschoice').innerHTML=htmlElems['mschoice'];
+ return;
+
+ }
+
+
+ function scanPlan(plan) {
+
+ ms = plan.milestone.list;
for(var i=0; i<ms.length; i++) {
- mscontent += "<tr><th colspan=\"6\" align=\"left\">Milestone " + ms[i].ID + "</th></tr>";
- mschoice+='<option>'+ms[i].ID+'</option>';
- var mswi = ms[i].workItem.list;
- mscontent +="<tr>"+
- "<th>Jira</th>"+
- "<th>Jira title</th>"+
- "<th>Jira Assigned To</th>"+
- "<th>Status</th>"+
- "<th>Note</th>"+
- "</tr>";
+ msmap[ms[i].ID] = ms[i];
+ var mswi = ms[i].workItem.list;
for (var j=0; j<mswi.length; j++) {
- mscontent +="<tr>";
- if(mswi[j].jira != null) {
- mscontent +=
- "<td><A HREF=\""+plan.issueBase+mswi[j].jira+"\">"+mswi[j].jira+"</A></td>";
- } else {
- mscontent += '<td>No JIRA for Work Item</td>';
- }
- if(mswi[j].jiraData!= null) {
- mscontent += "<td>"+mswi[j].jiraData.title+"</td>"+
- "<td>"+mswi[j].jiraData.assignedTo+"</td>"+
- "<td>"+mswi[j].jiraData.status+"</td><td>";
- } else {
- mscontent += "<td colspan=\"3\"></td>";
- }
- if(mswi[j].note != null) {
- mscontent += mswi[j].note;
- }
- mscontent+="</td></tr>";
+ wimap[mswi[j].ID] = mswi[j];
+ wi2msmap[mswi[j].ID] = ms[i];
}
+ }
+ }
+
+ function renderWI_RO(wi,plan,htmlElems) {
+
+ var row='<tr onclick="focusOnWI(this)" class ="readonly" id="'+wi.ID+'">';
+
+ row += renderRowFieldsRO(wi);
+
+ row += "</tr>";
+ htmlElems['mscontent'] += row;
+ }
+
+ function renderWI_RW(wi,plan,htmlElems) {
+
+ var row='<tr onclick="focusOnWI(this)" class ="writable" id="'+wi.ID+'">';
+
+ row += renderRowFieldsRW(wi);
+
+ row += "</tr>";
+ htmlElems['mscontent'] += row;
+ }
+ function renderRowFieldsRO(wi)
+ {
+ var row = '';
+ row += '<td>';
+ //if(wi2msmap[wi.ID]) {
+ // row += wi2msmap[wi.ID].ID
+ //} else {
+ // row += '';
+ //}
+ row +='</td>';
+ if(wi.jira != null) {
+ row +=
+ "<td><A HREF=\""+issueBase+wi.jira+"\">"+wi.jira+"</A></td>";
+ } else {
+ row += '<td>No JIRA</td>';
+ }
+ if(wi.jiraData!= null) {
+ row += "<td>"+wi.jiraData.title+"</td>"+
+ "<td>"+wi.jiraData.assignedTo+"</td>"+
+ "<td>"+wi.jiraData.status+"</td>";
+ } else {
+ row += "<td></td><td></td><td></td>";
+ }
+ row += '<td>';
+ if(wi.note != null) {
+ row += wi.note;
+ }
+ row+="</td>";
+ row+= '<td>';
+ if(wi.link != null) {
+ row += '<A href="'+wi.link+'">link</a>';
+ }
+ row+="</td>";
+
+ return row;
+ }
+
+
+ function mschoice (wi) {
+ var mss = plan.milestone.list;
+
+
+ var thisWisMSID = '';;
+ if(wi.ID != newWI_ID) {
+ thisWisMSID = wi2msmap[wi.ID].ID;
}
- mscontent += "</table><P>";
- mschoice += '</select><input type="button" onClick="addWorkItem()" value="Add Work Item">';
- document.getElementById('milestones').innerHTML='<h2>' + mscontent;
+ var select = '<select>';
+ for(var i =0; i<mss.length;i++) {
+ if(mss[i].ID == thisWisMSID) {
+ select += '<option select="selected" value="';
+ } else {
+ select += '<option value="';
+ }
+ select += mss[i].ID;
+ select += '">'+ mss[i].ID+'</option>';
+ }
+ select += '</select>';
-
- document.getElementById('mschoice').innerHTML=mschoice;
- return;
+ return select;
+ }
+
+ function renderRowFieldsRW(wi)
+ {
+ var row = '';
+
+ row += mschoice(wi);
+ if(wi.jira != null) {
+ row += '<td><input id="jira" type="text" value="'+wi.jira+'"></input></td>';
+ } else {
+ row += '<td><input id="jira" type="text" value="'+project+'-"></input></td>';
+ }
+ if(wi.jiraData!= null) {
+ row += "<td>"+wi.jiraData.title+"</td>"+
+ "<td>"+wi.jiraData.assignedTo+"</td>"+
+ "<td>"+wi.jiraData.status+"</td>";
+ } else {
+ row += "<td></td><td></td><td></td>";
+ }
+
+ row += '<td><input id="note" type="text" value="';
+ if(wi.note != null) {
+ row += wi.note;
+ }
+ row += '"></input>';
+ row+="</td>";
+
+ row += '<td><input id="link" type="text" value="';
+ if(wi.link != null) {
+ row += wi.link;
+ }
+ row += '"></input>';
+
+ row+="</td>";
+
+ return row;
}
+ function focusOnWI(that) {
+
+ var oldFocusRow = focusWIRow;
+
+ if (oldFocusRow == null) { // first click
+ oldFocusRow = that.parentNode.lastElementChild; // assumption initial focus is on last row in table
+ }
+
+ if(that == oldFocusRow) return; // reclicked on existing focus row
+
+ var fields = oldFocusRow.children;
+
+ var rowMilestone = fields[0].value;
+ var rowJira = fields[1].children[0].value;
+ var rowNote = fields[5].children[0].value;
+ var rowLink = fields[6].children[0].value;
+
+ var oldwi;
+ if(oldFocusRow.id == newWI_ID) {
+ oldwi = newWI;
+ } else {
+ oldwi = wimap[oldFocusRow.id];
+ }
+ var changed = (rowJira != oldwi.jira) || (rowNote != oldwi.note) || (rowLink != oldwi.link);
+ if(!(oldwi.ID == newWI_ID)) {
+ var oldms = wi2msmap[oldwi.ID].ID;
+ changed = changed || (rowMilestone != oldms);
+ }
+
+ // ### updateRowLosingFocus(oldFocusRow);
+
+ var newHTML = null;
+ focusWIRow = that;
+
+
+ if(oldFocusRow.id == newWI_ID) {
+ newHTML = renderRowFieldsRO(newWI);
+ } else {
+ newHTML = renderRowFieldsRO(wimap[oldFocusRow.id]);
+ }
+ oldFocusRow.innerHTML = newHTML;
+ oldFocusRow.setAttribute("class","readonly");
+
+ if(that.id == newWI_ID) {
+ newHTML = renderRowFieldsRW(newWI);
+ } else {
+ newHTML = renderRowFieldsRW(wimap[that.id]);
+ }
+ that.innerHTML=newHTML;
+ that.setAttribute("class","writable");
+
+ if(changed) {
+ planView.updateWI(oldwi.ID, rowJira, rowNote, rowLink, rowMilestone).addCallback(plan_getResponse);
+ } // ADD NOTHING BELOW
+
+ }
+
+
+
+// function loseWIFocus(that) {
+// that.innerHTML= renderRowFieldsRO(wimap[that.id]);
+// }
+
+ function createWIFocusHTML(focusWI) {
+ var html = '<form><table>';
+ html += '<tr><td><input type="hidden" value="'+focusWI.ID+'"></input></td></tr>';
+ html += '<tr><td>JIRA</td><td><input type="text" value="'+focusWI.jira+'"></input></td></tr>';
+ html += '<tr><td>JIRA title</td><td>'+focusWI.jiraData.title+'</td></tr>';
+ html += '<tr><td>JIRA Assigned To</td><td>'+focusWI.jiraData.assignedTo+'</td></tr>';
+ html += '<tr><td>JIRA Status</td><td>'+focusWI.jiraData.status+'</td></tr>';
+ html += '<tr><td><A href="'+focusWI.link+'">Link</A></td><td><input type="text" value="'+focusWI.link+'"</td></tr>';
+ html += '<tr><td>Note</td><td><input type="text" value="'+focusWI.note+'"</td></tr>';
+ html += '<tr><td></td><td><input type="submit" value="save" onclick="updateWI(this)" </input></td></tr>';
+ html += '</table></form>';
+ return html;
+ }
+
+ function updateWI(that) {
+ var wi = wimap[that.id];
+ }
+
function init()
{
planView.getLite().addCallback(plan_getResponse);
}
+
+ function renderPlan(plan, htmlElems)
+ {
+ htmlElems["mscontent"] = "<table border=\"1\" align=\"left\">";
+ htmlElems['mschoice'] = ''; '<input type="text" name="JIRA" value="'+project+'-">in Milestone<select name="mschoice">';
+
+ ms = plan.milestone.list;
+ for(var i=0; i<ms.length; i++) {
+ var mswi = ms[i].workItem.list;
+ htmlElems['mschoice']+='<option>'+ms[i].ID+'</option>';
+ if(mswi.length > 0) {
+ htmlElems['mscontent'] += "<tr><th colspan=\"6\" align=\"left\">Milestone " + ms[i].ID + "</th></tr>";
+
+ htmlElems['mscontent'] +="<tr>"+
+ "<th></th>"+
+ "<th>Jira</th>"+
+ "<th>Jira title</th>"+
+ "<th>Jira Assigned To</th>"+
+ "<th>Status</th>"+
+ "<th>Note</th>"+
+ "<th>Link</th>"+
+ "</tr>";
+
+ for (var j=0; j<mswi.length; j++) {
+ renderWI_RO(mswi[j],plan,htmlElems);
+ }
+ }
+ }
+ renderWI_RW(newWI,plan,htmlElems);
+ htmlElems['mscontent'] += "</table><P>";
+ htmlElems['mschoice'] += '</select>';
+ }
function addWorkItem() {
@@ -107,7 +358,7 @@
function addMilestone()
{
- planView.postNewMilestone(document.newWorkItemForm.newmsname.value).addCallback(plan_postNewMilestone_response);
+ planView.postNewMilestone(document.getElementById('newms').value).addCallback(plan_postNewMilestone_response);
}
function plan_postNewMilestone_response()
@@ -131,18 +382,20 @@
<div id="wilist">
<table>
+ <tr><td>
+ <input type="button" value="Refresh Jira Data" onclick="refreshJiraData()"/>
+ <input type="text" id="newms" value="New Milestone"></input><input type="button" value="add" onclick="addMilestone()"/>
+ </td></tr>
<tr><td><div id="milestones"></div></td></tr>
+
<tr><td>
<form name="newWorkItemForm">
<table>
<tr><td>
<div id=mschoice></div>
</td></tr>
- <tr><td>
- Add New Milestone <input name="newmsname" type=text/><input type="button" onClick="addMilestone()" value="Add Milestone">
- </td></tr>
- <tr><td>
- <input type="button" value="Refresh Jira Data" onclick="refreshJiraData()"/>
+ <tr><td>
+ <div id="wifocus"></div>
</td></tr>
</table>
</form>