v2 site
@ -12,7 +12,11 @@
|
|||||||
|
|
||||||
#= require ./vendor/jquery.mask
|
#= require ./vendor/jquery.mask
|
||||||
#= require ./vendor/jquery.fitvids
|
#= require ./vendor/jquery.fitvids
|
||||||
#= require ./vendor/jquery.bxslider
|
#= require ./vendor/slick
|
||||||
|
|
||||||
|
#= require ./vendor/d3.min
|
||||||
|
#= require ./vendor/d3.layout.cloud
|
||||||
|
|
||||||
#= require redactor
|
#= require redactor
|
||||||
#= require redactor_plugins/fontsize
|
#= require redactor_plugins/fontsize
|
||||||
#= require redactor_plugins/fontfamily
|
#= require redactor_plugins/fontfamily
|
||||||
@ -83,6 +87,7 @@ $(document).ready ->
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
$ ->
|
$ ->
|
||||||
$(window).on "resize", ->
|
$(window).on "resize", ->
|
||||||
resize()
|
resize()
|
||||||
|
500
app/assets/javascripts/vendor/d3.layout.cloud.js
vendored
Normal file
@ -0,0 +1,500 @@
|
|||||||
|
(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g=(g.d3||(g.d3 = {}));g=(g.layout||(g.layout = {}));g.cloud = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
|
||||||
|
// Word cloud layout by Jason Davies, https://www.jasondavies.com/wordcloud/
|
||||||
|
// Algorithm due to Jonathan Feinberg, http://static.mrfeinberg.com/bv_ch03.pdf
|
||||||
|
|
||||||
|
var dispatch = require("d3-dispatch").dispatch;
|
||||||
|
|
||||||
|
var cloudRadians = Math.PI / 180,
|
||||||
|
cw = 1 << 11 >> 5,
|
||||||
|
ch = 1 << 11;
|
||||||
|
|
||||||
|
module.exports = function() {
|
||||||
|
var size = [256, 256],
|
||||||
|
text = cloudText,
|
||||||
|
font = cloudFont,
|
||||||
|
fontSize = cloudFontSize,
|
||||||
|
fontStyle = cloudFontNormal,
|
||||||
|
fontWeight = cloudFontNormal,
|
||||||
|
rotate = cloudRotate,
|
||||||
|
padding = cloudPadding,
|
||||||
|
spiral = archimedeanSpiral,
|
||||||
|
words = [],
|
||||||
|
timeInterval = Infinity,
|
||||||
|
event = dispatch("word", "end"),
|
||||||
|
timer = null,
|
||||||
|
random = Math.random,
|
||||||
|
cloud = {},
|
||||||
|
canvas = cloudCanvas;
|
||||||
|
|
||||||
|
cloud.canvas = function(_) {
|
||||||
|
return arguments.length ? (canvas = functor(_), cloud) : canvas;
|
||||||
|
};
|
||||||
|
|
||||||
|
cloud.start = function() {
|
||||||
|
var contextAndRatio = getContext(canvas()),
|
||||||
|
board = zeroArray((size[0] >> 5) * size[1]),
|
||||||
|
bounds = null,
|
||||||
|
n = words.length,
|
||||||
|
i = -1,
|
||||||
|
tags = [],
|
||||||
|
data = words.map(function(d, i) {
|
||||||
|
d.text = text.call(this, d, i);
|
||||||
|
d.font = font.call(this, d, i);
|
||||||
|
d.style = fontStyle.call(this, d, i);
|
||||||
|
d.weight = fontWeight.call(this, d, i);
|
||||||
|
d.rotate = rotate.call(this, d, i);
|
||||||
|
d.size = ~~fontSize.call(this, d, i);
|
||||||
|
d.padding = padding.call(this, d, i);
|
||||||
|
return d;
|
||||||
|
}).sort(function(a, b) { return b.size - a.size; });
|
||||||
|
|
||||||
|
if (timer) clearInterval(timer);
|
||||||
|
timer = setInterval(step, 0);
|
||||||
|
step();
|
||||||
|
|
||||||
|
return cloud;
|
||||||
|
|
||||||
|
function step() {
|
||||||
|
var start = Date.now();
|
||||||
|
while (Date.now() - start < timeInterval && ++i < n && timer) {
|
||||||
|
var d = data[i];
|
||||||
|
d.x = (size[0] * (random() + .5)) >> 1;
|
||||||
|
d.y = (size[1] * (random() + .5)) >> 1;
|
||||||
|
cloudSprite(contextAndRatio, d, data, i);
|
||||||
|
if (d.hasText && place(board, d, bounds)) {
|
||||||
|
tags.push(d);
|
||||||
|
event.call("word", cloud, d);
|
||||||
|
if (bounds) cloudBounds(bounds, d);
|
||||||
|
else bounds = [{x: d.x + d.x0, y: d.y + d.y0}, {x: d.x + d.x1, y: d.y + d.y1}];
|
||||||
|
// Temporary hack
|
||||||
|
d.x -= size[0] >> 1;
|
||||||
|
d.y -= size[1] >> 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (i >= n) {
|
||||||
|
cloud.stop();
|
||||||
|
event.call("end", cloud, tags, bounds);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
cloud.stop = function() {
|
||||||
|
if (timer) {
|
||||||
|
clearInterval(timer);
|
||||||
|
timer = null;
|
||||||
|
}
|
||||||
|
return cloud;
|
||||||
|
};
|
||||||
|
|
||||||
|
function getContext(canvas) {
|
||||||
|
canvas.width = canvas.height = 1;
|
||||||
|
var ratio = Math.sqrt(canvas.getContext("2d").getImageData(0, 0, 1, 1).data.length >> 2);
|
||||||
|
canvas.width = (cw << 5) / ratio;
|
||||||
|
canvas.height = ch / ratio;
|
||||||
|
|
||||||
|
var context = canvas.getContext("2d");
|
||||||
|
context.fillStyle = context.strokeStyle = "red";
|
||||||
|
context.textAlign = "center";
|
||||||
|
|
||||||
|
return {context: context, ratio: ratio};
|
||||||
|
}
|
||||||
|
|
||||||
|
function place(board, tag, bounds) {
|
||||||
|
var perimeter = [{x: 0, y: 0}, {x: size[0], y: size[1]}],
|
||||||
|
startX = tag.x,
|
||||||
|
startY = tag.y,
|
||||||
|
maxDelta = Math.sqrt(size[0] * size[0] + size[1] * size[1]),
|
||||||
|
s = spiral(size),
|
||||||
|
dt = random() < .5 ? 1 : -1,
|
||||||
|
t = -dt,
|
||||||
|
dxdy,
|
||||||
|
dx,
|
||||||
|
dy;
|
||||||
|
|
||||||
|
while (dxdy = s(t += dt)) {
|
||||||
|
dx = ~~dxdy[0];
|
||||||
|
dy = ~~dxdy[1];
|
||||||
|
|
||||||
|
if (Math.min(Math.abs(dx), Math.abs(dy)) >= maxDelta) break;
|
||||||
|
|
||||||
|
tag.x = startX + dx;
|
||||||
|
tag.y = startY + dy;
|
||||||
|
|
||||||
|
if (tag.x + tag.x0 < 0 || tag.y + tag.y0 < 0 ||
|
||||||
|
tag.x + tag.x1 > size[0] || tag.y + tag.y1 > size[1]) continue;
|
||||||
|
// TODO only check for collisions within current bounds.
|
||||||
|
if (!bounds || !cloudCollide(tag, board, size[0])) {
|
||||||
|
if (!bounds || collideRects(tag, bounds)) {
|
||||||
|
var sprite = tag.sprite,
|
||||||
|
w = tag.width >> 5,
|
||||||
|
sw = size[0] >> 5,
|
||||||
|
lx = tag.x - (w << 4),
|
||||||
|
sx = lx & 0x7f,
|
||||||
|
msx = 32 - sx,
|
||||||
|
h = tag.y1 - tag.y0,
|
||||||
|
x = (tag.y + tag.y0) * sw + (lx >> 5),
|
||||||
|
last;
|
||||||
|
for (var j = 0; j < h; j++) {
|
||||||
|
last = 0;
|
||||||
|
for (var i = 0; i <= w; i++) {
|
||||||
|
board[x + i] |= (last << msx) | (i < w ? (last = sprite[j * w + i]) >>> sx : 0);
|
||||||
|
}
|
||||||
|
x += sw;
|
||||||
|
}
|
||||||
|
delete tag.sprite;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
cloud.timeInterval = function(_) {
|
||||||
|
return arguments.length ? (timeInterval = _ == null ? Infinity : _, cloud) : timeInterval;
|
||||||
|
};
|
||||||
|
|
||||||
|
cloud.words = function(_) {
|
||||||
|
return arguments.length ? (words = _, cloud) : words;
|
||||||
|
};
|
||||||
|
|
||||||
|
cloud.size = function(_) {
|
||||||
|
return arguments.length ? (size = [+_[0], +_[1]], cloud) : size;
|
||||||
|
};
|
||||||
|
|
||||||
|
cloud.font = function(_) {
|
||||||
|
return arguments.length ? (font = functor(_), cloud) : font;
|
||||||
|
};
|
||||||
|
|
||||||
|
cloud.fontStyle = function(_) {
|
||||||
|
return arguments.length ? (fontStyle = functor(_), cloud) : fontStyle;
|
||||||
|
};
|
||||||
|
|
||||||
|
cloud.fontWeight = function(_) {
|
||||||
|
return arguments.length ? (fontWeight = functor(_), cloud) : fontWeight;
|
||||||
|
};
|
||||||
|
|
||||||
|
cloud.rotate = function(_) {
|
||||||
|
return arguments.length ? (rotate = functor(_), cloud) : rotate;
|
||||||
|
};
|
||||||
|
|
||||||
|
cloud.text = function(_) {
|
||||||
|
return arguments.length ? (text = functor(_), cloud) : text;
|
||||||
|
};
|
||||||
|
|
||||||
|
cloud.spiral = function(_) {
|
||||||
|
return arguments.length ? (spiral = spirals[_] || _, cloud) : spiral;
|
||||||
|
};
|
||||||
|
|
||||||
|
cloud.fontSize = function(_) {
|
||||||
|
return arguments.length ? (fontSize = functor(_), cloud) : fontSize;
|
||||||
|
};
|
||||||
|
|
||||||
|
cloud.padding = function(_) {
|
||||||
|
return arguments.length ? (padding = functor(_), cloud) : padding;
|
||||||
|
};
|
||||||
|
|
||||||
|
cloud.random = function(_) {
|
||||||
|
return arguments.length ? (random = _, cloud) : random;
|
||||||
|
};
|
||||||
|
|
||||||
|
cloud.on = function() {
|
||||||
|
var value = event.on.apply(event, arguments);
|
||||||
|
return value === event ? cloud : value;
|
||||||
|
};
|
||||||
|
|
||||||
|
return cloud;
|
||||||
|
};
|
||||||
|
|
||||||
|
function cloudText(d) {
|
||||||
|
return d.text;
|
||||||
|
}
|
||||||
|
|
||||||
|
function cloudFont() {
|
||||||
|
return "serif";
|
||||||
|
}
|
||||||
|
|
||||||
|
function cloudFontNormal() {
|
||||||
|
return "normal";
|
||||||
|
}
|
||||||
|
|
||||||
|
function cloudFontSize(d) {
|
||||||
|
return Math.sqrt(d.value);
|
||||||
|
}
|
||||||
|
|
||||||
|
function cloudRotate() {
|
||||||
|
return (~~(Math.random() * 6) - 3) * 30;
|
||||||
|
}
|
||||||
|
|
||||||
|
function cloudPadding() {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Fetches a monochrome sprite bitmap for the specified text.
|
||||||
|
// Load in batches for speed.
|
||||||
|
function cloudSprite(contextAndRatio, d, data, di) {
|
||||||
|
if (d.sprite) return;
|
||||||
|
var c = contextAndRatio.context,
|
||||||
|
ratio = contextAndRatio.ratio;
|
||||||
|
|
||||||
|
c.clearRect(0, 0, (cw << 5) / ratio, ch / ratio);
|
||||||
|
var x = 0,
|
||||||
|
y = 0,
|
||||||
|
maxh = 0,
|
||||||
|
n = data.length;
|
||||||
|
--di;
|
||||||
|
while (++di < n) {
|
||||||
|
d = data[di];
|
||||||
|
c.save();
|
||||||
|
c.font = d.style + " " + d.weight + " " + ~~((d.size + 1) / ratio) + "px " + d.font;
|
||||||
|
var w = c.measureText(d.text + "m").width * ratio,
|
||||||
|
h = d.size << 1;
|
||||||
|
if (d.rotate) {
|
||||||
|
var sr = Math.sin(d.rotate * cloudRadians),
|
||||||
|
cr = Math.cos(d.rotate * cloudRadians),
|
||||||
|
wcr = w * cr,
|
||||||
|
wsr = w * sr,
|
||||||
|
hcr = h * cr,
|
||||||
|
hsr = h * sr;
|
||||||
|
w = (Math.max(Math.abs(wcr + hsr), Math.abs(wcr - hsr)) + 0x1f) >> 5 << 5;
|
||||||
|
h = ~~Math.max(Math.abs(wsr + hcr), Math.abs(wsr - hcr));
|
||||||
|
} else {
|
||||||
|
w = (w + 0x1f) >> 5 << 5;
|
||||||
|
}
|
||||||
|
if (h > maxh) maxh = h;
|
||||||
|
if (x + w >= (cw << 5)) {
|
||||||
|
x = 0;
|
||||||
|
y += maxh;
|
||||||
|
maxh = 0;
|
||||||
|
}
|
||||||
|
if (y + h >= ch) break;
|
||||||
|
c.translate((x + (w >> 1)) / ratio, (y + (h >> 1)) / ratio);
|
||||||
|
if (d.rotate) c.rotate(d.rotate * cloudRadians);
|
||||||
|
c.fillText(d.text, 0, 0);
|
||||||
|
if (d.padding) c.lineWidth = 2 * d.padding, c.strokeText(d.text, 0, 0);
|
||||||
|
c.restore();
|
||||||
|
d.width = w;
|
||||||
|
d.height = h;
|
||||||
|
d.xoff = x;
|
||||||
|
d.yoff = y;
|
||||||
|
d.x1 = w >> 1;
|
||||||
|
d.y1 = h >> 1;
|
||||||
|
d.x0 = -d.x1;
|
||||||
|
d.y0 = -d.y1;
|
||||||
|
d.hasText = true;
|
||||||
|
x += w;
|
||||||
|
}
|
||||||
|
var pixels = c.getImageData(0, 0, (cw << 5) / ratio, ch / ratio).data,
|
||||||
|
sprite = [];
|
||||||
|
while (--di >= 0) {
|
||||||
|
d = data[di];
|
||||||
|
if (!d.hasText) continue;
|
||||||
|
var w = d.width,
|
||||||
|
w32 = w >> 5,
|
||||||
|
h = d.y1 - d.y0;
|
||||||
|
// Zero the buffer
|
||||||
|
for (var i = 0; i < h * w32; i++) sprite[i] = 0;
|
||||||
|
x = d.xoff;
|
||||||
|
if (x == null) return;
|
||||||
|
y = d.yoff;
|
||||||
|
var seen = 0,
|
||||||
|
seenRow = -1;
|
||||||
|
for (var j = 0; j < h; j++) {
|
||||||
|
for (var i = 0; i < w; i++) {
|
||||||
|
var k = w32 * j + (i >> 5),
|
||||||
|
m = pixels[((y + j) * (cw << 5) + (x + i)) << 2] ? 1 << (31 - (i % 32)) : 0;
|
||||||
|
sprite[k] |= m;
|
||||||
|
seen |= m;
|
||||||
|
}
|
||||||
|
if (seen) seenRow = j;
|
||||||
|
else {
|
||||||
|
d.y0++;
|
||||||
|
h--;
|
||||||
|
j--;
|
||||||
|
y++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
d.y1 = d.y0 + seenRow;
|
||||||
|
d.sprite = sprite.slice(0, (d.y1 - d.y0) * w32);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Use mask-based collision detection.
|
||||||
|
function cloudCollide(tag, board, sw) {
|
||||||
|
sw >>= 5;
|
||||||
|
var sprite = tag.sprite,
|
||||||
|
w = tag.width >> 5,
|
||||||
|
lx = tag.x - (w << 4),
|
||||||
|
sx = lx & 0x7f,
|
||||||
|
msx = 32 - sx,
|
||||||
|
h = tag.y1 - tag.y0,
|
||||||
|
x = (tag.y + tag.y0) * sw + (lx >> 5),
|
||||||
|
last;
|
||||||
|
for (var j = 0; j < h; j++) {
|
||||||
|
last = 0;
|
||||||
|
for (var i = 0; i <= w; i++) {
|
||||||
|
if (((last << msx) | (i < w ? (last = sprite[j * w + i]) >>> sx : 0))
|
||||||
|
& board[x + i]) return true;
|
||||||
|
}
|
||||||
|
x += sw;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
function cloudBounds(bounds, d) {
|
||||||
|
var b0 = bounds[0],
|
||||||
|
b1 = bounds[1];
|
||||||
|
if (d.x + d.x0 < b0.x) b0.x = d.x + d.x0;
|
||||||
|
if (d.y + d.y0 < b0.y) b0.y = d.y + d.y0;
|
||||||
|
if (d.x + d.x1 > b1.x) b1.x = d.x + d.x1;
|
||||||
|
if (d.y + d.y1 > b1.y) b1.y = d.y + d.y1;
|
||||||
|
}
|
||||||
|
|
||||||
|
function collideRects(a, b) {
|
||||||
|
return a.x + a.x1 > b[0].x && a.x + a.x0 < b[1].x && a.y + a.y1 > b[0].y && a.y + a.y0 < b[1].y;
|
||||||
|
}
|
||||||
|
|
||||||
|
function archimedeanSpiral(size) {
|
||||||
|
var e = size[0] / size[1];
|
||||||
|
return function(t) {
|
||||||
|
return [e * (t *= .1) * Math.cos(t), t * Math.sin(t)];
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function rectangularSpiral(size) {
|
||||||
|
var dy = 4,
|
||||||
|
dx = dy * size[0] / size[1],
|
||||||
|
x = 0,
|
||||||
|
y = 0;
|
||||||
|
return function(t) {
|
||||||
|
var sign = t < 0 ? -1 : 1;
|
||||||
|
// See triangular numbers: T_n = n * (n + 1) / 2.
|
||||||
|
switch ((Math.sqrt(1 + 4 * sign * t) - sign) & 3) {
|
||||||
|
case 0: x += dx; break;
|
||||||
|
case 1: y += dy; break;
|
||||||
|
case 2: x -= dx; break;
|
||||||
|
default: y -= dy; break;
|
||||||
|
}
|
||||||
|
return [x, y];
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO reuse arrays?
|
||||||
|
function zeroArray(n) {
|
||||||
|
var a = [],
|
||||||
|
i = -1;
|
||||||
|
while (++i < n) a[i] = 0;
|
||||||
|
return a;
|
||||||
|
}
|
||||||
|
|
||||||
|
function cloudCanvas() {
|
||||||
|
return document.createElement("canvas");
|
||||||
|
}
|
||||||
|
|
||||||
|
function functor(d) {
|
||||||
|
return typeof d === "function" ? d : function() { return d; };
|
||||||
|
}
|
||||||
|
|
||||||
|
var spirals = {
|
||||||
|
archimedean: archimedeanSpiral,
|
||||||
|
rectangular: rectangularSpiral
|
||||||
|
};
|
||||||
|
|
||||||
|
},{"d3-dispatch":2}],2:[function(require,module,exports){
|
||||||
|
// https://d3js.org/d3-dispatch/ Version 1.0.3. Copyright 2017 Mike Bostock.
|
||||||
|
(function (global, factory) {
|
||||||
|
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
|
||||||
|
typeof define === 'function' && define.amd ? define(['exports'], factory) :
|
||||||
|
(factory((global.d3 = global.d3 || {})));
|
||||||
|
}(this, (function (exports) { 'use strict';
|
||||||
|
|
||||||
|
var noop = {value: function() {}};
|
||||||
|
|
||||||
|
function dispatch() {
|
||||||
|
for (var i = 0, n = arguments.length, _ = {}, t; i < n; ++i) {
|
||||||
|
if (!(t = arguments[i] + "") || (t in _)) throw new Error("illegal type: " + t);
|
||||||
|
_[t] = [];
|
||||||
|
}
|
||||||
|
return new Dispatch(_);
|
||||||
|
}
|
||||||
|
|
||||||
|
function Dispatch(_) {
|
||||||
|
this._ = _;
|
||||||
|
}
|
||||||
|
|
||||||
|
function parseTypenames(typenames, types) {
|
||||||
|
return typenames.trim().split(/^|\s+/).map(function(t) {
|
||||||
|
var name = "", i = t.indexOf(".");
|
||||||
|
if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i);
|
||||||
|
if (t && !types.hasOwnProperty(t)) throw new Error("unknown type: " + t);
|
||||||
|
return {type: t, name: name};
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
Dispatch.prototype = dispatch.prototype = {
|
||||||
|
constructor: Dispatch,
|
||||||
|
on: function(typename, callback) {
|
||||||
|
var _ = this._,
|
||||||
|
T = parseTypenames(typename + "", _),
|
||||||
|
t,
|
||||||
|
i = -1,
|
||||||
|
n = T.length;
|
||||||
|
|
||||||
|
// If no callback was specified, return the callback of the given type and name.
|
||||||
|
if (arguments.length < 2) {
|
||||||
|
while (++i < n) if ((t = (typename = T[i]).type) && (t = get(_[t], typename.name))) return t;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// If a type was specified, set the callback for the given type and name.
|
||||||
|
// Otherwise, if a null callback was specified, remove callbacks of the given name.
|
||||||
|
if (callback != null && typeof callback !== "function") throw new Error("invalid callback: " + callback);
|
||||||
|
while (++i < n) {
|
||||||
|
if (t = (typename = T[i]).type) _[t] = set(_[t], typename.name, callback);
|
||||||
|
else if (callback == null) for (t in _) _[t] = set(_[t], typename.name, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
return this;
|
||||||
|
},
|
||||||
|
copy: function() {
|
||||||
|
var copy = {}, _ = this._;
|
||||||
|
for (var t in _) copy[t] = _[t].slice();
|
||||||
|
return new Dispatch(copy);
|
||||||
|
},
|
||||||
|
call: function(type, that) {
|
||||||
|
if ((n = arguments.length - 2) > 0) for (var args = new Array(n), i = 0, n, t; i < n; ++i) args[i] = arguments[i + 2];
|
||||||
|
if (!this._.hasOwnProperty(type)) throw new Error("unknown type: " + type);
|
||||||
|
for (t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args);
|
||||||
|
},
|
||||||
|
apply: function(type, that, args) {
|
||||||
|
if (!this._.hasOwnProperty(type)) throw new Error("unknown type: " + type);
|
||||||
|
for (var t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
function get(type, name) {
|
||||||
|
for (var i = 0, n = type.length, c; i < n; ++i) {
|
||||||
|
if ((c = type[i]).name === name) {
|
||||||
|
return c.value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function set(type, name, callback) {
|
||||||
|
for (var i = 0, n = type.length; i < n; ++i) {
|
||||||
|
if (type[i].name === name) {
|
||||||
|
type[i] = noop, type = type.slice(0, i).concat(type.slice(i + 1));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (callback != null) type.push({name: name, value: callback});
|
||||||
|
return type;
|
||||||
|
}
|
||||||
|
|
||||||
|
exports.dispatch = dispatch;
|
||||||
|
|
||||||
|
Object.defineProperty(exports, '__esModule', { value: true });
|
||||||
|
|
||||||
|
})));
|
||||||
|
|
||||||
|
},{}]},{},[1])(1)
|
||||||
|
});
|
5
app/assets/javascripts/vendor/d3.min.js
vendored
Normal file
3011
app/assets/javascripts/vendor/slick.js
vendored
Normal file
@ -9,9 +9,17 @@
|
|||||||
|
|
||||||
@import "qi_grids";
|
@import "qi_grids";
|
||||||
|
|
||||||
$first_color:#EAB634;
|
@import "vendor/slick";
|
||||||
|
@import "vendor/slick-theme";
|
||||||
|
|
||||||
|
|
||||||
|
$first_color:#DBC089;
|
||||||
|
|
||||||
|
h2{
|
||||||
|
color:#DBC089;
|
||||||
|
font-weight:bold;
|
||||||
|
}
|
||||||
|
|
||||||
body{
|
body{
|
||||||
font-family: Lato, Helvetica, Arial, sans-serif;
|
font-family: Lato, Helvetica, Arial, sans-serif;
|
||||||
font-size:15px;
|
font-size:15px;
|
||||||
@ -58,10 +66,16 @@ body{
|
|||||||
img{
|
img{
|
||||||
max-width:100%;
|
max-width:100%;
|
||||||
}
|
}
|
||||||
|
.header_image{
|
||||||
|
position:relative;
|
||||||
|
|
||||||
|
background: center center no-repeat ;
|
||||||
|
background-size:100%;
|
||||||
|
background-size:cover;
|
||||||
|
}
|
||||||
|
|
||||||
#header{
|
#header{
|
||||||
background: center center no-repeat black;
|
background: center center no-repeat ;
|
||||||
background-size:100%;
|
background-size:100%;
|
||||||
background-size:cover;
|
background-size:cover;
|
||||||
padding:10px 20px;
|
padding:10px 20px;
|
||||||
@ -82,14 +96,22 @@ img{
|
|||||||
height:70px;
|
height:70px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.top_right{
|
||||||
|
position:absolute;
|
||||||
|
top:5px;
|
||||||
|
right:10px;
|
||||||
|
font-size:0.95em;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
#menu_top{
|
#menu_top{
|
||||||
position:relative;
|
position:relative;
|
||||||
z-index:2;
|
z-index:2;
|
||||||
float:right;
|
float:right;
|
||||||
text-align:right;
|
text-align:right;
|
||||||
margin-top:20px;
|
margin-top:35px;
|
||||||
|
|
||||||
color:white;
|
color:black;
|
||||||
|
|
||||||
|
|
||||||
ul{
|
ul{
|
||||||
@ -103,7 +125,14 @@ ul{
|
|||||||
a{
|
a{
|
||||||
display:inline-block;
|
display:inline-block;
|
||||||
padding:4px 5px;
|
padding:4px 5px;
|
||||||
color:white
|
color:black;
|
||||||
|
|
||||||
|
&:hover, &.active{
|
||||||
|
color:#DBC089;
|
||||||
|
text-decoration:none;
|
||||||
|
font-weight:bold;
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -111,6 +140,13 @@ ul{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#main{
|
||||||
|
strong{
|
||||||
|
color:#DBC089;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
@media screen and (min-width: 0px) and (max-width: 1170px) {
|
@media screen and (min-width: 0px) and (max-width: 1170px) {
|
||||||
.info_contact {
|
.info_contact {
|
||||||
>div {
|
>div {
|
||||||
@ -141,7 +177,7 @@ ul{
|
|||||||
}
|
}
|
||||||
text-align:center;
|
text-align:center;
|
||||||
padding:60px 0;
|
padding:60px 0;
|
||||||
background: url('/mont2.jpg?1=2') no-repeat center center;
|
background: url('/mont.jpg?1=4') no-repeat center center;
|
||||||
background-size: cover;
|
background-size: cover;
|
||||||
font-weight: 300;
|
font-weight: 300;
|
||||||
|
|
||||||
@ -347,3 +383,5 @@ ul{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
195
app/assets/stylesheets/vendor/slick-theme.scss
vendored
Normal file
@ -0,0 +1,195 @@
|
|||||||
|
@charset "UTF-8";
|
||||||
|
|
||||||
|
// Default Variables
|
||||||
|
|
||||||
|
// Slick icon entity codes outputs the following
|
||||||
|
// "\2190" outputs ascii character "←"
|
||||||
|
// "\2192" outputs ascii character "→"
|
||||||
|
// "\2022" outputs ascii character "•"
|
||||||
|
|
||||||
|
$slick-font-path: "/fonts/slick/" !default;
|
||||||
|
$slick-font-family: "slick" !default;
|
||||||
|
$slick-loader-path: "./" !default;
|
||||||
|
$slick-arrow-color: white !default;
|
||||||
|
$slick-dot-color: black !default;
|
||||||
|
$slick-dot-color-active: $slick-dot-color !default;
|
||||||
|
$slick-prev-character: "\2190" !default;
|
||||||
|
$slick-next-character: "\2192" !default;
|
||||||
|
$slick-dot-character: "\2022" !default;
|
||||||
|
$slick-dot-size: 6px !default;
|
||||||
|
$slick-opacity-default: 0.75 !default;
|
||||||
|
$slick-opacity-on-hover: 1 !default;
|
||||||
|
$slick-opacity-not-active: 0.25 !default;
|
||||||
|
|
||||||
|
@function slick-image-url($url) {
|
||||||
|
@if function-exists(image-url) {
|
||||||
|
@return image-url($url);
|
||||||
|
}
|
||||||
|
@else {
|
||||||
|
@return url($slick-loader-path + $url);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@function slick-font-url($url) {
|
||||||
|
@if function-exists(font-url) {
|
||||||
|
@return font-url($url);
|
||||||
|
}
|
||||||
|
@else {
|
||||||
|
@return url($slick-font-path + $url);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Slider */
|
||||||
|
|
||||||
|
.slick-list {
|
||||||
|
.slick-loading & {
|
||||||
|
background: #fff slick-image-url("ajax-loader.gif") center center no-repeat;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Icons */
|
||||||
|
@if $slick-font-family == "slick" {
|
||||||
|
@font-face {
|
||||||
|
font-family: "slick";
|
||||||
|
src: slick-font-url("slick.eot");
|
||||||
|
src: slick-font-url("slick.eot?#iefix") format("embedded-opentype"), slick-font-url("slick.woff") format("woff"), slick-font-url("slick.ttf") format("truetype"), slick-font-url("slick.svg#slick") format("svg");
|
||||||
|
font-weight: normal;
|
||||||
|
font-style: normal;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Arrows */
|
||||||
|
|
||||||
|
.slick-prev,
|
||||||
|
.slick-next {
|
||||||
|
position: absolute;
|
||||||
|
z-index:100;
|
||||||
|
display: block;
|
||||||
|
height: 20px;
|
||||||
|
width: 20px;
|
||||||
|
line-height: 0px;
|
||||||
|
font-size: 0px;
|
||||||
|
cursor: pointer;
|
||||||
|
background: transparent;
|
||||||
|
color: transparent;
|
||||||
|
top: 50%;
|
||||||
|
-webkit-transform: translate(0, -50%);
|
||||||
|
-ms-transform: translate(0, -50%);
|
||||||
|
transform: translate(0, -50%);
|
||||||
|
padding: 0;
|
||||||
|
border: none;
|
||||||
|
outline: none;
|
||||||
|
&:hover, &:focus {
|
||||||
|
outline: none;
|
||||||
|
background: transparent;
|
||||||
|
color: transparent;
|
||||||
|
&:before {
|
||||||
|
opacity: $slick-opacity-on-hover;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
&.slick-disabled:before {
|
||||||
|
opacity: $slick-opacity-not-active;
|
||||||
|
}
|
||||||
|
&:before {
|
||||||
|
font-family: $slick-font-family;
|
||||||
|
font-size: 20px;
|
||||||
|
line-height: 1;
|
||||||
|
color: $slick-arrow-color;
|
||||||
|
opacity: $slick-opacity-default;
|
||||||
|
-webkit-font-smoothing: antialiased;
|
||||||
|
-moz-osx-font-smoothing: grayscale;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.slick-prev {
|
||||||
|
left: 10px;
|
||||||
|
[dir="rtl"] & {
|
||||||
|
left: auto;
|
||||||
|
right: 10px;
|
||||||
|
}
|
||||||
|
&:before {
|
||||||
|
content: $slick-prev-character;
|
||||||
|
[dir="rtl"] & {
|
||||||
|
content: $slick-next-character;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.slick-next {
|
||||||
|
right: 10px;
|
||||||
|
[dir="rtl"] & {
|
||||||
|
left: 10px;
|
||||||
|
right: auto;
|
||||||
|
}
|
||||||
|
&:before {
|
||||||
|
content: $slick-next-character;
|
||||||
|
[dir="rtl"] & {
|
||||||
|
content: $slick-prev-character;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Dots */
|
||||||
|
|
||||||
|
.slick-dotted.slick-slider {
|
||||||
|
margin-bottom: 30px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.slick-dots {
|
||||||
|
position: absolute;
|
||||||
|
bottom: -25px;
|
||||||
|
list-style: none;
|
||||||
|
display: block;
|
||||||
|
text-align: center;
|
||||||
|
padding: 0;
|
||||||
|
margin: 0;
|
||||||
|
width: 100%;
|
||||||
|
li {
|
||||||
|
position: relative;
|
||||||
|
display: inline-block;
|
||||||
|
height: 20px;
|
||||||
|
width: 20px;
|
||||||
|
margin: 0 5px;
|
||||||
|
padding: 0;
|
||||||
|
cursor: pointer;
|
||||||
|
button {
|
||||||
|
border: 0;
|
||||||
|
background: transparent;
|
||||||
|
display: block;
|
||||||
|
height: 20px;
|
||||||
|
width: 20px;
|
||||||
|
outline: none;
|
||||||
|
line-height: 0px;
|
||||||
|
font-size: 0px;
|
||||||
|
color: transparent;
|
||||||
|
padding: 5px;
|
||||||
|
cursor: pointer;
|
||||||
|
&:hover, &:focus {
|
||||||
|
outline: none;
|
||||||
|
&:before {
|
||||||
|
opacity: $slick-opacity-on-hover;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
&:before {
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
content: $slick-dot-character;
|
||||||
|
width: 20px;
|
||||||
|
height: 20px;
|
||||||
|
font-family: $slick-font-family;
|
||||||
|
font-size: $slick-dot-size;
|
||||||
|
line-height: 20px;
|
||||||
|
text-align: center;
|
||||||
|
color: $slick-dot-color;
|
||||||
|
opacity: $slick-opacity-not-active;
|
||||||
|
-webkit-font-smoothing: antialiased;
|
||||||
|
-moz-osx-font-smoothing: grayscale;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
&.slick-active button:before {
|
||||||
|
color: $slick-dot-color-active;
|
||||||
|
opacity: $slick-opacity-default;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
119
app/assets/stylesheets/vendor/slick.css
vendored
Normal file
@ -0,0 +1,119 @@
|
|||||||
|
/* Slider */
|
||||||
|
.slick-slider
|
||||||
|
{
|
||||||
|
position: relative;
|
||||||
|
|
||||||
|
display: block;
|
||||||
|
box-sizing: border-box;
|
||||||
|
|
||||||
|
-webkit-user-select: none;
|
||||||
|
-moz-user-select: none;
|
||||||
|
-ms-user-select: none;
|
||||||
|
user-select: none;
|
||||||
|
|
||||||
|
-webkit-touch-callout: none;
|
||||||
|
-khtml-user-select: none;
|
||||||
|
-ms-touch-action: pan-y;
|
||||||
|
touch-action: pan-y;
|
||||||
|
-webkit-tap-highlight-color: transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
.slick-list
|
||||||
|
{
|
||||||
|
position: relative;
|
||||||
|
|
||||||
|
display: block;
|
||||||
|
overflow: hidden;
|
||||||
|
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
.slick-list:focus
|
||||||
|
{
|
||||||
|
outline: none;
|
||||||
|
}
|
||||||
|
.slick-list.dragging
|
||||||
|
{
|
||||||
|
cursor: pointer;
|
||||||
|
cursor: hand;
|
||||||
|
}
|
||||||
|
|
||||||
|
.slick-slider .slick-track,
|
||||||
|
.slick-slider .slick-list
|
||||||
|
{
|
||||||
|
-webkit-transform: translate3d(0, 0, 0);
|
||||||
|
-moz-transform: translate3d(0, 0, 0);
|
||||||
|
-ms-transform: translate3d(0, 0, 0);
|
||||||
|
-o-transform: translate3d(0, 0, 0);
|
||||||
|
transform: translate3d(0, 0, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
.slick-track
|
||||||
|
{
|
||||||
|
position: relative;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
|
||||||
|
display: block;
|
||||||
|
margin-left: auto;
|
||||||
|
margin-right: auto;
|
||||||
|
}
|
||||||
|
.slick-track:before,
|
||||||
|
.slick-track:after
|
||||||
|
{
|
||||||
|
display: table;
|
||||||
|
|
||||||
|
content: '';
|
||||||
|
}
|
||||||
|
.slick-track:after
|
||||||
|
{
|
||||||
|
clear: both;
|
||||||
|
}
|
||||||
|
.slick-loading .slick-track
|
||||||
|
{
|
||||||
|
visibility: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
.slick-slide
|
||||||
|
{
|
||||||
|
display: none;
|
||||||
|
float: left;
|
||||||
|
|
||||||
|
height: 100%;
|
||||||
|
min-height: 1px;
|
||||||
|
}
|
||||||
|
[dir='rtl'] .slick-slide
|
||||||
|
{
|
||||||
|
float: right;
|
||||||
|
}
|
||||||
|
.slick-slide img
|
||||||
|
{
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
.slick-slide.slick-loading img
|
||||||
|
{
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
.slick-slide.dragging img
|
||||||
|
{
|
||||||
|
pointer-events: none;
|
||||||
|
}
|
||||||
|
.slick-initialized .slick-slide
|
||||||
|
{
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
.slick-loading .slick-slide
|
||||||
|
{
|
||||||
|
visibility: hidden;
|
||||||
|
}
|
||||||
|
.slick-vertical .slick-slide
|
||||||
|
{
|
||||||
|
display: block;
|
||||||
|
|
||||||
|
height: auto;
|
||||||
|
|
||||||
|
border: 1px solid transparent;
|
||||||
|
}
|
||||||
|
.slick-arrow.slick-hidden {
|
||||||
|
display: none;
|
||||||
|
}
|
@ -4,7 +4,7 @@ class GeneralMails < ActionMailer::Base
|
|||||||
|
|
||||||
layout 'mail'
|
layout 'mail'
|
||||||
|
|
||||||
default from: "Pollen Concepts <contact@pollen-concepts.fr>"
|
default from: "Walden Solutions <contact@walden-solutions.fr>"
|
||||||
|
|
||||||
|
|
||||||
def general(lang_slug, mail_type, email, options = {})
|
def general(lang_slug, mail_type, email, options = {})
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
class QuestionMailer < ActionMailer::Base
|
class QuestionMailer < ActionMailer::Base
|
||||||
default from: "Pollen Concepts <contact@pollen-concepts.fr>"
|
default from: "Walden Solutions <contact@walden-solutions.fr>"
|
||||||
|
|
||||||
# Subject can be set in your I18n file at config/locales/en.yml
|
# Subject can be set in your I18n file at config/locales/en.yml
|
||||||
# with the following lookup:
|
# with the following lookup:
|
||||||
|
@ -5,16 +5,8 @@ class DynamicContent < ApplicationRecord
|
|||||||
belongs_to :item
|
belongs_to :item
|
||||||
|
|
||||||
NAMES = {
|
NAMES = {
|
||||||
"militer" => "Index militer",
|
"index_usages" => "Index usages",
|
||||||
"detenus" => "Index détenus",
|
"nuage" => "Nuage de mots clés"
|
||||||
"index_label" => "Index Label",
|
|
||||||
"index_petitions" => "Index Pétitions",
|
|
||||||
"index_sponsorship" => "Index Parrainages",
|
|
||||||
"contact" => "Formulaire contact",
|
|
||||||
"contact_leg" => "Formulaire contact leg",
|
|
||||||
"contact_militer" => "Formulaire contact militer",
|
|
||||||
"plan" => "Plan du site",
|
|
||||||
"newsletter" => "Formulaire newsletter",
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
4
app/models/home_slide_lang.rb
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
class HomeSlideLang < ActiveRecord::Base
|
||||||
|
belongs_to :home_slider_slide
|
||||||
|
belongs_to :lang_site
|
||||||
|
end
|
3
app/models/home_slider.rb
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
class HomeSlider < ActiveRecord::Base
|
||||||
|
has_many :home_slider_slides
|
||||||
|
end
|
9
app/models/home_slider_slide.rb
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
class HomeSliderSlide < ActiveRecord::Base
|
||||||
|
belongs_to :home_slider
|
||||||
|
belongs_to :image_file
|
||||||
|
belongs_to :blur_image, :class_name => "ImageFile"
|
||||||
|
belongs_to :article
|
||||||
|
|
||||||
|
has_many :home_slide_langs, :dependent => :destroy
|
||||||
|
has_many :lang_sites, :through => :home_slide_langs
|
||||||
|
end
|
@ -10,18 +10,18 @@
|
|||||||
=f.input :image_file_id, :label => "Image :", :as => :qi_image_select
|
=f.input :image_file_id, :label => "Image :", :as => :qi_image_select
|
||||||
=#f.input :blur_image_id, :label => "Image floue :", :as => :qi_image_select
|
=#f.input :blur_image_id, :label => "Image floue :", :as => :qi_image_select
|
||||||
=#f.input :blur_color, :label => "Couleur de fond :"
|
=#f.input :blur_color, :label => "Couleur de fond :"
|
||||||
=f.input :titre1, :label => "Titre :"
|
=#f.input :titre1, :label => "Titre :"
|
||||||
=f.input :titre2, :label => "Sous-titre :"
|
=#f.input :titre2, :label => "Sous-titre :"
|
||||||
=f.input :article_id, :as => :select, :collection => (Hash[Article.order("id DESC").all.map{|a| [a.lang(@lang.slug).title,a.id]}]), :label => "Article associé :"
|
=#f.input :article_id, :as => :select, :collection => (Hash[Article.order("id DESC").all.map{|a| [a.lang(@lang.slug).title,a.id]}]), :label => "Article associé :"
|
||||||
=f.input :description1, :label => "Description :"
|
=#f.input :description1, :label => "Description :"
|
||||||
=f.input :cta_text, :label => "Texte CTA :"
|
=#f.input :cta_text, :label => "Texte CTA :"
|
||||||
|
|
||||||
=f.input :url, :label => "Url :"
|
=f.input :url, :label => "Url :"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
= f.input :start_at, :label => "Début :", :as => :qi_datetime_picker
|
=# f.input :start_at, :label => "Début :", :as => :qi_datetime_picker
|
||||||
= f.input :end_at, :label => "Fin :", :as => :qi_datetime_picker
|
=# f.input :end_at, :label => "Fin :", :as => :qi_datetime_picker
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -37,10 +37,9 @@
|
|||||||
<meta name="msapplication-TileColor" content="#ffffff">
|
<meta name="msapplication-TileColor" content="#ffffff">
|
||||||
<meta name="msapplication-TileImage" content="/mstile-144x144.png">
|
<meta name="msapplication-TileImage" content="/mstile-144x144.png">
|
||||||
<meta name="theme-color" content="#ffffff">
|
<meta name="theme-color" content="#ffffff">
|
||||||
<link href="https://fonts.googleapis.com/css?family=Open+Sans:800&display=swap" rel="stylesheet">
|
|
||||||
|
|
||||||
<link href="https://fonts.googleapis.com/css2?family=Pacifico&display=swap" rel="stylesheet">
|
<link href="https://fonts.googleapis.com/css2?family=Pacifico&display=swap" rel="stylesheet">
|
||||||
<link href="https://fonts.googleapis.com/css?family=Lato:400,400i,700,700i" rel="stylesheet">
|
<link href="https://fonts.googleapis.com/css?family=Lato:300,400,400i,700,700i,900" rel="stylesheet">
|
||||||
|
|
||||||
%meta{:name=>"viewport", :content=>"width=device-width,initial-scale=1"}
|
%meta{:name=>"viewport", :content=>"width=device-width,initial-scale=1"}
|
||||||
%meta{ :"http-equiv" => "Content-Type", :content => "text/html; charset=utf-8" }
|
%meta{ :"http-equiv" => "Content-Type", :content => "text/html; charset=utf-8" }
|
||||||
@ -59,15 +58,15 @@
|
|||||||
|
|
||||||
|
|
||||||
-if @facebook_img
|
-if @facebook_img
|
||||||
=raw '<meta property="og:image" content="https://pollen.olwen.xyz'+@facebook_img.to_s+'"/>'
|
=raw '<meta property="og:image" content="https://walden-solutions.fr'+@facebook_img.to_s+'"/>'
|
||||||
=raw '<link rel="image_src" href="https://pollen.olwen.xyz'+@facebook_img.to_s+'"/>'
|
=raw '<link rel="image_src" href="https://walden-solutions.fr'+@facebook_img.to_s+'"/>'
|
||||||
|
|
||||||
=raw '<meta name="twitter:card" content="summary_large_image">'
|
=raw '<meta name="twitter:card" content="summary_large_image">'
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
=raw '<meta property="twitter:image" content="https://pollen.olwen.xyz'+@facebook_img.to_s+'"/>'
|
=raw '<meta property="twitter:image" content="https://walden-solutions.fr'+@facebook_img.to_s+'"/>'
|
||||||
|
|
||||||
|
|
||||||
-begin
|
-begin
|
||||||
@ -113,43 +112,98 @@
|
|||||||
%span.remove=ic :times
|
%span.remove=ic :times
|
||||||
=flash[:alert]
|
=flash[:alert]
|
||||||
|
|
||||||
#header.with_ratio{:style => "position:relative;background-image:url('#{@img_url}');", :data => {:ratio => 0.30}}
|
#header
|
||||||
|
|
||||||
|
.top_right
|
||||||
|
|
||||||
#menu_top
|
|
||||||
%ul
|
|
||||||
%li
|
|
||||||
=ic :tel
|
=ic :tel
|
||||||
+33 (0)4 65 84 48 38
|
+33 (0)4 65 84 48 38
|
||||||
="-"
|
="-"
|
||||||
=link_to "mailto:contact@pollen-concepts.fr" do
|
=link_to "mailto:contact@walden-solutions.fr", :style => "color:#DBC089;" do
|
||||||
=ic :mail
|
=ic :mail
|
||||||
contact@pollen-concepts.fr
|
contact@walden-solutions.fr
|
||||||
|
|
||||||
|
#menu_top
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
%ul
|
||||||
-MenuItem.where(:parent_id => nil, :menu_id => 1).order(:position).each do |menu_item|
|
-MenuItem.where(:parent_id => nil, :menu_id => 1).order(:position).each do |menu_item|
|
||||||
-if menu_item_link(menu_item) and menu_item_link(menu_item) != ""
|
-if menu_item_link(menu_item) and menu_item_link(menu_item) != ""
|
||||||
%li
|
%li
|
||||||
=menu_item_link(menu_item)
|
=menu_item_link(menu_item)
|
||||||
|
|
||||||
|
%li
|
||||||
|
=link_to "Contact", "#contact"
|
||||||
|
|
||||||
=link_to "/" do
|
=link_to "/" do
|
||||||
=image_tag "/logo-pollen-w.png", :id => "logo"
|
=image_tag "/logo-walden.png", :id => "logo"
|
||||||
|
|
||||||
.clear
|
.clear
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
-if @menu_item and @menu_item.id != 3
|
||||||
|
#header_image.header_image.with_ratio{:style => "position:relative;background-color:black;background-image:url('#{@img_url}');", :id => (@menu_item.id if @menu_item), :data => {:ratio => 0.35}}
|
||||||
%div{:style => "position:absolute;top:0;right:0;left:0;bottom:0;"}
|
%div{:style => "position:absolute;top:0;right:0;left:0;bottom:0;"}
|
||||||
%h1.vertical_center=@title
|
%h1=@title
|
||||||
|
|
||||||
|
:scss
|
||||||
|
.header_image{
|
||||||
|
h1{
|
||||||
|
color:white;
|
||||||
|
position:absolute;
|
||||||
|
bottom:25px;
|
||||||
|
left:30px;
|
||||||
|
font-size:35px;
|
||||||
|
max-width:500px;
|
||||||
|
font-weight:300;
|
||||||
|
padding:15px 20px;
|
||||||
|
background:rgba(#DBC089,0.9);
|
||||||
|
padding-top:8px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
-else
|
||||||
|
.qi_slider
|
||||||
|
|
||||||
|
-@home_slider = HomeSlider.find_by_slug("home")
|
||||||
|
-@date = Time.now
|
||||||
|
-if @home_slider
|
||||||
|
-@home_slides_simu = @home_slider.home_slider_slides.where(:enabled => true)
|
||||||
|
-@home_slides_simu = @home_slides_simu.where("start_at IS NULL or start_at <= ?",@date)
|
||||||
|
-@home_slides_simu = @home_slides_simu.where("end_at IS NULL or end_at >= ?",@date)
|
||||||
|
-@home_slides_simu = @home_slides_simu.order(:position)
|
||||||
|
-@home_slides_simu = @home_slides_simu.joins(:lang_sites).where("lang_sites.id = ?", @lang.id)
|
||||||
|
-@home_slides_simu.each do |home_slider_slide|
|
||||||
|
-if home_slider_slide.image_file
|
||||||
|
|
||||||
|
%div.with_ratio.qi_slide{:style => "background-image:url('#{home_slider_slide.image_file.file.url}');background-size:100%;background-size:cover;", :data => {:ratio => 0.45}}
|
||||||
|
|
||||||
|
:javascript
|
||||||
|
$('.qi_slider').slick({
|
||||||
|
|
||||||
|
autoplay: true,
|
||||||
|
autoplaySpeed: 2000,
|
||||||
|
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#main=yield
|
#main=yield
|
||||||
|
#contact
|
||||||
|
|
||||||
#footer
|
#footer
|
||||||
|
|
||||||
.center
|
.center
|
||||||
%h2
|
%h2{:style => "color:black;"}
|
||||||
Contact
|
Contact
|
||||||
%p
|
%p
|
||||||
Envie d’échanger autour de beaux projets ? N’hésitez pas à nous contacter.
|
Envie d’échanger autour de beaux projets ? N’hésitez pas à nous contacter.
|
||||||
|
@ -32,7 +32,7 @@
|
|||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
init_form_change();
|
//init_form_change();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -34,4 +34,4 @@
|
|||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
init_form_change();
|
//init_form_change();
|
@ -1,4 +0,0 @@
|
|||||||
-@contact = @contact || Contact.new(:raison_id => 1, :survey_set_id => params[:id])
|
|
||||||
|
|
||||||
.contact_form.contact_militer#form
|
|
||||||
=render :partial => "public/contacts/form"
|
|
@ -1,4 +0,0 @@
|
|||||||
-@contact = @contact || Contact.new(:raison_id => 2, :survey_set_id => params[:id])
|
|
||||||
|
|
||||||
.contact_form.contact_militer#form
|
|
||||||
=render :partial => "public/contacts/form"
|
|
@ -1,4 +0,0 @@
|
|||||||
-@contact = @contact || Contact.new(:raison_id => 4, :survey_set_id => params[:id])
|
|
||||||
|
|
||||||
.contact_form.contact_militer#form
|
|
||||||
=render :partial => "public/contacts/form"
|
|
@ -1,39 +0,0 @@
|
|||||||
.detenus_container
|
|
||||||
.detenus
|
|
||||||
-DetenuGroup.order("name").each do |detenu_group|
|
|
||||||
.detenu_group
|
|
||||||
%h4=detenu_group.name
|
|
||||||
|
|
||||||
-if detenu_group.detenus.count > 0
|
|
||||||
-detenu_group.detenus.order("name").each do |detenu|
|
|
||||||
.detenu
|
|
||||||
=detenu.name
|
|
||||||
-if detenu.sexe == 1
|
|
||||||
=ic :mars
|
|
||||||
|
|
||||||
-if detenu.sexe == 2
|
|
||||||
=ic :venus
|
|
||||||
|
|
||||||
-if detenu.link?
|
|
||||||
=link_to "(+ d'infos)", detenu.link, :target => "_blank", :style => "font-size:0.85em"
|
|
||||||
|
|
||||||
.desc
|
|
||||||
-if detenu.age_text?
|
|
||||||
=detenu.age_text
|
|
||||||
-if detenu.age_text? and detenu.free_text?
|
|
||||||
= "-"
|
|
||||||
-if detenu.free_text?
|
|
||||||
%span.free_text
|
|
||||||
=ic :"chain-broken"
|
|
||||||
=detenu.free_text
|
|
||||||
|
|
||||||
-if detenu.provisoire
|
|
||||||
%span.ident
|
|
||||||
|
|
||||||
en cours d'identification
|
|
||||||
|
|
||||||
|
|
||||||
-else
|
|
||||||
.none
|
|
||||||
Enquête en cours
|
|
||||||
|
|
@ -1,105 +0,0 @@
|
|||||||
-if @admin
|
|
||||||
.dynamic
|
|
||||||
Label
|
|
||||||
|
|
||||||
|
|
||||||
.index_label
|
|
||||||
%h3 Découvrez les marques 100% labélisées
|
|
||||||
|
|
||||||
-NewLabelEntreprise.order("name").all.each do |new_label_entreprise|
|
|
||||||
=link_to new_label_entreprise.website, :target => "_blank" do
|
|
||||||
.label_marque_img
|
|
||||||
.inner_logo{:style => "background-image:url('#{new_label_entreprise.image_file.file.large.medium.url if new_label_entreprise.image_file}');"}
|
|
||||||
-if !new_label_entreprise.image_file
|
|
||||||
.inner_title
|
|
||||||
=new_label_entreprise.name
|
|
||||||
|
|
||||||
%h3 Découvrez les produits labellisés des marques suivantes
|
|
||||||
|
|
||||||
-LabelMarque.order("name").all.each do |label_marque|
|
|
||||||
=link_to "/public/label_produits?search=true&q=&label_marque_id=#{label_marque.id}", :target => "_blank" do
|
|
||||||
.label_marque_img
|
|
||||||
.inner_logo{:style => "background-image:url('#{label_marque.image_file.file.large.medium.url if label_marque.image_file}');"}
|
|
||||||
-if !label_marque.image_file
|
|
||||||
.inner_title
|
|
||||||
=label_marque.name
|
|
||||||
|
|
||||||
:scss
|
|
||||||
.index_label{
|
|
||||||
text-align:center;
|
|
||||||
h3{
|
|
||||||
text-align:center;
|
|
||||||
margin-top:30px;
|
|
||||||
margin-bottom:20px;
|
|
||||||
}
|
|
||||||
.label_marque_img{
|
|
||||||
|
|
||||||
height:140px;
|
|
||||||
width:140px;
|
|
||||||
margin:2px;
|
|
||||||
padding:5px;
|
|
||||||
|
|
||||||
display:inline-block;
|
|
||||||
|
|
||||||
position:relative;
|
|
||||||
border:1px solid rgba(0,0,0,0.1);
|
|
||||||
.inner_logo{
|
|
||||||
position:absolute;
|
|
||||||
left:12px;
|
|
||||||
right:12px;
|
|
||||||
top:12px;
|
|
||||||
bottom:12px;
|
|
||||||
background:center center no-repeat;
|
|
||||||
background-size:100%;
|
|
||||||
background-size:contain;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
.inner_title{
|
|
||||||
position:absolute;
|
|
||||||
left:0;
|
|
||||||
right:0;
|
|
||||||
top:60px;
|
|
||||||
text-align:center;
|
|
||||||
color:black;
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
.bottom_subpages
|
|
||||||
-@menu_item.children.order(:position).each do |menu_item|
|
|
||||||
|
|
||||||
-menu_item_lang = menu_item.menu_item_langs.find_by_lang_site_id(@lang.id)
|
|
||||||
|
|
||||||
|
|
||||||
-name = menu_item_lang.name
|
|
||||||
-if menu_item_lang.enabled == true and menu_item_lang.visible == true
|
|
||||||
-if menu_item.image_file
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
-img_url = menu_item.image_file.file.large.medium.url
|
|
||||||
|
|
||||||
-if menu_item.image_file and menu_item.image_file.photograph
|
|
||||||
-@page_images_credits << menu_item.image_file.photograph
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
-css_style = "background-image:url('#{img_url}');background-size:100%;background-size:cover;background-position:center center;display:block;min-height:50px;"
|
|
||||||
|
|
||||||
|
|
||||||
.subpage_link
|
|
||||||
=link_to @one_voice_host.to_s+menu_item_path(:url => menu_item_lang.url, :lang => @lang.slug) , :class => "with_ratio" do
|
|
||||||
.with_ratio{:style => css_style, :data => {:ratio => 0.62}}
|
|
||||||
|
|
||||||
|
|
||||||
.overlay
|
|
||||||
|
|
||||||
|
|
||||||
%h4.title
|
|
||||||
=menu_item.menu_item_langs.find_by_lang_site_id(@lang.id).name
|
|
@ -1,10 +0,0 @@
|
|||||||
|
|
||||||
-@petitions = Petition.joins(:petition_langs).where(:petition_langs => {:lang_site_id => @lang.id, :enabled => true}).order("position ASC")
|
|
||||||
|
|
||||||
.petitions_index
|
|
||||||
.petition_first_page
|
|
||||||
=render :collection => @petitions[0..8], :partial => "public/petitions/petition"
|
|
||||||
.cta{:style => "text-align:center;margin:20px 0;"}
|
|
||||||
=link_to qit("Voir plus de pétitions >"), "#", :onclick => "$(this).closest('.petitions_index').find('.petition_more').show();$(this).closest('.cta').hide();return false;", :class => "btn"
|
|
||||||
.petition_more{:style => "display:none;"}
|
|
||||||
=render :collection => @petitions[9..@petitions.size], :partial => "public/petitions/petition"
|
|
@ -1,6 +0,0 @@
|
|||||||
|
|
||||||
-@sponsorship_animals = SponsorshipAnimal.where(:enabled => true).order(:position).all
|
|
||||||
|
|
||||||
|
|
||||||
.sponsorship_index
|
|
||||||
=render :collection => @sponsorship_animals, :partial => "public/sponsorship_animals/sponsorship_animal"
|
|
68
app/views/portlets/dynamic_contents/_index_usages.html.haml
Normal file
@ -0,0 +1,68 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
.index_usages
|
||||||
|
=link_to "/fr/les-usages.html" do
|
||||||
|
.usage_item
|
||||||
|
=image_tag("/public_medias/image_file/file/39/large_b816293e.png")
|
||||||
|
%h3 Brezol
|
||||||
|
%p Grand âge et PMR
|
||||||
|
|
||||||
|
.usage_item
|
||||||
|
=image_tag("/public_medias/image_file/file/41/large_64176061.png")
|
||||||
|
%h3 Gardel
|
||||||
|
%p Bureaux et extensions
|
||||||
|
|
||||||
|
.usage_item
|
||||||
|
=image_tag("/public_medias/image_file/file/42/large_430666c9.png")
|
||||||
|
%h3 Rafaz
|
||||||
|
%p Logements de saisonniers et logements d'urgence
|
||||||
|
|
||||||
|
.usage_item
|
||||||
|
=image_tag("/public_medias/image_file/file/40/large_c45f369d.png")
|
||||||
|
%h3 Kidel
|
||||||
|
%p Crèches et bâtiments scolaires
|
||||||
|
|
||||||
|
.usage_item
|
||||||
|
=image_tag("/public_medias/image_file/file/43/large_ada9e516.png")
|
||||||
|
%h3 Blodge
|
||||||
|
%p Lodge, maison secondaire
|
||||||
|
|
||||||
|
|
||||||
|
:scss
|
||||||
|
.index_usages{
|
||||||
|
vertical-align:top;
|
||||||
|
padding:20px 0;
|
||||||
|
max-width:1100px;
|
||||||
|
margin:auto;
|
||||||
|
.usage_item{
|
||||||
|
display:inline-block;
|
||||||
|
vertical-align:top;
|
||||||
|
padding:10px 5px;
|
||||||
|
text-align:center;
|
||||||
|
p{
|
||||||
|
color:black;
|
||||||
|
height:3em;
|
||||||
|
}
|
||||||
|
|
||||||
|
img{
|
||||||
|
height:170px;
|
||||||
|
}
|
||||||
|
h3{
|
||||||
|
color:black;
|
||||||
|
font-size:22px;
|
||||||
|
font-weight:700;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
width:19%;
|
||||||
|
|
||||||
|
box-sizing:border-box;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1,71 +0,0 @@
|
|||||||
|
|
||||||
-begin
|
|
||||||
-params[:cat] = params[:cat] || 3
|
|
||||||
-@militer_cat = MiliterCat.find(params[:cat])
|
|
||||||
|
|
||||||
%a{:id => "documents"}
|
|
||||||
.militer_index
|
|
||||||
.main_container
|
|
||||||
%h3 Documents
|
|
||||||
|
|
||||||
-MiliterCat.where(:parent_id => nil).order("position").all.each do |militer_cat|
|
|
||||||
-if I18n.locale == :fr
|
|
||||||
-name =militer_cat.name
|
|
||||||
-else
|
|
||||||
-name = militer_cat.english_name
|
|
||||||
|
|
||||||
=link_to raw(name), "?cat=#{militer_cat.id}#documents", :class => ("active" if @militer_cat and militer_cat.id == @militer_cat.id), :data => {:id => militer_cat.id}
|
|
||||||
|
|
||||||
.militer
|
|
||||||
|
|
||||||
|
|
||||||
-ig = 0
|
|
||||||
-@militer_cat.children.order("position").each do |militer_cat|
|
|
||||||
-ig += 1
|
|
||||||
|
|
||||||
%h3
|
|
||||||
.right
|
|
||||||
%span.plus{:style => ("display:none;" if ig == 1)} +
|
|
||||||
%span.moins{:style => ("display:block;" if ig == 1)}= "-"
|
|
||||||
=militer_cat.name
|
|
||||||
.militer_content{:style => ("display:block;" if ig == 1)}
|
|
||||||
-i = 0
|
|
||||||
.row
|
|
||||||
-militer_cat.data_files.where(:lang_site_id => @lang.id).order("militer_position DESC, created_at DESC").each do |data_file|
|
|
||||||
-i += 1
|
|
||||||
|
|
||||||
=render data_file
|
|
||||||
|
|
||||||
-if i== 2
|
|
||||||
-i = 0
|
|
||||||
=raw "</div><div class='clear'></div><div class='row'>"
|
|
||||||
.clear
|
|
||||||
|
|
||||||
.clear
|
|
||||||
|
|
||||||
-i = 0
|
|
||||||
.row
|
|
||||||
-@militer_cat.data_files.where(:lang_site_id => @lang.id).order("militer_position DESC, created_at DESC").each do |data_file|
|
|
||||||
-i += 1
|
|
||||||
|
|
||||||
=render data_file
|
|
||||||
|
|
||||||
-if i== 2
|
|
||||||
-i = 0
|
|
||||||
=raw "</div><div class='clear'></div><div class='row'>"
|
|
||||||
.clear
|
|
||||||
|
|
||||||
|
|
||||||
%br
|
|
||||||
%br
|
|
||||||
%br
|
|
||||||
|
|
||||||
:coffeescript
|
|
||||||
$(".militer h3").click ->
|
|
||||||
$(this).next(".militer_content").toggle()
|
|
||||||
$(this).find(".plus").toggle()
|
|
||||||
$(this).find(".moins").toggle()
|
|
||||||
|
|
||||||
-rescue
|
|
||||||
=""
|
|
||||||
|
|
@ -1,12 +0,0 @@
|
|||||||
-if @admin
|
|
||||||
plan du site
|
|
||||||
-else
|
|
||||||
#newsletter_form
|
|
||||||
-@registrant = @registrant || Registrant.new
|
|
||||||
=semantic_form_for [:public, @registrant], :remote => true do |f|
|
|
||||||
=hidden_field_tag :popup, true
|
|
||||||
%table{:style => "width:100%;max-width:450px;margin:20px auto;"}
|
|
||||||
%tr
|
|
||||||
%td.email=f.input :email, :placeholder => qit("newsletter-home_place_holder-3","Mon email"), :label => false
|
|
||||||
%td{:style => "width:120px;vertical-align:top"}
|
|
||||||
=link_to qit("newsletter-submit-3","S'abonner >"), "#", :class => "btn orange", :onclick => "$(this).closest('form').submit();return false;"
|
|
146
app/views/portlets/dynamic_contents/_nuage.html.haml
Normal file
@ -0,0 +1,146 @@
|
|||||||
|
=#-if @admin
|
||||||
|
|
||||||
|
|
||||||
|
=link_to "/fr/les-usages.html" do
|
||||||
|
<div id="cloud"></div>
|
||||||
|
|
||||||
|
|
||||||
|
-words = []
|
||||||
|
-words << ["Des m2 supplémentaires, tout simplement.", 80, "/fr/les-usages.html"]
|
||||||
|
-words << ["Crèche", 15, "/fr/les-usages.html"]
|
||||||
|
-words << ["Rentabiliser du foncier", 25, "/fr/les-usages.html"]
|
||||||
|
-words << ["Inovation", 25, "/fr/les-usages.html"]
|
||||||
|
-words << ["Créer un atelier", 30, "/fr/les-usages.html"]
|
||||||
|
-words << ["Location", 30, "/fr/les-usages.html"]
|
||||||
|
-words << ["Bois", 40, "/fr/les-usages.html"]
|
||||||
|
-words << ["Logement adapté", 10, "/fr/les-usages.html"]
|
||||||
|
-words << ["Biosourcé", 20, "/fr/les-usages.html"]
|
||||||
|
-words << ["Hors-sol", 20, "/fr/les-usages.html"]
|
||||||
|
-words << ["Logement d'urgence", 25, "/fr/les-usages.html"]
|
||||||
|
-words << ["accueillir un parent", 30, "/fr/les-usages.html"]
|
||||||
|
-words << ["Construction hors-site", 25, "/fr/les-usages.html"]
|
||||||
|
-words << ["Lodge", 60, "/fr/les-usages.html"]
|
||||||
|
-words << ["Vestiaire", 25, "/fr/les-usages.html"]
|
||||||
|
-words << ["Tourisme", 60, "/fr/les-usages.html"]
|
||||||
|
-words << ["Confort", 30, "/fr/les-usages.html"]
|
||||||
|
-words << ["Bureau", 30, "/fr/les-usages.html"]
|
||||||
|
-words << ["Surrélever un immeuble", 15, "/fr/les-usages.html"]
|
||||||
|
-words << ["Bureau", 20, "/fr/les-usages.html"]
|
||||||
|
-words << ["Confort thermique", 20, "/fr/les-usages.html"]
|
||||||
|
-words << ["Réversible", 25, "/fr/les-usages.html"]
|
||||||
|
-words << ["Village Urbain", 38, "/fr/les-usages.html"]
|
||||||
|
-words << ["Logement pour saisonniers", 15, "/fr/les-usages.html"]
|
||||||
|
-words << ["Espace de télétravail", 15, "/fr/les-usages.html"]
|
||||||
|
-words << ["Flexibilité", 25, "/fr/les-usages.html"]
|
||||||
|
-words << ["Qualité", 50, "/fr/les-usages.html"]
|
||||||
|
-words << ["école", 45, "/fr/les-usages.html"]
|
||||||
|
-words << ["Recyclé", 30, "/fr/les-usages.html"]
|
||||||
|
-words << ["Rapidité", 80, "/fr/les-usages.html"]
|
||||||
|
-words << ["Design", 50, "/fr/les-usages.html"]
|
||||||
|
-words << ["Eco", 70, "/fr/les-usages.html"]
|
||||||
|
|
||||||
|
-words << ["Réversible", 40, "/fr/les-usages.html"]
|
||||||
|
-words << ["Economie circulaire", 25, "/fr/les-usages.html"]
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
-words_to_show = ""
|
||||||
|
-words.each do |w|
|
||||||
|
-words_to_show += raw("{ text: \"#{escape_javascript(w[0]).upcase}\", url: \"#{escape_javascript(w[2])}\", size: #{w[1]}},")
|
||||||
|
:scss
|
||||||
|
#cloud svg{
|
||||||
|
display:block;
|
||||||
|
margin: 15px auto;
|
||||||
|
max-width:900px;
|
||||||
|
width:100%;
|
||||||
|
}
|
||||||
|
:javascript
|
||||||
|
// First define your cloud data, using `text` and `size` properties:
|
||||||
|
var skillsToDraw = [
|
||||||
|
#{raw(words_to_show)}
|
||||||
|
|
||||||
|
];
|
||||||
|
|
||||||
|
function getRandomInt(max) {
|
||||||
|
return Math.floor(Math.random() * Math.floor(max));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Next you need to use the layout script to calculate the placement, rotation and size of each word:
|
||||||
|
var colors = ["#306667", "#1b415d", "#2f6566", "#DBC089", "#6aa1a0"]
|
||||||
|
var width = 1200;
|
||||||
|
var height = 500;
|
||||||
|
var fill = d3.scale.category20();
|
||||||
|
|
||||||
|
d3.layout.cloud()
|
||||||
|
.size([width, height])
|
||||||
|
.words(skillsToDraw)
|
||||||
|
.rotate(function() {
|
||||||
|
return ~~(Math.random() * 2) * 90;
|
||||||
|
}) //function() { return (~~(Math.random() * 6) - 3) * 30; }
|
||||||
|
.font("Lato")
|
||||||
|
.fontWeight("900")
|
||||||
|
.fontSize(function(d) {
|
||||||
|
return d.size;
|
||||||
|
})
|
||||||
|
.on("end", drawSkillCloud)
|
||||||
|
.start();
|
||||||
|
|
||||||
|
// Finally implement `drawSkillCloud`, which performs the D3 drawing:
|
||||||
|
|
||||||
|
// apply D3.js drawing API
|
||||||
|
function drawSkillCloud(words) {
|
||||||
|
d3.select("#cloud").append("svg")
|
||||||
|
.attr("width", width)
|
||||||
|
.attr("height", height)
|
||||||
|
.append("g")
|
||||||
|
.attr("transform", "translate(" + ~~(width / 2) + "," + ~~(height / 2) + ")")
|
||||||
|
.selectAll("text")
|
||||||
|
.data(words)
|
||||||
|
.enter().append("text")
|
||||||
|
.style("font-size", function(d) {
|
||||||
|
return d.size + "px";
|
||||||
|
})
|
||||||
|
.style("-webkit-touch-callout", "none")
|
||||||
|
.style("-webkit-user-select", "none")
|
||||||
|
.style("-khtml-user-select", "none")
|
||||||
|
.style("-moz-user-select", "none")
|
||||||
|
.style("-ms-user-select", "none")
|
||||||
|
.style("user-select", "none")
|
||||||
|
.style("cursor", "default")
|
||||||
|
.style("font-family", "Lato")
|
||||||
|
.style("font-weight", "900")
|
||||||
|
.style("fill", function(d, i) {
|
||||||
|
|
||||||
|
color_index = getRandomInt(colors.length);
|
||||||
|
|
||||||
|
|
||||||
|
return colors[parseInt(color_index)];
|
||||||
|
//return d.color;
|
||||||
|
})
|
||||||
|
.attr("text-anchor", "middle")
|
||||||
|
.attr("transform", function(d) {
|
||||||
|
return "translate(" + [d.x, d.y] + ")rotate(" + d.rotate + ")";
|
||||||
|
})
|
||||||
|
.text(function(d) {
|
||||||
|
return d.text;
|
||||||
|
})
|
||||||
|
.on("click", function (d, i){
|
||||||
|
window.open(d.url, "_blank");
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// set the viewbox to content bounding box (zooming in on the content, effectively trimming whitespace)
|
||||||
|
|
||||||
|
var svg = document.getElementsByTagName("svg")[0];
|
||||||
|
var bbox = svg.getBBox();
|
||||||
|
var viewBox = [bbox.x, bbox.y, bbox.width, bbox.height].join(" ");
|
||||||
|
svg.setAttribute("viewBox", viewBox);
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1,66 +0,0 @@
|
|||||||
-if @admin
|
|
||||||
plan du site
|
|
||||||
-else
|
|
||||||
=raw "</div>"
|
|
||||||
.plan_sub
|
|
||||||
.inner
|
|
||||||
=link_to qit("Médiathèque"), search_path(:media => true)
|
|
||||||
=link_to qit("Presse"), search_path(:press => true)
|
|
||||||
=link_to qit("Documentation"), search_path(:doc => true)
|
|
||||||
=link_to qit("Boutique"), "/fr/boutique.html"
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
=raw "<div class='main row-fluid'>"
|
|
||||||
|
|
||||||
.plan_body
|
|
||||||
|
|
||||||
|
|
||||||
-MenuItem.where(:parent_id => nil, :menu_id => 2).order(:position).each do |menu_item|
|
|
||||||
-description = ""
|
|
||||||
-description = menu_item.menu_content.description if menu_item.menu_content and menu_item.menu_content_type == "Page"
|
|
||||||
-if menu_item_link(menu_item) and menu_item_link(menu_item) != ""
|
|
||||||
|
|
||||||
%h3
|
|
||||||
=menu_item_link(menu_item)
|
|
||||||
|
|
||||||
-MenuItem.where(:id => menu_item.id).each do |menu_item|
|
|
||||||
.plan_sub_menu{:class => "plan_sub_"+menu_item.id.to_s }
|
|
||||||
|
|
||||||
|
|
||||||
.inner
|
|
||||||
|
|
||||||
|
|
||||||
%ul
|
|
||||||
-MenuItem.where(:parent_id => menu_item.id).order(:position).each do |menu_item|
|
|
||||||
|
|
||||||
-menu_item_lang = menu_item.menu_item_langs.find_by_lang_site_id(@lang.id)
|
|
||||||
|
|
||||||
|
|
||||||
-name = menu_item_lang.name
|
|
||||||
-if menu_item_lang.enabled == true and menu_item_lang.visible == true #and menu_item.menu_content.page_type_id == 4
|
|
||||||
|
|
||||||
%li
|
|
||||||
=link_to @one_voice_host.to_s+menu_item_path(:url => menu_item_lang.url, :lang => @lang.slug) , :class => "chapitre_link "+("active" if @menu_item and menu_item.id == @menu_item.id).to_s do
|
|
||||||
=menu_item.menu_item_langs.find_by_lang_site_id(@lang.id).name
|
|
||||||
=">"
|
|
||||||
|
|
||||||
|
|
||||||
%ul
|
|
||||||
-MenuItem.where(:parent_id => menu_item.id).order(:position).each do |menu_item|
|
|
||||||
|
|
||||||
-menu_item_lang = menu_item.menu_item_langs.find_by_lang_site_id(@lang.id)
|
|
||||||
|
|
||||||
|
|
||||||
-name = menu_item_lang.name
|
|
||||||
-if menu_item_lang.enabled == true and menu_item_lang.visible == true and menu_item.menu_content.page_type_id == 2
|
|
||||||
|
|
||||||
%li
|
|
||||||
=link_to @one_voice_host.to_s+menu_item_path(:url => menu_item_lang.url, :lang => @lang.slug) , :class => "chapitre_link "+("active" if @menu_item and menu_item.id == @menu_item.id).to_s do
|
|
||||||
=menu_item.menu_item_langs.find_by_lang_site_id(@lang.id).name
|
|
||||||
=">"
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
%h3=link_to "blog", articles_path(:lang => @lang.slug)
|
|
@ -1,13 +0,0 @@
|
|||||||
-if @admin
|
|
||||||
.dynamic
|
|
||||||
Sous menu avec images
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
-if input.portlet.blockable_parent and input.portlet.blockable_parent.class.to_s == "Page" and input.portlet.blockable_parent.menu_item
|
|
||||||
.sub_menu
|
|
||||||
-input.portlet.blockable_parent.menu_item.children.where(:enabled => true, :visible => true).each do |menu_item|
|
|
||||||
=link_to menu_item_path(:url => menu_item.url) do
|
|
||||||
.sub_menu_item{:style => "background-image:url('#{menu_item.image_file.file.large.medium.small.url}')"}
|
|
||||||
%h3=menu_item.name
|
|
||||||
.clear
|
|
@ -2,5 +2,5 @@
|
|||||||
|
|
||||||
|
|
||||||
%p Merci pour votre message, nous mettons tout en œuvre pour vous répondre dans les meilleurs délais.
|
%p Merci pour votre message, nous mettons tout en œuvre pour vous répondre dans les meilleurs délais.
|
||||||
%p L’équipe de Pollen Concepts
|
%p L’équipe de Walden Solutions
|
||||||
|
|
||||||
|
@ -10,7 +10,7 @@ upstream pollen_app_unicorn {
|
|||||||
|
|
||||||
server {
|
server {
|
||||||
listen [::]:443 ssl;
|
listen [::]:443 ssl;
|
||||||
server_name pollen-concepts.fr pollen.olwen.xyz;
|
server_name walden-solutions.fr pollen.olwen.xyz;
|
||||||
root /srv/www/web/pollen_app/current/public;
|
root /srv/www/web/pollen_app/current/public;
|
||||||
try_files $uri/index.html $uri @unicorn;
|
try_files $uri/index.html $uri @unicorn;
|
||||||
|
|
||||||
@ -45,10 +45,21 @@ server {
|
|||||||
|
|
||||||
|
|
||||||
server {
|
server {
|
||||||
listen [::]:80;
|
listen [::]:443 ssl;
|
||||||
server_name pollen.olwen.xyz pollen-concepts.fr www.pollen-concepts.fr;
|
server_name www.walden-solutions.fr pollen-concepts.fr *.pollen-concepts.fr;
|
||||||
|
|
||||||
return 301 https://pollen-concepts.fr$request_uri;
|
return 301 https://walden-solutions.fr$request_uri;
|
||||||
|
|
||||||
|
include snippets/letsencrypt.conf;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
server {
|
||||||
|
listen [::]:80;
|
||||||
|
server_name pollen.olwen.xyz walden-solutions.fr www.walden-solutions.fr pollen-concepts.fr *.pollen-concepts.fr;
|
||||||
|
|
||||||
|
return 301 https://walden-solutions.fr$request_uri;
|
||||||
|
|
||||||
include snippets/letsencrypt.conf;
|
include snippets/letsencrypt.conf;
|
||||||
}
|
}
|
||||||
|
13
db/migrate/20160119224035_create_home_sliders.rb
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
class CreateHomeSliders < ActiveRecord::Migration[6.0]
|
||||||
|
def change
|
||||||
|
create_table :home_sliders do |t|
|
||||||
|
t.string :name
|
||||||
|
t.string :slug
|
||||||
|
|
||||||
|
t.timestamps null: false
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
HomeSlider.create(:name => "home", :slug => "home")
|
||||||
|
end
|
||||||
|
end
|
15
db/migrate/20160119224315_create_home_slider_slides.rb
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
class CreateHomeSliderSlides < ActiveRecord::Migration[6.0]
|
||||||
|
def change
|
||||||
|
create_table :home_slider_slides do |t|
|
||||||
|
t.references :home_slider, index: true
|
||||||
|
t.integer :position
|
||||||
|
t.datetime :start_at
|
||||||
|
t.datetime :end_at
|
||||||
|
t.references :image_file
|
||||||
|
t.boolean :enabled
|
||||||
|
|
||||||
|
t.timestamps null: false
|
||||||
|
end
|
||||||
|
add_foreign_key :home_slider_slides, :home_sliders
|
||||||
|
end
|
||||||
|
end
|
@ -0,0 +1,5 @@
|
|||||||
|
class AddUrlToHomeSliderSlides < ActiveRecord::Migration[6.0]
|
||||||
|
def change
|
||||||
|
add_column :home_slider_slides, :url, :string
|
||||||
|
end
|
||||||
|
end
|
11
db/migrate/20160407175359_create_home_slide_langs.rb
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
class CreateHomeSlideLangs < ActiveRecord::Migration[6.0]
|
||||||
|
def change
|
||||||
|
create_table :home_slide_langs do |t|
|
||||||
|
t.references :home_slider_slide, index: true
|
||||||
|
t.references :lang_site, index: true
|
||||||
|
|
||||||
|
t.timestamps null: false
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
end
|
10
db/migrate/20180127214325_add_infos_to_home_slider_slide.rb
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
class AddInfosToHomeSliderSlide < ActiveRecord::Migration[6.0]
|
||||||
|
def change
|
||||||
|
add_column :home_slider_slides, :titre1, :string
|
||||||
|
add_column :home_slider_slides, :titre2, :string
|
||||||
|
add_column :home_slider_slides, :description1, :text
|
||||||
|
add_column :home_slider_slides, :description2, :text
|
||||||
|
add_column :home_slider_slides, :popup, :boolean
|
||||||
|
add_column :home_slider_slides, :cta_text, :string
|
||||||
|
end
|
||||||
|
end
|
37
db/schema.rb
@ -470,6 +470,42 @@ ActiveRecord::Schema.define(version: 2020_04_16_212613) do
|
|||||||
t.datetime "updated_at", precision: 6, null: false
|
t.datetime "updated_at", precision: 6, null: false
|
||||||
end
|
end
|
||||||
|
|
||||||
|
create_table "home_slide_langs", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4", force: :cascade do |t|
|
||||||
|
t.bigint "home_slider_slide_id"
|
||||||
|
t.bigint "lang_site_id"
|
||||||
|
t.datetime "created_at", precision: 6, null: false
|
||||||
|
t.datetime "updated_at", precision: 6, null: false
|
||||||
|
t.index ["home_slider_slide_id"], name: "index_home_slide_langs_on_home_slider_slide_id"
|
||||||
|
t.index ["lang_site_id"], name: "index_home_slide_langs_on_lang_site_id"
|
||||||
|
end
|
||||||
|
|
||||||
|
create_table "home_slider_slides", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4", force: :cascade do |t|
|
||||||
|
t.bigint "home_slider_id"
|
||||||
|
t.integer "position"
|
||||||
|
t.datetime "start_at"
|
||||||
|
t.datetime "end_at"
|
||||||
|
t.bigint "image_file_id"
|
||||||
|
t.boolean "enabled"
|
||||||
|
t.datetime "created_at", precision: 6, null: false
|
||||||
|
t.datetime "updated_at", precision: 6, null: false
|
||||||
|
t.string "url"
|
||||||
|
t.string "titre1"
|
||||||
|
t.string "titre2"
|
||||||
|
t.text "description1"
|
||||||
|
t.text "description2"
|
||||||
|
t.boolean "popup"
|
||||||
|
t.string "cta_text"
|
||||||
|
t.index ["home_slider_id"], name: "index_home_slider_slides_on_home_slider_id"
|
||||||
|
t.index ["image_file_id"], name: "index_home_slider_slides_on_image_file_id"
|
||||||
|
end
|
||||||
|
|
||||||
|
create_table "home_sliders", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4", force: :cascade do |t|
|
||||||
|
t.string "name"
|
||||||
|
t.string "slug"
|
||||||
|
t.datetime "created_at", precision: 6, null: false
|
||||||
|
t.datetime "updated_at", precision: 6, null: false
|
||||||
|
end
|
||||||
|
|
||||||
create_table "html_contents", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4", force: :cascade do |t|
|
create_table "html_contents", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4", force: :cascade do |t|
|
||||||
t.text "content"
|
t.text "content"
|
||||||
t.string "style"
|
t.string "style"
|
||||||
@ -2729,6 +2765,7 @@ ActiveRecord::Schema.define(version: 2020_04_16_212613) do
|
|||||||
add_foreign_key "file_tunel_sends", "file_tunels"
|
add_foreign_key "file_tunel_sends", "file_tunels"
|
||||||
add_foreign_key "file_tunels", "admins"
|
add_foreign_key "file_tunels", "admins"
|
||||||
add_foreign_key "file_tunels", "p_customers"
|
add_foreign_key "file_tunels", "p_customers"
|
||||||
|
add_foreign_key "home_slider_slides", "home_sliders"
|
||||||
add_foreign_key "i_task_projects", "admins"
|
add_foreign_key "i_task_projects", "admins"
|
||||||
add_foreign_key "i_tasks", "admins"
|
add_foreign_key "i_tasks", "admins"
|
||||||
add_foreign_key "i_tasks", "i_task_projects"
|
add_foreign_key "i_tasks", "i_task_projects"
|
||||||
|
BIN
public/fonts/slick/slick.eot
Normal file
14
public/fonts/slick/slick.svg
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
<?xml version="1.0" standalone="no"?>
|
||||||
|
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<metadata>Generated by Fontastic.me</metadata>
|
||||||
|
<defs>
|
||||||
|
<font id="slick" horiz-adv-x="512">
|
||||||
|
<font-face font-family="slick" units-per-em="512" ascent="480" descent="-32"/>
|
||||||
|
<missing-glyph horiz-adv-x="512" />
|
||||||
|
|
||||||
|
<glyph unicode="→" d="M241 113l130 130c4 4 6 8 6 13 0 5-2 9-6 13l-130 130c-3 3-7 5-12 5-5 0-10-2-13-5l-29-30c-4-3-6-7-6-12 0-5 2-10 6-13l87-88-87-88c-4-3-6-8-6-13 0-5 2-9 6-12l29-30c3-3 8-5 13-5 5 0 9 2 12 5z m234 143c0-40-9-77-29-110-20-34-46-60-80-80-33-20-70-29-110-29-40 0-77 9-110 29-34 20-60 46-80 80-20 33-29 70-29 110 0 40 9 77 29 110 20 34 46 60 80 80 33 20 70 29 110 29 40 0 77-9 110-29 34-20 60-46 80-80 20-33 29-70 29-110z"/>
|
||||||
|
<glyph unicode="←" d="M296 113l29 30c4 3 6 7 6 12 0 5-2 10-6 13l-87 88 87 88c4 3 6 8 6 13 0 5-2 9-6 12l-29 30c-3 3-8 5-13 5-5 0-9-2-12-5l-130-130c-4-4-6-8-6-13 0-5 2-9 6-13l130-130c3-3 7-5 12-5 5 0 10 2 13 5z m179 143c0-40-9-77-29-110-20-34-46-60-80-80-33-20-70-29-110-29-40 0-77 9-110 29-34 20-60 46-80 80-20 33-29 70-29 110 0 40 9 77 29 110 20 34 46 60 80 80 33 20 70 29 110 29 40 0 77-9 110-29 34-20 60-46 80-80 20-33 29-70 29-110z"/>
|
||||||
|
<glyph unicode="•" d="M475 256c0-40-9-77-29-110-20-34-46-60-80-80-33-20-70-29-110-29-40 0-77 9-110 29-34 20-60 46-80 80-20 33-29 70-29 110 0 40 9 77 29 110 20 34 46 60 80 80 33 20 70 29 110 29 40 0 77-9 110-29 34-20 60-46 80-80 20-33 29-70 29-110z"/>
|
||||||
|
<glyph unicode="a" d="M475 439l0-128c0-5-1-9-5-13-4-4-8-5-13-5l-128 0c-8 0-13 3-17 11-3 7-2 14 4 20l40 39c-28 26-62 39-100 39-20 0-39-4-57-11-18-8-33-18-46-32-14-13-24-28-32-46-7-18-11-37-11-57 0-20 4-39 11-57 8-18 18-33 32-46 13-14 28-24 46-32 18-7 37-11 57-11 23 0 44 5 64 15 20 9 38 23 51 42 2 1 4 3 7 3 3 0 5-1 7-3l39-39c2-2 3-3 3-6 0-2-1-4-2-6-21-25-46-45-76-59-29-14-60-20-93-20-30 0-58 5-85 17-27 12-51 27-70 47-20 19-35 43-47 70-12 27-17 55-17 85 0 30 5 58 17 85 12 27 27 51 47 70 19 20 43 35 70 47 27 12 55 17 85 17 28 0 55-5 81-15 26-11 50-26 70-45l37 37c6 6 12 7 20 4 8-4 11-9 11-17z"/>
|
||||||
|
</font></defs></svg>
|
After Width: | Height: | Size: 2.1 KiB |
BIN
public/fonts/slick/slick.ttf
Normal file
BIN
public/fonts/slick/slick.woff
Normal file
Before Width: | Height: | Size: 244 KiB After Width: | Height: | Size: 289 KiB |
BIN
public/logo-walden.png
Normal file
After Width: | Height: | Size: 37 KiB |
BIN
public/mont.jpg
Before Width: | Height: | Size: 3.1 MiB After Width: | Height: | Size: 277 KiB |
BIN
public/montold.jpg
Normal file
After Width: | Height: | Size: 3.1 MiB |