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 0000000..ce69f95 Binary files /dev/null and b/odex30_base/odex30_web/static/img/background-dark.jpg differ 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 @@ + + + + + + +