Difference between revisions of "HTML Presentation Object: Gantt chart"
Jump to navigation
Jump to search
m |
m |
||
| Line 1: | Line 1: | ||
| − | The following query contains example data for the gantt chart. Add it to a HTML presentation object's dataset with name "exampleData". Note that this example needs [[QPR Reporting Expression]] datasource installed. | + | The following query contains example data for the gantt chart. Add it to a HTML presentation object's dataset with name "exampleData". Note that this example needs [[QPR Reporting Expression]] datasource installed. To use the gantt charts for a real purpose, replace the example query with a query that access the data. |
<pre> | <pre> | ||
| Line 19: | Line 19: | ||
<script> | <script> | ||
| + | var taskNameColumn = "TaskName"; | ||
| + | var startDateColumn = "StartDate"; | ||
| + | var endDateColumn = "EndDate"; | ||
| + | var plannedStartDateColumn = "PlannedStartDate"; | ||
| + | var plannedEndDateColumn = "PlannedEndDate"; | ||
| + | var progressColumn = "Progress"; | ||
var poData<#uniqueId>; | var poData<#uniqueId>; | ||
var width<#uniqueId>; | var width<#uniqueId>; | ||
| Line 40: | Line 46: | ||
} | } | ||
for (var i = 0; i < poData<#uniqueId>.length; i++) { | for (var i = 0; i < poData<#uniqueId>.length; i++) { | ||
| − | poData<#uniqueId>[i][ | + | poData<#uniqueId>[i][startDateColumn] = parseInt(poData<#uniqueId>[i][startDateColumn].replace("/Date(", "").replace(")/", "")); |
| − | poData<#uniqueId>[i][ | + | poData<#uniqueId>[i][endDateColumn] = parseInt(poData<#uniqueId>[i][endDateColumn].replace("/Date(", "").replace(")/", "")); |
| − | poData<#uniqueId>[i][ | + | poData<#uniqueId>[i][plannedStartDateColumn] = parseInt(poData<#uniqueId>[i][plannedStartDateColumn].replace("/Date(", "").replace(")/", "")); |
| − | poData<#uniqueId>[i][ | + | poData<#uniqueId>[i][plannedEndDateColumn] = parseInt(poData<#uniqueId>[i][plannedEndDateColumn].replace("/Date(", "").replace(")/", "")); |
| − | poData<#uniqueId>[i]["ProgressPoint"] = (new Date(poData<#uniqueId>[i][ | + | poData<#uniqueId>[i]["ProgressPoint"] = (new Date(poData<#uniqueId>[i][startDateColumn] + (poData<#uniqueId>[i][endDateColumn] - poData<#uniqueId>[i][startDateColumn]) * poData<#uniqueId>[i][progressColumn] / 100)).getTime(); |
} | } | ||
drawPO<#uniqueId>(); | drawPO<#uniqueId>(); | ||
| Line 95: | Line 101: | ||
formatter: function () { | formatter: function () { | ||
return "<span style='font-weight: bold;font-size:125%;'>" + this.point.name + "</span></br>Actual: <b>" + | return "<span style='font-weight: bold;font-size:125%;'>" + this.point.name + "</span></br>Actual: <b>" + | ||
| − | (new Date(this.point | + | (new Date(this.point[startDateColumn])).toLocaleDateString() + "</b> - <b>" + (new Date(this.point.EndDate)).toLocaleDateString() + "</b></br>" + |
"Planned: <b>" + (new Date(this.point.PlannedStartDate)).toLocaleDateString() + "</b> - <b>" + | "Planned: <b>" + (new Date(this.point.PlannedStartDate)).toLocaleDateString() + "</b> - <b>" + | ||
(new Date(this.point.PlannedEndDate)).toLocaleDateString() + "</b></br>" + | (new Date(this.point.PlannedEndDate)).toLocaleDateString() + "</b></br>" + | ||
| Line 109: | Line 115: | ||
borderRadius: 0, | borderRadius: 0, | ||
borderWidth: 0, | borderWidth: 0, | ||
| − | data: formatDataset(poData<#uniqueId>, {"low": | + | data: formatDataset(poData<#uniqueId>, {"low": startDateColumn, "StartDate": startDateColumn, "high": "ProgressPoint", "progress": progressColumn, "name": taskNameColumn}), |
dataLabels: { | dataLabels: { | ||
enabled: true, | enabled: true, | ||
| Line 128: | Line 134: | ||
borderRadius: 0, | borderRadius: 0, | ||
borderWidth: 0, | borderWidth: 0, | ||
| − | data: formatDataset(poData<#uniqueId>, {"low": "ProgressPoint", "high": | + | data: formatDataset(poData<#uniqueId>, {"low": "ProgressPoint", "high": endDateColumn, "EndDate": endDateColumn, "progress": progressColumn, "name": taskNameColumn}), |
dataLabels: { | dataLabels: { | ||
enabled: true, | enabled: true, | ||
| Line 145: | Line 151: | ||
borderRadius: 0, | borderRadius: 0, | ||
borderWidth: 0, | borderWidth: 0, | ||
| − | data: formatDataset(poData<#uniqueId>, {"low": | + | data: formatDataset(poData<#uniqueId>, {"low": plannedStartDateColumn, "PlannedStartDate": plannedStartDateColumn, "high": plannedEndDateColumn, "PlannedEndDate": plannedEndDateColumn, "progress": progressColumn, "name": taskNameColumn}), |
dataLabels: { | dataLabels: { | ||
enabled: true, | enabled: true, | ||
| Line 201: | Line 207: | ||
} | } | ||
</script> | </script> | ||
| + | |||
</pre> | </pre> | ||
[[Category: QPR UI]] | [[Category: QPR UI]] | ||
Revision as of 19:11, 16 December 2017
The following query contains example data for the gantt chart. Add it to a HTML presentation object's dataset with name "exampleData". Note that this example needs QPR Reporting Expression datasource installed. To use the gantt charts for a real purpose, replace the example query with a query that access the data.
data0=CreateDataset(Array('TaskName', 'StartDate', 'EndDate', 'PlannedStartDate', 'PlannedEndDate', 'Progress'))
data1=AddDatasetRow([data0], 'Project Task 1', NewDatetime(2017,1,1), NewDatetime(2017,2,15), NewDatetime(2017,1,10), NewDatetime(2017,2,20), 35)
data2=AddDatasetRow([data1], 'Project Task 2', NewDatetime(2017,2,1), NewDatetime(2017,4,1), NewDatetime(2017,2,1), NewDatetime(2017,3,15), 90)
data3=AddDatasetRow([data2], 'Project Task 3', NewDatetime(2017,4,1), NewDatetime(2017,6,1), NewDatetime(2017,4,5), NewDatetime(2017,6,15), 15)
data4=AddDatasetRow([data3], 'Project Task 4', NewDatetime(2017,4,10), NewDatetime(2017,7,31), NewDatetime(2017,4,10), NewDatetime(2017,7,31), 10)
data5=AddDatasetRow([data4], 'Project Task 5', NewDatetime(2017,5,1), NewDatetime(2017,8,1), NewDatetime(2017,5,10), NewDatetime(2017,7,16), 100)
data6=AddDatasetRow([data5], 'Project Task 6', NewDatetime(2017,7,1), NewDatetime(2017,7,31), NewDatetime(2017,6,20), NewDatetime(2017,7,20), 0)
data7=AddDatasetRow([data6], 'Project Task 7', NewDatetime(2017,8,1), NewDatetime(2017,10,15), NewDatetime(2017,7,15), NewDatetime(2017,9,30), 50)
data8=AddDatasetRow([data7], 'Project Task 8', NewDatetime(2017,8,1), NewDatetime(2017,10,1), NewDatetime(2017,8,10), NewDatetime(2017,10,1), 30)
data9=AddDatasetRow([data8], 'Project Task 9', NewDatetime(2017,9,1), NewDatetime(2017,11,1), NewDatetime(2017,8,20), NewDatetime(2017,10,20), 5)
Set the Horizontal scrollbar and Vertical scrollbar to Hidden. Use the following HTML code:
<div id="container<#uniqueId>"></div>
<script>
var taskNameColumn = "TaskName";
var startDateColumn = "StartDate";
var endDateColumn = "EndDate";
var plannedStartDateColumn = "PlannedStartDate";
var plannedEndDateColumn = "PlannedEndDate";
var progressColumn = "Progress";
var poData<#uniqueId>;
var width<#uniqueId>;
var height<#uniqueId>;
function <#datasetChangeFunction>(datasetIdentifier, datasetChangeCallbackFunction) {
if (datasetIdentifier == "exampleData") {
datasetChangeCallbackFunction(myDatasetAvailable<#uniqueId>);
}
}
function myDatasetAvailable<#uniqueId>(datasetData) {
if (datasetData == null || datasetData.sheets == null || datasetData.sheets.length == 0 || datasetData.sheets[0] == null || datasetData.sheets[0].values == null || datasetData.sheets[0].values.length == 0) return;
poData<#uniqueId> = [];
for (var row = 1; row < datasetData.sheets[0].values[0].length; row++) {
var rowObject = {};
for (var column = 0; column < datasetData.sheets[0].values.length; column++) {
rowObject[datasetData.sheets[0].values[column][0].attribute] = datasetData.sheets[0].values[column][row].value;
}
poData<#uniqueId>.push(rowObject);
}
for (var i = 0; i < poData<#uniqueId>.length; i++) {
poData<#uniqueId>[i][startDateColumn] = parseInt(poData<#uniqueId>[i][startDateColumn].replace("/Date(", "").replace(")/", ""));
poData<#uniqueId>[i][endDateColumn] = parseInt(poData<#uniqueId>[i][endDateColumn].replace("/Date(", "").replace(")/", ""));
poData<#uniqueId>[i][plannedStartDateColumn] = parseInt(poData<#uniqueId>[i][plannedStartDateColumn].replace("/Date(", "").replace(")/", ""));
poData<#uniqueId>[i][plannedEndDateColumn] = parseInt(poData<#uniqueId>[i][plannedEndDateColumn].replace("/Date(", "").replace(")/", ""));
poData<#uniqueId>[i]["ProgressPoint"] = (new Date(poData<#uniqueId>[i][startDateColumn] + (poData<#uniqueId>[i][endDateColumn] - poData<#uniqueId>[i][startDateColumn]) * poData<#uniqueId>[i][progressColumn] / 100)).getTime();
}
drawPO<#uniqueId>();
}
function <#resizeFunction>(newWidth, newHeight) {
width<#uniqueId> = newWidth;
height<#uniqueId> = newHeight;
$("#container<#uniqueId>").width(newWidth);
$("#container<#uniqueId>").height(newHeight);
drawPO<#uniqueId>();
}
function drawPO<#uniqueId>() {
if (poData<#uniqueId> == null || width<#uniqueId> == null) return;
$("#container<#uniqueId>").empty();
Highcharts.chart("container<#uniqueId>", {
chart: {
type: 'columnrange',
inverted: true,
zoomType: 'y'
},
title: {
text: 'Gantt chart' },
xAxis: {
type: "category",
labels: {
style: {
fontSize: '13px'
}
}
},
credits: { enabled: false },
yAxis: {
type: 'datetime',
opposite: true,
tickPixelInterval: 90,
dateTimeLabelFormats: {
day: '%d/%m', week: '%d/%m', month: '%m/%Y', year: '%Y'
},
title: "",
labels: {
style: {
fontSize: '13px'
}
}
},
tooltip: {
useHTML: true,
formatter: function () {
return "<span style='font-weight: bold;font-size:125%;'>" + this.point.name + "</span></br>Actual: <b>" +
(new Date(this.point[startDateColumn])).toLocaleDateString() + "</b> - <b>" + (new Date(this.point.EndDate)).toLocaleDateString() + "</b></br>" +
"Planned: <b>" + (new Date(this.point.PlannedStartDate)).toLocaleDateString() + "</b> - <b>" +
(new Date(this.point.PlannedEndDate)).toLocaleDateString() + "</b></br>" +
"Progress: <b>" + this.point.progress + " %</b>";
}
},
legend: { enabled: false },
series: [{
color: "#195283",
stacking: "normal",
pointPadding: 0,
groupPadding: 0,
borderRadius: 0,
borderWidth: 0,
data: formatDataset(poData<#uniqueId>, {"low": startDateColumn, "StartDate": startDateColumn, "high": "ProgressPoint", "progress": progressColumn, "name": taskNameColumn}),
dataLabels: {
enabled: true,
align: 'center',
inside: true,
verticalAlign:"middle",
format: '{point.progress} %',
style: {
fontSize: '13px'
}
}
},
{
color: "#3277b2",
stacking:"normal",
pointPadding: 0,
groupPadding: 0,
borderRadius: 0,
borderWidth: 0,
data: formatDataset(poData<#uniqueId>, {"low": "ProgressPoint", "high": endDateColumn, "EndDate": endDateColumn, "progress": progressColumn, "name": taskNameColumn}),
dataLabels: {
enabled: true,
align: 'center',
inside: true,
format: '',
style: {
fontSize: '13px'
}
}
},
{
color: "#fba41c",
pointPadding: 0,
groupPadding: 0.4,
borderRadius: 0,
borderWidth: 0,
data: formatDataset(poData<#uniqueId>, {"low": plannedStartDateColumn, "PlannedStartDate": plannedStartDateColumn, "high": plannedEndDateColumn, "PlannedEndDate": plannedEndDateColumn, "progress": progressColumn, "name": taskNameColumn}),
dataLabels: {
enabled: true,
align: 'center',
inside: true,
format: '',
style: {
fontSize: '13px'
}
}
}
]
});
}
function formatDataset(inputData, mappings, groupColumn, groupAttribute, innerArrayAttribute) {
var mappedData = [];
var namesToMap = Object.getOwnPropertyNames(mappings);
for (var i = 0; i < inputData.length; i++) {
var row = {};
var mappedColumns = [];
for (var j = 0; j < namesToMap.length; j++) {
row[namesToMap[j]] = inputData[i][mappings[namesToMap[j]]];
mappedColumns.push(mappings[namesToMap[j]]);
}
var dataColumns = Object.getOwnPropertyNames(inputData[i]);
for (j = 0; j < dataColumns.length; j++) {
if (mappedColumns.indexOf(dataColumns[j]) == -1) {
row[dataColumns[j]] = inputData[i][dataColumns[j]];
}
}
mappedData.push(row);
}
if (groupColumn == null) {
return mappedData;
} else {
var groups = {};
for (var i = 0; i < mappedData.length; i++) {
var groupName = mappedData[i][groupColumn];
if (groups[groupName] == null) groups[groupName] = [];
groups[groupName].push(mappedData[i]);
delete mappedData[i][groupColumn];
}
var groupedData = [];
var groupNames = Object.getOwnPropertyNames(groups);
for (var i = 0; i < groupNames.length; i++) {
var group = {};
group[groupAttribute] = groupNames[i];
group[innerArrayAttribute] = groups[groupNames[i]];
groupedData.push(group);
}
return groupedData;
}
}
</script>