commit 17b9b0bedc8e8b9c66448d7099b764c844ed2064 Author: Angga Date: Sat Jul 19 01:29:09 2025 +0700 initial commit diff --git a/code_backend_theme/README.rst b/code_backend_theme/README.rst new file mode 100644 index 0000000..e4ab29a --- /dev/null +++ b/code_backend_theme/README.rst @@ -0,0 +1,49 @@ +.. image:: https://img.shields.io/badge/license-LGPL--3-green.svg + :target: https://www.gnu.org/licenses/lgpl-3.0-standalone.html + :alt: License: LGPL-3 + +Code Backend Theme +================== +* Code Backend Theme module for Odoo 18 community editions. This is a Minimalist +and Elegant Backend Theme for Odoo 18. This theme will change your +Old Experience to a New Experience with Odoo. + +Configuration +------- + - www.odoo.com/documentation/18.0/setup/install.html + - Install our custom addon + +Company +------- +* `Cybrosys Techno Solutions `__ + +License +------- +General Public License, Version 3 (LGPL v3). +(https://www.gnu.org/licenses/lgpl-3.0-standalone.html) + +Credits +------- +Developer: (V18) Swaraj R, (V17) ADVAITH BG, Contact: odoo@cybrosys.com + +Contacts +-------- +* Mail Contact : odoo@cybrosys.com +* Website : https://cybrosys.com + +Bug Tracker +----------- +Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported. + +Maintainer +-------- +This module is maintained by Cybrosys Technologies. + +For support and more information, please visit https://www.cybrosys.com + +.. image:: https://cybrosys.com/images/logo.png + :target: https://cybrosys.com" + +Further information +----------------- +HTML Description: ``__ diff --git a/code_backend_theme/__init__.py b/code_backend_theme/__init__.py new file mode 100644 index 0000000..1d22948 --- /dev/null +++ b/code_backend_theme/__init__.py @@ -0,0 +1,22 @@ +# -*- coding: utf-8 -*- +############################################################################# +# +# Cybrosys Technologies Pvt. Ltd. +# +# Copyright (C) 2024-TODAY Cybrosys Technologies() +# Author: Swaraj R (odoo@cybrosys.com) +# +# You can modify it under the terms of the GNU LESSER +# GENERAL PUBLIC LICENSE (LGPL v3), Version 3. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. +# +# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE +# (LGPL v3) along with this program. +# If not, see . +# +############################################################################# +from .hooks import test_pre_init_hook, test_post_init_hook diff --git a/code_backend_theme/__manifest__.py b/code_backend_theme/__manifest__.py new file mode 100644 index 0000000..b2a3994 --- /dev/null +++ b/code_backend_theme/__manifest__.py @@ -0,0 +1,64 @@ +# -*- coding: utf-8 -*- +############################################################################# +# +# Cybrosys Technologies Pvt. Ltd. +# +# Copyright (C) 2024-TODAY Cybrosys Technologies() +# Author: Swaraj R (odoo@cybrosys.com) +# +# You can modify it under the terms of the GNU LESSER +# GENERAL PUBLIC LICENSE (LGPL v3), Version 3. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. +# +# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE +# (LGPL v3) along with this program. +# If not, see . +# +############################################################################# +{ + "name": "Code Backend Theme", + "version": "18.0.1.0.0", + "category": "Themes/Backend", + "summary": "Code Backend Theme is an attractive theme for backend", + "description": """Minimalist and elegant theme for Odoo backend""", + "author": "Cybrosys Techno Solutions", + "company": "Cybrosys Techno Solutions", + "maintainer": "Cybrosys Techno Solutions", + "website": "https://www.cybrosys.com", + "depends": ["web", "mail"], + "data": [ + "views/layout_templates.xml", + "views/base_menus.xml", + ], + "assets": { + "web.assets_backend": [ + "code_backend_theme/static/src/xml/settings_templates.xml", + "code_backend_theme/static/src/xml/top_bar_templates.xml", + "code_backend_theme/static/src/scss/theme_accent.scss", + "code_backend_theme/static/src/scss/navigation_bar.scss", + "code_backend_theme/static/src/scss/datetimepicker.scss", + "code_backend_theme/static/src/scss/theme.scss", + "code_backend_theme/static/src/scss/sidebar.scss", + "code_backend_theme/static/src/js/fields/colors.js", + 'code_backend_theme/static/src/js/web_navbar_appmenu' + '/webNavbarAppMenu.js', + ], + "web.assets_frontend": [ + "code_backend_theme/static/src/scss/login.scss", + ], + }, + "images": [ + "static/description/banner.jpg", + "static/description/theme_screenshot.jpg", + ], + "license": "LGPL-3", + "installable": True, + "auto_install": False, + "application": False, + "pre_init_hook": "test_pre_init_hook", + "post_init_hook": "test_post_init_hook", +} diff --git a/code_backend_theme/doc/RELEASE_NOTES.md b/code_backend_theme/doc/RELEASE_NOTES.md new file mode 100644 index 0000000..f822734 --- /dev/null +++ b/code_backend_theme/doc/RELEASE_NOTES.md @@ -0,0 +1,5 @@ +## Module +#### 09.10.2024 +#### Version 18.0.1.0.0 +##### ADD +Initial commit for Code Backend Theme diff --git a/code_backend_theme/hooks.py b/code_backend_theme/hooks.py new file mode 100644 index 0000000..aa540d1 --- /dev/null +++ b/code_backend_theme/hooks.py @@ -0,0 +1,407 @@ +# -*- coding: utf-8 -*- +############################################################################# +# +# Cybrosys Technologies Pvt. Ltd. +# +# Copyright (C) 2024-TODAY Cybrosys Technologies() +# Author: Swaraj R (odoo@cybrosys.com) +# +# You can modify it under the terms of the GNU LESSER +# GENERAL PUBLIC LICENSE (LGPL v3), Version 3. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. +# +# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE +# (LGPL v3) along with this program. +# If not, see . +# +############################################################################# +import base64 +from odoo.modules import get_module_resource + + +def test_pre_init_hook(cr): + """pre init hook""" + menu_item = cr['ir.ui.menu'].search([('parent_id', '=', False)]) + for menu in menu_item: + if menu.name == 'Contacts': + img_path = get_module_resource( + 'code_backend_theme', 'static', 'src', 'img', + 'icons', 'Contacts.png') + menu.write({'web_icon_data': base64.b64encode( + open(img_path, "rb").read())}) + if menu.name == 'Link Tracker': + img_path = get_module_resource( + 'code_backend_theme', 'static', 'src', 'img', + 'icons', 'Link Tracker.png') + menu.write({'web_icon_data': base64.b64encode( + open(img_path, "rb").read())}) + if menu.name == 'Dashboards': + img_path = get_module_resource( + 'code_backend_theme', 'static', 'src', 'img', + 'icons', 'Dashboards.png') + menu.write({'web_icon_data': base64.b64encode( + open(img_path, "rb").read())}) + if menu.name == 'Sales': + img_path = get_module_resource( + 'code_backend_theme', 'static', 'src', 'img', + 'icons', 'Sales.png') + menu.write({'web_icon_data': base64.b64encode( + open(img_path, "rb").read())}) + if menu.name == 'Invoicing': + img_path = get_module_resource( + 'code_backend_theme', 'static', 'src', 'img', + 'icons', 'Invoicing.png') + menu.write({'web_icon_data': base64.b64encode( + open(img_path, "rb").read())}) + if menu.name == 'Inventory': + img_path = get_module_resource( + 'code_backend_theme', 'static', 'src', 'img', + 'icons', 'Inventory.png') + menu.write({'web_icon_data': base64.b64encode( + open(img_path, "rb").read())}) + if menu.name == 'Purchase': + img_path = get_module_resource( + 'code_backend_theme', 'static', 'src', 'img', + 'icons', 'Purchase.png') + menu.write({'web_icon_data': base64.b64encode( + open(img_path, "rb").read())}) + if menu.name == 'Calendar': + img_path = get_module_resource( + 'code_backend_theme', 'static', 'src', 'img', + 'icons', 'Calendar.png') + menu.write({'web_icon_data': base64.b64encode( + open(img_path, "rb").read())}) + if menu.name == 'CRM': + img_path = get_module_resource( + 'code_backend_theme', 'static', 'src', 'img', + 'icons', 'CRM.png') + menu.write({'web_icon_data': base64.b64encode( + open(img_path, "rb").read())}) + if menu.name == 'To-do': + img_path = get_module_resource( + 'code_backend_theme', 'static', 'src', 'img', + 'icons', 'Note.png') + menu.write({'web_icon_data': base64.b64encode( + open(img_path, "rb").read())}) + if menu.name == 'Website': + img_path = get_module_resource( + 'code_backend_theme', 'static', 'src', 'img', + 'icons', 'Website.png') + menu.write({'web_icon_data': base64.b64encode( + open(img_path, "rb").read())}) + if menu.name == 'Point of Sale': + img_path = get_module_resource( + 'code_backend_theme', 'static', 'src', 'img', + 'icons', 'Point of Sale.png') + menu.write({'web_icon_data': base64.b64encode( + open(img_path, "rb").read())}) + if menu.name == 'Manufacturing': + img_path = get_module_resource( + 'code_backend_theme', 'static', 'src', 'img', + 'icons', 'Manufacturing.png') + menu.write({'web_icon_data': base64.b64encode( + open(img_path, "rb").read())}) + if menu.name == 'Repairs': + img_path = get_module_resource( + 'code_backend_theme', 'static', 'src', 'img', + 'icons', 'Repairs.png') + menu.write({'web_icon_data': base64.b64encode( + open(img_path, "rb").read())}) + if menu.name == 'Email Marketing': + img_path = get_module_resource( + 'code_backend_theme', 'static', 'src', 'img', + 'icons', 'Email Marketing.png') + menu.write({'web_icon_data': base64.b64encode( + open(img_path, "rb").read())}) + if menu.name == 'SMS Marketing': + img_path = get_module_resource( + 'code_backend_theme', 'static', 'src', 'img', + 'icons', 'SMS Marketing.png') + menu.write({'web_icon_data': base64.b64encode( + open(img_path, "rb").read())}) + if menu.name == 'Project': + img_path = get_module_resource( + 'code_backend_theme', 'static', 'src', 'img', + 'icons', 'Project.png') + menu.write({'web_icon_data': base64.b64encode( + open(img_path, "rb").read())}) + if menu.name == 'Surveys': + img_path = get_module_resource( + 'code_backend_theme', 'static', 'src', 'img', + 'icons', 'Surveys.png') + menu.write({'web_icon_data': base64.b64encode( + open(img_path, "rb").read())}) + if menu.name == 'Employees': + img_path = get_module_resource( + 'code_backend_theme', 'static', 'src', 'img', + 'icons', 'Employees.png') + menu.write({'web_icon_data': base64.b64encode( + open(img_path, "rb").read())}) + if menu.name == 'Recruitment': + img_path = get_module_resource( + 'code_backend_theme', 'static', 'src', 'img', + 'icons', 'Recruitment.png') + menu.write({'web_icon_data': base64.b64encode( + open(img_path, "rb").read())}) + if menu.name == 'Attendances': + img_path = get_module_resource( + 'code_backend_theme', 'static', 'src', 'img', + 'icons', 'Attendances.png') + menu.write({'web_icon_data': base64.b64encode( + open(img_path, "rb").read())}) + if menu.name == 'Time Off': + img_path = get_module_resource( + 'code_backend_theme', 'static', 'src', 'img', + 'icons', 'Time Off.png') + menu.write({'web_icon_data': base64.b64encode( + open(img_path, "rb").read())}) + if menu.name == 'Expenses': + img_path = get_module_resource( + 'code_backend_theme', 'static', 'src', 'img', + 'icons', 'Expenses.png') + menu.write({'web_icon_data': base64.b64encode( + open(img_path, "rb").read())}) + if menu.name == 'Maintenance': + img_path = get_module_resource( + 'code_backend_theme', 'static', 'src', 'img', + 'icons', 'Maintenance.png') + menu.write({'web_icon_data': base64.b64encode( + open(img_path, "rb").read())}) + if menu.name == 'Live Chat': + img_path = get_module_resource( + 'code_backend_theme', 'static', 'src', 'img', + 'icons', 'Live Chat.png') + menu.write({'web_icon_data': base64.b64encode( + open(img_path, "rb").read())}) + if menu.name == 'Lunch': + img_path = get_module_resource( + 'code_backend_theme', 'static', 'src', 'img', + 'icons', 'Lunch.png') + menu.write({'web_icon_data': base64.b64encode( + open(img_path, "rb").read())}) + if menu.name == 'Fleet': + img_path = get_module_resource( + 'code_backend_theme', 'static', 'src', 'img', + 'icons', 'Fleet.png') + menu.write({'web_icon_data': base64.b64encode( + open(img_path, "rb").read())}) + if menu.name == 'Timesheets': + img_path = get_module_resource( + 'code_backend_theme', 'static', 'src', 'img', + 'icons', 'Timesheets.png') + menu.write({'web_icon_data': base64.b64encode( + open(img_path, "rb").read())}) + if menu.name == 'Events': + img_path = get_module_resource( + 'code_backend_theme', 'static', 'src', 'img', + 'icons', 'Events.png') + menu.write({'web_icon_data': base64.b64encode( + open(img_path, "rb").read())}) + if menu.name == 'eLearning': + img_path = get_module_resource( + 'code_backend_theme', 'static', 'src', 'img', + 'icons', 'eLearning.png') + menu.write({'web_icon_data': base64.b64encode( + open(img_path, "rb").read())}) + if menu.name == 'Members': + img_path = get_module_resource( + 'code_backend_theme', 'static', 'src', 'img', + 'icons', 'Members.png') + menu.write({'web_icon_data': base64.b64encode( + open(img_path, "rb").read())}) + + +def test_post_init_hook(cr): + """post init hook""" + menu_item = cr['ir.ui.menu'].search([('parent_id', '=', False)]) + for menu in menu_item: + if menu.name == 'Contacts': + img_path = get_module_resource( + 'code_backend_theme', 'static', 'src', 'img', + 'icons', 'Contacts.png') + menu.write({'web_icon_data': base64.b64encode( + open(img_path, "rb").read())}) + if menu.name == 'Link Tracker': + img_path = get_module_resource( + 'code_backend_theme', 'static', 'src', 'img', + 'icons', 'Link Tracker.png') + menu.write({'web_icon_data': base64.b64encode( + open(img_path, "rb").read())}) + if menu.name == 'Dashboards': + img_path = get_module_resource( + 'code_backend_theme', 'static', 'src', 'img', + 'icons', 'Dashboards.png') + menu.write({'web_icon_data': base64.b64encode( + open(img_path, "rb").read())}) + if menu.name == 'Sales': + img_path = get_module_resource( + 'code_backend_theme', 'static', 'src', 'img', + 'icons', 'Sales.png') + menu.write({'web_icon_data': base64.b64encode( + open(img_path, "rb").read())}) + if menu.name in ('Invoicing', 'Accounting'): + img_path = get_module_resource( + 'code_backend_theme', 'static', 'src', 'img', + 'icons', 'Invoicing.png') + menu.write({'web_icon_data': base64.b64encode( + open(img_path, "rb").read())}) + if menu.name == 'Inventory': + img_path = get_module_resource( + 'code_backend_theme', 'static', 'src', 'img', + 'icons', 'Inventory.png') + menu.write({'web_icon_data': base64.b64encode( + open(img_path, "rb").read())}) + if menu.name == 'Purchase': + img_path = get_module_resource( + 'code_backend_theme', 'static', 'src', 'img', + 'icons', 'Purchase.png') + menu.write({'web_icon_data': base64.b64encode( + open(img_path, "rb").read())}) + if menu.name == 'Calendar': + img_path = get_module_resource( + 'code_backend_theme', 'static', 'src', 'img', + 'icons', 'Calendar.png') + menu.write({'web_icon_data': base64.b64encode( + open(img_path, "rb").read())}) + if menu.name == 'CRM': + img_path = get_module_resource( + 'code_backend_theme', 'static', 'src', 'img', + 'icons', 'CRM.png') + menu.write({'web_icon_data': base64.b64encode( + open(img_path, "rb").read())}) + if menu.name == 'Note': + img_path = get_module_resource( + 'code_backend_theme', 'static', 'src', 'img', + 'icons', 'Note.png') + menu.write({'web_icon_data': base64.b64encode( + open(img_path, "rb").read())}) + if menu.name == 'Website': + img_path = get_module_resource( + 'code_backend_theme', 'static', 'src', 'img', + 'icons', 'Website.png') + menu.write({'web_icon_data': base64.b64encode( + open(img_path, "rb").read())}) + if menu.name == 'Point of Sale': + img_path = get_module_resource( + 'code_backend_theme', 'static', 'src', 'img', + 'icons', 'Point of Sale.png') + menu.write({'web_icon_data': base64.b64encode( + open(img_path, "rb").read())}) + if menu.name == 'Manufacturing': + img_path = get_module_resource( + 'code_backend_theme', 'static', 'src', 'img', + 'icons', 'Manufacturing.png') + menu.write({'web_icon_data': base64.b64encode( + open(img_path, "rb").read())}) + if menu.name == 'Repairs': + img_path = get_module_resource( + 'code_backend_theme', 'static', 'src', 'img', + 'icons', 'Repairs.png') + menu.write({'web_icon_data': base64.b64encode( + open(img_path, "rb").read())}) + if menu.name == 'Email Marketing': + img_path = get_module_resource( + 'code_backend_theme', 'static', 'src', 'img', + 'icons', 'Email Marketing.png') + menu.write({'web_icon_data': base64.b64encode( + open(img_path, "rb").read())}) + if menu.name == 'SMS Marketing': + img_path = get_module_resource( + 'code_backend_theme', 'static', 'src', 'img', + 'icons', 'SMS Marketing.png') + menu.write({'web_icon_data': base64.b64encode( + open(img_path, "rb").read())}) + if menu.name == 'Project': + img_path = get_module_resource( + 'code_backend_theme', 'static', 'src', 'img', + 'icons', 'Project.png') + menu.write({'web_icon_data': base64.b64encode( + open(img_path, "rb").read())}) + if menu.name == 'Surveys': + img_path = get_module_resource( + 'code_backend_theme', 'static', 'src', 'img', + 'icons', 'Surveys.png') + menu.write({'web_icon_data': base64.b64encode( + open(img_path, "rb").read())}) + if menu.name == 'Employees': + img_path = get_module_resource( + 'code_backend_theme', 'static', 'src', 'img', + 'icons', 'Employees.png') + menu.write({'web_icon_data': base64.b64encode( + open(img_path, "rb").read())}) + if menu.name == 'Recruitment': + img_path = get_module_resource( + 'code_backend_theme', 'static', 'src', 'img', + 'icons', 'Recruitment.png') + menu.write({'web_icon_data': base64.b64encode( + open(img_path, "rb").read())}) + if menu.name == 'Attendances': + img_path = get_module_resource( + 'code_backend_theme', 'static', 'src', 'img', + 'icons', 'Attendances.png') + menu.write({'web_icon_data': base64.b64encode( + open(img_path, "rb").read())}) + if menu.name == 'Time Off': + img_path = get_module_resource( + 'code_backend_theme', 'static', 'src', 'img', + 'icons', 'Time Off.png') + menu.write({'web_icon_data': base64.b64encode( + open(img_path, "rb").read())}) + if menu.name == 'Expenses': + img_path = get_module_resource( + 'code_backend_theme', 'static', 'src', 'img', + 'icons', 'Expenses.png') + menu.write({'web_icon_data': base64.b64encode( + open(img_path, "rb").read())}) + if menu.name == 'Maintenance': + img_path = get_module_resource( + 'code_backend_theme', 'static', 'src', 'img', + 'icons', 'Maintenance.png') + menu.write({'web_icon_data': base64.b64encode( + open(img_path, "rb").read())}) + if menu.name == 'Live Chat': + img_path = get_module_resource( + 'code_backend_theme', 'static', 'src', 'img', + 'icons', 'Live Chat.png') + menu.write({'web_icon_data': base64.b64encode( + open(img_path, "rb").read())}) + if menu.name == 'Lunch': + img_path = get_module_resource( + 'code_backend_theme', 'static', 'src', 'img', + 'icons', 'Lunch.png') + menu.write({'web_icon_data': base64.b64encode( + open(img_path, "rb").read())}) + if menu.name == 'Fleet': + img_path = get_module_resource( + 'code_backend_theme', 'static', 'src', 'img', + 'icons', 'Fleet.png') + menu.write({'web_icon_data': base64.b64encode( + open(img_path, "rb").read())}) + if menu.name == 'Timesheets': + img_path = get_module_resource( + 'code_backend_theme', 'static', 'src', 'img', + 'icons', 'Timesheets.png') + menu.write({'web_icon_data': base64.b64encode( + open(img_path, "rb").read())}) + if menu.name == 'Events': + img_path = get_module_resource( + 'code_backend_theme', 'static', 'src', 'img', + 'icons', 'Events.png') + menu.write({'web_icon_data': base64.b64encode( + open(img_path, "rb").read())}) + if menu.name == 'eLearning': + img_path = get_module_resource( + 'code_backend_theme', 'static', 'src', 'img', + 'icons', 'eLearning.png') + menu.write({'web_icon_data': base64.b64encode( + open(img_path, "rb").read())}) + if menu.name == 'Members': + img_path = get_module_resource( + 'code_backend_theme', 'static', 'src', 'img', + 'icons', 'Members.png') + menu.write({'web_icon_data': base64.b64encode( + open(img_path, "rb").read())}) diff --git a/code_backend_theme/static/description/assets/icons/check.png b/code_backend_theme/static/description/assets/icons/check.png new file mode 100644 index 0000000..c8e85f5 Binary files /dev/null and b/code_backend_theme/static/description/assets/icons/check.png differ diff --git a/code_backend_theme/static/description/assets/icons/chevron.png b/code_backend_theme/static/description/assets/icons/chevron.png new file mode 100644 index 0000000..2089293 Binary files /dev/null and b/code_backend_theme/static/description/assets/icons/chevron.png differ diff --git a/code_backend_theme/static/description/assets/icons/cogs.png b/code_backend_theme/static/description/assets/icons/cogs.png new file mode 100644 index 0000000..95d0bad Binary files /dev/null and b/code_backend_theme/static/description/assets/icons/cogs.png differ diff --git a/code_backend_theme/static/description/assets/icons/consultation.png b/code_backend_theme/static/description/assets/icons/consultation.png new file mode 100644 index 0000000..8319d4b Binary files /dev/null and b/code_backend_theme/static/description/assets/icons/consultation.png differ diff --git a/code_backend_theme/static/description/assets/icons/ecom-black.png b/code_backend_theme/static/description/assets/icons/ecom-black.png new file mode 100644 index 0000000..a9385ff Binary files /dev/null and b/code_backend_theme/static/description/assets/icons/ecom-black.png differ diff --git a/code_backend_theme/static/description/assets/icons/education-black.png b/code_backend_theme/static/description/assets/icons/education-black.png new file mode 100644 index 0000000..3eb09b2 Binary files /dev/null and b/code_backend_theme/static/description/assets/icons/education-black.png differ diff --git a/code_backend_theme/static/description/assets/icons/hotel-black.png b/code_backend_theme/static/description/assets/icons/hotel-black.png new file mode 100644 index 0000000..130f613 Binary files /dev/null and b/code_backend_theme/static/description/assets/icons/hotel-black.png differ diff --git a/code_backend_theme/static/description/assets/icons/license.png b/code_backend_theme/static/description/assets/icons/license.png new file mode 100644 index 0000000..a586979 Binary files /dev/null and b/code_backend_theme/static/description/assets/icons/license.png differ diff --git a/code_backend_theme/static/description/assets/icons/lifebuoy.png b/code_backend_theme/static/description/assets/icons/lifebuoy.png new file mode 100644 index 0000000..658d56c Binary files /dev/null and b/code_backend_theme/static/description/assets/icons/lifebuoy.png differ diff --git a/code_backend_theme/static/description/assets/icons/manufacturing-black.png b/code_backend_theme/static/description/assets/icons/manufacturing-black.png new file mode 100644 index 0000000..697eb0e Binary files /dev/null and b/code_backend_theme/static/description/assets/icons/manufacturing-black.png differ diff --git a/code_backend_theme/static/description/assets/icons/pos-black.png b/code_backend_theme/static/description/assets/icons/pos-black.png new file mode 100644 index 0000000..97c0f90 Binary files /dev/null and b/code_backend_theme/static/description/assets/icons/pos-black.png differ diff --git a/code_backend_theme/static/description/assets/icons/puzzle.png b/code_backend_theme/static/description/assets/icons/puzzle.png new file mode 100644 index 0000000..65cf854 Binary files /dev/null and b/code_backend_theme/static/description/assets/icons/puzzle.png differ diff --git a/code_backend_theme/static/description/assets/icons/restaurant-black.png b/code_backend_theme/static/description/assets/icons/restaurant-black.png new file mode 100644 index 0000000..4a35eb9 Binary files /dev/null and b/code_backend_theme/static/description/assets/icons/restaurant-black.png differ diff --git a/code_backend_theme/static/description/assets/icons/service-black.png b/code_backend_theme/static/description/assets/icons/service-black.png new file mode 100644 index 0000000..301ab51 Binary files /dev/null and b/code_backend_theme/static/description/assets/icons/service-black.png differ diff --git a/code_backend_theme/static/description/assets/icons/trading-black.png b/code_backend_theme/static/description/assets/icons/trading-black.png new file mode 100644 index 0000000..9398ba2 Binary files /dev/null and b/code_backend_theme/static/description/assets/icons/trading-black.png differ diff --git a/code_backend_theme/static/description/assets/icons/training.png b/code_backend_theme/static/description/assets/icons/training.png new file mode 100644 index 0000000..884ca02 Binary files /dev/null and b/code_backend_theme/static/description/assets/icons/training.png differ diff --git a/code_backend_theme/static/description/assets/icons/update.png b/code_backend_theme/static/description/assets/icons/update.png new file mode 100644 index 0000000..ecbc5a0 Binary files /dev/null and b/code_backend_theme/static/description/assets/icons/update.png differ diff --git a/code_backend_theme/static/description/assets/icons/user.png b/code_backend_theme/static/description/assets/icons/user.png new file mode 100644 index 0000000..6ffb23d Binary files /dev/null and b/code_backend_theme/static/description/assets/icons/user.png differ diff --git a/code_backend_theme/static/description/assets/icons/wrench.png b/code_backend_theme/static/description/assets/icons/wrench.png new file mode 100644 index 0000000..6c04dea Binary files /dev/null and b/code_backend_theme/static/description/assets/icons/wrench.png differ diff --git a/code_backend_theme/static/description/assets/misc/categories.png b/code_backend_theme/static/description/assets/misc/categories.png new file mode 100644 index 0000000..bedf1e0 Binary files /dev/null and b/code_backend_theme/static/description/assets/misc/categories.png differ diff --git a/code_backend_theme/static/description/assets/misc/check-box.png b/code_backend_theme/static/description/assets/misc/check-box.png new file mode 100644 index 0000000..42caf24 Binary files /dev/null and b/code_backend_theme/static/description/assets/misc/check-box.png differ diff --git a/code_backend_theme/static/description/assets/misc/compass.png b/code_backend_theme/static/description/assets/misc/compass.png new file mode 100644 index 0000000..d5fed8f Binary files /dev/null and b/code_backend_theme/static/description/assets/misc/compass.png differ diff --git a/code_backend_theme/static/description/assets/misc/corporate.png b/code_backend_theme/static/description/assets/misc/corporate.png new file mode 100644 index 0000000..2eb13ed Binary files /dev/null and b/code_backend_theme/static/description/assets/misc/corporate.png differ diff --git a/code_backend_theme/static/description/assets/misc/customer-support.png b/code_backend_theme/static/description/assets/misc/customer-support.png new file mode 100644 index 0000000..79efc72 Binary files /dev/null and b/code_backend_theme/static/description/assets/misc/customer-support.png differ diff --git a/code_backend_theme/static/description/assets/misc/cybrosys-logo.png b/code_backend_theme/static/description/assets/misc/cybrosys-logo.png new file mode 100644 index 0000000..cc3cc0c Binary files /dev/null and b/code_backend_theme/static/description/assets/misc/cybrosys-logo.png differ diff --git a/code_backend_theme/static/description/assets/misc/features.png b/code_backend_theme/static/description/assets/misc/features.png new file mode 100644 index 0000000..b41769f Binary files /dev/null and b/code_backend_theme/static/description/assets/misc/features.png differ diff --git a/code_backend_theme/static/description/assets/misc/logo.png b/code_backend_theme/static/description/assets/misc/logo.png new file mode 100644 index 0000000..478462d Binary files /dev/null and b/code_backend_theme/static/description/assets/misc/logo.png differ diff --git a/code_backend_theme/static/description/assets/misc/pictures.png b/code_backend_theme/static/description/assets/misc/pictures.png new file mode 100644 index 0000000..56d255f Binary files /dev/null and b/code_backend_theme/static/description/assets/misc/pictures.png differ diff --git a/code_backend_theme/static/description/assets/misc/pie-chart.png b/code_backend_theme/static/description/assets/misc/pie-chart.png new file mode 100644 index 0000000..426e052 Binary files /dev/null and b/code_backend_theme/static/description/assets/misc/pie-chart.png differ diff --git a/code_backend_theme/static/description/assets/misc/right-arrow.png b/code_backend_theme/static/description/assets/misc/right-arrow.png new file mode 100644 index 0000000..730984a Binary files /dev/null and b/code_backend_theme/static/description/assets/misc/right-arrow.png differ diff --git a/code_backend_theme/static/description/assets/misc/star.png b/code_backend_theme/static/description/assets/misc/star.png new file mode 100644 index 0000000..2eb9ab2 Binary files /dev/null and b/code_backend_theme/static/description/assets/misc/star.png differ diff --git a/code_backend_theme/static/description/assets/misc/support.png b/code_backend_theme/static/description/assets/misc/support.png new file mode 100644 index 0000000..4f18b8b Binary files /dev/null and b/code_backend_theme/static/description/assets/misc/support.png differ diff --git a/code_backend_theme/static/description/assets/misc/whatsapp.png b/code_backend_theme/static/description/assets/misc/whatsapp.png new file mode 100644 index 0000000..d513a53 Binary files /dev/null and b/code_backend_theme/static/description/assets/misc/whatsapp.png differ diff --git a/code_backend_theme/static/description/assets/modules/1.png b/code_backend_theme/static/description/assets/modules/1.png new file mode 100644 index 0000000..5238bde Binary files /dev/null and b/code_backend_theme/static/description/assets/modules/1.png differ diff --git a/code_backend_theme/static/description/assets/modules/2.png b/code_backend_theme/static/description/assets/modules/2.png new file mode 100644 index 0000000..1ae7cfe Binary files /dev/null and b/code_backend_theme/static/description/assets/modules/2.png differ diff --git a/code_backend_theme/static/description/assets/modules/3.png b/code_backend_theme/static/description/assets/modules/3.png new file mode 100644 index 0000000..3c3ff1a Binary files /dev/null and b/code_backend_theme/static/description/assets/modules/3.png differ diff --git a/code_backend_theme/static/description/assets/modules/4.png b/code_backend_theme/static/description/assets/modules/4.png new file mode 100644 index 0000000..3fae463 Binary files /dev/null and b/code_backend_theme/static/description/assets/modules/4.png differ diff --git a/code_backend_theme/static/description/assets/modules/5.gif b/code_backend_theme/static/description/assets/modules/5.gif new file mode 100644 index 0000000..2a5f8e6 Binary files /dev/null and b/code_backend_theme/static/description/assets/modules/5.gif differ diff --git a/code_backend_theme/static/description/assets/modules/6.png b/code_backend_theme/static/description/assets/modules/6.png new file mode 100644 index 0000000..7f28152 Binary files /dev/null and b/code_backend_theme/static/description/assets/modules/6.png differ diff --git a/code_backend_theme/static/description/banner.jpg b/code_backend_theme/static/description/banner.jpg new file mode 100644 index 0000000..95c5492 Binary files /dev/null and b/code_backend_theme/static/description/banner.jpg differ diff --git a/code_backend_theme/static/description/icon.png b/code_backend_theme/static/description/icon.png new file mode 100644 index 0000000..0fffab0 Binary files /dev/null and b/code_backend_theme/static/description/icon.png differ diff --git a/code_backend_theme/static/description/images/1.png b/code_backend_theme/static/description/images/1.png new file mode 100644 index 0000000..9659885 Binary files /dev/null and b/code_backend_theme/static/description/images/1.png differ diff --git a/code_backend_theme/static/description/images/Cybrosys R.png b/code_backend_theme/static/description/images/Cybrosys R.png new file mode 100644 index 0000000..da40580 Binary files /dev/null and b/code_backend_theme/static/description/images/Cybrosys R.png differ diff --git a/code_backend_theme/static/description/images/GIF 05.gif b/code_backend_theme/static/description/images/GIF 05.gif new file mode 100644 index 0000000..272d6aa Binary files /dev/null and b/code_backend_theme/static/description/images/GIF 05.gif differ diff --git a/code_backend_theme/static/description/images/Gif 01.gif b/code_backend_theme/static/description/images/Gif 01.gif new file mode 100644 index 0000000..5b2a3e5 Binary files /dev/null and b/code_backend_theme/static/description/images/Gif 01.gif differ diff --git a/code_backend_theme/static/description/images/Gif 022.gif b/code_backend_theme/static/description/images/Gif 022.gif new file mode 100644 index 0000000..db0cf52 Binary files /dev/null and b/code_backend_theme/static/description/images/Gif 022.gif differ diff --git a/code_backend_theme/static/description/images/Poster-modal.psd b/code_backend_theme/static/description/images/Poster-modal.psd new file mode 100644 index 0000000..ad22908 Binary files /dev/null and b/code_backend_theme/static/description/images/Poster-modal.psd differ diff --git a/code_backend_theme/static/description/images/apps.png b/code_backend_theme/static/description/images/apps.png new file mode 100644 index 0000000..871d1b0 Binary files /dev/null and b/code_backend_theme/static/description/images/apps.png differ diff --git a/code_backend_theme/static/description/images/arrows-repeat.svg b/code_backend_theme/static/description/images/arrows-repeat.svg new file mode 100644 index 0000000..1d7efab --- /dev/null +++ b/code_backend_theme/static/description/images/arrows-repeat.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/code_backend_theme/static/description/images/banner.jpg b/code_backend_theme/static/description/images/banner.jpg new file mode 100644 index 0000000..95c5492 Binary files /dev/null and b/code_backend_theme/static/description/images/banner.jpg differ diff --git a/code_backend_theme/static/description/images/capture (1).png b/code_backend_theme/static/description/images/capture (1).png new file mode 100644 index 0000000..8824dea Binary files /dev/null and b/code_backend_theme/static/description/images/capture (1).png differ diff --git a/code_backend_theme/static/description/images/check.png b/code_backend_theme/static/description/images/check.png new file mode 100644 index 0000000..c8e85f5 Binary files /dev/null and b/code_backend_theme/static/description/images/check.png differ diff --git a/code_backend_theme/static/description/images/check.svg b/code_backend_theme/static/description/images/check.svg new file mode 100644 index 0000000..1df6795 --- /dev/null +++ b/code_backend_theme/static/description/images/check.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/code_backend_theme/static/description/images/chevron.png b/code_backend_theme/static/description/images/chevron.png new file mode 100644 index 0000000..2089293 Binary files /dev/null and b/code_backend_theme/static/description/images/chevron.png differ diff --git a/code_backend_theme/static/description/images/cogs.png b/code_backend_theme/static/description/images/cogs.png new file mode 100644 index 0000000..95d0bad Binary files /dev/null and b/code_backend_theme/static/description/images/cogs.png differ diff --git a/code_backend_theme/static/description/images/consultation.png b/code_backend_theme/static/description/images/consultation.png new file mode 100644 index 0000000..8319d4b Binary files /dev/null and b/code_backend_theme/static/description/images/consultation.png differ diff --git a/code_backend_theme/static/description/images/discuss.png b/code_backend_theme/static/description/images/discuss.png new file mode 100644 index 0000000..d09774b Binary files /dev/null and b/code_backend_theme/static/description/images/discuss.png differ diff --git a/code_backend_theme/static/description/images/ecom-black.png b/code_backend_theme/static/description/images/ecom-black.png new file mode 100644 index 0000000..a9385ff Binary files /dev/null and b/code_backend_theme/static/description/images/ecom-black.png differ diff --git a/code_backend_theme/static/description/images/education-black.png b/code_backend_theme/static/description/images/education-black.png new file mode 100644 index 0000000..3eb09b2 Binary files /dev/null and b/code_backend_theme/static/description/images/education-black.png differ diff --git a/code_backend_theme/static/description/images/email.svg b/code_backend_theme/static/description/images/email.svg new file mode 100644 index 0000000..15291cd --- /dev/null +++ b/code_backend_theme/static/description/images/email.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/code_backend_theme/static/description/images/employees.png b/code_backend_theme/static/description/images/employees.png new file mode 100644 index 0000000..f1f4a74 Binary files /dev/null and b/code_backend_theme/static/description/images/employees.png differ diff --git a/code_backend_theme/static/description/images/error_purchase.png b/code_backend_theme/static/description/images/error_purchase.png new file mode 100644 index 0000000..74a84c6 Binary files /dev/null and b/code_backend_theme/static/description/images/error_purchase.png differ diff --git a/code_backend_theme/static/description/images/feature-star.svg b/code_backend_theme/static/description/images/feature-star.svg new file mode 100644 index 0000000..a913270 --- /dev/null +++ b/code_backend_theme/static/description/images/feature-star.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/code_backend_theme/static/description/images/gear.svg b/code_backend_theme/static/description/images/gear.svg new file mode 100644 index 0000000..0cc66b6 --- /dev/null +++ b/code_backend_theme/static/description/images/gear.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/code_backend_theme/static/description/images/graph.png b/code_backend_theme/static/description/images/graph.png new file mode 100644 index 0000000..71a6d8c Binary files /dev/null and b/code_backend_theme/static/description/images/graph.png differ diff --git a/code_backend_theme/static/description/images/groupby.png b/code_backend_theme/static/description/images/groupby.png new file mode 100644 index 0000000..ee2dfc8 Binary files /dev/null and b/code_backend_theme/static/description/images/groupby.png differ diff --git a/code_backend_theme/static/description/images/hire-odoo.svg b/code_backend_theme/static/description/images/hire-odoo.svg new file mode 100644 index 0000000..e1ac089 --- /dev/null +++ b/code_backend_theme/static/description/images/hire-odoo.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/code_backend_theme/static/description/images/hotel-black.png b/code_backend_theme/static/description/images/hotel-black.png new file mode 100644 index 0000000..130f613 Binary files /dev/null and b/code_backend_theme/static/description/images/hotel-black.png differ diff --git a/code_backend_theme/static/description/images/invoice_wizard.png b/code_backend_theme/static/description/images/invoice_wizard.png new file mode 100644 index 0000000..08bed7e Binary files /dev/null and b/code_backend_theme/static/description/images/invoice_wizard.png differ diff --git a/code_backend_theme/static/description/images/kanban_view.png b/code_backend_theme/static/description/images/kanban_view.png new file mode 100644 index 0000000..b86a44f Binary files /dev/null and b/code_backend_theme/static/description/images/kanban_view.png differ diff --git a/code_backend_theme/static/description/images/license.png b/code_backend_theme/static/description/images/license.png new file mode 100644 index 0000000..a586979 Binary files /dev/null and b/code_backend_theme/static/description/images/license.png differ diff --git a/code_backend_theme/static/description/images/life-ring-icon.svg b/code_backend_theme/static/description/images/life-ring-icon.svg new file mode 100644 index 0000000..3ae6e1d --- /dev/null +++ b/code_backend_theme/static/description/images/life-ring-icon.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/code_backend_theme/static/description/images/lifebuoy.png b/code_backend_theme/static/description/images/lifebuoy.png new file mode 100644 index 0000000..658d56c Binary files /dev/null and b/code_backend_theme/static/description/images/lifebuoy.png differ diff --git a/code_backend_theme/static/description/images/login.png b/code_backend_theme/static/description/images/login.png new file mode 100644 index 0000000..8b3618b Binary files /dev/null and b/code_backend_theme/static/description/images/login.png differ diff --git a/code_backend_theme/static/description/images/manufacturing-black.png b/code_backend_theme/static/description/images/manufacturing-black.png new file mode 100644 index 0000000..697eb0e Binary files /dev/null and b/code_backend_theme/static/description/images/manufacturing-black.png differ diff --git a/code_backend_theme/static/description/images/odoo-consultancy.svg b/code_backend_theme/static/description/images/odoo-consultancy.svg new file mode 100644 index 0000000..e05f65b --- /dev/null +++ b/code_backend_theme/static/description/images/odoo-consultancy.svg @@ -0,0 +1,4 @@ + + + + diff --git a/code_backend_theme/static/description/images/odoo-licencing.svg b/code_backend_theme/static/description/images/odoo-licencing.svg new file mode 100644 index 0000000..2606c88 --- /dev/null +++ b/code_backend_theme/static/description/images/odoo-licencing.svg @@ -0,0 +1,3 @@ + + + diff --git a/code_backend_theme/static/description/images/phone.svg b/code_backend_theme/static/description/images/phone.svg new file mode 100644 index 0000000..b7bd7f2 --- /dev/null +++ b/code_backend_theme/static/description/images/phone.svg @@ -0,0 +1,3 @@ + + + diff --git a/code_backend_theme/static/description/images/photo-capture.png b/code_backend_theme/static/description/images/photo-capture.png new file mode 100644 index 0000000..06c1117 Binary files /dev/null and b/code_backend_theme/static/description/images/photo-capture.png differ diff --git a/code_backend_theme/static/description/images/pngwing.jpg b/code_backend_theme/static/description/images/pngwing.jpg new file mode 100644 index 0000000..b4ff4e9 Binary files /dev/null and b/code_backend_theme/static/description/images/pngwing.jpg differ diff --git a/code_backend_theme/static/description/images/pos-black.png b/code_backend_theme/static/description/images/pos-black.png new file mode 100644 index 0000000..97c0f90 Binary files /dev/null and b/code_backend_theme/static/description/images/pos-black.png differ diff --git a/code_backend_theme/static/description/images/poster.psd b/code_backend_theme/static/description/images/poster.psd new file mode 100644 index 0000000..281991b Binary files /dev/null and b/code_backend_theme/static/description/images/poster.psd differ diff --git a/code_backend_theme/static/description/images/product.png b/code_backend_theme/static/description/images/product.png new file mode 100644 index 0000000..c7cefc2 Binary files /dev/null and b/code_backend_theme/static/description/images/product.png differ diff --git a/code_backend_theme/static/description/images/product_kanban.png b/code_backend_theme/static/description/images/product_kanban.png new file mode 100644 index 0000000..5d64e11 Binary files /dev/null and b/code_backend_theme/static/description/images/product_kanban.png differ diff --git a/code_backend_theme/static/description/images/purchase_list.png b/code_backend_theme/static/description/images/purchase_list.png new file mode 100644 index 0000000..5b906b6 Binary files /dev/null and b/code_backend_theme/static/description/images/purchase_list.png differ diff --git a/code_backend_theme/static/description/images/puzzle-piece-icon.svg b/code_backend_theme/static/description/images/puzzle-piece-icon.svg new file mode 100644 index 0000000..3e9ad93 --- /dev/null +++ b/code_backend_theme/static/description/images/puzzle-piece-icon.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/code_backend_theme/static/description/images/puzzle.png b/code_backend_theme/static/description/images/puzzle.png new file mode 100644 index 0000000..65cf854 Binary files /dev/null and b/code_backend_theme/static/description/images/puzzle.png differ diff --git a/code_backend_theme/static/description/images/recruitment.png b/code_backend_theme/static/description/images/recruitment.png new file mode 100644 index 0000000..5284ee7 Binary files /dev/null and b/code_backend_theme/static/description/images/recruitment.png differ diff --git a/code_backend_theme/static/description/images/restaurant-black.png b/code_backend_theme/static/description/images/restaurant-black.png new file mode 100644 index 0000000..4a35eb9 Binary files /dev/null and b/code_backend_theme/static/description/images/restaurant-black.png differ diff --git a/code_backend_theme/static/description/images/sale_form.png b/code_backend_theme/static/description/images/sale_form.png new file mode 100644 index 0000000..500f532 Binary files /dev/null and b/code_backend_theme/static/description/images/sale_form.png differ diff --git a/code_backend_theme/static/description/images/sale_kanban.png b/code_backend_theme/static/description/images/sale_kanban.png new file mode 100644 index 0000000..2297d1a Binary files /dev/null and b/code_backend_theme/static/description/images/sale_kanban.png differ diff --git a/code_backend_theme/static/description/images/service-black.png b/code_backend_theme/static/description/images/service-black.png new file mode 100644 index 0000000..301ab51 Binary files /dev/null and b/code_backend_theme/static/description/images/service-black.png differ diff --git a/code_backend_theme/static/description/images/settngs.png b/code_backend_theme/static/description/images/settngs.png new file mode 100644 index 0000000..79c10d7 Binary files /dev/null and b/code_backend_theme/static/description/images/settngs.png differ diff --git a/code_backend_theme/static/description/images/sidebar.png b/code_backend_theme/static/description/images/sidebar.png new file mode 100644 index 0000000..848d1e4 Binary files /dev/null and b/code_backend_theme/static/description/images/sidebar.png differ diff --git a/code_backend_theme/static/description/images/star (1) 2.svg b/code_backend_theme/static/description/images/star (1) 2.svg new file mode 100644 index 0000000..5ae9f50 --- /dev/null +++ b/code_backend_theme/static/description/images/star (1) 2.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/code_backend_theme/static/description/images/support (1) 1.svg b/code_backend_theme/static/description/images/support (1) 1.svg new file mode 100644 index 0000000..7d37a8f --- /dev/null +++ b/code_backend_theme/static/description/images/support (1) 1.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/code_backend_theme/static/description/images/support-email.svg b/code_backend_theme/static/description/images/support-email.svg new file mode 100644 index 0000000..eb70370 --- /dev/null +++ b/code_backend_theme/static/description/images/support-email.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/code_backend_theme/static/description/images/theme_menu.png b/code_backend_theme/static/description/images/theme_menu.png new file mode 100644 index 0000000..2353639 Binary files /dev/null and b/code_backend_theme/static/description/images/theme_menu.png differ diff --git a/code_backend_theme/static/description/images/tick-mark.svg b/code_backend_theme/static/description/images/tick-mark.svg new file mode 100644 index 0000000..2dbb401 --- /dev/null +++ b/code_backend_theme/static/description/images/tick-mark.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/code_backend_theme/static/description/images/timeoff.png b/code_backend_theme/static/description/images/timeoff.png new file mode 100644 index 0000000..45fa4d8 Binary files /dev/null and b/code_backend_theme/static/description/images/timeoff.png differ diff --git a/code_backend_theme/static/description/images/trading-black.png b/code_backend_theme/static/description/images/trading-black.png new file mode 100644 index 0000000..9398ba2 Binary files /dev/null and b/code_backend_theme/static/description/images/trading-black.png differ diff --git a/code_backend_theme/static/description/images/training.png b/code_backend_theme/static/description/images/training.png new file mode 100644 index 0000000..884ca02 Binary files /dev/null and b/code_backend_theme/static/description/images/training.png differ diff --git a/code_backend_theme/static/description/images/update.png b/code_backend_theme/static/description/images/update.png new file mode 100644 index 0000000..ecbc5a0 Binary files /dev/null and b/code_backend_theme/static/description/images/update.png differ diff --git a/code_backend_theme/static/description/images/user.png b/code_backend_theme/static/description/images/user.png new file mode 100644 index 0000000..6ffb23d Binary files /dev/null and b/code_backend_theme/static/description/images/user.png differ diff --git a/code_backend_theme/static/description/images/user_error.png b/code_backend_theme/static/description/images/user_error.png new file mode 100644 index 0000000..b8f2a79 Binary files /dev/null and b/code_backend_theme/static/description/images/user_error.png differ diff --git a/code_backend_theme/static/description/images/v15-banner.jpg b/code_backend_theme/static/description/images/v15-banner.jpg new file mode 100644 index 0000000..263ecce Binary files /dev/null and b/code_backend_theme/static/description/images/v15-banner.jpg differ diff --git a/code_backend_theme/static/description/images/whatsapp 1.svg b/code_backend_theme/static/description/images/whatsapp 1.svg new file mode 100644 index 0000000..0bfaf8f --- /dev/null +++ b/code_backend_theme/static/description/images/whatsapp 1.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/code_backend_theme/static/description/images/whatsapp.svg b/code_backend_theme/static/description/images/whatsapp.svg new file mode 100644 index 0000000..b618aea --- /dev/null +++ b/code_backend_theme/static/description/images/whatsapp.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/code_backend_theme/static/description/images/wrench-icon.svg b/code_backend_theme/static/description/images/wrench-icon.svg new file mode 100644 index 0000000..174b5a4 --- /dev/null +++ b/code_backend_theme/static/description/images/wrench-icon.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/code_backend_theme/static/description/images/wrench.png b/code_backend_theme/static/description/images/wrench.png new file mode 100644 index 0000000..6c04dea Binary files /dev/null and b/code_backend_theme/static/description/images/wrench.png differ diff --git a/code_backend_theme/static/description/index.html b/code_backend_theme/static/description/index.html new file mode 100644 index 0000000..9645d21 --- /dev/null +++ b/code_backend_theme/static/description/index.html @@ -0,0 +1,1241 @@ + + + + + + + app index + + + + + + + + + + +
+ + + + +
+
+
+
+ +
+
+
+
+ +
+ Supports: +
+ Community +
+
+
+
+
+ Availability: +
+ Odoo + Online +
+
+ + Odoo.sh +
+
+ On + Premise +
+
+
+
+
+
+ + + +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+
+

