cms/app-client/app/components/discourses-component.js
author Chloe Laisne <chloe.laisne@gmail.com>
Thu, 19 May 2016 14:49:42 +0200
changeset 175 7a7cfcba5bfe
child 176 d1baf7ccecc8
permissions -rw-r--r--
Add Discourses Component files
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
175
7a7cfcba5bfe Add Discourses Component files
Chloe Laisne <chloe.laisne@gmail.com>
parents:
diff changeset
     1
import Ember from 'ember';
7a7cfcba5bfe Add Discourses Component files
Chloe Laisne <chloe.laisne@gmail.com>
parents:
diff changeset
     2
import d3 from 'd3';
7a7cfcba5bfe Add Discourses Component files
Chloe Laisne <chloe.laisne@gmail.com>
parents:
diff changeset
     3
import env from 'app-client/config/environment';
7a7cfcba5bfe Add Discourses Component files
Chloe Laisne <chloe.laisne@gmail.com>
parents:
diff changeset
     4
7a7cfcba5bfe Add Discourses Component files
Chloe Laisne <chloe.laisne@gmail.com>
parents:
diff changeset
     5
7a7cfcba5bfe Add Discourses Component files
Chloe Laisne <chloe.laisne@gmail.com>
parents:
diff changeset
     6
7a7cfcba5bfe Add Discourses Component files
Chloe Laisne <chloe.laisne@gmail.com>
parents:
diff changeset
     7
