Jenot
+
+
+ +
+ +") + "
"; -} - customElements.define("editable-area", EditableArea); -// task-list component +// task-list-item component class TaskListItem extends HTMLElement { static observedAttributes = ["checked"]; @@ -121,6 +119,8 @@ class TaskListItem extends HTMLElement { this.contentElement.value = text; this.removeButton = this.querySelector(".remove button"); + this.handleElement.addEventListener("click", (e) => e.preventDefault()); + this.removeButton.addEventListener("click", (e) => { this.dispatchEvent(new Event("removeTaskWithButton", { bubbles: true })); e.preventDefault(); @@ -153,6 +153,10 @@ class TaskListItem extends HTMLElement { } }); + this.checkboxElement.addEventListener("change", () => + this.dispatchEvent(new Event("contentChange", { bubbles: true })), + ); + // drag and drop events this.parentNode.addEventListener("dragstart", (e) => { @@ -161,6 +165,7 @@ class TaskListItem extends HTMLElement { this.parentNode.addEventListener("dragend", () => { this.parentNode.classList.remove("dragging"); + this.dispatchEvent(new Event("contentChange", { bubbles: true })); }); this.parentNode.addEventListener("touchstart", (e) => { @@ -226,6 +231,7 @@ class TaskListItem extends HTMLElement { }); this.#updateChecked(); + this.dispatchEvent(new Event("contentChange", { bubbles: true })); } disconnectedCallback() { @@ -250,6 +256,11 @@ class TaskListItem extends HTMLElement { }; } + set value(item) { + this.checkboxElement.checked = item.checked; + this.contentElement.value = item.content; + } + focusStart() { this.contentElement.focusStart(); } @@ -268,6 +279,8 @@ class TaskListItem extends HTMLElement { customElements.define("task-list-item", TaskListItem); +// task-list component + class TaskList extends HTMLElement { dragPlaceholder = null; dragActiveElement = null; @@ -293,6 +306,8 @@ class TaskList extends HTMLElement { const currentLI = e.target.parentNode; currentLI.remove(); + + this.dispatchEvent(new Event("contentChange", { bubbles: true })); }); this.addEventListener("removeTask", (e) => { @@ -305,6 +320,7 @@ class TaskList extends HTMLElement { previousItem.focusEnd(); previousItem.append(textToAppend); currentLI.remove(); + this.dispatchEvent(new Event("contentChange", { bubbles: true })); } }); @@ -319,6 +335,7 @@ class TaskList extends HTMLElement { newLI.appendChild(newItem); currentLI.after(newLI); newItem.focusStart(); + this.dispatchEvent(new Event("contentChange", { bubbles: true })); }); this.addEventListener("moveToNextTask", (e) => { @@ -355,6 +372,26 @@ class TaskList extends HTMLElement { } }); } + + get value() { + return Array.from(this.querySelectorAll("task-list-item")).map( + (item) => item.value, + ); + } + + set value(tasks) { + this.listElement.replaceChildren(); + + tasks.forEach((task) => { + const item = html` +
") + "
"; + return stringToHTML(content, true); +} diff --git a/js/jenot.js b/js/jenot.js index b1c5ce3..d5ca8fe 100644 --- a/js/jenot.js +++ b/js/jenot.js @@ -1,8 +1,11 @@ -import { renderText } from "./components.js"; +import { renderText } from "./dom.js"; import { NoteStore } from "./store.js"; +import "./components.js" const Notes = new NoteStore("jenot-app"); +const newNote = document.querySelector("#new-note"); + Notes.addEventListener("save", render.bind(this)); Notes.reset(); @@ -26,7 +29,6 @@ Notes.saveStorage(); function render() { const notes = Notes.all(); const notesContainer = document.querySelector("#notes"); - notesContainer.textContent = ""; notes.forEach((note) => { const container = document.createElement("div"); @@ -35,7 +37,7 @@ function render() { container.classList.add("readonly"); if (note.type === "note") { - container.innerHTML = renderText(note.content); + container.replaceChildren(...renderText(note.content)); } else if (note.type === "tasklist") { const list = document.createElement("ul"); @@ -45,7 +47,7 @@ function render() { check.textContent = task.checked ? "☑" : "☐"; item.appendChild(check); const itemContent = document.createElement("p"); - itemContent.innerHTML = renderText(task.content); + itemContent.replaceChildren(...renderText(task.content)); item.appendChild(itemContent); list.append(item); }); @@ -53,6 +55,6 @@ function render() { container.appendChild(list); } - notesContainer.appendChild(container); + notesContainer.replaceChildren(container); }); } diff --git a/style.css b/style.css index aec4c26..8d91f6d 100644 --- a/style.css +++ b/style.css @@ -147,6 +147,18 @@ task-list ul { touch-action: none; } +/* Note form */ + +note-form .content { + min-height: 2.5em; +} + +note-form .note { + display: flex; + flex-direction: column; + gap: 8px; +} + /* Styles */ * { @@ -181,3 +193,7 @@ div#content { align-items: baseline; margin-bottom: 4px; } + +.hidden { + display: none; +}