From 9f1870005e401d02a43c1f22f804e8f097fcc95e Mon Sep 17 00:00:00 2001 From: MaximeNoirhomme Date: Wed, 28 May 2025 13:15:52 +0200 Subject: [PATCH 1/4] [ADD] awesome_owl: it adds basics for a todo list --- awesome_owl/static/src/card/card.js | 10 +++++++ awesome_owl/static/src/card/card.xml | 11 +++++++ awesome_owl/static/src/counter/counter.js | 17 +++++++++++ awesome_owl/static/src/counter/counter.xml | 9 ++++++ awesome_owl/static/src/playground.js | 18 +++++++++-- awesome_owl/static/src/playground.xml | 18 ++++++----- awesome_owl/static/src/todo_list/todo_item.js | 11 +++++++ .../static/src/todo_list/todo_item.xml | 8 +++++ awesome_owl/static/src/todo_list/todo_list.js | 30 +++++++++++++++++++ .../static/src/todo_list/todo_list.xml | 9 ++++++ 10 files changed, 132 insertions(+), 9 deletions(-) create mode 100644 awesome_owl/static/src/card/card.js create mode 100644 awesome_owl/static/src/card/card.xml create mode 100644 awesome_owl/static/src/counter/counter.js create mode 100644 awesome_owl/static/src/counter/counter.xml create mode 100644 awesome_owl/static/src/todo_list/todo_item.js create mode 100644 awesome_owl/static/src/todo_list/todo_item.xml create mode 100644 awesome_owl/static/src/todo_list/todo_list.js create mode 100644 awesome_owl/static/src/todo_list/todo_list.xml diff --git a/awesome_owl/static/src/card/card.js b/awesome_owl/static/src/card/card.js new file mode 100644 index 00000000000..fcaaba2b3ee --- /dev/null +++ b/awesome_owl/static/src/card/card.js @@ -0,0 +1,10 @@ +import { Component } from "@odoo/owl"; + +export class Card extends Component { + static template = "awesome_owl.Card"; + + static props = { + title: String, + content: String, + }; +} diff --git a/awesome_owl/static/src/card/card.xml b/awesome_owl/static/src/card/card.xml new file mode 100644 index 00000000000..dd3321ca615 --- /dev/null +++ b/awesome_owl/static/src/card/card.xml @@ -0,0 +1,11 @@ + + + +
+
+
+

+
+
+
+
diff --git a/awesome_owl/static/src/counter/counter.js b/awesome_owl/static/src/counter/counter.js new file mode 100644 index 00000000000..88e9ae00982 --- /dev/null +++ b/awesome_owl/static/src/counter/counter.js @@ -0,0 +1,17 @@ +import { Component, useState } from "@odoo/owl"; + +export class Counter extends Component { + static template = "awesome_owl.counter"; + + static props = { + validation_fct: { type: Function, optional: true }, + }; + setup() { + this.state = useState({ value: 0 }); + } + + increment() { + this.state.value++; + this.props.validation_fct?.call(); + } +} diff --git a/awesome_owl/static/src/counter/counter.xml b/awesome_owl/static/src/counter/counter.xml new file mode 100644 index 00000000000..2fabde0843a --- /dev/null +++ b/awesome_owl/static/src/counter/counter.xml @@ -0,0 +1,9 @@ + + + +
+

Counter:

+ +
+
+
diff --git a/awesome_owl/static/src/playground.js b/awesome_owl/static/src/playground.js index 657fb8b07bb..3953d603e9a 100644 --- a/awesome_owl/static/src/playground.js +++ b/awesome_owl/static/src/playground.js @@ -1,7 +1,21 @@ /** @odoo-module **/ -import { Component } from "@odoo/owl"; +import { Component, useState } from "@odoo/owl"; +import { Counter } from "./counter/counter"; +import { Card } from "./card/card"; +import { TodoList } from "./todo_list/todo_list"; export class Playground extends Component { - static template = "awesome_owl.playground"; + static template = "awesome_owl.playground"; + + static components = { Counter, Card, TodoList }; + + setup() { + this.state = useState({ sum: 0 }); + this.incrSum = this.incrSum.bind(this); + } + + incrSum() { + this.state.sum++; + } } diff --git a/awesome_owl/static/src/playground.xml b/awesome_owl/static/src/playground.xml index 4fb905d59f9..6c99bb354de 100644 --- a/awesome_owl/static/src/playground.xml +++ b/awesome_owl/static/src/playground.xml @@ -1,10 +1,14 @@ - - -
- hello world -
-
- + +
+
Hello world
+
+
+ + +
the sum is
+
+
+
diff --git a/awesome_owl/static/src/todo_list/todo_item.js b/awesome_owl/static/src/todo_list/todo_item.js new file mode 100644 index 00000000000..b851daa0ee5 --- /dev/null +++ b/awesome_owl/static/src/todo_list/todo_item.js @@ -0,0 +1,11 @@ +import { Component } from "@odoo/owl"; +export class TodoItem extends Component { + static template = "awesome_owl.TodoItem"; + + static props = { + todo: { + type: Object, + shape: { id: Number, description: String, isCompleted: Boolean }, + }, + }; +} diff --git a/awesome_owl/static/src/todo_list/todo_item.xml b/awesome_owl/static/src/todo_list/todo_item.xml new file mode 100644 index 00000000000..f449c8f8f4a --- /dev/null +++ b/awesome_owl/static/src/todo_list/todo_item.xml @@ -0,0 +1,8 @@ + + + +
+

