From 58ce1a2ca8f15c9650dab50cf6a153ee18881f2d Mon Sep 17 00:00:00 2001 From: Rich Boakes Date: Thu, 21 Sep 2023 10:36:36 +0100 Subject: [PATCH] Save to localstorage on any update, restore on reload, ctrl+escape to reset all content (with confirm box) --- script.js | 76 +++++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 65 insertions(+), 11 deletions(-) diff --git a/script.js b/script.js index 74a2e65..abe7623 100644 --- a/script.js +++ b/script.js @@ -1,18 +1,72 @@ -const gridItems = document.querySelectorAll('.grid-item'); +const el = {}; function toggleItem(event) { - if (event.metaKey || event.shiftKey) { - const toggleThis = event.target.closest('.grid-item'); - toggleThis?.classList.toggle('lo'); - } + event.preventDefault(); + const gridItem = event.target.closest('.grid-item'); + if (event.metaKey || event.shiftKey) { + gridItem?.classList.toggle('lo'); + } + + const editableChild = gridItem.querySelector('[contenteditable]'); + if (editableChild) { + editableChild.focus(); + } + } -for (const item of gridItems) { - item.addEventListener('click', toggleItem); +function saveContent() { + const mmc = {}; + for (const element of el.editableElements) { + const parentWithId = element.closest('[id]'); + if (parentWithId) { + mmc[parentWithId.id] = element.innerHTML; + } + } + localStorage.setItem('mmc', JSON.stringify(mmc)); } -document.addEventListener('keydown', event => { - if (event.key === 'Escape') { - document.activeElement.blur(); +function loadContent() { + const mmc = JSON.parse( localStorage.getItem('mmc') ?? "[]" ); + for (const element of el.editableElements) { + const parentWithId = element.closest('[id]'); + if (parentWithId && mmc.hasOwnProperty(parentWithId.id)) { + element.innerHTML = mmc[parentWithId.id]; } - }); \ No newline at end of file + } +} + +function keyboardHandler(event) { + if (event.ctrlKey && event.key === 'Escape') { + const confirmed = confirm('Are you sure you want to reset the page?'); + if (confirmed) { + for (const element of el.editableElements) { + element.innerHTML = ''; + } + saveContent(); + location.reload(); + } + } else if (event.key === 'Escape') { + document.activeElement.blur(); + } +} + +function prep() { + el.gridItems = document.querySelectorAll('.grid-item'); + el.editableElements = document.querySelectorAll('[contenteditable]'); + + loadContent(); + + for (const item of el.gridItems) { + item.addEventListener('click', toggleItem); + } + + for (const element of el.editableElements) { + element.addEventListener('input', saveContent); + } + + document.addEventListener('keydown', keyboardHandler); + +} + +window.addEventListener('load', prep); +