diff --git a/website_airproof/__init__.py b/__init__.py
similarity index 100%
rename from website_airproof/__init__.py
rename to __init__.py
diff --git a/addons/__init__.py b/addons/__init__.py
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/awesome_clicker/__init__.py b/addons/awesome_clicker/__init__.py
similarity index 100%
rename from awesome_clicker/__init__.py
rename to addons/awesome_clicker/__init__.py
diff --git a/awesome_clicker/__manifest__.py b/addons/awesome_clicker/__manifest__.py
similarity index 100%
rename from awesome_clicker/__manifest__.py
rename to addons/awesome_clicker/__manifest__.py
diff --git a/addons/awesome_dashboard/__init__.py b/addons/awesome_dashboard/__init__.py
new file mode 100644
index 00000000000..aa4d0fd63a9
--- /dev/null
+++ b/addons/awesome_dashboard/__init__.py
@@ -0,0 +1,4 @@
+# -*- coding: utf-8 -*-
+
+from . import controllers
+from . import models
diff --git a/awesome_dashboard/__manifest__.py b/addons/awesome_dashboard/__manifest__.py
similarity index 77%
rename from awesome_dashboard/__manifest__.py
rename to addons/awesome_dashboard/__manifest__.py
index a1cd72893d7..ef049a5676d 100644
--- a/awesome_dashboard/__manifest__.py
+++ b/addons/awesome_dashboard/__manifest__.py
@@ -23,7 +23,10 @@
],
'assets': {
'web.assets_backend': [
- 'awesome_dashboard/static/src/**/*',
+ 'awesome_dashboard/static/src/dashboard_action.js',
+ ],
+ 'awesome_dashboard.assets_dashboard': [
+ 'awesome_dashboard/static/src/dashboard/**/*',
],
},
'license': 'AGPL-3'
diff --git a/awesome_dashboard/__init__.py b/addons/awesome_dashboard/controllers/__init__.py
similarity index 100%
rename from awesome_dashboard/__init__.py
rename to addons/awesome_dashboard/controllers/__init__.py
diff --git a/awesome_dashboard/controllers/controllers.py b/addons/awesome_dashboard/controllers/controllers.py
similarity index 80%
rename from awesome_dashboard/controllers/controllers.py
rename to addons/awesome_dashboard/controllers/controllers.py
index 05977d3bd7f..576b9f9570c 100644
--- a/awesome_dashboard/controllers/controllers.py
+++ b/addons/awesome_dashboard/controllers/controllers.py
@@ -8,6 +8,7 @@
logger = logging.getLogger(__name__)
+
class AwesomeDashboard(http.Controller):
@http.route('/awesome_dashboard/statistics', type='jsonrpc', auth='user')
def get_statistics(self):
@@ -34,3 +35,10 @@ def get_statistics(self):
'total_amount': random.randint(100, 1000)
}
+ @http.route('/awesome_dashboard/save_config', type='jsonrpc', auth='user')
+ def save_config(self, config):
+ request.env.user.dashboard_config = config
+
+ @http.route('/awesome_dashboard/load_config', type='jsonrpc', auth='user')
+ def load_config(self):
+ return request.env.user.dashboard_config
diff --git a/addons/awesome_dashboard/models/__init__.py b/addons/awesome_dashboard/models/__init__.py
new file mode 100644
index 00000000000..8835165330f
--- /dev/null
+++ b/addons/awesome_dashboard/models/__init__.py
@@ -0,0 +1 @@
+from . import res_users
diff --git a/addons/awesome_dashboard/models/res_users.py b/addons/awesome_dashboard/models/res_users.py
new file mode 100644
index 00000000000..f9e7bfd5178
--- /dev/null
+++ b/addons/awesome_dashboard/models/res_users.py
@@ -0,0 +1,7 @@
+from odoo import models, fields
+
+
+class ResUsers(models.Model):
+ _inherit = 'res.users'
+
+ dashboard_config = fields.Char(string='Dashboard Configuration', default='[]')
diff --git a/addons/awesome_dashboard/static/src/dashboard/charts/pie_chart/pie_chart.js b/addons/awesome_dashboard/static/src/dashboard/charts/pie_chart/pie_chart.js
new file mode 100644
index 00000000000..c3054ee240a
--- /dev/null
+++ b/addons/awesome_dashboard/static/src/dashboard/charts/pie_chart/pie_chart.js
@@ -0,0 +1,30 @@
+import {Component, onWillStart, onMounted, useRef} from "@odoo/owl";
+import {loadJS} from "@web/core/assets";
+
+
+export class PieChart extends Component {
+ static template = "awesome_dashboard.pie_chart";
+ static props = {
+ data: Object,
+ }
+
+ setup() {
+ this.canvasRef = useRef("canvas");
+
+ onWillStart(async () => {
+ await loadJS("/web/static/lib/Chart/Chart.js")
+ })
+
+ onMounted(() => {
+ new Chart(this.canvasRef.el, {
+ type: "pie",
+ data: {
+ labels: Object.keys(this.props.data),
+ datasets: [{
+ data: Object.values(this.props.data),
+ }]
+ },
+ })
+ })
+ }
+}
diff --git a/awesome_dashboard/static/src/dashboard.xml b/addons/awesome_dashboard/static/src/dashboard/charts/pie_chart/pie_chart.xml
similarity index 55%
rename from awesome_dashboard/static/src/dashboard.xml
rename to addons/awesome_dashboard/static/src/dashboard/charts/pie_chart/pie_chart.xml
index 1a2ac9a2fed..cf6298c4d6e 100644
--- a/awesome_dashboard/static/src/dashboard.xml
+++ b/addons/awesome_dashboard/static/src/dashboard/charts/pie_chart/pie_chart.xml
@@ -1,8 +1,7 @@
-
-
- hello dashboard
+
+
diff --git a/addons/awesome_dashboard/static/src/dashboard/charts/pie_chart_card/pie_chart_card.js b/addons/awesome_dashboard/static/src/dashboard/charts/pie_chart_card/pie_chart_card.js
new file mode 100644
index 00000000000..f76913b1308
--- /dev/null
+++ b/addons/awesome_dashboard/static/src/dashboard/charts/pie_chart_card/pie_chart_card.js
@@ -0,0 +1,11 @@
+import {Component} from "@odoo/owl";
+import {PieChart} from "../pie_chart/pie_chart";
+
+export class PieChartCard extends Component {
+ static template = "awesome_dashboard.pie_chart_card";
+ static props = {
+ title: {type: String, optional: true},
+ data: {type: Object},
+ };
+ static components = {PieChart}
+}
diff --git a/addons/awesome_dashboard/static/src/dashboard/charts/pie_chart_card/pie_chart_card.xml b/addons/awesome_dashboard/static/src/dashboard/charts/pie_chart_card/pie_chart_card.xml
new file mode 100644
index 00000000000..555cacba26d
--- /dev/null
+++ b/addons/awesome_dashboard/static/src/dashboard/charts/pie_chart_card/pie_chart_card.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/addons/awesome_dashboard/static/src/dashboard/config_dialog/config_dialog.js b/addons/awesome_dashboard/static/src/dashboard/config_dialog/config_dialog.js
new file mode 100644
index 00000000000..6da0cdefbae
--- /dev/null
+++ b/addons/awesome_dashboard/static/src/dashboard/config_dialog/config_dialog.js
@@ -0,0 +1,36 @@
+import {Component, useState} from "@odoo/owl";
+import {Dialog} from "@web/core/dialog/dialog";
+import {rpc} from "@web/core/network/rpc";
+
+export class ConfigDialog extends Component {
+ static template = "awesome_dashboard.config_dialog";
+ static props = {
+ items: {type: Array},
+ close: {type: Function},
+ onApply: {type: Function},
+ disabledItems: {type: Array},
+ };
+ static components = {Dialog}
+
+ setup() {
+ this.state = useState({
+ disabledItems: [...this.props.disabledItems]
+ })
+ }
+
+ async apply() {
+ await rpc("/awesome_dashboard/save_config", {
+ config: JSON.stringify(this.state.disabledItems)
+ });
+ this.props.onApply(this.state.disabledItems);
+ this.props.close();
+ }
+
+ toggleItem(id, isChecked) {
+ if (isChecked) {
+ this.state.disabledItems = this.state.disabledItems.filter(i => i !== id);
+ } else {
+ this.state.disabledItems = [...this.state.disabledItems, id];
+ }
+ }
+}
diff --git a/addons/awesome_dashboard/static/src/dashboard/config_dialog/config_dialog.xml b/addons/awesome_dashboard/static/src/dashboard/config_dialog/config_dialog.xml
new file mode 100644
index 00000000000..3078019890c
--- /dev/null
+++ b/addons/awesome_dashboard/static/src/dashboard/config_dialog/config_dialog.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
diff --git a/addons/awesome_dashboard/static/src/dashboard/dashboard/dashboard.js b/addons/awesome_dashboard/static/src/dashboard/dashboard/dashboard.js
new file mode 100644
index 00000000000..5ea33b54438
--- /dev/null
+++ b/addons/awesome_dashboard/static/src/dashboard/dashboard/dashboard.js
@@ -0,0 +1,62 @@
+import {Component, useState, onWillStart} from "@odoo/owl";
+import {registry} from "@web/core/registry";
+import {Layout} from "@web/search/layout";
+import {useService} from "@web/core/utils/hooks";
+import {DashboardItem} from "../dashboard_item/dashboard_item";
+import {PieChart} from "../charts/pie_chart/pie_chart";
+import "./dashboard_items";
+import {PieChartCard} from "../charts/pie_chart_card/pie_chart_card";
+import {NumberCard} from "../number_card/number_card";
+import {ConfigDialog} from "../config_dialog/config_dialog";
+import {rpc} from "@web/core/network/rpc";
+
+
+class AwesomeDashboard extends Component {
+ static template = "awesome_dashboard.AwesomeDashboard";
+ static components = {Layout, DashboardItem, PieChart, PieChartCard, NumberCard, ConfigDialog};
+
+
+ setup() {
+ this.action = useService("action");
+ const {statistics} = useService("awesome_dashboard.statistics");
+ this.statistics = useState(statistics);
+ this.items = registry.category("awesome_dashboard").getAll();
+ this.dialog = useService("dialog")
+ this.state = useState({disabledItems: []})
+
+ onWillStart(async () => {
+ const config = await rpc("/awesome_dashboard/load_config");
+ this.state.disabledItems = JSON.parse(config || "[]");
+ });
+
+ }
+
+ openCustomerView() {
+ this.action.doAction("base.action_partner_form");
+ }
+
+ openLeads() {
+ this.action.doAction({
+ type: "ir.actions.act_window",
+ res_model: "crm.lead",
+ views: [[false, "list"], [false, "form"]],
+ name: "All leads",
+ });
+ }
+
+ get visibleItems() {
+ return this.items.filter(item => !this.state.disabledItems.includes(item.description));
+ }
+
+ openSettings() {
+ this.dialog.add(ConfigDialog, {
+ items: this.items,
+ disabledItems: this.state.disabledItems,
+ onApply: (disabledItems) => {
+ this.state.disabledItems = disabledItems;
+ }
+ });
+ }
+}
+
+registry.category("lazy_components").add("AwesomeDashboard", AwesomeDashboard);
diff --git a/addons/awesome_dashboard/static/src/dashboard/dashboard/dashboard.scss b/addons/awesome_dashboard/static/src/dashboard/dashboard/dashboard.scss
new file mode 100644
index 00000000000..26a4df52a33
--- /dev/null
+++ b/addons/awesome_dashboard/static/src/dashboard/dashboard/dashboard.scss
@@ -0,0 +1,9 @@
+.o_dashboard {
+ background-color: grey;
+
+ @media (max-width: 768px) {
+ .card {
+ width: 100% !important;
+ }
+ }
+}
diff --git a/addons/awesome_dashboard/static/src/dashboard/dashboard/dashboard.xml b/addons/awesome_dashboard/static/src/dashboard/dashboard/dashboard.xml
new file mode 100644
index 00000000000..5a0f53839d3
--- /dev/null
+++ b/addons/awesome_dashboard/static/src/dashboard/dashboard/dashboard.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/addons/awesome_dashboard/static/src/dashboard/dashboard/dashboard_items.js b/addons/awesome_dashboard/static/src/dashboard/dashboard/dashboard_items.js
new file mode 100644
index 00000000000..42a88854560
--- /dev/null
+++ b/addons/awesome_dashboard/static/src/dashboard/dashboard/dashboard_items.js
@@ -0,0 +1,57 @@
+import {NumberCard} from "../number_card/number_card";
+import {PieChartCard} from "../charts/pie_chart_card/pie_chart_card";
+import {registry} from "@web/core/registry";
+import {_t} from "@web/core/l10n/translation";
+
+
+registry.category("awesome_dashboard").add("average_quantity", {
+ description: _t("Average amount of t-shirt by order this month"),
+ Component: NumberCard,
+ size: 1.5,
+ props: (data) => ({
+ title: _t("Average amount of t-shirt by order this month"),
+ value: data.average_quantity,
+ })
+});
+registry.category("awesome_dashboard").add("average_time", {
+ description: _t("Average time for an order to go from 'new' to 'sent' or 'cancelled'"),
+ Component: NumberCard,
+ size: 2,
+ props: (data) => ({
+ title: _t("Average time for an order to go from 'new' to 'sent' or 'cancelled'"),
+ value: data.average_time,
+ })
+});
+registry.category("awesome_dashboard").add("nb_new_orders", {
+ description: _t("Number of new orders this month"),
+ Component: NumberCard,
+ props: (data) => ({
+ title: _t("Number of new orders this month"),
+ value: data.nb_new_orders,
+ })
+});
+registry.category("awesome_dashboard").add("nb_cancelled_orders", {
+ description: _t("Number of cancelled orders this month"),
+ Component: NumberCard,
+ props: (data) => ({
+ title: _t("Number of cancelled orders this month"),
+ value: data.nb_cancelled_orders,
+ })
+});
+registry.category("awesome_dashboard").add("total_amount", {
+ description: _t("Total amount of new orders this month"),
+ Component: NumberCard,
+ props: (data) => ({
+ title: _t("Total amount of new orders this month"),
+ value: data.total_amount,
+ })
+});
+registry.category("awesome_dashboard").add("orders_by_size", {
+ id: "orders_by_size",
+ description: _t("Shirt orders by size"),
+ Component: PieChartCard,
+ props: (data) => ({
+ data: data.orders_by_size,
+ title: _t("Shirt orders by size"),
+ })
+});
diff --git a/addons/awesome_dashboard/static/src/dashboard/dashboard_item/dashboard_item.js b/addons/awesome_dashboard/static/src/dashboard/dashboard_item/dashboard_item.js
new file mode 100644
index 00000000000..e8a409954d4
--- /dev/null
+++ b/addons/awesome_dashboard/static/src/dashboard/dashboard_item/dashboard_item.js
@@ -0,0 +1,12 @@
+import {Component} from "@odoo/owl"
+import {NumberCard} from "../number_card/number_card";
+
+
+export class DashboardItem extends Component {
+ static template = "awesome_dashboard.dashboard_item";
+ static props = {
+ size: {type: Number, optional: true, default: 1},
+ slots: {type: Object, optional: true, default: null},
+ };
+ static components = {NumberCard};
+}
diff --git a/addons/awesome_dashboard/static/src/dashboard/dashboard_item/dashboard_item.xml b/addons/awesome_dashboard/static/src/dashboard/dashboard_item/dashboard_item.xml
new file mode 100644
index 00000000000..2f8dc36fb64
--- /dev/null
+++ b/addons/awesome_dashboard/static/src/dashboard/dashboard_item/dashboard_item.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
diff --git a/addons/awesome_dashboard/static/src/dashboard/number_card/number_card.js b/addons/awesome_dashboard/static/src/dashboard/number_card/number_card.js
new file mode 100644
index 00000000000..eaea0a82f56
--- /dev/null
+++ b/addons/awesome_dashboard/static/src/dashboard/number_card/number_card.js
@@ -0,0 +1,9 @@
+import {Component} from "@odoo/owl";
+
+export class NumberCard extends Component {
+ static template = "awesome_dashboard.number_card";
+ static props = {
+ title: {type: String},
+ value: {type: Number},
+ };
+}
diff --git a/addons/awesome_dashboard/static/src/dashboard/number_card/number_card.xml b/addons/awesome_dashboard/static/src/dashboard/number_card/number_card.xml
new file mode 100644
index 00000000000..e7870cf7e55
--- /dev/null
+++ b/addons/awesome_dashboard/static/src/dashboard/number_card/number_card.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
diff --git a/addons/awesome_dashboard/static/src/dashboard/services/statistics_service.js b/addons/awesome_dashboard/static/src/dashboard/services/statistics_service.js
new file mode 100644
index 00000000000..22184c4a714
--- /dev/null
+++ b/addons/awesome_dashboard/static/src/dashboard/services/statistics_service.js
@@ -0,0 +1,22 @@
+import {registry} from "@web/core/registry";
+import {rpc} from "@web/core/network/rpc";
+import {reactive} from "@odoo/owl"
+
+
+const statisticsService = {
+ start() {
+ const statistics = reactive({});
+
+ async function loadStatistics() {
+ const data = await rpc("/awesome_dashboard/statistics");
+ Object.assign(statistics, data)
+ }
+
+ loadStatistics();
+ setInterval(loadStatistics, 10000);
+
+ return {statistics};
+ }
+}
+
+registry.category("services").add("awesome_dashboard.statistics", statisticsService);
diff --git a/addons/awesome_dashboard/static/src/dashboard_action.js b/addons/awesome_dashboard/static/src/dashboard_action.js
new file mode 100644
index 00000000000..5e8a4e3751c
--- /dev/null
+++ b/addons/awesome_dashboard/static/src/dashboard_action.js
@@ -0,0 +1,10 @@
+import {Component, xml} from "@odoo/owl";
+import {registry} from "@web/core/registry";
+import {LazyComponent} from "@web/core/assets";
+
+class DashboardAction extends Component {
+ static components = {LazyComponent};
+ static template = xml``;
+}
+
+registry.category("actions").add("awesome_dashboard.dashboard", DashboardAction);
diff --git a/awesome_dashboard/views/views.xml b/addons/awesome_dashboard/views/views.xml
similarity index 100%
rename from awesome_dashboard/views/views.xml
rename to addons/awesome_dashboard/views/views.xml
diff --git a/awesome_gallery/__init__.py b/addons/awesome_gallery/__init__.py
similarity index 100%
rename from awesome_gallery/__init__.py
rename to addons/awesome_gallery/__init__.py
diff --git a/awesome_gallery/__manifest__.py b/addons/awesome_gallery/__manifest__.py
similarity index 100%
rename from awesome_gallery/__manifest__.py
rename to addons/awesome_gallery/__manifest__.py
diff --git a/awesome_gallery/models/__init__.py b/addons/awesome_gallery/models/__init__.py
similarity index 100%
rename from awesome_gallery/models/__init__.py
rename to addons/awesome_gallery/models/__init__.py
diff --git a/awesome_gallery/models/ir_action.py b/addons/awesome_gallery/models/ir_action.py
similarity index 100%
rename from awesome_gallery/models/ir_action.py
rename to addons/awesome_gallery/models/ir_action.py
diff --git a/awesome_gallery/models/ir_ui_view.py b/addons/awesome_gallery/models/ir_ui_view.py
similarity index 100%
rename from awesome_gallery/models/ir_ui_view.py
rename to addons/awesome_gallery/models/ir_ui_view.py
diff --git a/awesome_gallery/views/views.xml b/addons/awesome_gallery/views/views.xml
similarity index 100%
rename from awesome_gallery/views/views.xml
rename to addons/awesome_gallery/views/views.xml
diff --git a/awesome_kanban/__init__.py b/addons/awesome_kanban/__init__.py
similarity index 100%
rename from awesome_kanban/__init__.py
rename to addons/awesome_kanban/__init__.py
diff --git a/awesome_kanban/__manifest__.py b/addons/awesome_kanban/__manifest__.py
similarity index 100%
rename from awesome_kanban/__manifest__.py
rename to addons/awesome_kanban/__manifest__.py
diff --git a/awesome_kanban/static/src/awesome_kanban_view.js b/addons/awesome_kanban/static/src/awesome_kanban_view.js
similarity index 100%
rename from awesome_kanban/static/src/awesome_kanban_view.js
rename to addons/awesome_kanban/static/src/awesome_kanban_view.js
diff --git a/awesome_kanban/views/views.xml b/addons/awesome_kanban/views/views.xml
similarity index 100%
rename from awesome_kanban/views/views.xml
rename to addons/awesome_kanban/views/views.xml
diff --git a/addons/awesome_owl/__init__.py b/addons/awesome_owl/__init__.py
new file mode 100644
index 00000000000..b0f26a9a602
--- /dev/null
+++ b/addons/awesome_owl/__init__.py
@@ -0,0 +1,3 @@
+# -*- coding: utf-8 -*-
+
+from . import controllers
diff --git a/awesome_owl/__manifest__.py b/addons/awesome_owl/__manifest__.py
similarity index 100%
rename from awesome_owl/__manifest__.py
rename to addons/awesome_owl/__manifest__.py
diff --git a/addons/awesome_owl/controllers/__init__.py b/addons/awesome_owl/controllers/__init__.py
new file mode 100644
index 00000000000..b0f26a9a602
--- /dev/null
+++ b/addons/awesome_owl/controllers/__init__.py
@@ -0,0 +1,3 @@
+# -*- coding: utf-8 -*-
+
+from . import controllers
diff --git a/awesome_owl/controllers/controllers.py b/addons/awesome_owl/controllers/controllers.py
similarity index 100%
rename from awesome_owl/controllers/controllers.py
rename to addons/awesome_owl/controllers/controllers.py
diff --git a/addons/awesome_owl/static/src/card/card.js b/addons/awesome_owl/static/src/card/card.js
new file mode 100644
index 00000000000..f16ff1c6007
--- /dev/null
+++ b/addons/awesome_owl/static/src/card/card.js
@@ -0,0 +1,18 @@
+//addons/awesome_owl/static/src/card/card.js
+import {Component, useState} from "@odoo/owl";
+
+export class Card extends Component {
+ static template = "awesome_owl.card";
+ static props = {
+ title: {type: String},
+ slots: {type: Object},
+ }
+
+ setup() {
+ this.state = useState({isOpen: {type: Boolean, default: true}});
+ }
+
+ toggle() {
+ this.state.isOpen = !this.state.isOpen
+ }
+}
diff --git a/addons/awesome_owl/static/src/card/card.xml b/addons/awesome_owl/static/src/card/card.xml
new file mode 100644
index 00000000000..94a3a27682f
--- /dev/null
+++ b/addons/awesome_owl/static/src/card/card.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
diff --git a/addons/awesome_owl/static/src/counter/counter.js b/addons/awesome_owl/static/src/counter/counter.js
new file mode 100644
index 00000000000..9b3bf5cd8d1
--- /dev/null
+++ b/addons/awesome_owl/static/src/counter/counter.js
@@ -0,0 +1,22 @@
+//addons/awesome_owl/static/src/counter/counter.js
+import {Component, useState} from "@odoo/owl";
+
+export class Counter extends Component {
+ static template = "awesome_owl.counter";
+ static props = {
+ onChange: {type: Function, optional: true}
+ }
+
+ setup() {
+ this.state = useState({value: 0});
+ }
+
+ increment() {
+ this.state.value++;
+
+ if (this.props.onChange) {
+ this.props.onChange();
+ }
+
+ };
+}
diff --git a/addons/awesome_owl/static/src/counter/counter.xml b/addons/awesome_owl/static/src/counter/counter.xml
new file mode 100644
index 00000000000..78ae228561f
--- /dev/null
+++ b/addons/awesome_owl/static/src/counter/counter.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+ Counter:
+
+
+
+
+
+
diff --git a/awesome_owl/static/src/main.js b/addons/awesome_owl/static/src/main.js
similarity index 52%
rename from awesome_owl/static/src/main.js
rename to addons/awesome_owl/static/src/main.js
index 1aaea902b55..3e283dd0e6a 100644
--- a/awesome_owl/static/src/main.js
+++ b/addons/awesome_owl/static/src/main.js
@@ -1,12 +1,11 @@
-import { whenReady } from "@odoo/owl";
-import { mountComponent } from "@web/env";
-import { Playground } from "./playground";
+import {whenReady} from "@odoo/owl";
+import {mountComponent} from "@web/env";
+import {Playground} from "./playground/playground";
const config = {
dev: true,
- name: "Owl Tutorial"
+ name: "Owl Tutorial"
};
// Mount the Playground component when the document.body is ready
whenReady(() => mountComponent(Playground, document.body, config));
-
diff --git a/addons/awesome_owl/static/src/playground/playground.js b/addons/awesome_owl/static/src/playground/playground.js
new file mode 100644
index 00000000000..35ba7064bcb
--- /dev/null
+++ b/addons/awesome_owl/static/src/playground/playground.js
@@ -0,0 +1,20 @@
+//addons/awesome_owl/static/src/playground/playground.js
+import {Component, markup, useState} from "@odoo/owl";
+import {Counter} from "../counter/counter";
+import {Card} from "../card/card";
+import {TodoList} from "../todo/todo_list";
+
+
+export class Playground extends Component {
+ static template = "awesome_owl.playground";
+ static components = {Counter, Card, TodoList};
+
+ setup() {
+ this.state = useState({sum: 2})
+ }
+
+ incrementSum() {
+ this.state.sum++;
+
+ }
+}
diff --git a/addons/awesome_owl/static/src/playground/playground.xml b/addons/awesome_owl/static/src/playground/playground.xml
new file mode 100644
index 00000000000..47b3a3e2b18
--- /dev/null
+++ b/addons/awesome_owl/static/src/playground/playground.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+ Total:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/addons/awesome_owl/static/src/todo/todo_item.js b/addons/awesome_owl/static/src/todo/todo_item.js
new file mode 100644
index 00000000000..68dde2d6999
--- /dev/null
+++ b/addons/awesome_owl/static/src/todo/todo_item.js
@@ -0,0 +1,12 @@
+import {Component} from "@odoo/owl"
+
+
+export class TodoItem extends Component {
+ static template = "awesome_owl.todo_item";
+
+ static props = {
+ todo: {type: Object, shape: {id: Number, description: String, isCompleted: Boolean}},
+ toggleState: {type: Function},
+ removeTodo: {type: Function},
+ }
+}
diff --git a/addons/awesome_owl/static/src/todo/todo_item.xml b/addons/awesome_owl/static/src/todo/todo_item.xml
new file mode 100644
index 00000000000..5446de26f9a
--- /dev/null
+++ b/addons/awesome_owl/static/src/todo/todo_item.xml
@@ -0,0 +1,10 @@
+
+
+
+
+ .
+
+
+
+
+
diff --git a/addons/awesome_owl/static/src/todo/todo_list.js b/addons/awesome_owl/static/src/todo/todo_list.js
new file mode 100644
index 00000000000..6c47c502bd7
--- /dev/null
+++ b/addons/awesome_owl/static/src/todo/todo_list.js
@@ -0,0 +1,36 @@
+import {Component, useState} from "@odoo/owl";
+import {TodoItem} from "./todo_item";
+import {useAutofocus} from "../utils"
+
+export class TodoList extends Component {
+ static template = "awesome_owl.todo_list";
+ static components = {TodoItem};
+ static props = {};
+
+ setup() {
+ this.todos = useState([]);
+ this.nextId = 1;
+ this.inputRef = useAutofocus();
+ };
+
+ addTodo(ev) {
+ if ((ev.keyCode === 13) && (ev.target.value.length > 0)) {
+ this.todos.push({id: this.nextId, description: ev.target.value, isCompleted: false});
+ this.nextId++;
+ ev.target.value = "";
+ }
+ };
+
+ toggleState(id) {
+ let current_todo = this.todos.find(todo => todo.id === id);
+ current_todo.isCompleted = !current_todo.isCompleted
+
+ }
+
+ removeTodo(id) {
+ const index = this.todos.findIndex((elem) => elem.id === id);
+ if (index >= 0) {
+ this.todos.splice(index, 1);
+ }
+ }
+}
diff --git a/addons/awesome_owl/static/src/todo/todo_list.xml b/addons/awesome_owl/static/src/todo/todo_list.xml
new file mode 100644
index 00000000000..f6de4a5727d
--- /dev/null
+++ b/addons/awesome_owl/static/src/todo/todo_list.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
diff --git a/addons/awesome_owl/static/src/utils.js b/addons/awesome_owl/static/src/utils.js
new file mode 100644
index 00000000000..68845007e12
--- /dev/null
+++ b/addons/awesome_owl/static/src/utils.js
@@ -0,0 +1,9 @@
+import {useRef, onMounted} from "@odoo/owl"
+
+export function useAutofocus() {
+ const ref = useRef('input');
+ onMounted(() => {
+ ref.el.focus();
+ });
+ return ref
+}
diff --git a/awesome_owl/views/templates.xml b/addons/awesome_owl/views/templates.xml
similarity index 100%
rename from awesome_owl/views/templates.xml
rename to addons/awesome_owl/views/templates.xml
diff --git a/website_airproof/README.md b/addons/website_airproof/README.md
similarity index 100%
rename from website_airproof/README.md
rename to addons/website_airproof/README.md
diff --git a/addons/website_airproof/__init__.py b/addons/website_airproof/__init__.py
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/website_airproof/__manifest__.py b/addons/website_airproof/__manifest__.py
similarity index 100%
rename from website_airproof/__manifest__.py
rename to addons/website_airproof/__manifest__.py
diff --git a/website_airproof/airproof-contact-page.jpg b/addons/website_airproof/airproof-contact-page.jpg
similarity index 100%
rename from website_airproof/airproof-contact-page.jpg
rename to addons/website_airproof/airproof-contact-page.jpg
diff --git a/website_airproof/airproof-home-page.jpg b/addons/website_airproof/airproof-home-page.jpg
similarity index 100%
rename from website_airproof/airproof-home-page.jpg
rename to addons/website_airproof/airproof-home-page.jpg
diff --git a/website_airproof/airproof-product-page.jpg b/addons/website_airproof/airproof-product-page.jpg
similarity index 100%
rename from website_airproof/airproof-product-page.jpg
rename to addons/website_airproof/airproof-product-page.jpg
diff --git a/website_airproof/airproof-shop-page.jpg b/addons/website_airproof/airproof-shop-page.jpg
similarity index 100%
rename from website_airproof/airproof-shop-page.jpg
rename to addons/website_airproof/airproof-shop-page.jpg
diff --git a/website_airproof/data/gradients.xml b/addons/website_airproof/data/gradients.xml
similarity index 100%
rename from website_airproof/data/gradients.xml
rename to addons/website_airproof/data/gradients.xml
diff --git a/website_airproof/data/images.xml b/addons/website_airproof/data/images.xml
similarity index 100%
rename from website_airproof/data/images.xml
rename to addons/website_airproof/data/images.xml
diff --git a/website_airproof/data/menu.xml b/addons/website_airproof/data/menu.xml
similarity index 100%
rename from website_airproof/data/menu.xml
rename to addons/website_airproof/data/menu.xml
diff --git a/website_airproof/data/pages/contact.xml b/addons/website_airproof/data/pages/contact.xml
similarity index 100%
rename from website_airproof/data/pages/contact.xml
rename to addons/website_airproof/data/pages/contact.xml
diff --git a/website_airproof/data/pages/home.xml b/addons/website_airproof/data/pages/home.xml
similarity index 100%
rename from website_airproof/data/pages/home.xml
rename to addons/website_airproof/data/pages/home.xml
diff --git a/website_airproof/data/presets.xml b/addons/website_airproof/data/presets.xml
similarity index 100%
rename from website_airproof/data/presets.xml
rename to addons/website_airproof/data/presets.xml
diff --git a/website_airproof/data/shapes.xml b/addons/website_airproof/data/shapes.xml
similarity index 100%
rename from website_airproof/data/shapes.xml
rename to addons/website_airproof/data/shapes.xml
diff --git a/website_airproof/data/website.xml b/addons/website_airproof/data/website.xml
similarity index 100%
rename from website_airproof/data/website.xml
rename to addons/website_airproof/data/website.xml
diff --git a/website_airproof/i18n/fr_BE.po b/addons/website_airproof/i18n/fr_BE.po
similarity index 100%
rename from website_airproof/i18n/fr_BE.po
rename to addons/website_airproof/i18n/fr_BE.po
diff --git a/website_airproof/shape-waves.svg b/addons/website_airproof/shape-waves.svg
similarity index 100%
rename from website_airproof/shape-waves.svg
rename to addons/website_airproof/shape-waves.svg
diff --git a/website_airproof/static/description/airproof-favicon.png b/addons/website_airproof/static/description/airproof-favicon.png
similarity index 100%
rename from website_airproof/static/description/airproof-favicon.png
rename to addons/website_airproof/static/description/airproof-favicon.png
diff --git a/website_airproof/static/fonts/lato.woff b/addons/website_airproof/static/fonts/lato.woff
similarity index 100%
rename from website_airproof/static/fonts/lato.woff
rename to addons/website_airproof/static/fonts/lato.woff
diff --git a/website_airproof/static/fonts/lato.woff2 b/addons/website_airproof/static/fonts/lato.woff2
similarity index 100%
rename from website_airproof/static/fonts/lato.woff2
rename to addons/website_airproof/static/fonts/lato.woff2
diff --git a/website_airproof/static/shapes/airproof/waves.svg b/addons/website_airproof/static/shapes/airproof/waves.svg
similarity index 100%
rename from website_airproof/static/shapes/airproof/waves.svg
rename to addons/website_airproof/static/shapes/airproof/waves.svg
diff --git a/website_airproof/static/src/img/content/accessories.webp b/addons/website_airproof/static/src/img/content/accessories.webp
similarity index 100%
rename from website_airproof/static/src/img/content/accessories.webp
rename to addons/website_airproof/static/src/img/content/accessories.webp
diff --git a/website_airproof/static/src/img/content/airproof-eagle.webp b/addons/website_airproof/static/src/img/content/airproof-eagle.webp
similarity index 100%
rename from website_airproof/static/src/img/content/airproof-eagle.webp
rename to addons/website_airproof/static/src/img/content/airproof-eagle.webp
diff --git a/website_airproof/static/src/img/content/airproof-falcon.webp b/addons/website_airproof/static/src/img/content/airproof-falcon.webp
similarity index 100%
rename from website_airproof/static/src/img/content/airproof-falcon.webp
rename to addons/website_airproof/static/src/img/content/airproof-falcon.webp
diff --git a/website_airproof/static/src/img/content/airproof-mini.webp b/addons/website_airproof/static/src/img/content/airproof-mini.webp
similarity index 100%
rename from website_airproof/static/src/img/content/airproof-mini.webp
rename to addons/website_airproof/static/src/img/content/airproof-mini.webp
diff --git a/website_airproof/static/src/img/content/airproof-pro.webp b/addons/website_airproof/static/src/img/content/airproof-pro.webp
similarity index 100%
rename from website_airproof/static/src/img/content/airproof-pro.webp
rename to addons/website_airproof/static/src/img/content/airproof-pro.webp
diff --git a/website_airproof/static/src/img/content/airproof-robin.webp b/addons/website_airproof/static/src/img/content/airproof-robin.webp
similarity index 100%
rename from website_airproof/static/src/img/content/airproof-robin.webp
rename to addons/website_airproof/static/src/img/content/airproof-robin.webp
diff --git a/website_airproof/static/src/img/content/branding/airproof-logo.svg b/addons/website_airproof/static/src/img/content/branding/airproof-logo.svg
similarity index 100%
rename from website_airproof/static/src/img/content/branding/airproof-logo.svg
rename to addons/website_airproof/static/src/img/content/branding/airproof-logo.svg
diff --git a/website_airproof/static/src/img/content/charger-cable.webp b/addons/website_airproof/static/src/img/content/charger-cable.webp
similarity index 100%
rename from website_airproof/static/src/img/content/charger-cable.webp
rename to addons/website_airproof/static/src/img/content/charger-cable.webp
diff --git a/website_airproof/static/src/img/content/drone-bluebg.webp b/addons/website_airproof/static/src/img/content/drone-bluebg.webp
similarity index 100%
rename from website_airproof/static/src/img/content/drone-bluebg.webp
rename to addons/website_airproof/static/src/img/content/drone-bluebg.webp
diff --git a/website_airproof/static/src/img/content/drone-flying.webp b/addons/website_airproof/static/src/img/content/drone-flying.webp
similarity index 100%
rename from website_airproof/static/src/img/content/drone-flying.webp
rename to addons/website_airproof/static/src/img/content/drone-flying.webp
diff --git a/website_airproof/static/src/img/content/drone-robin.webp b/addons/website_airproof/static/src/img/content/drone-robin.webp
similarity index 100%
rename from website_airproof/static/src/img/content/drone-robin.webp
rename to addons/website_airproof/static/src/img/content/drone-robin.webp
diff --git a/website_airproof/static/src/img/content/icons/4k.svg b/addons/website_airproof/static/src/img/content/icons/4k.svg
similarity index 100%
rename from website_airproof/static/src/img/content/icons/4k.svg
rename to addons/website_airproof/static/src/img/content/icons/4k.svg
diff --git a/website_airproof/static/src/img/content/icons/angle-down-solid.svg b/addons/website_airproof/static/src/img/content/icons/angle-down-solid.svg
similarity index 100%
rename from website_airproof/static/src/img/content/icons/angle-down-solid.svg
rename to addons/website_airproof/static/src/img/content/icons/angle-down-solid.svg
diff --git a/website_airproof/static/src/img/content/icons/arrow-left.svg b/addons/website_airproof/static/src/img/content/icons/arrow-left.svg
similarity index 100%
rename from website_airproof/static/src/img/content/icons/arrow-left.svg
rename to addons/website_airproof/static/src/img/content/icons/arrow-left.svg
diff --git a/website_airproof/static/src/img/content/icons/arrow-right.svg b/addons/website_airproof/static/src/img/content/icons/arrow-right.svg
similarity index 100%
rename from website_airproof/static/src/img/content/icons/arrow-right.svg
rename to addons/website_airproof/static/src/img/content/icons/arrow-right.svg
diff --git a/website_airproof/static/src/img/content/icons/arrow-small.svg b/addons/website_airproof/static/src/img/content/icons/arrow-small.svg
similarity index 100%
rename from website_airproof/static/src/img/content/icons/arrow-small.svg
rename to addons/website_airproof/static/src/img/content/icons/arrow-small.svg
diff --git a/website_airproof/static/src/img/content/icons/arrow-white.svg b/addons/website_airproof/static/src/img/content/icons/arrow-white.svg
similarity index 100%
rename from website_airproof/static/src/img/content/icons/arrow-white.svg
rename to addons/website_airproof/static/src/img/content/icons/arrow-white.svg
diff --git a/website_airproof/static/src/img/content/icons/arrow.svg b/addons/website_airproof/static/src/img/content/icons/arrow.svg
similarity index 100%
rename from website_airproof/static/src/img/content/icons/arrow.svg
rename to addons/website_airproof/static/src/img/content/icons/arrow.svg
diff --git a/website_airproof/static/src/img/content/icons/check.svg b/addons/website_airproof/static/src/img/content/icons/check.svg
similarity index 100%
rename from website_airproof/static/src/img/content/icons/check.svg
rename to addons/website_airproof/static/src/img/content/icons/check.svg
diff --git a/website_airproof/static/src/img/content/icons/control.svg b/addons/website_airproof/static/src/img/content/icons/control.svg
similarity index 100%
rename from website_airproof/static/src/img/content/icons/control.svg
rename to addons/website_airproof/static/src/img/content/icons/control.svg
diff --git a/website_airproof/static/src/img/content/icons/envelop-black.svg b/addons/website_airproof/static/src/img/content/icons/envelop-black.svg
similarity index 100%
rename from website_airproof/static/src/img/content/icons/envelop-black.svg
rename to addons/website_airproof/static/src/img/content/icons/envelop-black.svg
diff --git a/website_airproof/static/src/img/content/icons/envelop.svg b/addons/website_airproof/static/src/img/content/icons/envelop.svg
similarity index 100%
rename from website_airproof/static/src/img/content/icons/envelop.svg
rename to addons/website_airproof/static/src/img/content/icons/envelop.svg
diff --git a/website_airproof/static/src/img/content/icons/glasses.svg b/addons/website_airproof/static/src/img/content/icons/glasses.svg
similarity index 100%
rename from website_airproof/static/src/img/content/icons/glasses.svg
rename to addons/website_airproof/static/src/img/content/icons/glasses.svg
diff --git a/website_airproof/static/src/img/content/icons/hand-drone.svg b/addons/website_airproof/static/src/img/content/icons/hand-drone.svg
similarity index 100%
rename from website_airproof/static/src/img/content/icons/hand-drone.svg
rename to addons/website_airproof/static/src/img/content/icons/hand-drone.svg
diff --git a/website_airproof/static/src/img/content/icons/phone-black.svg b/addons/website_airproof/static/src/img/content/icons/phone-black.svg
similarity index 100%
rename from website_airproof/static/src/img/content/icons/phone-black.svg
rename to addons/website_airproof/static/src/img/content/icons/phone-black.svg
diff --git a/website_airproof/static/src/img/content/icons/phone.svg b/addons/website_airproof/static/src/img/content/icons/phone.svg
similarity index 100%
rename from website_airproof/static/src/img/content/icons/phone.svg
rename to addons/website_airproof/static/src/img/content/icons/phone.svg
diff --git a/website_airproof/static/src/img/content/icons/shopping.svg b/addons/website_airproof/static/src/img/content/icons/shopping.svg
similarity index 100%
rename from website_airproof/static/src/img/content/icons/shopping.svg
rename to addons/website_airproof/static/src/img/content/icons/shopping.svg
diff --git a/website_airproof/static/src/img/content/icons/user.svg b/addons/website_airproof/static/src/img/content/icons/user.svg
similarity index 100%
rename from website_airproof/static/src/img/content/icons/user.svg
rename to addons/website_airproof/static/src/img/content/icons/user.svg
diff --git a/website_airproof/static/src/img/content/loading.gif b/addons/website_airproof/static/src/img/content/loading.gif
similarity index 100%
rename from website_airproof/static/src/img/content/loading.gif
rename to addons/website_airproof/static/src/img/content/loading.gif
diff --git a/website_airproof/static/src/img/content/school.webp b/addons/website_airproof/static/src/img/content/school.webp
similarity index 100%
rename from website_airproof/static/src/img/content/school.webp
rename to addons/website_airproof/static/src/img/content/school.webp
diff --git a/website_airproof/static/src/img/content/topview.webp b/addons/website_airproof/static/src/img/content/topview.webp
similarity index 100%
rename from website_airproof/static/src/img/content/topview.webp
rename to addons/website_airproof/static/src/img/content/topview.webp
diff --git a/website_airproof/static/src/img/content/topview3.webp b/addons/website_airproof/static/src/img/content/topview3.webp
similarity index 100%
rename from website_airproof/static/src/img/content/topview3.webp
rename to addons/website_airproof/static/src/img/content/topview3.webp
diff --git a/website_airproof/static/src/img/content/warranty.webp b/addons/website_airproof/static/src/img/content/warranty.webp
similarity index 100%
rename from website_airproof/static/src/img/content/warranty.webp
rename to addons/website_airproof/static/src/img/content/warranty.webp
diff --git a/website_airproof/static/src/img/snippets/s_airproof_caroussel/drone.webp b/addons/website_airproof/static/src/img/snippets/s_airproof_caroussel/drone.webp
similarity index 100%
rename from website_airproof/static/src/img/snippets/s_airproof_caroussel/drone.webp
rename to addons/website_airproof/static/src/img/snippets/s_airproof_caroussel/drone.webp
diff --git a/website_airproof/static/src/img/snippets/s_airproof_caroussel/sticker.webp b/addons/website_airproof/static/src/img/snippets/s_airproof_caroussel/sticker.webp
similarity index 100%
rename from website_airproof/static/src/img/snippets/s_airproof_caroussel/sticker.webp
rename to addons/website_airproof/static/src/img/snippets/s_airproof_caroussel/sticker.webp
diff --git a/website_airproof/static/src/img/wbuilder/s-airproof-snippet.svg b/addons/website_airproof/static/src/img/wbuilder/s-airproof-snippet.svg
similarity index 100%
rename from website_airproof/static/src/img/wbuilder/s-airproof-snippet.svg
rename to addons/website_airproof/static/src/img/wbuilder/s-airproof-snippet.svg
diff --git a/website_airproof/static/src/img/wbuilder/template-footer-opt.svg b/addons/website_airproof/static/src/img/wbuilder/template-footer-opt.svg
similarity index 100%
rename from website_airproof/static/src/img/wbuilder/template-footer-opt.svg
rename to addons/website_airproof/static/src/img/wbuilder/template-footer-opt.svg
diff --git a/website_airproof/static/src/img/wbuilder/template-header-opt.svg b/addons/website_airproof/static/src/img/wbuilder/template-header-opt.svg
similarity index 100%
rename from website_airproof/static/src/img/wbuilder/template-header-opt.svg
rename to addons/website_airproof/static/src/img/wbuilder/template-header-opt.svg
diff --git a/website_airproof/static/src/js/mouse_follower.js b/addons/website_airproof/static/src/js/mouse_follower.js
similarity index 100%
rename from website_airproof/static/src/js/mouse_follower.js
rename to addons/website_airproof/static/src/js/mouse_follower.js
diff --git a/website_airproof/static/src/scss/bootstrap_overridden.scss b/addons/website_airproof/static/src/scss/bootstrap_overridden.scss
similarity index 100%
rename from website_airproof/static/src/scss/bootstrap_overridden.scss
rename to addons/website_airproof/static/src/scss/bootstrap_overridden.scss
diff --git a/website_airproof/static/src/scss/components/mouse_follower.scss b/addons/website_airproof/static/src/scss/components/mouse_follower.scss
similarity index 100%
rename from website_airproof/static/src/scss/components/mouse_follower.scss
rename to addons/website_airproof/static/src/scss/components/mouse_follower.scss
diff --git a/website_airproof/static/src/scss/font.scss b/addons/website_airproof/static/src/scss/font.scss
similarity index 100%
rename from website_airproof/static/src/scss/font.scss
rename to addons/website_airproof/static/src/scss/font.scss
diff --git a/website_airproof/static/src/scss/layout/header.scss b/addons/website_airproof/static/src/scss/layout/header.scss
similarity index 100%
rename from website_airproof/static/src/scss/layout/header.scss
rename to addons/website_airproof/static/src/scss/layout/header.scss
diff --git a/website_airproof/static/src/scss/pages/product_page.scss b/addons/website_airproof/static/src/scss/pages/product_page.scss
similarity index 100%
rename from website_airproof/static/src/scss/pages/product_page.scss
rename to addons/website_airproof/static/src/scss/pages/product_page.scss
diff --git a/website_airproof/static/src/scss/pages/shop.scss b/addons/website_airproof/static/src/scss/pages/shop.scss
similarity index 100%
rename from website_airproof/static/src/scss/pages/shop.scss
rename to addons/website_airproof/static/src/scss/pages/shop.scss
diff --git a/website_airproof/static/src/scss/primary_variables.scss b/addons/website_airproof/static/src/scss/primary_variables.scss
similarity index 100%
rename from website_airproof/static/src/scss/primary_variables.scss
rename to addons/website_airproof/static/src/scss/primary_variables.scss
diff --git a/website_airproof/static/src/scss/snippets/caroussel.scss b/addons/website_airproof/static/src/scss/snippets/caroussel.scss
similarity index 100%
rename from website_airproof/static/src/scss/snippets/caroussel.scss
rename to addons/website_airproof/static/src/scss/snippets/caroussel.scss
diff --git a/website_airproof/static/src/scss/snippets/newsletter.scss b/addons/website_airproof/static/src/scss/snippets/newsletter.scss
similarity index 100%
rename from website_airproof/static/src/scss/snippets/newsletter.scss
rename to addons/website_airproof/static/src/scss/snippets/newsletter.scss
diff --git a/website_airproof/static/src/snippets/s_airproof_carousel/000.scss b/addons/website_airproof/static/src/snippets/s_airproof_carousel/000.scss
similarity index 100%
rename from website_airproof/static/src/snippets/s_airproof_carousel/000.scss
rename to addons/website_airproof/static/src/snippets/s_airproof_carousel/000.scss
diff --git a/website_airproof/views/new_page_template_templates.xml b/addons/website_airproof/views/new_page_template_templates.xml
similarity index 100%
rename from website_airproof/views/new_page_template_templates.xml
rename to addons/website_airproof/views/new_page_template_templates.xml
diff --git a/website_airproof/views/snippets/options.xml b/addons/website_airproof/views/snippets/options.xml
similarity index 100%
rename from website_airproof/views/snippets/options.xml
rename to addons/website_airproof/views/snippets/options.xml
diff --git a/website_airproof/views/snippets/s_airproof_carousel.xml b/addons/website_airproof/views/snippets/s_airproof_carousel.xml
similarity index 100%
rename from website_airproof/views/snippets/s_airproof_carousel.xml
rename to addons/website_airproof/views/snippets/s_airproof_carousel.xml
diff --git a/website_airproof/views/website_sale_templates.xml b/addons/website_airproof/views/website_sale_templates.xml
similarity index 100%
rename from website_airproof/views/website_sale_templates.xml
rename to addons/website_airproof/views/website_sale_templates.xml
diff --git a/website_airproof/views/website_sale_wishlist_templates.xml b/addons/website_airproof/views/website_sale_wishlist_templates.xml
similarity index 100%
rename from website_airproof/views/website_sale_wishlist_templates.xml
rename to addons/website_airproof/views/website_sale_wishlist_templates.xml
diff --git a/website_airproof/views/website_templates.xml b/addons/website_airproof/views/website_templates.xml
similarity index 100%
rename from website_airproof/views/website_templates.xml
rename to addons/website_airproof/views/website_templates.xml
diff --git a/awesome_dashboard/controllers/__init__.py b/awesome_dashboard/controllers/__init__.py
deleted file mode 100644
index 457bae27e11..00000000000
--- a/awesome_dashboard/controllers/__init__.py
+++ /dev/null
@@ -1,3 +0,0 @@
-# -*- coding: utf-8 -*-
-
-from . import controllers
\ No newline at end of file
diff --git a/awesome_dashboard/static/src/dashboard.js b/awesome_dashboard/static/src/dashboard.js
deleted file mode 100644
index c4fb245621b..00000000000
--- a/awesome_dashboard/static/src/dashboard.js
+++ /dev/null
@@ -1,8 +0,0 @@
-import { Component } from "@odoo/owl";
-import { registry } from "@web/core/registry";
-
-class AwesomeDashboard extends Component {
- static template = "awesome_dashboard.AwesomeDashboard";
-}
-
-registry.category("actions").add("awesome_dashboard.dashboard", AwesomeDashboard);
diff --git a/awesome_owl/__init__.py b/awesome_owl/__init__.py
deleted file mode 100644
index 457bae27e11..00000000000
--- a/awesome_owl/__init__.py
+++ /dev/null
@@ -1,3 +0,0 @@
-# -*- coding: utf-8 -*-
-
-from . import controllers
\ No newline at end of file
diff --git a/awesome_owl/controllers/__init__.py b/awesome_owl/controllers/__init__.py
deleted file mode 100644
index 457bae27e11..00000000000
--- a/awesome_owl/controllers/__init__.py
+++ /dev/null
@@ -1,3 +0,0 @@
-# -*- coding: utf-8 -*-
-
-from . import controllers
\ No newline at end of file
diff --git a/awesome_owl/static/src/playground.js b/awesome_owl/static/src/playground.js
deleted file mode 100644
index 4ac769b0aa5..00000000000
--- a/awesome_owl/static/src/playground.js
+++ /dev/null
@@ -1,5 +0,0 @@
-import { Component } from "@odoo/owl";
-
-export class Playground extends Component {
- static template = "awesome_owl.playground";
-}
diff --git a/awesome_owl/static/src/playground.xml b/awesome_owl/static/src/playground.xml
deleted file mode 100644
index 4fb905d59f9..00000000000
--- a/awesome_owl/static/src/playground.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-
-
-
- hello world
-
-
-
-