Add portal header pattern interactions to VSF Meldungen
This commit is contained in:
@@ -145,5 +145,240 @@
|
|||||||
</p>
|
</p>
|
||||||
</article>
|
</article>
|
||||||
|
|
||||||
|
<script src="../scripts/help-icon-overlays.js"></script>
|
||||||
|
<script>
|
||||||
|
document.querySelectorAll('.sg-portal-header__tabs').forEach((group) => {
|
||||||
|
group.querySelectorAll('.sg-tab-button').forEach((button) => {
|
||||||
|
button.addEventListener('click', () => {
|
||||||
|
group.querySelectorAll('.sg-tab-button').forEach((otherButton) => {
|
||||||
|
const isActive = otherButton === button;
|
||||||
|
otherButton.setAttribute('aria-selected', String(isActive));
|
||||||
|
otherButton.dataset.componentState = isActive ? 'active' : 'inactive';
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
document.querySelectorAll('.sg-sandwich-menu-wrap').forEach((wrap) => {
|
||||||
|
const button = wrap.querySelector('.sg-sandwich-button');
|
||||||
|
|
||||||
|
button.addEventListener('click', (event) => {
|
||||||
|
event.stopPropagation();
|
||||||
|
const nextState = wrap.dataset.open !== 'true';
|
||||||
|
document.querySelectorAll('.sg-sandwich-menu-wrap').forEach((otherWrap) => {
|
||||||
|
const otherButton = otherWrap.querySelector('.sg-sandwich-button');
|
||||||
|
otherWrap.dataset.open = 'false';
|
||||||
|
if (otherButton) {
|
||||||
|
otherButton.setAttribute('aria-expanded', 'false');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
wrap.dataset.open = String(nextState);
|
||||||
|
button.setAttribute('aria-expanded', String(nextState));
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
document.querySelectorAll('.sg-mode-toggle').forEach((toggle) => {
|
||||||
|
toggle.addEventListener('click', () => {
|
||||||
|
const nextState = toggle.dataset.active === 'relative' ? 'absolute' : 'relative';
|
||||||
|
toggle.dataset.active = nextState;
|
||||||
|
toggle.dataset.componentState = nextState;
|
||||||
|
toggle.setAttribute(
|
||||||
|
'aria-label',
|
||||||
|
`Modus Schieber global: ${nextState === 'relative' ? 'relativ' : 'absolut'} aktiv`
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
const updatePulldownSelectionState = (demo) => {
|
||||||
|
const trigger = demo.querySelector('.sg-pulldown-demo__trigger');
|
||||||
|
const selectableOptions = demo.querySelectorAll('[data-pulldown-option]');
|
||||||
|
|
||||||
|
if (!trigger || selectableOptions.length === 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const selectedCount = Array.from(selectableOptions).filter((option) => {
|
||||||
|
return option.getAttribute('aria-checked') === 'true';
|
||||||
|
}).length;
|
||||||
|
|
||||||
|
selectableOptions.forEach((option) => {
|
||||||
|
const optionRow = option.closest('.sg-pulldown-option');
|
||||||
|
if (!optionRow) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
optionRow.classList.toggle(
|
||||||
|
'sg-pulldown-option--selected',
|
||||||
|
option.getAttribute('aria-checked') === 'true'
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
const labelBase = trigger.dataset.labelBase || 'Auswahl';
|
||||||
|
|
||||||
|
trigger.textContent = selectedCount > 0 ? `${labelBase} (${selectedCount})` : labelBase;
|
||||||
|
trigger.classList.toggle('sg-pulldown--selected', selectedCount > 0);
|
||||||
|
trigger.classList.toggle('sg-form-active', selectedCount > 0);
|
||||||
|
trigger.dataset.componentState = selectedCount > 0 ? 'selected' : 'inactive-selectable';
|
||||||
|
demo.dataset.componentState = selectedCount > 0 ? 'selected' : 'inactive-selectable';
|
||||||
|
trigger.setAttribute(
|
||||||
|
'aria-label',
|
||||||
|
selectedCount > 0 ? `Pulldown ${labelBase} mit aktiver Auswahl` : `Pulldown ${labelBase} ohne aktive Auswahl`
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
document.querySelectorAll('.sg-pulldown-demo').forEach((demo) => {
|
||||||
|
const trigger = demo.querySelector('.sg-pulldown-demo__trigger');
|
||||||
|
|
||||||
|
if (!trigger) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
trigger.addEventListener('click', (event) => {
|
||||||
|
event.stopPropagation();
|
||||||
|
const nextState = demo.dataset.open !== 'true';
|
||||||
|
|
||||||
|
document.querySelectorAll('.sg-pulldown-demo').forEach((otherDemo) => {
|
||||||
|
const otherTrigger = otherDemo.querySelector('.sg-pulldown-demo__trigger');
|
||||||
|
otherDemo.dataset.open = 'false';
|
||||||
|
if (otherTrigger) {
|
||||||
|
otherTrigger.setAttribute('aria-expanded', 'false');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
demo.dataset.align = 'left';
|
||||||
|
demo.dataset.open = String(nextState);
|
||||||
|
trigger.setAttribute('aria-expanded', String(nextState));
|
||||||
|
|
||||||
|
if (!nextState) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const panel = demo.querySelector('.sg-pulldown-panel');
|
||||||
|
if (!panel) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const panelRect = panel.getBoundingClientRect();
|
||||||
|
if (panelRect.right > window.innerWidth) {
|
||||||
|
demo.dataset.align = 'right';
|
||||||
|
}
|
||||||
|
|
||||||
|
const alignedPanelRect = panel.getBoundingClientRect();
|
||||||
|
if (alignedPanelRect.left < 0) {
|
||||||
|
demo.dataset.align = 'left';
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
document.querySelectorAll('.sg-checkbox-field').forEach((checkbox) => {
|
||||||
|
checkbox.addEventListener('click', (event) => {
|
||||||
|
event.stopPropagation();
|
||||||
|
if (checkbox.disabled) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const nextState = checkbox.getAttribute('aria-checked') !== 'true';
|
||||||
|
checkbox.setAttribute('aria-checked', String(nextState));
|
||||||
|
|
||||||
|
const pulldownDemo = checkbox.closest('.sg-pulldown-demo');
|
||||||
|
if (pulldownDemo) {
|
||||||
|
updatePulldownSelectionState(pulldownDemo);
|
||||||
|
pulldownDemo.dataset.open = 'true';
|
||||||
|
const trigger = pulldownDemo.querySelector('.sg-pulldown-demo__trigger');
|
||||||
|
if (trigger) {
|
||||||
|
trigger.setAttribute('aria-expanded', 'true');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
document.querySelectorAll('.sg-pulldown-option[data-pulldown-option]').forEach((option) => {
|
||||||
|
option.addEventListener('click', (event) => {
|
||||||
|
event.stopPropagation();
|
||||||
|
const pulldownDemo = option.closest('.sg-pulldown-demo');
|
||||||
|
if (pulldownDemo) {
|
||||||
|
const selectionMode = pulldownDemo.dataset.selectionMode || 'single';
|
||||||
|
if (selectionMode === 'multiple') {
|
||||||
|
const nextState = option.getAttribute('aria-checked') !== 'true';
|
||||||
|
option.setAttribute('aria-checked', String(nextState));
|
||||||
|
} else {
|
||||||
|
pulldownDemo.querySelectorAll('[data-pulldown-option]').forEach((otherOption) => {
|
||||||
|
otherOption.setAttribute('aria-checked', String(otherOption === option));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
updatePulldownSelectionState(pulldownDemo);
|
||||||
|
const trigger = pulldownDemo.querySelector('.sg-pulldown-demo__trigger');
|
||||||
|
if (selectionMode === 'multiple') {
|
||||||
|
pulldownDemo.dataset.open = 'true';
|
||||||
|
if (trigger) {
|
||||||
|
trigger.setAttribute('aria-expanded', 'true');
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
pulldownDemo.dataset.open = 'false';
|
||||||
|
if (trigger) {
|
||||||
|
trigger.setAttribute('aria-expanded', 'false');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
document.querySelectorAll('.sg-pulldown-demo').forEach(updatePulldownSelectionState);
|
||||||
|
|
||||||
|
window.sgInitHelpIconOverlays({
|
||||||
|
closeOnOpenSelectors: ['.sg-pulldown-demo', '.sg-sandwich-menu-wrap'],
|
||||||
|
outsideClickIgnoreSelectors: ['.sg-pulldown-demo', '.sg-sandwich-menu-wrap'],
|
||||||
|
});
|
||||||
|
|
||||||
|
document.querySelectorAll('.sg-input-single-line-wrap').forEach((wrap) => {
|
||||||
|
const input = wrap.querySelector('.sg-input-single-line');
|
||||||
|
const clearButton = wrap.querySelector('.sg-input-clear-button');
|
||||||
|
|
||||||
|
if (!input || !clearButton) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const updateState = () => {
|
||||||
|
wrap.dataset.hasValue = String(input.value.length > 0);
|
||||||
|
wrap.dataset.componentState = input.value.length > 0 ? 'active' : 'inactive-selectable';
|
||||||
|
};
|
||||||
|
|
||||||
|
input.addEventListener('input', updateState);
|
||||||
|
|
||||||
|
clearButton.addEventListener('click', () => {
|
||||||
|
input.value = '';
|
||||||
|
updateState();
|
||||||
|
input.focus();
|
||||||
|
});
|
||||||
|
|
||||||
|
updateState();
|
||||||
|
});
|
||||||
|
|
||||||
|
document.addEventListener('click', (event) => {
|
||||||
|
if (!event.target.closest('.sg-sandwich-menu-wrap')) {
|
||||||
|
document.querySelectorAll('.sg-sandwich-menu-wrap').forEach((wrap) => {
|
||||||
|
const button = wrap.querySelector('.sg-sandwich-button');
|
||||||
|
wrap.dataset.open = 'false';
|
||||||
|
if (button) {
|
||||||
|
button.setAttribute('aria-expanded', 'false');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (event.target.closest('.sg-pulldown-demo')) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
document.querySelectorAll('.sg-pulldown-demo').forEach((demo) => {
|
||||||
|
const trigger = demo.querySelector('.sg-pulldown-demo__trigger');
|
||||||
|
demo.dataset.open = 'false';
|
||||||
|
if (trigger) {
|
||||||
|
trigger.setAttribute('aria-expanded', 'false');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
Reference in New Issue
Block a user