reasonably usable now, still no workitem delete
git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@926140 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
48209b6ab2
commit
bec9b7fb64
3 changed files with 681 additions and 49 deletions
|
|
@ -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);
|
||||
|
||||
}
|
||||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
@ -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\">";
|
||||
|
||||
|
||||
|
||||
var mschoice = 'Add new Work Item for JIRA: <input type="text" name="JIRA" value="'+project+'-">in Milestone<select name="mschoice">';
|
||||
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>";
|
||||
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>";
|
||||
}
|
||||
|
||||
}
|
||||
mscontent += "</table><P>";
|
||||
mschoice += '</select><input type="button" onClick="addWorkItem()" value="Add Work Item">';
|
||||
|
||||
document.getElementById('milestones').innerHTML='<h2>' + mscontent;
|
||||
plan = p;
|
||||
|
||||
|
||||
document.getElementById('mschoice').innerHTML=mschoice;
|
||||
msmap = new Object();
|
||||
wimap = new Object();
|
||||
wi2msmap = new Object();
|
||||
nullms = new MS();
|
||||
|
||||
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++) {
|
||||
msmap[ms[i].ID] = ms[i];
|
||||
var mswi = ms[i].workItem.list;
|
||||
for (var j=0; j<mswi.length; j++) {
|
||||
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;
|
||||
}
|
||||
|
||||
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>';
|
||||
|
||||
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>
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue