add countdown and some bug fixes like csv

This commit is contained in:
lefuturiste 2020-07-30 12:54:53 +00:00
parent 2b1e35e55f
commit d41551c806
18 changed files with 263 additions and 205 deletions

View file

@ -0,0 +1,47 @@
const countdown = document.getElementById('countdown')
const counter = document.getElementById('counter')
const daysContainer = document.getElementById('days')
const hoursContainer = document.getElementById('hours')
const minutesContainer = document.getElementById('minutes')
const secondsContainer = document.getElementById('seconds')
let target = new Date("2020-09-04 15:00:00")
let shown = false
function render() {
let current = new Date()
let difference = target - current
var _second = 1000,
_minute = _second * 60,
_hour = _minute * 60,
_day = _hour * 24;
var days = Math.floor(difference / _day),
hours = Math.floor((difference % _day) / _hour),
minutes = Math.floor((difference % _hour) / _minute),
seconds = Math.floor((difference % _minute) / _second);
days = (String(days).length >= 2) ? days : '0' + days;
hours = (String(hours).length >= 2) ? hours : '0' + hours;
minutes = (String(minutes).length >= 2) ? minutes : '0' + minutes;
seconds = (String(seconds).length >= 2) ? seconds : '0' + seconds;
daysContainer.textContent = days
hoursContainer.textContent = hours
minutesContainer.textContent = minutes
secondsContainer.textContent = seconds
if (!shown) {
setTimeout(() => {
countdown.style.opacity = 1
shown = true
}, 300)
}
}
render()
setInterval(render, 1000)

View file

@ -0,0 +1,72 @@
.countdown {
width: 100%;
display: flex;
justify-content: center;
align-items: center;
text-align: center;
flex-direction: column;
opacity: 0;
transition: 0.2s all ease-in-out;
}
.counter {
display: flex;
align-items: center;
}
.counter-component {
border: 2px solid #e74c3c;
border-radius: 50%;
display: flex;
justify-content: center;
align-items: center;
flex-direction: column;
width: 6em;
height: 6em;
margin-right: 1em;
margin-left: 1em;
}
.counter-component:first-of-type {
margin-left: 0;
}
.counter-component:last-of-type {
margin-right: 0;
}
.counter-component span {
font-size: 1.5em;
}
.label {
font-size: .75em;
color: #34495e;
font-weight: lighter;
margin-top: .5em;
}
@media (max-width: 600px) {
.counter {
display: grid;
grid-template-columns: 1fr 1fr;
grid-template-rows: 1fr 1fr;
grid-column-gap: 1em;
grid-row-gap: 1em;
margin-bottom: 2em;
}
.counter-component {
margin-right: 0;
margin-left: 0;
}
.counter-component:last-of-type {
margin-bottom: 0;
}
.separator {
display: none;
}
}

View file

