Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion dist/js/job-search.min.js

Large diffs are not rendered by default.

39 changes: 20 additions & 19 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

14 changes: 3 additions & 11 deletions src/js/accordion/accordion.js
Original file line number Diff line number Diff line change
Expand Up @@ -41,9 +41,7 @@ const getAccordionType = (classes) => {
* The MutationObserver instance that invoked the callback.
*/
const callback = (_mutations, observer) => {
const items = document.querySelectorAll(
`.${HelfiAccordion.accordionWrapper}`,
);
const items = document.querySelectorAll(`.${HelfiAccordion.accordionWrapper}`);

// Initialize any new accordions that haven’t yet been processed.
if (items.length > window.helfiAccordions.length) {
Expand All @@ -59,16 +57,10 @@ const callback = (_mutations, observer) => {
* type “default”, unless it’s explicitly “hardcoded”.
* This ensures that the first accordion gets full toggle-all functionality.
*/
const actualType =
index === 0 && type !== 'hardcoded' ? 'default' : type;
const actualType = index === 0 && type !== 'hardcoded' ? 'default' : type;

// Create the accordion instance.
const accordion = new HelfiAccordion(
accordionElement,
state,
hash,
actualType,
);
const accordion = new HelfiAccordion(accordionElement, state, hash, actualType);
window.helfiAccordions.push(accordion);

/**
Expand Down
26 changes: 6 additions & 20 deletions src/js/accordion/accordionItem.js
Original file line number Diff line number Diff line change
Expand Up @@ -69,18 +69,14 @@ export default class AccordionItem {

setAriaOpen = () => {
AccordionItem.ariaExpandedElements.forEach((className) => {
this.element
.getElementsByClassName(className)[0]
.setAttribute('aria-expanded', this.isOpen);
this.element.getElementsByClassName(className)[0].setAttribute('aria-expanded', this.isOpen);
});
};

// Show/hide the accordion content with the hidden-attribute.
setHidden = (noAnimation) => {
const accordionElement = this.element.closest('.accordion');
const accordionItemContent = this.element.getElementsByClassName(
AccordionItem.contentElement,
)[0];
const accordionItemContent = this.element.getElementsByClassName(AccordionItem.contentElement)[0];

// No animation version of show/hide functionality.
if (noAnimation) {
Expand All @@ -106,12 +102,7 @@ export default class AccordionItem {
if (!this.isOpen) {
// Get the show/hide animation duration from the css.
const accordionAnimationDuration =
parseInt(
getComputedStyle(accordionElement).getPropertyValue(
'--js-accordion-open-time',
),
10,
) || 200;
parseInt(getComputedStyle(accordionElement).getPropertyValue('--js-accordion-open-time'), 10) || 200;

// Delay the attribute change until the animation has been completed.
setTimeout(() => {
Expand All @@ -122,13 +113,10 @@ export default class AccordionItem {
}
};

changeFocus = () =>
this.element.querySelector(`.${AccordionItem.toggleElement}`).focus();
changeFocus = () => this.element.querySelector(`.${AccordionItem.toggleElement}`).focus();

addEventListeners = () => {
const toggleElement = this.element.getElementsByClassName(
AccordionItem.toggleElement,
)[0];
const toggleElement = this.element.getElementsByClassName(AccordionItem.toggleElement)[0];
toggleElement.addEventListener('mouseup', this.toggle);
toggleElement.addEventListener('keypress', this.toggle);

Expand All @@ -137,9 +125,7 @@ export default class AccordionItem {
// button inside an accordion so we should select the last one
// since it is the correct one that we want to bind the event
// listeners.
const closeElements = this.element.getElementsByClassName(
AccordionItem.closeElement,
);
const closeElements = this.element.getElementsByClassName(AccordionItem.closeElement);
const closeElement = closeElements[closeElements.length - 1];
closeElement.addEventListener('mouseup', this.close);
closeElement.addEventListener('keypress', this.close);
Expand Down
12 changes: 3 additions & 9 deletions src/js/accordion/accordionState.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,7 @@ export default class AccordionState {
this.storageManager = new LocalStorageManager('helfi-settings');
this.site = window.drupalSettings.helfi_instance_name || '';
this.page = window.drupalSettings.path.currentPath;
this.siteAccordionStates =
JSON.parse(this.storageManager.getValue(this.getAccordionStorageKey())) ||
{};
this.siteAccordionStates = JSON.parse(this.storageManager.getValue(this.getAccordionStorageKey())) || {};
this.pageAccordionStates = this.siteAccordionStates[this.page] || {};

// Initialize the cookie check. This check is for Siteimprove so that it can
Expand All @@ -20,18 +18,14 @@ export default class AccordionState {

saveAccordionItemState = (accordionItemId, isOpen) => {
if (!this.site) return false;
if (!this.siteAccordionStates[this.page])
this.siteAccordionStates[this.page] = {};
if (!this.siteAccordionStates[this.page]) this.siteAccordionStates[this.page] = {};
// Save only the open accordion items to the local storage.
if (isOpen === false) {
delete this.siteAccordionStates[this.page][accordionItemId];
} else {
this.siteAccordionStates[this.page][accordionItemId] = isOpen;
}
this.storageManager.setValue(
this.getAccordionStorageKey(),
JSON.stringify(this.siteAccordionStates),
);
this.storageManager.setValue(this.getAccordionStorageKey(), JSON.stringify(this.siteAccordionStates));
};

loadAccordionItemState = (accordionItemId) => {
Expand Down
12 changes: 3 additions & 9 deletions src/js/accordion/events.js
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,7 @@ export default class Events {
let accordionItemFound = false;

window.helfiAccordions.forEach((accordion) => {
const accordionItem = accordion.getAccordionItemById(
hash.replace('#', ''),
);
const accordionItem = accordion.getAccordionItemById(hash.replace('#', ''));
if (accordionItem) {
accordionItemFound = true;
accordionItem.handleLinkAnchor(hash);
Expand All @@ -31,14 +29,10 @@ export default class Events {
if (!anchorElement) {
return;
}
const accordionItemToOpen = anchorElement.closest(
`.${AccordionItem.accordionItemElement}`,
);
const accordionItemToOpen = anchorElement.closest(`.${AccordionItem.accordionItemElement}`);
if (accordionItemToOpen) {
window.helfiAccordions.forEach((accordion) => {
const idToSearch = accordionItemToOpen.querySelector(
'.helfi-accordion__header',
).id;
const idToSearch = accordionItemToOpen.querySelector('.helfi-accordion__header').id;
const accordionItem = accordion.getAccordionItemById(idToSearch);
if (accordionItem) {
accordionItem.handleLinkAnchor();
Expand Down
72 changes: 17 additions & 55 deletions src/js/accordion/helfiAccordion.js
Original file line number Diff line number Diff line change
Expand Up @@ -39,21 +39,12 @@ export default class HelfiAccordion {
* Initialize accordion items and optional “hidden until found” support.
*/
initializeAccordion = () => {
const accordionItems = this.accordion.getElementsByClassName(
AccordionItem.accordionItemElement,
);
const accordionItems = this.accordion.getElementsByClassName(AccordionItem.accordionItemElement);
this.isSingleItemAccordion = accordionItems.length === 1;

// Create AccordionItem instances for each item in this accordion.
Array.from(accordionItems).forEach((element) => {
this.accordionItems.push(
new AccordionItem(
element,
this.localState,
this.urlHash,
this.updateToggleButtonLabel,
),
);
this.accordionItems.push(new AccordionItem(element, this.localState, this.urlHash, this.updateToggleButtonLabel));
});

// Initialize hidden="until-found" functionality if it is supported.
Expand All @@ -68,9 +59,7 @@ export default class HelfiAccordion {
enableHiddenUntilFound = () => {
this.accordionItems.forEach((accordionItem) => {
accordionItem.element.classList.add('accordion-item--hidden-until-found');
const accordionItemContent = accordionItem.element.querySelector(
'.accordion-item__content',
);
const accordionItemContent = accordionItem.element.querySelector('.accordion-item__content');

// If item is defined in the state as open, don't close it.
if (!accordionItem.isOpen) {
Expand All @@ -81,10 +70,7 @@ export default class HelfiAccordion {
// highlight is found on the url parameters.
accordionItem.element.addEventListener('beforematch', () => {
// Disable animations on the accordion on these events.
accordionItem.element.style.setProperty(
'--js-accordion-open-time',
'0s',
);
accordionItem.element.style.setProperty('--js-accordion-open-time', '0s');

// Force a reflow to ensure the style change takes effect.
void accordionItem.element.offsetHeight;
Expand All @@ -94,9 +80,7 @@ export default class HelfiAccordion {

// Enable the animations again after the accordion has been opened.
setTimeout(() => {
accordionItem.element.style.removeProperty(
'--js-accordion-open-time',
);
accordionItem.element.style.removeProperty('--js-accordion-open-time');
}, 10);
});
});
Expand All @@ -111,9 +95,7 @@ export default class HelfiAccordion {
return;
}

const toggleAllElement = this.accordion.getElementsByClassName(
HelfiAccordion.toggleAllElement,
)[0];
const toggleAllElement = this.accordion.getElementsByClassName(HelfiAccordion.toggleAllElement)[0];
toggleAllElement.addEventListener('mouseup', this.toggleItems);
toggleAllElement.addEventListener('keypress', this.toggleItems);
};
Expand All @@ -124,46 +106,34 @@ export default class HelfiAccordion {

showToggleButton = () => {
if (HelfiAccordion.isHeaderless(this.type) || this.isSingleItemAccordion) {
this.accordion
.getElementsByClassName(HelfiAccordion.toggleAllElement)[0]
?.classList.add('is-hidden');
this.accordion.getElementsByClassName(HelfiAccordion.toggleAllElement)[0]?.classList.add('is-hidden');
} else {
this.accordion
.getElementsByClassName(HelfiAccordion.toggleAllElement)[0]
?.classList.remove('is-hidden');
this.accordion.getElementsByClassName(HelfiAccordion.toggleAllElement)[0]?.classList.remove('is-hidden');
}
};

/**
* Update the toggle-all button label based on current accordion state.
*/
updateToggleButtonLabel = () => {
const toggleAllElement = this.accordion.getElementsByClassName(
HelfiAccordion.toggleAllElement,
)[0];
const toggleAllElement = this.accordion.getElementsByClassName(HelfiAccordion.toggleAllElement)[0];
if (!toggleAllElement) return;

const span = toggleAllElement.querySelector('span');
if (!span) return;

if (this.areAllItemsOpen()) {
span.textContent =
Translations.close_all?.[this.currentLanguage] ??
Translations.close_all.en;
span.textContent = Translations.close_all?.[this.currentLanguage] ?? Translations.close_all.en;
} else {
span.textContent =
Translations.open_all?.[this.currentLanguage] ??
Translations.open_all.en;
span.textContent = Translations.open_all?.[this.currentLanguage] ?? Translations.open_all.en;
}

this.toggleAllLabelUpdate();
};

getAccordionItemById = (id) =>
this.accordionItems.find((accordionItem) => accordionItem.id === id);
getAccordionItemById = (id) => this.accordionItems.find((accordionItem) => accordionItem.id === id);

toggleItems = () =>
this.areAllItemsOpen() ? this.closeAll() : this.openAll();
toggleItems = () => (this.areAllItemsOpen() ? this.closeAll() : this.openAll());

/**
* Opens all accordion items (including child accordions, if any).
Expand All @@ -189,19 +159,15 @@ export default class HelfiAccordion {
this.toggleAllLabelUpdate();

// Move focus back to the toggle-all button for accessibility.
const toggleAllElement = this.accordion.getElementsByClassName(
HelfiAccordion.toggleAllElement,
)[0];
const toggleAllElement = this.accordion.getElementsByClassName(HelfiAccordion.toggleAllElement)[0];
toggleAllElement.focus();
};

/**
* Updates the toggle-all button’s open/closed CSS classes.
*/
toggleAllLabelUpdate = () => {
const toggleAllElement = this.accordion.getElementsByClassName(
HelfiAccordion.toggleAllElement,
)[0];
const toggleAllElement = this.accordion.getElementsByClassName(HelfiAccordion.toggleAllElement)[0];

if (toggleAllElement && this.areAllItemsOpen()) {
toggleAllElement.classList.remove(HelfiAccordion.toggleAllClosed);
Expand All @@ -212,13 +178,9 @@ export default class HelfiAccordion {
}
};

areAllItemsOpen = () =>
this.accordionItems?.every((item) => item.isOpen) &&
this.areChildItemsOpen();
areAllItemsOpen = () => this.accordionItems?.every((item) => item.isOpen) && this.areChildItemsOpen();

areChildItemsOpen = () =>
this.childAccordion?.areAllItemsOpen() ??
this.accordionItems?.every((item) => item.isOpen);
areChildItemsOpen = () => this.childAccordion?.areAllItemsOpen() ?? this.accordionItems?.every((item) => item.isOpen);

static isHeaderless = (type) => HelfiAccordion.headerlessTypes.includes(type);

Expand Down
Loading