export default Ember.Component.extend({
7a7cfcba5bfe Add Discourses Component files
Chloe Laisne <chloe.laisne@gmail.com>
parents:
diff changeset
     8
7a7cfcba5bfe Add Discourses Component files
Chloe Laisne <chloe.laisne@gmail.com>
parents:
diff changeset
     9
	constants: Ember.inject.service(),
7a7cfcba5bfe Add Discourses Component files
Chloe Laisne <chloe.laisne@gmail.com>
parents:
diff changeset
    10
7a7cfcba5bfe Add Discourses Component files
Chloe Laisne <chloe.laisne@gmail.com>
parents:
diff changeset
    11
	init: function() {
7a7cfcba5bfe Add Discourses Component files
Chloe Laisne <chloe.laisne@gmail.com>
parents:
diff changeset
    12
		this._super(...arguments);
7a7cfcba5bfe Add Discourses Component files
Chloe Laisne <chloe.laisne@gmail.com>
parents:
diff changeset
    13
	},
7a7cfcba5bfe Add Discourses Component files
Chloe Laisne <chloe.laisne@gmail.com>
parents:
diff changeset
    14
7a7cfcba5bfe Add Discourses Component files
Chloe Laisne <chloe.laisne@gmail.com>
parents:
diff changeset
    15
	didRender: function() {
7a7cfcba5bfe Add Discourses Component files
Chloe Laisne <chloe.laisne@gmail.com>
parents:
diff changeset
    16
		var self = this;
7a7cfcba5bfe Add Discourses Component files
Chloe Laisne <chloe.laisne@gmail.com>
parents:
diff changeset
    17
		var baseURL = env.baseURL.replace(/\/$/,"")+'/api/v1';
7a7cfcba5bfe Add Discourses Component files
Chloe Laisne <chloe.laisne@gmail.com>
parents:
diff changeset
    18
7a7cfcba5bfe Add Discourses Component files
Chloe Laisne <chloe.laisne@gmail.com>
parents:
diff changeset
    19
		d3.json(baseURL + "/discourses", function(discourses) {
7a7cfcba5bfe Add Discourses Component files
Chloe Laisne <chloe.laisne@gmail.com>
parents:
diff changeset
    20
			console.log(discourses);
7a7cfcba5bfe Add Discourses Component files
Chloe Laisne <chloe.laisne@gmail.com>
parents:
diff changeset
    21
7a7cfcba5bfe Add Discourses Component files
Chloe Laisne <chloe.laisne@gmail.com>
parents:
diff changeset
    22
			var width = self.$().parent().width();
7a7cfcba5bfe Add Discourses Component files
Chloe Laisne <chloe.laisne@gmail.com>
parents:
diff changeset
    23
			var height = self.$().parent().height();
7a7cfcba5bfe Add Discourses Component files
Chloe Laisne <chloe.laisne@gmail.com>
parents:
diff changeset
    24
7a7cfcba5bfe Add Discourses Component files
Chloe Laisne <chloe.laisne@gmail.com>
parents:
diff changeset
    25
			var bubble = d3.layout.pack()
7a7cfcba5bfe Add Discourses Component files
Chloe Laisne <chloe.laisne@gmail.com>
parents:
diff changeset
    26
				.sort(null)
7a7cfcba5bfe Add Discourses Component files
Chloe Laisne <chloe.laisne@gmail.com>
parents:
diff changeset
    27
				.size([width, height])
7a7cfcba5bfe Add Discourses Component files
Chloe Laisne <chloe.laisne@gmail.com>
parents:
diff changeset
    28
				.padding(33);
7a7cfcba5bfe Add Discourses Component files
Chloe Laisne <chloe.laisne@gmail.com>
parents:
diff changeset
    29
7a7cfcba5bfe Add Discourses Component files
Chloe Laisne <chloe.laisne@gmail.com>
parents:
diff changeset
    30
			var element = d3.select('#' + self.get('elementId'));
7a7cfcba5bfe Add Discourses Component files
Chloe Laisne <chloe.laisne@gmail.com>
parents:
diff changeset
    31
7a7cfcba5bfe Add Discourses Component files
Chloe Laisne <chloe.laisne@gmail.com>
parents:
diff changeset
    32
			var svg = element.append("svg")
7a7cfcba5bfe Add Discourses Component files
Chloe Laisne <chloe.laisne@gmail.com>
parents:
diff changeset
    33
				.attr("width", width)
7a7cfcba5bfe Add Discourses Component files
Chloe Laisne <chloe.laisne@gmail.com>
parents:
diff changeset
    34
				.attr("height", height)
7a7cfcba5bfe Add Discourses Component files
Chloe Laisne <chloe.laisne@gmail.com>
parents:
diff changeset
    35
				.attr("class", "bubble");
7a7cfcba5bfe Add Discourses Component files
Chloe Laisne <chloe.laisne@gmail.com>
parents:
diff changeset
    36
7a7cfcba5bfe Add Discourses Component files
Chloe Laisne <chloe.laisne@gmail.com>
parents:
diff changeset
    37
			var nodes = svg.selectAll(".node")
7a7cfcba5bfe Add Discourses Component files
Chloe Laisne <chloe.laisne@gmail.com>
parents:
diff changeset
    38
				.data(bubble.nodes(self.createNodes(discourses)))
7a7cfcba5bfe Add Discourses Component files
Chloe Laisne <chloe.laisne@gmail.com>
parents:
diff changeset
    39
				.enter().append("g")
7a7cfcba5bfe Add Discourses Component files
Chloe Laisne <chloe.laisne@gmail.com>
parents:
diff changeset
    40
				.attr("width", function(d) { return 2.5 * d.r + 'px'; })
7a7cfcba5bfe Add Discourses Component files
Chloe Laisne <chloe.laisne@gmail.com>
parents:
diff changeset
    41
				.attr("class", function(d) { return "node" + (!d.children ? " leaf" : ""); })
7a7cfcba5bfe Add Discourses Component files
Chloe Laisne <chloe.laisne@gmail.com>
parents:
diff changeset
    42
				.attr("transform", function(d) { return "translate(" + d.x + "," + d.y + ")"; })
7a7cfcba5bfe Add Discourses Component files
Chloe Laisne <chloe.laisne@gmail.com>
parents:
diff changeset
    43
				.style("font-size", function(d) { return Math.max(13, d.r / 2) + 'px'; });
7a7cfcba5bfe Add Discourses Component files
Chloe Laisne <chloe.laisne@gmail.com>
parents:
diff changeset
    44
				
7a7cfcba5bfe Add Discourses Component files
Chloe Laisne <chloe.laisne@gmail.com>
parents:
diff changeset
    45
7a7cfcba5bfe Add Discourses Component files
Chloe Laisne <chloe.laisne@gmail.com>
parents:
diff changeset
    46
			var leaf = svg.selectAll(".leaf")
7a7cfcba5bfe Add Discourses Component files
Chloe Laisne <chloe.laisne@gmail.com>
parents:
diff changeset
    47
				.on('click', function(d) { document.location = self.setQueryString('discours', d.name); });
7a7cfcba5bfe Add Discourses Component files
Chloe Laisne <chloe.laisne@gmail.com>
parents:
diff changeset
    48
			
7a7cfcba5bfe Add Discourses Component files
Chloe Laisne <chloe.laisne@gmail.com>
parents:
diff changeset
    49
			leaf.append("circle")
7a7cfcba5bfe Add Discourses Component files
Chloe Laisne <chloe.laisne@gmail.com>
parents:
diff changeset
    50
				.attr("r", function(d) { return d.r; })
7a7cfcba5bfe Add Discourses Component files
Chloe Laisne <chloe.laisne@gmail.com>
parents:
diff changeset
    51
				.attr("fill", function(d) { return d.fill; })
7a7cfcba5bfe Add Discourses Component files
Chloe Laisne <chloe.laisne@gmail.com>
parents:
diff changeset
    52
				.attr("stroke", function(d) { return "#000"; });
7a7cfcba5bfe Add Discourses Component files
Chloe Laisne <chloe.laisne@gmail.com>
parents:
diff changeset
    53
			
7a7cfcba5bfe Add Discourses Component files
Chloe Laisne <chloe.laisne@gmail.com>
parents:
diff changeset
    54
			leaf.append("text")
7a7cfcba5bfe Add Discourses Component files
Chloe Laisne <chloe.laisne@gmail.com>
parents:
diff changeset
    55
				.attr("dy", ".3em")
7a7cfcba5bfe Add Discourses Component files
Chloe Laisne <chloe.laisne@gmail.com>
parents:
diff changeset
    56
				.style("text-anchor", "middle")
7a7cfcba5bfe Add Discourses Component files
Chloe Laisne <chloe.laisne@gmail.com>
parents:
diff changeset
    57
				.text(function(d) { return d.name; });
7a7cfcba5bfe Add Discourses Component files
Chloe Laisne <chloe.laisne@gmail.com>
parents:
diff changeset
    58
7a7cfcba5bfe Add Discourses Component files
Chloe Laisne <chloe.laisne@gmail.com>
parents:
diff changeset
    59
			element.style("height", height + "px");
7a7cfcba5bfe Add Discourses Component files
Chloe Laisne <chloe.laisne@gmail.com>
parents:
diff changeset
    60
		});
7a7cfcba5bfe Add Discourses Component files
Chloe Laisne <chloe.laisne@gmail.com>
parents:
diff changeset
    61
7a7cfcba5bfe Add Discourses Component files
Chloe Laisne <chloe.laisne@gmail.com>
parents:
diff changeset
    62
		this._super(...arguments);		
7a7cfcba5bfe Add Discourses Component files
Chloe Laisne <chloe.laisne@gmail.com>
parents:
diff changeset
    63
	},
7a7cfcba5bfe Add Discourses Component files
Chloe Laisne <chloe.laisne@gmail.com>
parents:
diff changeset
    64
7a7cfcba5bfe Add Discourses Component files
Chloe Laisne <chloe.laisne@gmail.com>
parents:
diff changeset
    65
	createNodes: function(json) {
7a7cfcba5bfe Add Discourses Component files
Chloe Laisne <chloe.laisne@gmail.com>
parents:
diff changeset
    66
		var self = this;
7a7cfcba5bfe Add Discourses Component files
Chloe Laisne <chloe.laisne@gmail.com>
parents:
diff changeset
    67
		var nodes = {};
7a7cfcba5bfe Add Discourses Component files
Chloe Laisne <chloe.laisne@gmail.com>
parents:
diff changeset
    68
		var children = {};
7a7cfcba5bfe Add Discourses Component files
Chloe Laisne <chloe.laisne@gmail.com>
parents:
diff changeset
    69
7a7cfcba5bfe Add Discourses Component files
Chloe Laisne <chloe.laisne@gmail.com>
parents:
diff changeset
    70
		Object.keys(json).forEach(function(key) {
7a7cfcba5bfe Add Discourses Component files
Chloe Laisne <chloe.laisne@gmail.com>
parents:
diff changeset
    71
			var discourse = json[key];
7a7cfcba5bfe Add Discourses Component files
Chloe Laisne <chloe.laisne@gmail.com>
parents:
diff changeset
    72
			var index = self.get('constants').DISCOURSES[key];
7a7cfcba5bfe Add Discourses Component files
Chloe Laisne <chloe.laisne@gmail.com>
parents:
diff changeset
    73
			var category = self.get('constants').DISCOURSE_CATEGORIES[index];
7a7cfcba5bfe Add Discourses Component files
Chloe Laisne <chloe.laisne@gmail.com>
parents:
diff changeset
    74
7a7cfcba5bfe Add Discourses Component files
Chloe Laisne <chloe.laisne@gmail.com>
parents:
diff changeset
    75
			children[index] = children[index] || {};
7a7cfcba5bfe Add Discourses Component files
Chloe Laisne <chloe.laisne@gmail.com>
parents:
diff changeset
    76
			children[index]['name'] = index;
7a7cfcba5bfe Add Discourses Component files
Chloe Laisne <chloe.laisne@gmail.com>
parents:
diff changeset
    77
			children[index]['children'] = children[index]['children'] || [];
7a7cfcba5bfe Add Discourses Component files
Chloe Laisne <chloe.laisne@gmail.com>
parents:
diff changeset
    78
			children[index]['children'].push({ "name": discourse.label, "value": discourse.count, "fill": category.fill });
7a7cfcba5bfe Add Discourses Component files
Chloe Laisne <chloe.laisne@gmail.com>
parents:
diff changeset
    79
		});
7a7cfcba5bfe Add Discourses Component files
Chloe Laisne <chloe.laisne@gmail.com>
parents:
diff changeset
    80
7a7cfcba5bfe Add Discourses Component files
Chloe Laisne <chloe.laisne@gmail.com>
parents:
diff changeset
    81
		nodes.children = [];
7a7cfcba5bfe Add Discourses Component files
Chloe Laisne <chloe.laisne@gmail.com>
parents:
diff changeset
    82
		Object.keys(children).forEach(function(key) {
7a7cfcba5bfe Add Discourses Component files
Chloe Laisne <chloe.laisne@gmail.com>
parents:
diff changeset
    83
			nodes.children.push(children[key]);
7a7cfcba5bfe Add Discourses Component files
Chloe Laisne <chloe.laisne@gmail.com>
parents:
diff changeset
    84
		});
7a7cfcba5bfe Add Discourses Component files
Chloe Laisne <chloe.laisne@gmail.com>
parents:
diff changeset
    85
7a7cfcba5bfe Add Discourses Component files
Chloe Laisne <chloe.laisne@gmail.com>
parents:
diff changeset
    86
		return nodes;
7a7cfcba5bfe Add Discourses Component files
Chloe Laisne <chloe.laisne@gmail.com>
parents:
diff changeset
    87
	},
7a7cfcba5bfe Add Discourses Component files
Chloe Laisne <chloe.laisne@gmail.com>
parents:
diff changeset
    88
7a7cfcba5bfe Add Discourses Component files
Chloe Laisne <chloe.laisne@gmail.com>
parents:
diff changeset
    89
	setQueryString: function(field, value) {
7a7cfcba5bfe Add Discourses Component files
Chloe Laisne <chloe.laisne@gmail.com>
parents:
diff changeset
    90
		var hash = document.location.href.split('?');
7a7cfcba5bfe Add Discourses Component files
Chloe Laisne <chloe.laisne@gmail.com>
parents:
diff changeset
    91
		var query_parameters = hash.pop();
7a7cfcba5bfe Add Discourses Component files
Chloe Laisne <chloe.laisne@gmail.com>
parents:
diff changeset
    92
7a7cfcba5bfe Add Discourses Component files
Chloe Laisne <chloe.laisne@gmail.com>
parents:
diff changeset
    93
		// Unserialize
7a7cfcba5bfe Add Discourses Component files
Chloe Laisne <chloe.laisne@gmail.com>
parents:
diff changeset
    94
		var parameters = [];
7a7cfcba5bfe Add Discourses Component files
Chloe Laisne <chloe.laisne@gmail.com>
parents:
diff changeset
    95
		query_parameters.split('&').forEach(function(parameter){
7a7cfcba5bfe Add Discourses Component files
Chloe Laisne <chloe.laisne@gmail.com>
parents:
diff changeset
    96
			var object = parameter.split('=');
7a7cfcba5bfe Add Discourses Component files
Chloe Laisne <chloe.laisne@gmail.com>
parents:
diff changeset
    97
			object[1] && (parameters[object[0]] = object[1]);
7a7cfcba5bfe Add Discourses Component files
Chloe Laisne <chloe.laisne@gmail.com>
parents:
diff changeset
    98
		});
7a7cfcba5bfe Add Discourses Component files
Chloe Laisne <chloe.laisne@gmail.com>
parents:
diff changeset
    99
7a7cfcba5bfe Add Discourses Component files
Chloe Laisne <chloe.laisne@gmail.com>
parents:
diff changeset
   100
		// Serialize
7a7cfcba5bfe Add Discourses Component files
Chloe Laisne <chloe.laisne@gmail.com>
parents:
diff changeset
   101
		var string = [];
7a7cfcba5bfe Add Discourses Component files
Chloe Laisne <chloe.laisne@gmail.com>
parents:
diff changeset
   102
		parameters[field] = encodeURI(value);
7a7cfcba5bfe Add Discourses Component files
Chloe Laisne <chloe.laisne@gmail.com>
parents:
diff changeset
   103
		Object.keys(parameters).forEach(function(key) {
7a7cfcba5bfe Add Discourses Component files
Chloe Laisne <chloe.laisne@gmail.com>
parents:
diff changeset
   104
			string.push(key + '=' + parameters[key]);
7a7cfcba5bfe Add Discourses Component files
Chloe Laisne <chloe.laisne@gmail.com>
parents:
diff changeset
   105
		});
7a7cfcba5bfe Add Discourses Component files
Chloe Laisne <chloe.laisne@gmail.com>
parents:
diff changeset
   106
7a7cfcba5bfe Add Discourses Component files
Chloe Laisne <chloe.laisne@gmail.com>
parents:
diff changeset
   107
		return hash + '?' + string.join('&');
7a7cfcba5bfe Add Discourses Component files
Chloe Laisne <chloe.laisne@gmail.com>
parents:
diff changeset
   108
	}
7a7cfcba5bfe Add Discourses Component files
Chloe Laisne <chloe.laisne@gmail.com>
parents:
diff changeset
   109
	
7a7cfcba5bfe Add Discourses Component files
Chloe Laisne <chloe.laisne@gmail.com>
parents:
diff changeset
   110
});