update,
This commit is contained in:
@@ -0,0 +1,167 @@
|
||||
//DOM elements
|
||||
const DOMstrings = {
|
||||
stepsBtnClass: 'multisteps-form__progress-btn',
|
||||
stepsBtns: document.querySelectorAll(`.multisteps-form__progress-btn`),
|
||||
stepsBar: document.querySelector('.multisteps-form__progress'),
|
||||
stepsForm: document.querySelector('.multisteps-form__form'),
|
||||
stepsFormTextareas: document.querySelectorAll('.multisteps-form__textarea'),
|
||||
stepFormPanelClass: 'multisteps-form__panel',
|
||||
stepFormPanels: document.querySelectorAll('.multisteps-form__panel'),
|
||||
stepPrevBtnClass: 'js-btn-prev',
|
||||
stepNextBtnClass: 'js-btn-next' };
|
||||
|
||||
|
||||
//remove class from a set of items
|
||||
const removeClasses = (elemSet, className) => {
|
||||
|
||||
elemSet.forEach(elem => {
|
||||
|
||||
elem.classList.remove(className);
|
||||
|
||||
});
|
||||
|
||||
};
|
||||
|
||||
//return exect parent node of the element
|
||||
const findParent = (elem, parentClass) => {
|
||||
|
||||
let currentNode = elem;
|
||||
|
||||
while (!currentNode.classList.contains(parentClass)) {
|
||||
currentNode = currentNode.parentNode;
|
||||
}
|
||||
|
||||
return currentNode;
|
||||
|
||||
};
|
||||
|
||||
//get active button step number
|
||||
const getActiveStep = elem => {
|
||||
return Array.from(DOMstrings.stepsBtns).indexOf(elem);
|
||||
};
|
||||
|
||||
//set all steps before clicked (and clicked too) to active
|
||||
const setActiveStep = activeStepNum => {
|
||||
|
||||
//remove active state from all the state
|
||||
removeClasses(DOMstrings.stepsBtns, 'js-active');
|
||||
|
||||
//set picked items to active
|
||||
DOMstrings.stepsBtns.forEach((elem, index) => {
|
||||
|
||||
if (index <= activeStepNum) {
|
||||
elem.classList.add('js-active');
|
||||
}
|
||||
|
||||
});
|
||||
};
|
||||
|
||||
//get active panel
|
||||
const getActivePanel = () => {
|
||||
|
||||
let activePanel;
|
||||
|
||||
DOMstrings.stepFormPanels.forEach(elem => {
|
||||
|
||||
if (elem.classList.contains('js-active')) {
|
||||
|
||||
activePanel = elem;
|
||||
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
return activePanel;
|
||||
|
||||
};
|
||||
|
||||
//open active panel (and close unactive panels)
|
||||
const setActivePanel = activePanelNum => {
|
||||
|
||||
//remove active class from all the panels
|
||||
removeClasses(DOMstrings.stepFormPanels, 'js-active');
|
||||
|
||||
//show active panel
|
||||
DOMstrings.stepFormPanels.forEach((elem, index) => {
|
||||
if (index === activePanelNum) {
|
||||
|
||||
elem.classList.add('js-active');
|
||||
|
||||
setFormHeight(elem);
|
||||
|
||||
}
|
||||
});
|
||||
|
||||
};
|
||||
|
||||
//set form height equal to current panel height
|
||||
const formHeight = activePanel => {
|
||||
|
||||
const activePanelHeight = activePanel.offsetHeight;
|
||||
|
||||
DOMstrings.stepsForm.style.height = `${activePanelHeight}px`;
|
||||
|
||||
};
|
||||
|
||||
const setFormHeight = () => {
|
||||
const activePanel = getActivePanel();
|
||||
|
||||
formHeight(activePanel);
|
||||
};
|
||||
|
||||
//STEPS BAR CLICK FUNCTION
|
||||
DOMstrings.stepsBar.addEventListener('click', e => {
|
||||
|
||||
//check if click target is a step button
|
||||
const eventTarget = e.target;
|
||||
|
||||
if (!eventTarget.classList.contains(`${DOMstrings.stepsBtnClass}`)) {
|
||||
return;
|
||||
}
|
||||
|
||||
//get active button step number
|
||||
const activeStep = getActiveStep(eventTarget);
|
||||
|
||||
//set all steps before clicked (and clicked too) to active
|
||||
setActiveStep(activeStep);
|
||||
|
||||
//open active panel
|
||||
setActivePanel(activeStep);
|
||||
});
|
||||
|
||||
//PREV/NEXT BTNS CLICK
|
||||
DOMstrings.stepsForm.addEventListener('click', e => {
|
||||
|
||||
const eventTarget = e.target;
|
||||
|
||||
//check if we clicked on `PREV` or NEXT` buttons
|
||||
if (!(eventTarget.classList.contains(`${DOMstrings.stepPrevBtnClass}`) || eventTarget.classList.contains(`${DOMstrings.stepNextBtnClass}`)))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
//find active panel
|
||||
const activePanel = findParent(eventTarget, `${DOMstrings.stepFormPanelClass}`);
|
||||
|
||||
let activePanelNum = Array.from(DOMstrings.stepFormPanels).indexOf(activePanel);
|
||||
|
||||
//set active step and active panel onclick
|
||||
if (eventTarget.classList.contains(`${DOMstrings.stepPrevBtnClass}`)) {
|
||||
activePanelNum--;
|
||||
|
||||
} else {
|
||||
|
||||
activePanelNum++;
|
||||
|
||||
}
|
||||
|
||||
setActiveStep(activePanelNum);
|
||||
setActivePanel(activePanelNum);
|
||||
|
||||
});
|
||||
|
||||
//SETTING PROPER FORM HEIGHT ONLOAD
|
||||
window.addEventListener('load', setFormHeight, false);
|
||||
|
||||
//SETTING PROPER FORM HEIGHT ONRESIZE
|
||||
window.addEventListener('resize', setFormHeight, false);
|
Reference in New Issue
Block a user