diff --git a/patterns/delete-confirmation-overlay.html b/patterns/delete-confirmation-overlay.html index 4f40dfe..31b9e1d 100644 --- a/patterns/delete-confirmation-overlay.html +++ b/patterns/delete-confirmation-overlay.html @@ -143,7 +143,6 @@
-
@@ -189,6 +188,13 @@ + + @@ -206,26 +212,23 @@ const createListNameInput = stage.querySelector('[data-create-list-form] input[aria-label="Name"]'); const createListDescriptionInput = stage.querySelector('[data-create-list-form] textarea[aria-label="Beschreibung"]'); const createListSubmitButton = stage.querySelector('[data-create-list-form] button[type="submit"]'); - const selectedListIds = new Set( + const isAddToListOverlay = stage.dataset.pattern === 'add-to-list-overlay'; + const committedListIds = new Set( (stage.dataset.overlaySelectedLists ?? '') .split(',') .map((value) => value.trim()) .filter(Boolean) ); + let draftListIds = new Set(committedListIds); + let updateCreateListButtonState = () => {}; + let resetAddToListDraftState = () => {}; - const closeStageDialogs = () => { + const closeStageDialogs = ({ resetAddToListDraft = false } = {}) => { stage.querySelectorAll('[data-overlay-dialog]').forEach((dialog) => { dialog.hidden = true; }); - if (createListSegment) { - createListSegment.hidden = true; - } - if (createListFormToggle) { - createListFormToggle.disabled = false; - createListFormToggle.setAttribute('aria-disabled', 'false'); - createListFormToggle.setAttribute('aria-expanded', 'false'); - createListFormToggle.classList.remove('sg-button--inactive'); - createListFormToggle.classList.add('sg-button--active'); + if (isAddToListOverlay && resetAddToListDraft) { + resetAddToListDraftState(); } stage.dataset.dialogOpen = 'false'; }; @@ -233,12 +236,10 @@ const syncOverlayListState = () => { overlayListButtons.forEach((button) => { const listId = button.dataset.overlayListId; - const isSelected = Boolean(listId && selectedListIds.has(listId)); + const isSelected = Boolean(listId && draftListIds.has(listId)); button.dataset.selected = String(isSelected); button.setAttribute('aria-pressed', String(isSelected)); }); - - stage.dataset.overlaySelectedLists = Array.from(selectedListIds).join(','); }; if (confirmationInput && confirmationSubmitButton) { @@ -266,10 +267,10 @@ return; } - if (selectedListIds.has(listId)) { - selectedListIds.delete(listId); + if (draftListIds.has(listId)) { + draftListIds.delete(listId); } else { - selectedListIds.add(listId); + draftListIds.add(listId); } syncOverlayListState(); @@ -278,7 +279,7 @@ } if (createListForm && createListFormToggle) { - const updateCreateListButtonState = () => { + updateCreateListButtonState = () => { if (!createListSubmitButton) { return; } @@ -294,6 +295,33 @@ createListNameInput?.addEventListener('input', updateCreateListButtonState); createListDescriptionInput?.addEventListener('input', updateCreateListButtonState); + createListForm.addEventListener('submit', (event) => { + event.preventDefault(); + }); + + resetAddToListDraftState = () => { + draftListIds = new Set(committedListIds); + syncOverlayListState(); + + if (createListSegment) { + createListSegment.hidden = true; + } + if (createListFormToggle) { + createListFormToggle.disabled = false; + createListFormToggle.setAttribute('aria-disabled', 'false'); + createListFormToggle.setAttribute('aria-expanded', 'false'); + createListFormToggle.classList.remove('sg-button--inactive'); + createListFormToggle.classList.add('sg-button--active'); + } + if (createListNameInput) { + createListNameInput.value = ''; + } + if (createListDescriptionInput) { + createListDescriptionInput.value = ''; + } + updateCreateListButtonState(); + }; + updateCreateListButtonState(); createListFormToggle.addEventListener('click', (event) => { @@ -310,7 +338,11 @@ }); } - closeStageDialogs(); + if (isAddToListOverlay) { + resetAddToListDraftState(); + } + + closeStageDialogs({ resetAddToListDraft: false }); stage.querySelectorAll('[data-overlay-open-dialog]').forEach((link) => { link.addEventListener('click', (event) => { @@ -323,7 +355,7 @@ return; } - closeStageDialogs(); + closeStageDialogs({ resetAddToListDraft: target === 'add-to-list' }); dialog.hidden = false; stage.dataset.dialogOpen = 'true'; @@ -345,6 +377,25 @@ }); }); + stage.querySelectorAll('[data-overlay-dialog-cancel]').forEach((button) => { + button.addEventListener('click', (event) => { + event.preventDefault(); + closeStageDialogs({ resetAddToListDraft: true }); + }); + }); + + stage.querySelectorAll('[data-overlay-dialog-save]').forEach((button) => { + button.addEventListener('click', (event) => { + event.preventDefault(); + if (isAddToListOverlay) { + committedListIds.clear(); + draftListIds.forEach((value) => committedListIds.add(value)); + stage.dataset.overlaySelectedLists = Array.from(committedListIds).join(','); + } + closeStageDialogs({ resetAddToListDraft: true }); + }); + }); + stage.querySelectorAll('.sg-sandwich-menu-wrap').forEach((wrap) => { const button = wrap.querySelector('.sg-sandwich-button'); const panel = wrap.querySelector('.sg-sandwich-menu-panel'); diff --git a/styles/27-patterns-delete-confirmation.css b/styles/27-patterns-delete-confirmation.css index 1b498e3..001f9c8 100644 --- a/styles/27-patterns-delete-confirmation.css +++ b/styles/27-patterns-delete-confirmation.css @@ -64,7 +64,7 @@ background: var(--surface-delete-confirmation-overlay); } -.sg-delete-confirmation-pattern__floating-card > .sg-delete-confirmation-pattern__body:has(+ .sg-delete-confirmation-pattern__create-list-segment[hidden]) { +.sg-delete-confirmation-pattern__actions-segment { border-bottom-left-radius: var(--radius-card); border-bottom-right-radius: var(--radius-card); } @@ -156,6 +156,10 @@ margin-top: var(--layout-delete-confirmation-actions-offset-block-start); } +.sg-delete-confirmation-pattern__actions--footer { + margin-top: 0; +} + @media (max-width: 48rem) { .sg-delete-confirmation-pattern__actions { flex-wrap: wrap;