From 0555d0b6487445dcee922b76017560cccffdf85a Mon Sep 17 00:00:00 2001 From: David Date: Tue, 20 Aug 2024 15:51:33 +0200 Subject: [PATCH] [ADD] web_quick_start_screen: New module TT50477 --- .../odoo/addons/web_quick_start_screen | 1 + setup/web_quick_start_screen/setup.py | 6 + web_quick_start_screen/README.rst | 137 +++++ web_quick_start_screen/__init__.py | 1 + web_quick_start_screen/__manifest__.py | 28 + .../demo/quick_screen_action_demo_data.xml | 57 ++ web_quick_start_screen/i18n/es.po | 257 +++++++++ .../i18n/web_quick_start_screen.pot | 249 +++++++++ web_quick_start_screen/models/__init__.py | 3 + .../models/quick_start_screen.py | 68 +++ .../models/quick_start_screen_action.py | 68 +++ web_quick_start_screen/models/res_users.py | 9 + web_quick_start_screen/readme/CONFIGURE.md | 27 + web_quick_start_screen/readme/CONTEXT.md | 2 + web_quick_start_screen/readme/CONTRIBUTORS.md | 3 + web_quick_start_screen/readme/DESCRIPTION.md | 4 + web_quick_start_screen/readme/ROADMAP.md | 6 + web_quick_start_screen/readme/USAGE.md | 2 + .../security/ir.model.access.csv | 5 + web_quick_start_screen/security/security.xml | 7 + .../static/description/icon.png | Bin 0 -> 5571 bytes .../static/description/icon.svg | 107 ++++ .../static/description/index.html | 487 ++++++++++++++++++ .../static/src/js/kanban_controller.esm.js | 18 + .../static/src/scss/quick_start_screen.scss | 6 + web_quick_start_screen/tests/__init__.py | 2 + .../tests/test_web_quick_start_screen.py | 26 + .../views/quick_screen_action_view.xml | 110 ++++ .../views/quick_start_screen_views.xml | 54 ++ .../views/res_users_views.xml | 12 + 30 files changed, 1762 insertions(+) create mode 120000 setup/web_quick_start_screen/odoo/addons/web_quick_start_screen create mode 100644 setup/web_quick_start_screen/setup.py create mode 100644 web_quick_start_screen/README.rst create mode 100644 web_quick_start_screen/__init__.py create mode 100644 web_quick_start_screen/__manifest__.py create mode 100644 web_quick_start_screen/demo/quick_screen_action_demo_data.xml create mode 100644 web_quick_start_screen/i18n/es.po create mode 100644 web_quick_start_screen/i18n/web_quick_start_screen.pot create mode 100644 web_quick_start_screen/models/__init__.py create mode 100644 web_quick_start_screen/models/quick_start_screen.py create mode 100644 web_quick_start_screen/models/quick_start_screen_action.py create mode 100644 web_quick_start_screen/models/res_users.py create mode 100644 web_quick_start_screen/readme/CONFIGURE.md create mode 100644 web_quick_start_screen/readme/CONTEXT.md create mode 100644 web_quick_start_screen/readme/CONTRIBUTORS.md create mode 100644 web_quick_start_screen/readme/DESCRIPTION.md create mode 100644 web_quick_start_screen/readme/ROADMAP.md create mode 100644 web_quick_start_screen/readme/USAGE.md create mode 100644 web_quick_start_screen/security/ir.model.access.csv create mode 100644 web_quick_start_screen/security/security.xml create mode 100644 web_quick_start_screen/static/description/icon.png create mode 100644 web_quick_start_screen/static/description/icon.svg create mode 100644 web_quick_start_screen/static/description/index.html create mode 100644 web_quick_start_screen/static/src/js/kanban_controller.esm.js create mode 100644 web_quick_start_screen/static/src/scss/quick_start_screen.scss create mode 100644 web_quick_start_screen/tests/__init__.py create mode 100644 web_quick_start_screen/tests/test_web_quick_start_screen.py create mode 100644 web_quick_start_screen/views/quick_screen_action_view.xml create mode 100644 web_quick_start_screen/views/quick_start_screen_views.xml create mode 100644 web_quick_start_screen/views/res_users_views.xml diff --git a/setup/web_quick_start_screen/odoo/addons/web_quick_start_screen b/setup/web_quick_start_screen/odoo/addons/web_quick_start_screen new file mode 120000 index 000000000..e53f025f4 --- /dev/null +++ b/setup/web_quick_start_screen/odoo/addons/web_quick_start_screen @@ -0,0 +1 @@ +../../../../web_quick_start_screen \ No newline at end of file diff --git a/setup/web_quick_start_screen/setup.py b/setup/web_quick_start_screen/setup.py new file mode 100644 index 000000000..28c57bb64 --- /dev/null +++ b/setup/web_quick_start_screen/setup.py @@ -0,0 +1,6 @@ +import setuptools + +setuptools.setup( + setup_requires=['setuptools-odoo'], + odoo_addon=True, +) diff --git a/web_quick_start_screen/README.rst b/web_quick_start_screen/README.rst new file mode 100644 index 000000000..2b1cf6bfa --- /dev/null +++ b/web_quick_start_screen/README.rst @@ -0,0 +1,137 @@ +================== +Quick Start Screen +================== + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:f9c2d78e553eef639adf52a6811c9a92a1b131a13c2882469d1e47f4fe271679 + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fweb-lightgray.png?logo=github + :target: https://github.com/OCA/web/tree/16.0/web_quick_start_screen + :alt: OCA/web +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/web-16-0/web-16-0-web_quick_start_screen + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png + :target: https://runboat.odoo-community.org/builds?repo=OCA/web&target_branch=16.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +This module adds a configurable start screen so users can go right into +their more common tasks. + +It can be configured at the user level or just be used as common +screens. + +**Table of contents** + +.. contents:: + :local: + +Use Cases / Context +=================== + +Some users use repeatedly the same actions on and on and sometimes those +actions are so many clicks away which tends to be frustrating. + +Configuration +============= + +To create quick actions: + +- Go to *Settings > Technical > User Interface > Screen actions* and + create o modify an existing one. +- Choose the desired action, a name, a description and an icon. +- You can add an optional context so you can reuse existing actions. + You can use ``ref()`` to get an id that you can use in your + context. You can also use ``datetime`` and ``context_today`` in that + same way you can do in ``ir.filters``. + +To create quick start screens: + +- Go to *Settings > Technical > User Interface > Quick start screens* + and create or modify an existing one. +- Choose a descriptive name and link some quick screen actions. + +To assign a quick start screen to a user: + +- Go to *Settings > Users and groups > Users* and select one. +- In the *Preferences* tab, *Menus customization* section, you can + choose which *Quick start screen* will that user use. +- If you want to make the user start always in his start screen, in the + same section select the action *Quick Start Screen*. + +To activate the quick start screen menu for a user: + +- Go to *Settings > Users and groups > Users* (with debug mode on) +- In *Technical* groups, set *Quick Start Screen* on. + +Usage +===== + +When you have the proper config, once you login, you'll go to the quick +actions screen. Just click in and start working. + +Known issues / Roadmap +====================== + +- Right now there's no much permissions handling, but it could be made + similarly to how menus deal with them. +- Also we could add the possibility of quick actions for users the same + way that favorite filters work. +- A tour helper that clicked in every defined action would be helpfull + to detect possible issues. + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +------- + +* Tecnativa + +Contributors +------------ + +- `Tecnativa `__ + + - Pedro M. Baeza + - David Vidal + +Maintainers +----------- + +This module is maintained by the OCA. + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use. + +This module is part of the `OCA/web `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/web_quick_start_screen/__init__.py b/web_quick_start_screen/__init__.py new file mode 100644 index 000000000..0650744f6 --- /dev/null +++ b/web_quick_start_screen/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/web_quick_start_screen/__manifest__.py b/web_quick_start_screen/__manifest__.py new file mode 100644 index 000000000..5793e6d54 --- /dev/null +++ b/web_quick_start_screen/__manifest__.py @@ -0,0 +1,28 @@ +# Copyright 2024 Tecnativa - David Vidal +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). +{ + "name": "Quick Start Screen", + "summary": "Configurable start screen for quick actions", + "version": "16.0.1.0.0", + "author": "Tecnativa, Odoo Community Association (OCA)", + "website": "https://github.com/OCA/web", + "license": "AGPL-3", + "category": "web", + "depends": ["web"], + "data": [ + "security/ir.model.access.csv", + "security/security.xml", + "views/quick_screen_action_view.xml", + "views/quick_start_screen_views.xml", + "views/res_users_views.xml", + ], + "demo": [ + "demo/quick_screen_action_demo_data.xml", + ], + "assets": { + "web.assets_backend": [ + "web_quick_start_screen/static/src/scss/quick_start_screen.scss", + "web_quick_start_screen/static/src/js/kanban_controller.esm.js", + ], + }, +} diff --git a/web_quick_start_screen/demo/quick_screen_action_demo_data.xml b/web_quick_start_screen/demo/quick_screen_action_demo_data.xml new file mode 100644 index 000000000..807441589 --- /dev/null +++ b/web_quick_start_screen/demo/quick_screen_action_demo_data.xml @@ -0,0 +1,57 @@ + + + + Contacts + Browse contacts]]> + + fa-users + 7 + + + Access rights + Explore access rights]]> + + fa-eye + 4 + + + Configure screen actions + Configure this screen actions]]> + + + + + Demo start screen + + + + + + + + diff --git a/web_quick_start_screen/i18n/es.po b/web_quick_start_screen/i18n/es.po new file mode 100644 index 000000000..3ce3e209d --- /dev/null +++ b/web_quick_start_screen/i18n/es.po @@ -0,0 +1,257 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * web_quick_start_screen +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-08-23 12:21+0000\n" +"PO-Revision-Date: 2024-08-23 14:23+0200\n" +"Last-Translator: \n" +"Language-Team: \n" +"Language: es\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Poedit 3.4.4\n" + +#. module: web_quick_start_screen +#: model_terms:quick.start.screen.action,description:web_quick_start_screen.quick_start_screen_action_contacts +msgid "Browse contacts" +msgstr "Explorar contactos" + +#. module: web_quick_start_screen +#: model_terms:quick.start.screen.action,description:web_quick_start_screen.quick_start_screen_action_config_actions +msgid "Configure this screen actions" +msgstr "Configurar acciones de pantalla" + +#. module: web_quick_start_screen +#: model_terms:quick.start.screen.action,description:web_quick_start_screen.quick_start_screen_action_access_rights +msgid "Explore access rights" +msgstr "Ver derechos de acceso" + +#. module: web_quick_start_screen +#: model:quick.start.screen.action,name:web_quick_start_screen.quick_start_screen_action_access_rights +msgid "Access rights" +msgstr "Derechos de acceso" + +#. module: web_quick_start_screen +#: model:ir.model.fields,field_description:web_quick_start_screen.field_quick_start_screen__action_ids +msgid "Action" +msgstr "Acción" + +#. module: web_quick_start_screen +#: model:ir.model.fields,field_description:web_quick_start_screen.field_quick_start_screen_action__action_ref_id +msgid "Action Ref" +msgstr "Referencia de acción" + +#. module: web_quick_start_screen +#: model:ir.model,name:web_quick_start_screen.model_quick_start_screen_action +msgid "Actions to be launched from a quick start screen" +msgstr "Acciones que serán lanzadas desde la pantalla de inicio" + +#. module: web_quick_start_screen +#: model:ir.model.fields,field_description:web_quick_start_screen.field_quick_start_screen_action__active +msgid "Active" +msgstr "Activo" + +#. module: web_quick_start_screen +#: model:ir.model.fields,help:web_quick_start_screen.field_quick_start_screen_action__context +msgid "" +"Add extra context if needed. You can use `ref('')` and it will " +"beevaluated. You can also use `datetime` and `context_today` in the same " +"way`ir.filters` do." +msgstr "" +"Añadir contexto adicional si se necesita. Puede utilizar `ref('')` " +"y será evaluado. También puede utilizar `datetime` y `context_today` del " +"mismo modo que se hace en `ir.filters`." + +#. module: web_quick_start_screen +#: model:ir.model.fields,help:web_quick_start_screen.field_quick_start_screen_action__domain +msgid "" +"Add extra domain if needed. You can use `ref('')` and it will " +"beevaluated. You can also use `datetime` and `context_today` in the same " +"way`ir.filters` do." +msgstr "" +"Añadir un dominio adicional si se necesita. Puede utilizar " +"`ref('')` y será evaluado. También puede utilizar `datetime` y " +"`context_today` del mismo modo que se hace en `ir.filters`." + +#. module: web_quick_start_screen +#: model:ir.model.fields,help:web_quick_start_screen.field_quick_start_screen_action__color +msgid "Choose the icon color" +msgstr "Escoja el color del icono" + +#. module: web_quick_start_screen +#: model:ir.model.fields,field_description:web_quick_start_screen.field_quick_start_screen_action__color +msgid "Color" +msgstr "Color" + +#. module: web_quick_start_screen +#: model:quick.start.screen.action,name:web_quick_start_screen.quick_start_screen_action_config_actions +msgid "Configure screen actions" +msgstr "Configurar acciones de pantalla" + +#. module: web_quick_start_screen +#: model:quick.start.screen.action,name:web_quick_start_screen.quick_start_screen_action_contacts +msgid "Contacts" +msgstr "Contactos" + +#. module: web_quick_start_screen +#: model:ir.model.fields,field_description:web_quick_start_screen.field_quick_start_screen_action__context +msgid "Context" +msgstr "Contexto" + +#. module: web_quick_start_screen +#: model:ir.model.fields,field_description:web_quick_start_screen.field_quick_start_screen__create_uid +#: model:ir.model.fields,field_description:web_quick_start_screen.field_quick_start_screen_action__create_uid +msgid "Created by" +msgstr "Creado por" + +#. module: web_quick_start_screen +#: model:ir.model.fields,field_description:web_quick_start_screen.field_quick_start_screen__create_date +#: model:ir.model.fields,field_description:web_quick_start_screen.field_quick_start_screen_action__create_date +msgid "Created on" +msgstr "Creado el" + +#. module: web_quick_start_screen +#: model:quick.start.screen,name:web_quick_start_screen.quick_start_screen_demo +msgid "Demo start screen" +msgstr "Pantalla de inicio demo" + +#. module: web_quick_start_screen +#: model:ir.model.fields,field_description:web_quick_start_screen.field_quick_start_screen_action__description +msgid "Description" +msgstr "Descripción" + +#. module: web_quick_start_screen +#: model:ir.model.fields,field_description:web_quick_start_screen.field_quick_start_screen__display_name +#: model:ir.model.fields,field_description:web_quick_start_screen.field_quick_start_screen_action__display_name +msgid "Display Name" +msgstr "Nombre mostrado" + +#. module: web_quick_start_screen +#: model:ir.model.fields,field_description:web_quick_start_screen.field_quick_start_screen_action__domain +msgid "Domain" +msgstr "Dominio" + +#. module: web_quick_start_screen +#: model_terms:ir.ui.view,arch_db:web_quick_start_screen.quick_start_screen_tree_view +msgid "Go to the start screen" +msgstr "Ir a la pantalla de inicio" + +#. module: web_quick_start_screen +#: model:ir.model.fields,field_description:web_quick_start_screen.field_quick_start_screen__id +#: model:ir.model.fields,field_description:web_quick_start_screen.field_quick_start_screen_action__id +msgid "ID" +msgstr "ID (identificación)" + +#. module: web_quick_start_screen +#: model:ir.model.fields,field_description:web_quick_start_screen.field_quick_start_screen_action__icon_name +msgid "Icon Name" +msgstr "Nombre del icono" + +#. module: web_quick_start_screen +#: model:ir.model.fields,help:web_quick_start_screen.field_quick_start_screen_action__icon_name +msgid "Just set the Font Awesome icon name. e.g.: fa-truck" +msgstr "" +"Tan solo establezca el nombre de icono de Font Awesome: p.e..: fa-truck" + +#. module: web_quick_start_screen +#: model:ir.model.fields,field_description:web_quick_start_screen.field_quick_start_screen____last_update +#: model:ir.model.fields,field_description:web_quick_start_screen.field_quick_start_screen_action____last_update +msgid "Last Modified on" +msgstr "Última modificación en" + +#. module: web_quick_start_screen +#: model:ir.model.fields,field_description:web_quick_start_screen.field_quick_start_screen__write_uid +#: model:ir.model.fields,field_description:web_quick_start_screen.field_quick_start_screen_action__write_uid +msgid "Last Updated by" +msgstr "Última actualización de" + +#. module: web_quick_start_screen +#: model:ir.model.fields,field_description:web_quick_start_screen.field_quick_start_screen__write_date +#: model:ir.model.fields,field_description:web_quick_start_screen.field_quick_start_screen_action__write_date +msgid "Last Updated on" +msgstr "Última actualización en" + +#. module: web_quick_start_screen +#: model:ir.model.fields,field_description:web_quick_start_screen.field_quick_start_screen__name +#: model:ir.model.fields,field_description:web_quick_start_screen.field_quick_start_screen_action__name +msgid "Name" +msgstr "Nombre" + +#. module: web_quick_start_screen +#: model:ir.actions.server,name:web_quick_start_screen.start_screen_action +#: model:ir.model.fields,field_description:web_quick_start_screen.field_res_users__quick_start_screen_id +#: model:res.groups,name:web_quick_start_screen.group_quick_start_screen +msgid "Quick Start Screen" +msgstr "Pantalla de inicio rápido" + +#. module: web_quick_start_screen +#: model:ir.actions.act_window,name:web_quick_start_screen.quick_start_screen_action_action +#: model:ir.ui.menu,name:web_quick_start_screen.menu_quick_start_screen_action +msgid "Quick Start Screen Actions" +msgstr "Acciones de pantalla de inicio rápido" + +#. module: web_quick_start_screen +#: model:ir.actions.act_window,name:web_quick_start_screen.start_screen_action_config +#: model:ir.ui.menu,name:web_quick_start_screen.menu_quick_start_screen_action_config +msgid "Quick Start Screens" +msgstr "Pantallas de inicio rápido" + +#. module: web_quick_start_screen +#: model:ir.model,name:web_quick_start_screen.model_quick_start_screen +msgid "Quick action selection screen" +msgstr "Pantalla de selección rápida de acciones" + +#. module: web_quick_start_screen +#: model:ir.model.fields,field_description:web_quick_start_screen.field_quick_start_screen_action__sequence +msgid "Sequence" +msgstr "Secuencia" + +#. module: web_quick_start_screen +#. odoo-python +#: code:addons/web_quick_start_screen/models/quick_start_screen.py:0 +#: model:ir.ui.menu,name:web_quick_start_screen.menu_start +#: model:ir.ui.menu,name:web_quick_start_screen.menu_start_screen +#, python-format +msgid "Start" +msgstr "Inicio" + +#. module: web_quick_start_screen +#: model:ir.model.fields,field_description:web_quick_start_screen.field_quick_start_screen_action__image +msgid "Start screen icon" +msgstr "Icono de pantalla de inicio" + +#. module: web_quick_start_screen +#: model:ir.model,name:web_quick_start_screen.model_res_users +msgid "User" +msgstr "Usuario" + +#. module: web_quick_start_screen +#: model:ir.model.fields.selection,name:web_quick_start_screen.selection__quick_start_screen_action__action_ref_id__ir_actions_act_url +msgid "ir.actions.act_url" +msgstr "" + +#. module: web_quick_start_screen +#: model:ir.model.fields.selection,name:web_quick_start_screen.selection__quick_start_screen_action__action_ref_id__ir_actions_act_window +msgid "ir.actions.act_window" +msgstr "" + +#. module: web_quick_start_screen +#: model:ir.model.fields.selection,name:web_quick_start_screen.selection__quick_start_screen_action__action_ref_id__ir_actions_client +msgid "ir.actions.client" +msgstr "" + +#. module: web_quick_start_screen +#: model:ir.model.fields.selection,name:web_quick_start_screen.selection__quick_start_screen_action__action_ref_id__ir_actions_report +msgid "ir.actions.report" +msgstr "" + +#. module: web_quick_start_screen +#: model:ir.model.fields.selection,name:web_quick_start_screen.selection__quick_start_screen_action__action_ref_id__ir_actions_server +msgid "ir.actions.server" +msgstr "" diff --git a/web_quick_start_screen/i18n/web_quick_start_screen.pot b/web_quick_start_screen/i18n/web_quick_start_screen.pot new file mode 100644 index 000000000..57b040dc8 --- /dev/null +++ b/web_quick_start_screen/i18n/web_quick_start_screen.pot @@ -0,0 +1,249 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * web_quick_start_screen +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-08-23 12:20+0000\n" +"PO-Revision-Date: 2024-08-23 12:20+0000\n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: web_quick_start_screen +#: model_terms:quick.start.screen.action,description:web_quick_start_screen.quick_start_screen_action_contacts +msgid "Browse contacts" +msgstr "" + +#. module: web_quick_start_screen +#: model_terms:quick.start.screen.action,description:web_quick_start_screen.quick_start_screen_action_config_actions +msgid "Configure this screen actions" +msgstr "" + +#. module: web_quick_start_screen +#: model_terms:quick.start.screen.action,description:web_quick_start_screen.quick_start_screen_action_access_rights +msgid "Explore access rights" +msgstr "" + +#. module: web_quick_start_screen +#: model:quick.start.screen.action,name:web_quick_start_screen.quick_start_screen_action_access_rights +msgid "Access rights" +msgstr "" + +#. module: web_quick_start_screen +#: model:ir.model.fields,field_description:web_quick_start_screen.field_quick_start_screen__action_ids +msgid "Action" +msgstr "" + +#. module: web_quick_start_screen +#: model:ir.model.fields,field_description:web_quick_start_screen.field_quick_start_screen_action__action_ref_id +msgid "Action Ref" +msgstr "" + +#. module: web_quick_start_screen +#: model:ir.model,name:web_quick_start_screen.model_quick_start_screen_action +msgid "Actions to be launched from a quick start screen" +msgstr "" + +#. module: web_quick_start_screen +#: model:ir.model.fields,field_description:web_quick_start_screen.field_quick_start_screen_action__active +msgid "Active" +msgstr "" + +#. module: web_quick_start_screen +#: model:ir.model.fields,help:web_quick_start_screen.field_quick_start_screen_action__context +msgid "" +"Add extra context if needed. You can use `ref('')` and it will " +"beevaluated. You can also use `datetime` and `context_today` in the same " +"way`ir.filters` do." +msgstr "" + +#. module: web_quick_start_screen +#: model:ir.model.fields,help:web_quick_start_screen.field_quick_start_screen_action__domain +msgid "" +"Add extra domain if needed. You can use `ref('')` and it will " +"beevaluated. You can also use `datetime` and `context_today` in the same " +"way`ir.filters` do." +msgstr "" + +#. module: web_quick_start_screen +#: model:ir.model.fields,help:web_quick_start_screen.field_quick_start_screen_action__color +msgid "Choose the icon color" +msgstr "" + +#. module: web_quick_start_screen +#: model:ir.model.fields,field_description:web_quick_start_screen.field_quick_start_screen_action__color +msgid "Color" +msgstr "" + +#. module: web_quick_start_screen +#: model:quick.start.screen.action,name:web_quick_start_screen.quick_start_screen_action_config_actions +msgid "Configure screen actions" +msgstr "" + +#. module: web_quick_start_screen +#: model:quick.start.screen.action,name:web_quick_start_screen.quick_start_screen_action_contacts +msgid "Contacts" +msgstr "" + +#. module: web_quick_start_screen +#: model:ir.model.fields,field_description:web_quick_start_screen.field_quick_start_screen_action__context +msgid "Context" +msgstr "" + +#. module: web_quick_start_screen +#: model:ir.model.fields,field_description:web_quick_start_screen.field_quick_start_screen__create_uid +#: model:ir.model.fields,field_description:web_quick_start_screen.field_quick_start_screen_action__create_uid +msgid "Created by" +msgstr "" + +#. module: web_quick_start_screen +#: model:ir.model.fields,field_description:web_quick_start_screen.field_quick_start_screen__create_date +#: model:ir.model.fields,field_description:web_quick_start_screen.field_quick_start_screen_action__create_date +msgid "Created on" +msgstr "" + +#. module: web_quick_start_screen +#: model:quick.start.screen,name:web_quick_start_screen.quick_start_screen_demo +msgid "Demo start screen" +msgstr "" + +#. module: web_quick_start_screen +#: model:ir.model.fields,field_description:web_quick_start_screen.field_quick_start_screen_action__description +msgid "Description" +msgstr "" + +#. module: web_quick_start_screen +#: model:ir.model.fields,field_description:web_quick_start_screen.field_quick_start_screen__display_name +#: model:ir.model.fields,field_description:web_quick_start_screen.field_quick_start_screen_action__display_name +msgid "Display Name" +msgstr "" + +#. module: web_quick_start_screen +#: model:ir.model.fields,field_description:web_quick_start_screen.field_quick_start_screen_action__domain +msgid "Domain" +msgstr "" + +#. module: web_quick_start_screen +#: model_terms:ir.ui.view,arch_db:web_quick_start_screen.quick_start_screen_tree_view +msgid "Go to the start screen" +msgstr "" + +#. module: web_quick_start_screen +#: model:ir.model.fields,field_description:web_quick_start_screen.field_quick_start_screen__id +#: model:ir.model.fields,field_description:web_quick_start_screen.field_quick_start_screen_action__id +msgid "ID" +msgstr "" + +#. module: web_quick_start_screen +#: model:ir.model.fields,field_description:web_quick_start_screen.field_quick_start_screen_action__icon_name +msgid "Icon Name" +msgstr "" + +#. module: web_quick_start_screen +#: model:ir.model.fields,help:web_quick_start_screen.field_quick_start_screen_action__icon_name +msgid "Just set the Font Awesome icon name. e.g.: fa-truck" +msgstr "" + +#. module: web_quick_start_screen +#: model:ir.model.fields,field_description:web_quick_start_screen.field_quick_start_screen____last_update +#: model:ir.model.fields,field_description:web_quick_start_screen.field_quick_start_screen_action____last_update +msgid "Last Modified on" +msgstr "" + +#. module: web_quick_start_screen +#: model:ir.model.fields,field_description:web_quick_start_screen.field_quick_start_screen__write_uid +#: model:ir.model.fields,field_description:web_quick_start_screen.field_quick_start_screen_action__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: web_quick_start_screen +#: model:ir.model.fields,field_description:web_quick_start_screen.field_quick_start_screen__write_date +#: model:ir.model.fields,field_description:web_quick_start_screen.field_quick_start_screen_action__write_date +msgid "Last Updated on" +msgstr "" + +#. module: web_quick_start_screen +#: model:ir.model.fields,field_description:web_quick_start_screen.field_quick_start_screen__name +#: model:ir.model.fields,field_description:web_quick_start_screen.field_quick_start_screen_action__name +msgid "Name" +msgstr "" + +#. module: web_quick_start_screen +#: model:ir.actions.server,name:web_quick_start_screen.start_screen_action +#: model:ir.model.fields,field_description:web_quick_start_screen.field_res_users__quick_start_screen_id +#: model:res.groups,name:web_quick_start_screen.group_quick_start_screen +msgid "Quick Start Screen" +msgstr "" + +#. module: web_quick_start_screen +#: model:ir.actions.act_window,name:web_quick_start_screen.quick_start_screen_action_action +#: model:ir.ui.menu,name:web_quick_start_screen.menu_quick_start_screen_action +msgid "Quick Start Screen Actions" +msgstr "" + +#. module: web_quick_start_screen +#: model:ir.actions.act_window,name:web_quick_start_screen.start_screen_action_config +#: model:ir.ui.menu,name:web_quick_start_screen.menu_quick_start_screen_action_config +msgid "Quick Start Screens" +msgstr "" + +#. module: web_quick_start_screen +#: model:ir.model,name:web_quick_start_screen.model_quick_start_screen +msgid "Quick action selection screen" +msgstr "" + +#. module: web_quick_start_screen +#: model:ir.model.fields,field_description:web_quick_start_screen.field_quick_start_screen_action__sequence +msgid "Sequence" +msgstr "" + +#. module: web_quick_start_screen +#. odoo-python +#: code:addons/web_quick_start_screen/models/quick_start_screen.py:0 +#: code:addons/web_quick_start_screen/models/quick_start_screen.py:0 +#: model:ir.ui.menu,name:web_quick_start_screen.menu_start +#: model:ir.ui.menu,name:web_quick_start_screen.menu_start_screen +#, python-format +msgid "Start" +msgstr "" + +#. module: web_quick_start_screen +#: model:ir.model.fields,field_description:web_quick_start_screen.field_quick_start_screen_action__image +msgid "Start screen icon" +msgstr "" + +#. module: web_quick_start_screen +#: model:ir.model,name:web_quick_start_screen.model_res_users +msgid "User" +msgstr "" + +#. module: web_quick_start_screen +#: model:ir.model.fields.selection,name:web_quick_start_screen.selection__quick_start_screen_action__action_ref_id__ir_actions_act_url +msgid "ir.actions.act_url" +msgstr "" + +#. module: web_quick_start_screen +#: model:ir.model.fields.selection,name:web_quick_start_screen.selection__quick_start_screen_action__action_ref_id__ir_actions_act_window +msgid "ir.actions.act_window" +msgstr "" + +#. module: web_quick_start_screen +#: model:ir.model.fields.selection,name:web_quick_start_screen.selection__quick_start_screen_action__action_ref_id__ir_actions_client +msgid "ir.actions.client" +msgstr "" + +#. module: web_quick_start_screen +#: model:ir.model.fields.selection,name:web_quick_start_screen.selection__quick_start_screen_action__action_ref_id__ir_actions_report +msgid "ir.actions.report" +msgstr "" + +#. module: web_quick_start_screen +#: model:ir.model.fields.selection,name:web_quick_start_screen.selection__quick_start_screen_action__action_ref_id__ir_actions_server +msgid "ir.actions.server" +msgstr "" diff --git a/web_quick_start_screen/models/__init__.py b/web_quick_start_screen/models/__init__.py new file mode 100644 index 000000000..778d6b620 --- /dev/null +++ b/web_quick_start_screen/models/__init__.py @@ -0,0 +1,3 @@ +from . import quick_start_screen +from . import quick_start_screen_action +from . import res_users diff --git a/web_quick_start_screen/models/quick_start_screen.py b/web_quick_start_screen/models/quick_start_screen.py new file mode 100644 index 000000000..0f674c360 --- /dev/null +++ b/web_quick_start_screen/models/quick_start_screen.py @@ -0,0 +1,68 @@ +# Copyright 2024 Tecnativa - David Vidal +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). +from collections import defaultdict + +from odoo import _, api, fields, models, tools + + +class QuicktStartScreen(models.Model): + _name = "quick.start.screen" + _description = "Quick action selection screen" + + name = fields.Char(translate=True) + action_ids = fields.Many2many(comodel_name="quick.start.screen.action") + + @api.model + @tools.ormcache("frozenset(self.env.user.groups_id.ids)") + def _visible_action_ids(self): + """Inspired on how menus visibility work in core""" + screen_actions = self.action_ids.search([]).sudo() + visible = self.action_ids.browse() + access = self.env["ir.model.access"] + MODEL_BY_TYPE = { + "ir.actions.act_window": "res_model", + "ir.actions.report": "model", + "ir.actions.server": "model_name", + } + # performance trick: determine the ids to prefetch by type + prefetch_ids = defaultdict(list) + for action in screen_actions.mapped("action_ref_id"): + prefetch_ids[action._name].append(action.id) + for screen_action in screen_actions: + action = screen_action.action_ref_id + action = action.with_prefetch(prefetch_ids[action._name]) + model_name = ( + action._name in MODEL_BY_TYPE and action[MODEL_BY_TYPE[action._name]] + ) + if not model_name or access.check(model_name, "read", False): + visible += screen_action + return set(visible.ids) + + def _prepare_screen_action(self): + return { + "display_name": self.name or _("Start"), + "name": self.name or _("Start"), + "res_model": "quick.start.screen.action", + "target": "current", + "type": "ir.actions.act_window", + "view_mode": "kanban", + "views": [ + [ + self.env.ref( + "web_quick_start_screen.quick_start_screen_action_kanban" + ).id, + "kanban", + ] + ], + } + + def action_screen_actions(self): + """Normally called from a server action""" + if not self: + self = self.env.user.quick_start_screen_id + if not self: + self = self.browse(self.env.context.get("default_quick_start_screen_id")) + action = self._prepare_screen_action() + visible_actions = set(self.action_ids.ids) & self._visible_action_ids() + action["domain"] = [("id", "in", list(visible_actions))] + return action diff --git a/web_quick_start_screen/models/quick_start_screen_action.py b/web_quick_start_screen/models/quick_start_screen_action.py new file mode 100644 index 000000000..06982937f --- /dev/null +++ b/web_quick_start_screen/models/quick_start_screen_action.py @@ -0,0 +1,68 @@ +# Copyright 2024 Tecnativa - David Vidal +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). +from odoo import fields, models +from odoo.tools.safe_eval import datetime, safe_eval + + +class DecontracStartScreenAction(models.Model): + _name = "quick.start.screen.action" + _description = "Actions to be launched from a quick start screen" + _order = "sequence, id" + + active = fields.Boolean(default=True) + sequence = fields.Integer() + name = fields.Char(required=True, translate=True) + image = fields.Image("Start screen icon", max_width=128, max_height=128, store=True) + icon_name = fields.Char(help="Just set the Font Awesome icon name. e.g.: fa-truck") + color = fields.Integer(help="Choose the icon color") + description = fields.Html(translate=True) + action_ref_id = fields.Reference( + selection=[ + ("ir.actions.report", "ir.actions.report"), + ("ir.actions.act_window", "ir.actions.act_window"), + ("ir.actions.act_url", "ir.actions.act_url"), + ("ir.actions.server", "ir.actions.server"), + ("ir.actions.client", "ir.actions.client"), + ], + required=True, + ) + domain = fields.Char( + help="Add extra domain if needed. You can use `ref('')` and it will be" + "evaluated. You can also use `datetime` and `context_today` in the same way" + "`ir.filters` do." + ) + context = fields.Char( + help="Add extra context if needed. You can use `ref('')` and it will be" + "evaluated. You can also use `datetime` and `context_today` in the same way" + "`ir.filters` do." + ) + + def _safe_eval(self, expresion): + return safe_eval( + expresion, + { + "ref": lambda r: self.env.ref(r).id, + "datetime": datetime, + "context_today": datetime.datetime.now, + }, + ) + + def _get_extra_context(self): + self.ensure_one() + return self._safe_eval(self.context or "{}") + + def run_action(self): + """Execute the action. We can override the action context if needed""" + self.ensure_one() + action = self.action_ref_id._get_action_dict() + if self.context: + extra_context = self._get_extra_context() + # We need to deal with the active_id and overwrite it if needed + active_id = extra_context.get("active_id", 0) + action["context"] = dict( + safe_eval(action.get("context", "{}"), {"active_id": active_id}), + **extra_context + ) + if self.domain: + action["domain"] = self._safe_eval(self.domain) + return action diff --git a/web_quick_start_screen/models/res_users.py b/web_quick_start_screen/models/res_users.py new file mode 100644 index 000000000..0632d0a2b --- /dev/null +++ b/web_quick_start_screen/models/res_users.py @@ -0,0 +1,9 @@ +# Copyright 2024 Tecnativa - David Vidal +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). +from odoo import fields, models + + +class ResUsers(models.Model): + _inherit = "res.users" + + quick_start_screen_id = fields.Many2one(comodel_name="quick.start.screen") diff --git a/web_quick_start_screen/readme/CONFIGURE.md b/web_quick_start_screen/readme/CONFIGURE.md new file mode 100644 index 000000000..0f44803ba --- /dev/null +++ b/web_quick_start_screen/readme/CONFIGURE.md @@ -0,0 +1,27 @@ +To create quick actions: + +- Go to *Settings > Technical > User Interface > Screen actions* and create o modify an + existing one. +- Choose the desired action, a name, a description and an icon. +- You can add an optional context so you can reuse existing actions. You can use + `ref()` to get an id that you can use in your context. You can also use + `datetime` and `context_today` in that same way you can do in `ir.filters`. + +To create quick start screens: + +- Go to *Settings > Technical > User Interface > Quick start screens* and create or + modify an existing one. +- Choose a descriptive name and link some quick screen actions. + +To assign a quick start screen to a user: + +- Go to *Settings > Users and groups > Users* and select one. +- In the *Preferences* tab, *Menus customization* section, you can choose which + *Quick start screen* will that user use. +- If you want to make the user start always in his start screen, in the same section + select the action *Quick Start Screen*. + +To activate the quick start screen menu for a user: + +- Go to *Settings > Users and groups > Users* (with debug mode on) +- In *Technical* groups, set *Quick Start Screen* on. diff --git a/web_quick_start_screen/readme/CONTEXT.md b/web_quick_start_screen/readme/CONTEXT.md new file mode 100644 index 000000000..e1dadc6d5 --- /dev/null +++ b/web_quick_start_screen/readme/CONTEXT.md @@ -0,0 +1,2 @@ +Some users use repeatedly the same actions on and on and sometimes those actions are +so many clicks away which tends to be frustrating. diff --git a/web_quick_start_screen/readme/CONTRIBUTORS.md b/web_quick_start_screen/readme/CONTRIBUTORS.md new file mode 100644 index 000000000..649292fb7 --- /dev/null +++ b/web_quick_start_screen/readme/CONTRIBUTORS.md @@ -0,0 +1,3 @@ +- [Tecnativa](https://tecnativa.com) + - Pedro M. Baeza + - David Vidal diff --git a/web_quick_start_screen/readme/DESCRIPTION.md b/web_quick_start_screen/readme/DESCRIPTION.md new file mode 100644 index 000000000..ec1608d29 --- /dev/null +++ b/web_quick_start_screen/readme/DESCRIPTION.md @@ -0,0 +1,4 @@ +This module adds a configurable start screen so users can go right into their more +common tasks. + +It can be configured at the user level or just be used as common screens. diff --git a/web_quick_start_screen/readme/ROADMAP.md b/web_quick_start_screen/readme/ROADMAP.md new file mode 100644 index 000000000..cda0b2a6e --- /dev/null +++ b/web_quick_start_screen/readme/ROADMAP.md @@ -0,0 +1,6 @@ +- Right now there's no much permissions handling, but it could be made similarly to how + menus deal with them. +- Also we could add the possibility of quick actions for users the same way that + favorite filters work. +- A tour helper that clicked in every defined action would be helpfull to detect + possible issues. diff --git a/web_quick_start_screen/readme/USAGE.md b/web_quick_start_screen/readme/USAGE.md new file mode 100644 index 000000000..d03757e24 --- /dev/null +++ b/web_quick_start_screen/readme/USAGE.md @@ -0,0 +1,2 @@ +When you have the proper config, once you login, you'll go to the quick actions +screen. Just click in and start working. diff --git a/web_quick_start_screen/security/ir.model.access.csv b/web_quick_start_screen/security/ir.model.access.csv new file mode 100644 index 000000000..9613ba4f5 --- /dev/null +++ b/web_quick_start_screen/security/ir.model.access.csv @@ -0,0 +1,5 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +web_quick_start_screen.access_start_screen,access_quick_start_screen,web_quick_start_screen.model_quick_start_screen,base.group_user,1,1,0,0 +web_quick_start_screen.access_quick_start_screen_action,access_quick_start_screen_action,web_quick_start_screen.model_quick_start_screen_action,base.group_user,1,1,0,0 +web_quick_start_screen.access_start_screen_admin,access_quick_start_screen_admin,web_quick_start_screen.model_quick_start_screen,base.group_system,1,1,1,1 +web_quick_start_screen.access_quick_start_screen_action_admin,access_quick_start_screen_action_admin,web_quick_start_screen.model_quick_start_screen_action,base.group_system,1,1,1,1 diff --git a/web_quick_start_screen/security/security.xml b/web_quick_start_screen/security/security.xml new file mode 100644 index 000000000..8afabd76b --- /dev/null +++ b/web_quick_start_screen/security/security.xml @@ -0,0 +1,7 @@ + + + + Quick Start Screen + + + diff --git a/web_quick_start_screen/static/description/icon.png b/web_quick_start_screen/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..6600373f3d44ceebe9b5b85642e3a6deaaf97139 GIT binary patch literal 5571 zcmX|FbyQT{*B+!nV33j!hOPlrhVJeThmelJ83d)90qK%dN^k&Ca_G)skXA%Wr3Iu* zx_;xkzV-ca?mla;XXic7K6l+XLwyYjGA1$r06?LoscMXqiT@S}5$;*ltt5{Vq@J1< zUI4&@n12f|W%a-rr)2b2gL<2IxOn^7zjOxp`S}UEJ%@Wa+Iu<+d%Seb-IZkm0O$<0 zRFzEq^LFwByjigMpSzyUO?WL7)qn@5>~(6La#e`h$sfH2Am>J-_a*7GLhyQ5UV;J$ z#1|JC5O)atDcfF&aKoP8gtMYsvOeK<*Z$2e*v zH^HfAFg?zE&A-w#X&ExSoxlYHX9ImxKBrgn>J7?Nb$XtRjU3n8?S?ep z=2GUmC4ssfOw}5Ct-X~iC;j3>l+q#6^q=*nt?vaBXp*kI(-61as~uEeeUJ;JeC2Ro zo>n7RHqKu*j!S44Z5o(gNs$Fqyhj*|0%+Y^M8|nbar@8RBf)!+^lhuUh3hO9z4m^z zGJ@~KWA4R_G=ydSLSu4vvkt{)=WD1w0XE@!^k`hKzn?~M%0m)H@gR{sNG{#I;;(d& zH#&|0yB_2?(=O+bgvI_GI5AK+NLHo!WmZ3Sh)quBMmxIx^%#Kqqw?3|rz}EeG$G?k z07?I9SpI6XPa4xFoP5P?31StnbUn9=qmPZjq2!?`vAS`(%DP~5ao$M7VbNwqC}K8Y z-tx@I$6UczJHci?%rt*8CI1lhW}VH<_1KY|z(n80=0BzLJa?uEFh!wkZ1Z#3e|wMr z_VgV(0;QmLq5lkp0^XSFE45#JlrCp0-w^(k7vcY(YxAQiMJYnY>;D2;SmCdt8@>U2 z8fDFg^arR2TuL%A`Vw8Nh_=1z=AC6%`$u}Tzt_iazAeP@&Rh5BU2d{cVJ2>Kp#E%C zl1JDaYH~oLdPR2E(brD1xR@m+$kI6enew!y_lSJo2&RZ)`*=lR+BP@c#rskp4liVx z(i~UqC!$t3WEWO&6-{3qPgZr3ZQUhGCn6TyJSZ|SOzb%WGoWZnL~rIT8t-{f z;^2YHU~#xiffOE_JCh>pmWRjD^wQi3=dUrxSq4H;s)!q|KZpZn1Hj&N_S^#L6(*G*n)1O*Tt%+#J z{unH11s+bGi=<&-v0GaomH+A5bKNC{pFswSAh@lF0=^m)URHw8Eim!LOcsIFz|44t zZ~M5aE;or>Cr2sEu=jw z6>(S5!SIPv8L0Dne(?%9lcgm9GoxsnltITT_Zrvcv%E*vfm7x@ z!@1X2lfLbBCBzxVQ1?(tIWMm&<~fDgjbH5oGWl0S1GQ4T*R5U((R01GG;^ooLHh|3 z`a}Rt9_DuBa~@ak+v16qKr>%~^9cvMZ+F#B^Hk0bwc6fx`q#>_Gb#k%=xFkg5^(gg zZ6g&`G1L55=&nts5O3FG3g-kuAVK_|^p!5G#W7LTEH~7RsvON#94TKc)t&dCYFda2C=!5B`%>R znnZ_}vC1*J&08%Z9I3SIBm|w&tiW;8ZpOJaEEMz4h`&V2AzQcL>XKsJJshD;|9cg? zyh0#YAW4WR5(b2SR$$|q?Qzd7FJW#KE6hxKMf_r4u?os#QCJNJ;?B+R-!BPsx5H60 zou!N!#*)^fXek%xs)L!eXB*MD!|jlnTEaFGKmuT=UFZzoyGFg4&r9;zO2GpR&@))i zH{OXZ6&J}G!%l@;2KsMz7eje^Sk~H|@!w8EdjAeay3Z_i7l{;*0YIp`VJcJr=bT%7{qrGgn*g+B(w}u3w?xnR(T~7<`2ZY4{bPhPlk2+ z^bkGA2#4K1#}7T#XXE2@s-tH-H@fzvk
    oPn>!>w#e6{zySG)G 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 + + + + + + + + + + + + + + + + + diff --git a/web_quick_start_screen/static/description/index.html b/web_quick_start_screen/static/description/index.html new file mode 100644 index 000000000..4e9b25671 --- /dev/null +++ b/web_quick_start_screen/static/description/index.html @@ -0,0 +1,487 @@ + + + + + +Quick Start Screen + + + +
    +

    Quick Start Screen

    + + +

    Beta License: AGPL-3 OCA/web Translate me on Weblate Try me on Runboat

    +

    This module adds a configurable start screen so users can go right into +their more common tasks.

    +

    It can be configured at the user level or just be used as common +screens.

    +

    Table of contents

    + +
    +

    Use Cases / Context

    +

    Some users use repeatedly the same actions on and on and sometimes those +actions are so many clicks away which tends to be frustrating.

    +
    +
    +

    Configuration

    +

    To create quick actions:

    +
      +
    • Go to Settings > Technical > User Interface > Screen actions and +create o modify an existing one.
    • +
    • Choose the desired action, a name, a description and an icon.
    • +
    • You can add an optional context so you can reuse existing actions. +You can use ref(<xml_id>) to get an id that you can use in your +context. You can also use datetime and context_today in that +same way you can do in ir.filters.
    • +
    +

    To create quick start screens:

    +
      +
    • Go to Settings > Technical > User Interface > Quick start screens +and create or modify an existing one.
    • +
    • Choose a descriptive name and link some quick screen actions.
    • +
    +

    To assign a quick start screen to a user:

    +
      +
    • Go to Settings > Users and groups > Users and select one.
    • +
    • In the Preferences tab, Menus customization section, you can +choose which Quick start screen will that user use.
    • +
    • If you want to make the user start always in his start screen, in the +same section select the action Quick Start Screen.
    • +
    +

    To activate the quick start screen menu for a user:

    +
      +
    • Go to Settings > Users and groups > Users (with debug mode on)
    • +
    • In Technical groups, set Quick Start Screen on.
    • +
    +
    +
    +

    Usage

    +

    When you have the proper config, once you login, you’ll go to the quick +actions screen. Just click in and start working.

    +
    +
    +

    Known issues / Roadmap

    +
      +
    • Right now there’s no much permissions handling, but it could be made +similarly to how menus deal with them.
    • +
    • Also we could add the possibility of quick actions for users the same +way that favorite filters work.
    • +
    • A tour helper that clicked in every defined action would be helpfull +to detect possible issues.
    • +
    +
    +
    +

    Bug Tracker

    +

    Bugs are tracked on GitHub Issues. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +feedback.

    +

    Do not contact contributors directly about support or help with technical issues.

    +
    +
    +

    Credits

    +
    +

    Authors

    +
      +
    • Tecnativa
    • +
    +
    +
    +

    Contributors

    +
      +
    • Tecnativa
        +
      • Pedro M. Baeza
      • +
      • David Vidal
      • +
      +
    • +
    +
    +
    +

    Maintainers

    +

    This module is maintained by the OCA.

    + +Odoo Community Association + +

    OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use.

    +

    This module is part of the OCA/web project on GitHub.

    +

    You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

    +
    +
    +
    + + diff --git a/web_quick_start_screen/static/src/js/kanban_controller.esm.js b/web_quick_start_screen/static/src/js/kanban_controller.esm.js new file mode 100644 index 000000000..d409c65bd --- /dev/null +++ b/web_quick_start_screen/static/src/js/kanban_controller.esm.js @@ -0,0 +1,18 @@ +/** @odoo-module */ +/* Copyright 2024 Tecnativa - David Vidal + * License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). */ +import {ControlPanel} from "@web/search/control_panel/control_panel"; +import {kanbanView} from "@web/views/kanban/kanban_view"; +import {registry} from "@web/core/registry"; +const {xml} = owl; + +export class QuickStartScreenControlPanel extends ControlPanel {} + +// We want to remove the control panel from this view. +QuickStartScreenControlPanel.template = xml`
    `; + +export const quickStartScreenView = { + ...kanbanView, + ControlPanel: QuickStartScreenControlPanel, +}; +registry.category("views").add("quick_start_screen", quickStartScreenView); diff --git a/web_quick_start_screen/static/src/scss/quick_start_screen.scss b/web_quick_start_screen/static/src/scss/quick_start_screen.scss new file mode 100644 index 000000000..52654cc46 --- /dev/null +++ b/web_quick_start_screen/static/src/scss/quick_start_screen.scss @@ -0,0 +1,6 @@ +// Set all the colors but the "no-color" one +@for $size from 2 through length($o-colors) { + .o_start_icon_color_#{$size - 1} { + color: nth($o-colors, $size); + } +} diff --git a/web_quick_start_screen/tests/__init__.py b/web_quick_start_screen/tests/__init__.py new file mode 100644 index 000000000..a37504de3 --- /dev/null +++ b/web_quick_start_screen/tests/__init__.py @@ -0,0 +1,2 @@ +from . import test_web_quick_start_screen +from .test_web_quick_start_screen import TestQuickStartActionsCommon diff --git a/web_quick_start_screen/tests/test_web_quick_start_screen.py b/web_quick_start_screen/tests/test_web_quick_start_screen.py new file mode 100644 index 000000000..c0e7874c3 --- /dev/null +++ b/web_quick_start_screen/tests/test_web_quick_start_screen.py @@ -0,0 +1,26 @@ +# Copyright 2024 Tecnativa - David Vidal +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). +from odoo.tests import TransactionCase + + +class TestQuickStartActionsCommon(TransactionCase): + def _test_screen_action(self, screen_action): + """Basic test helper. For a more complete one we'd need a tour""" + action = screen_action.run_action() + if action["type"] == "ir.actions.server": + action = ( + self.env.ref(action["xml_id"]) + .with_context(**screen_action._get_extra_context()) + .run() + ) + return action + + +class TestQuickStartActions(TestQuickStartActionsCommon): + def test_demo_screen_actions(self): + """Let's test every action screen in our demo data""" + demo_start_screen = self.env.ref( + "web_quick_start_screen.quick_start_screen_demo" + ) + for action in demo_start_screen.action_ids: + self._test_screen_action(action) diff --git a/web_quick_start_screen/views/quick_screen_action_view.xml b/web_quick_start_screen/views/quick_screen_action_view.xml new file mode 100644 index 000000000..bde1f3149 --- /dev/null +++ b/web_quick_start_screen/views/quick_screen_action_view.xml @@ -0,0 +1,110 @@ + + + + quick.start.screen.action + + + + + + + + + + + quick.start.screen.action + + + + + + + + + + + +
    +
    +
    +
    + + +
    +
    +
    +
    +

    + +

    +
    +
    +
    +
    +
    +
    +
    +
    + + quick.start.screen.action + +
    + + + + + + + + + + + + +
    +
    +
    + + Quick Start Screen Actions + quick.start.screen.action + tree,form + + +
    diff --git a/web_quick_start_screen/views/quick_start_screen_views.xml b/web_quick_start_screen/views/quick_start_screen_views.xml new file mode 100644 index 000000000..022561e5a --- /dev/null +++ b/web_quick_start_screen/views/quick_start_screen_views.xml @@ -0,0 +1,54 @@ + + + quick.start.screen + + + + +