# HG changeset patch # User nowmad@23.1.168.192.in-addr.arpa # Date 1453107699 -3600 # Node ID e95ca73cec549fdeb596e8ca0453aecbf27a329a # Parent 3e93c61f6be053e722fdf3455f87d9447d7dad1f# Parent 36f84e8f1ad540e3813f6c3b754c22417b392f2f Merge 2 heads diff -r 3e93c61f6be0 -r e95ca73cec54 cms/app-client/app/adapters/application.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cms/app-client/app/adapters/application.js Mon Jan 18 10:01:39 2016 +0100 @@ -0,0 +1,16 @@ +import DS from 'ember-data'; + +export default DS.FixtureAdapter.extend({ + host: 'http://127.0.0.1', + namespace: 'api', + queryFixtures: function(records, query, type) { + return records.filter(function(record) { + for(var key in query) { + if (!query.hasOwnProperty(key)) { continue; } + var value = query[key]; + if (record[key] !== value) { return false; } + } + return true; + }); + } +}); diff -r 3e93c61f6be0 -r e95ca73cec54 cms/app-client/app/components/visu-carto.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cms/app-client/app/components/visu-carto.js Mon Jan 18 10:01:39 2016 +0100 @@ -0,0 +1,134 @@ +import Ember from 'ember'; + +export default Ember.Component.extend({ + // storage: Ember.inject.service(), + didInsertElement: function(){ + var _this = this; + + var continentsDataProvider; + + var franceDataProvider = { + mapVar: AmCharts.maps.france2016Low, + getAreasFromMap:true, + + areas: this.initArea(AmCharts.maps.france2016Low) + }; + + var worldDataProvider = { + map: "worldLow", + getAreasFromMap: true, + images: [{ + id: "backButton", + label: "Back to continents map", + rollOverColor: "#CC0000", + labelRollOverColor: "#CC0000", + useTargetsZoomValues: true, + left: 30, + bottom: 30, + labelFontSize: 15, + selectable: true + }], + areas: this.initArea(AmCharts.maps.worldLow, franceDataProvider) + }; + + + var continentsDataProvider = { + map: "continentsLow", + + areas: [{ + id: "africa", + linkToObject: worldDataProvider, + color: "#7CACAE", + passZoomValuesToTarget: true + }, { + id: "asia", + linkToObject: worldDataProvider, + color: "#E0EEEF", + passZoomValuesToTarget: true + }, { + id: "australia", + linkToObject: worldDataProvider, + color: "#E0EEEF", + passZoomValuesToTarget: true + }, { + id: "europe", + linkToObject: worldDataProvider, + color: "#2D7073", + passZoomValuesToTarget: true + }, { + id: "north_america", + linkToObject: worldDataProvider, + color: "#B0D1D3", + passZoomValuesToTarget: true + }, { + id: "south_america", + linkToObject: worldDataProvider, + color: "#E0EEEF", + passZoomValuesToTarget: true + }] + + }; + + + var map = AmCharts.makeChart("mapdiv", { + type: "map", + + + areasSettings: { + autoZoom: true, + rollOverOutlineColor: "#000000", + selectedOutlineColor: "#CC0000", + selectedColor: "green", + color: "#E0EEEF" + }, + + dataProvider: continentsDataProvider, + + listeners: [{event:"clickMapObject", method:handleMapObjectClick}] + + }); + + function handleGoHome() { + map.dataProvider = continentsDataProvider; + map.validateNow(); + } + function handleMapObjectClick (event) { + console.log("bbox: ", event.mapObject.displayObject.node.getBBox()); + // console.log("event", event); + // console.log("originalTarget", event.event.originalTarget); + // console.log("getTotalLength", event.event.originalTarget.getTotalLength()); + // console.log("getBBox", event.event.originalTarget.getBBox()); + // console.log("event", event.event.originalTarget.attributes[1].d); + if (event.mapObject.id == "backButton") { + handleGoHome(); + } + _this.sendAction('action', event.mapObject.title); + } + + // monitor when home icon was clicked and also go to continents map + map.addListener("homeButtonClicked", handleGoHome); + }, + initArea: function(area, dataProvider){ + var _this = this; + + var areaList = []; + var count = {}; + area.svg.g.path.map(function(elt, index){ + var length = _this.get("sounds").filterBy("spatial", elt.title).toArray().length; + if (length > 0) + count[elt.id]= length; + }); + area.svg.g.path.map(function(elt, index){ + + areaList.push({ + id: elt.id, + linkToObject: (elt.id === "FR" ? dataProvider : ""), + color: ((typeof(count[elt.id]) === "undefined") ? "#E0EEEF" : "#2D7073"), + autoZoom: (elt.id === "FR" ? true : false), + selectable: true, + passZoomValuesToTarget: false + }); + }); + return areaList; + } +}); diff -r 3e93c61f6be0 -r e95ca73cec54 cms/app-client/app/components/visu-chrono.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cms/app-client/app/components/visu-chrono.js Mon Jan 18 10:01:39 2016 +0100 @@ -0,0 +1,45 @@ +import Ember from 'ember'; + +export default Ember.Component.extend({ + didInsertElement: function(){ + var _this = this; + + if (this.get('container').lookup('controller:application').date !== null){ + this.highlightQuery(this.get('container').lookup('controller:application').date); + } + + var isMouseDown = false, + isHighlighted; + $("#our_table li").mousedown(function () { + isMouseDown = true; + $(this).toggleClass("highlighted"); + isHighlighted = $(this).hasClass("highlighted"); + _this.sendUpdate(); + return false; // prevent text selection + }).mouseover(function () { + if (isMouseDown) { + $(this).toggleClass("highlighted", isHighlighted); + _this.sendUpdate(); + } + }).bind("selectstart", function () { + return false; + }) + + $(document).mouseup(function () { + isMouseDown = false; + }); + }, + sendUpdate: function(){ + var dateQuery = []; + $('.highlighted').map(function(index, elt) { + dateQuery.push(parseInt($(elt).parent().attr('id')) + parseInt($(elt).html())); + }); + this.sendAction('action', dateQuery); + }, + highlightQuery: function(list){ + list.map(function(elt, index){ + var year = Math.floor(parseInt(elt)/10)*10; + $("#"+year+" ."+(parseInt(elt)-year)).toggleClass("highlighted", true); + }); + } +}); diff -r 3e93c61f6be0 -r e95ca73cec54 cms/app-client/app/components/visu-langues.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cms/app-client/app/components/visu-langues.js Mon Jan 18 10:01:39 2016 +0100 @@ -0,0 +1,197 @@ +import Ember from 'ember'; + +export default Ember.Component.extend({ + didInsertElement: function(){ + var _this = this; + + var margin = {top: 20, right: 0, bottom: 0, left: 0}, + width = 560, + height = 600 - margin.top - margin.bottom, + formatNumber = d3.format(",d"), + transitioning; + + var x = d3.scale.linear() + .domain([0, width]) + .range([0, width]); + + 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 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"); + + 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"); + + d3.json("langues.json", function(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; + } + + // 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) { + return (d._children = d.children) + ? d.value = d.children.reduce(function(p, v) { return p + accumulate(v); }, 0) + : 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); + }); + } + } + + 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 g = g1.selectAll("g") + .data(d._children) + .enter().append("g"); + + g.classed("bla", true).on("click", selectHandler) + + g.filter(function(d) { return d._children; }) + .classed("children", true) + .on("click", transition); + + // g.selectAll(".child") + // .data(function(d) { return d._children || [d]; }) + // .enter().append("rect") + // .attr("class", "child") + // .call(rect); + + g.append("rect") + .attr("class", "parent") + // .attr("fill", (d.color || "#bbb")) + .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); + + 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); + + // 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); + + // 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); + + // 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); + } + + 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 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; + } + }); + } +}); diff -r 3e93c61f6be0 -r e95ca73cec54 cms/app-client/app/controllers/application.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cms/app-client/app/controllers/application.js Mon Jan 18 10:01:39 2016 +0100 @@ -0,0 +1,76 @@ +import Ember from 'ember'; + +export default Ember.Controller.extend({ + queryParams: ['location', 'langue', 'discours', 'date', 'thematique'], + location: null, + langue: null, + discours: null, + date: [], + thematique: null, + isShowingModal: false, + currentDetails: null, + currentItem: {title: "example", master: 'http://www.noiseaddicts.com/samples_1w72b820/3921.mp3'}, + filteredSounds: Ember.computed('location', 'langue', 'discours', 'date', 'thematique', 'model', function() { + var location = this.get('location'); + var langue = this.get('langue'); + var discours = this.get('discours'); + var date = this.get('date'); + var thematique = this.get('thematique'); + + var sounds = this.get('model'); + + if (location) { + sounds = sounds.filterBy('spatial', location); + } + if (langue) { + sounds = sounds.filterBy('language', langue); + } + if (discours) { + sounds = sounds.filterBy('type', discours); + } + if (date.length > 0) { + var temp = sounds; + sounds.map(function(elt, index){ + if (date.indexOf(elt.get('created')) === -1){ + temp = temp.without(elt); + } + }); + sounds = temp; + } + if (thematique) { + sounds = sounds.filterBy('thematique', thematique); + } + return sounds; + }), + actions: { + deleteTag: function(query, item){ + var queryParams = {}; + if (query === 'date'){ + var array = this.get('date'); + if(array.indexOf(item) !== -1) { + array.splice(array.indexOf(item), 1); + } + } + queryParams[query] = array || null; + this.transitionToRoute({queryParams: queryParams}); + }, + play: function(item){ + this.set("currentItem", item); + $("#audio-player").load(); + $(".result-item").toggleClass("playing", false); + $("#"+item.id).toggleClass("playing", true); + }, + details: function(item){ + if ($("#"+item.id).hasClass("details")){ + $("#"+item.id).toggleClass("details", false); + } else{ + $(".result-item").toggleClass("details", false); + $("#"+item.id).toggleClass("details", true); + } + }, + toggleModal: function(item){ + this.set("isShowingModal", !this.isShowingModal); + this.set("currentDetails", item); + } + } +}); diff -r 3e93c61f6be0 -r e95ca73cec54 cms/app-client/app/controllers/tabs/carto.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cms/app-client/app/controllers/tabs/carto.js Mon Jan 18 10:01:39 2016 +0100 @@ -0,0 +1,9 @@ +import Ember from 'ember'; + +export default Ember.Controller.extend({ + actions: { + updateUrl: function(selection){ + this.transitionToRoute({queryParams: {location: selection}}); + } + } +}); diff -r 3e93c61f6be0 -r e95ca73cec54 cms/app-client/app/controllers/tabs/chrono.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cms/app-client/app/controllers/tabs/chrono.js Mon Jan 18 10:01:39 2016 +0100 @@ -0,0 +1,9 @@ +import Ember from 'ember'; + +export default Ember.Controller.extend({ + actions: { + updateUrl: function(selection){ + this.transitionToRoute({queryParams: {date: selection}}); + } + } +}); diff -r 3e93c61f6be0 -r e95ca73cec54 cms/app-client/app/controllers/tabs/langues.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cms/app-client/app/controllers/tabs/langues.js Mon Jan 18 10:01:39 2016 +0100 @@ -0,0 +1,9 @@ +import Ember from 'ember'; + +export default Ember.Controller.extend({ + actions: { + updateUrl: function(selection){ + this.transitionToRoute({queryParams: {langue: selection}}); + } + } +}); diff -r 3e93c61f6be0 -r e95ca73cec54 cms/app-client/app/controllers/visus/visu-carto.js --- a/cms/app-client/app/controllers/visus/visu-carto.js Fri Jan 15 17:16:49 2016 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,6 +0,0 @@ -import Ember from 'ember'; -import config from '../../config/environment'; - -export default Ember.Controller.extend({ - logoUrl: config.APP.baseStatic + "assets/images/logo.png" -}); diff -r 3e93c61f6be0 -r e95ca73cec54 cms/app-client/app/index.html --- a/cms/app-client/app/index.html Fri Jan 15 17:16:49 2016 +0100 +++ b/cms/app-client/app/index.html Mon Jan 18 10:01:39 2016 +0100 @@ -21,19 +21,28 @@