summaryrefslogtreecommitdiff
path: root/client/js/controllers/home
diff options
context:
space:
mode:
authorApache <apache@localhost.localdomain>2016-03-16 12:59:25 +0100
committerApache <apache@localhost.localdomain>2016-03-16 12:59:25 +0100
commitfea574ac18cbc664bf45444148309780af8a6182 (patch)
treeb72da01a4e8210f7a31ea48100f3c64ebd98ed1e /client/js/controllers/home
parenta2f120aa7350e9417e80db26abf36b7e53c3196b (diff)
TestGraph
Diffstat (limited to 'client/js/controllers/home')
-rw-r--r--client/js/controllers/home/home.js208
1 files changed, 207 insertions, 1 deletions
diff --git a/client/js/controllers/home/home.js b/client/js/controllers/home/home.js
index d20779b..f2073e1 100644
--- a/client/js/controllers/home/home.js
+++ b/client/js/controllers/home/home.js
@@ -5,7 +5,7 @@
*/
mainApp.controller('homeCtrl', [ '$scope', 'Compute', '$rootScope', 'Loading','Identity', 'Image', function ($scope, Compute, $rootScope, Loading, Identity, Image)
{
-
+ console.log("homeCTRl");
var callMeAfterPullData=function(data){
$scope.machines=Compute.getData().machines;
Loading.stop();
@@ -38,5 +38,211 @@ mainApp.controller('homeCtrl', [ '$scope', 'Compute', '$rootScope', 'Loading','I
Compute.pullMachines(callback);
}
+ //adjacencyList, hard-encoded now but will be the result of a request to the server, format may change
+ var vmList = {
+ 'vms': [
+ 'VM 1',
+ 'VM 2',
+ 'VM 3',
+ 'VM 4',
+ 'VM 5',
+ 'VM 6',
+ 'VM 7',
+ 'VM 8',
+ 'VM 9',
+ 'VM 10'
+ ],
+ 'links': [
+ ['VM 1', 'VM 2', '', ''],
+ ['VM 2', 'VM 3', 'I3', 'I4'],
+ ['VM 1', 'VM 3', 'I5', 'I6'],
+ ['VM 2', 'VM 4', 'I5', 'I6'],
+ ['VM 4', 'VM 5', 'I5', 'I6'],
+ ['VM 4', 'VM 6', 'I5', 'I6'],
+ ['VM 4', 'VM 1', 'I5', 'I6'],
+ ['VM 7', 'VM 4', 'I5', 'I6'],
+ ['VM 7', 'VM 3', 'I5', 'I6'],
+ ['VM 6', 'VM 8', 'I5', 'I6'],
+ ['VM 3', 'VM 9', 'I5', 'I6'],
+ ['VM 3', 'VM 10', 'I5', 'I6']
+ ]
+ };
+
+
+ //Custom element for inserting html
+ joint.shapes.html = {};
+ joint.shapes.html.Element = joint.shapes.basic.Rect.extend({
+ defaults: joint.util.deepSupplement({
+ type: 'html.Element',
+ attrs: {
+ rect: { stroke: 'none', 'fill-opacity': 0 }
+ }
+ }, joint.shapes.basic.Rect.prototype.defaults)
+ });
+
+ //Custom view for this element
+ joint.shapes.basic.Rect.ElementView = joint.dia.ElementView.extend({
+
+ initialize: function() {
+ _.bindAll(this, 'updateBox');
+ joint.dia.ElementView.prototype.initialize.apply(this, arguments);
+
+ this.$box = $(_.template(this.model.get('html'))());
+ // Prevent paper from handling pointerdown.
+ this.$box.find('input,select').on('mousedown click', function(evt) { evt.stopPropagation(); });
+ // This is an example of reacting on the input change and storing the input data in the cell model.
+ this.$box.find('input').on('change', _.bind(function(evt) {
+ this.model.set('input', $(evt.target).val());
+ }, this));
+ this.$box.find('select').on('change', _.bind(function(evt) {
+ this.model.set('select', $(evt.target).val());
+ }, this));
+ this.$box.find('select').val(this.model.get('select'));
+ this.$box.find('.config').on('click', function(){
+ $scope.raiseShowMachineDetailsEvent();
+ });
+ // Update the box position whenever the underlying model changes.
+ this.model.on('change', this.updateBox, this);
+ // Remove the box when the model gets removed from the graph.
+ this.model.on('remove', this.removeBox, this);
+
+ this.updateBox();
+ },
+ render: function() {
+ joint.dia.ElementView.prototype.render.apply(this, arguments);
+ this.paper.$el.prepend(this.$box);
+ this.updateBox();
+ return this;
+ },
+ updateBox: function() {
+ // Set the position and dimension of the box so that it covers the JointJS element.
+ var bbox = this.model.getBBox();
+ // Example of updating the HTML with a data stored in the cell model.
+ this.$box.find('label').text(this.model.get('name'));
+ this.$box.find('span').text(this.model.get('select'));
+ this.$box.css({ width: bbox.width, height: bbox.height, left: bbox.x, top: bbox.y, transform: 'rotate(' + (this.model.get('angle') || 0) + 'deg)' });
+ },
+ removeBox: function(evt) {
+ this.$box.remove();
+ }
+ });
+
+
+ //Read the adjacencyList and build the elements and the links according to it
+ function buildGraphFromAdjacencyList(adjacencyList) {
+
+ var elements = [];
+ var links = [];
+
+ _.each(adjacencyList['vms'], function(vm) {
+ elements.push(makeElement(vm));
+ });
+ console.log(elements);
+ _.each(adjacencyList['links'], function(link) {
+ links.push(makeLink(link[0], link[1] , link[2], link[3]));
+ });
+ console.log(links);
+ // Links must be added after all the elements. This is because when the links
+ // are added to the graph, link source/target
+ // elements must be in the graph already.
+ return elements.concat(links);
+ }
+
+ //Return a new link linking the parent and child elements with the interfaces names given in parameters
+ function makeLink(parentElementLabel, childElementLabel, Iparent, Ichild) {
+
+ return new joint.dia.Link({
+ source: { id: parentElementLabel },
+ target: { id: childElementLabel },
+ labels: [
+ { position: 20, attrs: { text: { text: Iparent } }},
+ { position: -20, attrs: { text: { text: Ichild } }}
+ ]
+ });
+ }
+
+ //Return a new element
+ function makeElement(label) {
+
+ var maxLineLength = _.max(label.split('\n'), function(l) { return l.length; }).length;
+
+ // Compute width/height of the rectangle based on the number
+ // of lines in the label and the letter size. 0.6 * letterSize is
+ // an approximation of the monospace font letter width.
+ var width = 130;
+ var height = 80;
+
+ /*return new joint.shapes.html.Element({
+ id: label,
+ name: label,
+ size: { width: width, height: height },
+
+ html: [
+ '<div class="html-element">',
+ '<img src="./images/ON.png">',
+ '<label></label>',
+ '<input type="image" src="./images/gear.png" class="config"></button>',
+ '</div>'
+ ].join(''),
+
+ attrs: {
+ rect: {
+ fill: '#FE854F',
+ width: width,
+ height: height,
+ rx: 5,
+ ry: 5,
+ stroke: 'none'
+ }
+ }
+ });*/
+ return new joint.shapes.org.Member({
+ id: label,
+ position: { x: 0, y: 0 },
+ attrs: {
+ '.card': { fill: 'blue', stroke: 'none'},
+ image: { 'xlink:href': './images/ON.png', opacity: 0.7 },
+ //'.rank': { text: rank, fill: textColor, 'word-spacing': '-5px', 'letter-spacing': 0},
+ '.name': { text: label, fill: 'white', 'font-size': 13, 'font-family': 'Arial', 'letter-spacing': 0 }
+ }
+ });
+ }
+
+ var graph = new joint.dia.Graph;
+ var paper = new joint.dia.Paper({
+ el: $('#graphHolder'),
+ width: $('#graphHolder').width(),
+ //height: test.height,
+ model: graph,
+ gridSize: 1
+ });
+
+ var cells = buildGraphFromAdjacencyList(vmList);
+ console.log(cells);
+ /*graph.resetCells(cells);
+ joint.layout.DirectedGraph.layout(graph, {
+ setLinkVertices: false,
+ //Top to bottom generation
+ rankDir: "TB",
+ nodeSep: 150,
+ edgeSep: 150,
+ rankSep: 150
+ });*/
+ graph.addCells(cells);
+ var test = joint.layout.DirectedGraph.layout(graph, {
+ setLinkVertices: false,
+ //Top to bottom generation
+ rankDir: "TB",
+ nodeSep: 150,
+ edgeSep: 150,
+ rankSep: 50
+ });
+ console.log(test);
+
+ paper.setDimensions(test.width, test.height);
+
+
+ paper.$el.css('pointer-events', 'none');
+
}]);