Restore VSF list-card interaction script on overview page
This commit is contained in:
@@ -110,7 +110,7 @@
|
|||||||
<div id="layout-vsf-list-card">
|
<div id="layout-vsf-list-card">
|
||||||
<div class="sg-object-card-grid" aria-label="VSF Listen Übersicht Karten">
|
<div class="sg-object-card-grid" aria-label="VSF Listen Übersicht Karten">
|
||||||
<div class="sg-delete-confirmation-pattern sg-delete-confirmation-pattern__stage sg-vsf-list-card__overlay-item" data-pattern="overlay-card" data-dialog-open="false" aria-label="VSF List Card Layout List Card">
|
<div class="sg-delete-confirmation-pattern sg-delete-confirmation-pattern__stage sg-vsf-list-card__overlay-item" data-pattern="overlay-card" data-dialog-open="false" aria-label="VSF List Card Layout List Card">
|
||||||
<article class="sg-card sg-object-card sg-delete-confirmation-pattern__target" data-pattern="object-group-card" aria-label="List Card">
|
<article class="sg-card sg-delete-confirmation-pattern__target" data-pattern="object-group-card" aria-label="List Card">
|
||||||
<header class="sg-card-segment sg-card-segment--header sg-card-segment--darkblue sg-object-card__header" data-pattern-part="object-group-card-header">
|
<header class="sg-card-segment sg-card-segment--header sg-card-segment--darkblue sg-object-card__header" data-pattern-part="object-group-card-header">
|
||||||
<div class="sg-strong">NAME DER LISTE</div>
|
<div class="sg-strong">NAME DER LISTE</div>
|
||||||
<div class="sg-sandwich-menu-wrap" data-open="false" data-align="right" data-component="sandwich-menu" data-component-size="small">
|
<div class="sg-sandwich-menu-wrap" data-open="false" data-align="right" data-component="sandwich-menu" data-component-size="small">
|
||||||
@@ -229,7 +229,7 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="sg-delete-confirmation-pattern sg-delete-confirmation-pattern__stage sg-vsf-list-card__overlay-item" data-pattern="overlay-card" data-dialog-open="false" aria-label="VSF List Card Layout List Card">
|
<div class="sg-delete-confirmation-pattern sg-delete-confirmation-pattern__stage sg-vsf-list-card__overlay-item" data-pattern="overlay-card" data-dialog-open="false" aria-label="VSF List Card Layout List Card">
|
||||||
<article class="sg-card sg-object-card sg-delete-confirmation-pattern__target" data-pattern="object-group-card" aria-label="List Card">
|
<article class="sg-card sg-delete-confirmation-pattern__target" data-pattern="object-group-card" aria-label="List Card">
|
||||||
<header class="sg-card-segment sg-card-segment--header sg-card-segment--darkblue sg-object-card__header" data-pattern-part="object-group-card-header">
|
<header class="sg-card-segment sg-card-segment--header sg-card-segment--darkblue sg-object-card__header" data-pattern-part="object-group-card-header">
|
||||||
<div class="sg-strong">NAME DER LISTE</div>
|
<div class="sg-strong">NAME DER LISTE</div>
|
||||||
<div class="sg-sandwich-menu-wrap" data-open="false" data-align="right" data-component="sandwich-menu" data-component-size="small">
|
<div class="sg-sandwich-menu-wrap" data-open="false" data-align="right" data-component="sandwich-menu" data-component-size="small">
|
||||||
@@ -415,37 +415,237 @@
|
|||||||
</section>
|
</section>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
const updateObjectCardGridRowState = () => {
|
const formCard = document.querySelector('#layout-vsf-list-card .sg-object-card-grid:first-of-type .sg-form-sections-card');
|
||||||
document.querySelectorAll('.sg-object-card-grid').forEach((grid) => {
|
const processButton = formCard?.querySelector('.sg-button--process');
|
||||||
const cards = Array.from(grid.querySelectorAll('.sg-object-card'));
|
|
||||||
grid.classList.remove('sg-object-card-grid--multi-row');
|
|
||||||
grid.style.removeProperty('--layout-object-card-shared-width');
|
|
||||||
|
|
||||||
if (cards.length <= 1) {
|
const updateProcessButtonState = () => {
|
||||||
return;
|
if (!formCard || !processButton) {
|
||||||
}
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
const firstTop = cards[0].offsetTop;
|
const hasPulldownSelection = Array.from(formCard.querySelectorAll('[data-pulldown-option]'))
|
||||||
const hasMultipleRows = cards.some((card) => card.offsetTop !== firstTop);
|
.some((option) => option.getAttribute('aria-checked') === 'true');
|
||||||
|
const hasTextInput = Array.from(formCard.querySelectorAll('input[type="text"], textarea'))
|
||||||
|
.some((field) => field.value.trim().length > 0);
|
||||||
|
const isActive = hasPulldownSelection || hasTextInput;
|
||||||
|
|
||||||
if (!hasMultipleRows) {
|
processButton.disabled = !isActive;
|
||||||
return;
|
processButton.setAttribute('aria-disabled', String(!isActive));
|
||||||
}
|
processButton.classList.toggle('sg-button--process-inactive', !isActive);
|
||||||
|
|
||||||
const firstRowCards = cards.filter((card) => card.offsetTop === firstTop);
|
|
||||||
const referenceCard = firstRowCards[0];
|
|
||||||
if (!referenceCard) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
const referenceWidth = referenceCard.getBoundingClientRect().width;
|
|
||||||
grid.style.setProperty('--layout-object-card-shared-width', `${referenceWidth}px`);
|
|
||||||
grid.classList.add('sg-object-card-grid--multi-row');
|
|
||||||
});
|
|
||||||
};
|
};
|
||||||
|
|
||||||
window.addEventListener('load', updateObjectCardGridRowState);
|
const updatePulldownSelectionState = (demo) => {
|
||||||
window.addEventListener('resize', updateObjectCardGridRowState);
|
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;
|
||||||
|
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';
|
||||||
|
updateProcessButtonState();
|
||||||
|
};
|
||||||
|
|
||||||
|
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.open = String(nextState);
|
||||||
|
trigger.setAttribute('aria-expanded', String(nextState));
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
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) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
pulldownDemo.querySelectorAll('[data-pulldown-option]').forEach((otherOption) => {
|
||||||
|
otherOption.setAttribute('aria-checked', String(otherOption === option));
|
||||||
|
});
|
||||||
|
|
||||||
|
updatePulldownSelectionState(pulldownDemo);
|
||||||
|
const trigger = pulldownDemo.querySelector('.sg-pulldown-demo__trigger');
|
||||||
|
pulldownDemo.dataset.open = 'false';
|
||||||
|
if (trigger) {
|
||||||
|
trigger.setAttribute('aria-expanded', 'false');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
document.querySelectorAll('.sg-pulldown-demo').forEach(updatePulldownSelectionState);
|
||||||
|
formCard?.querySelectorAll('input[type="text"], textarea').forEach((field) => {
|
||||||
|
field.addEventListener('input', updateProcessButtonState);
|
||||||
|
});
|
||||||
|
updateProcessButtonState();
|
||||||
|
|
||||||
|
const editInputs = document.querySelectorAll('[data-vsf-edit-input]');
|
||||||
|
const editSaveButton = document.querySelector('[data-vsf-edit-save]');
|
||||||
|
const deleteDialogInput = document.querySelector('[data-vsf-delete-confirmation-input]');
|
||||||
|
const deleteDialogSubmitButton = document.querySelector('[data-vsf-delete-confirmation-submit]');
|
||||||
|
|
||||||
|
if (editInputs.length > 0 && editSaveButton) {
|
||||||
|
const updateEditSaveState = () => {
|
||||||
|
const hasInput = Array.from(editInputs).some((field) => field.value.trim().length > 0);
|
||||||
|
editSaveButton.disabled = !hasInput;
|
||||||
|
editSaveButton.setAttribute('aria-disabled', String(!hasInput));
|
||||||
|
editSaveButton.classList.toggle('sg-button--process-inactive', !hasInput);
|
||||||
|
};
|
||||||
|
|
||||||
|
editInputs.forEach((field) => {
|
||||||
|
field.addEventListener('input', updateEditSaveState);
|
||||||
|
});
|
||||||
|
updateEditSaveState();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (deleteDialogInput && deleteDialogSubmitButton) {
|
||||||
|
const updateDeleteDialogState = () => {
|
||||||
|
const isValid = deleteDialogInput.value === 'DELETE';
|
||||||
|
deleteDialogSubmitButton.disabled = !isValid;
|
||||||
|
deleteDialogSubmitButton.setAttribute('aria-disabled', String(!isValid));
|
||||||
|
deleteDialogSubmitButton.classList.toggle('sg-button--process-inactive', !isValid);
|
||||||
|
};
|
||||||
|
|
||||||
|
deleteDialogInput.addEventListener('input', updateDeleteDialogState);
|
||||||
|
updateDeleteDialogState();
|
||||||
|
}
|
||||||
|
|
||||||
|
const closeStageDialogs = (stage) => {
|
||||||
|
stage.querySelectorAll('.sg-delete-confirmation-pattern__floating-card').forEach((dialog) => {
|
||||||
|
dialog.hidden = true;
|
||||||
|
});
|
||||||
|
stage.dataset.dialogOpen = 'false';
|
||||||
|
};
|
||||||
|
|
||||||
|
document.querySelectorAll('.sg-delete-confirmation-pattern__stage').forEach((stage) => {
|
||||||
|
closeStageDialogs(stage);
|
||||||
|
});
|
||||||
|
|
||||||
|
document.querySelectorAll('[data-overlay-open-dialog]').forEach((link) => {
|
||||||
|
link.addEventListener('click', (event) => {
|
||||||
|
event.preventDefault();
|
||||||
|
event.stopPropagation();
|
||||||
|
|
||||||
|
const stage = link.closest('.sg-delete-confirmation-pattern__stage');
|
||||||
|
if (!stage) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const target = link.getAttribute('data-overlay-open-dialog');
|
||||||
|
const dialog = stage.querySelector(`.sg-delete-confirmation-pattern__floating-card[data-overlay-dialog="${target}"]`);
|
||||||
|
|
||||||
|
if (!dialog) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
closeStageDialogs(stage);
|
||||||
|
dialog.hidden = false;
|
||||||
|
stage.dataset.dialogOpen = 'true';
|
||||||
|
|
||||||
|
const menuWrap = link.closest('.sg-sandwich-menu-wrap');
|
||||||
|
const menuButton = menuWrap?.querySelector('.sg-sandwich-button');
|
||||||
|
if (menuWrap) {
|
||||||
|
menuWrap.dataset.open = 'false';
|
||||||
|
}
|
||||||
|
if (menuButton) {
|
||||||
|
menuButton.setAttribute('aria-expanded', 'false');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
document.querySelectorAll('[data-overlay-dialog-close], [data-vsf-delete-confirmation-submit], [data-vsf-edit-save]').forEach((button) => {
|
||||||
|
button.addEventListener('click', (event) => {
|
||||||
|
event.preventDefault();
|
||||||
|
const stage = button.closest('.sg-delete-confirmation-pattern__stage');
|
||||||
|
if (!stage) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
closeStageDialogs(stage);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
document.querySelectorAll('.sg-sandwich-menu-wrap').forEach((wrap) => {
|
||||||
|
const button = wrap.querySelector('.sg-sandwich-button');
|
||||||
|
const panel = wrap.querySelector('.sg-sandwich-menu-panel');
|
||||||
|
|
||||||
|
if (!button) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
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));
|
||||||
|
|
||||||
|
if (!nextState || !panel) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
wrap.dataset.align = 'right';
|
||||||
|
const panelRect = panel.getBoundingClientRect();
|
||||||
|
if (panelRect.left < 0) {
|
||||||
|
wrap.dataset.align = 'left';
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
document.addEventListener('click', (event) => {
|
||||||
|
if (event.target.closest('.sg-pulldown-demo') || event.target.closest('.sg-sandwich-menu-wrap')) {
|
||||||
|
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');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
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');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
</body>
|
</body>
|
||||||
|
|||||||
Reference in New Issue
Block a user