summaryrefslogtreecommitdiffstats
path: root/sandbox/kgoodson/jagg-webapp/src
diff options
context:
space:
mode:
Diffstat (limited to 'sandbox/kgoodson/jagg-webapp/src')
-rw-r--r--sandbox/kgoodson/jagg-webapp/src/main/java/services/PlanView.java39
-rw-r--r--sandbox/kgoodson/jagg-webapp/src/main/java/services/PlanViewImpl.java340
-rw-r--r--sandbox/kgoodson/jagg-webapp/src/main/webapp/plan.html351
3 files changed, 681 insertions, 49 deletions
diff --git a/sandbox/kgoodson/jagg-webapp/src/main/java/services/PlanView.java b/sandbox/kgoodson/jagg-webapp/src/main/java/services/PlanView.java
new file mode 100644
index 0000000000..f97babae87
--- /dev/null
+++ b/sandbox/kgoodson/jagg-webapp/src/main/java/services/PlanView.java
@@ -0,0 +1,39 @@
+/*
+ * 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
+ * "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.
+ */
+
+package services;
+
+import org.oasisopen.sca.annotation.Remotable;
+
+import com.example.ipo.jaxb.Plan;
+
+
+
+
+
+@Remotable
+public interface PlanView {
+
+ Plan get();
+ Plan getLite(); // don't go off to issue site - use cached properties
+ void postNewWorkItem(String msChoice, String jira);
+ void postNewMilestone(String newMSName);
+ Plan updateWI(String wi, String jira, String note, String link, String ms);
+
+} \ No newline at end of file
diff --git a/sandbox/kgoodson/jagg-webapp/src/main/java/services/PlanViewImpl.java b/sandbox/kgoodson/jagg-webapp/src/main/java/services/PlanViewImpl.java
new file mode 100644
index 0000000000..35876405af
--- /dev/null
+++ b/sandbox/kgoodson/jagg-webapp/src/main/java/services/PlanViewImpl.java
@@ -0,0 +1,340 @@
+/*
+ * 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
+ * "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.
+ */
+
+package services;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.xml.bind.JAXBContext;
+import javax.xml.bind.JAXBElement;
+import javax.xml.bind.Marshaller;
+import javax.xml.bind.Unmarshaller;
+
+import org.oasisopen.sca.annotation.Init;
+import org.oasisopen.sca.annotation.Property;
+
+import com.example.ipo.jaxb.Item;
+import com.example.ipo.jaxb.JiraData;
+import com.example.ipo.jaxb.Milestone;
+import com.example.ipo.jaxb.Plan;
+import com.example.ipo.jaxb.RSS;
+import com.example.ipo.jaxb.WorkItem;
+
+public class PlanViewImpl implements PlanView {
+
+ static String rssPrefix = "http://issues.apache.org/jira/si/jira.issueviews:issue-xml/";
+ @Property
+ public String planFile = "src/main/resources/jiraSideBand.xml";
+
+ Map<String, Milestone> msmap = null;
+ Map<String, WorkItem> wimap = null;
+ Map<String, Milestone> wi2msmap = null;
+
+ @Init
+ public void init() {
+ }
+
+ private Plan getPlan() {
+ Plan p = null;
+ try {
+ p = readPlan();
+ augmentPlan(p);
+ scanPlan(p);
+ writePlan(p); // writes cached augmentations from jira system, allowing for getLite()
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return p;
+ }
+
+ private void scanPlan(Plan plan)
+ {
+ msmap = new HashMap<String, Milestone>();
+ wimap = new HashMap<String, WorkItem>();
+ wi2msmap = new HashMap<String, Milestone>();
+
+ for(Milestone m : plan.getMilestone()) {
+ msmap.put(m.getID(), m);
+ for (WorkItem wi: m.getWorkItem()) {
+ wimap.put(wi.getID(), wi);
+ wi2msmap.put(wi.getID(), m);
+ }
+ }
+
+ }
+
+
+ private void augmentPlan(Plan plan) {
+ for(Milestone m : plan.getMilestone()) {
+ for (WorkItem wi: m.getWorkItem()) {
+ augmentWorkItem(wi);
+ }
+ }
+ }
+
+ private void augmentWorkItem(WorkItem wi) {
+ String jira = wi.getJira();
+ if(jira != null) {
+ JiraData jd = new JiraData();
+ wi.setJiraData(jd);
+ jd.setID(jira);
+
+ try {
+ JAXBContext jaxbContext = JAXBContext
+ .newInstance("com.example.ipo.jaxb");
+ Unmarshaller m2 = jaxbContext.createUnmarshaller();
+ InputStream is = null;
+ RSS jfeed = null;
+ try{
+ URL url = new URL("http://issues.apache.org/jira/si/jira.issueviews:issue-xml/"+jira+"/"+jira+".xml");
+ is = url.openStream();
+ jfeed = ((JAXBElement<RSS>) m2.unmarshal(is)).getValue();
+ }
+ catch (FileNotFoundException e) {
+ String note = wi.getNote();
+ note += ": attempt to reference non-existent JIRA " + jira;
+ wi.setNote(note);
+ wi.setJira(null);
+ wi.setJiraData(null);
+ }
+ finally {
+ if(is != null) is.close();
+ }
+
+ if(jfeed != null) {
+ Item i = jfeed.getChannel().getItem();
+ List<JAXBElement<?>> c = i.getContent();
+ // TODO see if there's a better way to get this data out
+ for (JAXBElement<?> element : c) {
+ if("title".equals(element.getName().getLocalPart())) {
+ String jtitle = (String)element.getValue();
+ jd.setTitle(jtitle.substring(jtitle.indexOf(']')+1, jtitle.length()));
+ }
+ else if("status".equals(element.getName().getLocalPart())){
+ jd.setStatus((String)element.getValue());
+ }
+ else if("assignee".equals(element.getName().getLocalPart())) {
+ jd.setAssignedTo((String)element.getValue());
+ }
+ }
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ } finally {
+
+ }
+ }
+ }
+
+ public Plan get() {
+ Plan p = getPlan();
+ return p;
+ }
+
+ public Plan getLite() {
+ Plan p = readPlan();
+ scanPlan(p);
+ return p;
+ }
+
+ private Milestone getMS(Plan p, String id) {
+ Milestone rv = null;
+ if(msmap.containsKey(id)) {
+ rv = msmap.get(id);
+ }
+ return rv;
+ }
+
+ public void postNewWorkItem(String msid, String jira) {
+
+ Plan p = getPlan();
+ Milestone m = getMS(p,msid);
+ WorkItem wi = new WorkItem();
+ wi.setJira(jira);
+ augmentWorkItem(wi);
+ m.getWorkItem().add(wi);
+ writePlan(p);
+ }
+
+ public void postNewMilestone(String msid) {
+ Plan p = getPlan();
+ if(getMS(p, msid) == null) {
+ List<Milestone> mis = p.getMilestone();
+ Milestone newm = new Milestone();
+ newm.setID(msid);
+ mis.add(newm);
+ writePlan(p);
+ }
+ }
+
+
+ private void writePlan(Plan p)
+ {
+ FileOutputStream fos = null;
+ String dbPath = null;
+ File existingFile = null;
+ File newFile= null;
+ String backupPath = null;
+
+ try {
+ JAXBContext jaxbContext = JAXBContext
+ .newInstance("com.example.ipo.jaxb");
+ Marshaller m = jaxbContext.createMarshaller();
+ m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
+
+ existingFile = new File(planFile).getAbsoluteFile();
+ dbPath = existingFile.getAbsolutePath();
+
+
+ String tempPath = dbPath.substring(0,dbPath.indexOf(".xml"))+".tmp.xml";
+ backupPath = dbPath.substring(0,dbPath.indexOf(".xml"));
+ DateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");
+ String timestamp = df.format(Calendar.getInstance().getTime());
+ backupPath+= timestamp;
+ backupPath+=".xml";
+
+ newFile = new File(tempPath).getAbsoluteFile();
+ fos = new FileOutputStream(newFile);
+
+
+ m.marshal(p, fos);
+ } catch (Exception e) {
+ e.printStackTrace();
+ } finally {
+
+ }
+
+
+ if(fos!=null)
+ try {
+ fos.close();
+
+ new File(dbPath).renameTo(new File(backupPath));
+ newFile.renameTo(new File(dbPath));
+
+
+ } catch (IOException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ }
+
+ private Plan readPlan()
+ {
+ Plan p = null;
+ try {
+ JAXBContext jaxbContext = JAXBContext
+ .newInstance("com.example.ipo.jaxb");
+ Unmarshaller m = jaxbContext.createUnmarshaller();
+
+ File inputFile = new File(planFile).getAbsoluteFile();
+ if(!inputFile.exists()){ // start afresh
+ Plan newPlan = new Plan();
+ writePlan(newPlan);
+ inputFile = new File(planFile).getAbsoluteFile();
+ }
+
+ p = (Plan)m.unmarshal(inputFile);
+ } catch(Exception e) {
+ throw new IllegalStateException("Failed to read plan file",e);
+ }
+ return p;
+ }
+
+ public Plan updateWI(String wiID, String jira, String note, String link, String msID) {
+ Plan p = getLite();
+
+ WorkItem wi = null;
+ boolean newMS = false;
+ boolean newWI = false;
+ boolean changedMS = false;
+
+ // existing or new WI
+
+ if(wimap.containsKey(wiID)) {
+ wi = wimap.get(wiID);
+ } else if("_new_".equals(wiID)) {
+
+ newWI = true;
+ wi = new WorkItem();
+ p.setMaxWorkItemID(p.getMaxWorkItemID()+1); // Note concurrency issue possibility. No mutex around this
+ wi.setID("wi"+p.getMaxWorkItemID());
+ wiID = wi.getID();
+
+ // TODO ensure wi2msmap updated below
+ } else {
+ throw new IllegalStateException("Work Item not known: " + wiID);
+ }
+
+ Milestone ms = null;
+ if(msID == null || "".equals(msID)) {
+ msID = "unassigned";
+ }
+
+ if(msmap.containsKey(msID)) {
+ ms = getMS(p, msID);
+ } else {
+ newMS = true;
+ ms = new Milestone();
+ ms.setID(msID);;;
+ }
+
+ if(!newWI && !msID.equals(wi2msmap.get(wiID).getID())) {
+ changedMS = true;
+ }
+
+
+ wi.setJira(jira);
+ wi.setNote(note);
+ wi.setLink(link);
+ augmentWorkItem(wi);
+
+ if(newMS) {
+ p.getMilestone().add(ms);
+ }
+ if(newWI) {
+ ms.getWorkItem().add(wi);
+ }
+
+ if(changedMS) {
+ Milestone oldms = wi2msmap.get(wi.getID());
+ oldms.getWorkItem().remove(wi);
+ ms.getWorkItem().add(wi);
+ }
+
+ writePlan(p);
+
+ return p;
+ }
+
+ private WorkItem getWorkItem(String wiID) {
+ return wimap.get(wiID);
+ }
+} \ No newline at end of file
diff --git a/sandbox/kgoodson/jagg-webapp/src/main/webapp/plan.html b/sandbox/kgoodson/jagg-webapp/src/main/webapp/plan.html
index 3301507afa..3df3b5c23e 100644
--- a/sandbox/kgoodson/jagg-webapp/src/main/webapp/plan.html
+++ b/sandbox/kgoodson/jagg-webapp/src/main/webapp/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()
@@ -130,18 +381,20 @@
<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>