From 01b9498193742c843343d820ade4e13cc5b4df74 Mon Sep 17 00:00:00 2001 From: esam Date: Mon, 5 Jan 2026 09:53:33 -0500 Subject: [PATCH] m --- odex30_base/odex30_web/__init__.py | 3 + odex30_base/odex30_web/__manifest__.py | 85 + odex30_base/odex30_web/i18n/ar_001.po | 457 +++ odex30_base/odex30_web/models/__init__.py | 3 + odex30_base/odex30_web/models/ir_http.py | 37 + .../odex30_web/models/res_users_settings.py | 8 + .../odex30_web/static/img/automation.svg | 25 + .../odex30_web/static/img/background-dark.jpg | Bin 0 -> 8745 bytes .../static/img/background-light.svg | 35 + .../odex30_web/static/src/@types/main.d.ts | 3 + .../src/core/colorlist/colorlist.dark.scss | 8 + .../src/core/dropdown/dropdown.dark.scss | 8 + .../static/src/core/notebook/notebook.scss | 11 + .../static/src/core/popover/popover.dark.scss | 15 + .../search_panel/search_panel.dark.scss | 9 + .../src/core/tags_list/tags_list.dark.scss | 13 + odex30_base/odex30_web/static/src/main.js | 11 + .../src/scss/bootstrap_overridden.dark.scss | 181 ++ .../static/src/scss/bootstrap_overridden.scss | 136 + .../scss/bs_functions_overridden.dark.scss | 14 + .../src/scss/primary_variables.dark.scss | 193 ++ .../static/src/scss/primary_variables.scss | 107 + .../src/scss/secondary_variables.dark.scss | 19 + .../static/src/scss/secondary_variables.scss | 4 + .../search/search_bar/search_bar.dark.scss | 7 + .../search/search_panel/search_view.dark.scss | 12 + .../dashboard/dashboard_controller.dark.scss | 10 + .../views/fields/image/image_field.dark.scss | 7 + .../properties/properties_field.dark.scss | 13 + .../form/button_box/button_box.dark.scss | 4 + .../views/gantt/web_gantt.variables.dark.scss | 9 + .../views/kanban/kanban_controller.dark.scss | 11 + .../src/views/kanban/kanban_header_patch.js | 44 + .../static/src/views/kanban/kanban_view.scss | 14 + .../src/views/list/list_controller.dark.scss | 4 + .../src/views/list/list_controller.scss | 3 + .../src/views/list/list_renderer_desktop.js | 103 + .../src/views/list/list_renderer_desktop.xml | 16 + .../static/src/views/pivot/pivot_renderer.js | 31 + .../src/views/pivot/pivot_renderer.scss | 27 + .../static/src/views/pivot/pivot_renderer.xml | 10 + .../src/webclient/burger_menu/burger_menu.js | 21 + .../burger_menu.variables.dark.scss | 6 + .../color_scheme/color_scheme_menu_items.js | 19 + .../color_scheme/color_scheme_service.js | 27 + .../enterprise_subscription_service.js | 195 ++ .../webclient/home_menu/expiration_panel.js | 97 + .../webclient/home_menu/expiration_panel.scss | 8 + .../webclient/home_menu/expiration_panel.xml | 65 + .../webclient/home_menu/home_menu.dark.scss | 16 + .../src/webclient/home_menu/home_menu.js | 379 +++ .../src/webclient/home_menu/home_menu.scss | 136 + .../home_menu/home_menu.variables.dark.scss | 6 + .../home_menu/home_menu.variables.scss | 11 + .../src/webclient/home_menu/home_menu.xml | 53 + .../home_menu/home_menu_background.dark.scss | 8 + .../home_menu/home_menu_background.scss | 9 + .../webclient/home_menu/home_menu_service.js | 96 + .../src/webclient/navbar/navbar.dark.scss | 14 + .../static/src/webclient/navbar/navbar.js | 77 + .../static/src/webclient/navbar/navbar.scss | 21 + .../navbar/navbar.variables.dark.scss | 6 + .../webclient/navbar/navbar.variables.scss | 24 + .../static/src/webclient/navbar/navbar.xml | 54 + .../promote_studio_dialog.js | 56 + .../promote_studio_dialog.xml | 59 + .../settings_form_view/res_config_edition.xml | 24 + .../settings_form_view.dark.scss | 10 + .../src/webclient/share_url/burger_menu.js | 16 + .../src/webclient/share_url/burger_menu.xml | 13 + .../src/webclient/share_url/share_url.js | 42 + .../static/src/webclient/webclient.js | 19 + .../odex30_web/static/tests/helpers.js | 9 + .../static/tests/mobile/burger_menu.test.js | 107 + .../static/tests/mobile/pivot_view.test.js | 72 + .../tests/mobile/webclient_mobile.test.js | 112 + .../tests/tours/web_enterprise_tours.js | 17 + .../static/tests/views/list.test.js | 348 ++ .../webclient/action_manager_mobile.test.js | 164 + .../static/tests/webclient/clickbot.test.js | 176 + .../tests/webclient/expiration_panel.test.js | 615 ++++ .../static/tests/webclient/home_menu.test.js | 353 ++ .../webclient/webclient_enterprise.test.js | 798 +++++ odex30_base/odex30_web/tests/__init__.py | 2 + odex30_base/odex30_web/tests/test_odex.py | 68 + odex30_base/odex30_web/version.py | 10 + .../odex30_web/views/webclient_templates.xml | 15 + odex30_base/odex30_web_cohort/__init__.py | 4 + odex30_base/odex30_web_cohort/__manifest__.py | 19 + .../odex30_web_cohort/controllers/__init__.py | 2 + .../odex30_web_cohort/controllers/main.py | 101 + odex30_base/odex30_web_cohort/i18n/ar_001.po | 154 + .../odex30_web_cohort/models/__init__.py | 4 + .../models/ir_action_act_window.py | 9 + .../odex30_web_cohort/models/ir_ui_view.py | 15 + .../odex30_web_cohort/models/models.py | 168 + .../static/src/cohort.variables.scss | 3 + .../static/src/cohort_arch_parser.js | 98 + .../static/src/cohort_controller.js | 68 + .../static/src/cohort_controller.scss | 43 + .../static/src/cohort_controller.xml | 35 + .../static/src/cohort_model.js | 107 + .../static/src/cohort_renderer.js | 103 + .../static/src/cohort_renderer.xml | 112 + .../static/src/cohort_view.js | 53 + .../static/src/cohort_view_sample_server.js | 87 + .../static/tests/cohort_mock_server.js | 155 + .../static/tests/cohort_view.test.js | 846 +++++ .../odex30_web_cohort/tests/__init__.py | 1 + .../odex30_web_cohort/tests/test_views.py | 83 + odex30_base/odex30_web_cohort/validation.py | 28 + .../odex30_web_cohort/views/cohort.rng | 98 + odex30_base/odex30_web_gantt/__init__.py | 2 + odex30_base/odex30_web_gantt/__manifest__.py | 35 + odex30_base/odex30_web_gantt/i18n/ar_001.po | 367 +++ .../odex30_web_gantt/models/__init__.py | 4 + .../odex30_web_gantt/models/ir_actions.py | 8 + .../odex30_web_gantt/models/ir_ui_view.py | 116 + odex30_base/odex30_web_gantt/models/models.py | 734 +++++ .../static/src/gantt_arch_parser.js | 337 ++ .../static/src/gantt_compiler.js | 19 + .../static/src/gantt_connector.js | 236 ++ .../static/src/gantt_connector.xml | 116 + .../static/src/gantt_controller.js | 183 ++ .../static/src/gantt_controller.xml | 50 + .../static/src/gantt_helpers.js | 680 ++++ .../static/src/gantt_mock_server.js | 35 + .../static/src/gantt_model.js | 885 +++++ .../static/src/gantt_popover.js | 59 + .../static/src/gantt_popover.xml | 44 + .../static/src/gantt_popover_in_dialog.js | 11 + .../static/src/gantt_popover_in_dialog.xml | 8 + .../static/src/gantt_renderer.js | 2465 ++++++++++++++ .../static/src/gantt_renderer.xml | 255 ++ .../static/src/gantt_renderer_controls.js | 224 ++ .../static/src/gantt_renderer_controls.xml | 143 + .../static/src/gantt_resize_badge.js | 44 + .../static/src/gantt_resize_badge.xml | 14 + .../static/src/gantt_row_progress_bar.js | 36 + .../static/src/gantt_row_progress_bar.xml | 36 + .../static/src/gantt_sample_server.js | 42 + .../static/src/gantt_view.dark.scss | 18 + .../odex30_web_gantt/static/src/gantt_view.js | 62 + .../static/src/gantt_view.scss | 668 ++++ .../static/src/gantt_view.variables.dark.scss | 6 + .../static/src/gantt_view.variables.scss | 94 + .../static/tests/gantt_dependency.test.js | 912 ++++++ .../static/tests/gantt_dependency_helpers.js | 77 + .../static/tests/gantt_mock_models.js | 220 ++ .../static/tests/gantt_mock_server.js | 39 + .../static/tests/gantt_sparse.test.js | 526 +++ .../tests/gantt_view_attributes.test.js | 994 ++++++ .../static/tests/gantt_view_basics.test.js | 1294 ++++++++ .../tests/gantt_view_behavioral.test.js | 2465 ++++++++++++++ .../tests/gantt_view_concurrency.test.js | 448 +++ .../static/tests/gantt_view_manual.test.js | 104 + .../static/tests/gantt_view_mobile.test.js | 372 +++ .../static/tests/gantt_view_other.test.js | 1806 +++++++++++ .../static/tests/gantt_view_sample.test.js | 202 ++ .../static/tests/web_gantt_test_helpers.js | 491 +++ .../odex30_web_gantt/tests/__init__.py | 2 + .../odex30_web_gantt/tests/test_acl.py | 38 + odex30_base/whatsapp/__init__.py | 5 + odex30_base/whatsapp/__manifest__.py | 60 + odex30_base/whatsapp/controller/__init__.py | 1 + odex30_base/whatsapp/controller/main.py | 98 + .../whatsapp/data/ir_actions_server_data.xml | 12 + odex30_base/whatsapp/data/ir_cron_data.xml | 13 + .../whatsapp/data/ir_module_category_data.xml | 10 + odex30_base/whatsapp/data/neutralize.sql | 2 + odex30_base/whatsapp/data/whatsapp_demo.xml | 20 + .../data/whatsapp_templates_preview.xml | 54 + odex30_base/whatsapp/i18n/ar.po | 2827 ++++++++++++++++ odex30_base/whatsapp/i18n/az.po | 2757 ++++++++++++++++ odex30_base/whatsapp/i18n/bg.po | 2774 ++++++++++++++++ odex30_base/whatsapp/i18n/bs.po | 2753 ++++++++++++++++ odex30_base/whatsapp/i18n/ca.po | 2821 ++++++++++++++++ odex30_base/whatsapp/i18n/cs.po | 2836 ++++++++++++++++ odex30_base/whatsapp/i18n/da.po | 2820 ++++++++++++++++ odex30_base/whatsapp/i18n/de.po | 2873 +++++++++++++++++ odex30_base/whatsapp/i18n/el.po | 2763 ++++++++++++++++ odex30_base/whatsapp/i18n/es.po | 2867 ++++++++++++++++ odex30_base/whatsapp/i18n/es_419.po | 2867 ++++++++++++++++ odex30_base/whatsapp/i18n/et.po | 2573 +++++++++++++++ odex30_base/whatsapp/i18n/fa.po | 2821 ++++++++++++++++ odex30_base/whatsapp/i18n/fi.po | 2865 ++++++++++++++++ odex30_base/whatsapp/i18n/fr.po | 2870 ++++++++++++++++ odex30_base/whatsapp/i18n/he.po | 2778 ++++++++++++++++ odex30_base/whatsapp/i18n/hi.po | 2760 ++++++++++++++++ odex30_base/whatsapp/i18n/hr.po | 2770 ++++++++++++++++ odex30_base/whatsapp/i18n/hu.po | 2768 ++++++++++++++++ odex30_base/whatsapp/i18n/id.po | 2841 ++++++++++++++++ odex30_base/whatsapp/i18n/it.po | 2864 ++++++++++++++++ odex30_base/whatsapp/i18n/ja.po | 2842 ++++++++++++++++ odex30_base/whatsapp/i18n/kab.po | 2747 ++++++++++++++++ odex30_base/whatsapp/i18n/ko.po | 2825 ++++++++++++++++ odex30_base/whatsapp/i18n/ku.po | 2755 ++++++++++++++++ odex30_base/whatsapp/i18n/lt.po | 2775 ++++++++++++++++ odex30_base/whatsapp/i18n/lv.po | 2773 ++++++++++++++++ odex30_base/whatsapp/i18n/mn.po | 2762 ++++++++++++++++ odex30_base/whatsapp/i18n/my.po | 2753 ++++++++++++++++ odex30_base/whatsapp/i18n/nb.po | 2762 ++++++++++++++++ odex30_base/whatsapp/i18n/nl.po | 2854 ++++++++++++++++ odex30_base/whatsapp/i18n/pl.po | 2860 ++++++++++++++++ odex30_base/whatsapp/i18n/pt.po | 2847 ++++++++++++++++ odex30_base/whatsapp/i18n/pt_BR.po | 2858 ++++++++++++++++ odex30_base/whatsapp/i18n/ro.po | 2857 ++++++++++++++++ odex30_base/whatsapp/i18n/ru.po | 2862 ++++++++++++++++ odex30_base/whatsapp/i18n/sk.po | 2740 ++++++++++++++++ odex30_base/whatsapp/i18n/sl.po | 2766 ++++++++++++++++ odex30_base/whatsapp/i18n/sr@latin.po | 2756 ++++++++++++++++ odex30_base/whatsapp/i18n/sv.po | 2794 ++++++++++++++++ odex30_base/whatsapp/i18n/th.po | 2802 ++++++++++++++++ odex30_base/whatsapp/i18n/tr.po | 2857 ++++++++++++++++ odex30_base/whatsapp/i18n/uk.po | 2850 ++++++++++++++++ odex30_base/whatsapp/i18n/vi.po | 2833 ++++++++++++++++ odex30_base/whatsapp/i18n/whatsapp.pot | 2742 ++++++++++++++++ odex30_base/whatsapp/i18n/zh_CN.po | 2797 ++++++++++++++++ odex30_base/whatsapp/i18n/zh_TW.po | 2796 ++++++++++++++++ odex30_base/whatsapp/models/__init__.py | 14 + .../whatsapp/models/discuss_channel.py | 274 ++ .../whatsapp/models/discuss_channel_member.py | 31 + .../whatsapp/models/ir_actions_server.py | 41 + odex30_base/whatsapp/models/mail_message.py | 71 + odex30_base/whatsapp/models/mail_thread.py | 16 + odex30_base/whatsapp/models/models.py | 82 + odex30_base/whatsapp/models/res_partner.py | 122 + .../whatsapp/models/res_users_settings.py | 10 + .../whatsapp/models/whatsapp_account.py | 222 ++ .../whatsapp/models/whatsapp_message.py | 415 +++ .../whatsapp/models/whatsapp_template.py | 900 ++++++ .../models/whatsapp_template_button.py | 109 + .../models/whatsapp_template_variable.py | 155 + .../whatsapp/security/ir.model.access.csv | 16 + odex30_base/whatsapp/security/ir_rules.xml | 89 + odex30_base/whatsapp/security/res_groups.xml | 8 + .../whatsapp/static/description/icon.png | Bin 0 -> 4540 bytes .../whatsapp/static/description/icon.svg | 31 + odex30_base/whatsapp/static/img/bgimg.jpg | Bin 0 -> 95924 bytes odex30_base/whatsapp/static/img/document.png | Bin 0 -> 1704 bytes odex30_base/whatsapp/static/img/image.png | Bin 0 -> 1900 bytes odex30_base/whatsapp/static/img/location.png | Bin 0 -> 3525 bytes .../whatsapp/static/img/mailfailure.jpg | Bin 0 -> 10498 bytes odex30_base/whatsapp/static/img/photos.png | Bin 0 -> 1874 bytes odex30_base/whatsapp/static/img/test.png | Bin 0 -> 33515 bytes odex30_base/whatsapp/static/img/video.png | Bin 0 -> 2219 bytes odex30_base/whatsapp/static/pdf/test.pdf | Bin 0 -> 50226 bytes .../static/src/chatter/web/chatter_patch.js | 38 + .../static/src/chatter/web/chatter_patch.xml | 15 + .../src/components/phone_field/phone_field.js | 40 + .../components/phone_field/phone_field.xml | 20 + .../whatsapp_button/whatsapp_button.js | 41 + .../whatsapp_button/whatsapp_button.xml | 16 + .../whatsapp_variables_text_field.js | 53 + .../whatsapp_variables_text_field.xml | 16 + .../static/src/core/common/@types/models.d.ts | 5 + .../src/core/common/chat_window_patch.xml | 8 + .../src/core/common/composer_model_patch.js | 6 + .../static/src/core/common/composer_patch.js | 94 + .../static/src/core/common/composer_patch.xml | 29 + .../src/core/common/im_status_patch.xml | 12 + .../src/core/common/message_model_patch.js | 15 + .../static/src/core/common/message_patch.js | 59 + .../static/src/core/common/message_patch.xml | 12 + .../src/core/common/store_service_patch.js | 36 + .../src/core/common/thread_icon_patch.xml | 14 + .../src/core/common/thread_model_patch.js | 44 + .../static/src/core/common/thread_patch.js | 12 + .../src/core/public_web/@types/models.d.ts | 5 + .../public_web/discuss_app_model_patch.js | 32 + .../core/public_web/messaging_menu_patch.js | 30 + .../src/core/public_web/thread_model_patch.js | 10 + .../src/core/web/channel_member_list_patch.js | 12 + .../src/core/web/channel_selector_patch.js | 52 + .../web/discuss_app_category_model_patch.js | 14 + .../discuss_sidebar_category_item_patch.xml | 8 + .../src/core/web/messaging_menu_patch.scss | 4 + .../src/core/web/messaging_menu_patch.xml | 21 + .../discuss/core/common/@types/models.d.ts | 6 + .../core/common/channel_member_list_patch.xml | 16 + .../discuss/core/common/thread_model_patch.js | 32 + .../src/scss/whatsapp_preview.dark.scss | 29 + .../static/src/scss/whatsapp_preview.scss | 40 + .../whatsapp_channel_list_view.js | 11 + .../whatsapp_channel_list_view_controller.js | 22 + .../static/tests/chat_window_patch.test.js | 18 + .../static/tests/chatter_patch.test.js | 25 + .../static/tests/composer_patch.test.js | 153 + .../static/tests/discuss_patch.test.js | 96 + .../tests/discuss_sidebar_patch.test.js | 162 + .../static/tests/message_patch.test.js | 204 ++ .../static/tests/messaging_menu_patch.test.js | 36 + .../mock_models/@types/mock_models.d.ts | 15 + .../mock_models/discuss_channel.js | 71 + .../mock_server/mock_models/mail_message.js | 35 + .../mock_server/mock_models/mail_thread.js | 27 + .../mock_models/res_users_settings.js | 6 + .../mock_models/whatsapp_composer.js | 5 + .../mock_models/whatsapp_message.js | 5 + .../mock_models/whatsapp_template.js | 10 + .../static/tests/whatsapp_test_helpers.js | 25 + odex30_base/whatsapp/static/video/test.mp4 | Bin 0 -> 70345 bytes odex30_base/whatsapp/tests/__init__.py | 8 + odex30_base/whatsapp/tests/common.py | 789 +++++ odex30_base/whatsapp/tests/template_data.py | 166 + .../whatsapp/tests/test_discuss_channel.py | 193 ++ .../whatsapp/tests/test_phone_format.py | 78 + odex30_base/whatsapp/tests/test_security.py | 494 +++ .../whatsapp/tests/test_whatsapp_composer.py | 420 +++ .../whatsapp/tests/test_whatsapp_message.py | 145 + .../whatsapp/tests/test_whatsapp_template.py | 1100 +++++++ odex30_base/whatsapp/tools/__init__.py | 7 + odex30_base/whatsapp/tools/bounced_codes.py | 12 + odex30_base/whatsapp/tools/lang_list.py | 118 + .../whatsapp/tools/phone_validation.py | 71 + odex30_base/whatsapp/tools/retryable_codes.py | 37 + odex30_base/whatsapp/tools/whatsapp_api.py | 274 ++ .../whatsapp/tools/whatsapp_exception.py | 30 + .../whatsapp/views/discuss_channel_views.xml | 37 + .../views/ir_actions_server_views.xml | 17 + .../views/res_config_settings_views.xml | 17 + .../whatsapp/views/res_partner_views.xml | 23 + .../whatsapp/views/whatsapp_account_views.xml | 114 + odex30_base/whatsapp/views/whatsapp_menus.xml | 31 + .../whatsapp/views/whatsapp_message_views.xml | 126 + .../views/whatsapp_template_button_views.xml | 39 + .../whatsapp_template_variable_views.xml | 41 + .../views/whatsapp_template_views.xml | 246 ++ odex30_base/whatsapp/wizard/__init__.py | 3 + .../whatsapp/wizard/whatsapp_composer.py | 311 ++ .../wizard/whatsapp_composer_views.xml | 64 + .../whatsapp/wizard/whatsapp_preview.py | 24 + .../wizard/whatsapp_preview_views.xml | 29 + 333 files changed, 168085 insertions(+) create mode 100644 odex30_base/odex30_web/__init__.py create mode 100644 odex30_base/odex30_web/__manifest__.py create mode 100644 odex30_base/odex30_web/i18n/ar_001.po create mode 100644 odex30_base/odex30_web/models/__init__.py create mode 100644 odex30_base/odex30_web/models/ir_http.py create mode 100644 odex30_base/odex30_web/models/res_users_settings.py create mode 100755 odex30_base/odex30_web/static/img/automation.svg create mode 100644 odex30_base/odex30_web/static/img/background-dark.jpg create mode 100644 odex30_base/odex30_web/static/img/background-light.svg create mode 100644 odex30_base/odex30_web/static/src/@types/main.d.ts create mode 100644 odex30_base/odex30_web/static/src/core/colorlist/colorlist.dark.scss create mode 100644 odex30_base/odex30_web/static/src/core/dropdown/dropdown.dark.scss create mode 100644 odex30_base/odex30_web/static/src/core/notebook/notebook.scss create mode 100644 odex30_base/odex30_web/static/src/core/popover/popover.dark.scss create mode 100644 odex30_base/odex30_web/static/src/core/search/search_panel/search_panel.dark.scss create mode 100644 odex30_base/odex30_web/static/src/core/tags_list/tags_list.dark.scss create mode 100644 odex30_base/odex30_web/static/src/main.js create mode 100644 odex30_base/odex30_web/static/src/scss/bootstrap_overridden.dark.scss create mode 100644 odex30_base/odex30_web/static/src/scss/bootstrap_overridden.scss create mode 100644 odex30_base/odex30_web/static/src/scss/bs_functions_overridden.dark.scss create mode 100644 odex30_base/odex30_web/static/src/scss/primary_variables.dark.scss create mode 100644 odex30_base/odex30_web/static/src/scss/primary_variables.scss create mode 100644 odex30_base/odex30_web/static/src/scss/secondary_variables.dark.scss create mode 100644 odex30_base/odex30_web/static/src/scss/secondary_variables.scss create mode 100644 odex30_base/odex30_web/static/src/search/search_bar/search_bar.dark.scss create mode 100644 odex30_base/odex30_web/static/src/search/search_panel/search_view.dark.scss create mode 100644 odex30_base/odex30_web/static/src/views/dashboard/dashboard_controller.dark.scss create mode 100644 odex30_base/odex30_web/static/src/views/fields/image/image_field.dark.scss create mode 100644 odex30_base/odex30_web/static/src/views/fields/properties/properties_field.dark.scss create mode 100644 odex30_base/odex30_web/static/src/views/form/button_box/button_box.dark.scss create mode 100644 odex30_base/odex30_web/static/src/views/gantt/web_gantt.variables.dark.scss create mode 100644 odex30_base/odex30_web/static/src/views/kanban/kanban_controller.dark.scss create mode 100644 odex30_base/odex30_web/static/src/views/kanban/kanban_header_patch.js create mode 100644 odex30_base/odex30_web/static/src/views/kanban/kanban_view.scss create mode 100644 odex30_base/odex30_web/static/src/views/list/list_controller.dark.scss create mode 100644 odex30_base/odex30_web/static/src/views/list/list_controller.scss create mode 100644 odex30_base/odex30_web/static/src/views/list/list_renderer_desktop.js create mode 100644 odex30_base/odex30_web/static/src/views/list/list_renderer_desktop.xml create mode 100644 odex30_base/odex30_web/static/src/views/pivot/pivot_renderer.js create mode 100644 odex30_base/odex30_web/static/src/views/pivot/pivot_renderer.scss create mode 100644 odex30_base/odex30_web/static/src/views/pivot/pivot_renderer.xml create mode 100644 odex30_base/odex30_web/static/src/webclient/burger_menu/burger_menu.js create mode 100644 odex30_base/odex30_web/static/src/webclient/burger_menu/burger_menu.variables.dark.scss create mode 100644 odex30_base/odex30_web/static/src/webclient/color_scheme/color_scheme_menu_items.js create mode 100644 odex30_base/odex30_web/static/src/webclient/color_scheme/color_scheme_service.js create mode 100644 odex30_base/odex30_web/static/src/webclient/home_menu/enterprise_subscription_service.js create mode 100644 odex30_base/odex30_web/static/src/webclient/home_menu/expiration_panel.js create mode 100644 odex30_base/odex30_web/static/src/webclient/home_menu/expiration_panel.scss create mode 100644 odex30_base/odex30_web/static/src/webclient/home_menu/expiration_panel.xml create mode 100644 odex30_base/odex30_web/static/src/webclient/home_menu/home_menu.dark.scss create mode 100644 odex30_base/odex30_web/static/src/webclient/home_menu/home_menu.js create mode 100644 odex30_base/odex30_web/static/src/webclient/home_menu/home_menu.scss create mode 100644 odex30_base/odex30_web/static/src/webclient/home_menu/home_menu.variables.dark.scss create mode 100644 odex30_base/odex30_web/static/src/webclient/home_menu/home_menu.variables.scss create mode 100644 odex30_base/odex30_web/static/src/webclient/home_menu/home_menu.xml create mode 100644 odex30_base/odex30_web/static/src/webclient/home_menu/home_menu_background.dark.scss create mode 100644 odex30_base/odex30_web/static/src/webclient/home_menu/home_menu_background.scss create mode 100644 odex30_base/odex30_web/static/src/webclient/home_menu/home_menu_service.js create mode 100644 odex30_base/odex30_web/static/src/webclient/navbar/navbar.dark.scss create mode 100644 odex30_base/odex30_web/static/src/webclient/navbar/navbar.js create mode 100644 odex30_base/odex30_web/static/src/webclient/navbar/navbar.scss create mode 100644 odex30_base/odex30_web/static/src/webclient/navbar/navbar.variables.dark.scss create mode 100644 odex30_base/odex30_web/static/src/webclient/navbar/navbar.variables.scss create mode 100644 odex30_base/odex30_web/static/src/webclient/navbar/navbar.xml create mode 100644 odex30_base/odex30_web/static/src/webclient/promote_studio_dialog/promote_studio_dialog.js create mode 100644 odex30_base/odex30_web/static/src/webclient/promote_studio_dialog/promote_studio_dialog.xml create mode 100644 odex30_base/odex30_web/static/src/webclient/settings_form_view/res_config_edition.xml create mode 100644 odex30_base/odex30_web/static/src/webclient/settings_form_view/settings_form_view.dark.scss create mode 100644 odex30_base/odex30_web/static/src/webclient/share_url/burger_menu.js create mode 100644 odex30_base/odex30_web/static/src/webclient/share_url/burger_menu.xml create mode 100644 odex30_base/odex30_web/static/src/webclient/share_url/share_url.js create mode 100644 odex30_base/odex30_web/static/src/webclient/webclient.js create mode 100644 odex30_base/odex30_web/static/tests/helpers.js create mode 100644 odex30_base/odex30_web/static/tests/mobile/burger_menu.test.js create mode 100644 odex30_base/odex30_web/static/tests/mobile/pivot_view.test.js create mode 100644 odex30_base/odex30_web/static/tests/mobile/webclient_mobile.test.js create mode 100644 odex30_base/odex30_web/static/tests/tours/web_enterprise_tours.js create mode 100644 odex30_base/odex30_web/static/tests/views/list.test.js create mode 100644 odex30_base/odex30_web/static/tests/webclient/action_manager_mobile.test.js create mode 100644 odex30_base/odex30_web/static/tests/webclient/clickbot.test.js create mode 100644 odex30_base/odex30_web/static/tests/webclient/expiration_panel.test.js create mode 100644 odex30_base/odex30_web/static/tests/webclient/home_menu.test.js create mode 100644 odex30_base/odex30_web/static/tests/webclient/webclient_enterprise.test.js create mode 100644 odex30_base/odex30_web/tests/__init__.py create mode 100644 odex30_base/odex30_web/tests/test_odex.py create mode 100644 odex30_base/odex30_web/version.py create mode 100644 odex30_base/odex30_web/views/webclient_templates.xml create mode 100644 odex30_base/odex30_web_cohort/__init__.py create mode 100644 odex30_base/odex30_web_cohort/__manifest__.py create mode 100644 odex30_base/odex30_web_cohort/controllers/__init__.py create mode 100644 odex30_base/odex30_web_cohort/controllers/main.py create mode 100644 odex30_base/odex30_web_cohort/i18n/ar_001.po create mode 100644 odex30_base/odex30_web_cohort/models/__init__.py create mode 100644 odex30_base/odex30_web_cohort/models/ir_action_act_window.py create mode 100644 odex30_base/odex30_web_cohort/models/ir_ui_view.py create mode 100644 odex30_base/odex30_web_cohort/models/models.py create mode 100644 odex30_base/odex30_web_cohort/static/src/cohort.variables.scss create mode 100644 odex30_base/odex30_web_cohort/static/src/cohort_arch_parser.js create mode 100644 odex30_base/odex30_web_cohort/static/src/cohort_controller.js create mode 100644 odex30_base/odex30_web_cohort/static/src/cohort_controller.scss create mode 100644 odex30_base/odex30_web_cohort/static/src/cohort_controller.xml create mode 100644 odex30_base/odex30_web_cohort/static/src/cohort_model.js create mode 100644 odex30_base/odex30_web_cohort/static/src/cohort_renderer.js create mode 100644 odex30_base/odex30_web_cohort/static/src/cohort_renderer.xml create mode 100644 odex30_base/odex30_web_cohort/static/src/cohort_view.js create mode 100644 odex30_base/odex30_web_cohort/static/src/cohort_view_sample_server.js create mode 100644 odex30_base/odex30_web_cohort/static/tests/cohort_mock_server.js create mode 100644 odex30_base/odex30_web_cohort/static/tests/cohort_view.test.js create mode 100644 odex30_base/odex30_web_cohort/tests/__init__.py create mode 100644 odex30_base/odex30_web_cohort/tests/test_views.py create mode 100644 odex30_base/odex30_web_cohort/validation.py create mode 100644 odex30_base/odex30_web_cohort/views/cohort.rng create mode 100644 odex30_base/odex30_web_gantt/__init__.py create mode 100644 odex30_base/odex30_web_gantt/__manifest__.py create mode 100644 odex30_base/odex30_web_gantt/i18n/ar_001.po create mode 100644 odex30_base/odex30_web_gantt/models/__init__.py create mode 100644 odex30_base/odex30_web_gantt/models/ir_actions.py create mode 100644 odex30_base/odex30_web_gantt/models/ir_ui_view.py create mode 100644 odex30_base/odex30_web_gantt/models/models.py create mode 100644 odex30_base/odex30_web_gantt/static/src/gantt_arch_parser.js create mode 100644 odex30_base/odex30_web_gantt/static/src/gantt_compiler.js create mode 100644 odex30_base/odex30_web_gantt/static/src/gantt_connector.js create mode 100644 odex30_base/odex30_web_gantt/static/src/gantt_connector.xml create mode 100644 odex30_base/odex30_web_gantt/static/src/gantt_controller.js create mode 100644 odex30_base/odex30_web_gantt/static/src/gantt_controller.xml create mode 100644 odex30_base/odex30_web_gantt/static/src/gantt_helpers.js create mode 100644 odex30_base/odex30_web_gantt/static/src/gantt_mock_server.js create mode 100644 odex30_base/odex30_web_gantt/static/src/gantt_model.js create mode 100644 odex30_base/odex30_web_gantt/static/src/gantt_popover.js create mode 100644 odex30_base/odex30_web_gantt/static/src/gantt_popover.xml create mode 100644 odex30_base/odex30_web_gantt/static/src/gantt_popover_in_dialog.js create mode 100644 odex30_base/odex30_web_gantt/static/src/gantt_popover_in_dialog.xml create mode 100644 odex30_base/odex30_web_gantt/static/src/gantt_renderer.js create mode 100644 odex30_base/odex30_web_gantt/static/src/gantt_renderer.xml create mode 100644 odex30_base/odex30_web_gantt/static/src/gantt_renderer_controls.js create mode 100644 odex30_base/odex30_web_gantt/static/src/gantt_renderer_controls.xml create mode 100644 odex30_base/odex30_web_gantt/static/src/gantt_resize_badge.js create mode 100644 odex30_base/odex30_web_gantt/static/src/gantt_resize_badge.xml create mode 100644 odex30_base/odex30_web_gantt/static/src/gantt_row_progress_bar.js create mode 100644 odex30_base/odex30_web_gantt/static/src/gantt_row_progress_bar.xml create mode 100644 odex30_base/odex30_web_gantt/static/src/gantt_sample_server.js create mode 100644 odex30_base/odex30_web_gantt/static/src/gantt_view.dark.scss create mode 100644 odex30_base/odex30_web_gantt/static/src/gantt_view.js create mode 100644 odex30_base/odex30_web_gantt/static/src/gantt_view.scss create mode 100644 odex30_base/odex30_web_gantt/static/src/gantt_view.variables.dark.scss create mode 100644 odex30_base/odex30_web_gantt/static/src/gantt_view.variables.scss create mode 100644 odex30_base/odex30_web_gantt/static/tests/gantt_dependency.test.js create mode 100644 odex30_base/odex30_web_gantt/static/tests/gantt_dependency_helpers.js create mode 100644 odex30_base/odex30_web_gantt/static/tests/gantt_mock_models.js create mode 100644 odex30_base/odex30_web_gantt/static/tests/gantt_mock_server.js create mode 100644 odex30_base/odex30_web_gantt/static/tests/gantt_sparse.test.js create mode 100644 odex30_base/odex30_web_gantt/static/tests/gantt_view_attributes.test.js create mode 100644 odex30_base/odex30_web_gantt/static/tests/gantt_view_basics.test.js create mode 100644 odex30_base/odex30_web_gantt/static/tests/gantt_view_behavioral.test.js create mode 100644 odex30_base/odex30_web_gantt/static/tests/gantt_view_concurrency.test.js create mode 100644 odex30_base/odex30_web_gantt/static/tests/gantt_view_manual.test.js create mode 100644 odex30_base/odex30_web_gantt/static/tests/gantt_view_mobile.test.js create mode 100644 odex30_base/odex30_web_gantt/static/tests/gantt_view_other.test.js create mode 100644 odex30_base/odex30_web_gantt/static/tests/gantt_view_sample.test.js create mode 100644 odex30_base/odex30_web_gantt/static/tests/web_gantt_test_helpers.js create mode 100644 odex30_base/odex30_web_gantt/tests/__init__.py create mode 100644 odex30_base/odex30_web_gantt/tests/test_acl.py create mode 100644 odex30_base/whatsapp/__init__.py create mode 100644 odex30_base/whatsapp/__manifest__.py create mode 100644 odex30_base/whatsapp/controller/__init__.py create mode 100644 odex30_base/whatsapp/controller/main.py create mode 100644 odex30_base/whatsapp/data/ir_actions_server_data.xml create mode 100644 odex30_base/whatsapp/data/ir_cron_data.xml create mode 100644 odex30_base/whatsapp/data/ir_module_category_data.xml create mode 100644 odex30_base/whatsapp/data/neutralize.sql create mode 100644 odex30_base/whatsapp/data/whatsapp_demo.xml create mode 100644 odex30_base/whatsapp/data/whatsapp_templates_preview.xml create mode 100644 odex30_base/whatsapp/i18n/ar.po create mode 100644 odex30_base/whatsapp/i18n/az.po create mode 100644 odex30_base/whatsapp/i18n/bg.po create mode 100644 odex30_base/whatsapp/i18n/bs.po create mode 100644 odex30_base/whatsapp/i18n/ca.po create mode 100644 odex30_base/whatsapp/i18n/cs.po create mode 100644 odex30_base/whatsapp/i18n/da.po create mode 100644 odex30_base/whatsapp/i18n/de.po create mode 100644 odex30_base/whatsapp/i18n/el.po create mode 100644 odex30_base/whatsapp/i18n/es.po create mode 100644 odex30_base/whatsapp/i18n/es_419.po create mode 100644 odex30_base/whatsapp/i18n/et.po create mode 100644 odex30_base/whatsapp/i18n/fa.po create mode 100644 odex30_base/whatsapp/i18n/fi.po create mode 100644 odex30_base/whatsapp/i18n/fr.po create mode 100644 odex30_base/whatsapp/i18n/he.po create mode 100644 odex30_base/whatsapp/i18n/hi.po create mode 100644 odex30_base/whatsapp/i18n/hr.po create mode 100644 odex30_base/whatsapp/i18n/hu.po create mode 100644 odex30_base/whatsapp/i18n/id.po create mode 100644 odex30_base/whatsapp/i18n/it.po create mode 100644 odex30_base/whatsapp/i18n/ja.po create mode 100644 odex30_base/whatsapp/i18n/kab.po create mode 100644 odex30_base/whatsapp/i18n/ko.po create mode 100644 odex30_base/whatsapp/i18n/ku.po create mode 100644 odex30_base/whatsapp/i18n/lt.po create mode 100644 odex30_base/whatsapp/i18n/lv.po create mode 100644 odex30_base/whatsapp/i18n/mn.po create mode 100644 odex30_base/whatsapp/i18n/my.po create mode 100644 odex30_base/whatsapp/i18n/nb.po create mode 100644 odex30_base/whatsapp/i18n/nl.po create mode 100644 odex30_base/whatsapp/i18n/pl.po create mode 100644 odex30_base/whatsapp/i18n/pt.po create mode 100644 odex30_base/whatsapp/i18n/pt_BR.po create mode 100644 odex30_base/whatsapp/i18n/ro.po create mode 100644 odex30_base/whatsapp/i18n/ru.po create mode 100644 odex30_base/whatsapp/i18n/sk.po create mode 100644 odex30_base/whatsapp/i18n/sl.po create mode 100644 odex30_base/whatsapp/i18n/sr@latin.po create mode 100644 odex30_base/whatsapp/i18n/sv.po create mode 100644 odex30_base/whatsapp/i18n/th.po create mode 100644 odex30_base/whatsapp/i18n/tr.po create mode 100644 odex30_base/whatsapp/i18n/uk.po create mode 100644 odex30_base/whatsapp/i18n/vi.po create mode 100644 odex30_base/whatsapp/i18n/whatsapp.pot create mode 100644 odex30_base/whatsapp/i18n/zh_CN.po create mode 100644 odex30_base/whatsapp/i18n/zh_TW.po create mode 100644 odex30_base/whatsapp/models/__init__.py create mode 100644 odex30_base/whatsapp/models/discuss_channel.py create mode 100644 odex30_base/whatsapp/models/discuss_channel_member.py create mode 100644 odex30_base/whatsapp/models/ir_actions_server.py create mode 100644 odex30_base/whatsapp/models/mail_message.py create mode 100644 odex30_base/whatsapp/models/mail_thread.py create mode 100644 odex30_base/whatsapp/models/models.py create mode 100644 odex30_base/whatsapp/models/res_partner.py create mode 100644 odex30_base/whatsapp/models/res_users_settings.py create mode 100644 odex30_base/whatsapp/models/whatsapp_account.py create mode 100644 odex30_base/whatsapp/models/whatsapp_message.py create mode 100644 odex30_base/whatsapp/models/whatsapp_template.py create mode 100644 odex30_base/whatsapp/models/whatsapp_template_button.py create mode 100644 odex30_base/whatsapp/models/whatsapp_template_variable.py create mode 100644 odex30_base/whatsapp/security/ir.model.access.csv create mode 100644 odex30_base/whatsapp/security/ir_rules.xml create mode 100644 odex30_base/whatsapp/security/res_groups.xml create mode 100644 odex30_base/whatsapp/static/description/icon.png create mode 100644 odex30_base/whatsapp/static/description/icon.svg create mode 100644 odex30_base/whatsapp/static/img/bgimg.jpg create mode 100644 odex30_base/whatsapp/static/img/document.png create mode 100644 odex30_base/whatsapp/static/img/image.png create mode 100644 odex30_base/whatsapp/static/img/location.png create mode 100644 odex30_base/whatsapp/static/img/mailfailure.jpg create mode 100644 odex30_base/whatsapp/static/img/photos.png create mode 100644 odex30_base/whatsapp/static/img/test.png create mode 100644 odex30_base/whatsapp/static/img/video.png create mode 100644 odex30_base/whatsapp/static/pdf/test.pdf create mode 100644 odex30_base/whatsapp/static/src/chatter/web/chatter_patch.js create mode 100644 odex30_base/whatsapp/static/src/chatter/web/chatter_patch.xml create mode 100644 odex30_base/whatsapp/static/src/components/phone_field/phone_field.js create mode 100644 odex30_base/whatsapp/static/src/components/phone_field/phone_field.xml create mode 100644 odex30_base/whatsapp/static/src/components/whatsapp_button/whatsapp_button.js create mode 100644 odex30_base/whatsapp/static/src/components/whatsapp_button/whatsapp_button.xml create mode 100644 odex30_base/whatsapp/static/src/components/whatsapp_variables_text_field/whatsapp_variables_text_field.js create mode 100644 odex30_base/whatsapp/static/src/components/whatsapp_variables_text_field/whatsapp_variables_text_field.xml create mode 100644 odex30_base/whatsapp/static/src/core/common/@types/models.d.ts create mode 100644 odex30_base/whatsapp/static/src/core/common/chat_window_patch.xml create mode 100644 odex30_base/whatsapp/static/src/core/common/composer_model_patch.js create mode 100644 odex30_base/whatsapp/static/src/core/common/composer_patch.js create mode 100644 odex30_base/whatsapp/static/src/core/common/composer_patch.xml create mode 100644 odex30_base/whatsapp/static/src/core/common/im_status_patch.xml create mode 100644 odex30_base/whatsapp/static/src/core/common/message_model_patch.js create mode 100644 odex30_base/whatsapp/static/src/core/common/message_patch.js create mode 100644 odex30_base/whatsapp/static/src/core/common/message_patch.xml create mode 100644 odex30_base/whatsapp/static/src/core/common/store_service_patch.js create mode 100644 odex30_base/whatsapp/static/src/core/common/thread_icon_patch.xml create mode 100644 odex30_base/whatsapp/static/src/core/common/thread_model_patch.js create mode 100644 odex30_base/whatsapp/static/src/core/common/thread_patch.js create mode 100644 odex30_base/whatsapp/static/src/core/public_web/@types/models.d.ts create mode 100644 odex30_base/whatsapp/static/src/core/public_web/discuss_app_model_patch.js create mode 100644 odex30_base/whatsapp/static/src/core/public_web/messaging_menu_patch.js create mode 100644 odex30_base/whatsapp/static/src/core/public_web/thread_model_patch.js create mode 100644 odex30_base/whatsapp/static/src/core/web/channel_member_list_patch.js create mode 100644 odex30_base/whatsapp/static/src/core/web/channel_selector_patch.js create mode 100644 odex30_base/whatsapp/static/src/core/web/discuss_app_category_model_patch.js create mode 100644 odex30_base/whatsapp/static/src/core/web/discuss_sidebar_category_item_patch.xml create mode 100644 odex30_base/whatsapp/static/src/core/web/messaging_menu_patch.scss create mode 100644 odex30_base/whatsapp/static/src/core/web/messaging_menu_patch.xml create mode 100644 odex30_base/whatsapp/static/src/discuss/core/common/@types/models.d.ts create mode 100644 odex30_base/whatsapp/static/src/discuss/core/common/channel_member_list_patch.xml create mode 100644 odex30_base/whatsapp/static/src/discuss/core/common/thread_model_patch.js create mode 100644 odex30_base/whatsapp/static/src/scss/whatsapp_preview.dark.scss create mode 100644 odex30_base/whatsapp/static/src/scss/whatsapp_preview.scss create mode 100644 odex30_base/whatsapp/static/src/views/whatsapp_channel_list/whatsapp_channel_list_view.js create mode 100644 odex30_base/whatsapp/static/src/views/whatsapp_channel_list/whatsapp_channel_list_view_controller.js create mode 100644 odex30_base/whatsapp/static/tests/chat_window_patch.test.js create mode 100644 odex30_base/whatsapp/static/tests/chatter_patch.test.js create mode 100644 odex30_base/whatsapp/static/tests/composer_patch.test.js create mode 100644 odex30_base/whatsapp/static/tests/discuss_patch.test.js create mode 100644 odex30_base/whatsapp/static/tests/discuss_sidebar_patch.test.js create mode 100644 odex30_base/whatsapp/static/tests/message_patch.test.js create mode 100644 odex30_base/whatsapp/static/tests/messaging_menu_patch.test.js create mode 100644 odex30_base/whatsapp/static/tests/mock_server/mock_models/@types/mock_models.d.ts create mode 100644 odex30_base/whatsapp/static/tests/mock_server/mock_models/discuss_channel.js create mode 100644 odex30_base/whatsapp/static/tests/mock_server/mock_models/mail_message.js create mode 100644 odex30_base/whatsapp/static/tests/mock_server/mock_models/mail_thread.js create mode 100644 odex30_base/whatsapp/static/tests/mock_server/mock_models/res_users_settings.js create mode 100644 odex30_base/whatsapp/static/tests/mock_server/mock_models/whatsapp_composer.js create mode 100644 odex30_base/whatsapp/static/tests/mock_server/mock_models/whatsapp_message.js create mode 100644 odex30_base/whatsapp/static/tests/mock_server/mock_models/whatsapp_template.js create mode 100644 odex30_base/whatsapp/static/tests/whatsapp_test_helpers.js create mode 100644 odex30_base/whatsapp/static/video/test.mp4 create mode 100644 odex30_base/whatsapp/tests/__init__.py create mode 100644 odex30_base/whatsapp/tests/common.py create mode 100644 odex30_base/whatsapp/tests/template_data.py create mode 100644 odex30_base/whatsapp/tests/test_discuss_channel.py create mode 100644 odex30_base/whatsapp/tests/test_phone_format.py create mode 100644 odex30_base/whatsapp/tests/test_security.py create mode 100644 odex30_base/whatsapp/tests/test_whatsapp_composer.py create mode 100644 odex30_base/whatsapp/tests/test_whatsapp_message.py create mode 100644 odex30_base/whatsapp/tests/test_whatsapp_template.py create mode 100644 odex30_base/whatsapp/tools/__init__.py create mode 100644 odex30_base/whatsapp/tools/bounced_codes.py create mode 100644 odex30_base/whatsapp/tools/lang_list.py create mode 100644 odex30_base/whatsapp/tools/phone_validation.py create mode 100644 odex30_base/whatsapp/tools/retryable_codes.py create mode 100644 odex30_base/whatsapp/tools/whatsapp_api.py create mode 100644 odex30_base/whatsapp/tools/whatsapp_exception.py create mode 100644 odex30_base/whatsapp/views/discuss_channel_views.xml create mode 100644 odex30_base/whatsapp/views/ir_actions_server_views.xml create mode 100644 odex30_base/whatsapp/views/res_config_settings_views.xml create mode 100644 odex30_base/whatsapp/views/res_partner_views.xml create mode 100644 odex30_base/whatsapp/views/whatsapp_account_views.xml create mode 100644 odex30_base/whatsapp/views/whatsapp_menus.xml create mode 100644 odex30_base/whatsapp/views/whatsapp_message_views.xml create mode 100644 odex30_base/whatsapp/views/whatsapp_template_button_views.xml create mode 100644 odex30_base/whatsapp/views/whatsapp_template_variable_views.xml create mode 100644 odex30_base/whatsapp/views/whatsapp_template_views.xml create mode 100644 odex30_base/whatsapp/wizard/__init__.py create mode 100644 odex30_base/whatsapp/wizard/whatsapp_composer.py create mode 100644 odex30_base/whatsapp/wizard/whatsapp_composer_views.xml create mode 100644 odex30_base/whatsapp/wizard/whatsapp_preview.py create mode 100644 odex30_base/whatsapp/wizard/whatsapp_preview_views.xml diff --git a/odex30_base/odex30_web/__init__.py b/odex30_base/odex30_web/__init__.py new file mode 100644 index 0000000..d12004f --- /dev/null +++ b/odex30_base/odex30_web/__init__.py @@ -0,0 +1,3 @@ + +from . import models +from . import version diff --git a/odex30_base/odex30_web/__manifest__.py b/odex30_base/odex30_web/__manifest__.py new file mode 100644 index 0000000..326884b --- /dev/null +++ b/odex30_base/odex30_web/__manifest__.py @@ -0,0 +1,85 @@ + +{ + 'name': 'Odex30 Web', + 'category': 'Odex30-base', + 'author': 'Expert Co. Ltd.', + 'version': '1.0', + 'description': """ +Odex Web Client. +=========================== + +This module modifies the web addon to provide Odex design and responsiveness. + """, + 'depends': ['web', 'base_setup'], + 'auto_install': ['web'], + 'data': [ + 'views/webclient_templates.xml', + ], + 'assets': { + 'web._assets_primary_variables': [ + ('after', 'web/static/src/scss/primary_variables.scss', 'odex30_web/static/src/**/*.variables.scss'), + ('before', 'web/static/src/scss/primary_variables.scss', 'odex30_web/static/src/scss/primary_variables.scss'), + ], + 'web._assets_secondary_variables': [ + ('before', 'web/static/src/scss/secondary_variables.scss', 'odex30_web/static/src/scss/secondary_variables.scss'), + ], + 'web._assets_backend_helpers': [ + ('before', 'web/static/src/scss/bootstrap_overridden.scss', 'odex30_web/static/src/scss/bootstrap_overridden.scss'), + ], + 'web.assets_frontend': [ + 'odex30_web/static/src/webclient/home_menu/home_menu_background.scss', + 'odex30_web/static/src/webclient/navbar/navbar.scss', + ], + 'web.assets_backend': [ + 'odex30_web/static/src/webclient/**/*.scss', + 'odex30_web/static/src/views/**/*.scss', + + 'odex30_web/static/src/core/**/*', + 'odex30_web/static/src/webclient/**/*.js', + ('after', 'web/static/src/views/list/list_renderer.xml', 'odex30_web/static/src/views/list/list_renderer_desktop.xml'), + 'odex30_web/static/src/webclient/**/*.xml', + 'odex30_web/static/src/views/**/*.js', + 'odex30_web/static/src/views/**/*.xml', + ('remove', 'odex30_web/static/src/views/pivot/**'), + + ('remove', 'odex30_web/static/src/**/*.dark.scss'), + ], + 'web.assets_backend_lazy': [ + 'odex30_web/static/src/views/pivot/**', + ], + 'web.assets_backend_lazy_dark': [ + ('include', 'web.dark_mode_variables'), + ('before', 'odex30_web/static/src/scss/bootstrap_overridden.scss', 'odex30_web/static/src/scss/bootstrap_overridden.dark.scss'), + ('after', 'web/static/lib/bootstrap/scss/_functions.scss', 'odex30_web/static/src/scss/bs_functions_overridden.dark.scss'), + ], + 'web.assets_web': [ + ('replace', 'web/static/src/main.js', 'odex30_web/static/src/main.js'), + ], + "web.dark_mode_variables": [ + ('before', 'odex30_web/static/src/scss/primary_variables.scss', 'odex30_web/static/src/scss/primary_variables.dark.scss'), + ('before', 'odex30_web/static/src/**/*.variables.scss', 'odex30_web/static/src/**/*.variables.dark.scss'), + ('before', 'odex30_web/static/src/scss/secondary_variables.scss', 'odex30_web/static/src/scss/secondary_variables.dark.scss'), + ], + "web.assets_web_dark": [ + ('include', 'web.dark_mode_variables'), + ('before', 'odex30_web/static/src/scss/bootstrap_overridden.scss', 'odex30_web/static/src/scss/bootstrap_overridden.dark.scss'), + ('after', 'web/static/lib/bootstrap/scss/_functions.scss', 'odex30_web/static/src/scss/bs_functions_overridden.dark.scss'), + 'odex30_web/static/src/**/*.dark.scss', + ], + 'web.tests_assets': [ + 'odex30_web/static/tests/*.js', + ], + "web.assets_tests": [ + "odex30_web/static/tests/tours/**/*.js", + ], + 'web.assets_unit_tests': [ + 'odex30_web/static/tests/**/*.test.js', + ], + 'web.qunit_suite_tests': [ + 'odex30_web/static/tests/views/**/*.js', + 'odex30_web/static/tests/webclient/**/*.js', + ('remove', 'odex30_web/static/tests/**/*.test.js'), + ], + }, + 'license': 'OEEL-1', +} diff --git a/odex30_base/odex30_web/i18n/ar_001.po b/odex30_base/odex30_web/i18n/ar_001.po new file mode 100644 index 0000000..805626c --- /dev/null +++ b/odex30_base/odex30_web/i18n/ar_001.po @@ -0,0 +1,457 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * odex30_web +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 18.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-01-01 22:17+0000\n" +"PO-Revision-Date: 2026-01-01 22:17+0000\n" +"Last-Translator: \n" +"Language-Team: \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" + +#. module: odex30_web +#. odoo-javascript +#: code:addons/odex30_web/static/src/webclient/home_menu/expiration_panel.js:0 +msgid "%s days" +msgstr "%s أيام" + +#. module: odex30_web +#. odoo-javascript +#: code:addons/odex30_web/static/src/webclient/settings_form_view/res_config_edition.xml:0 +msgid "(Enterprise Edition)" +msgstr "(النسخة الشركاتية)" + +#. module: odex30_web +#. odoo-javascript +#: code:addons/odex30_web/static/src/webclient/home_menu/expiration_panel.js:0 +msgid "1 month" +msgstr "شهر واحد" + +#. module: odex30_web +#. odoo-javascript +#: code:addons/odex30_web/static/src/views/list/list_renderer_desktop.xml:0 +msgid "Add Custom Field" +msgstr "إضافة حقل مخصص" + +#. module: odex30_web +#. odoo-javascript +#: code:addons/odex30_web/static/src/views/kanban/kanban_header_patch.js:0 +msgid "Automations" +msgstr "الأتمتة" + +#. module: odex30_web +#. odoo-javascript +#: code:addons/odex30_web/static/src/webclient/promote_studio_dialog/promote_studio_dialog.xml:0 +msgid "Build new apps from scratch" +msgstr "بناء تطبيقات جديدة من الصفر" + +#. module: odex30_web +#. odoo-javascript +#: code:addons/odex30_web/static/src/webclient/promote_studio_dialog/promote_studio_dialog.xml:0 +msgid "Build new reports" +msgstr "بناء تقارير جديدة" + +#. module: odex30_web +#. odoo-javascript +#: code:addons/odex30_web/static/src/webclient/share_url/burger_menu.xml:0 +msgid "Close menu" +msgstr "إغلاق القائمة" + +#. module: odex30_web +#. odoo-javascript +#: code:addons/odex30_web/static/src/webclient/home_menu/expiration_panel.xml:0 +msgid "" +"Contact your sales representative to help you to unlink your previous " +"database" +msgstr "" +"تواصل مع مندوب المبيعات لمساعدتك في فصل قاعدة البيانات السابقة" +"" + +#. module: odex30_web +#. odoo-javascript +#: code:addons/odex30_web/static/src/webclient/promote_studio_dialog/promote_studio_dialog.xml:0 +msgid "Create automation rules" +msgstr "إنشاء قواعد الأتمتة" + +#. module: odex30_web +#. odoo-javascript +#: code:addons/odex30_web/static/src/webclient/promote_studio_dialog/promote_studio_dialog.xml:0 +msgid "Customize Reports" +msgstr "تخصيص التقارير" + +#. module: odex30_web +#. odoo-javascript +#: code:addons/odex30_web/static/src/webclient/promote_studio_dialog/promote_studio_dialog.xml:0 +msgid "Customize any screen" +msgstr "تخصيص أي شاشة" + +#. module: odex30_web +#. odoo-javascript +#: code:addons/odex30_web/static/src/webclient/color_scheme/color_scheme_menu_items.js:0 +msgid "Dark Mode" +msgstr "الوضع الداكن" + +#. module: odex30_web +#. odoo-javascript +#: code:addons/odex30_web/static/src/webclient/settings_form_view/res_config_edition.xml:0 +msgid "Database expiration:" +msgstr "انتهاء صلاحية قاعدة البيانات:" + +#. module: odex30_web +#. odoo-javascript +#: code:addons/odex30_web/static/src/webclient/promote_studio_dialog/promote_studio_dialog.xml:0 +msgid "Define webhooks" +msgstr "تعريف Webhooks" + +#. module: odex30_web +#. odoo-javascript +#: code:addons/odex30_web/static/src/webclient/promote_studio_dialog/promote_studio_dialog.xml:0 +msgid "Discard" +msgstr "إلغاء" + +#. module: odex30_web +#. odoo-javascript +#: code:addons/odex30_web/static/src/webclient/home_menu/expiration_panel.xml:0 +msgid "Dismiss" +msgstr "إغلاق" + +#. module: odex30_web +#. odoo-javascript +#: code:addons/odex30_web/static/src/webclient/home_menu/expiration_panel.xml:0 +msgid "Error reason:" +msgstr "سبب الخطأ:" + +#. module: odex30_web +#: model:ir.model,name:odex30_web.model_ir_http +msgid "HTTP Routing" +msgstr "مسار HTTP" + +#. module: odex30_web +#. odoo-javascript +#: code:addons/odex30_web/static/src/webclient/home_menu/home_menu_service.js:0 +msgid "Home" +msgstr "الرئيسية" + +#. module: odex30_web +#: model:ir.model.fields,field_description:odex30_web.field_res_users_settings__homemenu_config +msgid "Home Menu Configuration" +msgstr "إعدادات قائمة الرئيسية" + +#. module: odex30_web +#. odoo-javascript +#: code:addons/odex30_web/static/src/webclient/navbar/navbar.js:0 +msgid "Home menu" +msgstr "قائمة الرئيسية" + +#. module: odex30_web +#. odoo-javascript +#: code:addons/odex30_web/static/src/webclient/home_menu/expiration_panel.xml:0 +msgid "I paid, please recheck!" +msgstr "لقد دفعت، يرجى إعادة التحقق!" + +#. module: odex30_web +#. odoo-javascript +#: code:addons/odex30_web/static/src/webclient/promote_studio_dialog/promote_studio_dialog.xml:0 +msgid "Install Odoo Studio and its dependencies" +msgstr "تثبيت Odoo Studio وتبعياته" + +#. module: odex30_web +#. odoo-javascript +#: code:addons/odex30_web/static/src/webclient/promote_studio_dialog/promote_studio_dialog.xml:0 +msgid "Learn More" +msgstr "تعرف على المزيد" + +#. module: odex30_web +#. odoo-javascript +#: code:addons/odex30_web/static/src/webclient/home_menu/expiration_panel.xml:0 +msgid "Log in as an administrator to correct the issue." +msgstr "سجل الدخول كمدير لإصلاح المشكلة." + +#. module: odex30_web +#. odoo-javascript +#: code:addons/odex30_web/static/src/webclient/home_menu/home_menu.xml:0 +msgid "No result" +msgstr "لا توجد نتائج" + +#. module: odex30_web +#. odoo-javascript +#: code:addons/odex30_web/static/src/webclient/settings_form_view/res_config_edition.xml:0 +msgid "Odoo" +msgstr "أودو" + +#. module: odex30_web +#. odoo-javascript +#: code:addons/odex30_web/static/src/webclient/settings_form_view/res_config_edition.xml:0 +msgid "Odoo Enterprise Edition License V1.0" +msgstr "رخصة Odoo Enterprise Edition V1.0" + +#. module: odex30_web +#. odoo-javascript +#: code:addons/odex30_web/static/src/views/list/list_renderer_desktop.js:0 +msgid "Odoo Studio - Add new fields to any view" +msgstr "Odoo Studio - إضافة حقول جديدة إلى أي عرض" + +#. module: odex30_web +#. odoo-javascript +#: code:addons/odex30_web/static/src/views/kanban/kanban_header_patch.js:0 +msgid "Odoo Studio - Customize workflows in minutes" +msgstr "Odoo Studio - تخصيص سير العمل في دقائق" + +#. module: odex30_web +#. odoo-javascript +#: code:addons/odex30_web/static/src/webclient/home_menu/expiration_panel.xml:0 +msgid "Odoo Support" +msgstr "دعم أودو" + +#. module: odex30_web +#. odoo-javascript +#: code:addons/odex30_web/static/src/webclient/home_menu/expiration_panel.xml:0 +msgid "Paste code here" +msgstr "الصق الكود هنا" + +#. module: odex30_web +#. odoo-javascript +#: code:addons/odex30_web/static/src/webclient/navbar/navbar.js:0 +msgid "Previous view" +msgstr "العرض السابق" + +#. module: odex30_web +#. odoo-javascript +#: code:addons/odex30_web/static/src/webclient/home_menu/expiration_panel.js:0 +msgid "Register" +msgstr "تسجيل" + +#. module: odex30_web +#. odoo-javascript +#: code:addons/odex30_web/static/src/webclient/home_menu/expiration_panel.xml:0 +msgid "Register your subscription" +msgstr "تسجيل اشتراكك" + +#. module: odex30_web +#. odoo-javascript +#: code:addons/odex30_web/static/src/webclient/home_menu/expiration_panel.xml:0 +msgid "Renew now" +msgstr "تجديد الآن" + +#. module: odex30_web +#. odoo-javascript +#: code:addons/odex30_web/static/src/webclient/home_menu/expiration_panel.js:0 +msgid "Retry" +msgstr "إعادة المحاولة" + +#. module: odex30_web +#. odoo-javascript +#: code:addons/odex30_web/static/src/webclient/home_menu/expiration_panel.xml:0 +msgid "Send an email" +msgstr "إرسال بريد إلكتروني" + +#. module: odex30_web +#. odoo-javascript +#: code:addons/odex30_web/static/src/webclient/home_menu/expiration_panel.xml:0 +msgid "Sending the instructions by email ..." +msgstr "إرسال التعليمات بالبريد الإلكتروني..." + +#. module: odex30_web +#. odoo-javascript +#: code:addons/odex30_web/static/src/webclient/share_url/share_url.js:0 +msgid "Share" +msgstr "مشاركة" + +#. module: odex30_web +#. odoo-javascript +#: code:addons/odex30_web/static/src/webclient/share_url/burger_menu.xml:0 +msgid "Share URL" +msgstr "مشاركة الرابط" + +#. module: odex30_web +#. odoo-javascript +#: code:addons/odex30_web/static/src/webclient/home_menu/expiration_panel.xml:0 +msgid "" +"Something went wrong while registering your database. You can try again or " +"contact" +msgstr "" +"حدث خطأ أثناء تسجيل قاعدة البيانات. يمكنك المحاولة مرة أخرى أو التواصل" +" مع" + +#. module: odex30_web +#. odoo-javascript +#: code:addons/odex30_web/static/src/webclient/promote_studio_dialog/promote_studio_dialog.xml:0 +msgid "Start using Odoo Studio" +msgstr "ابدأ استخدام Odoo Studio" + +#. module: odex30_web +#. odoo-javascript +#: code:addons/odex30_web/static/src/webclient/home_menu/expiration_panel.xml:0 +msgid "Subscription Code:" +msgstr "كود الاشتراك:" + +#. module: odex30_web +#. odoo-javascript +#: code:addons/odex30_web/static/src/webclient/home_menu/home_menu.xml:0 +msgid "TIP" +msgstr "نصيحة" + +#. module: odex30_web +#. odoo-javascript +#: code:addons/odex30_web/static/src/webclient/home_menu/expiration_panel.xml:0 +msgid "" +"Thank you, your registration was successful! Your database is valid until" +msgstr "" +"شكراً، تم تسجيلك بنجاح! قاعدة بياناتك صالحة حتى" + +#. module: odex30_web +#. odoo-javascript +#: code:addons/odex30_web/static/src/webclient/home_menu/enterprise_subscription_service.js:0 +msgid "" +"Thank you, your registration was successful! Your database is valid until " +"%s." +msgstr "" +"شكراً، تم تسجيلك بنجاح! قاعدة بياناتك صالحة حتى %s." + +#. module: odex30_web +#. odoo-javascript +#: code:addons/odex30_web/static/src/webclient/home_menu/expiration_panel.xml:0 +msgid "" +"The instructions to unlink your subscription from the previous database(s) " +"have been sent" +msgstr "" +"تم إرسال التعليمات لفصل اشتراكك من قواعد البيانات السابقة" + +#. module: odex30_web +#. odoo-javascript +#: code:addons/odex30_web/static/src/webclient/home_menu/expiration_panel.js:0 +msgid "This database has expired. " +msgstr "انتهت صلاحية هذه قاعدة البيانات. " + +#. module: odex30_web +#. odoo-javascript +#: code:addons/odex30_web/static/src/webclient/home_menu/expiration_panel.js:0 +msgid "This database will expire in %s. " +msgstr "ستنتهي صلاحية قاعدة البيانات هذه في %s. " + +#. module: odex30_web +#. odoo-javascript +#: code:addons/odex30_web/static/src/webclient/home_menu/expiration_panel.js:0 +msgid "This demo database will expire in %s. " +msgstr "ستنتهي صلاحية قاعدة بيانات العرض التجريبي في %s. " + +#. module: odex30_web +#. odoo-javascript +#: code:addons/odex30_web/static/src/webclient/home_menu/expiration_panel.xml:0 +msgid "Unable to send the instructions by email, please contact the" +msgstr "تعذر إرسال التعليمات بالبريد الإلكتروني، يرجى التواصل مع" + +#. module: odex30_web +#. odoo-javascript +#: code:addons/odex30_web/static/src/webclient/promote_studio_dialog/promote_studio_dialog.xml:0 +msgid "Unleash the power of Odoo Studio:" +msgstr "استخدم قوة Odoo Studio:" + +#. module: odex30_web +#. odoo-javascript +#: code:addons/odex30_web/static/src/webclient/home_menu/expiration_panel.xml:0 +msgid "Upgrade your subscription" +msgstr "ترقية اشتراكك" + +#. module: odex30_web +#: model:ir.model,name:odex30_web.model_res_users_settings +msgid "User Settings" +msgstr "إعدادات المستخدم" + +#. module: odex30_web +#. odoo-javascript +#: code:addons/odex30_web/static/src/webclient/promote_studio_dialog/promote_studio_dialog.xml:0 +msgid "Want to tailor-make your Odoo?" +msgstr "هل تريد تخصيص أودو حسب احتياجاتك؟" + +#. module: odex30_web +#. odoo-javascript +#: code:addons/odex30_web/static/src/webclient/home_menu/expiration_panel.xml:0 +msgid "" +"You have more users or more apps installed than your subscription allows." +msgstr "" +"لديك مستخدمون أو تطبيقات مثبتة أكثر مما يسمح به اشتراكك." + +#. module: odex30_web +#. odoo-javascript +#: code:addons/odex30_web/static/src/webclient/home_menu/expiration_panel.xml:0 +msgid "" +"You will be able to register your database once you have installed your " +"first app." +msgstr "" +"يمكنك تسجيل قاعدة البيانات بعد تثبيت أول تطبيق." + +#. module: odex30_web +#. odoo-javascript +#: code:addons/odex30_web/static/src/webclient/home_menu/expiration_panel.xml:0 +msgid "Your subscription code" +msgstr "كود اشتراكك" + +#. module: odex30_web +#. odoo-javascript +#: code:addons/odex30_web/static/src/webclient/home_menu/expiration_panel.js:0 +msgid "" +"Your subscription expired %s days ago. This database will be blocked soon. " +msgstr "" +"انتهى اشتراكك منذ %s أيام. سيتم حظر قاعدة البيانات قريباً. " + +#. module: odex30_web +#. odoo-javascript +#: code:addons/odex30_web/static/src/webclient/home_menu/expiration_panel.js:0 +msgid "Your subscription expires in %s days. " +msgstr "ينتهي اشتراكك بعد %s أيام. " + +#. module: odex30_web +#. odoo-javascript +#: code:addons/odex30_web/static/src/webclient/home_menu/expiration_panel.xml:0 +msgid "Your subscription is already linked to a database." +msgstr "اشتراكك مرتبط بقاعدة بيانات بالفعل." + +#. module: odex30_web +#. odoo-javascript +#: code:addons/odex30_web/static/src/webclient/home_menu/expiration_panel.xml:0 +msgid "Your subscription was updated and is valid until" +msgstr "تم تحديث اشتراكك وهو صالح حتى" + +#. module: odex30_web +#. odoo-javascript +#: code:addons/odex30_web/static/src/webclient/promote_studio_dialog/promote_studio_dialog.xml:0 +msgid "and more!" +msgstr "وأكثر!" + +#. module: odex30_web +#. odoo-javascript +#: code:addons/odex30_web/static/src/webclient/home_menu/expiration_panel.xml:0 +msgid "buy a subscription" +msgstr "شراء اشتراك" + +#. module: odex30_web +#. odoo-javascript +#: code:addons/odex30_web/static/src/webclient/home_menu/expiration_panel.xml:0 +msgid "buy a subscription." +msgstr "شراء اشتراك." + +#. module: odex30_web +#. odoo-javascript +#: code:addons/odex30_web/static/src/webclient/home_menu/expiration_panel.xml:0 +msgid "or" +msgstr "أو" + +#. module: odex30_web +#. odoo-javascript +#: code:addons/odex30_web/static/src/webclient/home_menu/expiration_panel.xml:0 +msgid "to the subscription owner to confirm the change, enter a new code or" +msgstr "" +"لصاحب الاشتراك لتأكيد التغيير، أدخل كود جديد أو" + +#. module: odex30_web +#. odoo-javascript +#: code:addons/odex30_web/static/src/webclient/home_menu/home_menu.xml:0 +msgid "— open me anywhere with" +msgstr "" diff --git a/odex30_base/odex30_web/models/__init__.py b/odex30_base/odex30_web/models/__init__.py new file mode 100644 index 0000000..62b8cb6 --- /dev/null +++ b/odex30_base/odex30_web/models/__init__.py @@ -0,0 +1,3 @@ + +from . import ir_http +from . import res_users_settings diff --git a/odex30_base/odex30_web/models/ir_http.py b/odex30_base/odex30_web/models/ir_http.py new file mode 100644 index 0000000..c85021e --- /dev/null +++ b/odex30_base/odex30_web/models/ir_http.py @@ -0,0 +1,37 @@ + +import json + +from odoo import models +from odoo.http import request + + +class Http(models.AbstractModel): + _inherit = 'ir.http' + + @classmethod + def _post_logout(cls): + super()._post_logout() + request.future_response.set_cookie('color_scheme', max_age=0) + + def webclient_rendering_context(self): + return { + 'session_info': self.session_info(), + } + + def session_info(self): + ICP = self.env['ir.config_parameter'].sudo() + + if self.env.user.has_group('base.group_system'): + warn_enterprise = 'admin' + elif self.env.user._is_internal(): + warn_enterprise = 'user' + else: + warn_enterprise = False + + result = super(Http, self).session_info() + result['support_url'] = "https://www.odoo.com/help" + if warn_enterprise: + result['warning'] = warn_enterprise + result['expiration_date'] = ICP.get_param('database.expiration_date') + result['expiration_reason'] = ICP.get_param('database.expiration_reason') + return result diff --git a/odex30_base/odex30_web/models/res_users_settings.py b/odex30_base/odex30_web/models/res_users_settings.py new file mode 100644 index 0000000..f0ebb5f --- /dev/null +++ b/odex30_base/odex30_web/models/res_users_settings.py @@ -0,0 +1,8 @@ + +from odoo import fields, models + + +class ResUsersSettings(models.Model): + _inherit = 'res.users.settings' + + homemenu_config = fields.Json(string="Home Menu Configuration", readonly=True) diff --git a/odex30_base/odex30_web/static/img/automation.svg b/odex30_base/odex30_web/static/img/automation.svg new file mode 100755 index 0000000..dd920d1 --- /dev/null +++ b/odex30_base/odex30_web/static/img/automation.svg @@ -0,0 +1,25 @@ + + + ++ + +When... + +Then... + +Task moved to "In Progress" + +Send email to customer + +Add Anita Oliver as follower + ++ + +Create activity "Follow Up" + + + diff --git a/odex30_base/odex30_web/static/img/background-dark.jpg b/odex30_base/odex30_web/static/img/background-dark.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ce69f953226e9715ab5baf3a46a753bd777f01c8 GIT binary patch literal 8745 zcmbta4U`*Kb-pt@lZ-}LXI7SmHV`tqSp`Lm5(sOWLMbD$8*Ir5v#JbQn>4bU4Yun9 z5}%V0AY^vDE}Io@7gsBS19YrdMKUebZj61*0jf1|V{dSq*e+)in>PHMw1K9lkkV61 ziu>KCUEBG=$vM62%=>@$-Fv@#@0(H1ES!0UjO-1oZXih_lJG}oPSH4NppX{Q^-%Y+ zOO|yn?=g&?bE3UnE#o$eu-_P81%bGQ}+;itW zU;N^e(*JjZGl!^0Q?9?*>yr9N?vc8Bq%)7w+i*-lbe1Gp=~6F#c`sy+qL>;gwF)ReVO7nI_Bx`@ z4@n*|lEwI>S2gS^D%J5;B^=*55yU5}G*gPSiHt#=LW3C80#b@f+`|Ee6;CoDn>=hf z*d=sBAx%S{IXU}ZFPyB)^W~&%9$J@}t*h$izpL&qNTa46@yK+k@6Z&ccSv4H%m%?y zi+0Z070odvqo-6%s=2s-@}N5&RZLa3BXy6+vMNx7U1;SXQI2FjnrzEX-&_KtRJQQY zT9Xs>`(OI}fiKq+L;k|7Ke79oNAhE%SJ`XT=>!G4O}#?8A7CnztmC2U)%l8O;-N&I zb-`qq`e)WF^_`DrjQwi*)>+pm)Kp20V1`vCDJ-cuDq?-2tTa4yX00i$mbFmpJAwyJ ze5C8Sh3Efee|}sZ+i)yC8Ce+UxyBqBs&uV#^-3d=UE(O~e%(@1ejNv?$n{y2f+RT? zmu;({w8jfDeJs

