add countdown and some bug fixes like csv
This commit is contained in:
parent
2b1e35e55f
commit
d41551c806
18 changed files with 263 additions and 205 deletions
47
assets/development/scripts/countdown.js
Normal file
47
assets/development/scripts/countdown.js
Normal 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)
|
72
assets/development/styles/countdown.css
Normal file
72
assets/development/styles/countdown.css
Normal 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;
|
||||||
|
}
|
||||||
|
}
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
1
assets/production/scripts/countdown.js
Normal file
1
assets/production/scripts/countdown.js
Normal 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);
|
|
@ -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"))});
|
|
@ -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()
|
|
||||||
}
|
|
||||||
}
|
|
1
assets/production/styles/countdown.css
Normal file
1
assets/production/styles/countdown.css
Normal 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}}
|
|
@ -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
|
@ -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'))
|
||||||
}
|
}
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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'
|
||||||
|
|
|
@ -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 }, {
|
||||||
|
|
|
@ -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')
|
||||||
|
|
|
@ -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
37
views/countdown.twig
Normal 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 %}
|
|
@ -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>
|
||||||
|
|
Loading…
Reference in a new issue