feat(Home): add sort by name or random button

fix(Header): fix href div box for home link
This commit is contained in:
Matthieu Bessat 2020-09-05 23:14:47 +02:00
parent ea1906618d
commit 975ed6ee5d
7 changed files with 159 additions and 36 deletions

View file

@ -1,3 +1,14 @@
/**
* Utils
*/
function createEl(className = false, elName = "div") {
let el = document.createElement(elName);
if (className != false) {
el.className = className;
}
return el;
}
/**
* Nav management
*/
@ -9,9 +20,10 @@ let navEnabler = document.getElementById('nav-enabler');
let navEnablerText = document.getElementById('nav-enabler-text');
let navEnablerIcon = document.getElementById('nav-enabler-icon');
let navContent = document.getElementById('nav-content');
let navAll = document.getElementById('nav-all')
let mosaic = document.getElementById('mosaic');
let mosaicHeader = document.getElementById('mosaic-header');
let mosaicCount = document.getElementById('mosaic-count');
let tags = []
let navEnablerExists = false
@ -36,17 +48,65 @@ navEnabler.onclick = async () => {
navOpened = !navOpened
}
function createEl(className = false, elName = "div") {
let el = document.createElement(elName);
if (className != false) {
el.className = className;
/**
* Content rendering
*/
/**
* Shuffle organization
*/
function shuffle(array) {
var currentIndex = array.length, temporaryValue, randomIndex
while (0 !== currentIndex) {
randomIndex = Math.floor(Math.random() * currentIndex)
currentIndex -= 1
temporaryValue = array[currentIndex]
array[currentIndex] = array[randomIndex]
array[randomIndex] = temporaryValue
}
return el;
return array
}
/**
* Render
* Filter & Sort actions
*/
const randomBtn = document.getElementById('random-btn')
const sortBtn = document.getElementById('sort-btn')
// by default we render the cards with the random behaviour
let sort = false
organizations = shuffle(organizations)
// the user want to sort randomly
randomBtn.onclick = () => {
if (sort) {
organizations = shuffle(organizations)
enableTag(currentTag)
sort = false
randomBtn.classList.add('enabled')
sortBtn.classList.remove('enabled')
}
}
// the user want to sort by name
sortBtn.onclick = () => {
if (!sort) {
// sort by name
organizations = organizations.sort((a, b) => {
var textA = a.name.toUpperCase()
var textB = b.name.toUpperCase()
return (textA < textB) ? -1 : (textA > textB) ? 1 : 0;
})
enableTag(currentTag)
sort = true
sortBtn.classList.add('enabled')
randomBtn.classList.remove('enabled')
}
}
function renderNavItem(tag) {
/*
<div class="nav-item">
@ -160,42 +220,44 @@ function renderCard(organization) {
let currentTag = null
let currentCardContainer = null
function enableTag(node) {
function enableTag(node, sortOperation = false) {
let all = node.id === 'nav-all'
let tagId = ""
let tagId = ''
if (!all) {
tagId = node.attributes['data-tag-id'].value
}
let data = organizations
.filter(orga => orga.tags.filter(id => id === tagId).length > 0 || all)
.sort((a, b) => {
var textA = a.name.toUpperCase()
var textB = b.name.toUpperCase()
return (textA < textB) ? -1 : (textA > textB) ? 1 : 0;
})
renderMosaic(data)
node.className += ' enabled'
if (currentTag !== null) {
currentTag.className = currentTag.className.replace('enabled', '')
}
currentTag = node
if (data === undefined || data === null || data.length <= 0) {
mosaicHeader.textContent = "Aucune association listée"
} else if (data.length === 1) {
mosaicHeader.textContent = "Une association listée"
} else {
mosaicHeader.textContent = data.length + " associations listées"
}
// close the menu if on mobile
if (navEnablerExists) {
navOpened = !navOpened
closeMenu()
document.getElementsByClassName('content')[0].scrollIntoView(true)
} else {
if (window.scrollY() > 300) {
if (!sortOperation) {
if (data === undefined || data === null || data.length <= 0) {
mosaicCount.textContent = "Aucune association listée"
} else if (data.length === 1) {
mosaicCount.textContent = "Une association listée"
} else {
mosaicCount.textContent = data.length + " associations listées"
}
// close the menu if on mobile
if (navEnablerExists) {
navOpened = !navOpened
closeMenu()
document.getElementsByClassName('content')[0].scrollIntoView(true)
} else {
if (window.scrollY() > 300) {
document.getElementsByClassName('content')[0].scrollIntoView(true)
}
}
}
}
@ -306,5 +368,5 @@ window.addEventListener('DOMContentLoaded', () => {
iconHTML: node.querySelector('.nav-icon').innerHTML
})
})
enableTag(document.getElementById('nav-all'))
enableTag(navAll)
})