Our Features

+ +

The Code Backend Theme V18 Gives You a Fully Modified View with a Full Screen Display. This is a Minimalist and Elegant Backend Theme for Odoo 18. This Theme Will Change Your Old Experience to a New Experience With Odoo. It is a Perfect Choice for Your Odoo Backend and an Attractive Theme for Your Odoo 18. It will Give You a Clean Layout with a New Color Combination and a Modified Font. It has a Sidebar with New App Icons and Company Logo. This Will Change Your Old Kanban, List, and Form Views to A Fully Modified View.

+
+
+
+
+ + +
+
+ + + +
+
+
+ +
+
+ +
+
+
+ + +
+
+
+
+
+ + +
+
+
+ +
+
+
+
+
+ Sidebar + +

Sidebar with New Menu Icons

+
+ +
+
+
+ Apps + +

Available apps view as cards in new look

+
+ +
+
+
+ Employees +

Kanban view of employees

+
+ +
+
+
+ Error in purchase +

Error is showing in style in purchase page

+
+ +
+
+
+ New product +

create new product in style

+
+ +
+
+
+ Kanban view of sale oredrs +

Kanban view of sale orders in new color pattern

+
+ +
+
+
+ Login +

Login page in classy look

+
+ +
+
+
+ Group by +

Group By View

+
+ +
+
+
+ Settings page +

Settings page in new color pattern

+
+ +
+
+
+ Product kanban +

product page in kanban view

+
+ +
+
+
+ Discuss page +

Discuss page in new style

+
+ +
+
+
+ Purchase List +

Purchase list view in new style

+
+ +
+
+
+ Wizard Popup +

Wizards in new style

+
+ +
+
+
+ User Error +

User error in color pattern

+
+ +
+
+
+ Date picking +

Stylish Date picking option

+
+ +
+
+
+ Recruitment Kanban +

Recruitment Kanban View With Ribbons

+
+ +
+
+
+ Graph +

Graphs with Sidebar

+
+ +
+
+
+
+ + +
+
+
+
+
+
+
+ HIGHLIGHT +

All-New Menu Design

+

Now take advantage of everything + your dashboard has to offer even on the go. Our + design are now fully responsive, enabling you to + view and manage everything from the comfort of + your mobile device. Everything has been designed + in a meticulous fashion so that every view snaps + itself to fit the size of the device you are + using, be it smartphones, tablet or any other + portables, our theme adjusts itself to fit the + screen size.

+ + +
+
+ Grid item +
+ +
+
+ +
+
+
+ HIGHLIGHT +

Easily Access Sidebar Menu

+

Reveal the sidebar menu with just a + click. Sidebar menu features all the relevant links to + navigate through the application. Hiding the sidebar + leaves more space on the main area offering a + distraction-free view that lets you focus on what + matters the most.

+ +
+
+ Grid item +
+ +
+
+
+ + + + +
+
+
+
+ +
+ + +
+ + + + + + + +
+
+
+
+

+ Fully Responsive Layout
+

+ +
+

Now take advantage of everything your dashboard + has to offer even on the go. Our design are now fully + responsive, enabling you to view and manage everything from the + comfort of your mobile device. Everything has been designed in a + meticulous fashion so that every view snaps itself to fit the + size of the device you are using, be it smartphones, tablet or + any other portables, our theme adjusts itself to fit the screen + size. +

+
    +
  • Fully responsive
  • +
  • Fly-out hamburger menu on the left
  • +
  • Fits perfectly to all screen sizes
  • +
  • Quick access menu at the bottom in discuss
  • +
+
+
+
+
+
+
+ +
+ +
+
+
+
+ +
+
+
+
+
+ +
+ +
+
+
+
+

+ List View
+ + + + + + + +

+ +
+

Code Backend Theme V18 Gives You + The Fully Modified List View. This Table Design Gives + You More Beauty for Your Odoo Backend. It will Give You + a Clean Layout with the New Color Combination and a + Modified Font.

+
    +
  • Stages are Separated in View
  • +
  • New Color Combination
  • +
  • Modified Font
  • +
  • Clean Layout
  • +
  • Buttons with New Colors
  • +
  • Full Screen View +
  • +
+
+
+
+
+
+ +
+
+
+
+

+ Kanban Group View
+

+ +
+

The Code Backend Theme V18 Gives You a Fully + Modified Kanban View and Kanban Group View. The Section Wise + Separated Stages give a Pleasant Experience And an Extraordinary + Design To Your Content Tiles, Making The Tiles Look Great. It + will Give You a Clean Layout with the New Color Combination and + a Modified Font.

+
    +
  • Stages are Separated in View
  • +
  • New Color Combination
  • +
  • Modified Font
  • +
  • Clean Layout
  • +
  • Buttons with New Colors
  • +
  • Full Screen View
  • +
+
+
+
+
+
+
+ +
+ +
+
+
+
+ +
+
+
+
+
+ +
+ +
+
+
+
+

+ Form View
+ + + + + + + +

+ +
+

Code Backend Theme Gives You The + Fully Modified Form View with a Full Screen Experience. + It will Give You a Clean Layout with the New Color + Combination and a Modified Font.

+
    +
  • Modified Form Style
  • +
  • New Style for Required Field
  • +
  • Full Screen Form View
  • +
  • New Chatter Style Under Form View
  • +
  • New Looks for Tabs
  • +
  • New Looks for Status Button
  • +
