Commit 1b278b20 authored by Romain Courteaud's avatar Romain Courteaud Committed by Jérome Perrin

Migrate exit statistics widget

parent f70ce67a
......@@ -74,7 +74,6 @@
<ul>
<li><a href="#station_utilisation_graph">Stations Utilization</a></li>
<li><a href="#capacity_utilisation_graph">Capacity Utilization</a></li>
<li><a href="#exit_stat">Exit Statistics</a></li>
<li><a href="#job_gantt">Job Gantt</a></li>
<li><a href="#job_schedule_spreadsheet">Job Schedule</a></li>
</ul>
......@@ -84,11 +83,6 @@
<div id="capacity_graphs"></div>
</div>
<div id="exit_stat">
<h1>Exit Statistics</h1>
<div></div>
</div>
<div id="job_gantt" style='width:1320px; height:800px;'></div>
<div id="job_schedule_spreadsheet" style="overflow: scroll;"></div>
......
......@@ -22,8 +22,6 @@
(function (scope, $, jsPlumb, console) {
"use strict";
function capacity_utilisation_graph_widget(input_data, output_data) {
var available_capacity_by_station = {},
capacity_usage_by_station = {};
......
......@@ -25,6 +25,7 @@
"queue_stat_graph",
key
),
gadget.whoWantToDisplayThisDocumentPage("exit_stat", key),
gadget.whoWantToDisplayThisDocumentPage("debug_json", key)
]);
})
......@@ -35,7 +36,8 @@
{link: result_list[2], title: "Manage document"},
{link: result_list[3], title: "Stations Utilization"},
{link: result_list[4], title: "Queues Statistics"},
{link: result_list[5], title: "Debug JSON"}
{link: result_list[5], title: "Exit Statistics"},
{link: result_list[6], title: "Debug JSON"}
];
});
});
......
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Exit Statistics</title>
<script src="../<%= copy.rsvp.relative_dest %>" type="text/javascript"></script>
<script src="../<%= copy.renderjs.relative_dest %>" type="text/javascript"></script>
<script src="../<%= copy.handlebars.relative_dest %>" type="text/javascript"></script>
<script src="document_page_mixin.js" type="text/javascript"></script>
<script src="exit_stat.js" type="text/javascript"></script>
<script id="interval-through-metric-template" type="text/x-handlebars-template">
<tr>
<td>Daily Attainment</td>
<td>
{{#interval_list}}
{{interval}}<i class="fa {{icon}}"/><br/>
{{/interval_list}}
</td>
</tr>
<tr>
<td>Average Daily Line Attainment</td>
<td>{{average}}%<td>
</tr>
</script>
<script id="simple-metric-template" type="text/x-handlebars-template">
<tr>
<td>{{metric}}</td>
<td>{{value}}</td>
</tr>
</script>
<script id="metric-object-template" type="text/x-handlebars-template">
<tr>
<td>{{metric}}</td>
<td>
<table width='100%'>
<tbody>
<tr>
<td>Average</td>
<td>{{avg}}</td>
</tr>
<tr>
<td>Lower Bound</td>
<td>{{lb}}</td>
</tr>
<tr>
<td>Upper Bound</td>
<td>{{ub}}</td>
</tr>
</tbody>
</table>
</td>
</tr>
</script>
<script id="header-template" type="text/x-handlebars-template">
<tr>
<th colspan='2'>{{name}}</th>
</tr>
</script>
</head>
<body>
<table>
</table>
</body>
</html>
/*global console, rJS, RSVP, initDocumentPageMixin, Handlebars */
/*jslint nomen: true */
(function (window, rJS, RSVP, initDocumentPageMixin, Handlebars) {
"use strict";
/////////////////////////////////////////////////////////////////
// Handlebars
/////////////////////////////////////////////////////////////////
// Precompile the templates while loading the first gadget instance
var gadget_klass = rJS(window),
header_source = gadget_klass.__template_element
.getElementById("header-template")
.innerHTML,
header_template = Handlebars.compile(header_source),
metric_object_source = gadget_klass.__template_element
.getElementById("metric-object-template")
.innerHTML,
metric_object_template = Handlebars.compile(metric_object_source),
metric_simple_source = gadget_klass.__template_element
.getElementById("simple-metric-template")
.innerHTML,
metric_simple_template = Handlebars.compile(metric_simple_source),
metric_interval_source = gadget_klass.__template_element
.getElementById("interval-through-metric-template")
.innerHTML,
metric_interval_template = Handlebars.compile(metric_interval_source);
/////////////////////////////////////////////////////////////////
// Calculate widget
/////////////////////////////////////////////////////////////////
function calculate_average(attainment_list) {
return ((attainment_list.reduce(
function (a, b) {
return a + b;
}
) / attainment_list.length) * 100).toFixed(2);
}
function calculate_exit_stat(output_data) {
var elementList = output_data.elementList,
i,
j,
metric,
metric_value,
element,
interval_value,
interval_list,
attainment_list,
throughputTarget = parseFloat(output_data.general.throughputTarget),
result = "";
for (i = 0; i < elementList.length; i += 1) {
element = elementList[i];
if (element._class === 'Dream.Exit') {
result += "<table>";
result += header_template({name: element.name || element.id});
for (metric in element.results) {
if (element.results.hasOwnProperty(metric)) {
metric_value = element.results[metric];
if (metric === 'intervalThroughputList') {
interval_list = [];
attainment_list = [];
for (j = 0; j < metric_value.length; j += 1) {
interval_value = metric_value[j];
attainment_list.push((interval_value / throughputTarget));
if (interval_value > throughputTarget) {
interval_list.push({
interval: interval_value,
icon: "fa-smile-o"
});
} else {
interval_list.push({
interval: interval_value,
icon: "fa-frown-o"
});
}
}
result += metric_interval_template({
interval_list: interval_list,
average: calculate_average(attainment_list)
});
} else {
if (typeof metric_value === "object") {
if (metric_value.ub === metric_value.lb) {
metric_value = metric_value.ub;
} else {
metric_value.metric = metric;
metric_value.avg = metric_value.avg.toFixed(2);
metric_value.lb = metric_value.lb.toFixed(2);
metric_value.ub = metric_value.ub.toFixed(2);
metric_value = metric_object_template(metric_value);
}
}
if (typeof metric_value === "number") {
metric_value = metric_value.toFixed(2);
}
// Rename some metric to something more meaningful
if (metric === "lifespan") {
metric = "Cycle Time";
}
if (metric === "takt_time") {
metric = "Average Departure Rate";
}
result += metric_simple_template({
metric: metric,
value: metric_value
});
}
}
}
result += "</table>";
}
}
return result;
}
initDocumentPageMixin(gadget_klass);
gadget_klass
/////////////////////////////////////////////////////////////////
// ready
/////////////////////////////////////////////////////////////////
// Init local properties
.ready(function (g) {
g.props = {};
})
// Assign the element to a variable
.ready(function (g) {
return g.getElement()
.push(function (element) {
g.props.element = element;
});
})
/////////////////////////////////////////////////////////////////
// Acquired methods
/////////////////////////////////////////////////////////////////
.declareAcquiredMethod("aq_getAttachment", "jio_getAttachment")
/////////////////////////////////////////////////////////////////
// declared methods
/////////////////////////////////////////////////////////////////
.declareMethod("render", function (options) {
var jio_key = options.id,
gadget = this;
gadget.props.jio_key = jio_key;
return gadget.aq_getAttachment({
"_id": gadget.props.jio_key,
"_attachment": "simulation.json"
})
.push(function (simulation_json) {
var result = calculate_exit_stat(
// XXX Hardcoded result
JSON.parse(simulation_json)[0].result
);
gadget.props.element.innerHTML = result;
});
});
}(window, rJS, RSVP, initDocumentPageMixin, Handlebars));
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment