Fix Programme display
This commit is contained in:
+230
-99
@@ -1,111 +1,242 @@
|
|||||||
var scheds = {};
|
var taskStatus = {'Stand':'Stand',
|
||||||
|
'Table ronde':'Table-ronde',
|
||||||
|
'Atelier':'Atelier',
|
||||||
|
'Concert':'Concert',
|
||||||
|
'Conference':'Conference',
|
||||||
|
'Repas':'Repas'};
|
||||||
|
var tickFormat = "%H:%M";
|
||||||
|
var margin = {
|
||||||
|
top : 15,
|
||||||
|
right : 0,
|
||||||
|
bottom : 0,
|
||||||
|
left : 50
|
||||||
|
};
|
||||||
|
var height = 500;
|
||||||
|
var width = 730;
|
||||||
|
var Keys = Array();
|
||||||
|
var Salles = Array();
|
||||||
|
var Areas = Array();
|
||||||
|
var Tasks = Array();
|
||||||
|
|
||||||
function example() {
|
|
||||||
|
|
||||||
var taskStatus = {'Stand':'Stand',
|
|
||||||
'Table ronde':'Table-ronde',
|
|
||||||
'Atelier':'Atelier',
|
|
||||||
'Concert':'Concert',
|
|
||||||
'Conference':'Conference',
|
|
||||||
'Repas':'Repas'}
|
|
||||||
|
|
||||||
d3.json("le-prog-json", function(error, JsonContent) {
|
d3.json("le-prog-json",
|
||||||
if (error)
|
function(error, json) {
|
||||||
return console.warn(error);
|
if (error) return console.warn(error);
|
||||||
$.each( JsonContent,
|
var Keys = Object.keys(json["all"])
|
||||||
function( EventType, ListEvType ) {
|
// Build set of data in memory
|
||||||
$.each( ListEvType,
|
for (var k = 0; k < Keys.length; k++) {
|
||||||
function( Day, ListEvent ) {
|
Salles[Keys[k]] = Array();
|
||||||
var placeNames = [];
|
Areas[Keys[k]] = Array();
|
||||||
for ( var i = 0; i < ListEvent.length; i++) {
|
Tasks[Keys[k]] = json["all"][Keys[k]]
|
||||||
placeNames.push(ListEvent[i]["placeName"]);
|
// Fix Json to make date objects
|
||||||
// convert json text to js Date
|
Tasks[Keys[k]].forEach(function(d) {
|
||||||
ListEvent[i]["startDate"] = new Date(ListEvent[i]["startDate"]);
|
d.startDate = new Date(d.startDate);
|
||||||
ListEvent[i]["endDate"] = new Date(ListEvent[i]["endDate"]);
|
d.endDate = new Date(d.endDate);
|
||||||
}
|
})
|
||||||
//placeNames.push("unk")
|
|
||||||
scheds[EventType+"_"+Day] = new d3.sched("SVG_"+Day)
|
// Build the list of Salles and Areas
|
||||||
.taskTypes(placeNames)
|
Tasks[Keys[k]].forEach(function(d) {
|
||||||
.taskStatus(taskStatus)
|
Salles[Keys[k]].push( d.placeName );
|
||||||
.tickFormat("%H:%M");
|
Areas[Keys[k]].push( d.status );
|
||||||
//scheds[EventType+"_"+Day].timeDomainMode("fit");
|
} )
|
||||||
//scheds[EventType+"_"+Day].margin(margin);
|
Salles[Keys[k]] = d3.set(Salles[Keys[k]]).values();
|
||||||
scheds[EventType+"_"+Day](ListEvent);
|
Areas[Keys[k]] = d3.set(Areas[Keys[k]]).values();
|
||||||
//scheds[EventType+"_"+Day].zoomed();
|
// Create Controls to Handle user selection
|
||||||
scheds[EventType+"_"+Day].redraw("SVG_"+Day, ListEvent)
|
Areas[Keys[k]].forEach(function(TypeArea) {
|
||||||
});
|
d3.select("#Schedule_SVG_"+Keys[k])
|
||||||
|
.append("input")
|
||||||
|
.attr("type", "checkbox")
|
||||||
|
.attr("name", "OptTimetable-"+Keys[k])
|
||||||
|
.attr("id", TypeArea+"-"+Keys[k])
|
||||||
|
.attr("area", TypeArea)
|
||||||
|
.style("float", "left")
|
||||||
|
.style("margin-left", "5px")
|
||||||
|
.property("checked",true);
|
||||||
|
|
||||||
|
d3.select("#Schedule_SVG_"+Keys[k])
|
||||||
|
.append("label")
|
||||||
|
.attr("for", TypeArea+"-"+Keys[k])
|
||||||
|
.style("float", "left")
|
||||||
|
.style("margin-left", "5px")
|
||||||
|
.text(TypeArea);
|
||||||
|
});
|
||||||
|
// Create a dedicated SVG for it
|
||||||
|
svg = d3.select("#Schedule_SVG_"+Keys[k])
|
||||||
|
.append("svg")
|
||||||
|
.attr("id", "TimeTable-"+Keys[k])
|
||||||
|
.attr("width", width + margin.right + margin.left)
|
||||||
|
.attr("height", height + margin.top + margin.bottom)
|
||||||
|
//.attr("viewBox", "0 0 " + width + " " + height )
|
||||||
|
//.attr("preserveAspectRatio", "xMidYMid");
|
||||||
|
|
||||||
|
svg.append("g")
|
||||||
|
.attr("class", "xAxis axis");
|
||||||
|
|
||||||
|
svg.append("g")
|
||||||
|
.attr("class", "yAxis axis");
|
||||||
|
|
||||||
|
var chart = svg.append("g")
|
||||||
|
.attr("class", "timetable");
|
||||||
|
|
||||||
|
HandleEvents(Keys[k])
|
||||||
|
displayit(json["all"][Keys[k]], Salles[Keys[k]], Keys[k]);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
var keyFunction = function(d) {
|
||||||
|
return d.startDate + d.placeName + d.endDate;
|
||||||
|
};
|
||||||
|
|
||||||
|
function HandleEvents(Ctrl) {
|
||||||
|
d3.selectAll("input[name=OptTimetable-"+Ctrl+"]")
|
||||||
|
.data(Areas[Ctrl])
|
||||||
|
.on("change", function(TypeData) {
|
||||||
|
ArrayChoice = Array()
|
||||||
|
checked = d3.selectAll("input[name=OptTimetable-"+Ctrl+"]")[0]
|
||||||
|
.forEach( function(v)
|
||||||
|
{
|
||||||
|
if (d3.select(v).node().checked)
|
||||||
|
ArrayChoice.push(v.attributes['area'].value)
|
||||||
|
}
|
||||||
|
)
|
||||||
|
area_select = Array()
|
||||||
|
selection = Tasks[Ctrl].filter(function(v) {
|
||||||
|
return ArrayChoice.indexOf(v.status)>=0;
|
||||||
|
});
|
||||||
|
if (selection.length) {
|
||||||
|
selection.forEach(function(d)
|
||||||
|
{ area_select.push( d.placeName ); }
|
||||||
|
);
|
||||||
|
area_select = d3.set(area_select).values();
|
||||||
|
displayit(selection, area_select, Ctrl);
|
||||||
|
d3.select("#TimeTable-"+Ctrl)[0][0].style.opacity = 1;
|
||||||
|
} else {
|
||||||
|
d3.select("#TimeTable-"+Ctrl)[0][0].style.opacity = 0;
|
||||||
|
}
|
||||||
});
|
});
|
||||||
});
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
// Query Programme
|
|
||||||
example();
|
|
||||||
|
|
||||||
function changeTimeDomain(timeDomainString) {
|
|
||||||
this.timeDomainString = timeDomainString;
|
|
||||||
switch (timeDomainString) {
|
|
||||||
case "1hr":
|
|
||||||
format = "%H:%M:%S";
|
|
||||||
sched.timeDomain([ d3.time.hour.offset(getEndDate(), -1), getEndDate() ]);
|
|
||||||
break;
|
|
||||||
case "3hr":
|
|
||||||
format = "%H:%M";
|
|
||||||
sched.timeDomain([ d3.time.hour.offset(getEndDate(), -3), getEndDate() ]);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "6hr":
|
|
||||||
format = "%H:%M";
|
|
||||||
sched.timeDomain([ d3.time.hour.offset(getEndDate(), -6), getEndDate() ]);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "1day":
|
|
||||||
format = "%H:%M";
|
|
||||||
sched.timeDomain([ d3.time.day.offset(getEndDate(), -1), getEndDate() ]);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "1week":
|
|
||||||
format = "%a %H:%M";
|
|
||||||
sched.timeDomain([ d3.time.day.offset(getEndDate(), -7), getEndDate() ]);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
format = "%H:%M"
|
|
||||||
|
|
||||||
}
|
|
||||||
sched.tickFormat(format);
|
|
||||||
sched.redraw(tasks);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function getEndDate() {
|
|
||||||
var lastEndDate = Date.now();
|
|
||||||
if (tasks.length > 0) {
|
|
||||||
lastEndDate = tasks[tasks.length - 1].endDate;
|
|
||||||
}
|
|
||||||
|
|
||||||
return lastEndDate;
|
function displayit(Set_of_Task, Set_of_Area, key) {
|
||||||
}
|
// Try to compute time range
|
||||||
|
Set_of_Task.sort(function(a, b) {
|
||||||
|
return a.endDate - b.endDate;
|
||||||
|
});
|
||||||
|
timeDomainEnd = Set_of_Task[Set_of_Task.length - 1].endDate;
|
||||||
|
Set_of_Task.sort(function(a, b) {
|
||||||
|
return a.startDate - b.startDate;
|
||||||
|
});
|
||||||
|
timeDomainStart = Set_of_Task[0].startDate;
|
||||||
|
|
||||||
function addTask() {
|
// Prepare scales
|
||||||
|
xScale = d3.scale.ordinal()
|
||||||
|
.domain(Set_of_Area)
|
||||||
|
.rangeRoundBands([ 0, width ], .1);
|
||||||
|
|
||||||
|
yScale = d3.time.scale()
|
||||||
|
.domain([ timeDomainStart, timeDomainEnd ])
|
||||||
|
.range([ 0, height - margin.top - margin.bottom ])
|
||||||
|
.clamp(true);
|
||||||
|
|
||||||
var lastEndDate = getEndDate();
|
xAxis = d3.svg.axis()
|
||||||
var taskStatusKeys = Object.keys(taskStatus);
|
.scale(xScale)
|
||||||
var taskStatusName = taskStatusKeys[Math.floor(Math.random() * taskStatusKeys.length)];
|
.orient("top")
|
||||||
var taskName = taskNames[Math.floor(Math.random() * taskNames.length)];
|
.tickSize(1);
|
||||||
|
|
||||||
tasks.push({
|
yAxis = d3.svg.axis()
|
||||||
"startDate" : d3.time.hour.offset(lastEndDate, Math.ceil(1 * Math.random())),
|
.scale(yScale)
|
||||||
"endDate" : d3.time.hour.offset(lastEndDate, (Math.ceil(Math.random() * 3)) + 1),
|
.orient("left")
|
||||||
"taskName" : taskName,
|
.tickFormat(d3.time.format(tickFormat))
|
||||||
"status" : taskStatusName
|
.tickSubdivide(true)
|
||||||
});
|
.tickSize(8)
|
||||||
|
.tickPadding(8);
|
||||||
|
|
||||||
changeTimeDomain(timeDomainString);
|
var svg = d3.select("#TimeTable-"+key);
|
||||||
|
|
||||||
|
var chart = svg.select(".timetable")
|
||||||
|
|
||||||
|
var content = chart.selectAll("foreignObject")
|
||||||
|
.data(Set_of_Task, keyFunction);
|
||||||
|
|
||||||
|
content.enter()
|
||||||
|
.insert("foreignObject",":first-child")
|
||||||
|
.append("xhtml:div")
|
||||||
|
.html(function(d) {
|
||||||
|
return '<div style="padding:5px;height:100%"><a href="/event/'+ d.uid +
|
||||||
|
'">' + d.desc + '</a></div>'
|
||||||
|
})
|
||||||
|
.transition()
|
||||||
|
.duration(750);
|
||||||
|
|
||||||
|
content.transition()
|
||||||
|
.duration(750)
|
||||||
|
.attr("x", function(d){
|
||||||
|
return xScale(d.placeName || "unk");
|
||||||
|
})
|
||||||
|
.attr("y", function(d){
|
||||||
|
return yScale( d.startDate );
|
||||||
|
})
|
||||||
|
.attr("width", function(d) {
|
||||||
|
return xScale.rangeBand();
|
||||||
|
})
|
||||||
|
.attr("height", function(d) {
|
||||||
|
return (yScale( d.endDate ) - yScale( d.startDate ));
|
||||||
|
});
|
||||||
|
|
||||||
|
content.exit()
|
||||||
|
.transition()
|
||||||
|
.duration(300)
|
||||||
|
.style("opacity", 1e-6)
|
||||||
|
.remove();
|
||||||
|
|
||||||
|
var rect = chart.selectAll("rect")
|
||||||
|
.data(Set_of_Task, keyFunction);
|
||||||
|
|
||||||
|
rect.enter()
|
||||||
|
.insert("rect",":first-child")
|
||||||
|
.attr("rx", 5)
|
||||||
|
.attr("ry", 5)
|
||||||
|
.attr("filter", "url(/img/shadow.svg#dropshadow)")
|
||||||
|
//.attr("style", "fill:url(/img/shadow.svg#BoxGradient)")
|
||||||
|
.attr("class", function(d){
|
||||||
|
if(taskStatus[d.status] == null)
|
||||||
|
{ return "bar";}
|
||||||
|
return taskStatus[d.status];
|
||||||
|
})
|
||||||
|
.transition()
|
||||||
|
.duration(750)
|
||||||
|
|
||||||
|
|
||||||
|
rect.transition()
|
||||||
|
.duration(750)
|
||||||
|
.attr("x", function(d){
|
||||||
|
return xScale(d.placeName || "unk");
|
||||||
|
})
|
||||||
|
.attr("y", function(d){
|
||||||
|
return yScale( d.startDate )+1;
|
||||||
|
})
|
||||||
|
.attr("width", function(d) {
|
||||||
|
return xScale.rangeBand();
|
||||||
|
})
|
||||||
|
.attr("height", function(d) {
|
||||||
|
return (yScale( d.endDate ) - yScale( d.startDate )-2);
|
||||||
|
});
|
||||||
|
|
||||||
|
rect.exit()
|
||||||
|
.transition()
|
||||||
|
.duration(300)
|
||||||
|
.style("opacity", 1e-6)
|
||||||
|
.remove();
|
||||||
|
|
||||||
|
svg.select(".yAxis")
|
||||||
|
.attr("transform", "translate("+ margin.left +","+ margin.top +")")
|
||||||
|
.transition()
|
||||||
|
.call(yAxis);
|
||||||
|
|
||||||
sched.redraw(tasks);
|
svg.select(".xAxis")
|
||||||
};
|
.attr("transform", "translate("+ margin.left +","+ margin.top +")")
|
||||||
|
.transition()
|
||||||
|
.call(xAxis);
|
||||||
|
|
||||||
function removeTask() {
|
chart.attr("transform", "translate("+ margin.left +","+ margin.top +")");
|
||||||
tasks.pop();
|
}
|
||||||
changeTimeDomain(timeDomainString);
|
|
||||||
sched.redraw(tasks);
|
|
||||||
};
|
|
||||||
@@ -14,18 +14,22 @@ TabDisplay = [
|
|||||||
height: 65px;
|
height: 65px;
|
||||||
}
|
}
|
||||||
.Conference {
|
.Conference {
|
||||||
fill:#EEE;
|
fill:#f9fde8;
|
||||||
stroke: #ccc;
|
stroke: #a2bc13;
|
||||||
}
|
}
|
||||||
.Concert {
|
.Concert {
|
||||||
fill:#2EE;
|
fill:#2EE;
|
||||||
stroke: #ccc;
|
stroke: #ccc;
|
||||||
}
|
}
|
||||||
.Atelier {
|
.Atelier {
|
||||||
fill: #ddd;
|
fill: #faebeb;
|
||||||
stroke: #ccc;
|
stroke: #dc7070;
|
||||||
}
|
}
|
||||||
.txtsched {
|
.Table-ronde {
|
||||||
|
fill: #fff4e5;
|
||||||
|
stroke: #ff9912;
|
||||||
|
}
|
||||||
|
.Repas {
|
||||||
fill:#2EE;
|
fill:#2EE;
|
||||||
stroke: #ccc;
|
stroke: #ccc;
|
||||||
}
|
}
|
||||||
@@ -35,7 +39,7 @@ svg {
|
|||||||
}
|
}
|
||||||
|
|
||||||
rect {
|
rect {
|
||||||
fill: #ddd;
|
stroke-width: 0px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.axis path,
|
.axis path,
|
||||||
@@ -147,6 +151,6 @@ if Counter==0:
|
|||||||
##</div>
|
##</div>
|
||||||
<br/><br/>
|
<br/><br/>
|
||||||
<script type="text/javascript" src="/vendor/d3js/d3.v3.min.js"></script>
|
<script type="text/javascript" src="/vendor/d3js/d3.v3.min.js"></script>
|
||||||
<script type="text/javascript" src="/js/Schedule.js"></script>
|
##<script type="text/javascript" src="/js/Schedule.js"></script>
|
||||||
<script type="text/javascript" src="/js/programme.js"></script>
|
<script type="text/javascript" src="/js/programme.js"></script>
|
||||||
##<script type="text/javascript" src="/js/sched.js"></script>
|
##<script type="text/javascript" src="/js/sched.js"></script>
|
||||||
|
|||||||
Reference in New Issue
Block a user