+
+
+
+
+
+ + + + + + + + +
+ + + + + + + + \ No newline at end of file diff --git a/code_backend_theme/static/description/screenshots/10.newlookoftabs.png b/code_backend_theme/static/description/screenshots/10.newlookoftabs.png new file mode 100644 index 0000000..a365ac4 Binary files /dev/null and b/code_backend_theme/static/description/screenshots/10.newlookoftabs.png differ diff --git a/code_backend_theme/static/description/screenshots/11.recruitment.png b/code_backend_theme/static/description/screenshots/11.recruitment.png new file mode 100644 index 0000000..cf5f0a4 Binary files /dev/null and b/code_backend_theme/static/description/screenshots/11.recruitment.png differ diff --git a/code_backend_theme/static/description/screenshots/12.saleskanban.png b/code_backend_theme/static/description/screenshots/12.saleskanban.png new file mode 100644 index 0000000..cd444ff Binary files /dev/null and b/code_backend_theme/static/description/screenshots/12.saleskanban.png differ diff --git a/code_backend_theme/static/description/screenshots/13.modified kanban employee (1).png b/code_backend_theme/static/description/screenshots/13.modified kanban employee (1).png new file mode 100644 index 0000000..3d30005 Binary files /dev/null and b/code_backend_theme/static/description/screenshots/13.modified kanban employee (1).png differ diff --git a/code_backend_theme/static/description/screenshots/13.modified kanban employee (2).png b/code_backend_theme/static/description/screenshots/13.modified kanban employee (2).png new file mode 100644 index 0000000..3d30005 Binary files /dev/null and b/code_backend_theme/static/description/screenshots/13.modified kanban employee (2).png differ diff --git a/code_backend_theme/static/description/screenshots/15.sidebarwithlistview.png b/code_backend_theme/static/description/screenshots/15.sidebarwithlistview.png new file mode 100644 index 0000000..a15a09f Binary files /dev/null and b/code_backend_theme/static/description/screenshots/15.sidebarwithlistview.png differ diff --git a/code_backend_theme/static/description/screenshots/16grapghview (1).png b/code_backend_theme/static/description/screenshots/16grapghview (1).png new file mode 100644 index 0000000..f30cacb Binary files /dev/null and b/code_backend_theme/static/description/screenshots/16grapghview (1).png differ diff --git a/code_backend_theme/static/description/screenshots/17.attendanceview.png b/code_backend_theme/static/description/screenshots/17.attendanceview.png new file mode 100644 index 0000000..93001bc Binary files /dev/null and b/code_backend_theme/static/description/screenshots/17.attendanceview.png differ diff --git a/code_backend_theme/static/description/screenshots/2.groupbyview.png b/code_backend_theme/static/description/screenshots/2.groupbyview.png new file mode 100644 index 0000000..babf27b Binary files /dev/null and b/code_backend_theme/static/description/screenshots/2.groupbyview.png differ diff --git a/code_backend_theme/static/description/screenshots/3.settings page.png b/code_backend_theme/static/description/screenshots/3.settings page.png new file mode 100644 index 0000000..ea62e8c Binary files /dev/null and b/code_backend_theme/static/description/screenshots/3.settings page.png differ diff --git a/code_backend_theme/static/description/screenshots/4.discusspage.png b/code_backend_theme/static/description/screenshots/4.discusspage.png new file mode 100644 index 0000000..c81b6bd Binary files /dev/null and b/code_backend_theme/static/description/screenshots/4.discusspage.png differ diff --git a/code_backend_theme/static/description/screenshots/5.productskanaban (2).png b/code_backend_theme/static/description/screenshots/5.productskanaban (2).png new file mode 100644 index 0000000..8305b92 Binary files /dev/null and b/code_backend_theme/static/description/screenshots/5.productskanaban (2).png differ diff --git a/code_backend_theme/static/description/screenshots/6.purchase view.png b/code_backend_theme/static/description/screenshots/6.purchase view.png new file mode 100644 index 0000000..140a74f Binary files /dev/null and b/code_backend_theme/static/description/screenshots/6.purchase view.png differ diff --git a/code_backend_theme/static/description/screenshots/7.productviewsmartbuttons.png b/code_backend_theme/static/description/screenshots/7.productviewsmartbuttons.png new file mode 100644 index 0000000..1f30fcf Binary files /dev/null and b/code_backend_theme/static/description/screenshots/7.productviewsmartbuttons.png differ diff --git a/code_backend_theme/static/description/screenshots/8error (1).png b/code_backend_theme/static/description/screenshots/8error (1).png new file mode 100644 index 0000000..447fa01 Binary files /dev/null and b/code_backend_theme/static/description/screenshots/8error (1).png differ diff --git a/code_backend_theme/static/description/screenshots/Form view.png b/code_backend_theme/static/description/screenshots/Form view.png new file mode 100644 index 0000000..b531c1b Binary files /dev/null and b/code_backend_theme/static/description/screenshots/Form view.png differ diff --git a/code_backend_theme/static/description/screenshots/all_screens.png b/code_backend_theme/static/description/screenshots/all_screens.png new file mode 100644 index 0000000..dda177c Binary files /dev/null and b/code_backend_theme/static/description/screenshots/all_screens.png differ diff --git a/code_backend_theme/static/description/screenshots/easily-access-menu.gif b/code_backend_theme/static/description/screenshots/easily-access-menu.gif new file mode 100644 index 0000000..08340f3 Binary files /dev/null and b/code_backend_theme/static/description/screenshots/easily-access-menu.gif differ diff --git a/code_backend_theme/static/description/screenshots/kanbangroupview.png b/code_backend_theme/static/description/screenshots/kanbangroupview.png new file mode 100644 index 0000000..0c0aea2 Binary files /dev/null and b/code_backend_theme/static/description/screenshots/kanbangroupview.png differ diff --git a/code_backend_theme/static/description/screenshots/listview.png b/code_backend_theme/static/description/screenshots/listview.png new file mode 100644 index 0000000..a816045 Binary files /dev/null and b/code_backend_theme/static/description/screenshots/listview.png differ diff --git a/code_backend_theme/static/description/screenshots/login.png b/code_backend_theme/static/description/screenshots/login.png new file mode 100644 index 0000000..cb6e824 Binary files /dev/null and b/code_backend_theme/static/description/screenshots/login.png differ diff --git a/code_backend_theme/static/description/screenshots/menu_focus.png b/code_backend_theme/static/description/screenshots/menu_focus.png new file mode 100644 index 0000000..dc7b00c Binary files /dev/null and b/code_backend_theme/static/description/screenshots/menu_focus.png differ diff --git a/code_backend_theme/static/description/screenshots/modal.png b/code_backend_theme/static/description/screenshots/modal.png new file mode 100644 index 0000000..b89e182 Binary files /dev/null and b/code_backend_theme/static/description/screenshots/modal.png differ diff --git a/code_backend_theme/static/description/screenshots/resp-gif.gif b/code_backend_theme/static/description/screenshots/resp-gif.gif new file mode 100644 index 0000000..f6939e0 Binary files /dev/null and b/code_backend_theme/static/description/screenshots/resp-gif.gif differ diff --git a/code_backend_theme/static/description/theme_screenshot.jpg b/code_backend_theme/static/description/theme_screenshot.jpg new file mode 100644 index 0000000..3f54bc8 Binary files /dev/null and b/code_backend_theme/static/description/theme_screenshot.jpg differ diff --git a/code_backend_theme/static/src/img/code_logo.png b/code_backend_theme/static/src/img/code_logo.png new file mode 100644 index 0000000..124152a Binary files /dev/null and b/code_backend_theme/static/src/img/code_logo.png differ diff --git a/code_backend_theme/static/src/img/icons/Attendances.png b/code_backend_theme/static/src/img/icons/Attendances.png new file mode 100644 index 0000000..6f2e83d Binary files /dev/null and b/code_backend_theme/static/src/img/icons/Attendances.png differ diff --git a/code_backend_theme/static/src/img/icons/CRM.png b/code_backend_theme/static/src/img/icons/CRM.png new file mode 100644 index 0000000..01e3261 Binary files /dev/null and b/code_backend_theme/static/src/img/icons/CRM.png differ diff --git a/code_backend_theme/static/src/img/icons/Calendar.png b/code_backend_theme/static/src/img/icons/Calendar.png new file mode 100644 index 0000000..bfa7e47 Binary files /dev/null and b/code_backend_theme/static/src/img/icons/Calendar.png differ diff --git a/code_backend_theme/static/src/img/icons/Contacts.png b/code_backend_theme/static/src/img/icons/Contacts.png new file mode 100644 index 0000000..5865350 Binary files /dev/null and b/code_backend_theme/static/src/img/icons/Contacts.png differ diff --git a/code_backend_theme/static/src/img/icons/Dashboards.png b/code_backend_theme/static/src/img/icons/Dashboards.png new file mode 100644 index 0000000..0ab4196 Binary files /dev/null and b/code_backend_theme/static/src/img/icons/Dashboards.png differ diff --git a/code_backend_theme/static/src/img/icons/Email Marketing.png b/code_backend_theme/static/src/img/icons/Email Marketing.png new file mode 100644 index 0000000..66c873a Binary files /dev/null and b/code_backend_theme/static/src/img/icons/Email Marketing.png differ diff --git a/code_backend_theme/static/src/img/icons/Employees.png b/code_backend_theme/static/src/img/icons/Employees.png new file mode 100644 index 0000000..85aff52 Binary files /dev/null and b/code_backend_theme/static/src/img/icons/Employees.png differ diff --git a/code_backend_theme/static/src/img/icons/Events.png b/code_backend_theme/static/src/img/icons/Events.png new file mode 100644 index 0000000..b0c5e71 Binary files /dev/null and b/code_backend_theme/static/src/img/icons/Events.png differ diff --git a/code_backend_theme/static/src/img/icons/Expenses.png b/code_backend_theme/static/src/img/icons/Expenses.png new file mode 100644 index 0000000..67406dd Binary files /dev/null and b/code_backend_theme/static/src/img/icons/Expenses.png differ diff --git a/code_backend_theme/static/src/img/icons/Fleet.png b/code_backend_theme/static/src/img/icons/Fleet.png new file mode 100644 index 0000000..422959b Binary files /dev/null and b/code_backend_theme/static/src/img/icons/Fleet.png differ diff --git a/code_backend_theme/static/src/img/icons/Inventory.png b/code_backend_theme/static/src/img/icons/Inventory.png new file mode 100644 index 0000000..5dd73dd Binary files /dev/null and b/code_backend_theme/static/src/img/icons/Inventory.png differ diff --git a/code_backend_theme/static/src/img/icons/Invoicing.png b/code_backend_theme/static/src/img/icons/Invoicing.png new file mode 100644 index 0000000..9be39f5 Binary files /dev/null and b/code_backend_theme/static/src/img/icons/Invoicing.png differ diff --git a/code_backend_theme/static/src/img/icons/Link Tracker.png b/code_backend_theme/static/src/img/icons/Link Tracker.png new file mode 100644 index 0000000..b468d30 Binary files /dev/null and b/code_backend_theme/static/src/img/icons/Link Tracker.png differ diff --git a/code_backend_theme/static/src/img/icons/Live Chat.png b/code_backend_theme/static/src/img/icons/Live Chat.png new file mode 100644 index 0000000..60a44e7 Binary files /dev/null and b/code_backend_theme/static/src/img/icons/Live Chat.png differ diff --git a/code_backend_theme/static/src/img/icons/Lunch.png b/code_backend_theme/static/src/img/icons/Lunch.png new file mode 100644 index 0000000..d8a2e95 Binary files /dev/null and b/code_backend_theme/static/src/img/icons/Lunch.png differ diff --git a/code_backend_theme/static/src/img/icons/Maintenance.png b/code_backend_theme/static/src/img/icons/Maintenance.png new file mode 100644 index 0000000..a0bb8a7 Binary files /dev/null and b/code_backend_theme/static/src/img/icons/Maintenance.png differ diff --git a/code_backend_theme/static/src/img/icons/Manufacturing.png b/code_backend_theme/static/src/img/icons/Manufacturing.png new file mode 100644 index 0000000..4b922f9 Binary files /dev/null and b/code_backend_theme/static/src/img/icons/Manufacturing.png differ diff --git a/code_backend_theme/static/src/img/icons/Members.png b/code_backend_theme/static/src/img/icons/Members.png new file mode 100644 index 0000000..c538782 Binary files /dev/null and b/code_backend_theme/static/src/img/icons/Members.png differ diff --git a/code_backend_theme/static/src/img/icons/Note.png b/code_backend_theme/static/src/img/icons/Note.png new file mode 100644 index 0000000..329f473 Binary files /dev/null and b/code_backend_theme/static/src/img/icons/Note.png differ diff --git a/code_backend_theme/static/src/img/icons/Point of Sale.png b/code_backend_theme/static/src/img/icons/Point of Sale.png new file mode 100644 index 0000000..bbdb5a1 Binary files /dev/null and b/code_backend_theme/static/src/img/icons/Point of Sale.png differ diff --git a/code_backend_theme/static/src/img/icons/Project.png b/code_backend_theme/static/src/img/icons/Project.png new file mode 100644 index 0000000..c22fe19 Binary files /dev/null and b/code_backend_theme/static/src/img/icons/Project.png differ diff --git a/code_backend_theme/static/src/img/icons/Purchase.png b/code_backend_theme/static/src/img/icons/Purchase.png new file mode 100644 index 0000000..457740d Binary files /dev/null and b/code_backend_theme/static/src/img/icons/Purchase.png differ diff --git a/code_backend_theme/static/src/img/icons/Recruitment.png b/code_backend_theme/static/src/img/icons/Recruitment.png new file mode 100644 index 0000000..b3a2dc7 Binary files /dev/null and b/code_backend_theme/static/src/img/icons/Recruitment.png differ diff --git a/code_backend_theme/static/src/img/icons/Repairs.png b/code_backend_theme/static/src/img/icons/Repairs.png new file mode 100644 index 0000000..0547711 Binary files /dev/null and b/code_backend_theme/static/src/img/icons/Repairs.png differ diff --git a/code_backend_theme/static/src/img/icons/SMS Marketing.png b/code_backend_theme/static/src/img/icons/SMS Marketing.png new file mode 100644 index 0000000..6b90e20 Binary files /dev/null and b/code_backend_theme/static/src/img/icons/SMS Marketing.png differ diff --git a/code_backend_theme/static/src/img/icons/Sales.png b/code_backend_theme/static/src/img/icons/Sales.png new file mode 100644 index 0000000..6259ec7 Binary files /dev/null and b/code_backend_theme/static/src/img/icons/Sales.png differ diff --git a/code_backend_theme/static/src/img/icons/Surveys.png b/code_backend_theme/static/src/img/icons/Surveys.png new file mode 100644 index 0000000..f422f46 Binary files /dev/null and b/code_backend_theme/static/src/img/icons/Surveys.png differ diff --git a/code_backend_theme/static/src/img/icons/Time Off.png b/code_backend_theme/static/src/img/icons/Time Off.png new file mode 100644 index 0000000..c34cde4 Binary files /dev/null and b/code_backend_theme/static/src/img/icons/Time Off.png differ diff --git a/code_backend_theme/static/src/img/icons/Timesheets.png b/code_backend_theme/static/src/img/icons/Timesheets.png new file mode 100644 index 0000000..3c552b3 Binary files /dev/null and b/code_backend_theme/static/src/img/icons/Timesheets.png differ diff --git a/code_backend_theme/static/src/img/icons/Website.png b/code_backend_theme/static/src/img/icons/Website.png new file mode 100644 index 0000000..cd10570 Binary files /dev/null and b/code_backend_theme/static/src/img/icons/Website.png differ diff --git a/code_backend_theme/static/src/img/icons/apps.png b/code_backend_theme/static/src/img/icons/apps.png new file mode 100644 index 0000000..ce5cf33 Binary files /dev/null and b/code_backend_theme/static/src/img/icons/apps.png differ diff --git a/code_backend_theme/static/src/img/icons/close.png b/code_backend_theme/static/src/img/icons/close.png new file mode 100644 index 0000000..c6ea25f Binary files /dev/null and b/code_backend_theme/static/src/img/icons/close.png differ diff --git a/code_backend_theme/static/src/img/icons/discuss.png b/code_backend_theme/static/src/img/icons/discuss.png new file mode 100644 index 0000000..382b72f Binary files /dev/null and b/code_backend_theme/static/src/img/icons/discuss.png differ diff --git a/code_backend_theme/static/src/img/icons/eLearning.png b/code_backend_theme/static/src/img/icons/eLearning.png new file mode 100644 index 0000000..e0cd5c2 Binary files /dev/null and b/code_backend_theme/static/src/img/icons/eLearning.png differ diff --git a/code_backend_theme/static/src/img/icons/settings.png b/code_backend_theme/static/src/img/icons/settings.png new file mode 100644 index 0000000..7ff68e4 Binary files /dev/null and b/code_backend_theme/static/src/img/icons/settings.png differ diff --git a/code_backend_theme/static/src/js/fields/colors.js b/code_backend_theme/static/src/js/fields/colors.js new file mode 100644 index 0000000..176e029 --- /dev/null +++ b/code_backend_theme/static/src/js/fields/colors.js @@ -0,0 +1,11 @@ +/** @odoo-module **/ +import { getColor } from "@web/core/colors/colors"; + +// To change the default colours of odoo. +var code_backend_color = ["#556ee6", "#f1b44c", "#50a5f1", "#ffbb78", "#34c38f", + "#98df8a", "#d62728","#ff9896", "#9467bd", "#c5b0d5", "#8c564b", + "#c49c94", "#e377c2", "#f7b6d2","#7f7f7f", "#c7c7c7", "#bcbd22", + "#dbdb8d", "#17becf", "#9edae5"]; +for (let i=0;i { + const openSidebarElement = this.openElement.el + const closeSidebarElement = this.closeElement.el + const sidebarLinkElements = this.sidebarLinks.el.children; + if (sidebarLinkElements) { + Array.from(sidebarLinkElements).forEach(link => { + link.addEventListener('click', sidebarLinkHandler); + }); + } + if (openSidebarElement) { + openSidebarElement.addEventListener('click', openSidebarHandler); + } + if (closeSidebarElement) { + closeSidebarElement.addEventListener('click', closeSidebarHandler); + } + }); + + onWillUnmount(() => { + const openSidebarElement = this.openElement.el + const closeSidebarElement = this.closeElement.el + const sidebarLinkElements = this.sidebarLinks.el.children; + if (openSidebarElement) { + openSidebarElement.removeEventListener('click', openSidebarHandler); + } + if (closeSidebarElement) { + closeSidebarElement.removeEventListener('click', closeSidebarHandler); + } + if (sidebarLinkElements) { + Array.from(sidebarLinkElements).forEach(link => { + link.removeEventListener('click', sidebarLinkHandler); + }); + } + }); + }, + + openSidebar() { + this.root.el.nextElementSibling.style.marginLeft = '200px'; + this.root.el.nextElementSibling.style.transition = 'all .1s linear'; + const openSidebarElement = this.openElement.el + const closeSidebarElement = this.closeElement.el + if (openSidebarElement) openSidebarElement.style.display = 'none'; + if (closeSidebarElement) closeSidebarElement.style.display = 'block'; + if (this.root.el.lastChild && this.root.el.lastChild.nodeType === Node.ELEMENT_NODE) { + this.root.el.lastChild.style.display = 'block'; + } + if (this.topHeading.el && this.topHeading.el.nodeType === Node.ELEMENT_NODE) { + this.topHeading.el.style.marginLeft = '200px'; + this.topHeading.el.style.transition = 'all .1s linear'; + this.topHeading.el.style.width = 'auto'; + } + }, + + closeSidebar() { + console.log('Sidebar closed', this.topHeading); + this.root.el.nextElementSibling.style.marginLeft = '0px'; + this.root.el.nextElementSibling.style.transition = 'all .1s linear'; + const openSidebarElement = this.openElement.el + const closeSidebarElement = this.closeElement.el + if (openSidebarElement) openSidebarElement.style.display = 'block'; + if (closeSidebarElement) closeSidebarElement.style.display = 'none'; + if (this.root.el.lastChild && this.root.el.lastChild.nodeType === Node.ELEMENT_NODE) { + this.root.el.lastChild.style.display = 'none'; + } + if (this.topHeading.el && this.topHeading.el.nodeType === Node.ELEMENT_NODE) { + this.topHeading.el.style.marginLeft = '0px'; + this.topHeading.el.style.width = '100%'; + } + }, + + handleSidebarLinkClick(event) { + const closeSidebarElement = this.closeElement.el + if (closeSidebarElement) closeSidebarElement.style.display = 'none'; + if (this.topHeading.el && this.topHeading.el.nodeType === Node.ELEMENT_NODE) { + this.topHeading.el.style.marginLeft = '0px'; + } + if (this.topHeading.el && this.topHeading.el.nodeType === Node.ELEMENT_NODE) { + this.topHeading.el.style.marginLeft = '0px'; + this.topHeading.el.style.width = '100%'; + } + const li = event.currentTarget; + const a = li.firstElementChild; + const id = a.getAttribute('data-id'); + document.querySelector('header').className = id; + Array.from(this.sidebarLinks.el.children).forEach(li => { + li.firstElementChild.classList.remove('active'); + }); + a.classList.add('active'); + this.closeSidebar(); + } +}); \ No newline at end of file diff --git a/code_backend_theme/static/src/scss/datetimepicker.scss b/code_backend_theme/static/src/scss/datetimepicker.scss new file mode 100644 index 0000000..9eed96f --- /dev/null +++ b/code_backend_theme/static/src/scss/datetimepicker.scss @@ -0,0 +1,65 @@ +// Date time picker colour changes for the theme +.datepicker { + .table-sm { + > thead { + > tr > .prev { + color: #fff !important; + background-color: $primary_accent !important; + &:hover{ + background-color: darken($primary_accent, 10%) !important; + } + > .fa{ + color: #fff !important; + } + } + > tr > .next { + color: #fff !important; + background-color: $primary_accent !important; + &:hover{ + background-color: darken($primary_accent, 10%) !important; + } + > .fa{ + color: #fff !important; + } + } + > tr > .picker-switch { + color: #fff !important; + background-color: $primary_accent !important; + &:hover{ + background-color: darken($primary_accent, 10%) !important; + } + } + } + > tbody > tr > td { + &.today:before { + border-bottom-color: $primary_accent !important; + } + &.active { + background-color: $primary_accent !important; + } + } + } +} +.picker-switch { + span.fa { + margin: 0; + @include transition($btn-transition); + &.primary { + background-color: $primary_accent; + color: white; + &:hover { + background-color: darken($primary_accent, 20%); + } + } + } +} +.daterangepicker .drp-calendar .calendar-table thead tr:first-child { + color: #FFFFFF; + background-color: $primary_accent; +} +.daterangepicker .drp-calendar .calendar-table tbody tr td:not(.off).active, .daterangepicker .drp-calendar .calendar-table tbody tr td:not(.off).active:hover { + background-color: $primary_accent; +} +.daterangepicker .drp-calendar .calendar-table thead tr:first-child th.prev:hover, .daterangepicker .drp-calendar .calendar-table thead tr:first-child th.next:hover { + background-color: darken($primary_accent, 20%); +} diff --git a/code_backend_theme/static/src/scss/login.scss b/code_backend_theme/static/src/scss/login.scss new file mode 100644 index 0000000..c78b3ce --- /dev/null +++ b/code_backend_theme/static/src/scss/login.scss @@ -0,0 +1,140 @@ +#wrapwrap > main { + background: #f8f8fb; +} +body { + font-family: 'Poppins', sans-serif !important; +} +body.bg-100 { + background-color: #000000 !important; +} +.card.o_database_list { + align-items: center; + max-width: 450px !important +} +.card.o_database_list .card-body { + background-color: #fff !important; + border-radius: 5px !important; + -webkit-box-shadow: 0 0.75rem 1.5rem rgba(18,38,63,.03) !important; + box-shadow: 0 0.75rem 1.5rem rgba(18,38,63, .03) !important; +} +a { + color: #556ee6; + text-decoration: none; +} +a:hover { + color: #4458b8; + text-decoration: underline; +} +.alert-info { + color: #306391; + background-color: #dcedfc; + border-color: #cbe4fb; +} +.oe_login_form button.btn-link { + color: #495057; + font-weight: 500; + font-size: 14px !important; +} +.oe_login_form button.btn-link:hover { + color: #171a1c; +} +// Login button starts +.btn-primary { + color: #fff; + background-color: #556ee6; + border-color: #556ee6; +} +.btn-primary:hover { + color: #fff; + background-color: #485ec4; + border-color: #4458b8; +} +.btn-check:active+.btn-primary, +.btn-check:checked+.btn-primary, +.btn-primary.active,.btn-primary:active, +.show>.btn-primary.dropdown-toggle { + color: #fff; + background-color: #4458b8 !important; + border-color: #4053ad !important; +} +.btn-check:focus+.btn-primary, .btn-primary:focus { + color: #fff; + background-color: #485ec4 !important; + border-color: #4458b8 !important; + -webkit-box-shadow: 0 0 0 .15rem rgba(111,132,234,.5) !important; + box-shadow: 0 0 0 .15rem rgba(111,132,234,.5) !important; +} +.oe_login_form .btn { + display: inline-block; + cursor: pointer; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + padding: .47rem .75rem; + border-radius: .25rem; + -webkit-transition: color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,-webkit-box-shadow .15s ease-in-out; + transition: color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,-webkit-box-shadow .15s ease-in-out; + transition: color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out; + transition: color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-box-shadow .15s ease-in-out; +} +.btn-secondary { + color: #fff !important; + background-color: #74788d !important; + border-color: #74788d !important; +} +.btn-secondary:hover { + color: #fff !important; + background-color: #636678 !important; + border-color: #5d6071 !important; +} +.btn-secondary:active { + color: #fff; + background-color: #5d6071 !important; + border-color: #575a6a !important; +} +.btn-secondary i,.btn-secondary span { + color: #fff !important; +} +.btn-fill-secondary:focus, .btn-secondary:focus, .btn-fill-secondary.focus, .focus.btn-secondary { + box-shadow: none !important; +} +// Login button ends + +// Input starts +.oe_login_form input { + display: block; + width: 100%; + height: 40px !important; + padding: 10px 20px; + font-size: 13px; + font-weight: 400; + line-height: 1.5; + color: #495057; + background-color: #fff; + background-clip: padding-box; + border: 1px solid #ced4da !important; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + border-radius: .25rem; + -webkit-transition: border-color .15s ease-in-out,-webkit-box-shadow .15s ease-in-out; + transition: border-color .15s ease-in-out,-webkit-box-shadow .15s ease-in-out; + transition: border-color .15s ease-in-out,box-shadow .15s ease-in-out; + transition: border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-box-shadow .15s ease-in-out; + box-shadow: none !important; + margin-bottom:10px !important; +} +form label { + font-weight: 400 !important; +} +.oe_login_form a.btn.btn-secondary { + height: 40px; + display: flex; + align-items: center; + justify-content: space-between; + padding: 0.35rem 0.75rem; +} +.oe_login_form a.btn.btn-secondary i.fa.fa-database { + margin-left: 5px; +} diff --git a/code_backend_theme/static/src/scss/navigation_bar.scss b/code_backend_theme/static/src/scss/navigation_bar.scss new file mode 100644 index 0000000..59c6c1c --- /dev/null +++ b/code_backend_theme/static/src/scss/navigation_bar.scss @@ -0,0 +1,324 @@ +.o_form_statusbar{ + .o_statusbar_buttons{ + .btn{ + margin-right: 30px !important; + } + } +} +.o_cp_left{ + .btn{ + margin-right: 30px !important; + } +} +.o_calendar_buttons > button > .fa{ +color: #ffffff !important; +} +.o_main_navbar, .btn-primary, .btn-primary:active, .o_searchview_facet_label { + background-color: $primary_accent !important; + color: $inverse_accent !important; +} +.o_search_panel_section_icon { + color: $primary_accent !important; +} +.btn-secondary { + border-radius: 0; + border: solid 1px $primary_accent !important; + color: $primary_accent !important; +}o_list_table +.o_list_view .o_list_table thead { + position: sticky; + top: 0; +} +.breadcrumb-item > a, .o_menu_item > a { + color: $primary_accent !important; +} +.fa-trash { + color: #f46a6a !important; +} +.o_main_navbar > a:hover { + background-color: lighten($primary_accent, 10%) !important; +} +.o_main_navbar > .o_menu_sections > li > a:hover, .o_main_navbar > .o_menu_systray > li > a:hover, .o_main_navbar > .o_menu_sections > li.show > a, .o_main_navbar > .o_menu_systray > li.show > a { + background-color: lighten($primary_accent, 10%) !important; +} +.o_main_navbar > .o_menu_apps > li > a:hover, .o_main_navbar > .o_menu_apps > li > a:active { + background-color: lighten($primary_accent, 10%) !important; +} +.o_main_navbar > .o_menu_apps > .dropdown.show > .dropdown-menu.show { + max-height: 100vh !important; + height: 93vh !important; +} +.o_mail_discuss_sidebar { + background-color: #1c2833; +} +.dropdown-toggle:after { + background-color: lighten($primary_accent, 10%) !important; +} +.o_external_button { + border: none !important; +} +.o_field_x2many_list_row_add > a { + color: $primary_accent !important; +} +.nav-item > a { + color: $primary_accent !important; +} +.o_main_navbar > .o_menu_apps > li > a > i { + color: $inverse_accent !important; + font-size: 16px !important; +} +.o_form_uri > span { + color: $primary_accent !important; +} +.o_required_modifier.o_input { + background-color: $inverse_accent !important; + color: $primary_accent !important; + border-left: solid 3px #f46a6a !important; +} +.o_input { + border: solid 1px $primary_accent !important; + color: $primary_accent !important; +} +.o-no-caret > i, button[aria-pressed=true] { + color: $inverse_accent !important; +} +.o_loading { + background-color: $primary_accent; +} +.fas { + color: $inverse_accent !important; +} +.dashboard_mainbar { + width: 100%; +} +.a_app_menu_title { + display: none; +} +.o_menu_apps > .dropdown.show > .dropdown-menu.show:hover .a_app_menu_title { + display: inline-block; + width: 200px; +} +.o_required_modifier.o_input, .o_required_modifier.o_input { + background-color: $inverse_accent !important; + color: $primary_accent !important; + border-left: solid 3px #f46a6a !important; +} +.o_required_modifier .o_input, .o_required_modifier .o_input { + background-color: $inverse_accent !important; +} +.dropdown-toggle:after { + background-color: #ffffff00 !important; +} +.o_required_modifier > .o_input_dropdown > .ui-autocomplete-input { + background-color: $inverse_accent !important; + color: $primary_accent !important; + border-left: solid 3px #f46a6a !important; +} +.o_datepicker.o_field_date.o_field_widget.o_required_modifier > input { + background-color: $inverse_accent !important; + color: $primary_accent !important; + border-left: solid 3px #f46a6a !important; +} +.ui-state-active { + background-color: $primary_accent !important; + color: $inverse_accent !important; +} +.oe_search_bgnd { + background-color: lighten($primary_accent, 20%) !important; + color: $inverse_accent !important; +} +.oe_search_tab { + background-color: $primary_accent !important; + color: $inverse_accent !important; +} +.o_horizontal_separator { + color: $primary_accent !important +} +.o_field_widget.o_field_image .o_form_image_controls { + background-color: $primary_accent !important; +} +.o_field_widget.o_field_image .o_form_image_controls > button { + color: $inverse_accent !important; +} +.dropdown-item.o_app.mt0:hover , .dropdown-item.o_app.mt0:hover > .a_app_menu_title{ +background-color: $primary_accent !important; +color: $inverse_accent !important; +} +div.o_boolean_toggle.custom-control.custom-checkbox > input.custom-control-input:checked + label.custom-control-label::before { +background-color: $primary_accent !important; +} +div.o_boolean_toggle.custom-control.custom-checkbox > input.custom-control-input:checked + label.custom-control-label::before { +background-color: $primary_accent !important; +} +.o_mail_systray_item .o_mail_systray_dropdown .o_mail_systray_dropdown_top .o_filter_button.active { +color: $primary_accent; +text-decoration: none; +} +.o_mail_user_status.o_user_online { +color: #fff !important; +} +.o_form_view .o_form_statusbar > .o_statusbar_status > .o_arrow_button.btn-primary.disabled::after { + border-left-color: $primary_accent; +} +.btn-link { +font-weight: 400; +color: $primary_accent !important; +text-decoration: none; +} +.o_thread_window_header { +background-color: $primary_accent !important; +} +.o_thread_window_close,.o_thread_window_expand{ +color: $inverse_accent !important; +} +.o_menu_sections, .o_menu_systray, .o_web_client > header{ +background: $primary_accent !important; +} +.fa-building-o{ +color: white !important; +} +.o_button_import, .oe_import_file{ +background: #5aa29f !important; +color: white !important; +border: solid 2px #5aa29f !important; +} +.o_button_import:hover, .oe_import_file:hover,.o_button_import:active, .oe_import_file:active{ +background: white !important; +color: #5aa29f !important; +border: solid 2px #5aa29f !important; +} +.o_form_button_save,.o_form_button_edit{ +background: #7BA94F !important; +color: white !important; +border: solid 2px #7BA94F !important; +} +.o_form_button_save:hover,.o_form_button_edit:hover,.o_form_button_save:active,.o_form_button_edit:active{ +background: white !important; +color: #7BA94F !important; +border: solid 2px #7BA94F !important; +} +.o-kanban-button-new, .o_list_button_add,.o_form_button_create{ +background: #b9408d !important; +color: white !important; +border: solid 2px #b9408d !important; +} +.o-kanban-button-new:hover, .o_list_button_add:hover,.o_form_button_create:hover,.o-kanban-button-new:active, .o_list_button_add:active,.o_form_button_create:active{ +background: white !important; +color: #b9408d !important; +border: solid 2px #b9408d !important; +} +.o_form_button_cancel,.o_import_cancel{ +background: #cf4137 !important; +color: white !important; +border: solid 2px #cf4137 !important; +} +.o_form_button_cancel:hover,.o_import_cancel:hover,.o_form_button_cancel:active,.o_import_cancel:active{ +background: white !important; +color: #cf4137 !important; +border: solid 2px #cf4137 !important; +} +.report_button{ +border-radius: 0 !important; +border: solid 2px $primary_accent; +background: $primary_accent !important; +} +.report_button:hover,.report_button:active{ +border-radius: 0 !important; +border: solid 2px $primary_accent !important; +color: $primary_accent !important; +background: $inverse_accent !important; +} +.btn-primary{ +border-radius: 0 !important; +} +.nav-tabs .nav-link.active, .nav-tabs .nav-item.show .nav-link{ +border: none; +border-bottom: solid; +font-weight: bold; +} +.o_data_row:has(.custom-control-input:checked){ +background: blue !important; +} +.o_field_one2many{ + .o_list_view{ + .table-responsive{ + max-height:50vh; + } + } +} +thead { +position: sticky; +position: -webkit-sticky; +top: 0; +} +.o_list_view .o_list_table tbody{ + position: sticky; + top: 30px; +} +.o_list_view{ + .o_list_table{ + thead{ + z-index:999; + } + } +} +.o_list_view .table-responsive .table{ + width: max-content !important; + min-width: 100%; + thead + { + z-index:999; + tr:nth-child(1) th{ + position: sticky; + top: 0; + z-index: 999; + background-color: #eeeeee !important; + } + } +} +.o_list_view .o_list_table tbody{ +position:initial !important; +} +.o_list_view .table-responsive .table thead{ +z-index: 1; +} +.o_optional_columns_dropdown_toggle{ +z-index: 999; +} +.o_home_menu_background:not(.o_home_menu_background_custom) .o_main_navbar{ + max-height:100px; +} +.o_progressbar .o_progress .o_progressbar_complete { +background-color: #3d9bbb; +} +.o_cp_left .btn { + margin-right: 10px !important; +} +.o_main_navbar .o_menu_sections { + flex-wrap: wrap !important; +} +.o_section_and_note_list_view{ + width:98%; +} +.o_list_renderer{ + margin-left: 21px; +} +.o_notebook .nav{ + background: none; +} +.o-form-buttonbox{ + margin-left:-15px; + margin-right:-15px; +} +.o-mail-DiscussSystray-class > button { + color: black !important; +} +.o_menu_systray > button { + color: black !important; +} +.o_debug_manager > button{ + color: black !important; +} +.o_menu_sections_more > button{ + color: black !important; +} \ No newline at end of file diff --git a/code_backend_theme/static/src/scss/sidebar.scss b/code_backend_theme/static/src/scss/sidebar.scss new file mode 100644 index 0000000..b3bb89e --- /dev/null +++ b/code_backend_theme/static/src/scss/sidebar.scss @@ -0,0 +1,92 @@ +#sidebar_panel { + height: calc(100% - 0%); + position: fixed; + top: 0px; + background-color: #2a3042; + display: none; + width: 200px; + overflow-y: scroll; + -ms-overflow-style: none; /* Hide scrollbar for IE and Edge */ + scrollbar-width: none; /* Hide scrollbar for Firefox */ + z-index: 999; +} +#sidebar_panel::-webkit-scrollbar { + display: none; /* Hide scrollbar for Chrome, Safari and Opera */ +} +.sidebar_panel .sidebar { + padding: 0; + white-space: nowrap; + padding-bottom: 20px; + padding-top: 5px; +} +.sidebar_panel .sidebar_close { + text-align: end; + display: none; + position: sticky; + height: 35px; + padding-top: 5px; + top: 0; + background: #2a3042; + z-index: 1; +} +.sidebar_panel .sidebar_close a#closeSidebar { + font-size: 18px; + margin-right: 10px; + color: #ffffff; + opacity: .3; +} +.sidebar_panel .sidebar_close a#closeSidebar img { + width: 15px; +} +.sidebar_panel .sidebar .sidebar_logo { + padding-top: 20px; + text-align: center; + padding-bottom: 20px; +} +.sidebar_panel .sidebar .sidebar_logo img { + max-width: 150px; +} +.sidebar_panel .sidebar .sidebar_head { + padding-top: 20px; + padding-left: 15px; + color: #6a7187; + font-size: 14px; +} +.sidebar_panel .sidebar .sidebar_menu { + list-style: none; + margin: 0; + padding: 0; +} +.sidebar_panel .sidebar .sidebar_menu li { + margin: 0; + padding: 0; + border: 0px; + display: block; +} +.sidebar_panel .sidebar .sidebar_menu li a { + margin: 0; + border: 0px; + display: block; + cursor: pointer; + overflow: hidden; + padding: 8px 10px 8px 25px; + color: #ffffff; + font-size: 13px; + transition:.3s all; +} +.sidebar_panel .sidebar .sidebar_menu li:hover a { + background: #1e2230; + color: #fff; +} +.sidebar_panel .nav-link { + opacity: .5; + transition:.3s all; +} +.sidebar_panel .sidebar a.nav-link.active { + color: #fff !important; + opacity: 1; +} +.sidebar_panel .sidebar .sidebar_menu li a .sidebar_img { + width: 20px; + margin-right: 8px; +} diff --git a/code_backend_theme/static/src/scss/theme.scss b/code_backend_theme/static/src/scss/theme.scss new file mode 100644 index 0000000..9b525fc --- /dev/null +++ b/code_backend_theme/static/src/scss/theme.scss @@ -0,0 +1,1692 @@ +//Top Bar +@font-face { + font-family: 'Poppins' !important; + src: url('https://fonts.googleapis.com/css2?family=Poppins:wght@400;600&display=swap'); +} +body { + font-family: 'Poppins', sans-serif !important; + background-color: #f8f8fb; +} +a { + color: $primary_accent; +} +a:hover { + color: $primary_hover; +} +a.btn { + height: auto !important; +} +.o_main_navbar, .o_searchview_facet_label { + background-color: transparent !important; + color: $f_color !important; + border:1px !important; +} +.o_menu_sections, .o_menu_systray, .o_web_client > header{ + background: $bg_white !important; +} +.oe_topbar_name { + color: $f_color !important; +} +.o_main_navbar > .o_menu_apps > li > a > i { + color: $f_color !important; + font-size: 16px !important; +} +.o_main_navbar { + align-items: center; + border-bottom: 0px solid #5f5e97 !important; + -webkit-box-shadow: 0 0.75rem 1.5rem rgba(18,38,63,.03) !important; + box-shadow: 0 0.75rem 1.5rem rgba(18,38,63,.03) !important; + background-color: #fff !important; +} +.top_heading { + display: flex; + justify-content: flex-start; + align-items: center; + width: 100%; +} +.top_heading ul { + margin-bottom: 0 !important; +} +.top_heading > a { + margin-left: 10px; + font-size: 20px; +} +.top_heading li { + list-style: none; +} +.o-no-caret > i, button[aria-pressed="true"] { + color: $f_color !important; +} +.o_main_navbar > ul > li > a, .o_main_navbar > ul > li > label { + height: 46px; + padding: 0 5px; + color: $f_color !important; + line-height: 46px; +} +.o_main_navbar > .o_menu_sections > li > a:hover, +.o_main_navbar > .o_menu_systray > li > a:hover, +.o_main_navbar > .o_menu_sections > li.show > a, +.o_main_navbar > .o_menu_systray > li.show > a { + background-color: $bg_white !important; +} +.topbar_icon .fa { + color: #555b6d !important; + font-size: 20px !important +} +.o_main_navbar .o_user_menu .oe_topbar_avatar { + height: 35px; + width: 35px; +} +.o_MessagingMenu_counter { + background-color: #556ee6; + color: #fff !important; +} +.o_mail_systray_item .o_notification_counter { + background: #556ee6 !important; +} +.o_control_panel { + background: #f8f8fb !important; + border:none !important; +} +.o_facet_remove.oi.oi-close.btn.btn-link{ + margin-top: -10px; + margin-right: -5px !important; +} +.js_quantity.form-control.quantity.text-center{ + height:3.4rem !important; +} +.o_searchview { + border: 1px solid #ddd; + padding-left: 12px; + padding-right: 20px; + -webkit-box-shadow: none; + box-shadow: none; + border-radius: 5px; + padding-top: 6px; + height: 43px; +} +.o_searchview .o_searchview_facet { + border: 1px solid #ddd; + background: #f8f8fb; + border-radius: 10px; + padding: 0 2px; + max-height:30px; +} +.o_cp_bottom_right span.o_dropdown_title { + color: #555b6d; +} +.o_cp_bottom_left .o_form_button_cancel { + margin-right: 5px !important; + padding: 6px 8px !important; + color: #fff !important; + background-color: #f46a6a !important; + border-color: #f46a6a !important; +} +.o_cp_bottom_left .o_form_button_cancel:hover { + background-color: #cf5a5a !important; + border-color: #c35555 !important; +} +.o_control_panel { + border-bottom: none important; + margin: 15px 15px 0 15px; + background-color: #ffffff !important; + -webkit-box-shadow: 0 0.75rem 1.5rem rgba(18,38,63,.03) !important; + box-shadow: 0 0.75rem 1.5rem rgba(18,38,63, .03) !important; + border-radius: 5px; +} +.o_form_view, +.o_widget_Discuss { + background: #f8f8fb; +} +.o_form_statusbar .o_statusbar_buttons .btn { + margin-right: 15px !important; +} +.o_form_view .o_form_statusbar > .o_statusbar_status > .o_arrow_button:not(:first-child):before, .o_form_view .o_form_statusbar > .o_statusbar_status > .o_arrow_button:not(:first-child):after { + border-top: 21px solid transparent !important; + border-bottom: 17px solid transparent !important; +} +.o_form_view .o_form_statusbar > .o_statusbar_status > .o_arrow_button:not(:first-child):before { + right: -11px; + border-left-color: $primary_accent; +} +// Top Bar End + +// Button +.btn { + display: inline-block; + font-weight: 400 !important; + line-height: 1.5 !important; + color: #495057; + text-align: center; + vertical-align: middle; + cursor: pointer; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + background-color: transparent; + border: 1px solid transparent; + padding: 6px 15px !important; + border-radius: 4px !important; + -webkit-transition: color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,-webkit-box-shadow .15s ease-in-out; + transition: color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,-webkit-box-shadow .15s ease-in-out; + transition: color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out; + transition: color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-box-shadow .15s ease-in-out; + height: 40px !important; + margin-bottom: 2px; +} +.btn-primary { + color: #fff !important; + background-color: $primary_accent !important; + border-color: $primary_accent !important; +} +.btn-primary:hover { + color: #fff !important; + background-color: $primary_hover !important; + border-color: #4458b8 !important; +} +.btn-primary:active { + color: #fff !important; + background-color: #4458b8 !important; + border-color: #4053ad !important; +} +.btn-check:focus+.btn-primary, .btn-primary:focus { + color: #fff; + background-color: #485ec4 !important; + border-color: #4458b8 !important; + -webkit-box-shadow: 0 0 0 .15rem rgba(111,132,234,.5) !important; + box-shadow: 0 0 0 .15rem rgba(111,132,234,.5) !important; +} +.btn-primary i,.btn-primary span { + color: #fff !important; +} +.btn-secondary { + color: #fff !important; + background-color: #74788d !important; + border-color: #74788d !important; +} +.btn-secondary:hover { + color: #fff !important; + background-color: #636678 !important; + border-color: #5d6071 !important; +} +.btn-secondary:active { + color: #fff; + background-color: #5d6071 !important; + border-color: #575a6a !important; +} +.btn-check:focus+.btn-secondary, .btn-secondary:focus { + color: #fff; + background-color: #636678 !important; + border-color: #5d6071 !important; + -webkit-box-shadow: 0 0 0 .15rem rgba(137,140,158,.5) !important; + box-shadow: 0 0 0 .15rem rgba(137,140,158,.5) !important; +} +.btn-secondary i,.btn-secondary span { + color: #fff !important; +} +.btn-info { + color: #fff !important; + background-color: #50a5f1 !important; + border-color: #50a5f1 !important; +} +.btn-info:hover { + color: #fff !important; + background-color: #448ccd !important; + border-color: #4084c1 !important; +} +button[name="action_cancel"], +button[name="button_cancel"], +button[special="cancel"] { + color: #fff !important; + background-color: #f46a6a !important; + border-color: #f46a6a !important; +} +button[name="action_cancel"]:hover, +button[name="button_cancel"]:hover, +button[special="cancel"]:hover { + background-color: #cf5a5a !important; + border-color: #c35555 !important; +} +button[name="action_cancel"]:active, +button[name="button_cancel"]:active, +button[special="cancel"]:active { + color: #fff !important; + background-color: #c35555 !important; + border-color: #b75050 !important; +} +button[name="action_cancel"]:focus, +button[name="button_cancel"]:focus, +button[special="cancel"]:focus { + color: #fff !important; + background-color: #cf5a5a !important; + border-color: #c35555 !important; + -webkit-box-shadow: 0 0 0 0.15rem rgba(246,128,128,.50) !important; + box-shadow: 0 0 0 0.15rem rgba(246,128,128,.50) !important; +} +button[name="update_module"] { + margin-right: 2px; +} +.btn-warning, +button[name="action_uninstall"] { + color: #fff !important; + background-color: #f1b44c !important; + border-color: #f1b44c !important; +} +.btn-warning:hover, +button[name="action_uninstall"]:hover { + color: #fff !important; + background-color: #cd9941 !important; + border-color: #c1903d !important; +} +.btn-warning:active, +button[name="action_uninstall"]:active { + color: #fff !important; + background-color: #c1903d !important; + border-color: #b58739 !important; +} +.btn-warning:focus, +button[name="action_uninstall"]:focus { + color: #fff !important; + background-color: #cd9941 !important; + border-color: #c1903d !important; + -webkit-box-shadow: 0 0 0 0.15rem rgba(243,191,103,.50) !important; + box-shadow: 0 0 0 0.15rem rgba(243,191,1,.50) !important; +} + +.o_statusbar_status .o_arrow_button.btn-secondary { + border: solid 1px #556ee6 !important; + color: #556ee6 !important; + background-color: #fff !important; +} +.o_statusbar_status .o_arrow_button.btn-secondary:hover:after { + border-color: #fff !important; +} +.o_statusbar_status .o_arrow_button.btn-primary { + border: solid 1px #556ee6 !important; + color: #fff !important; +} +.o_cp_bottom_right .btn-secondary { + background: #fff; + border-color: #dddddd !important; + margin-right: 5px !important; + padding : 6px 8px !important; +} +.o_cp_bottom_left .o_form_button_create { + color: #fff !important; + background-color: #74788d !important; + border-color: #74788d !important; + padding: 5px 15px !important; +} +.o_web_settings_invite { + margin-left: 7px; + position: relative; + top: -1px; +} +.o_form_view .oe_button_box .btn.oe_stat_button { + height: 44px !important; + opacity: 1 !important; + border-radius: 0px !important; +} +.oe_module_action .btn { + height: auto !important; +} +.o_cp_buttons a.btn { + display: flex !important; + align-items: center; +} +button.fa.fa-external-link.btn.btn-secondary.o_external_button { + padding: 2px !important; + color: #74788d !important; + background: none !important; +} +.o_statusbar_status.o_field_widget.o_readonly_modifier .btn { + margin-right: 0 !important; +} +.btn-group .btn { + margin-right: 3px; +} +.o_Composer_actionButton.o-last.o-has-current-partner-avatar.o-composer-is-compact { + height: 48px !important; + border-bottom-left-radius: 0px !important; + border-top-left-radius: 0px !important; +} +.oe_right .btn { + margin-left: 2px; +} +//Button End + +// Table +.table-sm th, .table-sm td { + padding: 0.5rem; +} +tr.o_data_row { + font-size: 15px; +} +.o_list_view .table-responsive .table thead tr:nth-child(1) th { + position: sticky; + top: 0; + z-index: 999; + background-color: #ffffff !important; +} +th.o_list_record_selector { + color: #495057 !important; + border-color: #eff2f7 !important; + background-color: #f8f9fa !important; +} +.table>:not(caption)>*>* { + padding: 1rem 1rem; + background-color: var(--bs-table-bg); + border-bottom-width: 1px; + -webkit-box-shadow: inset 0 0 0 9999px var(--bs-table-accent-bg); + box-shadow: inset 0 0 0 9999px var(--bs-table-accent-bg); +} +.o_list_view .o_list_table thead > tr > th:not(.o_list_record_selector).o_list_number_th { + text-align: left !important; +} +.o_list_view .o_list_table thead > tr > th:not(.o_list_record_selector) { + border-left: none !important; +} +.table thead th { + vertical-align: bottom; + border-bottom: none; +} +.table th { + border-top: 1px solid #fff !important; +} +.o_list_view .o_list_table tfoot { + background-color: #fff !important; +} +.o_list_view .table-responsive .o_list_table tfoot tr:nth-child(1) td { + background-color: #fff !important; +} +.o_list_view .o_list_table tr:focus-within, +.o_list_view .o_list_table.table-striped tr:focus-within { + background-color: #fff !important; +} +// Table End + +// Checkbox +.custom-checkbox label { + position: relative; + cursor: pointer; +} +.custom-checkbox label:before { + content:''; + -webkit-appearance: none; + background-color: transparent; + border: 1px solid #0079bf; + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05), inset 0px -15px 10px -12px rgba(0, 0, 0, 0.05); + padding: 10px; + display: inline-block; + position: relative; + vertical-align: middle; + cursor: pointer; + margin-right: 5px; + margin-top: 0px; +} +.custom-checkbox input:checked + label:after { + content: ''; + display: block; + position: absolute; + top: 2px; + left: 9px; + width: 6px; + height: 14px; + border: solid #0079bf; + border-width: 0 2px 2px 0; + transform: rotate(45deg); +} +.custom-checkbox label::before { + content: ''; + -webkit--webkit-appearance: none; + -moz-appearance: none; + appearance: none; + background-color: transparent; + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05), inset 0px -15px 10px -12px rgba(0, 0, 0, 0.05); + padding: 10px; + display: inline-block; + position: relative; + vertical-align: middle; + cursor: pointer; + margin-right: 5px; +} +.custom-control-label::before { + position: absolute; + top: 0px !important; + left: 1px !important; + display: block; + width: 1rem; + height: 1rem; + pointer-events: none; + content: ""; + background-color: #FFFFFF; + border: 1px solid rgba(0,0,0,.25) !important; + box-shadow: none !important; + border-radius: 5 !important; + margin-top: -5px; +} +.custom-checkbox { + padding-left: 0rem !important; +} +.custom-checkbox .custom-control-input:disabled:checked ~ .custom-control-label::before { + background-color: $primary_accent; +} +.custom-checkbox input:checked + label::after { + content: ''; + display: block; + position: absolute; + top: 1px; + left: 9px; + width: 6px; + height: 14px; + border: solid #fff; + border-width: 0 2px 2px 0; + transform: rotate(45deg); +} +.dropdown-item .custom-checkbox input:checked + label::after { + content: ''; + display: block; + position: absolute; + top: 1px; + left: 19px; + width: 6px; + height: 14px; + border: solid #fff; + border-width: 0 2px 2px 0; + transform: rotate(45deg); +} +.custom-control-input:checked ~ .custom-control-label::before { + color: #ffffff; + background-color: #556ee6; + border-color: #556ee6; +} +.custom-control.custom-checkbox .custom-control-input:not(:checked):not(:indeterminate) ~ .custom-control-label:before { + background: none; + outline: none !important; +} +.o_list_selection_box { + display: inline-block; + padding: 0.375rem 0.75rem; + vertical-align: middle; + border: 1px solid rgba(85,110,230,.25)!important; + background-color: rgba(85,110,230,.25)!important; + color: $primary_accent !important; + border-radius: 5px; +} +.o_radio_input + .custom-control-label::before { + position: absolute !important; + top: 8.5px !important; + left: -1.5rem !important; + display: block !important; + width: 1rem !important; + height: 1rem !important; + pointer-events: none !important; + content: "" !important; + background-color: #FFFFFF !important; + border: #adb5bd solid 1px !important; +} +.custom-radio .custom-control-input:checked ~ .custom-control-label::after { + background: $primary_accent !important; + border-radius: 30px; +} +.o_form_view .o_form_statusbar { + position: relative; + display: -webkit-box; + display: -webkit-flex; + display: flex; + justify-content: space-between; + padding-left: 5px; + border-bottom: none !important; + background-color: white; + border-radius: 5px; +} +.o_required_modifier > .o_input_dropdown > .ui-autocomplete-input { + border-left: solid 3px #f46a6a !important; +} +.fa-building-o { + color: #555b6d !important; +} +// Sheet end + +//Discuss +.o_Discuss { + padding: 15px !important; + background: #f5f5f9 !important; +} +.o_Discuss .o_DiscussSidebar { + background-color: #ffffff !important; + color: #dee2e6 !important; + border-radius: 5px; + margin-right: 10px !important; + -webkit-box-shadow: 0 0.75rem 1.5rem rgba(18,38,63,.03) !important; + box-shadow: 0 0.75rem 1.5rem rgba(18,38,63, .03) !important; +} +.o_DiscussSidebar_item.o-active { + color: #f46a6a !important; + font-weight: 500 !important; +} +.o_DiscussSidebarItem:hover { + background: none !important; +} +.o_DiscussSidebarItem { + cursor: pointer !important; + color: #74788d !important; + line-height: 24px !important; + padding: 10px 5px !important; +} +.o_DiscussSidebarItem_activeIndicator.o-item-active { + background: none !important; +} +.o_DiscussSidebar_item.o-active .fa { + color: #f46a6a !important; +} +.o_widget_Discuss .o_Discuss_content { + border-top: none !important; + background-color: #ffffff !important; + border-radius: 5px; + -webkit-box-shadow: 0 0.75rem 1.5rem rgba(18,38,63,.03) !important; + box-shadow: 0 0.75rem 1.5rem rgba(18,38,63,.03) !important; +} +.o_DiscussSidebarItem_counter { + background-color: #f46a6a !important; + color: #fff !important; +} +.o_ThreadIcon_online { + color: #34c38f; +} +.o_Message_prettyBody table th { + color: $primary_accent !important; +} +.o_Message_prettyBody table thead tr td { + background-color: $primary_hover !important; +} +.o_DiscussSidebarMailbox.o-active { + background-color: #e9ecef; + color: #f46a6a !important; + font-weight: 500 !important; +} +.o_Discuss .o_DiscussSidebar { + color: #74788d !important; + line-height: 24px !important; + padding: 10px 5px !important; +} +.o_DiscussSidebarMailbox.o-starred-box .o_DiscussSidebarMailbox_counter { + border-color: #f46a6a !important; + background-color: #f46a6a !important; + color: #fff !important; +} +.o_list_buttons.d-flex button { + margin-right: 5px; +} +// Discuss End + +//Chatter @form +.o_FormRenderer_chatterContainer { + max-width: initial; + margin-top: 15px !important; + padding: 0 !important; + border-radius: 5px; + -webkit-box-shadow: 0 0.75rem 1.5rem rgba(18,38,63,.03) !important; + box-shadow: 0 0.75rem 1.5rem rgba(18,38,63, .03) !important; +} +.o_ChatterContainer { + padding: 10px; + background: #fff; + border-radius: 5px; +} +.o_Discuss .o_Message .o_Message_prettyBody p a { + background: $primary_accent !important; +} +.o_Message.o-not-discussion { + background-color: #eff2f7; + margin: 5px; + border-radius: 5px; + border-bottom: none; +} +.o_Composer { + background-color: #fff; + border-radius: 0 0 5px 5px; + border: none !important; +} +//Chatter @form Ends + +//Chatter mini starts +.o_ChatWindow { + background-color: #fff !important; + border-radius: 5px 5px 0 0 !important; + -webkit-box-shadow: 0 0.75rem 1.5rem rgba(18,38,63,.25) !important; + box-shadow: 0 0.75rem 1.5rem rgba(18,38,63, .25) !important; +} +.o_PartnerImStatusIcon_icon.o-offline { + color: #495057 !important; +} +.o_PartnerImStatusIcon_icon.o-online { + color: #34c38f !important; +} +.o_PartnerImStatusIcon_innerBackground { + color: white !important; +} +i.o_PartnerImStatusIcon_outerBackground.fa.fa-circle.fa-stack-1x { + color: #fff !important; +} +.o_ChatWindowHeader_item.o_ChatWindowHeader_rightArea .fa { + color: #fff !important; +} +.o_ChatWindowHeader { + background-color: #556ee6; + color: white !important; +} +//Chatter mini ends + +// Tabs Start +.nav-tabs .nav-link.active, .nav-tabs .nav-item.show .nav-link { + border: none; + border-bottom: solid; + font-weight: bold; + background: $primary_accent; + background-color: $primary_accent !important; + color: #ffffff !important; + border-radius: 5px; +} +.nav-link { + display: block; + padding: 1rem 2rem; +} +.o_form_view .o_notebook { + clear: both; + margin-top: 25px; + --notebook-margin-x: -32px; + --notebook-padding-x: 23px; +} +.nav-tabs { + border-bottom: none; +} +.nav-tabs .nav-link { + border: 1px solid #e3e3e3; + border-top-left-radius: 3px; + border-top-right-radius: 3px; + border-bottom: none !important; +} +.nav-item > a { + color: #555b6d !important; +} +.nav-link:hover, .nav-link:focus { + border: 1px solid #e9e9e9 !important; + border-bottom: none !important; +} +ul.sidebar_menu .nav-link:hover,ul.sidebar_menu .nav-link:focus { + border: none !important; + border-bottom: none !important; +} +a#closeSidebar { + margin-left: 10px; +} +a#openSidebar { + margin-left: 10px; +} +// TAbs End + +// Font color +.o_horizontal_separator { + color: #495057 !important; +} +.btn-link { + font-weight: 400; + color: $primary_accent !important; + text-decoration: none; +} +.o_activity_view .o_record_selector { + color: #34c38f; +} +// Font color ends + +// Form +input { + display: block; + width: 100%; + font-size: 13px; + font-weight: 400; + line-height: 1.5; + color: #495057; + background-color: #fff; + background-clip: padding-box; + border: 1px solid #ced4da !important; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + border-radius: .25rem; + -webkit-transition: border-color .15s ease-in-out,-webkit-box-shadow .15s ease-in-out; + transition: border-color .15s ease-in-out,-webkit-box-shadow .15s ease-in-out; + transition: border-color .15s ease-in-out,box-shadow .15s ease-in-out; + transition: border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-box-shadow .15s ease-in-out; + box-shadow: none !important; + margin-bottom:10px !important; +} +select { + width: 100%; + height: 40px !important; + padding: 10px 20px; + font-size: 13px; + font-weight: 400; + line-height: 1.5; + color: #495057; + background-color: #fff; + background-clip: padding-box; + border: 1px solid #ced4da !important; + border-radius: .25rem; + -webkit-transition: border-color .15s ease-in-out,-webkit-box-shadow .15s ease-in-out; + transition: border-color .15s ease-in-out,-webkit-box-shadow .15s ease-in-out; + transition: border-color .15s ease-in-out,box-shadow .15s ease-in-out; + transition: border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-box-shadow .15s ease-in-out; + box-shadow: none !important; + margin-bottom:10px !important; +} +.o_field_widget .o_input_dropdown .o_dropdown_button { + position: absolute; + top: 6px; + left: auto; + bottom: auto; + right: 9px; +} +.o_datepicker .o_datepicker_button { + position: absolute; + top: 6px; + left: auto; + bottom: auto; + right: 9px; + pointer-events: none; +} +.o_input { + border: solid 1px #ced4da !important; + color: #495057 !important; +} +.o_form_view .oe_button_box .btn.oe_stat_button > .o_stat_info .o_stat_value, +.o_form_view .oe_button_box .btn.oe_stat_button > span .o_stat_value { + color: #556ee6; +} +.o_form_view .oe_button_box .oe_stat_button .o_button_icon { + color: #556ee6; +} +// Form end + +// Search view +.o_searchview input.o_searchview_input { + border: none !important; + height: auto !important; + margin: 0 !important; + padding: 0px; +} +.o_base_settings .o_control_panel .o_panel .o_setting_search .searchIcon { + top: 9px; + right: 10px; +} +.o_base_settings .o_control_panel .o_panel .o_setting_search .searchInput { + padding: 10px 15px; +} +// Search view end + +// Settings page +.o_web_settings_invite { + margin-left: 7px; +} +.o_settings_container .o_setting_box .o_setting_right_pane { + margin-left: 32px !important; + border-left: 1px solid #dee2e6; + padding-left: 12px; +} +.o_setting_container { + background: #f8f8fb; + padding: 15px 0 0 0; +} +.o_base_settings .o_control_panel { + margin: 0; +} +.settings { + margin-left: 15px; + background-color: #ffffff !important; + -webkit-box-shadow: 0 0.75rem 1.5rem rgba(18,38,63,.03) !important; + box-shadow: 0 0.75rem 1.5rem rgba(18,38,63, .03) !important; + border-radius: 5px; +} +.settings_tab { + background-color: #ffffff !important; + -webkit-box-shadow: 0 0.75rem 1.5rem rgba(18,38,63,.03) !important; + box-shadow: 0 0.75rem 1.5rem rgba(18,38,63, .03) !important; + border-radius: 5px; +} +.o_base_settings .o_setting_container .settings_tab .selected, + .o_base_settings .o_setting_container .settings_tab .selected span { + box-shadow: none !important; + color: #f46a6a !important; + font-weight: 500 !important; + background: none !important; +} +.o_base_settings .o_setting_container .settings_tab .tab { + color: #74788d !important; +} +.o_setting_container .o_field_widget.o_field_many2one.o_with_button.oe_inline { + margin-left: 15px !important; +} +// Settings page end + +// Scrollbar starts +::-webkit-scrollbar-track { + -webkit-box-shadow: inset 0 0 3px rgba(0,0,0,.19); + border-radius: 10px; + background-color: #F5F5F5; +} +::-webkit-scrollbar { + width: 12px; + background-color: #F5F5F5; +} +::-webkit-scrollbar-thumb { + border-radius: 10px; + -webkit-box-shadow: inset 0 0 3px rgba(0,0,0,.2); + background-color: #c9ccd6; +} +// Scrollbar ends + +// Common starts +.o_content { + margin: 15px; + border-radius: 5px; + -webkit-box-shadow: 0 0.75rem 1.5rem rgba(18,38,63,.03) !important; + box-shadow: 0 0.75rem 1.5rem rgba(18,38,63, .03) !important; + background-color: #f8f8fb; +} +.o_action { + background: #f8f8fb; +} +// Common ends + +// Kanban_view starts +.o_kanban_view { + border-radius: 5px; + background: #fff; + -webkit-box-shadow: 0 0.75rem 1.5rem rgba(18,38,63,.03) !important; + box-shadow: 0 0.75rem 1.5rem rgba(18,38,63, .03) !important; +} +.o_kanban_view.o_kanban_ungrouped .o_kanban_record { + border-radius: 5px; + -webkit-box-shadow: 0 0.75rem 1.5rem rgba(18,38,63,.03) !important; + box-shadow: 0 0.75rem 1.5rem rgba(18,38,63, .03) !important; +} +.o_kanban_view .o_kanban_group { + background: #fff; + border-radius: 5px; + margin-right: 10px; +} +.o_kanban_view.o_kanban_grouped { + background-color: #f8f8fb; +} +.o_kanban_view.o_kanban_grouped .o_kanban_record, .o_kanban_view.o_kanban_grouped .o_kanban_quick_create { + border-radius: 5px; + margin-bottom: 10px; + -webkit-box-shadow: 0 0.75rem 1.5rem rgba(18,38,63,.03) !important; + box-shadow: 0 0.75rem 1.5rem rgba(18,38,63, .03) !important; +} +.o_kanban_view.o_kanban_dashboard .o_kanban_record .o_kanban_card_header + .container.o_kanban_card_content .o_kanban_primary_bottom.bottom_block { + border-bottom-left-radius: 5px; + border-bottom-right-radius: 5px; + background: rgba(85,110,230,.25) !important; +} +.o_kanban_view .o_kanban_record.o_kanban_record_has_image_fill .o_kanban_image_fill_left { + border-bottom-left-radius: 5px; + border-top-left-radius: 5px; +} +.o_kanban_record::after { + border-bottom-left-radius: 5px; + border-top-left-radius: 5px; +} +.o_kanban_quick_create .o_form_view, +.o_kanban_quick_create .o_action, +.o_kanban_quick_create .o_content { + background: #fff; + margin: 0px; + -webkit-box-shadow: none !important; + box-shadow: none !important; +} +.o_kanban_view .o_kanban_content .bg-primary { + border-radius: 5px 0 0 5px; +} +// Kanban_view ends + +// Canvas +canvas.chartjs-render-monitor { + width: 100% !important; + height: 100% !important; +} +// Canvas End + +// Apps menu starts +.o_search_panel { + border-right: none; + background-color: #ffffff; + border-radius: 5px; + -webkit-box-shadow: 0 0.75rem 1.5rem rgba(18,38,63,.03) !important; + box-shadow: 0 0.75rem 1.5rem rgba(18,38,63, .03) !important; +} +.list-group-item-action { + width: 100%; + color: #74788d; + text-align: inherit; +} +.list-group-item-action:hover, .list-group-item-action:focus { + color: none !important; + background: none !important; +} +.o_search_panel .list-group-item header.active { + background: none !important; + color: #f46a6a !important; + font-weight: 500 !important; +} +.o_controller_with_searchpanel .o_renderer_with_searchpanel { + margin-left: 15px; +} +//Apps menu ends + +// Website app starts +.o_dashboards .o_website_dashboard { + background-color: #ffffff !important; +} +.o_dashboards .o_website_dashboard div.o_box { + box-shadow: none !important; +} +.o_inner_box { + background-color: $primary_accent !important; + border-radius: 5px; +} +.o_inner_box:hover { + background-color: $primary_hover !important; +} +// Website app ends + +// Purchase app starts +td.o_main { + background-color: $primary_accent !important; + border-radius: 5px; +} +td.o_main:hover { + background-color: $primary_hover !important; +} +.o_purchase_dashboard .table > thead > tr > td, +.o_purchase_dashboard .table tbody > tr > td { + border-radius: 5px; +} +//Purchase app ends + +// Input inside colour starts +.o_searchview .o_searchview_facet .o_facet_values { + border :1px solid white; +} +select, input { + color: #4c4c4c !important; +} +.o_required_modifier > .o_input_dropdown > .ui-autocomplete-input { + color: #4c4c4c !important; +} +.o_required_modifier.o_input, .o_required_modifier.o_input { + color: #4c4c4c !important; +} +.o_datepicker.o_field_date.o_field_widget.o_required_modifier > input { + color: #4c4c4c !important; +} +.o_field_widget.o_field_many2manytags .o_tag_color_0 { + max-height:20px; +} +// Input inside colour ends + +// Welcome demo starts +.o_onboarding_container.collapse.show { + border-radius: 5px !important; + margin: 15px 15px 0px 15px; + -webkit-box-shadow: 0 0.75rem 1.5rem rgba(18,38,63,.03) !important; + box-shadow: 0 0.75rem 1.5rem rgba(18,38,63, .03) !important; +} +.o_onboarding.o_onboarding_blue, +.o_onboarding.o_onboarding_blue .o_onboarding_step_title, +.o_onboarding.o_onboarding_blue .o_onboarding_step_action, +.o_onboarding.o_onboarding_blue a.o_onboarding_all_done, +.o_onboarding.o_onboarding_blue .o_onboarding_all_done > .fa, +.o_onboarding.o_onboarding_blue .o_onboarding_btn_close { + border-radius: 5px; +} +.o_onboarding { + border-radius: 5px; +} +// Welcome demo ends + +// Modal starts +.modal.o_technical_modal .modal-content { + border-radius: 5px; + -webkit-box-shadow: 0 0.75rem 1.5rem rgba(18,38,63,.03) !important; + box-shadow: 0 0.75rem 1.5rem rgba(18,38,63, .03) !important; + background-color: #fff; + background-clip: padding-box; + border: 1px solid #f6f6f6; +} +.modal.o_technical_modal .modal-content .o_form_view, +.modal.o_technical_modal .modal-content .o_content, +.modal.o_technical_modal .modal-content .o_action { + background-color: #fff !important;; + -webkit-box-shadow: none !important; + box-shadow: none !important; +} +.modal.show .modal-dialog { + display: -webkit-box; + display: -webkit-flex; + display: flex; + align-items: center; + min-height: calc(100% - 1rem); +} +.modal .o_form_view .o_group .o_field_widget { + width: 98% !important; +} +// Modal ends + +// Calendar starts +.o_calendar_view { + background: #fff; +} +// Calendar ends + +// Expense starts +.o_content .o_expense_container { + background: #fff; +} +// Expense ends + +// Lunch starts +.o_lunch_content .o_lunch_banner { + border-bottom: none !important; + background-color: #fff !important; + margin: 0 15px 10px 15px; + border-radius: 5px; + -webkit-box-shadow: 0 0.75rem 1.5rem rgba(18,38,63,.03) !important; + box-shadow: 0 0.75rem 1.5rem rgba(18,38,63, .03) !important; +} +// Lunch ends + +// Kiosk starts +.o_hr_attendance_kiosk_backdrop { + background-color: #f8f8fb !important; +} +.o_hr_attendance_kiosk_mode { + background-color: #fff !important; + border-radius: 0 0 5px 5px !important; + -webkit-box-shadow: 0 0.75rem 1.5rem rgba(18,38,63,.03) !important; + box-shadow: 0 0.75rem 1.5rem rgba(18,38,63, .03) !important; +} +.o_hr_attendance_kiosk_mode .o_hr_attendance_user_badge { + border-radius: 5px 5px 0 0 !important; + border-top: none !important; + background: rgba(85,110,230,.25) !important; +} +.o_hr_attendance_sign_in_out_icon.fa-sign-in { + color: #fff !important; + background-color: $primary_accent !important; + border-color: $primary_accent !important; +} +.o_hr_attendance_sign_in_out_icon.fa-sign-in:hover { + color: #fff !important; + background-color: $primary_hover !important; + border-color: #4458b8 !important; +} +.o_hr_attendance_sign_in_out_icon.fa-sign-in:active { + color: #fff !important; + background-color: #4458b8 !important; + border-color: #4053ad !important; +} +.o_hr_attendance_sign_in_out_icon.fa-sign-in:focus { + color: #fff; + background-color: #485ec4 !important; + border-color: #4458b8 !important; + -webkit-box-shadow: 0 0 0 .15rem rgba(111,132,234,.5) !important; + box-shadow: 0 0 0 .15rem rgba(111,132,234,.5) !important; +} +.o_hr_attendance_kiosk_mode h3.mt0.mb0.text-muted { + color: $primary_accent !important; +} +.o_hr_attendance_button_employees div.mb16.mt16 { + margin-top: 4px !important; +} +// Kiosk ends + +// Timeoff starts +.o_timeoff_container { + background: #fff; +} +// Timeoff ends + +// Project .fa colours starts +.o_mail_activity .o_activity_color_planned { + color: #34c38f !important; +} +.o_mail_activity .o_activity_color_overdue { + color: #f46a6a !important; +} +.o_field_widget.o_priority > .o_priority_star.fa-star { + color: #f1b44c !important; +} +// Project .fa colours ends + +// Sale status icon starts +.bg-primary { + background-color: $primary_accent !important; +} +.bg-secondary { + background-color: $secondary_accent !important; +} +.bg-success-light { + color: #1f7556 !important; + background-color: #d6f3e9 !important; +} +.bg-info-light { + color: #306391 !important; + background-color: #dcedfc !important; +} +.bg-danger-light { + background-color: #fde1e1 !important; + color: #924040 !important; +} +.bg-warning-light { + background-color: #fcf0db !important; + color: #916c2e !important; +} +.o_field_widget.o_field_badge { + color: #464855; + background-color: #e3e4e8; +} +// Sale status icon end + +// Stock icon colors starts +.o_list_view .o_list_table .text-danger, +.o_list_view .o_list_table .oe_import .alert.text-error, +.oe_import .o_list_view .o_list_table .alert.text-error { + color: #f46a6a !important; +} +.text-danger { + color: #f1b44c !important; +} +.text-warning { + color: #f1b44c !important; +} +.text-error { + color: #f46a6a !important; +} +.text-success { + color: #34c38f !important; +} +// Stock icon colors ends + +// Badges starts +.badge-primary { + background-color: #556ee6 !important; +} +.badge-secondary { + background-color: #74788d; +} +.badge-success { + background-color: #34c38f; +} +.badge-info { + background-color: #50a5f1; +} +.badge-danger { + background-color: #f46a6a; +} +.badge-warning { + background-color: #f1b44c; +} +.badge-dark { + background-color: #343a40; +} +.bg-success { + background-color: #34c38f !important; +} +.bg-success-full { + background-color: #34c38f !important; +} +.bg-warning-full { + background-color: #f1b44c !important; +} +.bg-danger-full { + background-color: #f46a6a; +} +.o-planned { + color: #34c38f !important; +} +.o-overdue { + color: #f46a6a !important; +} +.o_progressbar_complete { + background-color: #34c38f !important; +} +// Badges ends + +// Alert starts +.alert-warning { + color: #916c2e; + background-color: #fcf0db; + border-color: #fbe9c9; +} +.alert-danger { + color: #924040; + background-color: #fde1e1; + border-color: #fcd2d2; +} +.alert-success { + color: #1f7556; + background-color: #d6f3e9; + border-color: #c2eddd; +} +.alert-info { + color: #306391; + background-color: #dcedfc; + border-color: #cbe4fb; +} +.toast { + border-radius: 5px !important; + color: #924040 !important; + background-color: #fde1e1 !important; + border-color: #fcd2d2 !important; + -webkit-box-shadow: 0 0.75rem 1.5rem rgba(18,38,63,.03) !important; + box-shadow: 0 0.75rem 1.5rem rgba(18,38,63, .03) !important; +} +.toast-header { + border-bottom: 1px solid #fcd2d2 !important; + color: #924040 !important; + background-color: #fde1e1 !important; + border-color: #fcd2d2 !important; +} +.toast-body { + color: #924040 !important; + background-color: #fde1e1 !important; + border-color: #fcd2d2 !important; +} +.o_notification_manager { + top: auto !important; + bottom: 30px !important; +} +// Alert ends + +// Recruitment starts +div.o_boolean_toggle.custom-control.custom-checkbox > label.custom-control-label::before, +div.o_boolean_toggle.custom-control.custom-checkbox > label.custom-control-label::after { + left: 0.1rem !important; +} +div.o_boolean_toggle.custom-control.custom-checkbox > input.custom-control-input:checked + label.custom-control-label::after { + top: 1.5px !important; +} +div.o_boolean_toggle.custom-control.custom-checkbox > label.custom-control-label::after { + top: 1px; +} +.o_kanban_view.o_kanban_dashboard.o_hr_recruitment_kanban .ribbon span { + background-color: #556ee6; +} +.o_kanban_view.o_kanban_dashboard.o_hr_recruitment_kanban.o_kanban_ungrouped .o_kanban_record:not(.o_kanban_ghost) { + height: 197px; +} +// Recruitment ends + +// Note editor starts +.note-popover .popover .popover-body, .panel-heading.note-toolbar { + padding: 5px !important; + border-bottom: none !important; + background: rgba(85, 110, 230, 0.25) !important; + border-radius: 5px 5px 0 0 ; +} +.note-editor .note-statusbar { + border-radius: 0 0 5px 5px; +} +.wysiwyg_iframe, .note-editor { + border: 1px, bold !important; + border-radius: 5px; +} +// Note editor ends + +// Progress starts +.oe_kanban_content .progress .progress-bar { + background-color: #556ee6; +} +.progress-bar.bg-muted-full { + background-color: #dee2e6; +} +// Progress ends + +// Email marketing starts +.o_domain_node.o_domain_tree.o_domain_selector > .o_domain_debug_container { + background: rgba(85, 110, 230, 0.25); + color: #000; +} +.o_domain_node.o_domain_tree.o_domain_selector > .o_domain_debug_container > input { + background: rgba(85, 110, 230, 0.25); +} +.o_field_widget.o_field_domain.o_inline_mode.o_edit_mode > .o_field_domain_panel { + top: -18px; +} +.o_domain_node .o_domain_selector_row > .o_domain_node_control_panel { + top: 5px; +} +.o_mail_emojis_dropdown { + bottom: 50px; +} +// Email marketing ends + +// Menu+ color starts +.o_main_navbar > ul > li.o_extra_menu_items.show > ul > li > a { + background-color: #74788d; +} +.o_main_navbar > ul > li.o_extra_menu_items.show > ul > li > a.dropdown-toggle { + background-color: #abadba; +} +// Menu+ color ends + +// Top menu bar starts +nav.o_main_navbar.small_nav { + display: flex; + flex-wrap: wrap; + justify-content: space-between; + height: auto; +} +ul.o_menu_systray.topbar_icon { + margin-left: auto; +} +.o_main_navbar .o_user_menu > a { + display: flex; + align-items: center; +} +.oe_topbar_name { + max-width: 300px; + margin-left: 5px; + white-space: nowrap; + overflow: hidden; +} +ul.o_menu_sections { + padding-left: 20px; +} +@media (max-width: 1371px) { + nav.o_main_navbar { + display: flex; + justify-content: right; + height: auto; + } + ul.o_menu_systray.topbar_icon { + margin-left: auto; + } +} +@media (max-width: 575.98px) { + .o_main_navbar .o_menu_sections { + max-width: 200px; + overflow-x: auto; + flex-wrap: nowrap !important; + } + .o_search_panel { + flex: auto; + } +} +// Top menu bar ends + +// Datetimepicker starts +.datepicker td, +.datepicker td a, +.datepicker th, +.datepicker span { + padding: 0.5rem !important; +} +div.dropdown-menu.bootstrap-datetimepicker-widget { + width: auto !important; +} +// Datetimepicker ends + +// Groupby color starts +.o_list_view tbody > tr.o_group_header { + background-image: none !important; +} +.table-striped tbody tr.o_group_header:nth-of-type(odd) { + background-color: rgba(85,110,230,0.17); +} +.table-striped tbody tr.o_group_header:hover { + background-color: rgba(85,110,230,0.23); +} +// Group by color ends + +// Responsive starts +@media (max-width:992px) { + .o_action_manager.sidebar_margin { + margin: 0 !important; + } + .top_heading.sidebar_margin { + margin: 0 !important; + } + .sidebar_panel .sidebar { + position: relative; + padding-top: 0px !important; + } + .sidebar_panel .sidebar_close { + display: block !important; + } +} +@media (max-width:480px) { + ul.o_menu_apps { + padding-left: 25px; + } + .o_control_panel { + margin: 15px 10px 0 10px; + } + .o_control_panel > div { + flex-wrap: wrap; + } + .o_cp_top_left, .o_cp_top_right, + .o_cp_bottom_left, .o_cp_bottom_right { + width: 100%; + } + .o_widget_Discuss .o_Discuss.o-mobile:not(.o-adding-item) { + border: none !important; + } + html .o_web_client > .o_action_manager { + overflow: auto !important; + } + ul.o_menu_systray.topbar_icon li:nth-child(1) { + margin-left: 20px; + } + .o_main_navbar .o_user_menu { + margin-left: 20px; + } + .sidebar_panel .sidebar .sidebar_logo img { + max-width: 112px; + } + .sidebar_panel .sidebar .sidebar_logo { + padding-top: 20px; + text-align: center; + padding-bottom: 5px; + } + li.o_switch_company_menu.show .dropdown-menu.dropdown-menu-right.show { + right: auto !important; + left: 0px; + } + ul.o_menu_systray.topbar_icon .dropdown-menu.show{ + left: 0px !important; + right: auto !important; + } + ul.o_menu_systray.topbar_icon { + margin-left: 0; + } + .o_MessagingMenu_dropdownMenu.o-mobile { + top: 70px; + } + .o_control_panel .o_cp_bottom_right { + flex-wrap: wrap; + } + .o_form_view .o_form_statusbar { + flex-wrap: wrap; + } + .btn { + padding: 2px 10px !important; + height: 35px !important; + } + .o_form_view .o_form_statusbar > .o_statusbar_status > .o_arrow_button:not(:first-child):before, + .o_form_view .o_form_statusbar > .o_statusbar_status > .o_arrow_button:not(:first-child):after { + border-top: 17px solid transparent !important; + border-bottom: 16px solid transparent !important; + } + .o_statusbar_status.o_field_widget.o_readonly_modifier { + width: 100%; + justify-content: flex-end; + margin-top: 5px; + } + .o_form_view .o_form_statusbar > .o_statusbar_buttons > .btn { + margin: 1px 0px 4px 0; + } + .o_form_statusbar .o_statusbar_buttons .btn { + margin-right: 5px !important; + } + .o_control_panel .o_cp_bottom_left > .o_cp_action_menus .o_dropdown_toggler_btn { + margin-right: 3px; + } + .o_form_view .o_form_sheet_bg > .o_form_sheet { + min-width: auto; + } + .nav-tabs .nav-link { + padding: 8px; + } + .modal.o_technical_modal.o_modal_full .modal-dialog .modal-content .modal-header { + background: $primary_accent; + } + .o_form_view .o_group .o_group_col_6 { + width: 100%; + } + .o_kanban_view.o_kanban_ungrouped .o_kanban_record { + flex-wrap: wrap; + } + .o_kanban_view .o_kanban_record.o_kanban_record_has_image_fill .o_kanban_image_fill_left { + border-radius: 5px; + } + .o_field_widget.o_field_image .o_form_image_controls > .fa.o_select_file_button { + background: #74788d; + } +} +//Responsive ends + +// New changes +.o_main_navbar .dropdown .dropdown-toggle, .o_main_navbar .o_menu_sections .dropdown .dropdown-toggle, +.o_main_navbar .o_menu_systray .dropdown .dropdown-toggle, .o_main_navbar .o_nav_entry, +.o_main_navbar .o_menu_sections .o_nav_entry, .o_main_navbar .o_menu_systray .o_nav_entry, +.o_main_navbar > .o_menu_sections > div, .o_main_navbar > .o_menu_sections > div > a, +.o_main_navbar .o_menu_systray > div, .o_main_navbar .o_menu_systray > div > a, +.o_main_navbar .o_menu_toggle, .o_main_navbar .o_navbar_apps_menu, .o_main_navbar .o_menu_brand { + color: $f_color !important; +} +.o_content .o_expense_purple { + color: #556ee6; +} +.row.o_recruitment_kanban_boxes .custom-checkbox input:checked + label::after { + display:none +} + +// New fix +.o_form_view .oe_button_box + .oe_title, .o_form_view .oe_button_box + .oe_avatar + .oe_title { + width: 100% !important; +} +.form-check-input { + box-sizing: border-box; +} +.o_facet_values { + border: none !important; +} +// V17 Fixes +.o_main_navbar .o_menu_sections .o_nav_entry, .o_main_navbar .o_menu_sections .dropdown-toggle { + background: white !important; +} +.o_cp_searchview .btn.btn-primary { + max-height: 30px !important; + left: -4px !important; +} +.o_facet_remove.oi.oi-close.btn.btn-link { + margin-top: 0px; +} +.o_field_widget.o_field_badge { + background: none !important; +} +.o_list_view .table-responsive .table { + width: fit-content !important; + left: -14px; +} +// Remove button one2many field +.o_list_renderer .o_list_table > thead > tr > :last-child, .o_list_renderer .o_list_table > tbody > tr > :last-child, .o_list_renderer .o_list_table > tfoot > tr > :last-child { + vertical-align: middle; +} +// Dropdown toggle +.o_list_view .table-responsive .table thead tr:nth-child(1) th { + width: 80px; +} +// Oe chatter search bar +.btn-link.btn-action, .btn-link.btn-action:hover, .btn-link.btn-action:focus, .btn-link.btn-action:active, .btn-link.btn-action.active, .btn-link.text-action, .btn-link.text-action:hover, .btn-link.text-action:focus, .btn-link.text-action:active, .btn-link.text-action.active { + margin-top: 8px; +} +// Buttons inside table +.o_list_table .o_data_cell { + vertical-align: middle; +} +.o_form_view .o_notebook > .tab-content > .tab-pane > :first-child:not(.o_group) .o_field_x2many.o_field_x2many_list .o_list_renderer tr > .o_handle_cell:first-child, .o_form_view .o_notebook > .tab-content > .tab-pane > .o_invisible_modifier:first-child .o_field_x2many.o_field_x2many_list .o_list_renderer tr > .o_handle_cell:first-child { + width: 20px !important; +} +@media (min-width: 1200px) { + .o_calendar_sidebar_container .o_calendar_sidebar { + width: 300px; + } + button.o_date_item_cell > span.z-index-1 { + margin-left: -5px; + } +} +button.oe_stat_button { + border-color: #616263!important; +} +// Statusbar +@media (min-width: 1200px) { + .o_form_statusbar .o_statusbar_buttons .btn { + margin-right: 5px !important; + } + div.o_statusbar_status .btn-secondary { + all: initial !important; + } + div.o_statusbar_status .btn-secondary.dropdown-toggle { + display: none !important; + } + .o_field_statusbar > .o_statusbar_status > .o_arrow_button:not(.d-none):not(.o_first):before, .o_field_statusbar_duration > .o_statusbar_status > .o_arrow_button:not(.d-none):not(.o_first):before, .o_field_statusbar > .o_statusbar_status > .o_arrow_button:not(.d-none):not(.o_first):after, .o_field_statusbar_duration > .o_statusbar_status > .o_arrow_button:not(.d-none):not(.o_first):after, .o_field_statusbar > .o_statusbar_status > .o_arrow_button:not(.d-none):not(.o_last):before, .o_field_statusbar_duration > .o_statusbar_status > .o_arrow_button:not(.d-none):not(.o_last):before, .o_field_statusbar > .o_statusbar_status > .o_arrow_button:not(.d-none):not(.o_last):after, .o_field_statusbar_duration > .o_statusbar_status > .o_arrow_button:not(.d-none):not(.o_last):after { + display: none !important; + } + .o_statusbar_status .o_arrow_button.btn-secondary { + color: #74788d !important; + background-color: white !important; + border-color: white !important; + border-radius: 1px !important; + font-family: inherit !important; + height: 30px !important; + padding: 2px !important; + height: 30px !important; + line-height: 1px !important; + } + .o_statusbar_status .o_arrow_button.btn-secondary.o_arrow_button_current { + color: white !important; + background-color: black !important; + font-family: inherit !important; + } + .o_statusbar_status .o_arrow_button.btn-secondary { + border-top: 15px solid transparent !important; + border-left: 15px solid white !important; + border-bottom: 15px solid transparent !important; + height: 0px !important; + } + .o_form_view:not(.o_field_highlight) .o_field_many2one_selection .o_external_button, .o_form_view:not(.o_field_highlight) .o_field_many2one_selection .o_dropdown_button { + margin-top: -7px; + } +} +.o_kanban_primary_left .btn-primary { + height: 60px !important; +} +.btn{ + height: 42px !important; + margin-bottom: 0px !important; +} diff --git a/code_backend_theme/static/src/scss/theme_accent.scss b/code_backend_theme/static/src/scss/theme_accent.scss new file mode 100644 index 0000000..210b055 --- /dev/null +++ b/code_backend_theme/static/src/scss/theme_accent.scss @@ -0,0 +1,8 @@ +$primary_accent: #556ee6 !default; +$secondary_accent: #334332 !default; +$inverse_accent: #ffffff !default; +$o-kanban-color-border-width: 8px; +$selected_row: #ffffff !default; +$bg_white: #ffffff !default; +$f_color: #555b6d !default; +$primary_hover: #485ec4 !default; diff --git a/code_backend_theme/static/src/xml/settings_templates.xml b/code_backend_theme/static/src/xml/settings_templates.xml new file mode 100644 index 0000000..d9d599c --- /dev/null +++ b/code_backend_theme/static/src/xml/settings_templates.xml @@ -0,0 +1,11 @@ + + + + + + + + + diff --git a/code_backend_theme/static/src/xml/top_bar_templates.xml b/code_backend_theme/static/src/xml/top_bar_templates.xml new file mode 100644 index 0000000..c169d73 --- /dev/null +++ b/code_backend_theme/static/src/xml/top_bar_templates.xml @@ -0,0 +1,109 @@ + + + + + + + + + + + + + + + + +
+ + + diff --git a/code_backend_theme/views/base_menus.xml b/code_backend_theme/views/base_menus.xml new file mode 100644 index 0000000..7e7821c --- /dev/null +++ b/code_backend_theme/views/base_menus.xml @@ -0,0 +1,9 @@ + + + + + + + diff --git a/code_backend_theme/views/layout_templates.xml b/code_backend_theme/views/layout_templates.xml new file mode 100644 index 0000000..7c5cc4e --- /dev/null +++ b/code_backend_theme/views/layout_templates.xml @@ -0,0 +1,10 @@ + + + + + diff --git a/muk_web_appsbar/LICENSE b/muk_web_appsbar/LICENSE new file mode 100644 index 0000000..0a04128 --- /dev/null +++ b/muk_web_appsbar/LICENSE @@ -0,0 +1,165 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. diff --git a/muk_web_appsbar/__init__.py b/muk_web_appsbar/__init__.py new file mode 100644 index 0000000..df1b934 --- /dev/null +++ b/muk_web_appsbar/__init__.py @@ -0,0 +1,14 @@ +from . import models + +import base64 + +from odoo.tools import file_open + + +def _setup_module(env): + if env.ref('base.main_company', False): + with file_open('base/static/img/res_company_logo.png', 'rb') as file: + env.ref('base.main_company').write({ + 'appbar_image': base64.b64encode(file.read()) + }) + \ No newline at end of file diff --git a/muk_web_appsbar/__manifest__.py b/muk_web_appsbar/__manifest__.py new file mode 100644 index 0000000..8d906da --- /dev/null +++ b/muk_web_appsbar/__manifest__.py @@ -0,0 +1,73 @@ +{ + 'name': 'MuK AppsBar', + 'summary': 'Adds a sidebar to the main screen', + 'description': ''' + This module adds a sidebar to the main screen. The sidebar has a list + of all installed apps similar to the home menu to ease navigation. + ''', + 'version': '18.0.1.1.4', + 'category': 'Tools/UI', + 'license': 'LGPL-3', + 'author': 'MuK IT', + 'website': 'http://www.mukit.at', + 'live_test_url': 'https://my.mukit.at/r/f6m', + 'contributors': [ + 'Mathias Markl ', + ], + 'depends': [ + 'base_setup', + 'web', + ], + 'data': [ + 'templates/webclient.xml', + 'views/res_users.xml', + 'views/res_config_settings.xml', + ], + 'assets': { + 'web._assets_primary_variables': [ + 'muk_web_appsbar/static/src/scss/variables.scss', + ], + 'web._assets_backend_helpers': [ + 'muk_web_appsbar/static/src/scss/mixins.scss', + ], + 'web.assets_web_dark': [ + ( + 'after', + 'muk_web_appsbar/static/src/scss/variables.scss', + 'muk_web_appsbar/static/src/scss/variables.dark.scss', + ), + ], + 'web.assets_backend': [ + ( + 'after', + 'web/static/src/webclient/webclient.js', + 'muk_web_appsbar/static/src/webclient/webclient.js', + ), + ( + 'after', + 'web/static/src/webclient/webclient.xml', + 'muk_web_appsbar/static/src/webclient/webclient.xml', + ), + ( + 'after', + 'web/static/src/webclient/webclient.js', + 'muk_web_appsbar/static/src/webclient/menus/app_menu_service.js', + ), + ( + 'after', + 'web/static/src/webclient/webclient.js', + 'muk_web_appsbar/static/src/webclient/appsbar/appsbar.js', + ), + 'muk_web_appsbar/static/src/webclient/webclient.scss', + 'muk_web_appsbar/static/src/webclient/appsbar/appsbar.xml', + 'muk_web_appsbar/static/src/webclient/appsbar/appsbar.scss', + ], + }, + 'images': [ + 'static/description/banner.png', + ], + 'installable': True, + 'application': False, + 'auto_install': False, + 'post_init_hook': '_setup_module', +} diff --git a/muk_web_appsbar/doc/changelog.rst b/muk_web_appsbar/doc/changelog.rst new file mode 100644 index 0000000..659d822 --- /dev/null +++ b/muk_web_appsbar/doc/changelog.rst @@ -0,0 +1,9 @@ +`1.1.0` +------- + +- Use CSS Grid + +`1.0.0` +------- + +- Initial Release diff --git a/muk_web_appsbar/doc/index.rst b/muk_web_appsbar/doc/index.rst new file mode 100644 index 0000000..8f6f787 --- /dev/null +++ b/muk_web_appsbar/doc/index.rst @@ -0,0 +1,59 @@ +=========== +MuK AppsBar +=========== + +This module adds a sidebar to the main screen. The sidebar has a list +of all installed apps similar to the home menu to ease navigation. + +Installation +============ + +To install this module, you need to: + +Download the module and add it to your Odoo addons folder. Afterward, log on to +your Odoo server and go to the Apps menu. Trigger the debug mode and update the +list by clicking on the "Update Apps List" link. Now install the module by +clicking on the install button. + +Upgrade +============ + +To upgrade this module, you need to: + +Download the module and add it to your Odoo addons folder. Restart the server +and log on to your Odoo server. Select the Apps menu and upgrade the module by +clicking on the upgrade button. + +Configuration +============= + +Each user can define in their profile the display of the sidebar. The options +are to show the large version, the small version, or hide the sidebar completely. +In addition, an image can be added for each company, which is displayed at the +bottom of the sidebar. + +Usage +============= + +Is the sidebar is activated it will be automatically displayed on the left side of +the systems UI. + +Credits +======= + +Contributors +------------ + +* Mathias Markl + +Author & Maintainer +------------------- + +This module is maintained by the `MuK IT GmbH `_. + +MuK IT is an Austrian company specialized in customizing and extending Odoo. +We develop custom solutions for your individual needs to help you focus on +your strength and expertise to grow your business. + +If you want to get in touch please contact us via mail +(sale@mukit.at) or visit our website (https://mukit.at). diff --git a/muk_web_appsbar/i18n/de.po b/muk_web_appsbar/i18n/de.po new file mode 100644 index 0000000..d65dfeb --- /dev/null +++ b/muk_web_appsbar/i18n/de.po @@ -0,0 +1,78 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * muk_web_appsbar +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 18.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-11-06 14:43+0000\n" +"PO-Revision-Date: 2024-11-06 14:43+0000\n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: muk_web_appsbar +#: model:ir.model.fields,field_description:muk_web_appsbar.field_res_company__appbar_image +#: model:ir.model.fields,field_description:muk_web_appsbar.field_res_config_settings__appbar_image +msgid "Apps Menu Footer Image" +msgstr "Apps Menü Fusszeilen Bild" + +#. module: muk_web_appsbar +#: model_terms:ir.ui.view,arch_db:muk_web_appsbar.view_res_config_settings_form +msgid "AppsBar" +msgstr "AppsLeiste" + +#. module: muk_web_appsbar +#: model:ir.model,name:muk_web_appsbar.model_res_company +msgid "Companies" +msgstr "Unternehmen" + +#. module: muk_web_appsbar +#: model:ir.model,name:muk_web_appsbar.model_res_config_settings +msgid "Config Settings" +msgstr "Konfigurationseinstellungen" + +#. module: muk_web_appsbar +#: model:ir.model,name:muk_web_appsbar.model_ir_http +msgid "HTTP Routing" +msgstr "HTTP-Routing" + +#. module: muk_web_appsbar +#: model:ir.model.fields.selection,name:muk_web_appsbar.selection__res_users__sidebar_type__invisible +msgid "Invisible" +msgstr "Unsichtbar" + +#. module: muk_web_appsbar +#: model:ir.model.fields.selection,name:muk_web_appsbar.selection__res_users__sidebar_type__large +msgid "Large" +msgstr "Groß" + +#. module: muk_web_appsbar +#. odoo-javascript +#: code:addons/muk_web_appsbar/static/src/webclient/appsbar/appsbar.xml:0 +msgid "Logo" +msgstr "Logo" + +#. module: muk_web_appsbar +#: model_terms:ir.ui.view,arch_db:muk_web_appsbar.view_res_config_settings_form +msgid "Set your own Logo for the appsbar" +msgstr "Legen Sie ihr eigenes Logo für die Appsleiste fest" + +#. module: muk_web_appsbar +#: model:ir.model.fields,field_description:muk_web_appsbar.field_res_users__sidebar_type +msgid "Sidebar Type" +msgstr "Seitenleiste Typ" + +#. module: muk_web_appsbar +#: model:ir.model.fields.selection,name:muk_web_appsbar.selection__res_users__sidebar_type__small +msgid "Small" +msgstr "Klein" + +#. module: muk_web_appsbar +#: model:ir.model,name:muk_web_appsbar.model_res_users +msgid "User" +msgstr "Benutzer" \ No newline at end of file diff --git a/muk_web_appsbar/models/__init__.py b/muk_web_appsbar/models/__init__.py new file mode 100644 index 0000000..49f6c60 --- /dev/null +++ b/muk_web_appsbar/models/__init__.py @@ -0,0 +1,4 @@ +from . import ir_http +from . import res_users +from . import res_company +from . import res_config_settings diff --git a/muk_web_appsbar/models/ir_http.py b/muk_web_appsbar/models/ir_http.py new file mode 100644 index 0000000..2c6a723 --- /dev/null +++ b/muk_web_appsbar/models/ir_http.py @@ -0,0 +1,20 @@ +from odoo import models +from odoo.http import request + + +class IrHttp(models.AbstractModel): + + _inherit = "ir.http" + + #---------------------------------------------------------- + # Functions + #---------------------------------------------------------- + + def session_info(self): + result = super(IrHttp, self).session_info() + if request.env.user._is_internal(): + for company in request.env.user.company_ids.with_context(bin_size=True): + result['user_companies']['allowed_companies'][company.id].update({ + 'has_appsbar_image': bool(company.appbar_image), + }) + return result diff --git a/muk_web_appsbar/models/res_company.py b/muk_web_appsbar/models/res_company.py new file mode 100644 index 0000000..b55d9af --- /dev/null +++ b/muk_web_appsbar/models/res_company.py @@ -0,0 +1,15 @@ +from odoo import models, fields + + +class ResCompany(models.Model): + + _inherit = 'res.company' + + #---------------------------------------------------------- + # Fields + #---------------------------------------------------------- + + appbar_image = fields.Binary( + string='Apps Menu Footer Image', + attachment=True + ) diff --git a/muk_web_appsbar/models/res_config_settings.py b/muk_web_appsbar/models/res_config_settings.py new file mode 100644 index 0000000..94e72fe --- /dev/null +++ b/muk_web_appsbar/models/res_config_settings.py @@ -0,0 +1,15 @@ +from odoo import api, fields, models + + +class ResConfigSettings(models.TransientModel): + + _inherit = 'res.config.settings' + + #---------------------------------------------------------- + # Fields + #---------------------------------------------------------- + + appbar_image = fields.Binary( + related='company_id.appbar_image', + readonly=False + ) diff --git a/muk_web_appsbar/models/res_users.py b/muk_web_appsbar/models/res_users.py new file mode 100644 index 0000000..06f8210 --- /dev/null +++ b/muk_web_appsbar/models/res_users.py @@ -0,0 +1,37 @@ +from odoo import models, fields, api + + +class ResUsers(models.Model): + + _inherit = 'res.users' + + #---------------------------------------------------------- + # Properties + #---------------------------------------------------------- + + @property + def SELF_READABLE_FIELDS(self): + return super().SELF_READABLE_FIELDS + [ + 'sidebar_type', + ] + + @property + def SELF_WRITEABLE_FIELDS(self): + return super().SELF_WRITEABLE_FIELDS + [ + 'sidebar_type', + ] + + #---------------------------------------------------------- + # Fields + #---------------------------------------------------------- + + sidebar_type = fields.Selection( + selection=[ + ('invisible', 'Invisible'), + ('small', 'Small'), + ('large', 'Large') + ], + string="Sidebar Type", + default='large', + required=True, + ) diff --git a/muk_web_appsbar/static/description/banner.png b/muk_web_appsbar/static/description/banner.png new file mode 100644 index 0000000..92b06c5 Binary files /dev/null and b/muk_web_appsbar/static/description/banner.png differ diff --git a/muk_web_appsbar/static/description/icon.png b/muk_web_appsbar/static/description/icon.png new file mode 100644 index 0000000..fa9ac0e Binary files /dev/null and b/muk_web_appsbar/static/description/icon.png differ diff --git a/muk_web_appsbar/static/description/icon.svg b/muk_web_appsbar/static/description/icon.svg new file mode 100644 index 0000000..9518f0e --- /dev/null +++ b/muk_web_appsbar/static/description/icon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/muk_web_appsbar/static/description/index.html b/muk_web_appsbar/static/description/index.html new file mode 100644 index 0000000..98d0fcb --- /dev/null +++ b/muk_web_appsbar/static/description/index.html @@ -0,0 +1,155 @@ +
+
+

MuK Colors

+

Customize your Odoo colors

+ +

MuK IT GmbH - www.mukit.at

+
+ + Community + + + Enterprise + +
+
+ +
+
+
+ +
+
+
+

Overview

+

+ This module adds a sidebar to the main screen. The sidebar has a list of all + installed apps similar to the home menu to ease navigation. Each user can define + in their profile the display of the sidebar. The options are to show the large + version, the small version, or hide the sidebar completely. In addition, an image + can be added for each company, which is displayed at the bottom of the sidebar. +

+
+
+
+ +
+
+
+

Settings

+

+ To set up the sidebar, the user can open their preferences or profile, depending on + whether the HR module is installed. The sidebar settings can now be changed via a + corresponding field. You will need to refresh your browser for the change to take effect. +

+
+ +
+
+
+
+ +
+
+

+ Want more? +

+

+ Are you having troubles with your Odoo integration? Or do you feel + your system lacks of essential features?
If your answer is YES + to one of the above questions, feel free to contact us at anytime + with your inquiry.
We are looking forward to discuss your + needs and plan the next steps with you.
+

+
+ +
+ +
+
+

Our Services

+
+
+
+
+ +
+

+ Odoo
Development +

+
+
+
+
+
+ +
+

+ Odoo
Integration +

+
+
+
+
+
+ +
+

+ Odoo
Infrastructure +

+
+
+
+
+
+ +
+

+ Odoo
Training +

+
+
+
+
+
+ +
+

+ Odoo
Support +

+
+
+
+
+
diff --git a/muk_web_appsbar/static/description/logo.png b/muk_web_appsbar/static/description/logo.png new file mode 100644 index 0000000..9427ce3 Binary files /dev/null and b/muk_web_appsbar/static/description/logo.png differ diff --git a/muk_web_appsbar/static/description/screenshot.png b/muk_web_appsbar/static/description/screenshot.png new file mode 100644 index 0000000..17cfd63 Binary files /dev/null and b/muk_web_appsbar/static/description/screenshot.png differ diff --git a/muk_web_appsbar/static/description/screenshot_user.png b/muk_web_appsbar/static/description/screenshot_user.png new file mode 100644 index 0000000..c1782d2 Binary files /dev/null and b/muk_web_appsbar/static/description/screenshot_user.png differ diff --git a/muk_web_appsbar/static/description/service_development.png b/muk_web_appsbar/static/description/service_development.png new file mode 100644 index 0000000..d64b66b Binary files /dev/null and b/muk_web_appsbar/static/description/service_development.png differ diff --git a/muk_web_appsbar/static/description/service_infrastructure.png b/muk_web_appsbar/static/description/service_infrastructure.png new file mode 100644 index 0000000..b899a31 Binary files /dev/null and b/muk_web_appsbar/static/description/service_infrastructure.png differ diff --git a/muk_web_appsbar/static/description/service_integration.png b/muk_web_appsbar/static/description/service_integration.png new file mode 100644 index 0000000..76c5e80 Binary files /dev/null and b/muk_web_appsbar/static/description/service_integration.png differ diff --git a/muk_web_appsbar/static/description/service_support.png b/muk_web_appsbar/static/description/service_support.png new file mode 100644 index 0000000..4c530fa Binary files /dev/null and b/muk_web_appsbar/static/description/service_support.png differ diff --git a/muk_web_appsbar/static/description/service_training.png b/muk_web_appsbar/static/description/service_training.png new file mode 100644 index 0000000..19ea76e Binary files /dev/null and b/muk_web_appsbar/static/description/service_training.png differ diff --git a/muk_web_appsbar/static/src/scss/mixins.scss b/muk_web_appsbar/static/src/scss/mixins.scss new file mode 100644 index 0000000..dcd23ea --- /dev/null +++ b/muk_web_appsbar/static/src/scss/mixins.scss @@ -0,0 +1,7 @@ +@mixin mk-disable-scrollbar { + scrollbar-width: none; + -ms-overflow-style: none; + &::-webkit-scrollbar { + display: none; + } +} diff --git a/muk_web_appsbar/static/src/scss/variables.dark.scss b/muk_web_appsbar/static/src/scss/variables.dark.scss new file mode 100644 index 0000000..c773cdc --- /dev/null +++ b/muk_web_appsbar/static/src/scss/variables.dark.scss @@ -0,0 +1,2 @@ +$mk-appbar-color: #E4E4E4 !default; +$mk-appbar-background: #3C3E4B !default; diff --git a/muk_web_appsbar/static/src/scss/variables.scss b/muk_web_appsbar/static/src/scss/variables.scss new file mode 100644 index 0000000..1992104 --- /dev/null +++ b/muk_web_appsbar/static/src/scss/variables.scss @@ -0,0 +1,6 @@ +$mk-appbar-color: #dee2e6 !default; +$mk-appbar-active: $o-brand-primary !default; +$mk-appbar-background: #111827 !default; + +$mk-sidebar-large-width: 146px !default; +$mk-sidebar-small-width: 46px !default; diff --git a/muk_web_appsbar/static/src/webclient/appsbar/appsbar.js b/muk_web_appsbar/static/src/webclient/appsbar/appsbar.js new file mode 100644 index 0000000..8d2296c --- /dev/null +++ b/muk_web_appsbar/static/src/webclient/appsbar/appsbar.js @@ -0,0 +1,34 @@ +import { url } from '@web/core/utils/urls'; +import { useService } from '@web/core/utils/hooks'; + +import { Component, onWillUnmount } from '@odoo/owl'; + +export class AppsBar extends Component { + static template = 'muk_web_appsbar.AppsBar'; + static props = {}; + setup() { + this.companyService = useService('company'); + this.appMenuService = useService('app_menu'); + if (this.companyService.currentCompany.has_appsbar_image) { + this.sidebarImageUrl = url('/web/image', { + model: 'res.company', + field: 'appbar_image', + id: this.companyService.currentCompany.id, + }); + } + const renderAfterMenuChange = () => { + this.render(); + }; + this.env.bus.addEventListener( + 'MENUS:APP-CHANGED', renderAfterMenuChange + ); + onWillUnmount(() => { + this.env.bus.removeEventListener( + 'MENUS:APP-CHANGED', renderAfterMenuChange + ); + }); + } + _onAppClick(app) { + return this.appMenuService.selectApp(app); + } +} diff --git a/muk_web_appsbar/static/src/webclient/appsbar/appsbar.scss b/muk_web_appsbar/static/src/webclient/appsbar/appsbar.scss new file mode 100644 index 0000000..7f4135a --- /dev/null +++ b/muk_web_appsbar/static/src/webclient/appsbar/appsbar.scss @@ -0,0 +1,89 @@ +.mk_apps_sidebar_panel { + @include mk-disable-scrollbar(); + background-color: $mk-appbar-background; + width: var(--mk-sidebar-width, 0); + overflow-y: auto; + .mk_apps_sidebar { + height: 100%; + display: flex; + flex-direction: column; + justify-content: space-between; + white-space: nowrap; + .mk_apps_sidebar_menu { + padding: 0; + > li > a { + cursor: pointer; + font-size: 13px; + font-weight: 300; + overflow: hidden; + padding: 8px 11px; + text-decoration: none; + color: $mk-appbar-color; + text-overflow: ellipsis; + .mk_apps_sidebar_icon { + width: 22px; + height: 22px; + margin-right: 5px; + } + } + > li.active > a { + background: $mk-appbar-active; + } + > li:hover > a { + background: $mk-appbar-active; + } + } + } +} + +.mk_sidebar_type_large { + --mk-sidebar-width: #{$mk-sidebar-large-width}; +} + +.mk_sidebar_type_small { + --mk-sidebar-width: #{$mk-sidebar-small-width}; + .mk_apps_sidebar_name { + display: none; + } + .mk_apps_sidebar_icon { + margin-right: 0 !important; + } + .mk_apps_sidebar_logo { + display: none; + } +} + +.mk_sidebar_type_invisible { + --mk-sidebar-width: 0; +} + +.editor_has_snippets_hide_backend_navbar, +.o_home_menu_background, +.o_fullscreen { + --mk-sidebar-width: 0; +} + +.editor_has_snippets_hide_backend_navbar .mk_apps_sidebar_panel { + transition: width 300ms; +} + +@include media-breakpoint-only(md) { + .mk_sidebar_type_large { + --mk-sidebar-width: #{$mk-sidebar-small-width}; + .mk_apps_sidebar_name { + display: none; + } + .mk_apps_sidebar_icon { + margin-right: 0 !important; + } + .mk_apps_sidebar_logo { + display: none; + } + } +} + +@include media-breakpoint-down(md) { + .mk_sidebar_type_large, .mk_sidebar_type_small { + --mk-sidebar-width: 0; + } +} diff --git a/muk_web_appsbar/static/src/webclient/appsbar/appsbar.xml b/muk_web_appsbar/static/src/webclient/appsbar/appsbar.xml new file mode 100644 index 0000000..51e6ed8 --- /dev/null +++ b/muk_web_appsbar/static/src/webclient/appsbar/appsbar.xml @@ -0,0 +1,44 @@ + + + + + +
+
+ + +
+
+
+ +
diff --git a/muk_web_appsbar/static/src/webclient/menus/app_menu_service.js b/muk_web_appsbar/static/src/webclient/menus/app_menu_service.js new file mode 100644 index 0000000..76f6e42 --- /dev/null +++ b/muk_web_appsbar/static/src/webclient/menus/app_menu_service.js @@ -0,0 +1,33 @@ +import { registry } from "@web/core/registry"; +import { user } from "@web/core/user"; + +import { computeAppsAndMenuItems, reorderApps } from "@web/webclient/menus/menu_helpers"; + +export const appMenuService = { + dependencies: ["menu"], + async start(env, { menu }) { + return { + getCurrentApp () { + return menu.getCurrentApp(); + }, + getAppsMenuItems() { + const menuItems = computeAppsAndMenuItems( + menu.getMenuAsTree('root') + ) + const apps = menuItems.apps; + const menuConfig = JSON.parse( + user.settings?.homemenu_config || 'null' + ); + if (menuConfig) { + reorderApps(apps, menuConfig); + } + return apps; + }, + selectApp(app) { + menu.selectMenu(app); + } + }; + }, +}; + +registry.category("services").add("app_menu", appMenuService); diff --git a/muk_web_appsbar/static/src/webclient/webclient.js b/muk_web_appsbar/static/src/webclient/webclient.js new file mode 100644 index 0000000..0ab9cf9 --- /dev/null +++ b/muk_web_appsbar/static/src/webclient/webclient.js @@ -0,0 +1,11 @@ +import { patch } from '@web/core/utils/patch'; + +import { WebClient } from '@web/webclient/webclient'; +import { AppsBar } from '@muk_web_appsbar/webclient/appsbar/appsbar'; + +patch(WebClient, { + components: { + ...WebClient.components, + AppsBar, + }, +}); diff --git a/muk_web_appsbar/static/src/webclient/webclient.scss b/muk_web_appsbar/static/src/webclient/webclient.scss new file mode 100644 index 0000000..0527f44 --- /dev/null +++ b/muk_web_appsbar/static/src/webclient/webclient.scss @@ -0,0 +1,29 @@ +.o_web_client { + display: grid !important; + grid-template-areas: + "banner banner" + "navbar navbar" + "sidebar content" + "components components"; + grid-template-rows: auto auto 1fr auto; + grid-template-columns: auto 1fr; + > div:has(#oe_neutralize_banner) { + grid-area: banner; + } + > .o_navbar { + grid-area: navbar; + } + > .mk_apps_sidebar_panel { + grid-area: sidebar; + } + > .o_action_manager { + grid-area: content; + } + > .o-main-components-container { + grid-area: components; + } + > iframe { + grid-column: 1 / -1; + width: 100%; + } +} \ No newline at end of file diff --git a/muk_web_appsbar/static/src/webclient/webclient.xml b/muk_web_appsbar/static/src/webclient/webclient.xml new file mode 100644 index 0000000..45bd36f --- /dev/null +++ b/muk_web_appsbar/static/src/webclient/webclient.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + diff --git a/muk_web_appsbar/templates/webclient.xml b/muk_web_appsbar/templates/webclient.xml new file mode 100644 index 0000000..742f06d --- /dev/null +++ b/muk_web_appsbar/templates/webclient.xml @@ -0,0 +1,12 @@ + + + + + + + diff --git a/muk_web_appsbar/views/res_config_settings.xml b/muk_web_appsbar/views/res_config_settings.xml new file mode 100644 index 0000000..76edd1b --- /dev/null +++ b/muk_web_appsbar/views/res_config_settings.xml @@ -0,0 +1,20 @@ + + + + + + res.config.settings.form + res.config.settings + + + + +
+ +
+
+
+
+
+ +
diff --git a/muk_web_appsbar/views/res_users.xml b/muk_web_appsbar/views/res_users.xml new file mode 100644 index 0000000..a093c37 --- /dev/null +++ b/muk_web_appsbar/views/res_users.xml @@ -0,0 +1,16 @@ + + + + + + res.users.form + res.users + + + + + + + + + diff --git a/muk_web_chatter/LICENSE b/muk_web_chatter/LICENSE new file mode 100644 index 0000000..0a04128 --- /dev/null +++ b/muk_web_chatter/LICENSE @@ -0,0 +1,165 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. diff --git a/muk_web_chatter/__init__.py b/muk_web_chatter/__init__.py new file mode 100644 index 0000000..0650744 --- /dev/null +++ b/muk_web_chatter/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/muk_web_chatter/__manifest__.py b/muk_web_chatter/__manifest__.py new file mode 100644 index 0000000..707774b --- /dev/null +++ b/muk_web_chatter/__manifest__.py @@ -0,0 +1,54 @@ +{ + 'name': 'MuK Chatter', + 'summary': 'Adds options for the chatter', + 'description': ''' + This module improves the design of the chatter and adds a user + preference to set the position of the chatter in the form view. + ''', + 'version': '18.0.1.2.3', + 'category': 'Tools/UI', + 'license': 'LGPL-3', + 'author': 'MuK IT', + 'website': 'http://www.mukit.at', + 'live_test_url': 'https://my.mukit.at/r/f6m', + 'contributors': [ + 'Mathias Markl ', + ], + 'depends': [ + 'mail', + ], + 'data': [ + 'views/res_users.xml', + ], + 'assets': { + 'web._assets_primary_variables': [ + ( + 'after', + 'web/static/src/scss/primary_variables.scss', + 'muk_web_chatter/static/src/scss/variables.scss' + ), + ], + 'web.assets_backend': [ + 'muk_web_chatter/static/src/core/**/*.*', + 'muk_web_chatter/static/src/chatter/*.scss', + 'muk_web_chatter/static/src/chatter/*.xml', + ( + 'after', + 'mail/static/src/chatter/web_portal/chatter.js', + 'muk_web_chatter/static/src/chatter/chatter.js' + ), + ( + 'after', + 'mail/static/src/chatter/web/form_compiler.js', + 'muk_web_chatter/static/src/views/form/form_compiler.js' + ), + 'muk_web_chatter/static/src/views/form/form_renderer.js', + ], + }, + 'images': [ + 'static/description/banner.png', + ], + 'installable': True, + 'application': False, + 'auto_install': False, +} diff --git a/muk_web_chatter/doc/changelog.rst b/muk_web_chatter/doc/changelog.rst new file mode 100644 index 0000000..bb063cc --- /dev/null +++ b/muk_web_chatter/doc/changelog.rst @@ -0,0 +1,15 @@ +`1.2.0` +------- + +- Hide Notifications + +`1.1.0` +------- + +- Resize Chatter + + +`1.0.0` +------- + +- Initial Release diff --git a/muk_web_chatter/doc/index.rst b/muk_web_chatter/doc/index.rst new file mode 100644 index 0000000..7984aeb --- /dev/null +++ b/muk_web_chatter/doc/index.rst @@ -0,0 +1,57 @@ +=========== +MuK Chatter +=========== + +This module improves the design of the chatter and adds a user +preference to set the position of the chatter in the form view. + +Installation +============ + +To install this module, you need to: + +Download the module and add it to your Odoo addons folder. Afterward, log on to +your Odoo server and go to the Apps menu. Trigger the debug mode and update the +list by clicking on the "Update Apps List" link. Now install the module by +clicking on the install button. + +Upgrade +============ + +To upgrade this module, you need to: + +Download the module and add it to your Odoo addons folder. Restart the server +and log on to your Odoo server. Select the Apps menu and upgrade the module by +clicking on the upgrade button. + +Configuration +============= + +Each user can define in their profile the display of the chatter. The options +are to show the chatter on the side or at the bottom. + +Usage +============= + +The design improvements are automatically activated as soon as the module +is installed. + +Credits +======= + +Contributors +------------ + +* Mathias Markl + +Author & Maintainer +------------------- + +This module is maintained by the `MuK IT GmbH `_. + +MuK IT is an Austrian company specialized in customizing and extending Odoo. +We develop custom solutions for your individual needs to help you focus on +your strength and expertise to grow your business. + +If you want to get in touch please contact us via mail +(sale@mukit.at) or visit our website (https://mukit.at). diff --git a/muk_web_chatter/i18n/de.po b/muk_web_chatter/i18n/de.po new file mode 100644 index 0000000..2c371c8 --- /dev/null +++ b/muk_web_chatter/i18n/de.po @@ -0,0 +1,59 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * muk_web_chatter +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 18.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-11-06 14:05+0000\n" +"PO-Revision-Date: 2024-11-06 14:05+0000\n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: muk_web_chatter +#: model:ir.model.fields.selection,name:muk_web_chatter.selection__res_users__chatter_position__bottom +msgid "Bottom" +msgstr "Unten" + +#. module: muk_web_chatter +#: model:ir.model.fields,field_description:muk_web_chatter.field_res_users__chatter_position +msgid "Chatter Position" +msgstr "Chatterposition" + +#. module: muk_web_chatter +#: model:ir.model,name:muk_web_chatter.model_ir_http +msgid "HTTP Routing" +msgstr "HTTP-Routing" + +#. module: muk_web_chatter +#. odoo-javascript +#: code:addons/muk_web_chatter/static/src/chatter/chatter.xml:0 +msgid "Log note" +msgstr "Log-Notiz" + +#. module: muk_web_chatter +#. odoo-javascript +#: code:addons/muk_web_chatter/static/src/chatter/chatter.xml:0 +msgid "Send message" +msgstr "Nachricht senden" + +#. module: muk_web_chatter +#. odoo-javascript +#: code:addons/muk_web_chatter/static/src/chatter/chatter.xml:0 +msgid "Show/Hide Notifications" +msgstr "Benachrichtigungen ein-/ausblenden" + +#. module: muk_web_chatter +#: model:ir.model.fields.selection,name:muk_web_chatter.selection__res_users__chatter_position__side +msgid "Side" +msgstr "Seite" + +#. module: muk_web_chatter +#: model:ir.model,name:muk_web_chatter.model_res_users +msgid "User" +msgstr "Benutzer" \ No newline at end of file diff --git a/muk_web_chatter/models/__init__.py b/muk_web_chatter/models/__init__.py new file mode 100644 index 0000000..5d0cb83 --- /dev/null +++ b/muk_web_chatter/models/__init__.py @@ -0,0 +1,2 @@ +from . import ir_http +from . import res_users diff --git a/muk_web_chatter/models/ir_http.py b/muk_web_chatter/models/ir_http.py new file mode 100644 index 0000000..9ece1ea --- /dev/null +++ b/muk_web_chatter/models/ir_http.py @@ -0,0 +1,16 @@ +from odoo import models +from odoo.http import request + + +class IrHttp(models.AbstractModel): + + _inherit = "ir.http" + + #---------------------------------------------------------- + # Functions + #---------------------------------------------------------- + + def session_info(self): + result = super(IrHttp, self).session_info() + result['chatter_position'] = self.env.user.chatter_position + return result diff --git a/muk_web_chatter/models/res_users.py b/muk_web_chatter/models/res_users.py new file mode 100644 index 0000000..16a3498 --- /dev/null +++ b/muk_web_chatter/models/res_users.py @@ -0,0 +1,36 @@ +from odoo import models, fields, api + + +class ResUsers(models.Model): + + _inherit = 'res.users' + + #---------------------------------------------------------- + # Properties + #---------------------------------------------------------- + + @property + def SELF_READABLE_FIELDS(self): + return super().SELF_READABLE_FIELDS + [ + 'chatter_position', + ] + + @property + def SELF_WRITEABLE_FIELDS(self): + return super().SELF_WRITEABLE_FIELDS + [ + 'chatter_position', + ] + + #---------------------------------------------------------- + # Fields + #---------------------------------------------------------- + + chatter_position = fields.Selection( + selection=[ + ('side', 'Side'), + ('bottom', 'Bottom'), + ], + string="Chatter Position", + default='side', + required=True, + ) diff --git a/muk_web_chatter/static/description/banner.png b/muk_web_chatter/static/description/banner.png new file mode 100644 index 0000000..db12c14 Binary files /dev/null and b/muk_web_chatter/static/description/banner.png differ diff --git a/muk_web_chatter/static/description/icon.png b/muk_web_chatter/static/description/icon.png new file mode 100644 index 0000000..20619a7 Binary files /dev/null and b/muk_web_chatter/static/description/icon.png differ diff --git a/muk_web_chatter/static/description/icon.svg b/muk_web_chatter/static/description/icon.svg new file mode 100644 index 0000000..5e1e7e5 --- /dev/null +++ b/muk_web_chatter/static/description/icon.svg @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/muk_web_chatter/static/description/index.html b/muk_web_chatter/static/description/index.html new file mode 100644 index 0000000..9500839 --- /dev/null +++ b/muk_web_chatter/static/description/index.html @@ -0,0 +1,171 @@ +
+
+

MuK Chatter

+

Adds options for the chatter

+ +

MuK IT GmbH - www.mukit.at

+
+ + Community + + + Enterprise + +
+
+ +
+
+
+ +
+
+
+

Overview

+

+ This module improves the design of the chatter and adds a user preference + to set the position of the chatter in the form view. Each user can define in + their profile the display of the chatter. The options are to show the chatter + on the side or at the bottom. +

+
+
+
+ +
+
+
+

Chatter Features

+

+ The chat buttons have been improved to become an icon in mobile view to make + better use of space. The chat can also be resized by dragging the divider and + reset by double-clicking. The top bar icon can be used to hide log entries to + improve the readability of the chat. +

+
+ +
+
+
+
+ +
+
+
+

User Settings

+

+ Each user can individually set whether the chatter should be displayed on + the side or below the form view. After changing the setting, a browser + refresh is required for the change to become active. +

+
+ +
+
+
+
+ +
+
+

+ Want more? +

+

+ Are you having troubles with your Odoo integration? Or do you feel + your system lacks of essential features?
If your answer is YES + to one of the above questions, feel free to contact us at anytime + with your inquiry.
We are looking forward to discuss your + needs and plan the next steps with you.
+

+
+ +
+ +
+
+

Our Services

+
+
+
+
+ +
+

+ Odoo
Development +

+
+
+
+
+
+ +
+

+ Odoo
Integration +

+
+
+
+
+
+ +
+

+ Odoo
Infrastructure +

+
+
+
+
+
+ +
+

+ Odoo
Training +

+
+
+
+
+
+ +
+

+ Odoo
Support +

+
+
+
+
+
diff --git a/muk_web_chatter/static/description/logo.png b/muk_web_chatter/static/description/logo.png new file mode 100644 index 0000000..9427ce3 Binary files /dev/null and b/muk_web_chatter/static/description/logo.png differ diff --git a/muk_web_chatter/static/description/screenshot.png b/muk_web_chatter/static/description/screenshot.png new file mode 100644 index 0000000..bad94d7 Binary files /dev/null and b/muk_web_chatter/static/description/screenshot.png differ diff --git a/muk_web_chatter/static/description/screenshot_sidebar.png b/muk_web_chatter/static/description/screenshot_sidebar.png new file mode 100644 index 0000000..45367af Binary files /dev/null and b/muk_web_chatter/static/description/screenshot_sidebar.png differ diff --git a/muk_web_chatter/static/description/screenshot_user.png b/muk_web_chatter/static/description/screenshot_user.png new file mode 100644 index 0000000..11c58b2 Binary files /dev/null and b/muk_web_chatter/static/description/screenshot_user.png differ diff --git a/muk_web_chatter/static/description/service_development.png b/muk_web_chatter/static/description/service_development.png new file mode 100644 index 0000000..d64b66b Binary files /dev/null and b/muk_web_chatter/static/description/service_development.png differ diff --git a/muk_web_chatter/static/description/service_infrastructure.png b/muk_web_chatter/static/description/service_infrastructure.png new file mode 100644 index 0000000..b899a31 Binary files /dev/null and b/muk_web_chatter/static/description/service_infrastructure.png differ diff --git a/muk_web_chatter/static/description/service_integration.png b/muk_web_chatter/static/description/service_integration.png new file mode 100644 index 0000000..76c5e80 Binary files /dev/null and b/muk_web_chatter/static/description/service_integration.png differ diff --git a/muk_web_chatter/static/description/service_support.png b/muk_web_chatter/static/description/service_support.png new file mode 100644 index 0000000..4c530fa Binary files /dev/null and b/muk_web_chatter/static/description/service_support.png differ diff --git a/muk_web_chatter/static/description/service_training.png b/muk_web_chatter/static/description/service_training.png new file mode 100644 index 0000000..19ea76e Binary files /dev/null and b/muk_web_chatter/static/description/service_training.png differ diff --git a/muk_web_chatter/static/src/chatter/chatter.js b/muk_web_chatter/static/src/chatter/chatter.js new file mode 100644 index 0000000..4f18757 --- /dev/null +++ b/muk_web_chatter/static/src/chatter/chatter.js @@ -0,0 +1,26 @@ +import { patch } from "@web/core/utils/patch"; +import { browser } from "@web/core/browser/browser"; + +import { Chatter } from "@mail/chatter/web_portal/chatter"; + +patch(Chatter.prototype, { + setup() { + super.setup(); + const showNotificationMessages = browser.localStorage.getItem( + 'muk_web_chatter.notifications' + ); + this.state.showNotificationMessages = ( + showNotificationMessages != null ? + JSON.parse(showNotificationMessages) : true + ); + }, + onClickNotificationsToggle() { + const showNotificationMessages = !this.state.showNotificationMessages; + browser.localStorage.setItem( + 'muk_web_chatter.notifications', showNotificationMessages + ); + this.state.showNotificationMessages = showNotificationMessages; + }, +}); + + diff --git a/muk_web_chatter/static/src/chatter/chatter.scss b/muk_web_chatter/static/src/chatter/chatter.scss new file mode 100644 index 0000000..10e0a04 --- /dev/null +++ b/muk_web_chatter/static/src/chatter/chatter.scss @@ -0,0 +1,15 @@ +.o-mail-Chatter-top:has(.o-mail-Chatter-sendMessage.active) .o-mail-Composer-send { + @extend .btn-danger +} + +.o-mail-Form-chatter.o-aside { + .mk_chatter_resize { + top: 0; + bottom: 0; + z-index: 1; + width: 5px; + height: 100%; + cursor: col-resize; + position: absolute; + } +} diff --git a/muk_web_chatter/static/src/chatter/chatter.xml b/muk_web_chatter/static/src/chatter/chatter.xml new file mode 100644 index 0000000..6ec95f7 --- /dev/null +++ b/muk_web_chatter/static/src/chatter/chatter.xml @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + props.isChatterAside and props.hasAttachmentPreview and state.thread.attachmentsInWebClientView.length + + + + + + state.showNotificationMessages + + + \ No newline at end of file diff --git a/muk_web_chatter/static/src/core/thread/thread.js b/muk_web_chatter/static/src/core/thread/thread.js new file mode 100644 index 0000000..1cdb9a6 --- /dev/null +++ b/muk_web_chatter/static/src/core/thread/thread.js @@ -0,0 +1,30 @@ +import { patch } from "@web/core/utils/patch"; + +import { Thread } from '@mail/core/common/thread'; + +patch(Thread.prototype, { + get displayMessages() { + let messages = ( + this.props.order === 'asc' ? + this.props.thread.nonEmptyMessages : + [...this.props.thread.nonEmptyMessages].reverse() + ); + if (!this.props.showNotificationMessages) { + messages = messages.filter( + (msg) => !['user_notification', 'notification'].includes( + msg.message_type + ) + ); + } + return messages; + }, +}); + +Thread.props = [ + ...Thread.props, + 'showNotificationMessages?', +]; +Thread.defaultProps = { + ...Thread.defaultProps, + showNotificationMessages: true, +}; \ No newline at end of file diff --git a/muk_web_chatter/static/src/core/thread/thread.xml b/muk_web_chatter/static/src/core/thread/thread.xml new file mode 100644 index 0000000..a5902fe --- /dev/null +++ b/muk_web_chatter/static/src/core/thread/thread.xml @@ -0,0 +1,13 @@ + + + + + + displayMessages + + + diff --git a/muk_web_chatter/static/src/scss/variables.scss b/muk_web_chatter/static/src/scss/variables.scss new file mode 100644 index 0000000..e3adfc4 --- /dev/null +++ b/muk_web_chatter/static/src/scss/variables.scss @@ -0,0 +1,2 @@ +$o-form-renderer-max-width: 3840px; +$o-form-view-sheet-max-width: 2560px; diff --git a/muk_web_chatter/static/src/views/form/form_compiler.js b/muk_web_chatter/static/src/views/form/form_compiler.js new file mode 100644 index 0000000..ad1b5df --- /dev/null +++ b/muk_web_chatter/static/src/views/form/form_compiler.js @@ -0,0 +1,66 @@ +import { session } from '@web/session'; +import { patch } from '@web/core/utils/patch'; +import { append, createElement, setAttributes } from '@web/core/utils/xml'; + +import {FormCompiler} from '@web/views/form/form_compiler'; + +patch(FormCompiler.prototype, { + compile(node, params) { + const res = super.compile(node, params); + const chatterContainerHookXml = res.querySelector( + '.o_form_renderer > .o-mail-Form-chatter' + ); + if (!chatterContainerHookXml) { + return res; + } + setAttributes(chatterContainerHookXml, { + 't-ref': 'chatterContainer', + }); + if (session.chatter_position === 'bottom') { + const formSheetBgXml = res.querySelector('.o_form_sheet_bg'); + if (!chatterContainerHookXml || !formSheetBgXml?.parentNode) { + return res; + } + const webClientViewAttachmentViewHookXml = res.querySelector( + '.o_attachment_preview' + ); + const chatterContainerXml = chatterContainerHookXml.querySelector( + "t[t-component='__comp__.mailComponents.Chatter']" + ); + const sheetBgChatterContainerHookXml = chatterContainerHookXml.cloneNode(true); + const sheetBgChatterContainerXml = sheetBgChatterContainerHookXml.querySelector( + "t[t-component='__comp__.mailComponents.Chatter']" + ); + sheetBgChatterContainerHookXml.classList.add('o-isInFormSheetBg', 'w-auto'); + append(formSheetBgXml, sheetBgChatterContainerHookXml); + setAttributes(sheetBgChatterContainerXml, { + isInFormSheetBg: 'true', + isChatterAside: 'false', + }); + setAttributes(chatterContainerXml, { + isInFormSheetBg: 'true', + isChatterAside: 'false', + }); + setAttributes(chatterContainerHookXml, { + 't-if': 'false', + }); + if (webClientViewAttachmentViewHookXml) { + setAttributes(webClientViewAttachmentViewHookXml, { + 't-if': 'false', + }); + } + } else { + setAttributes(chatterContainerHookXml, { + 't-att-style': '__comp__.chatterState.width ? `width: ${__comp__.chatterState.width}px;` : ""', + }); + const chatterContainerResizeHookXml = createElement('span'); + chatterContainerResizeHookXml.classList.add('mk_chatter_resize'); + setAttributes(chatterContainerResizeHookXml, { + 't-on-mousedown.stop.prevent': '__comp__.onStartChatterResize.bind(__comp__)', + 't-on-dblclick.stop.prevent': '__comp__.onDoubleClickChatterResize.bind(__comp__)', + }); + append(chatterContainerHookXml, chatterContainerResizeHookXml); + } + return res; + }, +}); diff --git a/muk_web_chatter/static/src/views/form/form_renderer.js b/muk_web_chatter/static/src/views/form/form_renderer.js new file mode 100644 index 0000000..9af799a --- /dev/null +++ b/muk_web_chatter/static/src/views/form/form_renderer.js @@ -0,0 +1,56 @@ +import { useState, useRef } from '@odoo/owl'; +import { patch } from '@web/core/utils/patch'; +import { browser } from "@web/core/browser/browser"; + +import { FormRenderer } from '@web/views/form/form_renderer'; + +patch(FormRenderer.prototype, { + setup() { + super.setup(); + this.chatterState = useState({ + width: browser.localStorage.getItem('muk_web_chatter.width'), + }); + this.chatterContainer = useRef('chatterContainer'); + }, + onStartChatterResize(ev) { + if (ev.button !== 0) { + return; + } + const initialX = ev.pageX; + const chatterElement = this.chatterContainer.el; + const initialWidth = chatterElement.offsetWidth; + const resizeStoppingEvents = [ + 'keydown', 'mousedown', 'mouseup' + ]; + const resizePanel = (ev) => { + ev.preventDefault(); + ev.stopPropagation(); + const newWidth = Math.min( + Math.max(50, initialWidth - (ev.pageX - initialX)), + Math.max(chatterElement.parentElement.offsetWidth - 250, 250) + ); + browser.localStorage.setItem('muk_web_chatter.width', newWidth); + this.chatterState.width = newWidth; + }; + const stopResize = (ev) => { + ev.preventDefault(); + ev.stopPropagation(); + if (ev.type === 'mousedown' && ev.button === 0) { + return; + } + document.removeEventListener('mousemove', resizePanel, true); + resizeStoppingEvents.forEach((stoppingEvent) => { + document.removeEventListener(stoppingEvent, stopResize, true); + }); + document.activeElement.blur(); + }; + document.addEventListener('mousemove', resizePanel, true); + resizeStoppingEvents.forEach((stoppingEvent) => { + document.addEventListener(stoppingEvent, stopResize, true); + }); + }, + onDoubleClickChatterResize(ev) { + browser.localStorage.removeItem('muk_web_chatter.width'); + this.chatterState.width = false; + }, +}); diff --git a/muk_web_chatter/views/res_users.xml b/muk_web_chatter/views/res_users.xml new file mode 100644 index 0000000..88b6197 --- /dev/null +++ b/muk_web_chatter/views/res_users.xml @@ -0,0 +1,16 @@ + + + + + + res.users.form + res.users + + + + + + + + + diff --git a/muk_web_colors/LICENSE b/muk_web_colors/LICENSE new file mode 100644 index 0000000..0a04128 --- /dev/null +++ b/muk_web_colors/LICENSE @@ -0,0 +1,165 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. diff --git a/muk_web_colors/__init__.py b/muk_web_colors/__init__.py new file mode 100644 index 0000000..d71f6b1 --- /dev/null +++ b/muk_web_colors/__init__.py @@ -0,0 +1,6 @@ +from . import models + + +def _uninstall_cleanup(env): + env['res.config.settings']._reset_light_color_assets() + env['res.config.settings']._reset_dark_color_assets() diff --git a/muk_web_colors/__manifest__.py b/muk_web_colors/__manifest__.py new file mode 100644 index 0000000..925425a --- /dev/null +++ b/muk_web_colors/__manifest__.py @@ -0,0 +1,48 @@ +{ + 'name': 'MuK Colors', + 'summary': 'Customize your Odoo colors', + 'description': ''' + This module gives you options to customize the theme colors. + ''', + 'version': '18.0.1.0.6', + 'category': 'Tools/UI', + 'license': 'LGPL-3', + 'author': 'MuK IT', + 'website': 'http://www.mukit.at', + 'live_test_url': 'https://my.mukit.at/r/f6m', + 'contributors': [ + 'Mathias Markl ', + ], + 'depends': [ + 'base_setup', + 'web_editor', + ], + 'data': [ + 'templates/webclient.xml', + 'views/res_config_settings.xml', + ], + 'assets': { + 'web._assets_primary_variables': [ + ('prepend', 'muk_web_colors/static/src/scss/colors.scss'), + ( + 'before', + 'muk_web_colors/static/src/scss/colors.scss', + 'muk_web_colors/static/src/scss/colors_light.scss' + ), + ], + 'web.assets_web_dark': [ + ( + 'after', + 'muk_web_colors/static/src/scss/colors.scss', + 'muk_web_colors/static/src/scss/colors_dark.scss' + ), + ], + }, + 'images': [ + 'static/description/banner.png', + ], + 'installable': True, + 'application': False, + 'auto_install': False, + 'uninstall_hook': '_uninstall_cleanup', +} diff --git a/muk_web_colors/doc/changelog.rst b/muk_web_colors/doc/changelog.rst new file mode 100644 index 0000000..4d9690e --- /dev/null +++ b/muk_web_colors/doc/changelog.rst @@ -0,0 +1,4 @@ +`1.0.0` +------- + +- Initial Release diff --git a/muk_web_colors/doc/index.rst b/muk_web_colors/doc/index.rst new file mode 100644 index 0000000..fe2d4ba --- /dev/null +++ b/muk_web_colors/doc/index.rst @@ -0,0 +1,57 @@ +========== +MuK Colors +========== + +This module gives you options to customize the color schema of your Odoo system. +You have options to edit the brand and the primary color as well as the context +colors (info, success, warning, danger). The options are also available for the +dark mode on Odoo Enterprise. + +Installation +============ + +To install this module, you need to: + +Download the module and add it to your Odoo addons folder. Afterward, log on to +your Odoo server and go to the Apps menu. Trigger the debug mode and update the +list by clicking on the "Update Apps List" link. Now install the module by +clicking on the install button. + +Upgrade +============ + +To upgrade this module, you need to: + +Download the module and add it to your Odoo addons folder. Restart the server +and log on to your Odoo server. Select the Apps menu and upgrade the module by +clicking on the upgrade button. + +Configuration +============= + +The colors can be set in the general settings using a color picker. + +Usage +============= + +Once the colors a set the system will adapt for all users. + +Credits +======= + +Contributors +------------ + +* Mathias Markl + +Author & Maintainer +------------------- + +This module is maintained by the `MuK IT GmbH `_. + +MuK IT is an Austrian company specialized in customizing and extending Odoo. +We develop custom solutions for your individual needs to help you focus on +your strength and expertise to grow your business. + +If you want to get in touch please contact us via mail +(sale@mukit.at) or visit our website (https://mukit.at). diff --git a/muk_web_colors/i18n/de.po b/muk_web_colors/i18n/de.po new file mode 100644 index 0000000..2cfa394 --- /dev/null +++ b/muk_web_colors/i18n/de.po @@ -0,0 +1,151 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * muk_web_colors +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 18.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-11-06 14:36+0000\n" +"PO-Revision-Date: 2024-11-06 14:36+0000\n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: muk_web_colors +#: model:ir.model,name:muk_web_colors.model_web_editor_assets +msgid "Assets Utils" +msgstr "" + +#. module: muk_web_colors +#: model_terms:ir.ui.view,arch_db:muk_web_colors.view_res_config_settings_form +msgid "Brand" +msgstr "Marke" + +#. module: muk_web_colors +#: model:ir.model.fields,field_description:muk_web_colors.field_res_config_settings__color_brand_dark +msgid "Brand Dark Color" +msgstr "Marke dunkle Farbe" + +#. module: muk_web_colors +#: model:ir.model.fields,field_description:muk_web_colors.field_res_config_settings__color_brand_light +msgid "Brand Light Color" +msgstr "Marke helle Farbe" + +#. module: muk_web_colors +#: model_terms:ir.ui.view,arch_db:muk_web_colors.view_res_config_settings_form +msgid "Branding" +msgstr "Branding" + +#. module: muk_web_colors +#: model:ir.model,name:muk_web_colors.model_res_config_settings +msgid "Config Settings" +msgstr "Konfigurationseinstellungen" + +#. module: muk_web_colors +#: model_terms:ir.ui.view,arch_db:muk_web_colors.view_res_config_settings_form +msgid "Customize the look and feel of the dark mode" +msgstr "Passen Sie Aussehen und Handhabung des dunklen Modus an" + +#. module: muk_web_colors +#: model_terms:ir.ui.view,arch_db:muk_web_colors.view_res_config_settings_form +msgid "Customize the look and feel of the light mode" +msgstr "Passen Sie Aussehen und Handhabung des hellen Modus an" + +#. module: muk_web_colors +#: model_terms:ir.ui.view,arch_db:muk_web_colors.view_res_config_settings_form +msgid "Danger" +msgstr "Gefahr" + +#. module: muk_web_colors +#: model:ir.model.fields,field_description:muk_web_colors.field_res_config_settings__color_danger_dark +msgid "Danger Dark Color" +msgstr "Gefahr dunkle Farbe" + +#. module: muk_web_colors +#: model:ir.model.fields,field_description:muk_web_colors.field_res_config_settings__color_danger_light +msgid "Danger Light Color" +msgstr "Gefahr helle Farbe" + +#. module: muk_web_colors +#: model_terms:ir.ui.view,arch_db:muk_web_colors.view_res_config_settings_form +msgid "Dark Mode Colors" +msgstr "Farben dunkler Modus" + +#. module: muk_web_colors +#: model_terms:ir.ui.view,arch_db:muk_web_colors.view_res_config_settings_form +msgid "Info" +msgstr "Information" + +#. module: muk_web_colors +#: model:ir.model.fields,field_description:muk_web_colors.field_res_config_settings__color_info_dark +msgid "Info Dark Color" +msgstr "Information dunkle Farbe" + +#. module: muk_web_colors +#: model:ir.model.fields,field_description:muk_web_colors.field_res_config_settings__color_info_light +msgid "Info Light Color" +msgstr "Information helle Farbe" + +#. module: muk_web_colors +#: model_terms:ir.ui.view,arch_db:muk_web_colors.view_res_config_settings_form +msgid "Light Mode Colors" +msgstr "Farben heller Modus" + +#. module: muk_web_colors +#: model_terms:ir.ui.view,arch_db:muk_web_colors.view_res_config_settings_form +msgid "Primary" +msgstr "Primär" + +#. module: muk_web_colors +#: model:ir.model.fields,field_description:muk_web_colors.field_res_config_settings__color_primary_dark +msgid "Primary Dark Color" +msgstr "Primäre dunkle Farbe" + +#. module: muk_web_colors +#: model:ir.model.fields,field_description:muk_web_colors.field_res_config_settings__color_primary_light +msgid "Primary Light Color" +msgstr "Primäre helle Farbe" + +#. module: muk_web_colors +#: model_terms:ir.ui.view,arch_db:muk_web_colors.view_res_config_settings_form +msgid "Reset Dark Colors" +msgstr "dunkle Farbe zurücksetzen" + +#. module: muk_web_colors +#: model_terms:ir.ui.view,arch_db:muk_web_colors.view_res_config_settings_form +msgid "Reset Light Colors" +msgstr "helle Farbe zurücksetzen" + +#. module: muk_web_colors +#: model_terms:ir.ui.view,arch_db:muk_web_colors.view_res_config_settings_form +msgid "Success" +msgstr "Erfolg" + +#. module: muk_web_colors +#: model:ir.model.fields,field_description:muk_web_colors.field_res_config_settings__color_success_dark +msgid "Success Dark Color" +msgstr "Erfolg dunkle Farbe" + +#. module: muk_web_colors +#: model:ir.model.fields,field_description:muk_web_colors.field_res_config_settings__color_success_light +msgid "Success Light Color" +msgstr "Erfolg helle Farbe" + +#. module: muk_web_colors +#: model_terms:ir.ui.view,arch_db:muk_web_colors.view_res_config_settings_form +msgid "Warning" +msgstr "Warnung" + +#. module: muk_web_colors +#: model:ir.model.fields,field_description:muk_web_colors.field_res_config_settings__color_warning_dark +msgid "Warning Dark Color" +msgstr "Warnung dunkle Farbe" + +#. module: muk_web_colors +#: model:ir.model.fields,field_description:muk_web_colors.field_res_config_settings__color_warning_light +msgid "Warning Light Color" +msgstr "Warnung helle Farbe" \ No newline at end of file diff --git a/muk_web_colors/models/__init__.py b/muk_web_colors/models/__init__.py new file mode 100644 index 0000000..4c9f7ff --- /dev/null +++ b/muk_web_colors/models/__init__.py @@ -0,0 +1,2 @@ +from . import res_config_settings +from . import web_editor_assets diff --git a/muk_web_colors/models/res_config_settings.py b/muk_web_colors/models/res_config_settings.py new file mode 100644 index 0000000..390f01a --- /dev/null +++ b/muk_web_colors/models/res_config_settings.py @@ -0,0 +1,213 @@ +from odoo import api, fields, models + + +class ResConfigSettings(models.TransientModel): + + _inherit = 'res.config.settings' + + # ---------------------------------------------------------- + # Properties + # ---------------------------------------------------------- + + @property + def COLOR_FIELDS(self): + return [ + 'color_brand', + 'color_primary', + 'color_success', + 'color_info', + 'color_warning', + 'color_danger', + ] + + @property + def COLOR_ASSET_LIGHT_URL(self): + return '/muk_web_colors/static/src/scss/colors_light.scss' + + @property + def COLOR_BUNDLE_LIGHT_NAME(self): + return 'web._assets_primary_variables' + + @property + def COLOR_ASSET_DARK_URL(self): + return '/muk_web_colors/static/src/scss/colors_dark.scss' + + @property + def COLOR_BUNDLE_DARK_NAME(self): + return 'web.assets_web_dark' + + #---------------------------------------------------------- + # Fields Light Mode + #---------------------------------------------------------- + + color_brand_light = fields.Char( + string='Brand Light Color' + ) + + color_primary_light = fields.Char( + string='Primary Light Color' + ) + + color_success_light = fields.Char( + string='Success Light Color' + ) + + color_info_light = fields.Char( + string='Info Light Color' + ) + + color_warning_light = fields.Char( + string='Warning Light Color' + ) + + color_danger_light = fields.Char( + string='Danger Light Color' + ) + + #---------------------------------------------------------- + # Fields Dark Mode + #---------------------------------------------------------- + + color_brand_dark = fields.Char( + string='Brand Dark Color' + ) + + color_primary_dark = fields.Char( + string='Primary Dark Color' + ) + + color_success_dark = fields.Char( + string='Success Dark Color' + ) + + color_info_dark = fields.Char( + string='Info Dark Color' + ) + + color_warning_dark = fields.Char( + string='Warning Dark Color' + ) + + color_danger_dark = fields.Char( + string='Danger Dark Color' + ) + + #---------------------------------------------------------- + # Helper + #---------------------------------------------------------- + + def _get_light_color_values(self): + return self.env['web_editor.assets'].get_color_variables_values( + self.COLOR_ASSET_LIGHT_URL, + self.COLOR_BUNDLE_LIGHT_NAME, + self.COLOR_FIELDS + ) + + def _get_dark_color_values(self): + return self.env['web_editor.assets'].get_color_variables_values( + self.COLOR_ASSET_DARK_URL, + self.COLOR_BUNDLE_DARK_NAME, + self.COLOR_FIELDS + ) + + def _set_light_color_values(self, values): + colors = self._get_light_color_values() + for var, value in colors.items(): + values[f'{var}_light'] = value + return values + + def _set_dark_color_values(self, values): + colors = self._get_dark_color_values() + for var, value in colors.items(): + values[f'{var}_dark'] = value + return values + + def _detect_light_color_change(self): + colors = self._get_light_color_values() + return any( + self[f'{var}_light'] != val + for var, val in colors.items() + ) + + def _detect_dark_color_change(self): + colors = self._get_dark_color_values() + return any( + self[f'{var}_dark'] != val + for var, val in colors.items() + ) + + def _replace_light_color_values(self): + variables = [ + { + 'name': field, + 'value': self[f'{field}_light'] + } + for field in self.COLOR_FIELDS + ] + return self.env['web_editor.assets'].replace_color_variables_values( + self.COLOR_ASSET_LIGHT_URL, + self.COLOR_BUNDLE_LIGHT_NAME, + variables + ) + + def _replace_dark_color_values(self): + variables = [ + { + 'name': field, + 'value': self[f'{field}_dark'] + } + for field in self.COLOR_FIELDS + ] + return self.env['web_editor.assets'].replace_color_variables_values( + self.COLOR_ASSET_DARK_URL, + self.COLOR_BUNDLE_DARK_NAME, + variables + ) + + def _reset_light_color_assets(self): + self.env['web_editor.assets'].reset_color_asset( + self.COLOR_ASSET_LIGHT_URL, + self.COLOR_BUNDLE_LIGHT_NAME, + ) + + def _reset_dark_color_assets(self): + self.env['web_editor.assets'].reset_asset( + self.COLOR_ASSET_DARK_URL, + self.COLOR_BUNDLE_DARK_NAME, + ) + + #---------------------------------------------------------- + # Action + #---------------------------------------------------------- + + def action_reset_light_color_assets(self): + self._reset_light_color_assets() + return { + 'type': 'ir.actions.client', + 'tag': 'reload', + } + + def action_reset_dark_color_assets(self): + self._reset_dark_color_assets() + return { + 'type': 'ir.actions.client', + 'tag': 'reload', + } + + #---------------------------------------------------------- + # Functions + #---------------------------------------------------------- + + def get_values(self): + res = super().get_values() + res = self._set_light_color_values(res) + res = self._set_dark_color_values(res) + return res + + def set_values(self): + res = super().set_values() + if self._detect_light_color_change(): + self._replace_light_color_values() + if self._detect_dark_color_change(): + self._replace_dark_color_values() + return res diff --git a/muk_web_colors/models/web_editor_assets.py b/muk_web_colors/models/web_editor_assets.py new file mode 100644 index 0000000..ef28174 --- /dev/null +++ b/muk_web_colors/models/web_editor_assets.py @@ -0,0 +1,121 @@ +import re +import base64 + +from odoo import models, fields, api +from odoo.tools import misc + +from odoo.addons.base.models.assetsbundle import EXTENSIONS + + +class ScssEditor(models.AbstractModel): + + _inherit = 'web_editor.assets' + + # ---------------------------------------------------------- + # Helper + # ---------------------------------------------------------- + + @api.model + def _get_colors_attachment(self, custom_url): + return self.env['ir.attachment'].search([ + ('url', '=', custom_url) + ]) + + @api.model + def _get_colors_asset(self, custom_url): + return self.env['ir.asset'].search([ + ('path', 'like', custom_url) + ]) + + @api.model + def _get_colors_from_url(self, url, bundle): + custom_url = self._make_custom_asset_url(url, bundle) + url_info = self._get_data_from_url(custom_url) + if url_info['customized']: + attachment = self._get_colors_attachment( + custom_url + ) + if attachment: + return base64.b64decode(attachment.datas) + with misc.file_open(url.strip('/'), 'rb', filter_ext=EXTENSIONS) as f: + return f.read() + + def _get_color_variable(self, content, variable): + value = re.search(fr'\$mk_{variable}\:?\s(.*?);', content) + return value and value.group(1) + + def _get_color_variables(self, content, variables): + return { + var: self._get_color_variable(content, var) + for var in variables + } + + def _replace_color_variables(self, content, variables): + for variable in variables: + content = re.sub( + fr'{variable["name"]}\:?\s(.*?);', + f'{variable["name"]}: {variable["value"]};', + content + ) + return content + + @api.model + def _save_color_asset(self, url, bundle, content): + custom_url = self._make_custom_asset_url(url, bundle) + asset_url = url[1:] if url.startswith(('/', '\\')) else url + datas = base64.b64encode((content or "\n").encode("utf-8")) + custom_attachment = self._get_colors_attachment( + custom_url + ) + if custom_attachment: + custom_attachment.write({"datas": datas}) + self.env.registry.clear_cache('assets') + else: + attachment_values = { + 'name': url.split("/")[-1], + 'type': "binary", + 'mimetype': 'text/scss', + 'datas': datas, + 'url': custom_url, + } + asset_values = { + 'path': custom_url, + 'target': url, + 'directive': 'replace', + } + target_asset = self._get_colors_asset( + asset_url + ) + if target_asset: + asset_values['name'] = '%s override' % target_asset.name + asset_values['bundle'] = target_asset.bundle + asset_values['sequence'] = target_asset.sequence + else: + asset_values['name'] = '%s: replace %s' % ( + bundle, custom_url.split('/')[-1] + ) + asset_values['bundle'] = self.env['ir.asset']._get_related_bundle( + url, bundle + ) + self.env['ir.attachment'].create(attachment_values) + self.env['ir.asset'].create(asset_values) + + # ---------------------------------------------------------- + # Functions + # ---------------------------------------------------------- + + def get_color_variables_values(self, url, bundle, variables): + content = self._get_colors_from_url(url, bundle) + return self._get_color_variables( + content.decode('utf-8'), variables + ) + + def replace_color_variables_values(self, url, bundle, variables): + original = self._get_colors_from_url(url, bundle).decode('utf-8') + content = self._replace_color_variables(original, variables) + self._save_color_asset(url, bundle, content) + + def reset_color_asset(self, url, bundle): + custom_url = self._make_custom_asset_url(url, bundle) + self._get_colors_attachment(custom_url).unlink() + self._get_colors_asset(custom_url).unlink() diff --git a/muk_web_colors/static/description/banner.png b/muk_web_colors/static/description/banner.png new file mode 100644 index 0000000..b08a7f7 Binary files /dev/null and b/muk_web_colors/static/description/banner.png differ diff --git a/muk_web_colors/static/description/icon.png b/muk_web_colors/static/description/icon.png new file mode 100644 index 0000000..44302d6 Binary files /dev/null and b/muk_web_colors/static/description/icon.png differ diff --git a/muk_web_colors/static/description/icon.svg b/muk_web_colors/static/description/icon.svg new file mode 100644 index 0000000..4a324b9 --- /dev/null +++ b/muk_web_colors/static/description/icon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/muk_web_colors/static/description/index.html b/muk_web_colors/static/description/index.html new file mode 100644 index 0000000..7fab894 --- /dev/null +++ b/muk_web_colors/static/description/index.html @@ -0,0 +1,152 @@ +
+
+

MuK Colors

+

Customize your Odoo colors

+ +

MuK IT GmbH - www.mukit.at

+
+ + Community + + + Enterprise + +
+
+ +
+
+
+ +
+
+
+

Overview

+

+ This module gives you options to customize the color schema of your Odoo system. + You have options to edit the brand and the primary color as well as the context + colors (info, success, warning, danger). +

+
+
+
+ +
+
+
+

Dark Mode

+

+ With the Enterprise version, the colours for the dark mode can be changed in + the same way as for the light mode. +

+
+ +
+
+
+
+ +
+
+

+ Want more? +

+

+ Are you having troubles with your Odoo integration? Or do you feel + your system lacks of essential features?
If your answer is YES + to one of the above questions, feel free to contact us at anytime + with your inquiry.
We are looking forward to discuss your + needs and plan the next steps with you.
+

+
+ +
+ +
+
+

Our Services

+
+
+
+
+ +
+

+ Odoo
Development +

+
+
+
+
+
+ +
+

+ Odoo
Integration +

+
+
+
+
+
+ +
+

+ Odoo
Infrastructure +

+
+
+
+
+
+ +
+

+ Odoo
Training +

+
+
+
+
+
+ +
+

+ Odoo
Support +

+
+
+
+
+
diff --git a/muk_web_colors/static/description/logo.png b/muk_web_colors/static/description/logo.png new file mode 100644 index 0000000..9427ce3 Binary files /dev/null and b/muk_web_colors/static/description/logo.png differ diff --git a/muk_web_colors/static/description/screenshot.png b/muk_web_colors/static/description/screenshot.png new file mode 100644 index 0000000..3f397a1 Binary files /dev/null and b/muk_web_colors/static/description/screenshot.png differ diff --git a/muk_web_colors/static/description/screenshot_dark.png b/muk_web_colors/static/description/screenshot_dark.png new file mode 100644 index 0000000..689e149 Binary files /dev/null and b/muk_web_colors/static/description/screenshot_dark.png differ diff --git a/muk_web_colors/static/description/service_development.png b/muk_web_colors/static/description/service_development.png new file mode 100644 index 0000000..d64b66b Binary files /dev/null and b/muk_web_colors/static/description/service_development.png differ diff --git a/muk_web_colors/static/description/service_infrastructure.png b/muk_web_colors/static/description/service_infrastructure.png new file mode 100644 index 0000000..b899a31 Binary files /dev/null and b/muk_web_colors/static/description/service_infrastructure.png differ diff --git a/muk_web_colors/static/description/service_integration.png b/muk_web_colors/static/description/service_integration.png new file mode 100644 index 0000000..76c5e80 Binary files /dev/null and b/muk_web_colors/static/description/service_integration.png differ diff --git a/muk_web_colors/static/description/service_support.png b/muk_web_colors/static/description/service_support.png new file mode 100644 index 0000000..4c530fa Binary files /dev/null and b/muk_web_colors/static/description/service_support.png differ diff --git a/muk_web_colors/static/description/service_training.png b/muk_web_colors/static/description/service_training.png new file mode 100644 index 0000000..19ea76e Binary files /dev/null and b/muk_web_colors/static/description/service_training.png differ diff --git a/muk_web_colors/static/src/scss/colors.scss b/muk_web_colors/static/src/scss/colors.scss new file mode 100644 index 0000000..8022f8b --- /dev/null +++ b/muk_web_colors/static/src/scss/colors.scss @@ -0,0 +1 @@ +// Color Assets \ No newline at end of file diff --git a/muk_web_colors/static/src/scss/colors_dark.scss b/muk_web_colors/static/src/scss/colors_dark.scss new file mode 100644 index 0000000..6a323c5 --- /dev/null +++ b/muk_web_colors/static/src/scss/colors_dark.scss @@ -0,0 +1,31 @@ +// Colors + +$mk_color_brand: #243742; +$mk_color_primary: #5D8DA8; + +$mk_color_success: #1DC959; +$mk_color_info: #6AB5FB; +$mk_color_warning: #FBB56A; +$mk_color_danger: #FF5757; + +// Override + +$o-community-color: $mk-color-brand; +$o-enterprise-color: $mk-color-brand; +$o-enterprise-action-color: $mk-color-primary; + +$o-brand-odoo: $mk-color-brand; +$o-brand-primary: $mk-color-primary; + +$o-success: $mk-color-success; +$o-info: $mk-color-info; +$o-warning: $mk-color-warning; +$o-danger: $mk-color-danger; + +$o-theme-text-colors: ( + "primary": $mk-color-brand, + "success": $o-success, + "info": $o-info, + "warning": $o-warning, + "danger": $o-danger, +); diff --git a/muk_web_colors/static/src/scss/colors_light.scss b/muk_web_colors/static/src/scss/colors_light.scss new file mode 100644 index 0000000..771a75b --- /dev/null +++ b/muk_web_colors/static/src/scss/colors_light.scss @@ -0,0 +1,31 @@ +// Colors + +$mk_color_brand: #243742; +$mk_color_primary: #5D8DA8; + +$mk_color_success: #28A745; +$mk_color_info: #17A2B8; +$mk_color_warning: #FFAC00; +$mk_color_danger: #DC3545; + +// Override + +$o-community-color: $mk-color-brand; +$o-enterprise-color: $mk-color-brand; +$o-enterprise-action-color: $mk-color-primary; + +$o-brand-odoo: $mk-color-brand; +$o-brand-primary: $mk-color-primary; + +$o-success: $mk-color-success; +$o-info: $mk-color-info; +$o-warning: $mk-color-warning; +$o-danger: $mk-color-danger; + +$o-theme-text-colors: ( + "primary": $mk-color-brand, + "success": $o-success, + "info": $o-info, + "warning": $o-warning, + "danger": $o-danger, +); diff --git a/muk_web_colors/templates/webclient.xml b/muk_web_colors/templates/webclient.xml new file mode 100644 index 0000000..7664a7a --- /dev/null +++ b/muk_web_colors/templates/webclient.xml @@ -0,0 +1,14 @@ + + + + + + + diff --git a/muk_web_colors/views/res_config_settings.xml b/muk_web_colors/views/res_config_settings.xml new file mode 100644 index 0000000..20b9c28 --- /dev/null +++ b/muk_web_colors/views/res_config_settings.xml @@ -0,0 +1,83 @@ + + + + + + res.config.settings.form + res.config.settings + + + + + +
+
+
+
+
+
+
+
+
+
+
+
+ +
+ + + diff --git a/muk_web_dialog/static/src/views/view_dialogs/select_create_dialog.js b/muk_web_dialog/static/src/views/view_dialogs/select_create_dialog.js new file mode 100644 index 0000000..1f6ac29 --- /dev/null +++ b/muk_web_dialog/static/src/views/view_dialogs/select_create_dialog.js @@ -0,0 +1,11 @@ +import { patch } from '@web/core/utils/patch'; + +import { SelectCreateDialog } from '@web/views/view_dialogs/select_create_dialog'; + +patch(SelectCreateDialog.prototype, { + onClickDialogSizeToggle() { + this.env.dialogData.size = ( + this.env.dialogData.size === 'fs' ? this.env.dialogData.initalSize : 'fs' + ); + } +}); \ No newline at end of file diff --git a/muk_web_dialog/views/res_users.xml b/muk_web_dialog/views/res_users.xml new file mode 100644 index 0000000..eb6437a --- /dev/null +++ b/muk_web_dialog/views/res_users.xml @@ -0,0 +1,16 @@ + + + + + + res.users.form + res.users + + + + + + + + + diff --git a/muk_web_enterprise_theme/LICENSE b/muk_web_enterprise_theme/LICENSE new file mode 100644 index 0000000..0a04128 --- /dev/null +++ b/muk_web_enterprise_theme/LICENSE @@ -0,0 +1,165 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. diff --git a/muk_web_enterprise_theme/__init__.py b/muk_web_enterprise_theme/__init__.py new file mode 100644 index 0000000..22bcbaa --- /dev/null +++ b/muk_web_enterprise_theme/__init__.py @@ -0,0 +1,18 @@ +from . import models + +import base64 + +from odoo.tools import file_open + + +def _setup_module(env): + if env.ref('base.main_company', False): + with file_open('web/static/img/favicon.ico', 'rb') as file: + env.ref('base.main_company').write({ + 'favicon': base64.b64encode(file.read()) + }) + + +def _uninstall_cleanup(env): + env['res.config.settings']._reset_light_theme_color_assets() + env['res.config.settings']._reset_dark_theme_color_assets() diff --git a/muk_web_enterprise_theme/__manifest__.py b/muk_web_enterprise_theme/__manifest__.py new file mode 100644 index 0000000..51f33c1 --- /dev/null +++ b/muk_web_enterprise_theme/__manifest__.py @@ -0,0 +1,65 @@ +{ + 'name': 'MuK Backend Theme', + 'summary': 'Odoo Enterprise Backend Theme', + 'description': ''' + This module offers a mobile compatible design for Odoo Enterprise. + Furthermore it allows the user to define some design preferences. + ''', + 'version': '18.0.1.2.3', + 'category': 'Themes/Backend', + 'license': 'LGPL-3', + 'author': 'MuK IT', + 'website': 'http://www.mukit.at', + 'live_test_url': 'https://my.mukit.at/r/f6m', + 'contributors': [ + 'Mathias Markl ', + ], + 'depends': [ + 'web_enterprise', + 'muk_web_chatter', + 'muk_web_dialog', + 'muk_web_appsbar', + 'muk_web_colors', + ], + 'data': [ + 'templates/web_layout.xml', + 'views/res_config_settings.xml', + ], + 'assets': { + 'web._assets_primary_variables': [ + ( + 'before', + 'muk_web_colors/static/src/scss/colors.scss', + 'muk_web_enterprise_theme/static/src/scss/colors_light.scss' + ), + ( + 'after', + 'web/static/src/scss/primary_variables.scss', + 'muk_web_enterprise_theme/static/src/scss/variables.scss' + ), + ], + 'web.assets_backend': [ + 'muk_web_enterprise_theme/static/src/webclient/**/*.xml', + 'muk_web_enterprise_theme/static/src/webclient/**/*.js', + 'muk_web_enterprise_theme/static/src/views/**/*.scss', + ('remove', 'muk_web_enterprise_theme/static/src/**/*.dark.scss'), + ], + "web.assets_web_dark": [ + ( + 'after', + 'muk_web_colors/static/src/scss/colors.scss', + 'muk_web_enterprise_theme/static/src/scss/colors_dark.scss' + ), + 'muk_web_enterprise_theme/static/src/**/*.dark.scss', + ], + }, + 'images': [ + 'static/description/banner.png', + 'static/description/theme_screenshot.png' + ], + 'installable': True, + 'application': False, + 'auto_install': False, + 'post_init_hook': '_setup_module', + 'uninstall_hook': '_uninstall_cleanup', +} diff --git a/muk_web_enterprise_theme/doc/changelog.rst b/muk_web_enterprise_theme/doc/changelog.rst new file mode 100644 index 0000000..8758242 --- /dev/null +++ b/muk_web_enterprise_theme/doc/changelog.rst @@ -0,0 +1,14 @@ +`1.2.0` +------- + +- Add Dialog Module + +`1.1.0` +------- + +- Add Chatter Module + +`1.0.0` +------- + +- Initial Release diff --git a/muk_web_enterprise_theme/doc/index.rst b/muk_web_enterprise_theme/doc/index.rst new file mode 100644 index 0000000..772194f --- /dev/null +++ b/muk_web_enterprise_theme/doc/index.rst @@ -0,0 +1,58 @@ +================= +MuK Backend Theme +================= + +This module offers a mobile compatible design for Odoo Enterprise. Furthermore it +allows the user to define some design preferences. Each user can choose the size +of the sidebar. In addition, the background image of the home menu can be set +for each company. + +Installation +============ + +To install this module, you need to: + +Download the module and add it to your Odoo addons folder. Afterward, log on to +your Odoo server and go to the Apps menu. Trigger the debug mode and update the +list by clicking on the "Update Apps List" link. Now install the module by +clicking on the install button. + +Upgrade +============ + +To upgrade this module, you need to: + +Download the module and add it to your Odoo addons folder. Restart the server +and log on to your Odoo server. Select the Apps menu and upgrade the module by +clicking on the upgrade button. + +Configuration +============= + +To further customize the theme several settings are available in the general +settings page. + +Usage +============= + +After the module is installed, the design is adjusted accordingly. + +Credits +======= + +Contributors +------------ + +* Mathias Markl + +Author & Maintainer +------------------- + +This module is maintained by the `MuK IT GmbH `_. + +MuK IT is an Austrian company specialized in customizing and extending Odoo. +We develop custom solutions for your individual needs to help you focus on +your strength and expertise to grow your business. + +If you want to get in touch please contact us via mail +(sale@mukit.at) or visit our website (https://mukit.at). diff --git a/muk_web_enterprise_theme/i18n/de.po b/muk_web_enterprise_theme/i18n/de.po new file mode 100644 index 0000000..8f28f78 --- /dev/null +++ b/muk_web_enterprise_theme/i18n/de.po @@ -0,0 +1,134 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * muk_web_enterprise_theme +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 18.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-11-06 13:40+0000\n" +"PO-Revision-Date: 2024-11-06 13:40+0000\n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: muk_web_enterprise_theme +#: model_terms:ir.ui.view,arch_db:muk_web_enterprise_theme.view_res_config_settings_colors_form +msgid "Apps Active" +msgstr "Aktive Apps" + +#. module: muk_web_enterprise_theme +#: model:ir.model.fields,field_description:muk_web_enterprise_theme.field_res_company__background_image_dark +#: model:ir.model.fields,field_description:muk_web_enterprise_theme.field_res_config_settings__theme_background_image_dark +msgid "Apps Menu Background Dark Image" +msgstr "dunkles Hintergrundbild Appsmenü" + +#. module: muk_web_enterprise_theme +#: model:ir.model.fields,field_description:muk_web_enterprise_theme.field_res_company__background_image_light +#: model:ir.model.fields,field_description:muk_web_enterprise_theme.field_res_config_settings__theme_background_image_light +msgid "Apps Menu Background Light Image" +msgstr "helles Hintergrundbild Appsmenü" + +#. module: muk_web_enterprise_theme +#: model_terms:ir.ui.view,arch_db:muk_web_enterprise_theme.view_res_config_settings_colors_form +msgid "Apps Text" +msgstr "Appstext" + +#. module: muk_web_enterprise_theme +#: model_terms:ir.ui.view,arch_db:muk_web_enterprise_theme.view_res_config_settings_colors_form +msgid "AppsBar" +msgstr "Appsleiste" + +#. module: muk_web_enterprise_theme +#: model:ir.model.fields,field_description:muk_web_enterprise_theme.field_res_config_settings__theme_color_appbar_active_dark +msgid "AppsBar Active Dark Color" +msgstr "aktive dunkle Farbe Appsleiste" + +#. module: muk_web_enterprise_theme +#: model:ir.model.fields,field_description:muk_web_enterprise_theme.field_res_config_settings__theme_color_appbar_active_light +msgid "AppsBar Active Light Color" +msgstr "aktive helle Farbe Appsleiste" + +#. module: muk_web_enterprise_theme +#: model:ir.model.fields,field_description:muk_web_enterprise_theme.field_res_config_settings__theme_color_appbar_background_dark +msgid "AppsBar Background Dark Color" +msgstr "dunkle Hintergrundfarbe Appsleiste" + +#. module: muk_web_enterprise_theme +#: model:ir.model.fields,field_description:muk_web_enterprise_theme.field_res_config_settings__theme_color_appbar_background_light +msgid "AppsBar Background Light Color" +msgstr "helle Hintergrundfarbe Appsleiste" + +#. module: muk_web_enterprise_theme +#: model:ir.model.fields,field_description:muk_web_enterprise_theme.field_res_config_settings__theme_color_appbar_text_dark +msgid "AppsBar Text Dark Color" +msgstr "dunkle Textfarbe Appsleiste" + +#. module: muk_web_enterprise_theme +#: model:ir.model.fields,field_description:muk_web_enterprise_theme.field_res_config_settings__theme_color_appbar_text_light +msgid "AppsBar Text Light Color" +msgstr "helle Textfarbe Appsleiste" + +#. module: muk_web_enterprise_theme +#: model_terms:ir.ui.view,arch_db:muk_web_enterprise_theme.view_res_config_settings_colors_form +msgid "Backend Theme" +msgstr "Backend-Theme" + +#. module: muk_web_enterprise_theme +#: model_terms:ir.ui.view,arch_db:muk_web_enterprise_theme.view_res_config_settings_colors_form +msgid "Background" +msgstr "Hintergrund" + +#. module: muk_web_enterprise_theme +#: model:ir.model,name:muk_web_enterprise_theme.model_res_company +msgid "Companies" +msgstr "Unternehmen" + +#. module: muk_web_enterprise_theme +#: model:ir.model.fields,field_description:muk_web_enterprise_theme.field_res_company__favicon +#: model:ir.model.fields,field_description:muk_web_enterprise_theme.field_res_config_settings__theme_favicon +msgid "Company Favicon" +msgstr "Unternehmens Favicon" + +#. module: muk_web_enterprise_theme +#: model:ir.model,name:muk_web_enterprise_theme.model_res_config_settings +msgid "Config Settings" +msgstr "Konfigurationseinstellungen" + +#. module: muk_web_enterprise_theme +#: model_terms:ir.ui.view,arch_db:muk_web_enterprise_theme.view_res_config_settings_colors_form +msgid "Dark Mode Background Image" +msgstr "Hintergrundbild dunkler Modus" + +#. module: muk_web_enterprise_theme +#: model_terms:ir.ui.view,arch_db:muk_web_enterprise_theme.view_res_config_settings_colors_form +msgid "Favicon" +msgstr "Favicon" + +#. module: muk_web_enterprise_theme +#: model:ir.model,name:muk_web_enterprise_theme.model_ir_http +msgid "HTTP Routing" +msgstr "HTTP-Routing" + +#. module: muk_web_enterprise_theme +#: model_terms:ir.ui.view,arch_db:muk_web_enterprise_theme.view_res_config_settings_colors_form +msgid "Light Mode Background Image" +msgstr "Hintergrundbild heller Modus" + +#. module: muk_web_enterprise_theme +#: model_terms:ir.ui.view,arch_db:muk_web_enterprise_theme.view_res_config_settings_colors_form +msgid "Set the background image for the apps menu" +msgstr "Legen Sie das Hintergrundbild für das Appsmenü fest" + +#. module: muk_web_enterprise_theme +#: model_terms:ir.ui.view,arch_db:muk_web_enterprise_theme.view_res_config_settings_colors_form +msgid "Set your own Logo for the appsbar" +msgstr "Legen Sie ihr eigenes Logo für die Appsleiste fest" + +#. module: muk_web_enterprise_theme +#: model_terms:ir.ui.view,arch_db:muk_web_enterprise_theme.view_res_config_settings_colors_form +msgid "Set your own favicon" +msgstr "Legen Sie ihr eigenes Favicon fest" \ No newline at end of file diff --git a/muk_web_enterprise_theme/models/__init__.py b/muk_web_enterprise_theme/models/__init__.py new file mode 100644 index 0000000..c674f0d --- /dev/null +++ b/muk_web_enterprise_theme/models/__init__.py @@ -0,0 +1,3 @@ +from . import ir_http +from . import res_company +from . import res_config_settings diff --git a/muk_web_enterprise_theme/models/ir_http.py b/muk_web_enterprise_theme/models/ir_http.py new file mode 100644 index 0000000..ae9b0ee --- /dev/null +++ b/muk_web_enterprise_theme/models/ir_http.py @@ -0,0 +1,21 @@ +from odoo import models +from odoo.http import request + + +class IrHttp(models.AbstractModel): + + _inherit = "ir.http" + + #---------------------------------------------------------- + # Functions + #---------------------------------------------------------- + + def session_info(self): + result = super(IrHttp, self).session_info() + if request.env.user._is_internal(): + for company in request.env.user.company_ids.with_context(bin_size=True): + result['user_companies']['allowed_companies'][company.id].update({ + 'has_background_image_light': bool(company.background_image_light), + 'has_background_image_dark': bool(company.background_image_dark), + }) + return result diff --git a/muk_web_enterprise_theme/models/res_company.py b/muk_web_enterprise_theme/models/res_company.py new file mode 100644 index 0000000..ba59181 --- /dev/null +++ b/muk_web_enterprise_theme/models/res_company.py @@ -0,0 +1,26 @@ +from odoo import models, fields + + +class ResCompany(models.Model): + + _inherit = 'res.company' + + #---------------------------------------------------------- + # Fields + #---------------------------------------------------------- + + favicon = fields.Binary( + string="Company Favicon", + attachment=True + ) + + background_image_light = fields.Binary( + string='Apps Menu Background Light Image', + attachment=True + ) + + background_image_dark = fields.Binary( + string='Apps Menu Background Dark Image', + attachment=True + ) + diff --git a/muk_web_enterprise_theme/models/res_config_settings.py b/muk_web_enterprise_theme/models/res_config_settings.py new file mode 100644 index 0000000..5f8ec4c --- /dev/null +++ b/muk_web_enterprise_theme/models/res_config_settings.py @@ -0,0 +1,187 @@ +from odoo import api, fields, models + + +class ResConfigSettings(models.TransientModel): + + _inherit = 'res.config.settings' + + @property + def THEME_COLOR_FIELDS(self): + return [ + 'color_appbar_text', + 'color_appbar_active', + 'color_appbar_background', + ] + + @property + def COLOR_ASSET_THEME_LIGHT_URL(self): + return '/muk_web_enterprise_theme/static/src/scss/colors_light.scss' + + @property + def COLOR_BUNDLE_THEME_LIGHT_NAME(self): + return 'web._assets_primary_variables' + + @property + def COLOR_ASSET_THEME_DARK_URL(self): + return '/muk_web_enterprise_theme/static/src/scss/colors_dark.scss' + + @property + def COLOR_BUNDLE_THEME_DARK_NAME(self): + return 'web.assets_web_dark' + + #---------------------------------------------------------- + # Fields + #---------------------------------------------------------- + + theme_favicon = fields.Binary( + related='company_id.favicon', + readonly=False + ) + + theme_background_image_light = fields.Binary( + related='company_id.background_image_light', + readonly=False + ) + + theme_background_image_dark = fields.Binary( + related='company_id.background_image_dark', + readonly=False + ) + + theme_color_appbar_text_light = fields.Char( + string='AppsBar Text Light Color' + ) + + theme_color_appbar_active_light = fields.Char( + string='AppsBar Active Light Color' + ) + + theme_color_appbar_background_light = fields.Char( + string='AppsBar Background Light Color' + ) + + theme_color_appbar_text_dark = fields.Char( + string='AppsBar Text Dark Color' + ) + + theme_color_appbar_active_dark = fields.Char( + string='AppsBar Active Dark Color' + ) + + theme_color_appbar_background_dark = fields.Char( + string='AppsBar Background Dark Color' + ) + + #---------------------------------------------------------- + # Helper + #---------------------------------------------------------- + + def _get_light_theme_color_values(self): + return self.env['web_editor.assets'].get_color_variables_values( + self.COLOR_ASSET_THEME_LIGHT_URL, + self.COLOR_BUNDLE_THEME_LIGHT_NAME, + self.THEME_COLOR_FIELDS + ) + + def _get_dark_theme_color_values(self): + return self.env['web_editor.assets'].get_color_variables_values( + self.COLOR_ASSET_THEME_DARK_URL, + self.COLOR_BUNDLE_THEME_DARK_NAME, + self.THEME_COLOR_FIELDS + ) + + def _set_light_theme_color_values(self, values): + colors = self._get_light_theme_color_values() + for var, value in colors.items(): + values[f'theme_{var}_light'] = value + return values + + def _set_dark_theme_color_values(self, values): + colors = self._get_dark_theme_color_values() + for var, value in colors.items(): + values[f'theme_{var}_dark'] = value + return values + + def _detect_light_theme_color_change(self): + colors = self._get_light_theme_color_values() + return any( + self[f'theme_{var}_light'] != val + for var, val in colors.items() + ) + + def _detect_dark_theme_color_change(self): + colors = self._get_dark_theme_color_values() + return any( + self[f'theme_{var}_dark'] != val + for var, val in colors.items() + ) + + def _replace_light_theme_color_values(self): + variables = [ + { + 'name': field, + 'value': self[f'theme_{field}_light'] + } + for field in self.THEME_COLOR_FIELDS + ] + return self.env['web_editor.assets'].replace_color_variables_values( + self.COLOR_ASSET_THEME_LIGHT_URL, + self.COLOR_BUNDLE_THEME_LIGHT_NAME, + variables + ) + + def _replace_dark_theme_color_values(self): + variables = [ + { + 'name': field, + 'value': self[f'theme_{field}_dark'] + } + for field in self.THEME_COLOR_FIELDS + ] + return self.env['web_editor.assets'].replace_color_variables_values( + self.COLOR_ASSET_THEME_DARK_URL, + self.COLOR_BUNDLE_THEME_DARK_NAME, + variables + ) + + def _reset_light_theme_color_assets(self): + self.env['web_editor.assets'].reset_asset( + self.COLOR_ASSET_THEME_LIGHT_URL, + self.COLOR_BUNDLE_THEME_LIGHT_NAME, + ) + + def _reset_dark_theme_color_assets(self): + self.env['web_editor.assets'].reset_asset( + self.COLOR_ASSET_THEME_DARK_URL, + self.COLOR_BUNDLE_THEME_DARK_NAME, + ) + + #---------------------------------------------------------- + # Action + #---------------------------------------------------------- + + def action_reset_light_color_assets(self): + self._reset_light_theme_color_assets() + return super().action_reset_light_color_assets() + + def action_reset_dark_color_assets(self): + self._reset_dark_theme_color_assets() + return super().action_reset_dark_color_assets() + + #---------------------------------------------------------- + # Functions + #---------------------------------------------------------- + + def get_values(self): + res = super().get_values() + res = self._set_light_theme_color_values(res) + res = self._set_dark_theme_color_values(res) + return res + + def set_values(self): + res = super().set_values() + if self._detect_light_theme_color_change(): + self._replace_light_theme_color_values() + if self._detect_dark_theme_color_change(): + self._replace_dark_theme_color_values() + return res diff --git a/muk_web_enterprise_theme/static/description/banner.png b/muk_web_enterprise_theme/static/description/banner.png new file mode 100644 index 0000000..f364012 Binary files /dev/null and b/muk_web_enterprise_theme/static/description/banner.png differ diff --git a/muk_web_enterprise_theme/static/description/icon.png b/muk_web_enterprise_theme/static/description/icon.png new file mode 100644 index 0000000..88f65d4 Binary files /dev/null and b/muk_web_enterprise_theme/static/description/icon.png differ diff --git a/muk_web_enterprise_theme/static/description/icon.svg b/muk_web_enterprise_theme/static/description/icon.svg new file mode 100644 index 0000000..5eddf16 --- /dev/null +++ b/muk_web_enterprise_theme/static/description/icon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/muk_web_enterprise_theme/static/description/index.html b/muk_web_enterprise_theme/static/description/index.html new file mode 100644 index 0000000..6e47030 --- /dev/null +++ b/muk_web_enterprise_theme/static/description/index.html @@ -0,0 +1,222 @@ +
+
+

MuK Backend Theme

+

Odoo Enterprise Backend Theme

+ +

MuK IT GmbH - www.mukit.at

+
+ + Community + + + Enterprise + +
+
+ +
+
+
+ +
+
+
+

Overview

+

+ This module offers a mobile compatible design for Odoo Enterprise. Furthermore it + allows the user to define some design preferences. Each user can choose the size + of the sidebar. In addition, the background image of the home menu can be set + for each company. +

+
+
+
+ +
+
+
+

Desktop Interface

+

+ The chatter has been improved and now allows log entries to be shown and hidden. + In addition, a border has been added to the form fields to improve readability + and differentiate between read-only and writable inputs. +

+
+
+
+ +
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+

Mobile Interface

+

+ In the mobile view, the chatter buttons are now displayed as icons, thus utilising + the space more efficiently to prevent unnecessary scrolling. +

+
+
+
+ +
+
+
+
+ +
+
+
+
+ +
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+

Fully Customizable

+

+ In addition to the colours, the favicon and the appsbar logo can also be set in + the general settings. Each user also has the option of adjusting the relevant + settings in their user profile. +

+
+
+
+ +
+
+
+
+ +
+
+
+
+
+
+ +
+
+

+ Want more? +

+

+ Are you having troubles with your Odoo integration? Or do you feel + your system lacks of essential features?
If your answer is YES + to one of the above questions, feel free to contact us at anytime + with your inquiry.
We are looking forward to discuss your + needs and plan the next steps with you.
+

+
+ +
+ +
+
+

Our Services

+
+
+
+
+ +
+

+ Odoo
Development +

+
+
+
+
+
+ +
+

+ Odoo
Integration +

+
+
+
+
+
+ +
+

+ Odoo
Infrastructure +

+
+
+
+
+
+ +
+

+ Odoo
Training +

+
+
+
+
+
+ +
+

+ Odoo
Support +

+
+
+
+
+
diff --git a/muk_web_enterprise_theme/static/description/logo.png b/muk_web_enterprise_theme/static/description/logo.png new file mode 100644 index 0000000..9427ce3 Binary files /dev/null and b/muk_web_enterprise_theme/static/description/logo.png differ diff --git a/muk_web_enterprise_theme/static/description/screenshot.png b/muk_web_enterprise_theme/static/description/screenshot.png new file mode 100644 index 0000000..9192d75 Binary files /dev/null and b/muk_web_enterprise_theme/static/description/screenshot.png differ diff --git a/muk_web_enterprise_theme/static/description/screenshot_apps.png b/muk_web_enterprise_theme/static/description/screenshot_apps.png new file mode 100644 index 0000000..88a7adf Binary files /dev/null and b/muk_web_enterprise_theme/static/description/screenshot_apps.png differ diff --git a/muk_web_enterprise_theme/static/description/screenshot_chatter.png b/muk_web_enterprise_theme/static/description/screenshot_chatter.png new file mode 100644 index 0000000..bdbad20 Binary files /dev/null and b/muk_web_enterprise_theme/static/description/screenshot_chatter.png differ diff --git a/muk_web_enterprise_theme/static/description/screenshot_customize.png b/muk_web_enterprise_theme/static/description/screenshot_customize.png new file mode 100644 index 0000000..cbb3810 Binary files /dev/null and b/muk_web_enterprise_theme/static/description/screenshot_customize.png differ diff --git a/muk_web_enterprise_theme/static/description/screenshot_mobile_apps.png b/muk_web_enterprise_theme/static/description/screenshot_mobile_apps.png new file mode 100644 index 0000000..d8e6008 Binary files /dev/null and b/muk_web_enterprise_theme/static/description/screenshot_mobile_apps.png differ diff --git a/muk_web_enterprise_theme/static/description/screenshot_mobile_form.png b/muk_web_enterprise_theme/static/description/screenshot_mobile_form.png new file mode 100644 index 0000000..5ea93c1 Binary files /dev/null and b/muk_web_enterprise_theme/static/description/screenshot_mobile_form.png differ diff --git a/muk_web_enterprise_theme/static/description/screenshot_mobile_kanban.png b/muk_web_enterprise_theme/static/description/screenshot_mobile_kanban.png new file mode 100644 index 0000000..5813d03 Binary files /dev/null and b/muk_web_enterprise_theme/static/description/screenshot_mobile_kanban.png differ diff --git a/muk_web_enterprise_theme/static/description/screenshot_mobile_menu.png b/muk_web_enterprise_theme/static/description/screenshot_mobile_menu.png new file mode 100644 index 0000000..2c2795a Binary files /dev/null and b/muk_web_enterprise_theme/static/description/screenshot_mobile_menu.png differ diff --git a/muk_web_enterprise_theme/static/description/screenshot_settings.png b/muk_web_enterprise_theme/static/description/screenshot_settings.png new file mode 100644 index 0000000..b22d3e5 Binary files /dev/null and b/muk_web_enterprise_theme/static/description/screenshot_settings.png differ diff --git a/muk_web_enterprise_theme/static/description/service_development.png b/muk_web_enterprise_theme/static/description/service_development.png new file mode 100644 index 0000000..d64b66b Binary files /dev/null and b/muk_web_enterprise_theme/static/description/service_development.png differ diff --git a/muk_web_enterprise_theme/static/description/service_infrastructure.png b/muk_web_enterprise_theme/static/description/service_infrastructure.png new file mode 100644 index 0000000..b899a31 Binary files /dev/null and b/muk_web_enterprise_theme/static/description/service_infrastructure.png differ diff --git a/muk_web_enterprise_theme/static/description/service_integration.png b/muk_web_enterprise_theme/static/description/service_integration.png new file mode 100644 index 0000000..76c5e80 Binary files /dev/null and b/muk_web_enterprise_theme/static/description/service_integration.png differ diff --git a/muk_web_enterprise_theme/static/description/service_support.png b/muk_web_enterprise_theme/static/description/service_support.png new file mode 100644 index 0000000..4c530fa Binary files /dev/null and b/muk_web_enterprise_theme/static/description/service_support.png differ diff --git a/muk_web_enterprise_theme/static/description/service_training.png b/muk_web_enterprise_theme/static/description/service_training.png new file mode 100644 index 0000000..19ea76e Binary files /dev/null and b/muk_web_enterprise_theme/static/description/service_training.png differ diff --git a/muk_web_enterprise_theme/static/description/theme_screenshot.png b/muk_web_enterprise_theme/static/description/theme_screenshot.png new file mode 100644 index 0000000..e6aa515 Binary files /dev/null and b/muk_web_enterprise_theme/static/description/theme_screenshot.png differ diff --git a/muk_web_enterprise_theme/static/src/scss/colors_dark.scss b/muk_web_enterprise_theme/static/src/scss/colors_dark.scss new file mode 100644 index 0000000..5f06207 --- /dev/null +++ b/muk_web_enterprise_theme/static/src/scss/colors_dark.scss @@ -0,0 +1,11 @@ +// Colors + +$mk_color_appbar_text: #E4E4E4; +$mk_color_appbar_active: #5D8DA8; +$mk_color_appbar_background: #3C3E4B; + +// Override + +$mk-appbar-color: $mk_color_appbar_text; +$mk-appbar-active: $mk_color_appbar_active; +$mk-appbar-background: $mk_color_appbar_background; diff --git a/muk_web_enterprise_theme/static/src/scss/colors_light.scss b/muk_web_enterprise_theme/static/src/scss/colors_light.scss new file mode 100644 index 0000000..05d7384 --- /dev/null +++ b/muk_web_enterprise_theme/static/src/scss/colors_light.scss @@ -0,0 +1,11 @@ +// Colors + +$mk_color_appbar_text: #DEE2E6; +$mk_color_appbar_active: #5D8DA8; +$mk_color_appbar_background: #111827; + +// Override + +$mk-appbar-color: $mk_color_appbar_text; +$mk-appbar-active: $mk_color_appbar_active; +$mk-appbar-background: $mk_color_appbar_background; \ No newline at end of file diff --git a/muk_web_enterprise_theme/static/src/scss/variables.scss b/muk_web_enterprise_theme/static/src/scss/variables.scss new file mode 100644 index 0000000..07250f7 --- /dev/null +++ b/muk_web_enterprise_theme/static/src/scss/variables.scss @@ -0,0 +1 @@ +$o-navbar-badge-bg: $o-brand-primary; diff --git a/muk_web_enterprise_theme/static/src/views/form/form.dark.scss b/muk_web_enterprise_theme/static/src/views/form/form.dark.scss new file mode 100644 index 0000000..dd884cb --- /dev/null +++ b/muk_web_enterprise_theme/static/src/views/form/form.dark.scss @@ -0,0 +1,8 @@ +.o_form_view { + &:not(.o_field_highlight) .o_field_widget:not(.o_field_invalid):not(.o_field_highlight) .o_input:not(:hover):not(:focus) { + --o-input-border-color: #{$gray-400}; + } + &:not(.o_field_highlight) .o_required_modifier.o_field_widget:not(.o_field_invalid):not(.o_field_highlight) .o_input:not(:hover):not(:focus) { + --o-input-border-color: #{$gray-600}; + } +} \ No newline at end of file diff --git a/muk_web_enterprise_theme/static/src/views/form/form.scss b/muk_web_enterprise_theme/static/src/views/form/form.scss new file mode 100644 index 0000000..3efa72f --- /dev/null +++ b/muk_web_enterprise_theme/static/src/views/form/form.scss @@ -0,0 +1,8 @@ +.o_form_view { + &:not(.o_field_highlight) .o_field_widget:not(.o_field_invalid):not(.o_field_highlight) .o_input:not(:hover):not(:focus) { + --o-input-border-color: #{$gray-200}; + } + &:not(.o_field_highlight) .o_required_modifier.o_field_widget:not(.o_field_invalid):not(.o_field_highlight) .o_input:not(:hover):not(:focus) { + --o-input-border-color: #{$gray-400}; + } +} \ No newline at end of file diff --git a/muk_web_enterprise_theme/static/src/webclient/home_menu/home_menu.js b/muk_web_enterprise_theme/static/src/webclient/home_menu/home_menu.js new file mode 100644 index 0000000..4d32cd2 --- /dev/null +++ b/muk_web_enterprise_theme/static/src/webclient/home_menu/home_menu.js @@ -0,0 +1,29 @@ +import { url } from "@web/core/utils/urls"; +import { patch } from "@web/core/utils/patch"; +import { cookie } from "@web/core/browser/cookie"; + +import { HomeMenu } from "@web_enterprise/webclient/home_menu/home_menu"; + +patch(HomeMenu.prototype, { + setup() { + super.setup(); + if ( + cookie.get("color_scheme") === "dark" && + this.env.services.company.currentCompany.has_background_image_dark + ) { + this.backgroundImageUrl = url('/web/image', { + model: 'res.company', + field: 'background_image_dark', + id: this.env.services.company.currentCompany.id, + }); + } else if ( + this.env.services.company.currentCompany.has_background_image_light + ) { + this.backgroundImageUrl = url('/web/image', { + model: 'res.company', + field: 'background_image_light', + id: this.env.services.company.currentCompany.id, + }); + } + }, +}); diff --git a/muk_web_enterprise_theme/static/src/webclient/home_menu/home_menu.xml b/muk_web_enterprise_theme/static/src/webclient/home_menu/home_menu.xml new file mode 100644 index 0000000..8ba9708 --- /dev/null +++ b/muk_web_enterprise_theme/static/src/webclient/home_menu/home_menu.xml @@ -0,0 +1,22 @@ + + + + + + + + {{ backgroundImageUrl ? "background-size: cover; background-position: center; background-image: url(" + backgroundImageUrl + ");" : "" }} + + + + + + + + + + \ No newline at end of file diff --git a/muk_web_enterprise_theme/templates/web_layout.xml b/muk_web_enterprise_theme/templates/web_layout.xml new file mode 100644 index 0000000..0d6b852 --- /dev/null +++ b/muk_web_enterprise_theme/templates/web_layout.xml @@ -0,0 +1,13 @@ + + + + + + \ No newline at end of file diff --git a/muk_web_enterprise_theme/views/res_config_settings.xml b/muk_web_enterprise_theme/views/res_config_settings.xml new file mode 100644 index 0000000..fe86318 --- /dev/null +++ b/muk_web_enterprise_theme/views/res_config_settings.xml @@ -0,0 +1,81 @@ + + + + + + res.config.settings.form + res.config.settings + + + + 1 + + + + + + res.config.settings.form + res.config.settings + + + + Backend Theme + + +
+
+
+
+
+
+
+ +
+
+
+
+
+
+
+ + + + + + + + +
+ +
+
+ +
+ +
+
+
+
+
+ +