@ -43,7 +43,7 @@ body {
position: fixed; position: fixed;
z-index: 9999999; z-index: 9999999;
left: 1em; left: 1em;
bottom: 2em; bottom: 1em;
padding: 1em; padding: 1em;
font-weight: bold; font-weight: bold;
border-radius: 3px; border-radius: 3px;

View file

@ -29,7 +29,7 @@
.return-icon { .return-icon {
display: flex; display: flex;
align-items: center; align-items: center;
margin-right: .5em; margin-right: .75em;
} }
.return-icon svg { .return-icon svg {
@ -47,25 +47,34 @@
********************************************************************************/ ********************************************************************************/
.cover-background { .cover-container {
background-position: center; position: relative;
background-size: cover;
height: 13em;
width: 100%;
} }
.cover { .cover-background {
height: 13em; z-index: -1;
margin-top: -13em; position: absolute;
background-color: rgba(230, 126, 34, 0.4); top: 0;
left: 0;
background-position: center;
background-size: cover; background-size: cover;
width: 100%;
height: 100%;
} }
.cover-content { .cover-content {
background-color: rgba(230, 126, 34, 0.75);
background-size: cover;
color: white; color: white;
padding-top: 1.5em;
padding-bottom: 1.5em;
}
.cover-content .container {
display: flex; display: flex;
align-items: center; align-items: center;
height: 13em;
} }
.cover-image { .cover-image {
@ -76,16 +85,14 @@
background-position: center; background-position: center;
width: 10em; width: 10em;
height: 10em; height: 10em;
min-width: 10em;
min-height: 10em;
margin-right: 3em; margin-right: 3em;
} }
.cover-title-container {
}
.cover-title { .cover-title {
font-family: 'Roboto Slab', serif; font-family: 'Roboto Slab', serif;
font-size: 3.5em; font-size: 3em;
font-weight: normal; font-weight: normal;
margin: 0; margin: 0;
} }
@ -497,6 +504,14 @@ section {
margin-bottom: 1em; margin-bottom: 1em;
} }
.contact-item.address .contact-content div {
margin-bottom: .25em;
}
.contact-item.address .contact-content div:last-child {
margin-bottom: 0;
}
.contact-icon { .contact-icon {
color: #B15808; color: #B15808;
background-color: #C4C4C4; background-color: #C4C4C4;
@ -573,6 +588,7 @@ People cards
.people-card { .people-card {
width: 100%; width: 100%;
max-width: 50%;
margin-right: 1em; margin-right: 1em;
border-radius: 3px; border-radius: 3px;
padding: 1.2em 1.5em; padding: 1.2em 1.5em;
@ -675,19 +691,7 @@ RESPONSIVE
@media (max-width: 900px) { @media (max-width: 900px) {
.cover-background { .cover-content .container {
height: 23em;
width: 100%;
}
.cover {
height: 23em;
margin-top: -23em;
}
.cover-content {
height: 23em;
flex-direction: column; flex-direction: column;
justify-content: center; justify-content: center;
text-align: center; text-align: center;
@ -699,6 +703,7 @@ RESPONSIVE
} }
.cover-title { .cover-title {
font-size: 2.5em;
margin-bottom: .25em; margin-bottom: .25em;
} }
@ -804,6 +809,7 @@ RESPONSIVE
} }
.people-card { .people-card {
max-width: 100%;
width: auto; width: auto;
text-align: center; text-align: center;
margin-bottom: 1em; margin-bottom: 1em;

View file

@ -0,0 +1 @@
const countdown=document.getElementById("countdown"),counter=document.getElementById("counter"),daysContainer=document.getElementById("days"),hoursContainer=document.getElementById("hours"),minutesContainer=document.getElementById("minutes"),secondsContainer=document.getElementById("seconds");let target=new Date("2020-09-04 15:00:00"),shown=!1;function render(){let e=new Date,t=target-e;var n=Math.floor(t/864e5),o=Math.floor(t%864e5/36e5),r=Math.floor(t%36e5/6e4),d=Math.floor(t%6e4/1e3);n=String(n).length>=2?n:"0"+n,o=String(o).length>=2?o:"0"+o,r=String(r).length>=2?r:"0"+r,d=String(d).length>=2?d:"0"+d,daysContainer.textContent=n,hoursContainer.textContent=o,minutesContainer.textContent=r,secondsContainer.textContent=d,shown||setTimeout(()=>{countdown.style.opacity=1,shown=!0},300)}render(),setInterval(render,1e3);

View file

@ -1 +1 @@
let navOpened=!1,oldNavText="",oldNavIcon="",navEnabler=document.getElementById("nav-enabler"),navEnablerText=document.getElementById("nav-enabler-text"),navEnablerIcon=document.getElementById("nav-enabler-icon"),navContent=document.getElementById("nav-content"),mosaic=document.getElementById("mosaic"),mosaicHeader=document.getElementById("mosaic-header"),tags=[];function createEl(e=!1,n="div"){let t=document.createElement(n);return 0!=e&&(t.className=e),t}function renderNavItem(e){let n=createEl("nav-item"),t=createEl("nav-icon"),a=createEl(e.icon,"i");t.appendChild(a),n.appendChild(t);let r=createEl("nav-item-content"),l=createEl("nav-title");l.textContent=e.name,r.appendChild(l);let o=createEl("nav-access"),i=createEl("fas fa-chevron-right","i");return o.appendChild(i),r.appendChild(l),r.appendChild(o),n.appendChild(r),n}function setAttributes(e,n){for(var t in n)attr=document.createAttribute(t),attr.value=n[t],e.attributes.setNamedItem(attr)}function renderCard(e){let n=createEl("card","a"),t=createEl("card-image-container"),a=createEl("card-image");a.style=`background-image: url('${e.thumbnail}')`,t.appendChild(a),n.appendChild(t);let r=createEl("card-content"),l=createEl(),o=createEl("card-title-container"),i=createEl("card-title","h2");i.textContent=e.name,o.appendChild(i);let c=createEl("card-icon");if(Array.isArray(e.tags)&&e.tags.length>0){let n=tags.filter(n=>e.tags[0]===n._id)[0];c.innerHTML=n.iconHTML}o.appendChild(c),l.appendChild(o);let d=createEl("card-description");d.textContent=e.description;let s="/association/"+e.slug;return isProposed&&(s+="?version=proposed"),l.appendChild(d),r.appendChild(l),n.appendChild(r),n.href=s,n}navEnabler.onclick=async()=>{navOpened?(navEnablerText.textContent=oldNavText,navEnablerIcon.style.transform="rotate(0deg)",navContent.style.maxHeight=null):(oldNavText=navEnablerText.textContent,navEnablerText.textContent="Minimiser le menu",navEnablerIcon.style.transform="rotate(90eg)",navContent.style.maxHeight=navContent.scrollHeight+"px"),navOpened=!navOpened};let currentTag=null,currentCardContainer=null;function enableTag(e){let n="nav-all"===e.id,t="";n||(t=e.attributes["data-tag-id"].value);let a=organizations.filter(e=>e.tags.filter(e=>e===t).length>0||n);renderMosaic(a),e.className+=" enabled",null!==currentTag&&(currentTag.className=currentTag.className.replace("enabled","")),currentTag=e,null==a||a.length<=0?mosaicHeader.textContent="Aucune associations listées":1===a.length?mosaicHeader.textContent="Une association listée":mosaicHeader.textContent=a.length+" associations listées"}function posY(e){for(var n=e,t=0;n&&"body"!==n.tagName.toLowerCase();)t+=n.offsetTop,n=n.offsetParent;return t}function viewPortHeight(){var e=document.documentElement;return window.innerWidth?window.innerHeight:e&&!isNaN(e.clientHeight)?e.clientHeight:0}function scrollY(){return window.pageYOffset?window.pageYOffset:Math.max(document.documentElement.scrollTop,document.body.scrollTop)}function isVisible(e){var n=viewPortHeight(),t=scrollY();return!(posY(e)>n+t)}let rendering=!0,page=0,elementsPerPage=5,focusPoint=null,focusElementPos=2,cardContainer=null,currentOrganizations=[],pageCount=0;function renderPage(){rendering=!0;let e=currentOrganizations.slice(page*elementsPerPage,(page+1)*elementsPerPage);e.forEach((n,t)=>{let a=renderCard(n);cardContainer.appendChild(a),t===e.length-focusElementPos&&(focusPoint=a)}),rendering=!1}function renderMosaic(e){cardContainer=createEl("card-container"),currentOrganizations=e,pageCount=Math.floor(e.length/elementsPerPage),renderPage(),null!==currentCardContainer&&mosaic.removeChild(currentCardContainer),currentCardContainer=cardContainer,mosaic.appendChild(cardContainer)}window.onscroll=()=>{null!=focusPoint&&isVisible(focusPoint)&&!rendering&&page+1<pageCount&&(page++,renderPage())},window.addEventListener("DOMContentLoaded",()=>{document.querySelectorAll("#nav-content .nav-item").forEach(e=>{e.onclick=()=>enableTag(e),"nav-all"!==e.id&&tags.push({_id:e.attributes["data-tag-id"].value,iconHTML:e.querySelector(".nav-icon").innerHTML})}),enableTag(document.getElementById("nav-all"))}); let navOpened=!1,oldNavText="",oldNavIcon="",navEnabler=document.getElementById("nav-enabler"),navEnablerText=document.getElementById("nav-enabler-text"),navEnablerIcon=document.getElementById("nav-enabler-icon"),navContent=document.getElementById("nav-content"),mosaic=document.getElementById("mosaic"),mosaicHeader=document.getElementById("mosaic-header"),tags=[];function createEl(e=!1,n="div"){let t=document.createElement(n);return 0!=e&&(t.className=e),t}function renderNavItem(e){let n=createEl("nav-item"),t=createEl("nav-icon"),a=createEl(e.icon,"i");t.appendChild(a),n.appendChild(t);let r=createEl("nav-item-content"),l=createEl("nav-title");l.textContent=e.name,r.appendChild(l);let i=createEl("nav-access"),o=createEl("fas fa-chevron-right","i");return i.appendChild(o),r.appendChild(l),r.appendChild(i),n.appendChild(r),n}function setAttributes(e,n){for(var t in n)attr=document.createAttribute(t),attr.value=n[t],e.attributes.setNamedItem(attr)}function renderCard(e){let n=createEl("card","a"),t=createEl("card-image-container"),a=createEl("card-image");a.style=`background-image: url('${mediaBaseUrl+"/"+e.thumbnail}')`,t.appendChild(a),n.appendChild(t);let r=createEl("card-content"),l=createEl(),i=createEl("card-title-container"),o=createEl("card-title","h2");o.textContent=e.name,i.appendChild(o);let c=createEl("card-icon");if(Array.isArray(e.tags)&&e.tags.length>0){let n=tags.filter(n=>e.tags[0]===n._id)[0];c.innerHTML=n.iconHTML}i.appendChild(c),l.appendChild(i);let d=createEl("card-description");d.textContent=e.description;let s="/association/"+e.slug;return isProposed&&(s+="?version=proposed"),l.appendChild(d),r.appendChild(l),n.appendChild(r),n.href=s,n}navEnabler.onclick=async()=>{navOpened?(navEnablerText.textContent=oldNavText,navEnablerIcon.style.transform="rotate(0deg)",navContent.style.maxHeight=null):(oldNavText=navEnablerText.textContent,navEnablerText.textContent="Minimiser le menu",navEnablerIcon.style.transform="rotate(90eg)",navContent.style.maxHeight=navContent.scrollHeight+"px"),navOpened=!navOpened};let currentTag=null,currentCardContainer=null;function enableTag(e){let n="nav-all"===e.id,t="";n||(t=e.attributes["data-tag-id"].value);let a=organizations.filter(e=>e.tags.filter(e=>e===t).length>0||n);renderMosaic(a),e.className+=" enabled",null!==currentTag&&(currentTag.className=currentTag.className.replace("enabled","")),currentTag=e,null==a||a.length<=0?mosaicHeader.textContent="Aucune associations listées":1===a.length?mosaicHeader.textContent="Une association listée":mosaicHeader.textContent=a.length+" associations listées"}function posY(e){for(var n=e,t=0;n&&"body"!==n.tagName.toLowerCase();)t+=n.offsetTop,n=n.offsetParent;return t}function viewPortHeight(){var e=document.documentElement;return window.innerWidth?window.innerHeight:e&&!isNaN(e.clientHeight)?e.clientHeight:0}function scrollY(){return window.pageYOffset?window.pageYOffset:Math.max(document.documentElement.scrollTop,document.body.scrollTop)}function isVisible(e){var n=viewPortHeight(),t=scrollY();return!(posY(e)>n+t)}let rendering=!0,page=0,elementsPerPage=5,focusPoint=null,focusElementPos=2,cardContainer=null,currentOrganizations=[],pageCount=0;function renderPage(){rendering=!0;let e=currentOrganizations.slice(page*elementsPerPage,(page+1)*elementsPerPage);e.forEach((n,t)=>{let a=renderCard(n);cardContainer.appendChild(a),t===e.length-focusElementPos&&(focusPoint=a)}),rendering=!1}function renderMosaic(e){cardContainer=createEl("card-container"),currentOrganizations=e,pageCount=Math.floor(e.length/elementsPerPage),renderPage(),null!==currentCardContainer&&mosaic.removeChild(currentCardContainer),currentCardContainer=cardContainer,mosaic.appendChild(cardContainer)}window.onscroll=()=>{null!=focusPoint&&isVisible(focusPoint)&&!rendering&&page+1<pageCount&&(page++,renderPage())},window.addEventListener("DOMContentLoaded",()=>{document.querySelectorAll("#nav-content .nav-item").forEach(e=>{e.onclick=()=>enableTag(e),"nav-all"!==e.id&&tags.push({_id:e.attributes["data-tag-id"].value,iconHTML:e.querySelector(".nav-icon").innerHTML})}),enableTag(document.getElementById("nav-all"))});

View file

@ -1,124 +1 @@
/** document.querySelectorAll(".schedule-category").forEach(e=>{let t=!1,i=e.querySelector(".schedule-category-collapse-icon"),o=e.querySelector(".schedule-category-table");e.querySelector(".schedule-category-header").onclick=()=>{t?(i.style.transform="rotate(180deg)",o.style.maxHeight=null):(i.style.transform="rotate(0deg)",o.style.maxHeight=o.scrollHeight+"px"),t=!t}});let description=document.querySelector(".description-cutted"),descriptionActions=document.querySelector(".description-actions-container"),descriptionOpened=!1,defaultMaxHeight="";if(null!==description){let e=document.querySelector(".description-btn");e.onclick=()=>{descriptionOpened?(descriptionActions.className+=" closed",description.style.maxHeight=defaultMaxHeight,e.textContent="Ouvrir la description"):(descriptionActions.className=descriptionActions.className.replace(" closed",""),defaultMaxHeight=description.style.maxHeight,description.style.maxHeight=description.scrollHeight+"px",e.textContent="Fermer la description"),descriptionOpened=!descriptionOpened}}let mediaModal=document.querySelector("#media-modal"),mediaModalContent=document.querySelector("#media-modal-content"),openModal=(e,t)=>{mediaModal.style.visibility="visible",mediaModal.style.opacity=1,mediaModalContent.innerHTML="";let i=document.createAttribute("src");i.value=e;let o=null;if(t){o=document.createElement("video"),o.setAttribute("controls",""),o.setAttribute("autoplay",""),o.setAttribute("name","media");let t=document.createElement("source");t.setAttribute("src",e),t.setAttribute("type","video/mp4"),o.appendChild(t)}else o=document.createElement("img"),o.attributes.setNamedItem(i);mediaModalContent.appendChild(o),document.body.style.overflow="hidden",document.body.style.touchAction="none",setTimeout(()=>{const e=t=>{!mediaModalContent.contains(t.target)&&isVisible(mediaModalContent)&&(closeModal(),document.removeEventListener("click",e))};document.addEventListener("click",e)},100)};const isVisible=e=>!!e&&!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length);let closeModal=()=>{mediaModal.style.visibility="hidden",mediaModal.style.opacity=0,document.body.style.overflow="initial",document.body.style.height="initial";let e=document.querySelector("#media-modal video");null!==e&&e.pause()};
* Schedule collapsable section animation
*/
document.querySelectorAll('.schedule-category').forEach(node => {
let opened = false
let icon = node.querySelector('.schedule-category-collapse-icon')
let content = node.querySelector('.schedule-category-table')
let header = node.querySelector('.schedule-category-header')
header.onclick = () => {
if (!opened) {
// open the table
icon.style.transform = "rotate(0deg)"
content.style.maxHeight = content.scrollHeight + "px"
} else {
// close the table
icon.style.transform = "rotate(180deg)"
content.style.maxHeight = null
}
opened = !opened
}
})
/**
* Description
*/
let description = document.querySelector('.description-cutted')
let descriptionActions = document.querySelector('.description-actions-container')
let descriptionOpened = false
let defaultMaxHeight = ""
if (description !== null) {
let btn = document.querySelector('.description-btn')
btn.onclick = () => {
if (!descriptionOpened) {
// open the full description
descriptionActions.className = descriptionActions.className.replace(' closed', '')
defaultMaxHeight = description.style.maxHeight
description.style.maxHeight = description.scrollHeight + "px"
btn.textContent = "Fermer la description"
} else {
// initial max Height
descriptionActions.className += ' closed'
description.style.maxHeight = defaultMaxHeight
btn.textContent = "Ouvrir la description"
}
descriptionOpened = !descriptionOpened
}
}
/**
* Gallery modal to view media in large
*/
let mediaModal = document.querySelector('#media-modal')
let mediaModalContent = document.querySelector('#media-modal-content')
// let mediaModalImage = document.querySelector('#media-modal img')
// let mediaModalVideo = document.querySelector('#media-modal video')
// let mediaModalSource = document.querySelector('#media-modal video source')
// function disableScroll() {
// // Get the current page scroll position
// scrollTop = window.pageYOffset || document.documentElement.scrollTop;
// scrollLeft = window.pageXOffset || document.documentElement.scrollLeft,
// // if any scroll is attempted, set this to the previous value
// window.onscroll = function() {
// window.scrollTo(scrollLeft, scrollTop);
// };
// }
// function enableScroll() {
// window.onscroll = function() {};
// }
let openModal = (url, isVideo) => {
mediaModal.style.visibility = 'visible'
mediaModal.style.opacity = 1
mediaModalContent.innerHTML = ""
let attr = document.createAttribute('src')
attr.value = url
let el = null
if (isVideo) {
el = document.createElement('video')
el.setAttribute('controls', '')
el.setAttribute('autoplay', '')
el.setAttribute('name', 'media')
let source = document.createElement('source')
source.setAttribute('src', url)
source.setAttribute('type', 'video/mp4')
el.appendChild(source)
} else {
el = document.createElement('img')
el.attributes.setNamedItem(attr)
}
mediaModalContent.appendChild(el)
//document.body.style.height = '100vh'
document.body.style.overflow = 'hidden'
document.body.style.touchAction = 'none'
setTimeout(() => {
const outsideClickListener = event => {
if (!mediaModalContent.contains(event.target) && isVisible(mediaModalContent)) {
closeModal()
document.removeEventListener('click', outsideClickListener)
}
}
document.addEventListener('click', outsideClickListener)
}, 100)
}
const isVisible = elem => !!elem && !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length )
let closeModal = () => {
mediaModal.style.visibility = 'hidden'
mediaModal.style.opacity = 0
document.body.style.overflow = 'initial'
document.body.style.height = 'initial'
let video = document.querySelector('#media-modal video')
if (video !== null) {
video.pause()
}
}

View file

@ -0,0 +1 @@
.countdown{width:100%;display:flex;justify-content:center;align-items:center;text-align:center;flex-direction:column;opacity:0;transition:.2s all ease-in-out}.counter{display:flex;align-items:center}.counter-component{border:2px solid #e74c3c;border-radius:50%;display:flex;justify-content:center;align-items:center;flex-direction:column;width:6em;height:6em;margin-right:1em;margin-left:1em}.counter-component:first-of-type{margin-left:0}.counter-component:last-of-type{margin-right:0}.counter-component span{font-size:1.5em}.label{font-size:.75em;color:#34495e;font-weight:lighter;margin-top:.5em}@media (max-width:600px){.counter{display:grid;grid-template-columns:1fr 1fr;grid-template-rows:1fr 1fr;grid-column-gap:1em;grid-row-gap:1em;margin-bottom:2em}.counter-component{margin-right:0;margin-left:0}.counter-component:last-of-type{margin-bottom:0}.separator{display:none}}

View file

@ -1 +1 @@
html{overflow-y:scroll}body{font-family:Roboto,sans-serif;margin:0}.container{width:60%;margin:0 auto}a{color:#3498db}a:hover{text-decoration:underline;transition:color .2s;color:#2980b9}body,html{height:100%}body{display:flex;flex-direction:column}.up-footer{flex:1 0 auto}.sticky-footer{flex-shrink:0}.proposed-alert{position:fixed;z-index:9999999;left:1em;bottom:2em;padding:1em;font-weight:700;border-radius:3px;text-transform:uppercase;border:1px solid #c0392b;background-color:#e74c3c;color:#fff}.btn{padding:.5em 1em;color:#fff;border-radius:7px;background:#2c3e50;border:0;cursor:pointer}.btn:focus{outline:0;opacity:.8}@media (max-width:1600px){.container{width:70%}}@media (max-width:1500px){.container{width:80%}}@media (max-width:900px){.container{width:92%}} html{overflow-y:scroll}body{font-family:Roboto,sans-serif;margin:0}.container{width:60%;margin:0 auto}a{color:#3498db}a:hover{text-decoration:underline;transition:color .2s;color:#2980b9}body,html{height:100%}body{display:flex;flex-direction:column}.up-footer{flex:1 0 auto}.sticky-footer{flex-shrink:0}.proposed-alert{position:fixed;z-index:9999999;left:1em;bottom:1em;padding:1em;font-weight:700;border-radius:3px;text-transform:uppercase;border:1px solid #c0392b;background-color:#e74c3c;color:#fff}.btn{padding:.5em 1em;color:#fff;border-radius:7px;background:#2c3e50;border:0;cursor:pointer}.btn:focus{outline:0;opacity:.8}@media (max-width:1600px){.container{width:70%}}@media (max-width:1500px){.container{width:80%}}@media (max-width:900px){.container{width:92%}}

File diff suppressed because one or more lines are too long

View file

@ -12,7 +12,7 @@ function minifyStyles() {
} }
function minifyScripts() { function minifyScripts() {
return gulp.src(developmentPath + '/scripts/home.js') return gulp.src(developmentPath + '/scripts/*.js')
.pipe(terser()) .pipe(terser())
.pipe(gulp.dest(productionPath + '/scripts')) .pipe(gulp.dest(productionPath + '/scripts'))
} }

View file

@ -58,6 +58,7 @@ let main = async () => {
app.use(bodyParser.json()) app.use(bodyParser.json())
app.get('/', PublicController.home) app.get('/', PublicController.home)
app.get('/countdown', PublicController.countdown)
app.get('/association/:slug', PublicController.organization) app.get('/association/:slug', PublicController.organization)
app.get('/a-propos', PublicController.about) app.get('/a-propos', PublicController.about)
app.get('/mentions-legales', PublicController.legals) app.get('/mentions-legales', PublicController.legals)

View file

@ -24,6 +24,7 @@ export default class AdminOrganizationController {
// second column is always email // second column is always email
const input = req.body.data const input = req.body.data
const parsed = Papa.parse(input) const parsed = Papa.parse(input)
console.log(parsed)
if (parsed.errors.length > 0) { if (parsed.errors.length > 0) {
return res return res
.status(400) .status(400)
@ -51,7 +52,9 @@ export default class AdminOrganizationController {
console.log(errors) console.log(errors)
res.status(400).json({ res.status(400).json({
success: false, success: false,
errors errors,
parsed,
input
}) })
}) })
} }
@ -64,11 +67,12 @@ export default class AdminOrganizationController {
).then(({ data, body }) => { ).then(({ data, body }) => {
res.json({ success: true, data, body }) res.json({ success: true, data, body })
}).catch((err: any) => { }).catch((err: any) => {
res.status(400).json({ success: false, errors: err.errors }) res.status(400).json({ success: false, errors: [err] })
}) })
} }
static storeUniversal(adminName: string, email: string, validationState: string): Promise<any> { static storeUniversal(adminName: string, email: string, validationState: string): Promise<any> {
console.log(adminName, email, validationState)
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
if (validationState == null) { if (validationState == null) {
validationState = 'unaware' validationState = 'unaware'

View file

@ -196,6 +196,7 @@ export default class DelegateController {
// before starting the upload process, we want to make sure that this organization is not exeeding the size limit for all the file // before starting the upload process, we want to make sure that this organization is not exeeding the size limit for all the file
let currentSize = MediaService.computeSize(res.locals.organization.proposedVersion) let currentSize = MediaService.computeSize(res.locals.organization.proposedVersion)
if (currentSize >= MediaService.getSizeLimit()) { if (currentSize >= MediaService.getSizeLimit()) {
console.log('> An upload was refused because of a storage size exceed event')
return res return res
.status(413) .status(413)
.json({ .json({
@ -274,7 +275,13 @@ export default class DelegateController {
// @ts-ignore // @ts-ignore
req.files.forEach((file: any) => { req.files.forEach((file: any) => {
proposedVersion.gallery.push(MediaService.buildMedia(file, 'media')) file = MediaService.buildMedia(file, 'media')
proposedVersion.gallery.push(file)
// if the media is a video, we generate a thumbnail
if (file.contentType.indexOf('video') !== -1) {
console.log('generating a thumbnail')
}
}) })
Organization.updateOne({ _id: res.locals.organization._id }, { Organization.updateOne({ _id: res.locals.organization._id }, {

View file

@ -15,6 +15,10 @@ import MediaService from '../MediaService'
export default class PublicController { export default class PublicController {
static async countdown(req: express.Request, res: express.Response) {
res.render('countdown.twig', {})
}
static async home(req: express.Request, res: express.Response) { static async home(req: express.Request, res: express.Response) {
// let client: IORedis.Redis = RedisService.getClient() // let client: IORedis.Redis = RedisService.getClient()
// await client.set('hello', 'world') // await client.set('hello', 'world')

View file

@ -28,16 +28,13 @@ class AllowedString extends mongoose.SchemaType {
const email = { const email = {
type: String, type: String,
trim: true,
lowercase: true,
unique: true,
validate: { validate: {
validator: function(v: string) { validator: function(v: string) {
console.log(v)
return /^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/.test(v); return /^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/.test(v);
}, },
message: "Invalid email" message: "Invalid email"
}, }
required: [true, "Email required"]
} }
// @ts-ignore // @ts-ignore
@ -71,7 +68,7 @@ const OrganizationVersion = {
website: { type: String }, website: { type: String },
address: { type: String }, address: { type: String },
person: { type: String }, person: { type: String },
email: { type: String }, email,
phone: { type: String }, phone: { type: String },
peoples: [{ peoples: [{
name: { type: String }, name: { type: String },

37
views/countdown.twig Normal file
View file

@ -0,0 +1,37 @@
{% extends "./base.twig" %}
{% block title %}Le site va ouvrir prochainement{% endblock %}
{% block head %}
<link rel="stylesheet" href="/styles/countdown.css" />
{% endblock %}
{% block content %}
<div class="countdown" id="countdown">
<div class="countdown-title-container">
<h2 class="countdown-title">Soyez patient...</h2>
<h5 class="countdown-subtitle">Le site ouvre le 4 septembre, c'est à dire dans :</h5>
</div>
<div id="counter" class="counter">
<div class="counter-component days">
<span id="days"></span>
<div class="label">Jours</div>
</div>
<span class="separator">:</span>
<div class="counter-component hours">
<span id="hours"></span>
<div class="label">Heures</div>
</div>
<span class="separator">:</span>
<div class="counter-component minutes">
<span id="minutes"></span>
<div class="label">Minutes</div>
</div>
<span class="separator">:</span>
<div class="counter-component seconds">
<span id="seconds"></span>
<div class="label">Secondes</div>
</div>
</div>
</div>
{% endblock %}
{% block scripts %}
<script src="/scripts/countdown.js"></script>
{% endblock %}

View file

@ -20,9 +20,10 @@
</div> </div>
</div> </div>
</div> </div>
<div class="cover-container">
<div class="cover-background" style="background-image: url({{ data.cover.location }})"></div> <div class="cover-background" style="background-image: url({{ data.cover.location }})"></div>
<div class="cover"> <div class="cover-content">
<div class="cover-content container"> <div class="container">
<div class="cover-image" style="background-image: url({{ data.thumbnail.location }});"> <div class="cover-image" style="background-image: url({{ data.thumbnail.location }});">
</div> </div>
<div class="cover-title-container"> <div class="cover-title-container">
@ -35,6 +36,7 @@
</div> </div>
</div> </div>
</div> </div>
</div>
<div class="container"> <div class="container">
{% if data.gallery|length > 0 %} {% if data.gallery|length > 0 %}
<div class="media-mosaic mosaic-{{ data.gallery|length }}"> <div class="media-mosaic mosaic-{{ data.gallery|length }}">
@ -163,7 +165,6 @@
<div class="section-divider"></div> <div class="section-divider"></div>
</div> </div>
<div class="org-container contact"> <div class="org-container contact">
{% if data.contacts.peoples|length > 0 %}
<div class="peoples"> <div class="peoples">
<div class="people-card"> <div class="people-card">
<div class="people-header"> <div class="people-header">
@ -183,6 +184,7 @@
{{ data.contacts.email }} {{ data.contacts.email }}
</a> </a>
</div> </div>
{% if data.contacts.phoneInt is not empty %}
<div class="people-contact phone"> <div class="people-contact phone">
<svg class="people-contact-icon" aria-hidden="true" focusable="false" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"> <svg class="people-contact-icon" aria-hidden="true" focusable="false" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
<path fill="currentColor" d="M493.4 24.6l-104-24c-11.3-2.6-22.9 3.3-27.5 13.9l-48 112c-4.2 9.8-1.4 21.3 6.9 28l60.6 49.6c-36 76.7-98.9 140.5-177.2 177.2l-49.6-60.6c-6.8-8.3-18.2-11.1-28-6.9l-112 48C3.9 366.5-2 378.1.6 389.4l24 104C27.1 504.2 36.7 512 48 512c256.1 0 464-207.5 464-464 0-11.2-7.7-20.9-18.6-23.4z"></path> <path fill="currentColor" d="M493.4 24.6l-104-24c-11.3-2.6-22.9 3.3-27.5 13.9l-48 112c-4.2 9.8-1.4 21.3 6.9 28l60.6 49.6c-36 76.7-98.9 140.5-177.2 177.2l-49.6-60.6c-6.8-8.3-18.2-11.1-28-6.9l-112 48C3.9 366.5-2 378.1.6 389.4l24 104C27.1 504.2 36.7 512 48 512c256.1 0 464-207.5 464-464 0-11.2-7.7-20.9-18.6-23.4z"></path>
@ -191,6 +193,7 @@
{{ data.contacts.phoneSplit }} {{ data.contacts.phoneSplit }}
</a> </a>
</div> </div>
{% endif %}
</div> </div>
</div> </div>
{% for people in data.contacts.peoples %} {% for people in data.contacts.peoples %}
@ -224,7 +227,7 @@
</div> </div>
{% endfor %} {% endfor %}
</div> </div>
{% endif %} {#
{% if data.contacts.peoples|length == 0 and data.contacts.person|length > 0 %} {% if data.contacts.peoples|length == 0 and data.contacts.person|length > 0 %}
<div class="contact-item person"> <div class="contact-item person">
<div class="contact-icon"> <div class="contact-icon">
@ -249,6 +252,7 @@
</div> </div>
</div> </div>
{% endif %} {% endif %}
#}
{% if data.contacts.peoples|length == 0 and data.contacts.phone|length > 0 %} {% if data.contacts.peoples|length == 0 and data.contacts.phone|length > 0 %}
<div class="contact-item phone"> <div class="contact-item phone">
<div class="contact-icon"> <div class="contact-icon">
@ -270,7 +274,7 @@
</div> </div>
<div class="contact-content"> <div class="contact-content">
{% for line in data.contacts.address %} {% for line in data.contacts.address %}
<span>{{ line }}</span><br> <div>{{ line }}</div>
{% endfor %} {% endfor %}
</div> </div>
</div> </div>