- hello world
+
+
+
+
+ sum:
+
+
+
+
+
+ Hello Slots
+
+
-
diff --git a/awesome_owl/static/src/todo_item/todo_item.js b/awesome_owl/static/src/todo_item/todo_item.js
new file mode 100644
index 00000000000..d08fbbbd8fb
--- /dev/null
+++ b/awesome_owl/static/src/todo_item/todo_item.js
@@ -0,0 +1,15 @@
+import { Component } from '@odoo/owl';
+
+export class TodoItem extends Component {
+ static template = 'awesome_owl.todo_item';
+
+ static props = {
+ todo: {
+ id: Number,
+ description: String,
+ isCompleted: Boolean,
+ },
+ toggleState: Function,
+ removeTodo: Function,
+ };
+}
diff --git a/awesome_owl/static/src/todo_item/todo_item.xml b/awesome_owl/static/src/todo_item/todo_item.xml
new file mode 100644
index 00000000000..144974dee8d
--- /dev/null
+++ b/awesome_owl/static/src/todo_item/todo_item.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+ .
+
+
+
+
+
+
diff --git a/awesome_owl/static/src/todo_list/todo_list.js b/awesome_owl/static/src/todo_list/todo_list.js
new file mode 100644
index 00000000000..a5075ad519b
--- /dev/null
+++ b/awesome_owl/static/src/todo_list/todo_list.js
@@ -0,0 +1,40 @@
+import { Component, useState } from '@odoo/owl';
+import { TodoItem } from '../todo_item/todo_item';
+import { useAutoFocus } from '../utils';
+
+export class TodoList extends Component {
+ static template = 'awesome_owl.todo_list';
+ static components = { TodoItem };
+
+ setup() {
+ this.todos = useState([]);
+ this.lastId = 1;
+ this.inputRef = useAutoFocus('taskInput');
+ }
+
+ addTodo(ev) {
+ const value = ev.target.value.trim();
+ if (value && ev.keyCode === 13) {
+ this.todos.push({
+ id: this.lastId++,
+ description: value,
+ isCompleted: false,
+ });
+ ev.target.value = '';
+ }
+ }
+
+ toggleState(id) {
+ const todo = this.todos.find((todo) => todo.id === id);
+ if (todo) {
+ todo.isCompleted = !todo.isCompleted;
+ }
+ }
+
+ removeTodo(id) {
+ const index = this.todos.findIndex((todo) => todo.id === id);
+ if (index >= 0) {
+ this.todos.splice(index, 1);
+ }
+ }
+}
diff --git a/awesome_owl/static/src/todo_list/todo_list.xml b/awesome_owl/static/src/todo_list/todo_list.xml
new file mode 100644
index 00000000000..411118d1ae9
--- /dev/null
+++ b/awesome_owl/static/src/todo_list/todo_list.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/awesome_owl/static/src/utils.js b/awesome_owl/static/src/utils.js
new file mode 100644
index 00000000000..2c7493954ee
--- /dev/null
+++ b/awesome_owl/static/src/utils.js
@@ -0,0 +1,15 @@
+import { onMounted, useRef } from '@odoo/owl';
+
+function useAutoFocus(refName) {
+ const ref = useRef(refName);
+
+ onMounted(() => {
+ if (ref.el && ref.el.focus) {
+ ref.el.focus();
+ }
+ });
+
+ return ref;
+}
+
+export { useAutoFocus };