2024-05-22 21:43:49 +02:00
|
|
|
|
import { S } from "deka-dom-el/signals";
|
|
|
|
|
const todos= S([], {
|
2023-11-29 18:25:21 +01:00
|
|
|
|
push(item){
|
2024-05-22 21:43:49 +02:00
|
|
|
|
this.value.push(S(item));
|
2023-11-29 18:25:21 +01:00
|
|
|
|
},
|
|
|
|
|
pop(){
|
|
|
|
|
const removed= this.value.pop();
|
2024-05-22 21:43:49 +02:00
|
|
|
|
if(removed) S.clear(removed);
|
2023-11-29 18:25:21 +01:00
|
|
|
|
},
|
2024-05-22 21:43:49 +02:00
|
|
|
|
[S.symbols.onclear](){ // this covers `O.clear(todos)`
|
|
|
|
|
S.clear(...this.value);
|
2023-11-29 18:25:21 +01:00
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
import { el, on } from "deka-dom-el";
|
|
|
|
|
/** @type {ddeElementAddon<HTMLFormElement>} */
|
|
|
|
|
const onsubmit= on("submit", function(event){
|
|
|
|
|
event.preventDefault();
|
|
|
|
|
const data= new FormData(this);
|
|
|
|
|
switch (data.get("op")){
|
|
|
|
|
case "A"/*dd*/:
|
2024-05-22 21:43:49 +02:00
|
|
|
|
S.action(todos, "push", data.get("todo"));
|
2023-11-29 18:25:21 +01:00
|
|
|
|
break;
|
|
|
|
|
case "E"/*dit*/: {
|
|
|
|
|
const last= todos().at(-1);
|
|
|
|
|
if(!last) break;
|
|
|
|
|
last(data.get("todo"));
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
case "R"/*emove*/:
|
2024-05-22 21:43:49 +02:00
|
|
|
|
S.action(todos, "pop");
|
2023-11-29 18:25:21 +01:00
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
document.body.append(
|
|
|
|
|
el("ul").append(
|
2024-05-22 21:43:49 +02:00
|
|
|
|
S.el(todos, todos=>
|
2023-11-29 18:25:21 +01:00
|
|
|
|
todos.map(textContent=> el("li", textContent)))
|
|
|
|
|
),
|
|
|
|
|
el("form", null, onsubmit).append(
|
|
|
|
|
el("input", { type: "text", name: "todo", placeholder: "Todo’s text" }),
|
|
|
|
|
el(radio, { textContent: "Add", checked: true }),
|
|
|
|
|
el(radio, { textContent: "Edit last" }),
|
|
|
|
|
el(radio, { textContent: "Remove" }),
|
|
|
|
|
el("button", "Submit")
|
|
|
|
|
)
|
|
|
|
|
);
|
|
|
|
|
document.head.append(
|
|
|
|
|
el("style", "form{ display: flex; flex-flow: column nowrap; }")
|
|
|
|
|
);
|
|
|
|
|
function radio({ textContent, checked= false }){
|
|
|
|
|
return el("label").append(
|
|
|
|
|
el("input", { type: "radio", name: "op", value: textContent[0], checked }),
|
|
|
|
|
" ",textContent
|
|
|
|
|
)
|
|
|
|
|
}
|