,

+
+
+
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..794a1b8efef --- /dev/null +++ b/awesome_owl/static/src/todo_list/todo_list.js @@ -0,0 +1,30 @@ +import { Component, useState } from "@odoo/owl"; +import { TodoItem } from "./todo_item"; +export class TodoList extends Component { + static template = "awesome_owl.TodoList"; + + static components = { TodoItem }; + + setup() { + this.state = useState({ + todos: [], + curr_id: 0, + }); + } + + add_todo(ev) { + if (ev.keyCode === 13) { + var value = ev.target.value.trim(); + if (value !== "") { + this.state.todos.push({ + id: this.state.curr_id, + description: value, + isCompleted: false, + }); + } + ev.target.value = ""; + + this.state.curr_id++; + } + } +} 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..40c92e46704 --- /dev/null +++ b/awesome_owl/static/src/todo_list/todo_list.xml @@ -0,0 +1,9 @@ + + + + + +
+
+
+
From 298e0e198f00af89d84c4037d177ee54a258739a Mon Sep 17 00:00:00 2001 From: MaximeNoirhomme Date: Fri, 30 May 2025 09:30:04 +0200 Subject: [PATCH 2/4] [ADD] awesome_owl: it adds CRUD operation to the todo --- awesome_owl/__init__.py | 2 +- awesome_owl/static/src/card/card.js | 18 ++++++++++++++++-- awesome_owl/static/src/card/card.xml | 6 +++++- awesome_owl/static/src/playground.xml | 6 +++--- awesome_owl/static/src/todo_list/todo_item.js | 9 +++++++++ awesome_owl/static/src/todo_list/todo_item.xml | 7 ++++++- awesome_owl/static/src/todo_list/todo_list.js | 15 ++++++++++++++- awesome_owl/static/src/todo_list/todo_list.xml | 4 ++-- awesome_owl/static/src/utils/useAutoFocus.js | 13 +++++++++++++ 9 files changed, 69 insertions(+), 11 deletions(-) create mode 100644 awesome_owl/static/src/utils/useAutoFocus.js diff --git a/awesome_owl/__init__.py b/awesome_owl/__init__.py index 457bae27e11..b0f26a9a602 100644 --- a/awesome_owl/__init__.py +++ b/awesome_owl/__init__.py @@ -1,3 +1,3 @@ # -*- coding: utf-8 -*- -from . import controllers \ No newline at end of file +from . import controllers diff --git a/awesome_owl/static/src/card/card.js b/awesome_owl/static/src/card/card.js index fcaaba2b3ee..5e1c5291bf2 100644 --- a/awesome_owl/static/src/card/card.js +++ b/awesome_owl/static/src/card/card.js @@ -1,10 +1,24 @@ -import { Component } from "@odoo/owl"; +import { Component, useState } from "@odoo/owl"; +import { Counter } from "../counter/counter"; export class Card extends Component { static template = "awesome_owl.Card"; + static components = { Counter }; + + setup() { + this.state = useState({ + open: true, + }); + + this.flip = this.flip.bind(this); + } + static props = { title: String, - content: String, }; + + flip() { + this.state.open = !this.state.open; + } } diff --git a/awesome_owl/static/src/card/card.xml b/awesome_owl/static/src/card/card.xml index dd3321ca615..e958e13438a 100644 --- a/awesome_owl/static/src/card/card.xml +++ b/awesome_owl/static/src/card/card.xml @@ -3,8 +3,12 @@
+
-

+

+ + +

diff --git a/awesome_owl/static/src/playground.xml b/awesome_owl/static/src/playground.xml index 6c99bb354de..a64380e4b81 100644 --- a/awesome_owl/static/src/playground.xml +++ b/awesome_owl/static/src/playground.xml @@ -1,12 +1,12 @@ -
+
Hello world
- - + +
the sum is
diff --git a/awesome_owl/static/src/todo_list/todo_item.js b/awesome_owl/static/src/todo_list/todo_item.js index b851daa0ee5..2e3bb2de21a 100644 --- a/awesome_owl/static/src/todo_list/todo_item.js +++ b/awesome_owl/static/src/todo_list/todo_item.js @@ -2,10 +2,19 @@ import { Component } from "@odoo/owl"; export class TodoItem extends Component { static template = "awesome_owl.TodoItem"; + setup() { + this.toggleState = this.toggleState.bind(this); + } + static props = { todo: { type: Object, shape: { id: Number, description: String, isCompleted: Boolean }, }, + remove_fct: { type: Function }, }; + + toggleState() { + this.props.todo.isCompleted = !this.props.todo.isCompleted; + } } diff --git a/awesome_owl/static/src/todo_list/todo_item.xml b/awesome_owl/static/src/todo_list/todo_item.xml index f449c8f8f4a..2ae350057c1 100644 --- a/awesome_owl/static/src/todo_list/todo_item.xml +++ b/awesome_owl/static/src/todo_list/todo_item.xml @@ -2,7 +2,12 @@
-

