# HG changeset patch # User Chloe Laisne # Date 1465764805 -7200 # Node ID d2cb391559979c8aa4da911270a1f66c2d431947 # Parent ca479ef64fb4328d1b0532b43c5a66b83a157cbf /langue endpoint ID querystring parameter diff -r ca479ef64fb4 -r d2cb39155997 cms/app-client/app/components/visu-langues.js --- a/cms/app-client/app/components/visu-langues.js Sat Jun 11 01:07:57 2016 +0200 +++ b/cms/app-client/app/components/visu-langues.js Sun Jun 12 22:53:25 2016 +0200 @@ -4,203 +4,208 @@ import _ from 'lodash/lodash'; export default Ember.Component.extend({ - constants: Ember.inject.service(), - didInsertElement: function(){ - var _this = this; - var margin = {top: 20, right: 0, bottom: 0, left: 0}, + + constants: Ember.inject.service(), + + didInsertElement: function(){ + var self = this; + var margin = {top: 20, right: 0, bottom: 0, left: 0}, width = Ember.$("#chart_div").width(), height = 600 - margin.top - margin.bottom, formatNumber = d3.format(",d"), transitioning; - var x = d3.scale.linear() - .domain([0, width]) - .range([0, width]); + var x = d3.scale.linear() + .domain([0, width]) + .range([0, width]); - var y = d3.scale.linear() - .domain([0, height]) - .range([0, height]); + var y = d3.scale.linear() + .domain([0, height]) + .range([0, height]); - var treemap = d3.layout.treemap() - .children(function(d, depth) { return depth ? null : d._children; }) - .sort(function(a, b) { return a.value - b.value; }) - .ratio(height / width * 0.5 * (1 + Math.sqrt(5))) - .round(false); + var treemap = d3.layout.treemap() + .children(function(d, depth) { return depth ? null : d._children; }) + .sort(function(a, b) { return a.value - b.value; }) + .ratio(height / width * 0.5 * (1 + Math.sqrt(5))) + .round(false); - var svg = d3.select("#chart_div").append("svg") - .attr("width", width + margin.left + margin.right) - .attr("height", height + margin.bottom + margin.top) - .style("margin-left", -margin.left + "px") - .style("margin.right", -margin.right + "px") - .append("g") - .attr("transform", "translate(" + margin.left + "," + margin.top + ")") - .style("shape-rendering", "crispEdges"); + var svg = d3.select("#chart_div").append("svg") + .attr("width", width + margin.left + margin.right) + .attr("height", height + margin.bottom + margin.top) + .style("margin-left", -margin.left + "px") + .style("margin.right", -margin.right + "px") + .append("g") + .attr("transform", "translate(" + margin.left + "," + margin.top + ")") + .style("shape-rendering", "crispEdges"); - var grandparent = svg.append("g") - .attr("class", "grandparent"); + var grandparent = svg.append("g") + .attr("class", "grandparent"); - grandparent.append("rect") - .attr("y", -margin.top) - .attr("width", width) - .attr("height", margin.top); + grandparent.append("rect") + .attr("y", -margin.top) + .attr("width", width) + .attr("height", margin.top); - grandparent.append("text") - .attr("x", 6) - .attr("y", 6 - margin.top) - .attr("dy", ".75em"); + grandparent.append("text") + .attr("x", 6) + .attr("y", 6 - margin.top) + .attr("dy", ".75em"); - var baseurl = ENV.baseURL.replace(/\/$/,"")+'/api/v1'; - d3.json(baseurl+"/languages", function(languages) { + var baseurl = ENV.baseURL.replace(/\/$/,"")+'/api/v1'; + d3.json(baseurl+"/languages", function(languages) { - var root = _.cloneDeep(_this.constants.LANGUAGES_TREEMAP); + var root = _.cloneDeep(self.constants.LANGUAGES_TREEMAP); - initialize(root); - accumulate(root); - layout(root); - display(root); + initialize(root); + accumulate(root); + layout(root); + display(root); - function initialize(root) { - root.x = root.y = 0; - root.dx = width; - root.dy = height; - root.depth = 0; - } + function initialize(root) { + root.x = root.y = 0; + root.dx = width; + root.dy = height; + root.depth = 0; + } + + // Aggregate the values for internal nodes. This is normally done by the + // treemap layout, but not here because of our custom implementation. + // We also take a snapshot of the original children (_children) to avoid + // the children being overwritten when when layout is computed. + function accumulate(d) { + d._children = d.children; + + if(d.children) { + d.value = d.children.reduce(function(p, v) { return p + accumulate(v); }, 0); + } else if (_.isArray(d.id)) { + d.value = d.id.reduce(function(s,lid) { return s + (languages[lid]?languages[lid]:0); }, 0); + } else { + d.value = languages[d.id]?languages[d.id]:0; + } - // Aggregate the values for internal nodes. This is normally done by the - // treemap layout, but not here because of our custom implementation. - // We also take a snapshot of the original children (_children) to avoid - // the children being overwritten when when layout is computed. - function accumulate(d) { - d._children = d.children; - if(d.children) { - d.value = d.children.reduce(function(p, v) { return p + accumulate(v); }, 0); - } else if (_.isArray(d.id)) { - d.value = d.id.reduce( - function(s,lid) { return s + (languages[lid]?languages[lid]:0); }, - 0 - ); - } - else { - d.value = languages[d.id]?languages[d.id]:0; - } - return d.value; - } + return d.value; + } - // Compute the treemap layout recursively such that each group of siblings - // uses the same size (1×1) rather than the dimensions of the parent cell. - // This optimizes the layout for the current zoom state. Note that a wrapper - // object is created for the parent node for each group of siblings so that - // the parent’s dimensions are not discarded as we recurse. Since each group - // of sibling was laid out in 1×1, we must rescale to fit using absolute - // coordinates. This lets us use a viewport to zoom. - function layout(d) { - if (d._children) { - treemap.nodes({_children: d._children}); - d._children.forEach(function(c) { - c.x = d.x + c.x * d.dx; - c.y = d.y + c.y * d.dy; - c.dx *= d.dx; - c.dy *= d.dy; - c.parent = d; - layout(c); - }); - } - } + // Compute the treemap layout recursively such that each group of siblings + // uses the same size (1×1) rather than the dimensions of the parent cell. + // This optimizes the layout for the current zoom state. Note that a wrapper + // object is created for the parent node for each group of siblings so that + // the parent’s dimensions are not discarded as we recurse. Since each group + // of sibling was laid out in 1×1, we must rescale to fit using absolute + // coordinates. This lets us use a viewport to zoom. + function layout(d) { + if (d._children) { + treemap.nodes({_children: d._children}); + d._children.forEach(function(c) { + c.x = d.x + c.x * d.dx; + c.y = d.y + c.y * d.dy; + c.dx *= d.dx; + c.dy *= d.dy; + c.parent = d; + layout(c); + }); + } + } - function display(d) { - grandparent - .datum(d.parent) - .on("click", transition) - .select("text") - .text(name(d)); + function display(d) { + grandparent + .datum(d.parent) + .on("click", transition) + .select("text") + .text(name(d)); + + var g1 = svg.insert("g", ".grandparent") + .datum(d) + .attr("class", "depth"); - var g1 = svg.insert("g", ".grandparent") - .datum(d) - .attr("class", "depth"); + var g = g1.selectAll("g") + .data(d._children) + .enter().append("g"); - var g = g1.selectAll("g") - .data(d._children) - .enter().append("g"); + g.classed("bla", true) + .on("click", selectHandler); - g.classed("bla", true).on("click", selectHandler); - - g.filter(function(d) { return d._children; }) - .classed("children", true) - .on("click", transition); + g.filter(function(d) { return d._children; }) + .classed("children", true) + .on("click", transition); - g.append("rect") - .attr("class", "parent") - // .attr("fill", (d.color || "#bbb")) - .call(rect) - .append("title") - .text(function(d) { return formatNumber(d.value); }); + g.append("rect") + .attr("class", "parent") + .call(rect) + .append("title") + .text(function(d) { return formatNumber(d.value); }); - g.append("text") - .attr("dy", ".75em") - .text(function(d) { return d.name; }) - .call(text); + g.append("text") + .attr("dy", ".75em") + .text(function(d) { return d.name; }) + .call(text); - function transition(d) { - if (transitioning || !d) { return; } - selectHandler(d); - transitioning = true; + function transition(d) { + if (transitioning || !d) { + return; + } + + selectHandler(d); + transitioning = true; - var g2 = display(d), - t1 = g1.transition().duration(750), - t2 = g2.transition().duration(750); + var g2 = display(d), + t1 = g1.transition().duration(750), + t2 = g2.transition().duration(750); - // Update the domain only after entering new elements. - x.domain([d.x, d.x + d.dx]); - y.domain([d.y, d.y + d.dy]); - - // Enable anti-aliasing during the transition. - svg.style("shape-rendering", null); + // Update the domain only after entering new elements. + x.domain([d.x, d.x + d.dx]); + y.domain([d.y, d.y + d.dy]); - // Draw child nodes on top of parent nodes. - svg.selectAll(".depth").sort(function(a, b) { return a.depth - b.depth; }); + // Enable anti-aliasing during the transition. + svg.style("shape-rendering", null); - // Fade-in entering text. - g2.selectAll("text").style("fill-opacity", 0); + // Draw child nodes on top of parent nodes. + svg.selectAll(".depth").sort(function(a, b) { return a.depth - b.depth; }); + + // Fade-in entering text. + g2.selectAll("text").style("fill-opacity", 0); - // Transition to the new view. - t1.selectAll("text").call(text).style("fill-opacity", 0); - t2.selectAll("text").call(text).style("fill-opacity", 1); - t1.selectAll("rect").call(rect); - t2.selectAll("rect").call(rect); + // Transition to the new view. + t1.selectAll("text").call(text).style("fill-opacity", 0); + t2.selectAll("text").call(text).style("fill-opacity", 1); + t1.selectAll("rect").call(rect); + t2.selectAll("rect").call(rect); - // Remove the old node when the transition is finished. - t1.remove().each("end", function() { - svg.style("shape-rendering", "crispEdges"); - transitioning = false; - }); - } + // Remove the old node when the transition is finished. + t1.remove().each("end", function() { + svg.style("shape-rendering", "crispEdges"); + transitioning = false; + }); + } - function selectHandler (d){ - if (d.name === "Global"){ - return _this.sendAction('action', null); - } - _this.sendAction('action', d.name); - } + function selectHandler (d){ + if (d.id){ + self.get('setQueryParameters')(d.id); + } + } - return g; - } + return g; + } - function text(text) { - text.attr("x", function(d) { return x(d.x) + 6; }) - .attr("y", function(d) { return y(d.y) + 6; }); - } + function text(text) { + text.attr("x", function(d) { return x(d.x) + 6; }) + .attr("y", function(d) { return y(d.y) + 6; }); + } - function rect(rect) { - rect.attr("x", function(d) { return x(d.x); }) - .attr("y", function(d) { return y(d.y); }) - .attr("width", function(d) { return x(d.x + d.dx) - x(d.x); }) - .attr("height", function(d) { return y(d.y + d.dy) - y(d.y); }) - .attr("fill", function(d) { return (d.color || "#bbb"); }); - } + function rect(rect) { + rect.attr("x", function(d) { return x(d.x); }) + .attr("y", function(d) { return y(d.y); }) + .attr("width", function(d) { return x(d.x + d.dx) - x(d.x); }) + .attr("height", function(d) { return y(d.y + d.dy) - y(d.y); }) + .attr("fill", function(d) { return (d.color || "#bbb"); }); + } - function name(d) { - return d.parent ? name(d.parent) + "." + d.name : d.name; - } - }); - } + function name(d) { + return d.parent ? name(d.parent) + "." + d.name : d.name; + } + + }); + + } + }); diff -r ca479ef64fb4 -r d2cb39155997 cms/app-client/app/controllers/tabs/langues.js --- a/cms/app-client/app/controllers/tabs/langues.js Sat Jun 11 01:07:57 2016 +0200 +++ b/cms/app-client/app/controllers/tabs/langues.js Sun Jun 12 22:53:25 2016 +0200 @@ -1,9 +1,9 @@ import Ember from 'ember'; export default Ember.Controller.extend({ - actions: { - updateUrl: function(selection){ - this.transitionToRoute({queryParams: {langue: selection}}); + actions: { + transitionTo: function(id) { + this.transitionToRoute({ queryParams: { 'langue': id } }); + } } - } }); diff -r ca479ef64fb4 -r d2cb39155997 cms/app-client/app/styles/tabs/langues.scss --- a/cms/app-client/app/styles/tabs/langues.scss Sat Jun 11 01:07:57 2016 +0200 +++ b/cms/app-client/app/styles/tabs/langues.scss Sun Jun 12 22:53:25 2016 +0200 @@ -1,45 +1,39 @@ #chart_div { - width: 100%; - height: 540px; - background: #ddd; + width: 100%; + height: 540px; + background: #ddd; } text { - pointer-events: none; + pointer-events: none; } .grandparent text { - font-weight: bold; + font-weight: bold; } rect { - /*fill: none;*/ - stroke: #fff; + stroke: #fff; } rect.parent, .grandparent rect { - stroke-width: 2px; + stroke-width: 2px; } .grandparent rect { - fill: green; + fill: green; } .grandparent:hover rect { - fill: lightgreen; + fill: lightgreen; } .children rect.parent, .grandparent rect { - cursor: pointer; + cursor: pointer; } .children rect.parent { - /*fill: #bbb;*/ - fill-opacity: .5; -} - -.children:hover rect.child { - /*fill: #bbb;*/ -} + fill-opacity: .5; +} \ No newline at end of file diff -r ca479ef64fb4 -r d2cb39155997 cms/app-client/app/templates/tabs/langues.hbs --- a/cms/app-client/app/templates/tabs/langues.hbs Sat Jun 11 01:07:57 2016 +0200 +++ b/cms/app-client/app/templates/tabs/langues.hbs Sun Jun 12 22:53:25 2016 +0200 @@ -1,1 +1,1 @@ -{{visu-langues action="updateUrl" query=model}} +{{visu-langues query=model setQueryParameters=( action 'transitionTo' ) }}