1
0
Fork 0
mirror of https://git.rwth-aachen.de/acs/public/villas/web/ synced 2025-03-30 00:00:13 +01:00

Add static charts for properties

This commit is contained in:
Markus Grigull 2015-10-09 09:22:35 +02:00
parent fefac58125
commit 1b576d543c
16 changed files with 163 additions and 28 deletions

View file

@ -38,5 +38,9 @@ export default DS.RESTAdapter.extend({
query: function(store, type, query) { query: function(store, type, query) {
return this.ajax(this.host + '/' + this.namespace + '/queryContext', 'POST', { data: query }); return this.ajax(this.host + '/' + this.namespace + '/queryContext', 'POST', { data: query });
},
updateRecord: function(store, type, snapshot) {
} }
}); });

View file

@ -0,0 +1,17 @@
import Ember from 'ember';
const { Component, computed } = Ember;
export default Ember.Component.extend({
tagName: 'canvas',
classNames: ['line-chart'],
didInsertElement: function() {
// create chart
var element = this.get('element');
this.chart = new Chart(element.getContext('2d'));
this.chart.Line(this.chartData, {
});
}
});

View file

@ -0,0 +1,12 @@
import Ember from 'ember';
export default Ember.Controller.extend({
model(params) {
Ember.run.later(this, function() {
this.refresh();
}, 500);
var record = this.store.peekRecord('property', params.property_id);
return record;
}
});

View file

@ -5,6 +5,7 @@ export default DS.Model.extend({
value: DS.attr('number'), value: DS.attr('number'),
type: DS.attr('string'), type: DS.attr('string'),
timestamp: DS.attr('date'), timestamp: DS.attr('date'),
history: DS.attr(),
entity: DS.belongsTo('entity'), entity: DS.belongsTo('entity'),
category: DS.belongsTo('category') category: DS.belongsTo('category')
}); });

View file