,

+

+ + , + + +

diff --git a/awesome_owl/static/src/todo_list/todo_list.js b/awesome_owl/static/src/todo_list/todo_list.js index 794a1b8efef..9776f4e9e13 100644 --- a/awesome_owl/static/src/todo_list/todo_list.js +++ b/awesome_owl/static/src/todo_list/todo_list.js @@ -1,5 +1,6 @@ import { Component, useState } from "@odoo/owl"; import { TodoItem } from "./todo_item"; +import { useAutofocus } from "../utils/useAutoFocus"; export class TodoList extends Component { static template = "awesome_owl.TodoList"; @@ -10,11 +11,14 @@ export class TodoList extends Component { todos: [], curr_id: 0, }); + + this.inputRef = useAutofocus("input"); + this.delete_todo = this.delete_todo.bind(this); } add_todo(ev) { if (ev.keyCode === 13) { - var value = ev.target.value.trim(); + const value = ev.target.value.trim(); if (value !== "") { this.state.todos.push({ id: this.state.curr_id, @@ -27,4 +31,13 @@ export class TodoList extends Component { this.state.curr_id++; } } + + delete_todo(todo_to_remove_id) { + const index = this.state.todos.findIndex( + (elem) => elem.id === todo_to_remove_id + ); + if (index >= 0) { + this.state.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 index 40c92e46704..6fbcfabffaa 100644 --- a/awesome_owl/static/src/todo_list/todo_list.xml +++ b/awesome_owl/static/src/todo_list/todo_list.xml @@ -1,9 +1,9 @@ - + -
+
diff --git a/awesome_owl/static/src/utils/useAutoFocus.js b/awesome_owl/static/src/utils/useAutoFocus.js new file mode 100644 index 00000000000..6423dcc113f --- /dev/null +++ b/awesome_owl/static/src/utils/useAutoFocus.js @@ -0,0 +1,13 @@ +import { onMounted, useRef } from "@odoo/owl"; + +export function useAutofocus(refName) { + const elRef = useRef(refName); + onMounted(() => { + if (elRef.el && typeof elRef.el.focus === 'function') { + elRef.el.focus(); + } else { + console.error("The component you try to focus does not have a focus method") + } + }); + return elRef; +} From 6ebd4bdca8c520228d4dce0042590d8b02dc40ca Mon Sep 17 00:00:00 2001 From: MaximeNoirhomme Date: Fri, 30 May 2025 09:46:19 +0200 Subject: [PATCH 3/4] [FIX] awesome_owl: it adds new line after inports --- awesome_owl/static/src/todo_list/todo_item.js | 1 + awesome_owl/static/src/todo_list/todo_list.js | 1 + 2 files changed, 2 insertions(+) diff --git a/awesome_owl/static/src/todo_list/todo_item.js b/awesome_owl/static/src/todo_list/todo_item.js index 2e3bb2de21a..c3545d8e282 100644 --- a/awesome_owl/static/src/todo_list/todo_item.js +++ b/awesome_owl/static/src/todo_list/todo_item.js @@ -1,4 +1,5 @@ import { Component } from "@odoo/owl"; + export class TodoItem extends Component { static template = "awesome_owl.TodoItem"; diff --git a/awesome_owl/static/src/todo_list/todo_list.js b/awesome_owl/static/src/todo_list/todo_list.js index 9776f4e9e13..2fad3c2ee5b 100644 --- a/awesome_owl/static/src/todo_list/todo_list.js +++ b/awesome_owl/static/src/todo_list/todo_list.js @@ -1,6 +1,7 @@ import { Component, useState } from "@odoo/owl"; import { TodoItem } from "./todo_item"; import { useAutofocus } from "../utils/useAutoFocus"; + export class TodoList extends Component { static template = "awesome_owl.TodoList"; From 72cacb43b9f1e6c9d657f4536337f220e80648bb Mon Sep 17 00:00:00 2001 From: MaximeNoirhomme Date: Fri, 30 May 2025 10:36:36 +0200 Subject: [PATCH 4/4] [FIX] awesome_owl: remove hardcoded style --- awesome_owl/static/src/card/card.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/awesome_owl/static/src/card/card.xml b/awesome_owl/static/src/card/card.xml index e958e13438a..b3b0f313402 100644 --- a/awesome_owl/static/src/card/card.xml +++ b/awesome_owl/static/src/card/card.xml @@ -1,7 +1,7 @@ -
+