Author: kelvingoodson
Date: Mon Mar 22 15:37:56 2010
New Revision: 926140

URL: http://svn.apache.org/viewvc?rev=926140&view=rev
Log:
reasonably usable now, still no workitem delete

Added:
    tuscany/sandbox/kgoodson/jagg-webapp/src/main/java/services/
    tuscany/sandbox/kgoodson/jagg-webapp/src/main/java/services/PlanView.java   
(with props)
    
tuscany/sandbox/kgoodson/jagg-webapp/src/main/java/services/PlanViewImpl.java   
(with props)
Modified:
    tuscany/sandbox/kgoodson/jagg-webapp/src/main/webapp/plan.html

Added: tuscany/sandbox/kgoodson/jagg-webapp/src/main/java/services/PlanView.java
URL: 
http://svn.apache.org/viewvc/tuscany/sandbox/kgoodson/jagg-webapp/src/main/java/services/PlanView.java?rev=926140&view=auto
==============================================================================
--- tuscany/sandbox/kgoodson/jagg-webapp/src/main/java/services/PlanView.java 
(added)
+++ tuscany/sandbox/kgoodson/jagg-webapp/src/main/java/services/PlanView.java 
Mon Mar 22 15:37:56 2010
@@ -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

Propchange: 
tuscany/sandbox/kgoodson/jagg-webapp/src/main/java/services/PlanView.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
tuscany/sandbox/kgoodson/jagg-webapp/src/main/java/services/PlanView.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: 
tuscany/sandbox/kgoodson/jagg-webapp/src/main/java/services/PlanViewImpl.java
URL: 
http://svn.apache.org/viewvc/tuscany/sandbox/kgoodson/jagg-webapp/src/main/java/services/PlanViewImpl.java?rev=926140&view=auto
==============================================================================
--- 
tuscany/sandbox/kgoodson/jagg-webapp/src/main/java/services/PlanViewImpl.java 
(added)
+++ 
tuscany/sandbox/kgoodson/jagg-webapp/src/main/java/services/PlanViewImpl.java 
Mon Mar 22 15:37:56 2010
@@ -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

Propchange: 
tuscany/sandbox/kgoodson/jagg-webapp/src/main/java/services/PlanViewImpl.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
tuscany/sandbox/kgoodson/jagg-webapp/src/main/java/services/PlanViewImpl.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Modified: tuscany/sandbox/kgoodson/jagg-webapp/src/main/webapp/plan.html
URL: 
http://svn.apache.org/viewvc/tuscany/sandbox/kgoodson/jagg-webapp/src/main/webapp/plan.html?rev=926140&r1=926139&r2=926140&view=diff
==============================================================================
--- tuscany/sandbox/kgoodson/jagg-webapp/src/main/webapp/plan.html (original)
+++ tuscany/sandbox/kgoodson/jagg-webapp/src/main/webapp/plan.html Mon Mar 22 
15:37:56 2010
@@ -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>


Reply via email to