diff --git a/README.md b/README.md index 3b164140b410..1641bc6c13d9 100644 --- a/README.md +++ b/README.md @@ -37,6 +37,7 @@ addon | version | maintainers | summary [web_filter_header_button](web_filter_header_button/) | 18.0.1.0.0 | | Show selected filters as buttons in the control panel [web_form_banner](web_form_banner/) | 18.0.1.1.0 | | Web Form Banner [web_group_expand](web_group_expand/) | 18.0.1.0.1 | | Group Expand Buttons +[web_help](web_help/) | 18.0.1.0.0 | | Help Framework [web_ir_actions_act_multi](web_ir_actions_act_multi/) | 18.0.1.0.0 | | Enables triggering of more than one action on ActionManager [web_ir_actions_act_window_message](web_ir_actions_act_window_message/) | 18.0.1.0.1 | | Show a message box to users [web_m2x_options](web_m2x_options/) | 18.0.1.0.3 | | web_m2x_options @@ -46,11 +47,12 @@ addon | version | maintainers | summary [web_notify_channel_message](web_notify_channel_message/) | 18.0.1.0.1 | | Send an instant notification to channel users when a new message is posted [web_notify_upgrade](web_notify_upgrade/) | 18.0.1.0.0 | | Notify active users when a module is installed or updated [web_pivot_computed_measure](web_pivot_computed_measure/) | 18.0.1.0.5 | CarlosRoca13 | Web Pivot Computed Measure +[web_portal_properties](web_portal_properties/) | 18.0.1.0.0 | | Add a new field on properties to show them on portal [web_pwa_customize](web_pwa_customize/) | 18.0.1.0.0 | victoralmau | Web Pwa Customize [web_quick_start_screen](web_quick_start_screen/) | 18.0.1.0.0 | | Configurable start screen for quick actions [web_refresher](web_refresher/) | 18.0.1.0.0 | | Web Refresher [web_remember_tree_column_width](web_remember_tree_column_width/) | 18.0.1.0.2 | frahikLV luisg123v cuongnmtm | Remember the tree columns' widths across sessions. -[web_responsive](web_responsive/) | 18.0.1.0.5 | Tardo SplashS | Responsive web client, community-supported +[web_responsive](web_responsive/) | 18.0.1.0.6 | Tardo SplashS | Responsive web client, community-supported [web_save_discard_button](web_save_discard_button/) | 18.0.1.0.1 | synconics | Save & Discard Buttons [web_search_with_and](web_search_with_and/) | 18.0.1.0.1 | | Use AND conditions on omnibar search [web_send_message_popup](web_send_message_popup/) | 18.0.1.0.0 | | Web Send Message as Popup diff --git a/setup/_metapackage/pyproject.toml b/setup/_metapackage/pyproject.toml index 763993242380..32643c4de4c0 100644 --- a/setup/_metapackage/pyproject.toml +++ b/setup/_metapackage/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "odoo-addons-oca-web" -version = "18.0.20260501.0" +version = "18.0.20260513.0" dependencies = [ "odoo-addon-web_calendar_slot_duration==18.0.*", "odoo-addon-web_chatter_position==18.0.*", @@ -18,6 +18,7 @@ dependencies = [ "odoo-addon-web_filter_header_button==18.0.*", "odoo-addon-web_form_banner==18.0.*", "odoo-addon-web_group_expand==18.0.*", + "odoo-addon-web_help==18.0.*", "odoo-addon-web_ir_actions_act_multi==18.0.*", "odoo-addon-web_ir_actions_act_window_message==18.0.*", "odoo-addon-web_m2x_options==18.0.*", @@ -27,6 +28,7 @@ dependencies = [ "odoo-addon-web_notify_channel_message==18.0.*", "odoo-addon-web_notify_upgrade==18.0.*", "odoo-addon-web_pivot_computed_measure==18.0.*", + "odoo-addon-web_portal_properties==18.0.*", "odoo-addon-web_pwa_customize==18.0.*", "odoo-addon-web_quick_start_screen==18.0.*", "odoo-addon-web_refresher==18.0.*", diff --git a/web_chatter_position/i18n/es.po b/web_chatter_position/i18n/es.po index b79c9e28b8f0..7c929d8efdab 100644 --- a/web_chatter_position/i18n/es.po +++ b/web_chatter_position/i18n/es.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: Odoo Server 16.0\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2026-04-19 09:41+0000\n" +"PO-Revision-Date: 2026-05-07 17:46+0000\n" "Last-Translator: Ed-Spain \n" "Language-Team: none\n" "Language: es\n" @@ -29,7 +29,7 @@ msgstr "Abajo" #. module: web_chatter_position #: model:ir.model.fields,field_description:web_chatter_position.field_res_users__chatter_position msgid "Chatter Position" -msgstr "Posición del historial de comunicación" +msgstr "Posición del historial de comunicación (Chatter)" #. module: web_chatter_position #: model:ir.model.fields.selection,name:web_chatter_position.selection__res_users__chatter_position__sided diff --git a/web_company_color/i18n/es.po b/web_company_color/i18n/es.po index a71751d42d5d..9acc5c3987c6 100644 --- a/web_company_color/i18n/es.po +++ b/web_company_color/i18n/es.po @@ -7,7 +7,7 @@ msgstr "" "Project-Id-Version: Odoo Server 13.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2022-03-02 15:55+0000\n" -"PO-Revision-Date: 2026-04-13 08:14+0000\n" +"PO-Revision-Date: 2026-05-10 08:29+0000\n" "Last-Translator: Ed-Spain \n" "Language-Team: none\n" "Language: es\n" diff --git a/web_dialog_size/i18n/es.po b/web_dialog_size/i18n/es.po index a3647c364aad..751efa7c4363 100644 --- a/web_dialog_size/i18n/es.po +++ b/web_dialog_size/i18n/es.po @@ -6,20 +6,20 @@ msgid "" msgstr "" "Project-Id-Version: Odoo Server 14.0\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2021-05-25 11:47+0000\n" -"Last-Translator: Valentin Vinagre \n" +"PO-Revision-Date: 2026-05-07 17:46+0000\n" +"Last-Translator: Ed-Spain \n" "Language-Team: none\n" "Language: es\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: \n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.3.2\n" +"X-Generator: Weblate 5.15.2\n" #. module: web_dialog_size #: model:ir.model,name:web_dialog_size.model_ir_config_parameter msgid "System Parameter" -msgstr "Parámetro del sistema" +msgstr "Parámetro del Sistema" #~ msgid "ID" #~ msgstr "ID" diff --git a/web_disable_export_group/i18n/es.po b/web_disable_export_group/i18n/es.po index 0ccd2dbc6e0a..f2e3070a2bbb 100644 --- a/web_disable_export_group/i18n/es.po +++ b/web_disable_export_group/i18n/es.po @@ -6,15 +6,15 @@ msgid "" msgstr "" "Project-Id-Version: Odoo Server 12.0\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2023-11-19 19:33+0000\n" -"Last-Translator: Ivorra78 \n" +"PO-Revision-Date: 2026-05-07 17:46+0000\n" +"Last-Translator: Ed-Spain \n" "Language-Team: none\n" "Language: es\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: \n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.17\n" +"X-Generator: Weblate 5.15.2\n" #. module: web_disable_export_group #: model:ir.model,name:web_disable_export_group.model_base @@ -24,7 +24,7 @@ msgstr "Base" #. module: web_disable_export_group #: model:res.groups,name:web_disable_export_group.group_export_xlsx_data msgid "Direct Export (xlsx)" -msgstr "Exportación directa (xlsx)" +msgstr "Exportación Directa (xlsx)" #. module: web_disable_export_group #: model:ir.model,name:web_disable_export_group.model_ir_http diff --git a/web_environment_ribbon/i18n/es.po b/web_environment_ribbon/i18n/es.po index 39ffdbe670f8..037d85c749b2 100644 --- a/web_environment_ribbon/i18n/es.po +++ b/web_environment_ribbon/i18n/es.po @@ -6,20 +6,20 @@ msgid "" msgstr "" "Project-Id-Version: Odoo Server 12.0\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2019-08-04 17:44+0000\n" -"Last-Translator: eduardgm \n" +"PO-Revision-Date: 2026-05-07 17:46+0000\n" +"Last-Translator: Ed-Spain \n" "Language-Team: none\n" "Language: es\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: \n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 3.7.1\n" +"X-Generator: Weblate 5.15.2\n" #. module: web_environment_ribbon #: model:ir.model,name:web_environment_ribbon.model_web_environment_ribbon_backend msgid "Web Environment Ribbon Backend" -msgstr "Backend \"Web Environment Ribbon\"" +msgstr "Barra del entorno web (backend)" #~ msgid "Display Name" #~ msgstr "Nombre mostrado" diff --git a/web_form_banner/i18n/es.po b/web_form_banner/i18n/es.po new file mode 100644 index 000000000000..bd35d260bc73 --- /dev/null +++ b/web_form_banner/i18n/es.po @@ -0,0 +1,422 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * web_form_banner +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 18.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2026-05-07 20:45+0000\n" +"Last-Translator: Ed-Spain \n" +"Language-Team: none\n" +"Language: es\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 5.15.2\n" + +#. module: web_form_banner +#: model_terms:ir.ui.view,arch_db:web_form_banner.view_web_form_banner_rule_form +msgid "//sheet" +msgstr "//hoja" + +#. module: web_form_banner +#: model_terms:ir.ui.view,arch_db:web_form_banner.view_web_form_banner_rule_form +msgid "" +"context_today(ts=None): User-timezone “today” (date) for " +"reliable date comparisons." +msgstr "" +"context_today(ts=None): Fecha \"hoy\" en la zona horaria del " +"usuario (date) para comparaciones de fechas fiables." + +#. module: web_form_banner +#: model_terms:ir.ui.view,arch_db:web_form_banner.view_web_form_banner_rule_form +msgid "" +"ctx: Copy of the current context " +"(dict(env.context))." +msgstr "" +"ctx: Copia del contexto actual (dict(env.context))." + +#. module: web_form_banner +#: model_terms:ir.ui.view,arch_db:web_form_banner.view_web_form_banner_rule_form +msgid "" +"dateutil: { \"parser\": dateutil.parser, " +"\"relativedelta\": dateutil.relativedelta }" +msgstr "" +"dateutil: { \"parser\": dateutil.parser, " +"\"relativedelta\": dateutil.relativedelta }" + +#. module: web_form_banner +#: model_terms:ir.ui.view,arch_db:web_form_banner.view_web_form_banner_rule_form +msgid "" +"draft: The persisted field values of the ORM record (before applying the current\n" +" form's unsaved changes) + the current unsaved changes on trigger fields.\n" +" Should be used instead of record when your rule is triggered dynamically by an\n" +" update to a trigger field. It doesn't include any values from complex fields\n" +" (one2many/reference, etc)." +msgstr "" +"draft: Los valores persistidos de los campos del registro ORM " +"(antes de aplicar los\n" +"cambios no guardados del formulario actual) + los cambios no guardados " +"actuales en los campos desencadenadores.\n" +"Debe usarse en lugar de record cuando su regla se activa " +"dinámicamente por una\n" +"actualización de un campo desencadenador. No incluye valores de campos " +"complejos\n" +"(one2many/referencia, etc)." + +#. module: web_form_banner +#: model_terms:ir.ui.view,arch_db:web_form_banner.view_web_form_banner_rule_form +msgid "env: Odoo environment for ORM access." +msgstr "env: Entorno de Odoo para el acceso ORM." + +#. module: web_form_banner +#: model_terms:ir.ui.view,arch_db:web_form_banner.view_web_form_banner_rule_form +msgid "" +"float_compare, float_is_zero, " +"float_round: Odoo float utils for precision-safe " +"comparisons/rounding." +msgstr "" +"float_compare, float_is_zero, float_round: Utilidades de Odoo para operaciones con decimales con comparaciones/" +"redondeo de precisión segura." + +#. module: web_form_banner +#: model_terms:ir.ui.view,arch_db:web_form_banner.view_web_form_banner_rule_form +msgid "" +"model: Shortcut to the current model " +"(env[record._name])." +msgstr "" +"model: Atajo al modelo actual (env[record._name])." + +#. module: web_form_banner +#: model_terms:ir.ui.view,arch_db:web_form_banner.view_web_form_banner_rule_form +msgid "record: Current record (the form's record)." +msgstr "record: Registro actual (el registro del formulario)." + +#. module: web_form_banner +#: model_terms:ir.ui.view,arch_db:web_form_banner.view_web_form_banner_rule_form +msgid "" +"record_id: Integer id of the record being edited, or False if the form\n" +" is creating a new record." +msgstr "" +"record_id: ID entero del registro que se está editando, o " +"False si el formulario\n" +"está creando un nuevo registro." + +#. module: web_form_banner +#: model_terms:ir.ui.view,arch_db:web_form_banner.view_web_form_banner_rule_form +msgid "time, datetime: Standard Python time/datetime modules." +msgstr "time, datetime: Módulos estándar de Python time/datetime." + +#. module: web_form_banner +#: model_terms:ir.ui.view,arch_db:web_form_banner.view_web_form_banner_rule_form +msgid "timezone: pytz.timezone for TZ handling." +msgstr "" +"timezone: pytz.timezone para el manejo de zonas " +"horarias." + +#. module: web_form_banner +#: model_terms:ir.ui.view,arch_db:web_form_banner.view_web_form_banner_rule_form +msgid "" +"url_for(obj): Helper that returns a backend form URL for " +"obj." +msgstr "" +"url_for(obj): Auxiliar que devuelve una URL de formulario " +"backend para obj." + +#. module: web_form_banner +#: model_terms:ir.ui.view,arch_db:web_form_banner.view_web_form_banner_rule_form +msgid "user: Current user (env.user)." +msgstr "user: Usuario actual (env.user)." + +#. module: web_form_banner +#: model:ir.model.fields,field_description:web_form_banner.field_web_form_banner_rule__active +msgid "Active" +msgstr "Activo" + +#. module: web_form_banner +#: model:ir.model.fields.selection,name:web_form_banner.selection__web_form_banner_rule__position__after +msgid "After target" +msgstr "Después del destino" + +#. module: web_form_banner +#: model_terms:ir.ui.view,arch_db:web_form_banner.view_web_form_banner_rule_form +#: model_terms:ir.ui.view,arch_db:web_form_banner.view_web_form_banner_rule_search +msgid "Archived" +msgstr "archivado" + +#. module: web_form_banner +#: model_terms:ir.ui.view,arch_db:web_form_banner.view_web_form_banner_rule_form +msgid "Available evaluation context variables are as follows:" +msgstr "Las variables de contexto de evaluación disponibles son las siguientes:" + +#. module: web_form_banner +#: model:ir.model,name:web_form_banner.model_base +msgid "Base" +msgstr "Base" + +#. module: web_form_banner +#: model:ir.model.fields.selection,name:web_form_banner.selection__web_form_banner_rule__position__before +msgid "Before target" +msgstr "Antes del destino" + +#. module: web_form_banner +#: model:ir.model.fields,field_description:web_form_banner.field_web_form_banner_rule__create_uid +msgid "Created by" +msgstr "Creado por" + +#. module: web_form_banner +#: model:ir.model.fields,field_description:web_form_banner.field_web_form_banner_rule__create_date +msgid "Created on" +msgstr "Creación en" + +#. module: web_form_banner +#: model:ir.model.fields.selection,name:web_form_banner.selection__web_form_banner_rule__severity__danger +msgid "Danger" +msgstr "Peligro" + +#. module: web_form_banner +#: model:ir.model.fields,field_description:web_form_banner.field_web_form_banner_rule__severity +#: model_terms:ir.ui.view,arch_db:web_form_banner.view_web_form_banner_rule_search +msgid "Default Severity" +msgstr "Gravedad predeterminada" + +#. module: web_form_banner +#: model:ir.model.fields,help:web_form_banner.field_web_form_banner_rule__severity +msgid "Default severity level, can be overridden per-record." +msgstr "Nivel de gravedad predeterminado, puede modificarse por registro." + +#. module: web_form_banner +#: model:ir.model.fields,field_description:web_form_banner.field_web_form_banner_rule__display_name +msgid "Display Name" +msgstr "Hitos Requeridos" + +#. module: web_form_banner +#: model_terms:ir.ui.view,arch_db:web_form_banner.view_web_form_banner_rule_form +msgid "Example of Message Value Code (model: sale.order)" +msgstr "Ejemplo de código de valor de mensaje (modelo: sale.order)" + +#. module: web_form_banner +#: model:ir.model,name:web_form_banner.model_web_form_banner_rule +#: model_terms:ir.ui.view,arch_db:web_form_banner.view_web_form_banner_rule_form +msgid "Form Banner Rule" +msgstr "Regla de Banner de Formulario" + +#. module: web_form_banner +#: model:ir.actions.act_window,name:web_form_banner.action_web_form_banner_rule +#: model:ir.ui.menu,name:web_form_banner.menu_web_form_banner_rules +msgid "Form Banner Rules" +msgstr "Reglas de Banner de Formulario" + +#. module: web_form_banner +#: model:ir.model.fields,help:web_form_banner.field_web_form_banner_rule__view_ids +msgid "Form view where the banner should be injected." +msgstr "Vista de formulario donde se debe inyectar el banner." + +#. module: web_form_banner +#: model_terms:ir.ui.view,arch_db:web_form_banner.view_web_form_banner_rule_search +msgid "Group By" +msgstr "agrupado por" + +#. module: web_form_banner +#: model:ir.model.fields,field_description:web_form_banner.field_web_form_banner_rule__message_is_html +msgid "HTML" +msgstr "HTML" + +#. module: web_form_banner +#: model_terms:ir.ui.view,arch_db:web_form_banner.view_web_form_banner_rule_form +msgid "Help" +msgstr "Ayuda" + +#. module: web_form_banner +#: model_terms:ir.ui.view,arch_db:web_form_banner.view_web_form_banner_rule_form +msgid "Help for Message Valude Code" +msgstr "Ayuda para el código de valor del mensaje" + +#. module: web_form_banner +#: model:ir.model.fields,field_description:web_form_banner.field_web_form_banner_rule__id +msgid "ID" +msgstr "ID (identificación)" + +#. module: web_form_banner +#: model:ir.model.fields,help:web_form_banner.field_web_form_banner_rule__message_is_html +msgid "" +"If checked, 'message' is treated as raw HTML (no escaping). If not checked, " +"the rendered text is escaped and newlines become
." +msgstr "" +"Si está marcado, el 'mensaje' se trata como HTML puro (sin escape). Si no " +"está marcado, el texto renderizado se escapa y los saltos de línea se " +"convierten en
." + +#. module: web_form_banner +#: model:ir.model.fields,help:web_form_banner.field_web_form_banner_rule__trigger_field_ids +msgid "If set, the banner recomputes live when any of these fields change." +msgstr "" +"Si se establece, el banner se recalcula en tiempo real cuando cambia alguno " +"de estos campos." + +#. module: web_form_banner +#: model:ir.model.fields.selection,name:web_form_banner.selection__web_form_banner_rule__severity__info +msgid "Info" +msgstr "Info" + +#. module: web_form_banner +#. odoo-python +#: code:addons/web_form_banner/models/web_form_banner_rule.py:0 +msgid "" +"Invalid XPath:\n" +"%s" +msgstr "" +"XPath no válido:\n" +"%s" + +#. module: web_form_banner +#: model:ir.model.fields,field_description:web_form_banner.field_web_form_banner_rule__write_uid +msgid "Last Updated by" +msgstr "Modificado por última vez por" + +#. module: web_form_banner +#: model:ir.model.fields,field_description:web_form_banner.field_web_form_banner_rule__write_date +msgid "Last Updated on" +msgstr "??ltima Actualizaci??n el" + +#. module: web_form_banner +#: model:ir.model.fields,field_description:web_form_banner.field_web_form_banner_rule__message +msgid "Message" +msgstr "Mensajes" + +#. module: web_form_banner +#: model:ir.model.fields,field_description:web_form_banner.field_web_form_banner_rule__message_value_code +#: model_terms:ir.ui.view,arch_db:web_form_banner.view_web_form_banner_rule_form +msgid "Message Value Code" +msgstr "Código de valor del mensaje" + +#. module: web_form_banner +#: model:ir.model.fields,field_description:web_form_banner.field_web_form_banner_rule__model_id +#: model_terms:ir.ui.view,arch_db:web_form_banner.view_web_form_banner_rule_search +msgid "Model" +msgstr "Modelo" + +#. module: web_form_banner +#: model:ir.model.fields,field_description:web_form_banner.field_web_form_banner_rule__model_name +msgid "Model Name" +msgstr "Nombre de modelo" + +#. module: web_form_banner +#: model:ir.model.fields,field_description:web_form_banner.field_web_form_banner_rule__name +msgid "Name" +msgstr "Nombrr" + +#. module: web_form_banner +#: model:ir.model.fields,field_description:web_form_banner.field_web_form_banner_rule__position +msgid "Position" +msgstr "Posició" + +#. module: web_form_banner +#: model:ir.model.fields,help:web_form_banner.field_web_form_banner_rule__message_value_code +msgid "" +"Python expression evaluated server-side. Must return a dict.\n" +"Keys: visible(bool, default True), severity(str), values(dict for ${...} in \n" +"message), and/or html(str) to override template rendering." +msgstr "" +"Expresión Python evaluada en el servidor. Debe devolver un dict.\n" +"Claves: visible(bool, por defecto True), severity(str), values(dict para $" +"{...} en\n" +"mensaje), y/o html(str) para reemplazar el renderizado de la plantilla." + +#. module: web_form_banner +#: model_terms:ir.ui.view,arch_db:web_form_banner.view_web_form_banner_rule_form +msgid "Recompute on change (new forms)" +msgstr "Recalcular al cambiar (formularios nuevos)" + +#. module: web_form_banner +#: model:ir.model.fields,field_description:web_form_banner.field_web_form_banner_rule__sequence +msgid "Sequence" +msgstr "Secuencia" + +#. module: web_form_banner +#: model:web.form.banner.rule,message:web_form_banner.demo_rule_partner_tag_missing +msgid "Tag is missing!" +msgstr "¡Etiqueta faltante!" + +#. module: web_form_banner +#: model:ir.model.fields,field_description:web_form_banner.field_web_form_banner_rule__target_xpath +msgid "Target XPath" +msgstr "XPath destino" + +#. module: web_form_banner +#: model:ir.model.fields,help:web_form_banner.field_web_form_banner_rule__message +msgid "Template with ${placeholders}. If not HTML, it will be escaped." +msgstr "Plantilla con ${marcadores}. Si no es HTML, se escapará." + +#. module: web_form_banner +#: model_terms:ir.ui.view,arch_db:web_form_banner.view_web_form_banner_rule_form +msgid "This is a ${severity} message." +msgstr "Este es un mensaje de tipo ${severity}." + +#. module: web_form_banner +#: model:web.form.banner.rule,message:web_form_banner.demo_rule_partner_email_missing +msgid "This partner is missing email!" +msgstr "¡A este cliente le falta el correo electrónico!" + +#. module: web_form_banner +#: model:ir.model.fields,field_description:web_form_banner.field_web_form_banner_rule__trigger_field_ids +msgid "Trigger Fields" +msgstr "Campos desencadenadores" + +#. module: web_form_banner +#: model:ir.model.fields,field_description:web_form_banner.field_web_form_banner_rule__view_ids +msgid "Views" +msgstr "Vistas" + +#. module: web_form_banner +#: model:ir.model.fields.selection,name:web_form_banner.selection__web_form_banner_rule__severity__warning +msgid "Warning" +msgstr "Advertencia" + +#. module: web_form_banner +#: model:ir.model.fields,help:web_form_banner.field_web_form_banner_rule__position +msgid "Where to insert the placeholder relative to the first matched node." +msgstr "" +"Dónde insertar el marcador de posición relativo al primer nodo coincidente." + +#. module: web_form_banner +#: model:ir.model.fields,help:web_form_banner.field_web_form_banner_rule__target_xpath +msgid "XPath of the node to insert the banner." +msgstr "XPath del nodo donde insertar el banner." + +#. module: web_form_banner +#: model_terms:ir.ui.view,arch_db:web_form_banner.view_web_form_banner_rule_form +msgid "" +"domain = [(\"partner_id\", \"=\", draft.partner_id.id)]\n" +"if record_id:\n" +" domain += [(\"id\", \"<\", record_id)]\n" +"last = model.search(domain, order=\"date_order desc, id desc\", limit=1)\n" +"if last:\n" +" html = \"<strong>Previous order:</strong> <a href='%s'>%s</a>\" % (url_for(last), last.name)\n" +" result = {\"visible\": True, \"html\": html}\n" +"else:\n" +" result = {\"visible\": False}" +msgstr "" +"domain = [(\"partner_id\", \"=\", draft.partner_id.id)]\n" +"if record_id:\n" +" domain += [(\"id\", \"<\", record_id)]\n" +"last = model.search(domain, order=\"date_order desc, id desc\", limit=1)\n" +"if last:\n" +" html = \"Previous order: %s\" % " +"(url_for(last), last.name)\n" +" result = {\"visible\": True, \"html\": html}\n" +"else:\n" +" result = {\"visible\": False}" + +#. module: web_form_banner +#: model_terms:ir.ui.view,arch_db:web_form_banner.view_web_form_banner_rule_form +msgid "e.g. Warning on dangerous customers" +msgstr "ej. Advertencia en clientes peligrosos" + +#. module: web_form_banner +#: model_terms:ir.ui.view,arch_db:web_form_banner.view_web_form_banner_rule_tree +msgid "return {'visible': True, 'values': {'title': '...'}}" +msgstr "return {'visible': True, 'values': {'title': '...'}}" diff --git a/web_form_banner/i18n/it.po b/web_form_banner/i18n/it.po index 012f98d51ec8..ddd4596ac068 100644 --- a/web_form_banner/i18n/it.po +++ b/web_form_banner/i18n/it.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: Odoo Server 18.0\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2025-11-05 16:42+0000\n" +"PO-Revision-Date: 2026-05-11 17:45+0000\n" "Last-Translator: mymage \n" "Language-Team: none\n" "Language: it\n" @@ -14,7 +14,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: \n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 5.10.4\n" +"X-Generator: Weblate 5.15.2\n" #. module: web_form_banner #: model_terms:ir.ui.view,arch_db:web_form_banner.view_web_form_banner_rule_form @@ -106,6 +106,9 @@ msgid "" "False if the form\n" " is creating a new record." msgstr "" +"record_id: ID intero del record in fase di modifica, oppure " +"False se la maschera\n" +" sta creando un nuovo record." #. module: web_form_banner #: model_terms:ir.ui.view,arch_db:web_form_banner.view_web_form_banner_rule_form diff --git a/web_help/README.rst b/web_help/README.rst new file mode 100644 index 000000000000..f7da515d1a35 --- /dev/null +++ b/web_help/README.rst @@ -0,0 +1,116 @@ +.. image:: https://odoo-community.org/readme-banner-image + :target: https://odoo-community.org/get-involved?utm_source=readme + :alt: Odoo Community Association + +============== +Help Framework +============== + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:2eed0036ddf9fb18211c7c0b9684b5787a6ff6c2e318c2c8516ab6f47eaba8c3 + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |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/license-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/18.0/web_help + :alt: OCA/web +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/web-18-0/web-18-0-web_help + :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=18.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +This module introduces a new way to guide the user through Odoo. This +module is created because **the standard Odoo tours:** + +1. forces the user to create records; +2. cannot be reopened; +3. is only available for the admin user; +4. the bubbles are not obvious. + +**Table of contents** + +.. contents:: + :local: + +Usage +===== + +**Demo:** + + |image| + +You can see the demo live by going to the users list view (Settings > +Users & Companies > Users) and clicking the little '?' next to the view +switcher. + + |image1| + +Also there's a demo for the change password wizard: + + |image2| + +It's easy to create your own guides, please refer to +``static/src/user_trip.esm.js`` and +``static/src/change_password_trip.esm.js`` + +.. |image| image:: https://raw.githubusercontent.com/OCA/web/18.0/web_help/static/description/demo.gif +.. |image1| image:: https://raw.githubusercontent.com/OCA/web/18.0/web_help/static/description/viewswitcher.png +.. |image2| image:: https://raw.githubusercontent.com/OCA/web/18.0/web_help/static/description/changepassword.png + +Known issues / Roadmap +====================== + +- Implement keyboard shortcuts + +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 +------- + +* Onestein + +Contributors +------------ + +- Dennis Sluijk + +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_help/__init__.py b/web_help/__init__.py new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/web_help/__manifest__.py b/web_help/__manifest__.py new file mode 100644 index 000000000000..35ab5c26246e --- /dev/null +++ b/web_help/__manifest__.py @@ -0,0 +1,26 @@ +{ + "name": "Help Framework", + "sumamry": "This module introduces a new way to guide users", + "author": "Onestein,Odoo Community Association (OCA)", + "category": "Technical", + "license": "AGPL-3", + "version": "18.0.1.0.0", + "website": "https://github.com/OCA/web", + "depends": [ + "web", + ], + "assets": { + "web.assets_backend": [ + "web_help/static/src/components/highlighter/highlighter.esm.js", + "web_help/static/src/components/highlighter/highlighter.scss", + "web_help/static/src/components/highlighter/highlighter.xml", + "web_help/static/src/helpers.esm.js", + "web_help/static/src/trip.esm.js", + "web_help/static/src/user_trip.esm.js", + "web_help/static/src/change_password_trip.esm.js", + "web_help/static/src/components/help_button/help_button.esm.js", + "web_help/static/src/components/help_button/help_button.xml", + "web_help/static/src/trip.xml", + ] + }, +} diff --git a/web_help/i18n/es.po b/web_help/i18n/es.po new file mode 100644 index 000000000000..c854a11875d7 --- /dev/null +++ b/web_help/i18n/es.po @@ -0,0 +1,87 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * web_help +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2023-09-02 20:35+0000\n" +"Last-Translator: Ivorra78 \n" +"Language-Team: none\n" +"Language: es\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.17\n" + +#. module: web_help +#. odoo-javascript +#: code:addons/web_help/static/src/user_trip.esm.js:0 +#, python-format +msgid "Cancel" +msgstr "Cancelar" + +#. module: web_help +#. odoo-javascript +#: code:addons/web_help/static/src/change_password_trip.esm.js:0 +#, python-format +msgid "Change the password here, make sure it's secure." +msgstr "Cambie la contraseña aquí, asegúrese de que sea segura." + +#. module: web_help +#. odoo-javascript +#: code:addons/web_help/static/src/change_password_trip.esm.js:0 +#, python-format +msgid "Click here to confirm it." +msgstr "Haga clic aquí para confirmarlo." + +#. module: web_help +#. odoo-javascript +#: code:addons/web_help/static/src/trip.esm.js:0 +#, python-format +msgid "Close" +msgstr "Cerrar" + +#. module: web_help +#. odoo-javascript +#: code:addons/web_help/static/src/trip.esm.js:0 +#, python-format +msgid "Finish" +msgstr "Finalizar" + +#. module: web_help +#. odoo-javascript +#: code:addons/web_help/static/src/trip.esm.js:0 +#, python-format +msgid "Got it" +msgstr "Lo tengo" + +#. module: web_help +#. odoo-javascript +#: code:addons/web_help/static/src/user_trip.esm.js:0 +#, python-format +msgid "Next" +msgstr "Siguiente" + +#. module: web_help +#. odoo-javascript +#: code:addons/web_help/static/src/user_trip.esm.js:0 +#, python-format +msgid "To create a new user click here." +msgstr "Para crear un nuevo usuario haga clic aquí." + +#. module: web_help +#. odoo-javascript +#: code:addons/web_help/static/src/user_trip.esm.js:0 +#, python-format +msgid "Use the searchbar to find specific users." +msgstr "Utiliza la barra de búsqueda para encontrar usuarios concretos." + +#. module: web_help +#. odoo-javascript +#: code:addons/web_help/static/src/user_trip.esm.js:0 +#, python-format +msgid "You can switch to different views here." +msgstr "Aquí puede cambiar a diferentes vistas." diff --git a/web_help/i18n/hr.po b/web_help/i18n/hr.po new file mode 100644 index 000000000000..7df4d1ab4830 --- /dev/null +++ b/web_help/i18n/hr.po @@ -0,0 +1,88 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * web_help +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2023-04-03 13:22+0000\n" +"Last-Translator: Bole \n" +"Language-Team: none\n" +"Language: hr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" +"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" +"X-Generator: Weblate 4.14.1\n" + +#. module: web_help +#. odoo-javascript +#: code:addons/web_help/static/src/user_trip.esm.js:0 +#, python-format +msgid "Cancel" +msgstr "Odustani" + +#. module: web_help +#. odoo-javascript +#: code:addons/web_help/static/src/change_password_trip.esm.js:0 +#, python-format +msgid "Change the password here, make sure it's secure." +msgstr "Ovdje promijenite lozinku, pobrinite se da je sigurna." + +#. module: web_help +#. odoo-javascript +#: code:addons/web_help/static/src/change_password_trip.esm.js:0 +#, python-format +msgid "Click here to confirm it." +msgstr "Klikne ovdje za potvrdu." + +#. module: web_help +#. odoo-javascript +#: code:addons/web_help/static/src/trip.esm.js:0 +#, python-format +msgid "Close" +msgstr "Zatvori" + +#. module: web_help +#. odoo-javascript +#: code:addons/web_help/static/src/trip.esm.js:0 +#, python-format +msgid "Finish" +msgstr "Završi" + +#. module: web_help +#. odoo-javascript +#: code:addons/web_help/static/src/trip.esm.js:0 +#, python-format +msgid "Got it" +msgstr "Shvatio" + +#. module: web_help +#. odoo-javascript +#: code:addons/web_help/static/src/user_trip.esm.js:0 +#, python-format +msgid "Next" +msgstr "Sljedeće" + +#. module: web_help +#. odoo-javascript +#: code:addons/web_help/static/src/user_trip.esm.js:0 +#, python-format +msgid "To create a new user click here." +msgstr "Za kreiranje novog korisnika kliknite ovdje." + +#. module: web_help +#. odoo-javascript +#: code:addons/web_help/static/src/user_trip.esm.js:0 +#, python-format +msgid "Use the searchbar to find specific users." +msgstr "Koristite traku pretrage za traženje određenog korisnika." + +#. module: web_help +#. odoo-javascript +#: code:addons/web_help/static/src/user_trip.esm.js:0 +#, python-format +msgid "You can switch to different views here." +msgstr "Ovdje se možete prebaciti u različite poglede." diff --git a/web_help/i18n/it.po b/web_help/i18n/it.po new file mode 100644 index 000000000000..05aca5dd5997 --- /dev/null +++ b/web_help/i18n/it.po @@ -0,0 +1,87 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * web_help +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2024-09-18 10:06+0000\n" +"Last-Translator: mymage \n" +"Language-Team: none\n" +"Language: it\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 5.6.2\n" + +#. module: web_help +#. odoo-javascript +#: code:addons/web_help/static/src/user_trip.esm.js:0 +#, python-format +msgid "Cancel" +msgstr "Annulla" + +#. module: web_help +#. odoo-javascript +#: code:addons/web_help/static/src/change_password_trip.esm.js:0 +#, python-format +msgid "Change the password here, make sure it's secure." +msgstr "Modificare qui la password, controllando che sia sicura." + +#. module: web_help +#. odoo-javascript +#: code:addons/web_help/static/src/change_password_trip.esm.js:0 +#, python-format +msgid "Click here to confirm it." +msgstr "Fare clic qui per confermarla." + +#. module: web_help +#. odoo-javascript +#: code:addons/web_help/static/src/trip.esm.js:0 +#, python-format +msgid "Close" +msgstr "Chiudi" + +#. module: web_help +#. odoo-javascript +#: code:addons/web_help/static/src/trip.esm.js:0 +#, python-format +msgid "Finish" +msgstr "Termina" + +#. module: web_help +#. odoo-javascript +#: code:addons/web_help/static/src/trip.esm.js:0 +#, python-format +msgid "Got it" +msgstr "Capito" + +#. module: web_help +#. odoo-javascript +#: code:addons/web_help/static/src/user_trip.esm.js:0 +#, python-format +msgid "Next" +msgstr "Successivo" + +#. module: web_help +#. odoo-javascript +#: code:addons/web_help/static/src/user_trip.esm.js:0 +#, python-format +msgid "To create a new user click here." +msgstr "Per creare un nuovo utente fare clic qui." + +#. module: web_help +#. odoo-javascript +#: code:addons/web_help/static/src/user_trip.esm.js:0 +#, python-format +msgid "Use the searchbar to find specific users." +msgstr "Utilizzare la barra ricerca per trovare utenti specifici." + +#. module: web_help +#. odoo-javascript +#: code:addons/web_help/static/src/user_trip.esm.js:0 +#, python-format +msgid "You can switch to different views here." +msgstr "Qui si possono scegliere diverse viste." diff --git a/web_help/i18n/web_help.pot b/web_help/i18n/web_help.pot new file mode 100644 index 000000000000..053cd71ca3a6 --- /dev/null +++ b/web_help/i18n/web_help.pot @@ -0,0 +1,74 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * web_help +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 18.0\n" +"Report-Msgid-Bugs-To: \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_help +#. odoo-javascript +#: code:addons/web_help/static/src/user_trip.esm.js:0 +msgid "Cancel" +msgstr "" + +#. module: web_help +#. odoo-javascript +#: code:addons/web_help/static/src/change_password_trip.esm.js:0 +msgid "Change the password here, make sure it's secure." +msgstr "" + +#. module: web_help +#. odoo-javascript +#: code:addons/web_help/static/src/change_password_trip.esm.js:0 +msgid "Click here to confirm it." +msgstr "" + +#. module: web_help +#. odoo-javascript +#: code:addons/web_help/static/src/trip.esm.js:0 +msgid "Close" +msgstr "" + +#. module: web_help +#. odoo-javascript +#: code:addons/web_help/static/src/trip.esm.js:0 +msgid "Finish" +msgstr "" + +#. module: web_help +#. odoo-javascript +#: code:addons/web_help/static/src/trip.esm.js:0 +msgid "Got it" +msgstr "" + +#. module: web_help +#. odoo-javascript +#: code:addons/web_help/static/src/user_trip.esm.js:0 +msgid "Next" +msgstr "" + +#. module: web_help +#. odoo-javascript +#: code:addons/web_help/static/src/user_trip.esm.js:0 +msgid "To create a new user click here." +msgstr "" + +#. module: web_help +#. odoo-javascript +#: code:addons/web_help/static/src/user_trip.esm.js:0 +msgid "Use the searchbar to find specific users." +msgstr "" + +#. module: web_help +#. odoo-javascript +#: code:addons/web_help/static/src/user_trip.esm.js:0 +msgid "You can switch to different views here." +msgstr "" diff --git a/web_help/pyproject.toml b/web_help/pyproject.toml new file mode 100644 index 000000000000..4231d0cccb3d --- /dev/null +++ b/web_help/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["whool"] +build-backend = "whool.buildapi" diff --git a/web_help/readme/CONTRIBUTORS.md b/web_help/readme/CONTRIBUTORS.md new file mode 100644 index 000000000000..76a1463d2687 --- /dev/null +++ b/web_help/readme/CONTRIBUTORS.md @@ -0,0 +1 @@ +- Dennis Sluijk \<\> diff --git a/web_help/readme/DESCRIPTION.md b/web_help/readme/DESCRIPTION.md new file mode 100644 index 000000000000..3d7345729d1f --- /dev/null +++ b/web_help/readme/DESCRIPTION.md @@ -0,0 +1,7 @@ +This module introduces a new way to guide the user through Odoo. This +module is created because **the standard Odoo tours:** + +1. forces the user to create records; +2. cannot be reopened; +3. is only available for the admin user; +4. the bubbles are not obvious. diff --git a/web_help/readme/ROADMAP.md b/web_help/readme/ROADMAP.md new file mode 100644 index 000000000000..036cf974d3ef --- /dev/null +++ b/web_help/readme/ROADMAP.md @@ -0,0 +1 @@ +- Implement keyboard shortcuts diff --git a/web_help/readme/USAGE.md b/web_help/readme/USAGE.md new file mode 100644 index 000000000000..5c662f79e106 --- /dev/null +++ b/web_help/readme/USAGE.md @@ -0,0 +1,17 @@ +**Demo:** + +> ![image](../static/description/demo.gif) + +You can see the demo live by going to the users list view (Settings \> +Users & Companies \> Users) and clicking the little '?' next to the view +switcher. + +> ![image](../static/description/viewswitcher.png) + +Also there's a demo for the change password wizard: + +> ![image](../static/description/changepassword.png) + +It's easy to create your own guides, please refer to +`static/src/user_trip.esm.js` and +`static/src/change_password_trip.esm.js` diff --git a/web_help/static/description/changepassword.png b/web_help/static/description/changepassword.png new file mode 100644 index 000000000000..e3ccdc84a34c Binary files /dev/null and b/web_help/static/description/changepassword.png differ diff --git a/web_help/static/description/demo.gif b/web_help/static/description/demo.gif new file mode 100644 index 000000000000..8428f963588a Binary files /dev/null and b/web_help/static/description/demo.gif differ diff --git a/web_help/static/description/icon.png b/web_help/static/description/icon.png new file mode 100644 index 000000000000..3a0328b516c4 Binary files /dev/null and b/web_help/static/description/icon.png differ diff --git a/web_help/static/description/index.html b/web_help/static/description/index.html new file mode 100644 index 000000000000..f703acf338d6 --- /dev/null +++ b/web_help/static/description/index.html @@ -0,0 +1,461 @@ + + + + + +README.rst + + + +
+ + + +Odoo Community Association + +
+

Help Framework

+ +

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

+

This module introduces a new way to guide the user through Odoo. This +module is created because the standard Odoo tours:

+
    +
  1. forces the user to create records;
  2. +
  3. cannot be reopened;
  4. +
  5. is only available for the admin user;
  6. +
  7. the bubbles are not obvious.
  8. +
+

Table of contents

+ +
+

Usage

+

Demo:

+
+image
+

You can see the demo live by going to the users list view (Settings > +Users & Companies > Users) and clicking the little ‘?’ next to the view +switcher.

+
+image1
+

Also there’s a demo for the change password wizard:

+
+image2
+

It’s easy to create your own guides, please refer to +static/src/user_trip.esm.js and +static/src/change_password_trip.esm.js

+
+
+

Known issues / Roadmap

+
    +
  • Implement keyboard shortcuts
  • +
+
+
+

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

+
    +
  • Onestein
  • +
+
+
+

Contributors

+ +
+
+

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_help/static/description/viewswitcher.png b/web_help/static/description/viewswitcher.png new file mode 100644 index 000000000000..b4a8cb435759 Binary files /dev/null and b/web_help/static/description/viewswitcher.png differ diff --git a/web_help/static/src/change_password_trip.esm.js b/web_help/static/src/change_password_trip.esm.js new file mode 100644 index 000000000000..76034e5fe7fc --- /dev/null +++ b/web_help/static/src/change_password_trip.esm.js @@ -0,0 +1,23 @@ +import {Trip} from "@web_help/trip.esm"; +import {_t} from "@web/core/l10n/translation"; +import {registry} from "@web/core/registry"; + +export class ChangePasswordTrip extends Trip { + setup() { + this.addStep({ + selector: "th[data-name='new_passwd'], td[name='new_passwd']", + content: _t("Change the password here, make sure it's secure."), + }); + + this.addStep({ + selector: "button[name='change_password_button']", + content: _t("Click here to confirm it."), + }); + } +} + +registry.category("trips").add("change_password_trip", { + Trip: ChangePasswordTrip, + selector: (model, viewType) => + model === "change.password.wizard" && viewType === "form", +}); diff --git a/web_help/static/src/components/help_button/help_button.esm.js b/web_help/static/src/components/help_button/help_button.esm.js new file mode 100644 index 000000000000..dcd229398f07 --- /dev/null +++ b/web_help/static/src/components/help_button/help_button.esm.js @@ -0,0 +1,44 @@ +import {Component, onWillStart, useState} from "@odoo/owl"; +import {ActionDialog} from "@web/webclient/actions/action_dialog"; +import {ControlPanel} from "@web/search/control_panel/control_panel"; +import {findTrip} from "@web_help/helpers.esm"; +import {useService} from "@web/core/utils/hooks"; + +export class HelpButton extends Component { + static props = { + actionId: {type: [Number, String, Boolean], optional: true}, + resModel: {type: String, optional: true}, + viewType: {type: String, optional: true}, + btnClass: {type: String, optional: true}, + }; + setup() { + this.actionService = useService("action"); + this.state = useState({ + TripClass: null, + }); + onWillStart(async () => { + const actionId = this.props.actionId; + const context = + (this.env.searchModel && this.env.searchModel.context) || {}; + const action = actionId + ? await this.actionService.loadAction(actionId, context) + : {}; + if ("res_model" in action) { + const foundTrip = await findTrip(action.res_model, this.props.viewType); + this.state.TripClass = foundTrip; + } + }); + } + + async onClick() { + const TripClass = this.state.TripClass; + const trip = new TripClass(this.env); + await trip.setup(); + trip.start(); + } +} + +HelpButton.template = "web_help.HelpButton"; + +Object.assign(ControlPanel.components, {HelpButton}); +Object.assign(ActionDialog.components, {HelpButton}); diff --git a/web_help/static/src/components/help_button/help_button.xml b/web_help/static/src/components/help_button/help_button.xml new file mode 100644 index 000000000000..60d22c9ed96d --- /dev/null +++ b/web_help/static/src/components/help_button/help_button.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + diff --git a/web_help/static/src/components/highlighter/highlighter.esm.js b/web_help/static/src/components/highlighter/highlighter.esm.js new file mode 100644 index 000000000000..707b2db392d4 --- /dev/null +++ b/web_help/static/src/components/highlighter/highlighter.esm.js @@ -0,0 +1,137 @@ +import {Component, EventBus, useRef, useState} from "@odoo/owl"; +import {registry} from "@web/core/registry"; +import {sprintf} from "@web/core/utils/strings"; + +export class Highlighter extends Component { + static props = { + bus: {type: EventBus}, + }; + setup() { + this.state = useState({visible: false}); + this.props.bus.addEventListener("HIDE", this.hide.bind(this)); + this.props.bus.addEventListener( + "HIGHLIGHT", + ({detail: {selector, content, animate, padding}}) => + this.highlight(selector, content, animate, padding) + ); + this.highlightRef = useRef("highlightRef"); + this.overlayRef = useRef("overlay"); + } + + hide() { + this.state.visible = false; + this.resetAnimation(); + } + + _getBoundsOfElement($el) { + const bounds = { + x: Number.MAX_SAFE_INTEGER, + y: Number.MAX_SAFE_INTEGER, + }; + + let xEnd = 0, + yEnd = 0; + + $el.filter(":visible").each(function () { + const elementBounds = this.getBoundingClientRect(); + if (elementBounds.x < bounds.x) { + bounds.x = elementBounds.x; + } + if (elementBounds.y < bounds.y) { + bounds.y = elementBounds.y; + } + if (xEnd < elementBounds.x + elementBounds.width) { + xEnd = elementBounds.x + elementBounds.width; + } + if (yEnd < elementBounds.y + elementBounds.height) { + yEnd = elementBounds.y + elementBounds.height; + } + }); + + bounds.width = xEnd - bounds.x; + bounds.height = yEnd - bounds.y; + return bounds; + } + + highlight(selector, content, animate = 250, padding = 10) { + const selection = $(selector); + + if (!selection.length) { + return console.error("Element not found.", selector); + } + const bounds = this._getBoundsOfElement(selection); + this.state.visible = true; + this.animate(content, bounds, animate, padding); + } + + animate(content, bounds, animate = 250, padding = 10) { + const $el = $(this.highlightRef.el); + + $el.popover("dispose"); + $el.animate( + { + top: sprintf("%spx", Math.floor(bounds.y) - padding), + left: sprintf("%spx", Math.floor(bounds.x) - padding), + width: sprintf("%spx", Math.floor(bounds.width) + padding * 2), + height: sprintf("%spx", Math.floor(bounds.height) + padding * 2), + }, + animate ? animate : 0, + function () { + $el.popover( + Object.assign({}, this._getPopoverOptions(), { + content: content, + }) + ).popover("show"); + }.bind(this) + ); + } + + _getPopoverOptions() { + return { + container: $(this.overlayRef.el), + placement: "auto", + html: true, + trigger: "manual", + boundary: "viewport", + sanitize: false, + template: + '', + }; + } + + resetAnimation() { + const $el = $(this.highlightRef.el); + $el.popover("dispose"); + $el.css({ + top: 0, + left: 0, + width: 0, + height: 0, + }); + } +} +Highlighter.template = "web_help.Highlighter"; + +export const highlighterService = { + start() { + const bus = new EventBus(); + + registry.category("main_components").add("Highlighter", { + Component: Highlighter, + props: {bus}, + }); + + return { + hide: () => bus.trigger("HIDE"), + highlight: (selector, content, animate = 250, padding = 10) => + bus.trigger("HIGHLIGHT", { + selector: selector, + content: content, + animate: animate, + padding: padding, + }), + }; + }, +}; + +registry.category("services").add("highlighter", highlighterService); diff --git a/web_help/static/src/components/highlighter/highlighter.scss b/web_help/static/src/components/highlighter/highlighter.scss new file mode 100644 index 000000000000..d2182ada02ed --- /dev/null +++ b/web_help/static/src/components/highlighter/highlighter.scss @@ -0,0 +1,23 @@ +.web_help_overlay { + top: 0px; + left: 0px; + width: 100%; + height: 100%; + position: fixed; + z-index: 1151; + + .web_help_highlight { + position: absolute; + outline: 1000vw solid rgba(0, 0, 0, 0.7); + } + + .popover { + background-color: transparent; + border: none; + + .popover-body { + color: #fff; + font-size: 1.2rem; + } + } +} diff --git a/web_help/static/src/components/highlighter/highlighter.xml b/web_help/static/src/components/highlighter/highlighter.xml new file mode 100644 index 000000000000..29a07a2c71f8 --- /dev/null +++ b/web_help/static/src/components/highlighter/highlighter.xml @@ -0,0 +1,14 @@ + + + +
+
+
+
+
+ + diff --git a/web_help/static/src/helpers.esm.js b/web_help/static/src/helpers.esm.js new file mode 100644 index 000000000000..92fbbbcf6776 --- /dev/null +++ b/web_help/static/src/helpers.esm.js @@ -0,0 +1,36 @@ +import {Component} from "@odoo/owl"; +import {registry} from "@web/core/registry"; + +export async function findTrip(model, viewType) { + const trips = registry.category("trips").getAll(); + const selectorResults = await Promise.all( + trips.map((trip) => trip.selector(model, viewType)) + ); + const matchedTrips = trips.filter((trip, i) => selectorResults[i]); + if (matchedTrips.length >= 1) { + if (matchedTrips.length !== 1) { + console.warn("More than one trip found", model, viewType); + } + return matchedTrips[0].Trip; + } + return null; +} + +export function wait(ms) { + return new Promise((resolve) => setTimeout(resolve, ms)); +} + +export async function waitUntilAvailable(selector, ms = 50) { + const selection = $(selector); + + if (!selection.length) { + await wait(ms); + return await waitUntilAvailable(selector, ms); + } + + return selection; +} + +export async function doAction(xmlId, options = {}) { + Component.env.services.action.doAction(xmlId, options); +} diff --git a/web_help/static/src/trip.esm.js b/web_help/static/src/trip.esm.js new file mode 100644 index 000000000000..52e571ce74d3 --- /dev/null +++ b/web_help/static/src/trip.esm.js @@ -0,0 +1,102 @@ +import {_t} from "@web/core/l10n/translation"; +import {ensureJQuery} from "@web/core/ensure_jquery"; +import {renderToString} from "@web/core/utils/render"; + +export class Trip { + constructor(env) { + this.steps = []; + this.env = env; + this.index = -1; + this.highlighterService = this.env.services.highlighter; + } + + get count() { + return this.steps.length; + } + + get isAtLastStep() { + return this.index === this.count - 1; + } + + _getStepTemplate() { + const step = this.steps[this.index]; + if (step.template) { + return step.template; + } + return this.isAtLastStep ? "web_help.TripStepLast" : "web_help.TripStep"; + } + + setup() { + return; + } + + addStep({ + selector, + content, + beforeHighlight = async () => { + return; + }, + animate = 250, + padding = 10, + template = null, + renderContext = {}, + }) { + this.steps.push({ + selector: selector, + content: content, + beforeHighlight: beforeHighlight, + animate: animate, + padding: padding, + template: template, + renderContext: renderContext, + }); + } + + start() { + this.nextStep(); + } + + stop() { + this.index = -1; + this.highlighterService.hide(); + } + + _getStepRenderContext() { + const step = this.steps[this.index]; + + return Object.assign( + { + content: step.content, + cbBtnText: this.isAtLastStep ? _t("Finish") : _t("Got it"), + closeBtnText: _t("Close"), + }, + step.renderContext + ); + } + + async nextStep() { + this.index++; + let cb = this.nextStep; + if (this.isAtLastStep) { + cb = this.stop; + } + const step = this.steps[this.index]; + await ensureJQuery(); + const $stepRender = $( + renderToString(this._getStepTemplate(), this._getStepRenderContext()) + ); + const $cbButton = $stepRender.find(".web_help_cb_button"); + $cbButton.click(() => { + $cbButton.attr("disabled", "disabled"); + cb.bind(this)(); + }); + $stepRender.find(".web_help_close").click(this.stop.bind(this)); + await step.beforeHighlight(); + this.highlighterService.highlight( + step.selector, + $stepRender, + step.animate, + step.padding + ); + } +} diff --git a/web_help/static/src/trip.xml b/web_help/static/src/trip.xml new file mode 100644 index 000000000000..6a2869f6359b --- /dev/null +++ b/web_help/static/src/trip.xml @@ -0,0 +1,29 @@ + + + +
+
+ +
+ + + +
+
+ + +
+
+ +
+ + +
+
+
diff --git a/web_help/static/src/user_trip.esm.js b/web_help/static/src/user_trip.esm.js new file mode 100644 index 000000000000..0363c58b26f8 --- /dev/null +++ b/web_help/static/src/user_trip.esm.js @@ -0,0 +1,32 @@ +import {Trip} from "@web_help/trip.esm"; +import {_t} from "@web/core/l10n/translation"; +import {registry} from "@web/core/registry"; + +export class UserTrip extends Trip { + setup() { + this.addStep({ + selector: ".o_list_button_add, .o-kanban-button-new", + content: _t("To create a new user click here."), + }); + + this.addStep({ + selector: ".o_cp_searchview", + content: _t("Use the searchbar to find specific users."), + renderContext: { + cbBtnText: _t("Next"), + closeBtnText: _t("Cancel"), + }, + }); + + this.addStep({ + selector: ".o_cp_switch_buttons", + content: _t("You can switch to different views here."), + }); + } +} + +registry.category("trips").add("user_trip", { + Trip: UserTrip, + selector: (model, viewType) => + model === "res.users" && ["list", "kanban"].includes(viewType), +}); diff --git a/web_portal_properties/README.rst b/web_portal_properties/README.rst new file mode 100644 index 000000000000..dd7e28c2795d --- /dev/null +++ b/web_portal_properties/README.rst @@ -0,0 +1,143 @@ +.. image:: https://odoo-community.org/readme-banner-image + :target: https://odoo-community.org/get-involved?utm_source=readme + :alt: Odoo Community Association + +===================== +Web Portal Properties +===================== + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:1abe829ac987aff4cc3bf098d3052d4078c88db2d4448329fbc17515d88c49f1 + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |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/license-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/18.0/web_portal_properties + :alt: OCA/web +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/web-18-0/web-18-0-web_portal_properties + :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=18.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +This module creates a new field that can be used to add a new parameter +on field property description. This parameter will allow us to show some +parameters on portal view. + +**Table of contents** + +.. contents:: + :local: + +Configuration +============= + +Just modify the definition field like + +.. code:: python + + from odoo import models + + from odoo.addons.web_portal_properties.fields import PortalPropertiesDefinition + + + class ProjectProject(models.Model): + _inherit = "project.project" + + task_properties_definition = PortalPropertiesDefinition() + +Then, use the widget ``portal_properties`` on your field to allow the +edition for the user. + +Finally, on the portal template add this snippet with the right +parameters: + +.. code:: xml + + + + + + +Usage +===== + +On form view, we will be able to set a new parameter, +``Show in portal``. + +|image| + +On portal, we will be able to see the parameters. + +|image1| + +.. |image| image:: https://raw.githubusercontent.com/OCA/web/18.0/web_portal_properties/static/description/form_view.png +.. |image1| image:: https://raw.githubusercontent.com/OCA/web/18.0/web_portal_properties/static/description/portal_view.png + +Known issues / Roadmap +====================== + +It cannot be used on separators easily unless we duplicate some Odoo +code or we ask for a hook on Odoo. + +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 +------- + +* Dixmit + +Contributors +------------ + +- `Dixmit `__ + + - Enric Tobella + +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_portal_properties/__init__.py b/web_portal_properties/__init__.py new file mode 100644 index 000000000000..735443893014 --- /dev/null +++ b/web_portal_properties/__init__.py @@ -0,0 +1 @@ +from . import fields diff --git a/web_portal_properties/__manifest__.py b/web_portal_properties/__manifest__.py new file mode 100644 index 000000000000..7b21e421f23e --- /dev/null +++ b/web_portal_properties/__manifest__.py @@ -0,0 +1,23 @@ +# Copyright 2025 Dixmit +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +{ + "name": "Web Portal Properties", + "summary": """Add a new field on properties to show them on portal""", + "version": "18.0.1.0.0", + "license": "AGPL-3", + "author": "Dixmit,Odoo Community Association (OCA)", + "website": "https://github.com/OCA/web", + "depends": ["portal"], + "data": ["views/portal_templates.xml"], + "demo": [], + "assets": { + "web.assets_backend": [ + "web_portal_properties/static/src/**/*.esm.js", + "web_portal_properties/static/src/**/*.xml", + ], + "web.assets_unit_tests": [ + "web_portal_properties/static/tests/**/*.test.js", + ], + }, +} diff --git a/web_portal_properties/fields.py b/web_portal_properties/fields.py new file mode 100644 index 000000000000..ac73ebcc79ef --- /dev/null +++ b/web_portal_properties/fields.py @@ -0,0 +1,16 @@ +from odoo import fields + + +class PortalPropertiesDefinition(fields.PropertiesDefinition): + ALLOWED_KEYS = ( + "name", + "string", + "type", + "comodel", + "default", + "selection", + "tags", + "domain", + "view_in_cards", + "view_in_portal", + ) diff --git a/web_portal_properties/i18n/it.po b/web_portal_properties/i18n/it.po new file mode 100644 index 000000000000..3650ee7382db --- /dev/null +++ b/web_portal_properties/i18n/it.po @@ -0,0 +1,35 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * web_portal_properties +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 18.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2026-05-12 08:45+0000\n" +"Last-Translator: mymage \n" +"Language-Team: none\n" +"Language: it\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 5.15.2\n" + +#. module: web_portal_properties +#. odoo-javascript +#: code:addons/web_portal_properties/static/src/components/portal_properties/portal_properties_definition.xml:0 +msgid "Display in Portal" +msgstr "Visualizza nel portale" + +#. module: web_portal_properties +#. odoo-javascript +#: code:addons/web_portal_properties/static/src/components/portal_properties/portal_properties.esm.js:0 +msgid "Properties" +msgstr "Proprietà" + +#. module: web_portal_properties +#. odoo-javascript +#: code:addons/web_portal_properties/static/src/components/portal_properties/portal_properties_definition.xml:0 +msgid "Whether or not this Property Field is displayed in the Portal views" +msgstr "Se questo campo proprietà vien visualizzato o meno nelle viste portale" diff --git a/web_portal_properties/i18n/web_portal_properties.pot b/web_portal_properties/i18n/web_portal_properties.pot new file mode 100644 index 000000000000..3d1f2f7e0f1e --- /dev/null +++ b/web_portal_properties/i18n/web_portal_properties.pot @@ -0,0 +1,32 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * web_portal_properties +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 18.0\n" +"Report-Msgid-Bugs-To: \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_portal_properties +#. odoo-javascript +#: code:addons/web_portal_properties/static/src/components/portal_properties/portal_properties_definition.xml:0 +msgid "Display in Portal" +msgstr "" + +#. module: web_portal_properties +#. odoo-javascript +#: code:addons/web_portal_properties/static/src/components/portal_properties/portal_properties.esm.js:0 +msgid "Properties" +msgstr "" + +#. module: web_portal_properties +#. odoo-javascript +#: code:addons/web_portal_properties/static/src/components/portal_properties/portal_properties_definition.xml:0 +msgid "Whether or not this Property Field is displayed in the Portal views" +msgstr "" diff --git a/web_portal_properties/pyproject.toml b/web_portal_properties/pyproject.toml new file mode 100644 index 000000000000..4231d0cccb3d --- /dev/null +++ b/web_portal_properties/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["whool"] +build-backend = "whool.buildapi" diff --git a/web_portal_properties/readme/CONFIGURE.md b/web_portal_properties/readme/CONFIGURE.md new file mode 100644 index 000000000000..46e62d7bd4c9 --- /dev/null +++ b/web_portal_properties/readme/CONFIGURE.md @@ -0,0 +1,33 @@ +Just modify the definition field like + +```python +from odoo import models + +from odoo.addons.web_portal_properties.fields import PortalPropertiesDefinition + + +class ProjectProject(models.Model): + _inherit = "project.project" + + task_properties_definition = PortalPropertiesDefinition() + +``` + +Then, use the widget `portal_properties` on your field to allow the edition for the user. + +Finally, on the portal template add this snippet with the right parameters: + +```xml + + + + +``` \ No newline at end of file diff --git a/web_portal_properties/readme/CONTRIBUTORS.md b/web_portal_properties/readme/CONTRIBUTORS.md new file mode 100644 index 000000000000..2c066ba7f420 --- /dev/null +++ b/web_portal_properties/readme/CONTRIBUTORS.md @@ -0,0 +1,2 @@ +- [Dixmit](https://www.dixmit.com) + - Enric Tobella diff --git a/web_portal_properties/readme/DESCRIPTION.md b/web_portal_properties/readme/DESCRIPTION.md new file mode 100644 index 000000000000..269d78b98d73 --- /dev/null +++ b/web_portal_properties/readme/DESCRIPTION.md @@ -0,0 +1,2 @@ +This module creates a new field that can be used to add a new parameter on field property description. +This parameter will allow us to show some parameters on portal view. diff --git a/web_portal_properties/readme/ROADMAP.md b/web_portal_properties/readme/ROADMAP.md new file mode 100644 index 000000000000..097860e6920a --- /dev/null +++ b/web_portal_properties/readme/ROADMAP.md @@ -0,0 +1 @@ +It cannot be used on separators easily unless we duplicate some Odoo code or we ask for a hook on Odoo. diff --git a/web_portal_properties/readme/USAGE.md b/web_portal_properties/readme/USAGE.md new file mode 100644 index 000000000000..41f32f54ab41 --- /dev/null +++ b/web_portal_properties/readme/USAGE.md @@ -0,0 +1,7 @@ +On form view, we will be able to set a new parameter, `Show in portal`. + +![image](../static/description/form_view.png) + +On portal, we will be able to see the parameters. + +![image](../static/description/portal_view.png) diff --git a/web_portal_properties/static/description/form_view.png b/web_portal_properties/static/description/form_view.png new file mode 100644 index 000000000000..465d6cbbba96 Binary files /dev/null and b/web_portal_properties/static/description/form_view.png differ diff --git a/web_portal_properties/static/description/icon.png b/web_portal_properties/static/description/icon.png new file mode 100644 index 000000000000..3a0328b516c4 Binary files /dev/null and b/web_portal_properties/static/description/icon.png differ diff --git a/web_portal_properties/static/description/index.html b/web_portal_properties/static/description/index.html new file mode 100644 index 000000000000..199c0e29c659 --- /dev/null +++ b/web_portal_properties/static/description/index.html @@ -0,0 +1,483 @@ + + + + + +README.rst + + + +
+ + + +Odoo Community Association + +
+

Web Portal Properties

+ +

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

+

This module creates a new field that can be used to add a new parameter +on field property description. This parameter will allow us to show some +parameters on portal view.

+

Table of contents

+ +
+

Configuration

+

Just modify the definition field like

+
+from odoo import models
+
+from odoo.addons.web_portal_properties.fields import PortalPropertiesDefinition
+
+
+class ProjectProject(models.Model):
+    _inherit = "project.project"
+
+    task_properties_definition = PortalPropertiesDefinition()
+
+

Then, use the widget portal_properties on your field to allow the +edition for the user.

+

Finally, on the portal template add this snippet with the right +parameters:

+
+<?xml version="1.0" encoding="UTF-8" ?>
+<odoo>
+    <template id="portal_my_task" inherit_id="project.portal_my_task">
+        <xpath expr="//div[@id='card_body']" position="inside">
+
+            <t t-call="web_portal_properties.portal_properties">
+                <t t-set="properties_record" t-value="task" />
+                <t t-set="properties_field" t-value="'task_properties'" />
+            </t>
+        </xpath>
+    </template>
+</odoo>
+
+
+
+

Usage

+

On form view, we will be able to set a new parameter, +Show in portal.

+

image

+

On portal, we will be able to see the parameters.

+

image1

+
+
+

Known issues / Roadmap

+

It cannot be used on separators easily unless we duplicate some Odoo +code or we ask for a hook on Odoo.

+
+
+

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

+
    +
  • Dixmit
  • +
+
+
+

Contributors

+ +
+
+

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_portal_properties/static/description/portal_view.png b/web_portal_properties/static/description/portal_view.png new file mode 100644 index 000000000000..786c8286a4b6 Binary files /dev/null and b/web_portal_properties/static/description/portal_view.png differ diff --git a/web_portal_properties/static/src/components/portal_properties/portal_properties.esm.js b/web_portal_properties/static/src/components/portal_properties/portal_properties.esm.js new file mode 100644 index 000000000000..08f691184def --- /dev/null +++ b/web_portal_properties/static/src/components/portal_properties/portal_properties.esm.js @@ -0,0 +1,42 @@ +import {PortalPropertyDefinition} from "./portal_properties_definition.esm"; +import {PropertiesField} from "@web/views/fields/properties/properties_field"; +import {_t} from "@web/core/l10n/translation"; +import {exprToBoolean} from "@web/core/utils/strings"; +import {registry} from "@web/core/registry"; +import {usePopover} from "@web/core/popover/popover_hook"; + +export class PortalPropertiesField extends PropertiesField { + setup() { + super.setup(); + // Override the popover to use our custom PropertyDefinition + this.popover = usePopover(PortalPropertyDefinition, { + closeOnClickAway: this.checkPopoverClose, + popoverClass: "o_property_field_popover", + position: "top", + onClose: () => this.onCloseCurrentPopover?.(), + fixedPosition: true, + arrow: false, + }); + } +} + +PortalPropertiesField.components = { + ...PropertiesField.components, + PropertyDefinition: PortalPropertyDefinition, +}; + +export const portalPropertiesField = { + component: PortalPropertiesField, + displayName: _t("Properties"), + supportedTypes: ["properties"], + additionalClasses: ["o_field_properties"], + extractProps({attrs}, dynamicInfo) { + return { + context: dynamicInfo.context, + columns: parseInt(attrs.columns || "1", 10), + showAddButton: exprToBoolean(attrs.showAddButton), + }; + }, +}; + +registry.category("fields").add("portal_properties", portalPropertiesField); diff --git a/web_portal_properties/static/src/components/portal_properties/portal_properties_definition.esm.js b/web_portal_properties/static/src/components/portal_properties/portal_properties_definition.esm.js new file mode 100644 index 000000000000..42444e7e2395 --- /dev/null +++ b/web_portal_properties/static/src/components/portal_properties/portal_properties_definition.esm.js @@ -0,0 +1,15 @@ +/** @odoo-module **/ +import {PropertyDefinition} from "@web/views/fields/properties/property_definition"; + +export class PortalPropertyDefinition extends PropertyDefinition { + onViewInPortalChange(newValue) { + const propertyDefinition = { + ...this.state.propertyDefinition, + view_in_portal: newValue, + }; + this.props.onChange(propertyDefinition); + this.state.propertyDefinition = propertyDefinition; + } +} + +PortalPropertyDefinition.template = "web_portal_properties.PortalPropertyDefinition"; diff --git a/web_portal_properties/static/src/components/portal_properties/portal_properties_definition.xml b/web_portal_properties/static/src/components/portal_properties/portal_properties_definition.xml new file mode 100644 index 000000000000..e1759ea6e30b --- /dev/null +++ b/web_portal_properties/static/src/components/portal_properties/portal_properties_definition.xml @@ -0,0 +1,29 @@ + + + + +
+ + +
+
+
+
diff --git a/web_portal_properties/static/tests/properties.esm.test.js b/web_portal_properties/static/tests/properties.esm.test.js new file mode 100644 index 000000000000..7db7dc13e453 --- /dev/null +++ b/web_portal_properties/static/tests/properties.esm.test.js @@ -0,0 +1,84 @@ +import {animationFrame, click, expect, runAllTimers, test} from "@odoo/hoot"; +import { + defineModels, + fields, + models, + mountView, + onRpc, + toggleActionMenu, +} from "@web/../tests/web_test_helpers"; +import {defineMailModels} from "@mail/../tests/mail_test_helpers"; + +class Partner extends models.Model { + display_name = fields.Char(); + properties = fields.Properties({ + string: "Properties", + searchable: false, + definition_record: "company_id", + definition_record_field: "definitions", + }); + company_id = fields.Many2one({ + string: "Company", + relation: "properties.definition.model", + }); + _records = [ + { + id: 1, + display_name: "first partner", + properties: { + property_1: "char value", + property_2: "b", + }, + company_id: 37, + }, + ]; +} + +class PropertiesDefinitionModel extends models.Model { + _name = "properties.definition.model"; + name = fields.Char({string: "Name"}); + definitions = fields.PropertiesDefinition(); + _records = [ + { + id: 37, + name: "Company 1", + definitions: [], + }, + ]; +} + +defineModels([Partner, PropertiesDefinitionModel]); +defineMailModels(); +test("Portal Properties: check field", async () => { + onRpc("has_access", () => true); + await mountView({ + type: "form", + resModel: "partner", + resId: 1, + arch: ` +
+ + + + + + +
`, + actionMenus: {}, + }); + expect(".o_field_properties").toHaveCount(1); + await toggleActionMenu(); + await animationFrame(); + expect(".o-dropdown--menu span:contains(Add Properties)").toHaveCount(1, { + message: "The add button must be in the cog menu", + }); + await click(".o-dropdown--menu span .fa-cogs"); + await runAllTimers(); + await animationFrame(); + expect(".o_property_field_popover").toHaveCount(1, { + message: "Should have opened the definition popover", + }); + expect(".o_property_field_popover .o_property_display_in_portal").toHaveCount(1, { + message: "The display in portal checkbox should be visible", + }); +}); diff --git a/web_portal_properties/tests/__init__.py b/web_portal_properties/tests/__init__.py new file mode 100644 index 000000000000..6dab214ac806 --- /dev/null +++ b/web_portal_properties/tests/__init__.py @@ -0,0 +1 @@ +from . import test_ui diff --git a/web_portal_properties/tests/test_ui.py b/web_portal_properties/tests/test_ui.py new file mode 100644 index 000000000000..3a9b0442e9c2 --- /dev/null +++ b/web_portal_properties/tests/test_ui.py @@ -0,0 +1,17 @@ +# Copyright 2026 Dixmit +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +import odoo + +from odoo.addons.web.tests.test_js import WebSuite + + +@odoo.tests.tagged("post_install", "-at_install") +class TestWebPortalProperties(WebSuite): + """Test Web Portal Properties""" + + def get_hoot_filters(self): + self._test_params = [("+", "@web_portal_properties")] + return super().get_hoot_filters() + + def test_automation_oca(self): + self.test_unit_desktop() diff --git a/web_portal_properties/views/portal_templates.xml b/web_portal_properties/views/portal_templates.xml new file mode 100644 index 000000000000..7af0ba087ce3 --- /dev/null +++ b/web_portal_properties/views/portal_templates.xml @@ -0,0 +1,83 @@ + + + + diff --git a/web_responsive/README.rst b/web_responsive/README.rst index 6ab45f8a2ded..8e3bacad0cc7 100644 --- a/web_responsive/README.rst +++ b/web_responsive/README.rst @@ -11,7 +11,7 @@ Web Responsive !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:0f299826d3f0e96c2411e8477bbe19a86dfd325491b0ae39463d8548d9556cb3 + !! source digest: sha256:4ee483316e5299e935ac7bd410c9380e10f9e22fd7301a9655fb0aeab3234c55 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Production%2FStable-green.png diff --git a/web_responsive/__manifest__.py b/web_responsive/__manifest__.py index 0aa205144dc9..9625ca92f9a4 100644 --- a/web_responsive/__manifest__.py +++ b/web_responsive/__manifest__.py @@ -9,7 +9,7 @@ { "name": "Web Responsive", "summary": "Responsive web client, community-supported", - "version": "18.0.1.0.5", + "version": "18.0.1.0.6", "category": "Website", "website": "https://github.com/OCA/web", "author": "LasLabs, Tecnativa, ITerra, Onestein, " diff --git a/web_responsive/static/description/index.html b/web_responsive/static/description/index.html index cfdffb206c6d..189ff7b38713 100644 --- a/web_responsive/static/description/index.html +++ b/web_responsive/static/description/index.html @@ -372,7 +372,7 @@

Web Responsive

!! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!! source digest: sha256:0f299826d3f0e96c2411e8477bbe19a86dfd325491b0ae39463d8548d9556cb3 +!! source digest: sha256:4ee483316e5299e935ac7bd410c9380e10f9e22fd7301a9655fb0aeab3234c55 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->

Production/Stable License: LGPL-3 OCA/web Translate me on Weblate Try me on Runboat

This module adds responsiveness to web backend.

diff --git a/web_responsive/static/src/components/apps_menu/apps_menu.xml b/web_responsive/static/src/components/apps_menu/apps_menu.xml index 2da46866d6f2..caf378beb8e8 100644 --- a/web_responsive/static/src/components/apps_menu/apps_menu.xml +++ b/web_responsive/static/src/components/apps_menu/apps_menu.xml @@ -10,13 +10,13 @@ and the dropdown for the user where can logout we had to disable the lef sidebar to keep our web_resposive toggle button working and to keep the user dropdown in its original place --> - + false - + diff --git a/web_theme_classic/i18n/fi.po b/web_theme_classic/i18n/fi.po new file mode 100644 index 000000000000..2e93544c969b --- /dev/null +++ b/web_theme_classic/i18n/fi.po @@ -0,0 +1,62 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * web_theme_classic +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 18.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2026-05-12 16:45+0000\n" +"Last-Translator: Jarmo Kortetjärvi \n" +"Language-Team: none\n" +"Language: fi\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 5.15.2\n" + +#. module: web_theme_classic +#. odoo-javascript +#: code:addons/web_theme_classic/static/src/js/switch_theme.esm.js:0 +msgid "Classic Theme" +msgstr "Klassinen teema" + +#. module: web_theme_classic +#: model:ir.model.fields,field_description:web_theme_classic.field_res_users__persistent_classic_theme +msgid "Classic Theme Persistent" +msgstr "Klassinen teema pysyvästi" + +#. module: web_theme_classic +#: model:ir.model,name:web_theme_classic.model_ir_http +msgid "HTTP Routing" +msgstr "HTTP-reititys" + +#. module: web_theme_classic +#: model:ir.model.fields,field_description:web_theme_classic.field_res_users_settings__persistent_classic_theme +msgid "Persistent Classic Theme" +msgstr "Klassinen teema pysyvästi" + +#. module: web_theme_classic +#: model:ir.model.fields,help:web_theme_classic.field_res_users__persistent_classic_theme +msgid "" +"This enables Classic Theme on this user's account across all devices. \n" +" Disabling it will will alow you to to use the toggle in the user burger menu in the navbar to enable Classic Mode on a specific session/device \n" +"The toggle is not visible while Persistent Classic Theme is enabled" +msgstr "" +"Tämä ottaa klassisen teeman käyttöön tämän käyttäjän tilillä kaikilla " +"laitteilla.\n" +"Jos valinta ei ole päällä, voit käyttää navigointipalkin käyttäjävalikossa " +"olevaa kytkintä klassisen teeman käyttöönottamiseksi tietyssä istunnossa tai " +"tietyllä laitteella.\n" +"Kytkin ei ole näkyvissä, kun klassinen teema on pysyvästi käytössä" + +#. module: web_theme_classic +#: model:ir.model,name:web_theme_classic.model_res_users +msgid "User" +msgstr "Käyttäjä" + +#. module: web_theme_classic +#: model:ir.model,name:web_theme_classic.model_res_users_settings +msgid "User Settings" +msgstr "Käyttäjän asetukset" diff --git a/web_timeline/i18n/es.po b/web_timeline/i18n/es.po index ed08745a03bb..d38da33f4325 100644 --- a/web_timeline/i18n/es.po +++ b/web_timeline/i18n/es.po @@ -9,7 +9,7 @@ msgstr "" "Project-Id-Version: Odoo Server 10.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2018-01-03 03:50+0000\n" -"PO-Revision-Date: 2026-04-13 08:14+0000\n" +"PO-Revision-Date: 2026-05-07 17:46+0000\n" "Last-Translator: Ed-Spain \n" "Language-Team: Spanish (https://www.transifex.com/oca/teams/23907/es/)\n" "Language: es\n" @@ -24,12 +24,12 @@ msgstr "" #: code:addons/web_timeline/static/src/views/timeline/timeline_renderer.esm.js:0 #, python-format msgid "UNASSIGNED" -msgstr "SINASIGNAR" +msgstr "SIN ASIGNAR" #. module: web_timeline #: model:ir.model,name:web_timeline.model_ir_actions_act_window_view msgid "Action Window View" -msgstr "Vista de ventana de acción" +msgstr "Vista de Ventana de Acción" #. module: web_timeline #. odoo-javascript diff --git a/web_widget_domain_editor_dialog/i18n/es.po b/web_widget_domain_editor_dialog/i18n/es.po index b80e806e3bb2..02a41a6510f9 100644 --- a/web_widget_domain_editor_dialog/i18n/es.po +++ b/web_widget_domain_editor_dialog/i18n/es.po @@ -7,21 +7,22 @@ msgstr "" "Project-Id-Version: Odoo Server 11.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2019-02-22 11:23+0000\n" -"PO-Revision-Date: 2019-02-22 11:23+0000\n" -"Last-Translator: <>\n" +"PO-Revision-Date: 2026-05-07 17:46+0000\n" +"Last-Translator: Ed-Spain \n" "Language-Team: \n" -"Language: \n" +"Language: es\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: \n" -"Plural-Forms: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 5.15.2\n" #. module: web_widget_domain_editor_dialog #. odoo-javascript #: code:addons/web_widget_domain_editor_dialog/static/src/js/domain_field.esm.js:0 #, python-format msgid "Select records..." -msgstr "Seleccionar registros..." +msgstr "Seleccionar Registros..." #. module: web_widget_domain_editor_dialog #. odoo-javascript diff --git a/web_widget_dropdown_dynamic/i18n/es.po b/web_widget_dropdown_dynamic/i18n/es.po index a055960d01fe..ba5ab038cb9f 100644 --- a/web_widget_dropdown_dynamic/i18n/es.po +++ b/web_widget_dropdown_dynamic/i18n/es.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: Odoo Server 13.0\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2026-04-13 08:14+0000\n" +"PO-Revision-Date: 2026-05-07 17:46+0000\n" "Last-Translator: Ed-Spain \n" "Language-Team: none\n" "Language: es\n" @@ -25,7 +25,7 @@ msgstr "Entero desplegable" #. odoo-javascript #: code:addons/web_widget_dropdown_dynamic/static/src/js/field_dynamic_dropdown.esm.js:0 msgid "Dynamic Dropdown" -msgstr "Menú desplegable dinámico" +msgstr "Menú desplegable Dinámico" #. module: web_widget_dropdown_dynamic #: model:ir.model,name:web_widget_dropdown_dynamic.model_ir_filters