KQD=Wi{={q5K3m_QruP)dQ=;SdgQMnkayfHV{IZ1>4#*`Dc6H zeecu92Bs+pCsGfjD*FpxzI(-%+97vc$eH!*XdGAtDKU~`VYg_Q^96Ltb6a95C``~q ze5a?t{4^0S$0x(4k~Hgnq#Zb|1jT*WHN-GcC|R^56KepDA&;msw3Dc(RB-^0K|lq# zxv&3QpL*uz+oqFtP@J6x&R2i#t+`~OnJ=rYN-QDI_ASZ64sTfsW6*pGm92RO-2M@Y0 zeC;jQhp$fO>+<2sWw|RaoA;ksm$c*Z1CE*{Rh#u=s@Lllc?*zwu%3k~!fI9;9z9r3 zyG2dQlIBgy#ke1~YAL0v-Au_QeZW24P*+-US(*NWcK9XGV);$hbbyU91LX1 zqM>nshlbb{F23(izd0~%hD-Yka@ow+t~33**&QDpHN&G0H66r`$ebf#CP~09Q6sf& zmCGRoa0$>Knd@;3VkW?{d-NMw+nlG_dMIDMXsSYXRF0`>aK=j7o=&@{ zn$Paah#quW69IY0Car2B;TL;1+I3NQfAkxHjl zB;iLqV)d42&>oW1F=tS5_l4|2oa>}Tqnaf}$t8bKYe5TbWyXQKwrK(_p$y6?T=j{T z{q*wdhjZ$|X8Mjzf4O<&Q}fdw%r9j1N^@xZID%Pn`Rd~yWMX#9-P4e{MSePZ=fNnKRih>Bq~ z)0ielNvR0-V@_|r9VG~V8755j%^~1|`aZjNb;CnB5le8efZ2`nJ zlO|1XOlc&vvKw#&zWu~Ku( zZAUk|dO48{Z{6$%$CrO-pmAe7H00OiHue#e2^vBT&?jo$*R8M`=vOMF?TgCFY$2+} zRPfkPwIzoaIOI;Co$z)Z4f90Ky?_msd9d#&g9YQcWqZEywU(e-K z_{sFu`Fh$>)2xd^0GG(}NQ@t~1S=-XEA)hoqZ>A=7N#3|nH z9LcqL-vdl^zm|*=;z@3^?zac4bB?SUDzTSzbfA#91>vgEca+^hMo8nl-^Wfv%B({k zPMEv&&U;T@mK)8!V{0t@)rUs2cI=|5>Rf(7O(UZhqOnlg-K1vLeQr+-xi0Nk1cep? z8Cxwd-#%DFq&CVf#OEUiVl*^3ESW-ehOr7gLtbbD;`tzD1Xh(uCy;+K{9W8} z2BYx*M^-Wp@^w?U-m+Xpl9fv?QClzW1FNgy7rE9h>q` ziP75`)5D*jtfGd>L(~ z(V0ckfZ%mr-l3i?usxVtD)5%hw-MVHN63;g7S|{HYY_+F6jx$7vGXhxIImplws}rr z#C0VX(ZDQ3%^z2%brTtz)Jhm`9vpb*ygybtUXX+476PU! zbTyKO0==Fi$qCX<@7{41RPEi&14{-+e6rA13XEK4hG37X#O8O*WV=OY`pMQ>0B5jXNxBC(fZU&SZ&uI@~ES zwA~qToHg54pL`PcGYw5EtWk5u#&6He;LKmOg0-lRT_5dgmptDkt+OsSC| zNIJa;ZWM@#lZ^G+TEF(Rzk4tHKKA0S`o8m2j%`4itu!~Zxz>NOw;!w@uyIJG72&Ro z)48-M$-YTu+EZ!_967Zjbu1b2aHb^gVBx#)ay3&57;{jIifGHkx?W-y)vIHU=so*D zKB+NiR^W%hmmPp$_fl^V%{^jABsTXE-&y#qc&9)h%Rnr*9(*B;-R z6;5sH{H906>=<%`KD}~t?P+W!NUc4wR9!4BTq-@(WxKy=A=7nU@f3^A;5)dww#40# z(H*dFkTuNO0zhsnW_>9o8bp_+oS#oem(+&8;}bcvvpL0Cj4q6kK#gL zV`zKR(biI3)*s#dXtYuNx+pmKU6_er70KK5(S{8MhHf(3bp&_YVZQ<33W5>c0N zgq4R|?nbqOe%@rVkude~##(UOw))Sv?083Z+Eh8>Fu@>u{X;+5y}7&Bj=};sk-s~s zduBbkR>e59l+Y65jfuz*OK|H^`W<+7oB89*0%jqiI_S#0%|ZiO)vMJdtTZ>WM&RJVe%+spO0tJ0UV!iv;DSo-y79V!ZL7;A=H1MC(eh@O)^K1GUzqksaB9vx z&D(K~my_T22U+!U&lWr++v`AFg2wxfbjf16>bG%ON+!KU#S1@z?Cf)@2Sa1?Mluov zlv0aB>|?YSN&)|-iw$(W5;?VX2^fn9kSG&G95f6IbG%;Ea{X)v4*}&87FiHdR?XwB zI!#2BhN!`oK_lg%{j}iZPeL!aEs6*O7X#eZZRRj{mLw^pB+-({a0$W7g1TFrF3BQ8 zTa;AHmQU}n!1UZ|$e9Q*1i67Cd{HeV@Rp5a$=jPqG?OO3=nF@;#S z?6eWwN_f>-k|>5c38GH9@ezMQZHG*++s^-x;(JsvhY0h_JmqLD(EG)k;# z#-L3K*9;3k5!iATc=|e$@8R^>Sj%FpJKYR2~I(SYq7w62!p|DiDDa zCEvLmz^X02CPf$Hfu@u(i9a{M85uzU3j(0bOJ7OiiwAUtTf7)#s6uQGRw5~Uv+ zjI=Q{!NZyM5s%B?L``T$xEL#{&Prq~KwP0if*TH&k!V{fjAb60X@IzR}px5A&#H(A) z>%dtK5Mgiw6lPfzNZ>#egM3WsTDzMP%d~S)fbn3!?g>MGzyq6>|NxfPX?F_RSHHdN!dBKn%^*5 zQ)v4E;@=Y1$dke%Xq=n)>NQix_8sLxzKxg!G%nqth1NQcwN;PZ6ofd-MUFf!42UNx z+_(^_`0*o97iYjq2<(UtK>dfxu{R(`X2#u}4{Bi{r0RNTpx|Qt+>H9C?I9 ztUMiR!kv_1zyj5^1PsHv6O6=r78bx#8HHEA9x5gXtT?<1!W)stmBlX{{MIjc;oFZG zUjj6sfXE|sxY++%g8U61`@e=O zy7XT9`3G*gZo`is`Di>mW}kW?n);ElSU;Ni!GouczR!DLkmBmTMz##@jLP-{`JMjK6LlPzbvnMzWa)AE_?RhFMa>kH}u^7>7Tvl zhW0P+IWYL??|*6L$?o>^e?NY|{|~oEKk{(xZ=ZSSzdv*TTP}T3mww^=I($Dg5bar# zd`UrVA+an$;`=YgjLUmS?&5!EN$R1}$J{9|Xo;y^JoUMW+kbRz^bh`R{A*vmtB^jr b<6AdJhd+L#_FQQw_Ti(kH+J literal 0 HcmV?d00001 diff --git a/odex30_base/odex30_web/static/img/background-light.svg b/odex30_base/odex30_web/static/img/background-light.svg new file mode 100644 index 0000000..aa437a1 --- /dev/null +++ b/odex30_base/odex30_web/static/img/background-light.svg @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/odex30_base/odex30_web/static/src/@types/main.d.ts b/odex30_base/odex30_web/static/src/@types/main.d.ts new file mode 100644 index 0000000..851df00 --- /dev/null +++ b/odex30_base/odex30_web/static/src/@types/main.d.ts @@ -0,0 +1,3 @@ +declare module "@odoo/owl" { + export * from "@odoo/owl/dist/types/owl" +} diff --git a/odex30_base/odex30_web/static/src/core/colorlist/colorlist.dark.scss b/odex30_base/odex30_web/static/src/core/colorlist/colorlist.dark.scss new file mode 100644 index 0000000..b68b1de --- /dev/null +++ b/odex30_base/odex30_web/static/src/core/colorlist/colorlist.dark.scss @@ -0,0 +1,8 @@ +// Overrides the existing classes to fit the text-color of +// tag_list.dark.scss +@for $size from 2 through length($o-colors) { + .o_colorlist_item_color_#{$size - 1} { + --background-color: #{adjust-color(nth($o-colors, $size), $lightness: -5%, $saturation: -15%)}; + --color: #{mix(nth($o-colors, $size), $o-view-background-color, 15%)}; + } +} diff --git a/odex30_base/odex30_web/static/src/core/dropdown/dropdown.dark.scss b/odex30_base/odex30_web/static/src/core/dropdown/dropdown.dark.scss new file mode 100644 index 0000000..1fc2854 --- /dev/null +++ b/odex30_base/odex30_web/static/src/core/dropdown/dropdown.dark.scss @@ -0,0 +1,8 @@ +// = Dropdowns +// ============================================================================ +// No CSS hacks, variables overrides only + +.o-dropdown { + --border-color: #{$dropdown-border-color}; + --o-input-border-color: #{$dropdown-border-color}; +} diff --git a/odex30_base/odex30_web/static/src/core/notebook/notebook.scss b/odex30_base/odex30_web/static/src/core/notebook/notebook.scss new file mode 100644 index 0000000..52ef717 --- /dev/null +++ b/odex30_base/odex30_web/static/src/core/notebook/notebook.scss @@ -0,0 +1,11 @@ + +.o_notebook { + --notebook-link-border-color: #{$border-color}; + --notebook-link-border-color-hover: #{$border-color}; + --notebook-link-border-color-active-accent: #{$o-brand-odoo}; + + .modal & { + --notebook-padding-x: #{$modal-inner-padding}; + --notebook-margin-x: -#{$modal-inner-padding}; + } +} diff --git a/odex30_base/odex30_web/static/src/core/popover/popover.dark.scss b/odex30_base/odex30_web/static/src/core/popover/popover.dark.scss new file mode 100644 index 0000000..ff451ee --- /dev/null +++ b/odex30_base/odex30_web/static/src/core/popover/popover.dark.scss @@ -0,0 +1,15 @@ +// = Popovers +// ============================================================================ +// No CSS hacks, variables overrides only + +.o_popover { + --border-color: #{$popover-border-color}; + + .table { + --table-bg: #{$popover-bg}; + } + + .o_input { + --o-input-border-color: #{$popover-border-color}; + } +} diff --git a/odex30_base/odex30_web/static/src/core/search/search_panel/search_panel.dark.scss b/odex30_base/odex30_web/static/src/core/search/search_panel/search_panel.dark.scss new file mode 100644 index 0000000..5bf10d1 --- /dev/null +++ b/odex30_base/odex30_web/static/src/core/search/search_panel/search_panel.dark.scss @@ -0,0 +1,9 @@ +// = Search Panel +// ============================================================================ +// No CSS hacks, variables overrides only + +.o_search_panel_section { + .o_popover > & .list-group { + --#{$prefix}list-group-active-bg: #{$o-gray-400}; + } +} diff --git a/odex30_base/odex30_web/static/src/core/tags_list/tags_list.dark.scss b/odex30_base/odex30_web/static/src/core/tags_list/tags_list.dark.scss new file mode 100644 index 0000000..c7484dd --- /dev/null +++ b/odex30_base/odex30_web/static/src/core/tags_list/tags_list.dark.scss @@ -0,0 +1,13 @@ +.o_tag { + @for $size from 1 through length($o-colors) { + &.o_tag_color_#{$size - 1} { + --background-color: #{mix(nth($o-colors, $size), $o-view-background-color, 15%)}; + --color: #{adjust-color(nth($o-colors, $size), $lightness: 5%, $saturation: -15%)}; + + &::after { + --background-color: var(--background-color); + --color: var(--color); + } + } + } +} diff --git a/odex30_base/odex30_web/static/src/main.js b/odex30_base/odex30_web/static/src/main.js new file mode 100644 index 0000000..62f29c8 --- /dev/null +++ b/odex30_base/odex30_web/static/src/main.js @@ -0,0 +1,11 @@ +/** @odoo-module **/ + +import { startWebClient } from "@web/start"; +import { WebClientOdex } from "./webclient/webclient"; + +/** + * This file starts the webclient. In the manifest, it replaces + * the community main.js to load a different webclient class + * (WebClientOdex instead of WebClient) + */ +startWebClient(WebClientOdex); diff --git a/odex30_base/odex30_web/static/src/scss/bootstrap_overridden.dark.scss b/odex30_base/odex30_web/static/src/scss/bootstrap_overridden.dark.scss new file mode 100644 index 0000000..6447ad6 --- /dev/null +++ b/odex30_base/odex30_web/static/src/scss/bootstrap_overridden.dark.scss @@ -0,0 +1,181 @@ +/// +/// This file is a copy of the bootstrap _variables.scss file where all the +/// left-untouched variables definition have been removed. +/// + + +// == Color system +$danger: $o-danger !default; + +$min-contrast-ratio: 4.5 !default; + +$info-text-emphasis: shift-color($o-info, 90%) !default; +$info-bg-subtle: shift-color($o-info, -65%) !default; +$info-border-subtle: shift-color($o-info, 0%) !default; + +// == Characters which are escaped by the escape-svg function + + +// == Options + + +// == Prefix for :root CSS variables + + +// == Gradient + + +// == Spacing + + +// == Position + + +// == Body + +// == Links + +$link-shade-percentage: 15% !default; +$link-hover-color: shift-color($o-action, 30%) !default; + +// == Paragraphs + + +// == Grid breakpoints + + +// == Grid containers + + +// == Grid columns + + +// == Components +$box-shadow: 0 .5rem 1rem rgba($o-white, .3) !default; +$box-shadow-sm: 0 .125rem .25rem rgba($o-white, .15) !default; +$box-shadow-lg: 0 1rem 3rem rgba($o-white, .3) !default; +$box-shadow-inset: inset 0 1px 2px rgba($o-white, .15) !default; + +$component-active-bg: $o-gray-300 !default; + + +// == Typography +$mark-bg: #ffdebc !default; +$mark-color: shift-color($mark-bg, -75%) !default; + +// == Tables +$table-bg: $o-view-background-color !default; +$table-border-color: $o-gray-300 !default; +$table-group-separator-color: $o-gray-300 !default; +$table-bg-scale: -70% !default; +$table-striped-bg-factor: .02 !default; +$table-hover-bg-factor: .1 !default; +$table-active-bg-factor: .1 !default; + +// == Buttons + Forms + + +// == Buttons + + +// == Forms +$input-border-color: $o-gray-300 !default; +$input-placeholder-color: mix($o-gray-500, $o-gray-600) !default; +$input-focus-bg: inherit !default; +$form-range-thumb-active-bg: lighten($o-brand-primary, 10%); +$form-range-track-bg: $o-gray-300 !default; + +$form-switch-color: rgba($o-black, .5) !default; +$form-switch-focus-color: $o-black !default; +$form-switch-checked-color: $o-view-background-color !default; + +// == Form validation + + +// == Z-index master list + + +// == Navs + + +// == Navbar + + +// == Dropdowns +$dropdown-bg: $o-gray-300 !default; +$dropdown-border-color: $o-gray-400 !default; +$dropdown-header-color: $o-gray-700 !default; + + +// == Pagination + + +// == Placeholders + + +// == Cards +$card-cap-bg: $o-view-background-color !default; + +// == Accordion + + +// == Tooltips +$tooltip-color: $o-gray-800 !default; +$tooltip-bg: $o-gray-300 !default; + + +// == Form tooltips must come after regular tooltips + + +// == Popovers +$popover-bg: $o-gray-300 !default; +$popover-border-color: $o-gray-400 !default; + +// == Toasts + + +// == Badges + + +// == Modals + + +// == Alerts +$alert-bg-scale: -65% !default; +$alert-border-scale: 0% !default; +$alert-color-scale: 90% !default; + +// == Progress bars + + +// == List group +$list-group-bg: $o-view-background-color !default; + + +// == Image thumbnails + + +// == Figures + + +// == Breadcrumbs + + +// == Carousel + + +// == Spinners + + +// == Close + + +// == Offcanvas + + +// == Code + +// == Keyboard Input +$kbd-color: $o-gray-200 !default; +$kbd-bg: $o-gray-900 !default; +$kbd-box-shadow: 0px 1px 1px rgba($o-white, 0.2), inset 0px -1px 1px 1px rgba($o-gray-800, 0.8), inset 0px 2px 0px 0px rgba($o-black, 0.8) !default; diff --git a/odex30_base/odex30_web/static/src/scss/bootstrap_overridden.scss b/odex30_base/odex30_web/static/src/scss/bootstrap_overridden.scss new file mode 100644 index 0000000..0fd68b2 --- /dev/null +++ b/odex30_base/odex30_web/static/src/scss/bootstrap_overridden.scss @@ -0,0 +1,136 @@ +/// +/// This file is a copy of the bootstrap _variables.scss file where all the +/// left-untouched variables definition have been removed. +/// + +// +// Color system +// + +$light: $o-white !default; +$dark: $o-gray-900 !default; +$warning: #e99d00 !default; +$danger: #d44c59 !default; + + +// Options + +// Enable predefined decorative box-shadow styles on various components. +// Does not affect box-shadows used for focus states. + +$enable-shadows: true !default; + +// Components +// +// Define common padding and border radius sizes and more. + +$component-active-color: unset !default; +$component-active-bg: mix($o-enterprise-action-color, $o-white, 10%) !default; + +$nav-tabs-border-radius: 0 !default; +$nav-pills-border-radius: 0 !default; +$card-border-radius: 0 !default; +$accordion-border-radius: 0 !default; +$toast-border-radius: 0 !default; +$badge-border-radius: 0 !default; +$progress-border-radius: 0 !default; +$list-group-border-radius: 0 !default; +$thumbnail-border-radius: 0 !default; +$form-check-input-border-radius: 0 !default; + +// Typography +// +// Font, line-height, and color for body text, headings, and more. + +$h1-font-size: $o-font-size-base * 2.4 !default; +$h2-font-size: $o-font-size-base * 1.5 !default; +$h3-font-size: $o-font-size-base * 1.3 !default; +$h4-font-size: $o-font-size-base * 1.2 !default; +$h5-font-size: $o-font-size-base * 1.1 !default; + +// Buttons +// +// For each of Bootstrap's buttons, define text, background, and border color. + +$btn-transition: none !default; + +$btn-box-shadow: 0 !default; +$btn-active-box-shadow: 0 !default; +$btn-focus-box-shadow: 0 !default; + +// Dropdowns +// +// Dropdown menu container and contents. + +$dropdown-box-shadow: 0 .3rem 1rem rgba(#000, .1) !default; + +// Forms +// + +$input-border-color: $o-gray-200 !default; +$input-box-shadow: 0 !default; + +$input-focus-bg: $o-white !default; +$input-focus-box-shadow: 0 !default; +$input-focus-border-color: mix($o-enterprise-action-color, $o-gray-200) !default; + +$form-check-input-checked-color: $o-white !default; +$form-check-input-checked-border-color: $o-enterprise-action-color !default; +$form-check-input-checked-bg-color: $o-enterprise-action-color !default; + +$form-select-focus-box-shadow: 0 !default; + +$form-range-track-box-shadow: 0 !default; + +// Z-index master list +// +// Change the z-index of the modal-backdrop elements to be equal to the +// modal elements' ones. Bootstrap does not support multi-modals, and without +// this rule all the modal-backdrops are below all the opened modals. +// Indeed, bootstrap forces them to a lower z-index as the modal-backdrop +// element (unique in their supported cases) might be put after the modal +// element (if the modal is already in the DOM, hidden, then opened). This +// cannot happen in odoo though as modals are not hidden but removed from +// the DOM and are always put at the end of the body when opened. +// +// TODO the following code was disabled because it is saas-incompatible +// +// $zindex-modal-backdrop: $zindex-modal; + +// Navs +$nav-link-color: $o-main-text-color !default; +$nav-tabs-link-active-color: $o-main-headings-color !default; +$nav-tabs-link-active-bg: transparent !default; + + +// Badges + +$badge-border-radius: $o-border-radius !default; +$badge-font-weight: normal !default; + +// Alerts +// +// Define alert colors, border radius, and padding. + +$alert-border-width: 0 !default; + +// Progress bars + +$progress-box-shadow: 0 !default; + +// List group + +$list-group-active-color: $o-enterprise-action-color !default; +$list-group-active-bg: $component-active-bg !default; +$list-group-active-border-color: $o-enterprise-action-color !default; + + +// Image thumbnails + +$thumbnail-box-shadow: 0 !default; + + +// Breadcrumbs + +$breadcrumb-active-color: $o-main-text-color !default; +$breadcrumb-divider-color: $o-main-color-muted !default; diff --git a/odex30_base/odex30_web/static/src/scss/bs_functions_overridden.dark.scss b/odex30_base/odex30_web/static/src/scss/bs_functions_overridden.dark.scss new file mode 100644 index 0000000..9e27515 --- /dev/null +++ b/odex30_base/odex30_web/static/src/scss/bs_functions_overridden.dark.scss @@ -0,0 +1,14 @@ +/// +/// This file is a copy of the bootstrap _functions.scss file where all the +/// left-untouched function definition have been removed. +/// + +// Tint a color: mix a color with black +@function tint-color($color, $weight) { + @return mix(#000, $color, $weight); +} + +// Shade a color: mix a color with white +@function shade-color($color, $weight) { + @return mix(#FFF, $color, $weight); +} diff --git a/odex30_base/odex30_web/static/src/scss/primary_variables.dark.scss b/odex30_base/odex30_web/static/src/scss/primary_variables.dark.scss new file mode 100644 index 0000000..eb9fd55 --- /dev/null +++ b/odex30_base/odex30_web/static/src/scss/primary_variables.dark.scss @@ -0,0 +1,193 @@ +/// +/// Odoo Dark-Mode +/// +/// + +// = Colors +// ============================================================================ + +$o-white: #000 !default; +$o-black: #FFF !default; + +$o-gray-100: #1B1D26 !default; +$o-gray-200: #262A36 !default; +$o-gray-300: #3C3E4B !default; +$o-gray-400: #5A5E6B !default; +$o-gray-500: #6B707F !default; +$o-gray-600: #7E8392 !default; +$o-gray-700: #B1B3BC !default; +$o-gray-800: #D1D1D1 !default; +$o-gray-900: #E4E4E4 !default; + +$o-enterprise-color: #6b3e66 !default; +$o-brand-primary: $o-enterprise-color !default; +$o-enterprise-action-color: #02c7b5 !default; + +$o-success: #1dc959 !default; +$o-info: #6AB5FB !default; +$o-warning: #FBB56A !default; +$o-danger: #b83232 !default; +$o-action: $o-enterprise-action-color !default; +$light: $o-gray-300 !default; +$dark: $o-gray-700 !default; + + +// = Text +// ============================================================================ + +$o-main-text-color: $o-gray-800 !default; +$o-main-link-color: $o-action !default; +$o-enterprise-color: $o-brand-odoo !default; +$o-main-favorite-color: #ffd532 !default; +$o-main-code-color: #c58bc8 !default; + +// = Fine-tune contextual text colors. +$o-theme-text-colors: ( + "primary": #b972a6, + "success": #1dc959, + "info": #6AB5FB, + "warning": #FBB56A, + "danger": #ff5757, +) !default; + + +// = Webclient +// ============================================================================ +$o-webclient-color-scheme: dark !default; +$o-webclient-background-color: $o-gray-100 !default; +$o-view-background-color: $o-gray-200 !default; + +// = Inputs +$o-input-border-required: $o-black !default; + +// = Components +// ============================================================================ +$o-component-active-bg: mix($o-action, $o-gray-300, 10%) !default; +$o-form-lightsecondary: $o-gray-300 !default; + +// = List-group +$o-list-group-active-color: $o-gray-900 !default; +$o-list-group-active-bg: rgba(saturate(adjust-hue($o-info, 15), 1.8), .5) !default; + +// = Modal +$modal-backdrop-bg: $o-white !default; + +// = Buttons +$o-btns-bs-override: () !default; +$o-btns-bs-override: map-merge(( + "primary": ( + background: $o-brand-primary, + border: $o-brand-primary, + color: $o-black, + + hover-background: lighten($o-brand-primary, 5%), + hover-border: lighten($o-brand-primary, 5%), + hover-color: $o-black, + + active-background: lighten($o-brand-primary, 10%), + active-border: lighten($o-brand-primary, 10%), + active-color: $o-black, + ), + + "secondary": ( + background: $o-gray-300, + border: $o-gray-300, + color: $o-gray-900, + + hover-background: $o-gray-400, + hover-border: $o-gray-400, + hover-color: $o-gray-900, + + active-background: mix($o-action, $o-gray-100, 15%), + active-border: lighten($o-action, 10%), + active-color: $o-black, + ), + + "light": ( + background: $o-gray-200, + border: $o-gray-200, + color: $o-gray-800, + + hover-background: $o-gray-300, + hover-border: $o-gray-300, + hover-color: $o-gray-900, + + active-background: mix($o-action, $o-gray-100, 15%), + active-border: darken($o-action, 10%), + active-color: $o-black, + ), + + "danger": ( + background: $o-danger, + border: $o-danger, + color: $o-black, + + hover-background: lighten($o-danger, 5%), + hover-border: lighten($o-danger, 5%), + hover-color: $o-black, + + active-background: lighten($o-danger, 10%), + active-border: lighten($o-danger, 10%), + active-color: $o-black, + ), +), $o-btns-bs-override); + + +$o-btns-bs-outline-override: () !default; +$o-btns-bs-outline-override: map-merge(( + + "primary": ( + background: transparent, + border: map-get($o-theme-text-colors, 'primary'), + color: map-get($o-theme-text-colors, 'primary'), + + hover-background: lighten($o-brand-primary, 5%), + hover-border: lighten($o-brand-primary, 5%), + hover-color: $o-black, + + active-background: lighten($o-brand-primary, 10%), + active-border: lighten($o-brand-primary, 10%), + active-color: $o-black, + ), + "secondary": ( + background: transparent, + border: $o-gray-300, + color: $o-gray-700, + + hover-background: $o-gray-300, + hover-border: $o-gray-300, + hover-color: $o-black, + + active-background: mix($o-action, $o-gray-100, 15%), + active-border: lighten($o-action, 10%), + active-color: $o-black, + ), + + "light": ( + background: transparent, + border: $o-gray-300, + color: $o-black, + + hover-background: $o-gray-300, + hover-border: $o-gray-300, + hover-color: $o-gray-900, + + active-background: mix($o-action, $o-gray-100, 15%), + active-border: lighten($o-action, 10%), + active-color: $o-black, + ), + + "danger": ( + background: transparent, + border: $o-danger, + color: $o-danger, + + hover-background: lighten($o-danger, 5%), + hover-border: lighten($o-danger, 5%), + hover-color: $o-black, + + active-background: lighten($o-danger, 10%), + active-border: lighten($o-danger, 10%), + active-color: $o-black, + ), +), $o-btns-bs-outline-override); diff --git a/odex30_base/odex30_web/static/src/scss/primary_variables.scss b/odex30_base/odex30_web/static/src/scss/primary_variables.scss new file mode 100644 index 0000000..5e95dbf --- /dev/null +++ b/odex30_base/odex30_web/static/src/scss/primary_variables.scss @@ -0,0 +1,107 @@ +/// +/// This file regroups the variables that style odoo components. +/// They are available in every asset bundle. +/// + +// Colors +$o-white: #FFF !default; +$o-black: #000 !default; + +$o-gray-100: #F9FAFB !default; +$o-gray-200: #e7e9ed !default; +$o-gray-300: #d8dadd !default; +$o-gray-400: #9a9ca5 !default; +$o-gray-500: #7c7f89 !default; +$o-gray-600: #5f636f !default; +$o-gray-700: #374151 !default; +$o-gray-800: #1F2937 !default; +$o-gray-900: #111827 !default; + +$o-enterprise-color: #714B67 !default; +$o-enterprise-action-color: #017e84 !default; + +$o-opacity-disabled: .5 !default; +$o-opacity-muted: .76 !default; + +$o-brand-odoo: $o-enterprise-color !default; +$o-brand-primary: $o-brand-odoo !default; +$o-brand-secondary: #8f8f8f !default; +$o-brand-lightsecondary: $o-gray-100 !default; + +$o-action: $o-enterprise-action-color !default; +$o-main-text-color: $o-gray-700 !default; +$o-main-link-color: $o-enterprise-action-color !default; +$o-main-color-muted: rgba($o-main-text-color, $o-opacity-muted) !default; + +// Components +$o-component-active-color: $o-gray-900 !default; +$o-component-active-bg: mix($o-action, $o-white, 10%) !default; +$o-component-active-border: $o-action !default; + +$o-list-group-header-color: $o-gray-900 !default; +$o-list-footer-color: $o-gray-900 !default; +$o-list-footer-bg-color: transparent !default; +$o-list-footer-font-weight: 500 !default; + +$o-form-lightsecondary: $o-gray-200 !default; + +// o-inputs +$o-input-padding-y: 1px !default; +$o-input-padding-x: 0 !default; + +$o-input-border-required: $o-gray-900 !default; + +// Badges +$o-badge-min-width: 2.7ch !default !default; + +// Buttons +// Map of customized values for each button. If a button's design is defined +// here, the relative values will take priority over default BS ones. +// Notice: each map's entry is passed directly to the Bootstrap mixin, meaning +// that all states must be defined, there can't be omissions. +$o-btns-bs-override: () !default; +$o-btns-bs-override: map-merge(( + "primary": ( + background: $o-brand-primary, + border: $o-brand-primary, + color: $o-white, + + hover-background: darken($o-brand-primary, 10%), + hover-border: darken($o-brand-primary, 10%), + hover-color: $o-white, + + active-background: mix($o-brand-primary, $o-white, 10%), + active-border: $o-brand-primary, + active-color:$o-brand-primary, + ), + "secondary": ( + background: $o-gray-200, + border: $o-gray-200, + color: $o-gray-700, + + hover-background: $o-gray-300, + hover-border: $o-gray-300, + hover-color: $o-gray-800, + + active-background: $o-component-active-bg, + active-border: $o-component-active-border, + active-color: $o-component-active-color, + ), +), $o-btns-bs-override); + +$o-btns-bs-outline-override: () !default; +$o-btns-bs-outline-override: map-merge(( + "secondary": ( + background: transparent, + border: $o-gray-300, + color: $o-gray-700, + + hover-background: $o-gray-200, + hover-border: $o-gray-300, + hover-color: $o-gray-800, + + active-background: mix($o-enterprise-action-color, $o-white, 10%), + active-border: $o-enterprise-action-color, + active-color: $o-gray-900, + ), +), $o-btns-bs-outline-override); diff --git a/odex30_base/odex30_web/static/src/scss/secondary_variables.dark.scss b/odex30_base/odex30_web/static/src/scss/secondary_variables.dark.scss new file mode 100644 index 0000000..1f29868 --- /dev/null +++ b/odex30_base/odex30_web/static/src/scss/secondary_variables.dark.scss @@ -0,0 +1,19 @@ +$o-colors-original: lighten(#000, 46.7%), #e74e4e, #f4b660, #F7CD1F, #6cedeb, #8d5482, + #f07b50, #2C8397, #475577, #dc0457, #30C381, #9365B8 !default; + +$o-colors-secondary-original: #aa4b6b, #30C381, #97743a, #F7CD1F, #4285F4, #8E24AA, + #D6145F, #173e43, #348F50, #AA3A38, #795548, #5e0231, + #6be585, #999966, #e9d362, #b56969, #bdc3c7, #649173 !default; + +$o-colors: ()!default; +$o-colors-secondary: ()!default; + +@each $-color in $o-colors-original { + $-adjusted: saturate(mix($-color, $o-black, 50%), 60%); + $o-colors: append($o-colors, $-adjusted); +} + +@each $-color in $o-colors-secondary-original { + $-adjusted: saturate(mix($-color, $o-black, 50%), 80%); + $o-colors-secondary: append($o-colors-secondary, $-adjusted); +} diff --git a/odex30_base/odex30_web/static/src/scss/secondary_variables.scss b/odex30_base/odex30_web/static/src/scss/secondary_variables.scss new file mode 100644 index 0000000..13659c8 --- /dev/null +++ b/odex30_base/odex30_web/static/src/scss/secondary_variables.scss @@ -0,0 +1,4 @@ +// Needed for having no spacing between sheet and mail body in mass_mailing: +// Different required cancel paddings between web and odex30_web +$o-sheet-cancel-tpadding: $o-horizontal-padding !default; +$o-sheet-cancel-bpadding: $o-horizontal-padding + $o-sheet-vpadding !default; diff --git a/odex30_base/odex30_web/static/src/search/search_bar/search_bar.dark.scss b/odex30_base/odex30_web/static/src/search/search_bar/search_bar.dark.scss new file mode 100644 index 0000000..e5e3bbd --- /dev/null +++ b/odex30_base/odex30_web/static/src/search/search_bar/search_bar.dark.scss @@ -0,0 +1,7 @@ +// = Search Bar +// ============================================================================ +// No CSS hacks, variables overrides only + +.o_searchview_facet { + --SearchBar-facet-background: #{$o-black}; +} diff --git a/odex30_base/odex30_web/static/src/search/search_panel/search_view.dark.scss b/odex30_base/odex30_web/static/src/search/search_panel/search_view.dark.scss new file mode 100644 index 0000000..ab7f4b5 --- /dev/null +++ b/odex30_base/odex30_web/static/src/search/search_panel/search_view.dark.scss @@ -0,0 +1,12 @@ +// = Mobile Search +// ============================================================================ +// No CSS hacks, variables overrides only + +.o_mobile_search { + --mobileSearch-bg: #{$o-gray-200}; + --mobileSearch__header-bg: #{$o-gray-100}; +} + +.o_searchview { + --SearchBar-background-color: #{$o-gray-100}; +} diff --git a/odex30_base/odex30_web/static/src/views/dashboard/dashboard_controller.dark.scss b/odex30_base/odex30_web/static/src/views/dashboard/dashboard_controller.dark.scss new file mode 100644 index 0000000..5d13f1c --- /dev/null +++ b/odex30_base/odex30_web/static/src/views/dashboard/dashboard_controller.dark.scss @@ -0,0 +1,10 @@ +// = Dashboard View +// ============================================================================ +// No CSS hacks, variables overrides only + +.o_dashboard_view { + --DashboardView-background-color: #{$o-gray-100}; + --DashboardView__controlPanel-background-color: transparent; + --DashboardView__pieChart-background-color: transparent; +} + diff --git a/odex30_base/odex30_web/static/src/views/fields/image/image_field.dark.scss b/odex30_base/odex30_web/static/src/views/fields/image/image_field.dark.scss new file mode 100644 index 0000000..3b50785 --- /dev/null +++ b/odex30_base/odex30_web/static/src/views/fields/image/image_field.dark.scss @@ -0,0 +1,7 @@ +// = Image Field +// ============================================================================ +// No CSS hacks, variables overrides only + +.o_field_image { + --ImageField-background-color: #{$o-gray-900}; +} diff --git a/odex30_base/odex30_web/static/src/views/fields/properties/properties_field.dark.scss b/odex30_base/odex30_web/static/src/views/fields/properties/properties_field.dark.scss new file mode 100644 index 0000000..e9862c7 --- /dev/null +++ b/odex30_base/odex30_web/static/src/views/fields/properties/properties_field.dark.scss @@ -0,0 +1,13 @@ +.o_field_property_definition_type, .o_field_property_definition_type_menu { + img { + -webkit-filter: invert(100%); + filter: invert(100%); + } +} +.o_property_field_value { + select { + option { + background-color: $border-color; + } + } +} diff --git a/odex30_base/odex30_web/static/src/views/form/button_box/button_box.dark.scss b/odex30_base/odex30_web/static/src/views/form/button_box/button_box.dark.scss new file mode 100644 index 0000000..f95694f --- /dev/null +++ b/odex30_base/odex30_web/static/src/views/form/button_box/button_box.dark.scss @@ -0,0 +1,4 @@ +.o-form-buttonbox { + --o-stat-button-color: currentColor; + --o-stat-text-color: #{o-text-color('primary')}; +} diff --git a/odex30_base/odex30_web/static/src/views/gantt/web_gantt.variables.dark.scss b/odex30_base/odex30_web/static/src/views/gantt/web_gantt.variables.dark.scss new file mode 100644 index 0000000..fc39ad9 --- /dev/null +++ b/odex30_base/odex30_web/static/src/views/gantt/web_gantt.variables.dark.scss @@ -0,0 +1,9 @@ +// = Gantt View Variables +// ============================================================================ +// No CSS hacks, variables overrides only + +$gantt-highlight-today-border: rgba($o-warning, 0.5) !default; +$gantt-highlight-today-bg: rgba($o-warning, 0.15)!default; +$gantt-highlight-hover-row: rgba($o-brand-primary, .1) !default; +$gantt-row-open-bg: $o-gray-100 !default; +$gantt-unavailability-bg: $o-gray-200 !default; diff --git a/odex30_base/odex30_web/static/src/views/kanban/kanban_controller.dark.scss b/odex30_base/odex30_web/static/src/views/kanban/kanban_controller.dark.scss new file mode 100644 index 0000000..5d953cb --- /dev/null +++ b/odex30_base/odex30_web/static/src/views/kanban/kanban_controller.dark.scss @@ -0,0 +1,11 @@ +// = Kanban Rendered +// ============================================================================ +// No CSS hacks, variables overrides only + +.o_kanban_renderer { + --KanbanGroup-grouped-bg: #{$o-view-background-color}; + --KanbanRecord__image-bg-color: #{$o-gray-900}; + --KanbanColumn__highlight-background: #{mix($o-action, $o-gray-100, 15%)}; + --KanbanColumn__highlight-border: #{$o-component-active-border}; + --Kanban-background: #{$gray-100}; +} diff --git a/odex30_base/odex30_web/static/src/views/kanban/kanban_header_patch.js b/odex30_base/odex30_web/static/src/views/kanban/kanban_header_patch.js new file mode 100644 index 0000000..c426997 --- /dev/null +++ b/odex30_base/odex30_web/static/src/views/kanban/kanban_header_patch.js @@ -0,0 +1,44 @@ +/* @odoo-module */ + +import { registry } from "@web/core/registry"; +import { patch } from "@web/core/utils/patch"; +import { KanbanHeader } from "@web/views/kanban/kanban_header"; +import { PromoteStudioAutomationDialog } from "@odex30_web/webclient/promote_studio_dialog/promote_studio_dialog"; +import { _t } from "@web/core/l10n/translation"; +import { user } from "@web/core/user"; + +patch(KanbanHeader.prototype, { + /** + * @override + */ + get permissions() { + const permissions = super.permissions; + Object.defineProperty(permissions, "canEditAutomations", { + get: () => user.isAdmin, + configurable: true, + }); + return permissions; + }, + + async openAutomations() { + if (typeof this._openAutomations === "function") { + // this is the case if base_automation is installed + return this._openAutomations(); + } else { + this.env.services.dialog.add(PromoteStudioAutomationDialog, { + title: _t("Odoo Studio - Customize workflows in minutes"), + }); + } + }, +}); + +registry.category("kanban_header_config_items").add( + "open_automations", + { + label: _t("Automations"), + method: "openAutomations", + isVisible: ({ permissions }) => permissions.canEditAutomations, + class: "o_column_automations", + }, + { sequence: 25, force: true } +); diff --git a/odex30_base/odex30_web/static/src/views/kanban/kanban_view.scss b/odex30_base/odex30_web/static/src/views/kanban/kanban_view.scss new file mode 100644 index 0000000..5ea95e1 --- /dev/null +++ b/odex30_base/odex30_web/static/src/views/kanban/kanban_view.scss @@ -0,0 +1,14 @@ +.o_kanban_view { + + .o_column_quick_create .o_kanban_quick_create { + input { + &, &:focus, &:hover { + background: transparent; + border-bottom: 1px solid map-get($grays, '600'); + } + } + .input-group-append, .input-group-prepend { + border-left: 10px solid map-get($grays, '200'); + } + } +} diff --git a/odex30_base/odex30_web/static/src/views/list/list_controller.dark.scss b/odex30_base/odex30_web/static/src/views/list/list_controller.dark.scss new file mode 100644 index 0000000..219e84e --- /dev/null +++ b/odex30_base/odex30_web/static/src/views/list/list_controller.dark.scss @@ -0,0 +1,4 @@ +// = ListRenderer +// ============================================================================ +// No CSS hacks, variables overrides only + diff --git a/odex30_base/odex30_web/static/src/views/list/list_controller.scss b/odex30_base/odex30_web/static/src/views/list/list_controller.scss new file mode 100644 index 0000000..8eb931c --- /dev/null +++ b/odex30_base/odex30_web/static/src/views/list/list_controller.scss @@ -0,0 +1,3 @@ +.o_list_renderer { + --ListRenderer-thead-border-end-color: transparent; +} diff --git a/odex30_base/odex30_web/static/src/views/list/list_renderer_desktop.js b/odex30_base/odex30_web/static/src/views/list/list_renderer_desktop.js new file mode 100644 index 0000000..8ead910 --- /dev/null +++ b/odex30_base/odex30_web/static/src/views/list/list_renderer_desktop.js @@ -0,0 +1,103 @@ +/** @odoo-module */ + +import { isMobileOS } from "@web/core/browser/feature_detection"; +import { user } from "@web/core/user"; +import { useService } from "@web/core/utils/hooks"; +import { patch } from "@web/core/utils/patch"; +import { ListRenderer } from "@web/views/list/list_renderer"; +import { PromoteStudioDialog } from "@odex30_web/webclient/promote_studio_dialog/promote_studio_dialog"; +import { _t } from "@web/core/l10n/translation"; +import { onWillDestroy, useState } from "@odoo/owl"; + +export const patchListRendererDesktop = () => ({ + setup() { + super.setup(...arguments); + this.actionService = useService("action"); + const list = this.props.list; + + const { actionId, actionType } = this.env.config || {}; + + // Start by determining if the current ListRenderer is in a context that would + // allow the edition of the arch by studio. + // It needs to be a full list view, in an action + // (not a X2Many list, and not an "embedded" list in another component) + // Also, there is not enough information when an action is in target new, + // and this use case is fairly outside of the feature's scope + const isPotentiallyEditable = + !isMobileOS() && + !this.env.inDialog && + user.isSystem && + list === list.model.root && + actionId && + actionType === "ir.actions.act_window"; + this.studioEditable = useState({ value: isPotentiallyEditable }); + + if (isPotentiallyEditable) { + const computeStudioEditable = (action) => { + // Finalize the computation when the actionService is ready. + // The following code is copied from studioService. + if (!action.xml_id) { + return false; + } + if ( + action.res_model.indexOf("settings") > -1 && + action.res_model.indexOf("x_") !== 0 + ) { + return false; // settings views aren't editable; but x_settings is + } + if (action.res_model === "board.board") { + return false; // dashboard isn't editable + } + if (action.view_mode === "qweb") { + // Apparently there is a QWebView that allows to + // implement ActWindow actions that are completely custom + // but not editable by studio + return false; + } + if (action.res_model === "knowledge.article") { + // The knowledge form view is very specific and custom, it doesn't make sense + // to edit it. Editing the list and kanban is more debatable, but for simplicity's sake + // we set them to not editable too. + return false; + } + if (action.res_model === "account.bank.statement.line") { + return false; // bank reconciliation isn't editable + } + return Boolean(action.res_model); + }; + const onUiUpdated = () => { + const action = this.actionService.currentController.action; + if (action.id === actionId) { + this.studioEditable.value = computeStudioEditable(action); + } + stopListening(); + }; + const stopListening = () => + this.env.bus.removeEventListener("ACTION_MANAGER:UI-UPDATED", onUiUpdated); + this.env.bus.addEventListener("ACTION_MANAGER:UI-UPDATED", onUiUpdated); + + onWillDestroy(stopListening); + } + }, + + isStudioEditable() { + return this.studioEditable.value; + }, + + get displayOptionalFields() { + return this.isStudioEditable() || super.displayOptionalFields; + }, + + /** + * This function opens promote studio dialog + * + * @private + */ + onSelectedAddCustomField() { + this.env.services.dialog.add(PromoteStudioDialog, { + title: _t("Odoo Studio - Add new fields to any view"), + }); + }, +}); + +export const unpatchListRendererDesktop = patch(ListRenderer.prototype, patchListRendererDesktop()); diff --git a/odex30_base/odex30_web/static/src/views/list/list_renderer_desktop.xml b/odex30_base/odex30_web/static/src/views/list/list_renderer_desktop.xml new file mode 100644 index 0000000..dbab495 --- /dev/null +++ b/odex30_base/odex30_web/static/src/views/list/list_renderer_desktop.xml @@ -0,0 +1,16 @@ + + + + + + +