@ -9,7 +9,8 @@ Router.map(function() {
this.route('lab-mashup', { path: '/' }, function() { this.route('lab-mashup', { path: '/' }, function() {
// dynamic routes // dynamic routes
this.route('entity', { path: '/:entity_id' }, function() { this.route('entity', { path: '/:entity_id' }, function() {
this.route('category', { path: '/:category_id'}); //this.route('category', { path: '/:category_id'});
this.route('property', { path: '/:property_id'});
}); });
// static routes // static routes

View file

@ -0,0 +1,18 @@
import Ember from 'ember';
export default Ember.Route.extend({
model(params) {
Ember.run.later(this, function() {
this.refresh();
}, 500);
var record = this.store.peekRecord('property', params.property_id);
return record;
},
chartData() {
return {
name: 'test'
};
}
});

View file

@ -5,7 +5,21 @@ export default DS.RESTSerializer.extend({
var json = { data: [] }; var json = { data: [] };
this._normalizePayload(payload, function(item) { this._normalizePayload(payload, function(item) {
json.data.push(item); if (item.type === 'entity') {
json.data.push(item);
} else if (item.type === 'property') {
// create record if needed, otherwise add to current one
var record = store.peekRecord('property', item.id);
if (record) {
var length = record.get('history')[0].length;
record.get('history')[0].push([length, record.get('value')]);
record.set('value', item.attributes.value);
} else {
// add new item
store.push(item);
}
}
return true; return true;
}); });
@ -16,8 +30,25 @@ export default DS.RESTSerializer.extend({
var json = { data: {} }; var json = { data: {} };
this._normalizePayload(payload, function(item) { this._normalizePayload(payload, function(item) {
json.data = item; //json.data = item;
return false; //return false;
if (item.type === 'entity') {
json.data = item;
} else if (item.type === 'property') {
// create record if needed, otherwise add to current one
var record = store.peekRecord('property', item.id);
if (record) {
var length = record.get('history').length;
record.get('history')[0].push([length, record.get('value')]);
record.set('value', item.attributes.value);
} else {
// add new item
store.push(item);
}
}
return true;
}); });
return json; return json;
@ -29,8 +60,17 @@ export default DS.RESTSerializer.extend({
this._normalizePayload(payload, function(item) { this._normalizePayload(payload, function(item) {
if (item.type === 'entity') { if (item.type === 'entity') {
json.data.push(item); json.data.push(item);
} else { } else if (item.type === 'property') {
_createRecord(store, item); // create record if needed, otherwise add to current one
var record = store.peekRecord('property', item.id);
if (record) {
var length = record.get('history').length;
record.get('history')[0].push([length, record.get('value')]);
record.set('value', item.attributes.value);
} else {
// add new item
store.push(item);
}
} }
return true; return true;
@ -73,6 +113,7 @@ export default DS.RESTSerializer.extend({
name: attribute.name, name: attribute.name,
type: attribute.type, type: attribute.type,
value: attribute.value, value: attribute.value,
history: [[[0, attribute.value]]]
}, },
relationships: { relationships: {
entity: { entity: {
@ -118,11 +159,5 @@ export default DS.RESTSerializer.extend({
} }
}); });
} }
},
_createRecord: function(store, item) {
store.createRecord(item.type, {
});
} }
}); });

View file

@ -8,7 +8,7 @@ body {
color: #4d4d4d; color: #4d4d4d;
min-width: 300px; min-width: 300px;
max-width: 1500px; /*max-width: 1500px;*/
margin: 0 auto; margin: 0 auto;
font: 16px 'Helvetica Neue', Helvetica, Arial, sans-serif; font: 16px 'Helvetica Neue', Helvetica, Arial, sans-serif;
@ -45,6 +45,8 @@ footer {
margin: 35px auto 0; margin: 35px auto 0;
width: 100%;
font-size: 12px; font-size: 12px;
text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
text-align: center; text-align: center;
@ -53,30 +55,40 @@ footer {
#main { #main {
margin-top: 15px; margin-top: 15px;
margin-left: 15px; margin-left: 15px;
width: 100%;
} }
#main-left { .layout-left {
float: left; float: left;
width: 45%; width: 50%;
padding-top: 10px; padding-top: 10px;
/*padding-left: 25px;*/ /*padding-left: 25px;*/
} }
#main-right { .layout-right {
float: right; float: right;
width: 45%; width: 50%;
padding-top: 10px; padding-top: 10px;
/*padding-right: 25px;*/ /*padding-right: 25px;*/
} }
#main::after { .layout::after {
display: block; display: block;
content: ""; content: "";
clear: both; clear: both;
} }
#properties > .layout-left {
width: 30%;
}
#properties > .layout-right {
width: 70%;
}
.data-table { .data-table {
background: #eee; background: #eee;
@ -112,6 +124,13 @@ footer {
margin: 0; margin: 0;
} }
canvas.line-chart {
width: 90%;
height: 90%;
margin: 10px;
}
.mockup-image { .mockup-image {
width: 600px; width: 600px;
height: 400px; height: 400px;

View file

@ -0,0 +1 @@

View file

@ -5,8 +5,8 @@
</tr> </tr>
{{#each properties as |property|}} {{#each properties as |property|}}
<tr> <tr>
<!-- <td>{{#link-to 'lab-mashup.entity.property' property}}{{property.name}}{{/link-to}}</td> --> <td>{{#link-to 'lab-mashup.entity.property' property}}{{property.name}}{{/link-to}}</td>
<td>{{property.name}}</td> <!--<td>{{property.name}}</td>-->
<td>{{property.value}} {{property.type}}</td> <td>{{property.value}} {{property.type}}</td>
<td>{{property.timestamp}}</td> <td>{{property.timestamp}}</td>
</tr> </tr>

View file

@ -1,13 +1,30 @@
<section id="main-left"> <section class="layout-left">
<section class="mockup-image">[Node Layout Image]</section> <section class="mockup-image">[Node Layout Image]</section>
</section> </section>
<section id="main-right"> <section class="layout-right">
<ul class="nav nav-tabs" role="tablist"> <ul class="nav nav-tabs" role="tablist">
{{#each model.categories as |category|}} {{#each model.categories as |category|}}
{{#link-to 'lab-mashup.entity.category' category tagName='li' activeClass='active'}}{{#link-to 'lab-mashup.entity.category' category}}{{category.name}}{{/link-to}}{{/link-to}} {{#link-to 'lab-mashup.entity.category' category tagName='li' activeClass='active'}}{{#link-to 'lab-mashup.entity.category' category}}{{category.name}}{{/link-to}}{{/link-to}}
{{/each}} {{/each}}
</ul> </ul>
{{outlet}} <section id="properties">
<section class="layout-left">
<table class="data-table">
<tr>
<th>Name</th>
</tr>
{{#each model.properties as |property|}}
<tr>
<td>{{#link-to 'lab-mashup.entity.property' property}}{{property.name}}{{/link-to}}</td>
</tr>
{{/each}}
</table>
</section>
<section class="layout-right">
{{outlet}}
</section>
</section>
</section> </section>

View file

@ -1 +1 @@
{{properties-table properties=model.properties}}

View file

@ -0,0 +1,7 @@
{{#if property}}
<p>{{property.name}}</p>
{{/if}}
{{chartData.name}}
{{flot-chart height="500px" data=model.history}}

View file

@ -15,6 +15,8 @@
"pretender": "~0.9.0", "pretender": "~0.9.0",
"lodash": "~3.7.0", "lodash": "~3.7.0",
"Faker": "~3.0.0", "Faker": "~3.0.0",
"bootstrap": "~3.3.2" "bootstrap": "~3.3.2",
"chart.js": "~0.1.0",
"flot-charts": "*"
} }
} }

View file

@ -22,11 +22,11 @@ module.exports = function(environment) {
contentSecurityPolicy: { contentSecurityPolicy: {
'default-src': "'none'", 'default-src': "'none'",
'script-src': "'self'", 'script-src': "'self' 'unsafe-eval'",
'font-src': "'self'", 'font-src': "'self'",
'connect-src': "'self' 46.101.131.212:80", 'connect-src': "'self' 46.101.131.212:80",
'img-src': "'self'", 'img-src': "'self'",
'style-src': "'self'", 'style-src': "'self' 'unsafe-inline'",
'media-src': "'self'" 'media-src': "'self'"
} }
}; };

View file

@ -44,6 +44,7 @@
"morgan": "^1.6.1" "morgan": "^1.6.1"
}, },
"dependencies": { "dependencies": {
"ember-cli-cors": "0.0.1" "ember-cli-cors": "0.0.1",
"ember-cli-flot": "0.0.3"
} }
} }