1
0
mirror of https://github.com/jaandrle/deka-dom-el synced 2024-11-27 18:29:36 +01:00
deka-dom-el/docs/components/examples/signals/actions-todos.js

57 lines
1.4 KiB
JavaScript
Raw Normal View History

import { S } from "deka-dom-el/signals";
const todos= S([], {
2023-11-29 18:25:21 +01:00
push(item){
this.value.push(S(item));
2023-11-29 18:25:21 +01:00
},
pop(){
const removed= this.value.pop();
if(removed) S.clear(removed);
2023-11-29 18:25:21 +01: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*/:
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*/:
S.action(todos, "pop");
2023-11-29 18:25:21 +01:00
break;
}
});
document.body.append(
el("ul").append(
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: "Todos 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
)
}