diff --git a/odex25_base/odex_themecraft/__init__.py b/odex25_base/odex_themecraft/__init__.py new file mode 100755 index 000000000..4a1357048 --- /dev/null +++ b/odex25_base/odex_themecraft/__init__.py @@ -0,0 +1,2 @@ +from . import models +from .hooks import test_pre_init_hook \ No newline at end of file diff --git a/odex25_base/odex_themecraft/__manifest__.py b/odex25_base/odex_themecraft/__manifest__.py new file mode 100755 index 000000000..a60d2eac7 --- /dev/null +++ b/odex25_base/odex_themecraft/__manifest__.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +{ + 'name': 'Odex ThemeCraft', + 'category': 'Tools', + 'version': '0.4', + 'summary': 'Odex ThemeCraft empowers Odoo users to unleash their creativity and design stunning odoo system that reflect their brand identity and vision. With its intuitive interface and powerful customization features, Odex ThemeCraft revolutionizes the way users approach odoo backend theming in Odoo.', + 'description': 'Odex ThemeCraft is a comprehensive theme customization module for Odoo, designed to empower users with the ability to tailor their Odoo backend themes according to their unique brand identity and preferences. With Odex ThemeCraft, users can effortlessly personalize the look and feel of their odoo system, ensuring it aligns perfectly with their brand image and style.', + 'author': "Expert Co. Ltd.", + 'website': "http://www.exp-sa.com", + 'license': '', + 'depends': ['web','odex25_web','web_widget_colorpicker'], + 'data': [ + 'views/webclient.xml', + 'views/ir_settings.xml', + ], + 'pre_init_hook': 'test_pre_init_hook', + 'installable': True, + 'auto_install': False, + 'application': True, +} diff --git a/odex25_base/odex_themecraft/hooks.py b/odex25_base/odex_themecraft/hooks.py new file mode 100644 index 000000000..929c5377c --- /dev/null +++ b/odex25_base/odex_themecraft/hooks.py @@ -0,0 +1,65 @@ +import base64 + +from odoo import api, SUPERUSER_ID, _ +from odoo.modules import get_module_resource +from odoo.exceptions import UserError +import os + +backend_theme_attrs = { + '$navbar_bg_color': 'rgba(31,91,117,1)', + '$navbar_toggle': 'rgba(0,0,0,1)', + '$selection_app_color': 'rgba(255,255,255,1)', + '$selection_app_bg_hover': 'rgba(31,91,87,1)', + '$navbar_ul_color': 'rgba(255,255,255,1)', + '$navbar_ul_bg_color_hover': 'rgba(31,91,87,1)', + '$navbar_ul_dropdown_bg_color': 'rgba(255,255,255,1)', + '$navbar_ul_dropdown_item_color': 'rgba(31,91,117,1)', + '$navbar_ul_dropdown_item_bg_color': 'rgba(255,255,255,1)', + '$navbar_ul_dropdown_item_color_hover': 'rgba(255,255,255,1)', + '$navbar_ul_dropdown_item_hover_color': 'rgba(31,91,117,1)', + '$navbar_badge_color': 'rgba(0,0,0,1)', + + '$apps_bg_img': 'url(../img/odex_bg.jpg)', + '$app_name_color': 'rgba(255,255,255,1)', + '$app_hover_bg_color': 'rgba(31,91,87,1)', + + '$apps_more_info': 'rgba(31,91,117,1)', + '$apps_install_color': 'rgba(255,255,255,1)', + '$apps_install_bg_color': 'rgba(38,133,127,1)', + '$apps_upgrade_color': 'rgba(255,255,255,1)', + '$apps_upgrade_bg_color': 'rgba(31,91,117,1)', + + '$sections_titles_color': 'rgba(255,255,255,1)', + '$sections_titles_bg': 'rgba(31,91,117,1)', + + '$filter_icon_bg_color': 'rgba(31,91,117,1)', + '$sidebar_categories_icon_color': 'rgba(31,91,117,1)', + '$sidebar_categories_item_color': 'rgba(0,0,0,1)', + '$sidebar_categories_item_bg_color': 'rgba(0,0,0,1)', + '$sidebar_categories_item_hover_active_color': 'rgba(255,255,255,1)', + '$sidebar_categories_item_bg_hover_active_color': 'rgba(38,133,127,1)', + + '$english_default_font' : '"Roboto", "Odoo Unicode Support Noto", sans-serif', + '$arabic_default_font' : '"Roboto", "Odoo Unicode Support Noto", sans-serif' +} + +def replace_file(file_path, static_dict): + try: + with open(file_path, 'w+') as new_file: + for key, value in static_dict.items(): + line = ''.join([key, ': ', value, ';\n']) + new_file.write(line) + new_file.close() + except Exception as e: + raise UserError(_("Please follow the readme file. Contact to Administrator.""\n %s") % e) + +def test_pre_init_hook(cr): + """Hooks for Changing Menu Web_icon""" + + try: + path = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) + theme_path = path + "/odex_themecraft/static/src/scss/variables.scss" + except Exception as e: + raise UserError(_("Please Contact to Administrator. \n %s") % e) + + replace_file(theme_path, backend_theme_attrs) diff --git a/odex25_base/odex_themecraft/models/__init__.py b/odex25_base/odex_themecraft/models/__init__.py new file mode 100755 index 000000000..2b537b9cc --- /dev/null +++ b/odex25_base/odex_themecraft/models/__init__.py @@ -0,0 +1,3 @@ +# from . import ir_web_theme +from . import model +from . import ir_icons_settings \ No newline at end of file diff --git a/odex25_base/odex_themecraft/models/ir_icons_settings.py b/odex25_base/odex_themecraft/models/ir_icons_settings.py new file mode 100755 index 000000000..94eafb335 --- /dev/null +++ b/odex25_base/odex_themecraft/models/ir_icons_settings.py @@ -0,0 +1,391 @@ +import base64 +from odoo import api, fields, models, _, SUPERUSER_ID +from odoo import modules +from odoo.exceptions import UserError +import os + +def get_default_img(): + with open(modules.get_module_resource('odex_themecraft', 'static/src/img', 'app_drawer.jpeg'),'rb') as f: + return base64.b64encode(f.read()) + +class ResIconsConfigSettings(models.TransientModel): + _inherit = 'res.config.settings' + + #Icons settings + setting_icon = fields.Binary(string="Settings Icon", attachment=True) + apps_icon = fields.Binary(string="Apps Icon", attachment=True) + discuss_icon = fields.Binary(string="Discuss Icon", attachment=True) + website_icon = fields.Binary(string="Website Icon", attachment=True) + sales_icon = fields.Binary(string="Sales Icon", attachment=True) + invoicing_icon = fields.Binary(string="Invoicing Icon", attachment=True) + crm_icon = fields.Binary(string="CRM Icon", attachment=True) + mrp_icon = fields.Binary(string="MRP II Icon", attachment=True) + inventory_icon = fields.Binary(string="Inventory Icon", attachment=True) + accounting_icon = fields.Binary(string="Accounting Icon", attachment=True) + purchase_icon = fields.Binary(string="Purchase Icon", attachment=True) + pos_icon = fields.Binary(string="Point of Sale Icon", attachment=True) + project_icon = fields.Binary(string="Project Icon", attachment=True) + ecommerce_icon = fields.Binary(string="eCommerce Icon", attachment=True) + manufacturing_icon = fields.Binary(string="Manufacturing Icon", attachment=True) + email_marketing_icon = fields.Binary(string="Email Marketing Icon", attachment=True) + timesheet_icon = fields.Binary(string="Timesheets Icon", attachment=True) + expenses_icon = fields.Binary(string="Expenses Icon", attachment=True) + studio_icon = fields.Binary(string="Studio Icon", attachment=True) + time_off_icon = fields.Binary(string="Time Off Icon", attachment=True) + recruitment_icon = fields.Binary(string="Recruitment Icon", attachment=True) + employee_icon = fields.Binary(string="Employees Icon", attachment=True) + maintenance_icon = fields.Binary(string="Maintenance Icon", attachment=True) + sign_icon = fields.Binary(string="Sign Icon", attachment=True) + helpdesk_icon = fields.Binary(string="Helpdesk Icon", attachment=True) + subscriptions_icon = fields.Binary(string="Subscriptions Icon", attachment=True) + quality_icon = fields.Binary(string="Quality Icon", attachment=True) + elearning_icon = fields.Binary(string="eLearning Icon", attachment=True) + planning_icon = fields.Binary(string="Planning Icon", attachment=True) + data_cleaning_icon = fields.Binary(string="Data Cleaning Icon", attachment=True) + events_icon = fields.Binary(string="Events Icon", attachment=True) + contacts_icon = fields.Binary(string="Contacts Icon", attachment=True) + mrp_icon = fields.Binary(string="Product Lifecycle Management (PLM) Icon", attachment=True) + calendar_icon = fields.Binary(string="Calendar Icon", attachment=True) + appraisal_icon = fields.Binary(string="Appraisal Icon", attachment=True) + fleet_icon = fields.Binary(string="Fleet Icon", attachment=True) + marketing_automation_icon = fields.Binary(string="Marketing Automation Icon", attachment=True) + blogs_icon = fields.Binary(string="Blogs Icon", attachment=True) + live_chat_icon = fields.Binary(string="Live Chat Icon", attachment=True) + appointments_icon = fields.Binary(string="Appointments Icon", attachment=True) + surveys_icon = fields.Binary(string="Surveys Icon", attachment=True) + android_iphone_icon = fields.Binary(string="Android & iPhone Icon", attachment=True) + dashboards_icon = fields.Binary(string="Dashboards Icon", attachment=True) + repairs_icon = fields.Binary(string="Repairs Icon", attachment=True) + attendance_icon = fields.Binary(string="Attendances Icon", attachment=True) + sms_marketing_icon = fields.Binary(string="SMS Marketing Icon", attachment=True) + barcode_icon = fields.Binary(string="Barcode Icon", attachment=True) + notes_icon = fields.Binary(string="Notes Icon", attachment=True) + forum_icon = fields.Binary(string="Forum Icon", attachment=True) + skills_management_icon = fields.Binary(string="Skills Management Icon", attachment=True) + voip_icon = fields.Binary(string="VoIP Icon", attachment=True) + lunch_icon = fields.Binary(string="Lunch Icon", attachment=True) + online_jobs_icon = fields.Binary(string="Online Jobs Icon", attachment=True) + members_icon = fields.Binary(string="Members Icon", attachment=True) + products_icon = fields.Binary(string="Products & Pricelists Icon", attachment=True) + + def replace_file(self, file_path, static_dict): + try: + with open(file_path, 'w+') as new_file: + for key, value in static_dict.items(): + line = ''.join([key, ': ', value, ';\n']) + new_file.write(line) + new_file.close() + except Exception as e: + raise UserError(_("Please follow the readme file. Contact to Administrator.""\n %s") % e) + + @api.model + def get_values(self): + res = super(ResIconsConfigSettings, self).get_values() + ir_config = self.env['ir.config_parameter'].sudo() + + #Icons settings + setting_icon = ir_config.get_param('setting_icon') + apps_icon = ir_config.get_param('apps_icon') + discuss_icon = ir_config.get_param('discuss_icon') + website_icon = ir_config.get_param('website_icon') + sales_icon = ir_config.get_param('sales_icon') + invoicing_icon = ir_config.get_param('invoicing_icon') + crm_icon = ir_config.get_param('crm_icon') + mrp_icon = ir_config.get_param('mrp_icon') + inventory_icon = ir_config.get_param('inventory_icon') + accounting_icon = ir_config.get_param('accounting_icon') + purchase_icon = ir_config.get_param('purchase_icon') + pos_icon = ir_config.get_param('pos_icon') + project_icon = ir_config.get_param('project_icon') + ecommerce_icon = ir_config.get_param('ecommerce_icon') + manufacturing_icon = ir_config.get_param('manufacturing_icon') + email_marketing_icon = ir_config.get_param('email_marketing_icon') + timesheet_icon = ir_config.get_param('timesheet_icon') + expenses_icon = ir_config.get_param('expenses_icon') + studio_icon = ir_config.get_param('studio_icon') + time_off_icon = ir_config.get_param('time_off_icon') + recruitment_icon = ir_config.get_param('recruitment_icon') + employee_icon = ir_config.get_param('employee_icon') + maintenance_icon = ir_config.get_param('maintenance_icon') + sign_icon = ir_config.get_param('sign_icon') + helpdesk_icon = ir_config.get_param('helpdesk_icon') + subscriptions_icon = ir_config.get_param('subscriptions_icon') + quality_icon = ir_config.get_param('quality_icon') + elearning_icon = ir_config.get_param('elearning_icon') + planning_icon = ir_config.get_param('planning_icon') + data_cleaning_icon = ir_config.get_param('data_cleaning_icon') + events_icon = ir_config.get_param('events_icon') + contacts_icon = ir_config.get_param('contacts_icon') + mrp_icon = ir_config.get_param('mrp_icon') + calendar_icon = ir_config.get_param('calendar_icon') + appraisal_icon = ir_config.get_param('appraisal_icon') + fleet_icon = ir_config.get_param('fleet_icon') + marketing_automation_icon = ir_config.get_param('marketing_automation_icon') + blogs_icon = ir_config.get_param('blogs_icon') + live_chat_icon = ir_config.get_param('live_chat_icon') + appointments_icon = ir_config.get_param('appointments_icon') + surveys_icon = ir_config.get_param('surveys_icon') + android_iphone_icon = ir_config.get_param('android_iphone_icon') + dashboards_icon = ir_config.get_param('dashboards_icon') + repairs_icon = ir_config.get_param('repairs_icon') + attendance_icon = ir_config.get_param('attendance_icon') + sms_marketing_icon = ir_config.get_param('sms_marketing_icon') + barcode_icon = ir_config.get_param('barcode_icon') + notes_icon = ir_config.get_param('notes_icon') + forum_icon = ir_config.get_param('forum_icon') + skills_management_icon = ir_config.get_param('skills_management_icon') + voip_icon = ir_config.get_param('voip_icon') + lunch_icon = ir_config.get_param('lunch_icon') + online_jobs_icon = ir_config.get_param('online_jobs_icon') + members_icon = ir_config.get_param('members_icon') + products_icon = ir_config.get_param('products_icon') + + # update resourcess + res.update(setting_icon=setting_icon,apps_icon=apps_icon,discuss_icon=discuss_icon,website_icon=website_icon, + sales_icon=sales_icon,invoicing_icon=invoicing_icon,crm_icon=crm_icon,mrp_icon=mrp_icon, + inventory_icon=inventory_icon,accounting_icon=accounting_icon,purchase_icon=purchase_icon, + pos_icon=pos_icon,project_icon=project_icon,ecommerce_icon=ecommerce_icon,manufacturing_icon=manufacturing_icon, + email_marketing_icon=email_marketing_icon,timesheet_icon=timesheet_icon,expenses_icon=expenses_icon, + studio_icon=studio_icon,time_off_icon=time_off_icon,recruitment_icon=recruitment_icon,employee_icon=employee_icon, + maintenance_icon=maintenance_icon,sign_icon=sign_icon,helpdesk_icon=helpdesk_icon,subscriptions_icon=subscriptions_icon, + quality_icon=quality_icon,elearning_icon=elearning_icon,planning_icon=planning_icon,data_cleaning_icon=data_cleaning_icon, + events_icon=events_icon,contacts_icon=contacts_icon,calendar_icon=calendar_icon,appraisal_icon=appraisal_icon, + fleet_icon=fleet_icon,marketing_automation_icon=marketing_automation_icon,blogs_icon=blogs_icon, + live_chat_icon=live_chat_icon,appointments_icon=appointments_icon,surveys_icon=surveys_icon,android_iphone_icon=android_iphone_icon, + dashboards_icon=dashboards_icon,repairs_icon=repairs_icon,attendance_icon=attendance_icon,sms_marketing_icon=sms_marketing_icon, + barcode_icon=barcode_icon,notes_icon=notes_icon,forum_icon=forum_icon,skills_management_icon=skills_management_icon, + voip_icon=voip_icon,lunch_icon=lunch_icon,online_jobs_icon=online_jobs_icon,members_icon=members_icon, + products_icon=products_icon) + + return res + + def set_values(self): + super(ResIconsConfigSettings, self).set_values() + ir_config = self.env['ir.config_parameter'].sudo() + + #Icons Settings + if self.setting_icon: + menu_item = self.env['ir.ui.menu'].search([('parent_id', '=', False)]) + for menu in menu_item: + print("***************************",menu.read()) + if menu.name == 'Settings': + if self.setting_icon: + ir_config.set_param("setting_icon",self.setting_icon) + menu.write({'web_icon_data': self.setting_icon}) + elif menu.name == 'Apps': + if self.apps_icon: + ir_config.set_param("apps_icon",self.apps_icon) + menu.write({'web_icon_data': self.apps_icon}) + elif menu.name == 'Discuss': + if self.discuss_icon: + ir_config.set_param("discuss_icon",self.discuss_icon) + menu.write({'web_icon_data': self.discuss_icon}) + elif menu.name == 'Website': + if self.website_icon: + ir_config.set_param("website_icon",self.website_icon) + menu.write({'web_icon_data': self.website_icon}) + elif menu.name == 'Sales': + if self.sales_icon: + ir_config.set_param("sales_icon",self.sales_icon) + menu.write({'web_icon_data': self.sales_icon}) + elif menu.name == 'Invoicing': + if self.invoicing_icon: + ir_config.set_param("invoicing_icon",self.invoicing_icon) + menu.write({'web_icon_data': self.invoicing_icon}) + elif menu.name == 'CRM': + if self.crm_icon: + ir_config.set_param("crm_icon",self.crm_icon) + menu.write({'web_icon_data': self.crm_icon}) + elif menu.name == 'MRP II': + if self.mrp_icon: + ir_config.set_param("mrp_icon",self.mrp_icon) + menu.write({'web_icon_data': self.mrp_icon}) + elif menu.name == 'Inventory': + if self.inventory_icon: + ir_config.set_param("inventory_icon",self.inventory_icon) + menu.write({'web_icon_data': self.inventory_icon}) + elif menu.name == 'Accounting': + if self.accounting_icon: + ir_config.set_param("accounting_icon",self.accounting_icon) + menu.write({'web_icon_data': self.accounting_icon}) + elif menu.name == 'Purchase': + if self.purchase_icon: + ir_config.set_param("purchase_icon",self.purchase_icon) + menu.write({'web_icon_data': self.purchase_icon}) + elif menu.name == 'Point of Sale': + if self.pos_icon: + ir_config.set_param("pos_icon",self.pos_icon) + menu.write({'web_icon_data': self.pos_icon}) + elif menu.name == 'Project': + if self.project_icon: + ir_config.set_param("project_icon",self.project_icon) + menu.write({'web_icon_data': self.project_icon}) + elif menu.name == 'eCommerce': + if self.ecommerce_icon: + ir_config.set_param("ecommerce_icon",self.ecommerce_icon) + menu.write({'web_icon_data': self.ecommerce_icon}) + elif menu.name == 'Manufacturing': + if self.manufacturing_icon: + ir_config.set_param("manufacturing_icon",self.manufacturing_icon) + menu.write({'web_icon_data': self.manufacturing_icon}) + elif menu.name == 'Email Marketing': + if self.email_marketing_icon: + ir_config.set_param("email_marketing_icon",self.email_marketing_icon) + menu.write({'web_icon_data': self.email_marketing_icon}) + elif menu.name == 'Timesheets': + if self.timesheet_icon: + ir_config.set_param("timesheet_icon",self.timesheet_icon) + menu.write({'web_icon_data': self.timesheet_icon}) + elif menu.name == 'Expenses': + if self.expenses_icon: + ir_config.set_param("expenses_icon",self.expenses_icon) + menu.write({'web_icon_data': self.expenses_icon}) + elif menu.name == 'Studio': + if self.studio_icon: + ir_config.set_param("studio_icon",self.studio_icon) + menu.write({'web_icon_data': self.studio_icon}) + elif menu.name == 'Time Off': + if self.time_off_icon: + ir_config.set_param("time_off_icon",self.time_off_icon) + menu.write({'web_icon_data': self.time_off_icon}) + elif menu.name == 'Recruitment': + if self.recruitment_icon: + ir_config.set_param("recruitment_icon",self.recruitment_icon) + menu.write({'web_icon_data': self.recruitment_icon}) + elif menu.name == 'Employees': + if self.employee_icon: + ir_config.set_param("employee_icon",self.employee_icon) + menu.write({'web_icon_data': self.employee_icon}) + elif menu.name == 'Maintenance': + if self.maintenance_icon: + ir_config.set_param("maintenance_icon",self.maintenance_icon) + menu.write({'web_icon_data': self.maintenance_icon}) + elif menu.name == 'Sign': + if self.sign_icon: + ir_config.set_param("sign_icon",self.sign_icon) + menu.write({'web_icon_data': self.sign_icon}) + elif menu.name == 'Helpdesk': + if self.helpdesk_icon: + ir_config.set_param("helpdesk_icon",self.helpdesk_icon) + menu.write({'web_icon_data': self.helpdesk_icon}) + elif menu.name == 'Subscriptions': + if self.subscriptions_icon: + ir_config.set_param("subscriptions_icon",self.subscriptions_icon) + menu.write({'web_icon_data': self.subscriptions_icon}) + elif menu.name == 'Quality': + if self.quality_icon: + ir_config.set_param("quality_icon",self.quality_icon) + menu.write({'web_icon_data': self.quality_icon}) + elif menu.name == 'eLearning': + if self.elearning_icon: + ir_config.set_param("elearning_icon",self.elearning_icon) + menu.write({'web_icon_data': self.elearning_icon}) + elif menu.name == 'Planning': + if self.planning_iconss: + ir_config.set_param("planning_icon",self.planning_icon) + menu.write({'web_icon_data': self.planning_icon}) + elif menu.name == 'Data Cleaning': + if self.data_cleaning_icon: + ir_config.set_param("data_cleaning_icon",self.data_cleaning_icon) + menu.write({'web_icon_data': self.data_cleaning_icon}) + elif menu.name == 'Events': + if self.events_icon: + ir_config.set_param("events_icon",self.events_icon) + menu.write({'web_icon_data': self.events_icon}) + elif menu.name == 'Contacts': + if self.contacts_icon: + ir_config.set_param("contacts_icon",self.contacts_icon) + menu.write({'web_icon_data': self.contacts_icon}) + elif menu.name == 'Product Lifecycle Management (PLM)': + if self.mrp_icon: + ir_config.set_param("mrp_icon",self.mrp_icon) + menu.write({'web_icon_data': self.mrp_icon}) + elif menu.name == 'Calendar': + if self.calendar_icon: + ir_config.set_param("calendar_icon",self.calendar_icon) + menu.write({'web_icon_data': self.calendar_icon}) + elif menu.name == 'Appraisal': + if self.appraisal_icon: + ir_config.set_param("appraisal_icon",self.appraisal_icon) + menu.write({'web_icon_data': self.appraisal_icon}) + elif menu.name == 'Fleet': + if self.fleet_icon: + ir_config.set_param("fleet_icon",self.fleet_icon) + menu.write({'web_icon_data': self.fleet_icon}) + elif menu.name == 'Marketing Automation': + if self.marketing_automation_icon: + ir_config.set_param("marketing_automation_icon",self.marketing_automation_icon) + menu.write({'web_icon_data': self.marketing_automation_icon}) + elif menu.name == 'Blogs': + if self.blogs_icon: + ir_config.set_param("blogs_icon",self.blogs_icon) + menu.write({'web_icon_data': self.blogs_icon}) + elif menu.name == 'Live Chat': + if self.live_chat_icon: + ir_config.set_param("live_chat_icon",self.live_chat_icon) + menu.write({'web_icon_data': self.live_chat_icon}) + elif menu.name == 'Appointments': + if self.appointments_icon: + ir_config.set_param("appointments_icon",self.appointments_icon) + menu.write({'web_icon_data': self.appointments_icon}) + elif menu.name == 'Surveys': + if self.surveys_icon: + ir_config.set_param("surveys_icon",self.surveys_icon) + menu.write({'web_icon_data': self.surveys_icon}) + elif menu.name == 'Android & iPhone': + if self.android_iphone_icon: + ir_config.set_param("android_iphone_icon",self.android_iphone_icon) + menu.write({'web_icon_data': self.android_iphone_icon}) + elif menu.name == 'Dashboards': + if self.dashboards_icon: + ir_config.set_param("dashboards_icon",self.dashboards_icon) + menu.write({'web_icon_data': self.dashboards_icon}) + elif menu.name == 'Repairs': + if self.repairs_icon: + ir_config.set_param("repairs_icon",self.repairs_icon) + menu.write({'web_icon_data': self.repairs_icon}) + elif menu.name == 'Attendances': + if self.attendance_icon: + ir_config.set_param("attendance_icon",self.attendance_icon) + menu.write({'web_icon_data': self.attendance_icon}) + elif menu.name == 'SMS Marketing': + if self.sms_marketing_icon: + ir_config.set_param("sms_marketing_icon",self.sms_marketing_icon) + menu.write({'web_icon_data': self.sms_marketing_icon}) + elif menu.name == 'Barcode': + if self.barcode_icon: + ir_config.set_param("barcode_icon",self.barcode_icon) + menu.write({'web_icon_data': self.barcode_icon}) + elif menu.name == 'Notes': + if self.notes_icon: + ir_config.set_param("notes_icon",self.notes_icon) + menu.write({'web_icon_data': self.notes_icon}) + elif menu.name == 'Forum': + if self.forum_icon: + ir_config.set_param("forum_icon",self.forum_icon) + menu.write({'web_icon_data': self.forum_icon}) + elif menu.name == 'Skills Management': + if self.skills_management_icon: + ir_config.set_param("skills_management_icon",self.skills_management_icon) + menu.write({'web_icon_data': self.skills_management_icon}) + elif menu.name == 'VoIP': + if self.voip_icon: + ir_config.set_param("voip_icon",self.voip_icon) + menu.write({'web_icon_data': self.voip_icon}) + elif menu.name == 'Lunch': + if self.lunch_icon: + ir_config.set_param("lunch_icon",self.lunch_icon) + menu.write({'web_icon_data': self.lunch_icon}) + elif menu.name == 'Online Jobs': + if self.online_jobs_icon: + ir_config.set_param("online_jobs_icon",self.online_jobs_icon) + menu.write({'web_icon_data': self.online_jobs_icon}) + elif menu.name == 'Members': + if self.members_icon: + ir_config.set_param("members_icon",self.members_icon) + menu.write({'web_icon_data': self.members_icon}) + elif menu.name == 'Products & Pricelists': + if self.products_icon: + ir_config.set_param("products_icon",self.products_icon) + menu.write({'web_icon_data': self.products_icon}) + \ No newline at end of file diff --git a/odex25_base/odex_themecraft/models/model.py b/odex25_base/odex_themecraft/models/model.py new file mode 100755 index 000000000..884c8b037 --- /dev/null +++ b/odex25_base/odex_themecraft/models/model.py @@ -0,0 +1,296 @@ +import base64 +from odoo import api, fields, models, _, SUPERUSER_ID +from odoo import modules +from odoo.exceptions import UserError +from odoo.modules import get_module_resource +import os + +backend_theme_attrs = { + '$navbar_bg_color': 'rgba(31,91,117,1)', + '$navbar_toggle': 'rgba(0,0,0,1)', + '$selection_app_color': 'rgba(255,255,255,1)', + '$selection_app_bg_hover': 'rgba(31,91,87,1)', + '$navbar_ul_color': 'rgba(255,255,255,1)', + '$navbar_ul_bg_color_hover': 'rgba(31,91,87,1)', + '$navbar_ul_dropdown_bg_color': 'rgba(255,255,255,1)', + '$navbar_ul_dropdown_item_color': 'rgba(31,91,117,1)', + '$navbar_ul_dropdown_item_bg_color': 'rgba(255,255,255,1)', + '$navbar_ul_dropdown_item_color_hover': 'rgba(255,255,255,1)', + '$navbar_ul_dropdown_item_hover_color': 'rgba(31,91,117,1)', + '$navbar_badge_color': 'rgba(0,0,0,1)', + + '$apps_bg_img': 'url(../img/odex_bg.jpg)', + '$app_name_color': 'rgba(255,255,255,1)', + '$app_hover_bg_color': 'rgba(31,91,87,1)', + + '$apps_more_info': 'rgba(31,91,117,1)', + '$apps_install_color': 'rgba(255,255,255,1)', + '$apps_install_bg_color': 'rgba(38,133,127,1)', + '$apps_upgrade_color': 'rgba(255,255,255,1)', + '$apps_upgrade_bg_color': 'rgba(31,91,117,1)', + + '$sections_titles_color': 'rgba(255,255,255,1)', + '$sections_titles_bg': 'rgba(31,91,117,1)', + + '$filter_icon_bg_color': 'rgba(31,91,117,1)', + '$sidebar_categories_icon_color': 'rgba(31,91,117,1)', + '$sidebar_categories_item_color': 'rgba(0,0,0,1)', + '$sidebar_categories_item_bg_color': 'rgba(0,0,0,1)', + '$sidebar_categories_item_hover_active_color': 'rgba(255,255,255,1)', + '$sidebar_categories_item_bg_hover_active_color': 'rgba(38,133,127,1)', + + '$english_default_font' : '"Roboto", "Odoo Unicode Support Noto", sans-serif', + '$arabic_default_font' : '"Roboto", "Odoo Unicode Support Noto", sans-serif' +} + +def get_default_img(): + with open(modules.get_module_resource('odex_themecraft', 'static/src/img', 'app_drawer.jpeg'),'rb') as f: + return base64.b64encode(f.read()) + +class ResConfigSettings(models.TransientModel): + _inherit = 'res.config.settings' + + # Navigation Bar + navbar_bg_color = fields.Char(string='Navbar Background',default="rgba(31,91,117,1)") + navbar_toggle = fields.Char(string='Navbar Background (Hover)',default="rgba(0,0,0,1)") + selection_app_color = fields.Char(string='Main Menu Title Background',default="rgba(255,255,255,1)") + selection_app_bg_hover = fields.Char(string='Main Menu Title Background (Hover)',default="rgba(31,91,87,1)") + navbar_ul_color = fields.Char(string='Navbar Item Color',default="rgba(255,255,255,1)") + navbar_ul_bg_color_hover = fields.Char(string='Navbar Item Background (Hover)',default="rgba(31,91,87,1)") + navbar_ul_dropdown_bg_color = fields.Char(string='Navbar Dropdown Background',default="rgba(255,255,255,1)") + navbar_ul_dropdown_item_color = fields.Char(string='Navbar Dropdown Item Color',default="rgba(31,91,117,1)") + navbar_ul_dropdown_item_color_hover = fields.Char(string='Navbar Dropdown Color (Hover)',default="rgba(255,255,255,1)") + navbar_ul_dropdown_item_bg_color = fields.Char(string='Navbar Dropdown Item Background',default="rgba(255,255,255,1)") + navbar_ul_dropdown_item_hover_color = fields.Char(string='Navbar Dropdown Item Background (Hover)',default="rgba(31,91,117,1)") + navbar_badge_color = fields.Char(string='Navbar Counter Badge Background',default="rgba(0,0,0,1)") + # App Drawer (home) + apps_bg_img = fields.Binary(string="App Drawer Background", attachment=True,default=get_default_img()) + app_name_color = fields.Char(string='Navbar Counter Badge Background',default="rgba(255,255,255,1)") + app_hover_bg_color = fields.Char(string='App Background (Hover)',default="rgba(31,91,87,1)") + # Apps Module + apps_more_info = fields.Char(string='Apps More Info Button Background',default="rgba(31,91,117,1)") + apps_install_color = fields.Char(string='Apps Install Button Color',default="rgba(255,255,255,1)") + apps_install_bg_color = fields.Char(string='Apps Install Button Background',default="rgba(31,91,117,1)") + apps_upgrade_color = fields.Char(string='Apps Upgrade Button Color',default="rgba(255,255,255,1)") + apps_upgrade_bg_color = fields.Char(string='Apps Upgrade Button Background',default="rgba(31,91,117,1)") + # Setting Module + sections_titles_color = fields.Char(string='Section Titles Color',default="rgba(255,255,255,1)") + sections_titles_bg = fields.Char(string='Section Titles Background',default="rgba(31,91,117,1)") + # Font Settings + english_default_font = fields.Selection([ + ('default','Default'), + ('font_1','Helvetica'), + ('font_2','Futura'), + ('font_3','Garamond'), + ('font_4','Times'), + ('font_5','Arial'), + ('font_6','Verdana'), + ('font_7','Comic Sans'), + ('font_8','Trebuchet'), + ('font_9','Gill Sans'), + ('font_10','Georgia'), + ], string='English Default Font', config_parameter='odex_themecraft.english_default_font', default='default') + arabic_default_font = fields.Selection([ + ('default','Default'), + ('font_1','Arial'), + ('font_2','Droid Kufi'), + ('font_3','Aniri'), + ('font_4','Droid Naskh'), + ('font_5','Frutiger LT Arabic'), + ], string='Arabic Default Font', config_parameter='odex_themecraft.arabic_default_font', default='default') + #Icons settings + setting_icon = fields.Binary(string="Settings Icon", attachment=True) + + def replace_file(self, file_path, static_dict): + try: + with open(file_path, 'w+') as new_file: + for key, value in static_dict.items(): + line = ''.join([key, ': ', value, ';\n']) + new_file.write(line) + new_file.close() + except Exception as e: + raise UserError(_("Please follow the readme file. Contact to Administrator.""\n %s") % e) + + @api.model + def get_values(self): + res = super(ResConfigSettings, self).get_values() + ir_config = self.env['ir.config_parameter'].sudo() + + # Navigation Bar + navbar_bg_color = ir_config.get_param('navbar_bg_color',"rgba(31,91,117,1)") + navbar_toggle = ir_config.get_param('navbar_toggle',"rgba(0,0,0,1)") + selection_app_color = ir_config.get_param('selection_app_color',"rgba(255,255,255,1)") + selection_app_bg_hover = ir_config.get_param('selection_app_bg_hover',"rgba(31,91,87,1)") + navbar_ul_color = ir_config.get_param('navbar_ul_color',"rgba(31,91,87,1)") + navbar_ul_bg_color_hover = ir_config.get_param('navbar_ul_bg_color_hover',"rgba(255,255,255,1)") + navbar_ul_dropdown_bg_color = ir_config.get_param('navbar_ul_dropdown_bg_color',"rgba(31,91,117,1)") + navbar_ul_dropdown_item_color = ir_config.get_param('navbar_ul_dropdown_item_color',"rgba(31,91,117,1)") + navbar_ul_dropdown_item_color_hover = ir_config.get_param('navbar_ul_dropdown_item_color_hover',"rgba(255,255,255,1)") + navbar_ul_dropdown_item_bg_color = ir_config.get_param('navbar_ul_dropdown_item_bg_color',"rgba(255,255,255,1)") + navbar_ul_dropdown_item_hover_color = ir_config.get_param('navbar_ul_dropdown_item_hover_color',"rgba(31,91,117,1)") + navbar_badge_color = ir_config.get_param('navbar_badge_color',"rgba(0,0,0,1)") + # App Drawer (home) + apps_bg_img = ir_config.get_param('apps_bg_img') + app_name_color = ir_config.get_param('app_name_color',"rgba(255,255,255,1)") + app_hover_bg_color = ir_config.get_param('app_hover_bg_color',"rgba(31,91,87,1)") + # Apps Module + apps_more_info = ir_config.get_param('apps_more_info',"rgba(31,91,117,1)") + apps_install_color = ir_config.get_param('apps_install_color',"rgba(255,255,255,1)") + apps_install_bg_color = ir_config.get_param('apps_install_bg_color',"rgba(31,91,117,1)") + apps_upgrade_color = ir_config.get_param('apps_upgrade_color',"rgba(255,255,255,1)") + apps_upgrade_bg_color = ir_config.get_param('apps_upgrade_bg_color',"rgba(31,91,117,1)") + # Setting Module + sections_titles_color = ir_config.get_param('sections_titles_color',"rgba(255,255,255,1)") + sections_titles_bg = ir_config.get_param('sections_titles_bg',"rgba(31,91,117,1)") + # Fonts Settings + english_default_font = ir_config.get_param('english_default_font','default') + arabic_default_font = ir_config.get_param('arabic_default_font','default') + + # update resourcess + res.update(navbar_bg_color=navbar_bg_color,navbar_toggle=navbar_toggle,selection_app_color=selection_app_color, + selection_app_bg_hover=selection_app_bg_hover,navbar_ul_color=navbar_ul_color,navbar_ul_bg_color_hover=navbar_ul_bg_color_hover, + navbar_ul_dropdown_bg_color=navbar_ul_dropdown_bg_color,navbar_ul_dropdown_item_color=navbar_ul_dropdown_item_color, + navbar_ul_dropdown_item_color_hover=navbar_ul_dropdown_item_color_hover,navbar_ul_dropdown_item_bg_color=navbar_ul_dropdown_item_bg_color, + navbar_ul_dropdown_item_hover_color=navbar_ul_dropdown_item_hover_color,navbar_badge_color=navbar_badge_color, + apps_bg_img=apps_bg_img,app_name_color=app_name_color,app_hover_bg_color=app_hover_bg_color,apps_more_info=apps_more_info, + apps_install_color=apps_install_color,apps_install_bg_color=apps_install_bg_color,apps_upgrade_color=apps_upgrade_color, + apps_upgrade_bg_color=apps_upgrade_bg_color,sections_titles_color=sections_titles_color,sections_titles_bg=sections_titles_bg, + english_default_font=english_default_font,arabic_default_font=arabic_default_font) + return res + + def set_values(self): + super(ResConfigSettings, self).set_values() + ir_config = self.env['ir.config_parameter'].sudo() + + # Navigation Bar + ir_config.set_param("navbar_bg_color",self.navbar_bg_color) + ir_config.set_param("navbar_toggle",self.navbar_toggle) + ir_config.set_param("selection_app_color",self.selection_app_color) + ir_config.set_param("selection_app_bg_hover",self.selection_app_bg_hover) + ir_config.set_param("navbar_ul_color",self.navbar_ul_color) + ir_config.set_param("navbar_ul_bg_color_hover",self.navbar_ul_bg_color_hover) + ir_config.set_param("navbar_ul_dropdown_bg_color",self.navbar_ul_dropdown_bg_color) + ir_config.set_param("navbar_ul_dropdown_item_color",self.navbar_ul_dropdown_item_color) + ir_config.set_param("navbar_ul_dropdown_item_color_hover",self.navbar_ul_dropdown_item_color_hover) + ir_config.set_param("navbar_ul_dropdown_item_bg_color",self.navbar_ul_dropdown_item_bg_color) + ir_config.set_param("navbar_ul_dropdown_item_hover_color",self.navbar_ul_dropdown_item_hover_color) + ir_config.set_param("navbar_badge_color",self.navbar_badge_color) + # App Drawer (home) + ir_config.set_param("apps_bg_img",self.apps_bg_img) + ir_config.set_param("app_name_color",self.app_name_color) + ir_config.set_param("app_hover_bg_color",self.app_hover_bg_color) + # Apps Module + ir_config.set_param("apps_more_info",self.apps_more_info) + ir_config.set_param("apps_install_color",self.apps_install_color) + ir_config.set_param("apps_install_bg_color",self.apps_install_bg_color) + ir_config.set_param("apps_upgrade_color",self.apps_upgrade_color) + ir_config.set_param("apps_upgrade_bg_color",self.apps_upgrade_bg_color) + # Setting Module + ir_config.set_param("sections_titles_color",self.sections_titles_color) + ir_config.set_param("sections_titles_bg",self.sections_titles_bg) + #Font Settings + ir_config.set_param("english_default_font",self.english_default_font) + ir_config.set_param("arabic_default_font",self.arabic_default_font) + #Icons settings + ir_config.set_param("setting_icon",self.setting_icon) + + try: + path = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) + theme_path = path + "/odex_themecraft/static/src/scss/variables.scss" + except Exception as e: + raise UserError(_("Please Contact to Administrator. \n %s") % e) + + # Navigation Bar + if self.navbar_bg_color: + backend_theme_attrs.update({'$navbar_bg_color': self.navbar_bg_color}) + if self.navbar_toggle: + backend_theme_attrs.update({'$navbar_toggle': self.navbar_toggle}) + if self.selection_app_color: + backend_theme_attrs.update({'$selection_app_color': self.selection_app_color}) + if self.selection_app_bg_hover: + backend_theme_attrs.update({'$selection_app_bg_hover': self.selection_app_bg_hover}) + if self.navbar_ul_color: + backend_theme_attrs.update({'$navbar_ul_color': self.navbar_ul_color}) + if self.navbar_ul_bg_color_hover: + backend_theme_attrs.update({'$navbar_ul_bg_color_hover': self.navbar_ul_bg_color_hover}) + if self.navbar_ul_dropdown_bg_color: + backend_theme_attrs.update({'$navbar_ul_dropdown_bg_color': self.navbar_ul_dropdown_bg_color}) + if self.navbar_ul_dropdown_item_color: + backend_theme_attrs.update({'$navbar_ul_dropdown_item_color': self.navbar_ul_dropdown_item_color}) + if self.navbar_ul_dropdown_item_color_hover: + backend_theme_attrs.update({'$navbar_ul_dropdown_item_color_hover': self.navbar_ul_dropdown_item_color_hover}) + if self.navbar_ul_dropdown_item_bg_color: + backend_theme_attrs.update({'$navbar_ul_dropdown_item_bg_color': self.navbar_ul_dropdown_item_bg_color}) + if self.navbar_badge_color: + backend_theme_attrs.update({'$navbar_badge_color': self.navbar_badge_color}) + + # App Drawer (home) + if self.apps_bg_img: + backend_theme_attrs.update({'$apps_bg_img': "url('" + ("/web/image/res.config.settings/%s/apps_bg_img" % self.id) + "')"}) + if self.app_name_color: + backend_theme_attrs.update({'$app_name_color': self.app_name_color}) + if self.app_hover_bg_color: + backend_theme_attrs.update({'$app_hover_bg_color': self.app_hover_bg_color}) + + # Apps Module + if self.apps_more_info: + backend_theme_attrs.update({'$apps_more_info': self.apps_more_info}) + if self.apps_install_color: + backend_theme_attrs.update({'$apps_install_color': self.apps_install_color}) + if self.apps_install_bg_color: + backend_theme_attrs.update({'$apps_install_bg_color': self.apps_install_bg_color}) + if self.apps_upgrade_color: + backend_theme_attrs.update({'$apps_upgrade_color': self.apps_upgrade_color}) + if self.apps_upgrade_bg_color: + backend_theme_attrs.update({'$apps_upgrade_bg_color': self.apps_upgrade_bg_color}) + + # Setting Module + if self.sections_titles_color: + backend_theme_attrs.update({'$sections_titles_color': self.sections_titles_color}) + if self.sections_titles_bg: + backend_theme_attrs.update({'$sections_titles_bg': self.sections_titles_bg}) + + # Font Settings + # English Font + if self.english_default_font: + english_font = '"Roboto", "Odoo Unicode Support Noto", sans-serif' + if self.english_default_font == 'font_1': + english_font = 'Helvetica, "Roboto", "Odoo Unicode Support Noto", sans-serif' + elif self.english_default_font == 'font_2': + english_font = 'Futura, "Roboto", "Odoo Unicode Support Noto", sans-serif' + elif self.english_default_font == 'font_3': + english_font = 'Garamond, "Roboto", "Odoo Unicode Support Noto", sans-serif' + elif self.english_default_font == 'font_4': + english_font = 'Times, "Roboto", "Odoo Unicode Support Noto", sans-serif' + elif self.english_default_font == 'font_5': + english_font = 'Arial, "Roboto", "Odoo Unicode Support Noto", sans-serif' + elif self.english_default_font == 'font_6': + english_font = 'Verdana, "Roboto", "Odoo Unicode Support Noto", sans-serif' + elif self.english_default_font == 'font_7': + english_font = 'Comic Sans, "Roboto", "Odoo Unicode Support Noto", sans-serif' + elif self.english_default_font == 'font_8': + english_font = 'Trebuchet, "Roboto", "Odoo Unicode Support Noto", sans-serif' + elif self.english_default_font == 'font_9': + english_font = 'Gill Sans, "Roboto", "Odoo Unicode Support Noto", sans-serif' + elif self.english_default_font == 'font_10': + english_font = 'Georgia, "Roboto", "Odoo Unicode Support Noto", sans-serif' + # Update english default font + backend_theme_attrs.update({'$english_default_font': english_font}) + # Arabic Font + if self.arabic_default_font: + arabic_font = '"Roboto", "Odoo Unicode Support Noto", sans-serif' + if self.arabic_default_font == 'font_1': + arabic_font = 'Arial, "Roboto", "Odoo Unicode Support Noto", sans-serif' + if self.arabic_default_font == 'font_2': + arabic_font = '"Droid Arabic Kufi", "Roboto", "Odoo Unicode Support Noto", sans-serif' + if self.arabic_default_font == 'font_3': + arabic_font = 'Amiri, "Roboto", "Odoo Unicode Support Noto", sans-serif' + if self.arabic_default_font == 'font_4': + arabic_font = '"Droid Arabic Naskh", "Roboto", "Odoo Unicode Support Noto", sans-serif' + if self.arabic_default_font == 'font_5': + arabic_font = '"Frutiger LT Arabic", "Roboto", "Odoo Unicode Support Noto", sans-serif' + # Update arabic default font + backend_theme_attrs.update({'$arabic_default_font': arabic_font}) + + self.replace_file(theme_path, backend_theme_attrs) + \ No newline at end of file diff --git a/odex25_base/odex_themecraft/static/description/icon.png b/odex25_base/odex_themecraft/static/description/icon.png new file mode 100644 index 000000000..0b9a317fd Binary files /dev/null and b/odex25_base/odex_themecraft/static/description/icon.png differ diff --git a/odex25_base/odex_themecraft/static/description/index.html b/odex25_base/odex_themecraft/static/description/index.html new file mode 100755 index 000000000..895109bf0 --- /dev/null +++ b/odex25_base/odex_themecraft/static/description/index.html @@ -0,0 +1,83 @@ +
+
+

+ ONE OF ODEX MODULES

+
+ ODEX system is over than 200+ modules developed by love of Expert Company, based on ODOO system +
+ .to effectively suite's Saudi and Arabic market needs.It is the first Arabic open source ERP and all-in-one + solution +
+
+
+ +
+
+

+ Contact Us +

+
+
+
+
+
+
+ + + +
+

+ + www.exp-sa.com + +

+
+
+
+ + + +
+

+ + exposa + +

+
+
+
+ + + +
+

+ + exposa + +

+
+
+
+ + + +
+

+ + Info@exp-sa.com + +

+
+
+
+
+
+ +
+
diff --git a/odex25_base/odex_themecraft/static/description/internet.png b/odex25_base/odex_themecraft/static/description/internet.png new file mode 100755 index 000000000..a89809bfa Binary files /dev/null and b/odex25_base/odex_themecraft/static/description/internet.png differ diff --git a/odex25_base/odex_themecraft/static/description/linkedin.png b/odex25_base/odex_themecraft/static/description/linkedin.png new file mode 100755 index 000000000..a0fe09caa Binary files /dev/null and b/odex25_base/odex_themecraft/static/description/linkedin.png differ diff --git a/odex25_base/odex_themecraft/static/description/mail.png b/odex25_base/odex_themecraft/static/description/mail.png new file mode 100755 index 000000000..bc5a4de2a Binary files /dev/null and b/odex25_base/odex_themecraft/static/description/mail.png differ diff --git a/odex25_base/odex_themecraft/static/description/odex.png b/odex25_base/odex_themecraft/static/description/odex.png new file mode 100755 index 000000000..de82c0ef4 Binary files /dev/null and b/odex25_base/odex_themecraft/static/description/odex.png differ diff --git a/odex25_base/odex_themecraft/static/description/twitter.png b/odex25_base/odex_themecraft/static/description/twitter.png new file mode 100755 index 000000000..983f325a3 Binary files /dev/null and b/odex25_base/odex_themecraft/static/description/twitter.png differ diff --git a/odex25_base/odex_themecraft/static/src/css/custom.css b/odex25_base/odex_themecraft/static/src/css/custom.css new file mode 100755 index 000000000..78d90a65e --- /dev/null +++ b/odex25_base/odex_themecraft/static/src/css/custom.css @@ -0,0 +1,77 @@ +.o_main_navbar{ + border-color: transparent!important; + background-color: #3E5D7F!important; +} + +.o_main_navbar > ul > li > a:hover, +.o_main_navbar > ul > li > a:focus{ + background-color: #5280b3 !important; +} +.o_main_navbar > a:hover, +.o_main_navbar > button:hover, +.o_main_navbar > a:focus, +.o_main_navbar > button:focus +{ + background: #5280b3; +} +.o_main_navbar .show .dropdown-toggle{ + background-color: #5280b3; +} +.o_home_menu_background{ + background: url(/odex_themecraft/static/src/images/app_drawer.jpeg) no-repeat center/cover!important; +} + +#about .o_setting_right_pane img{ + height: 60px; +} +.o_home_menu_background:not(.o_home_menu_background_custom) .o_main_navbar{ + background: transparent!important; +} + + +.o_searchview .o_searchview_facet .o_searchview_facet_label{ + background-color: #5280b3; +} + +.o_view_nocontent .o_nocontent_help .o_view_nocontent_smiling_face:before{ + background: transparent url(/odex_themecraft/static/src/images/smiling_face.svg) no-repeat center; +} +.o_loading{ + background-color: #5280b3; +} + +.o_tooltip::before{ + background: radial-gradient(#3d5774, #3e5d7f); +} + +.o_tooltip.active{ + border: 3px solid #5280b3!important; +} + +.btn-fill-primary, .btn-primary{ + background-color: #5280b3; + border-color: #3E5D7F; +} + +.btn-fill-primary:hover, .btn-primary:hover{ + background-color: #3E5D7F!important; + border-color: #3E5D7F; +} + +.o_barcode_client_action .o_barcode_header{ + background-color: #5280b3; +} +.o_barcode_client_action .o_barcode_lines_header{ + background-color: #5280b3; +} +.o_onboarding.o_onboarding_violet .o_onboarding_wrap{ + background-color: rgb(39 120 63 / 60%); + background-image: linear-gradient(to bottom, rgba(96, 112, 195, 0.5), #5280b3); +} +.o_onboarding.o_onboarding_orange .o_onboarding_wrap{ + background-color: rgb(39 120 63 / 60%); + background-image: linear-gradient(to bottom, rgba(96, 112, 195, 0.5), #5280b3); +} +.o_MessagingMenu_counter{ + +} \ No newline at end of file diff --git a/odex25_base/odex_themecraft/static/src/css/custom_login.css b/odex25_base/odex_themecraft/static/src/css/custom_login.css new file mode 100755 index 000000000..58dd793ef --- /dev/null +++ b/odex25_base/odex_themecraft/static/src/css/custom_login.css @@ -0,0 +1,16 @@ +.btn-fill-secondary, .btn-secondary{ + background: #5280b3; + border-color: #3E5D7F!important; +} +.btn-fill-primary, .btn-primary{ + background-color: #5280b3; + border-color: #3E5D7F; +} +.btn-fill-primary:hover, .btn-primary:hover{ + background-color: #3E5D7F!important; + border-color: #3E5D7F; +} + +.o_home_menu_background{ + background: url(/odex_themecraft/static/src/images/login.jpg) no-repeat center/cover!important; +} \ No newline at end of file diff --git a/odex25_base/odex_themecraft/static/src/css/custom_point_of_sale.css b/odex25_base/odex_themecraft/static/src/css/custom_point_of_sale.css new file mode 100755 index 000000000..856f5128c --- /dev/null +++ b/odex25_base/odex_themecraft/static/src/css/custom_point_of_sale.css @@ -0,0 +1,17 @@ +.pos .pos-topheader{ + background:#5280b3; +} + +.pos .pos-rightheader .header-button{ + border-right: 1px solid #3E5D7F; +} +.pos .pos-rightheader .header-button:last-child{ + border-left: 1px solid #3E5D7F; +} +.ticket-button:hover, +.ticket-button:focus{ + background-color: #5280b3 !important; +} +.pos .pos-rightheader > *{ + border-right: 1px solid #3E5D7F; +} diff --git a/odex25_base/odex_themecraft/static/src/fonts/arabic/Amiri/Amiri-Bold.eot b/odex25_base/odex_themecraft/static/src/fonts/arabic/Amiri/Amiri-Bold.eot new file mode 100755 index 000000000..560bc1a63 Binary files /dev/null and b/odex25_base/odex_themecraft/static/src/fonts/arabic/Amiri/Amiri-Bold.eot differ diff --git a/odex25_base/odex_themecraft/static/src/fonts/arabic/Amiri/Amiri-Bold.woff b/odex25_base/odex_themecraft/static/src/fonts/arabic/Amiri/Amiri-Bold.woff new file mode 100755 index 000000000..055f58fb0 Binary files /dev/null and b/odex25_base/odex_themecraft/static/src/fonts/arabic/Amiri/Amiri-Bold.woff differ diff --git a/odex25_base/odex_themecraft/static/src/fonts/arabic/Amiri/Amiri-Bold.woff2 b/odex25_base/odex_themecraft/static/src/fonts/arabic/Amiri/Amiri-Bold.woff2 new file mode 100755 index 000000000..a876c8365 Binary files /dev/null and b/odex25_base/odex_themecraft/static/src/fonts/arabic/Amiri/Amiri-Bold.woff2 differ diff --git a/odex25_base/odex_themecraft/static/src/fonts/arabic/Amiri/Amiri-BoldSlanted.eot b/odex25_base/odex_themecraft/static/src/fonts/arabic/Amiri/Amiri-BoldSlanted.eot new file mode 100755 index 000000000..0664b298e Binary files /dev/null and b/odex25_base/odex_themecraft/static/src/fonts/arabic/Amiri/Amiri-BoldSlanted.eot differ diff --git a/odex25_base/odex_themecraft/static/src/fonts/arabic/Amiri/Amiri-BoldSlanted.woff b/odex25_base/odex_themecraft/static/src/fonts/arabic/Amiri/Amiri-BoldSlanted.woff new file mode 100755 index 000000000..9be447fa7 Binary files /dev/null and b/odex25_base/odex_themecraft/static/src/fonts/arabic/Amiri/Amiri-BoldSlanted.woff differ diff --git a/odex25_base/odex_themecraft/static/src/fonts/arabic/Amiri/Amiri-BoldSlanted.woff2 b/odex25_base/odex_themecraft/static/src/fonts/arabic/Amiri/Amiri-BoldSlanted.woff2 new file mode 100755 index 000000000..2f55c283c Binary files /dev/null and b/odex25_base/odex_themecraft/static/src/fonts/arabic/Amiri/Amiri-BoldSlanted.woff2 differ diff --git a/odex25_base/odex_themecraft/static/src/fonts/arabic/Amiri/Amiri-Regular.eot b/odex25_base/odex_themecraft/static/src/fonts/arabic/Amiri/Amiri-Regular.eot new file mode 100755 index 000000000..31b2d331a Binary files /dev/null and b/odex25_base/odex_themecraft/static/src/fonts/arabic/Amiri/Amiri-Regular.eot differ diff --git a/odex25_base/odex_themecraft/static/src/fonts/arabic/Amiri/Amiri-Regular.ttf b/odex25_base/odex_themecraft/static/src/fonts/arabic/Amiri/Amiri-Regular.ttf new file mode 100755 index 000000000..50eaaa3c0 Binary files /dev/null and b/odex25_base/odex_themecraft/static/src/fonts/arabic/Amiri/Amiri-Regular.ttf differ diff --git a/odex25_base/odex_themecraft/static/src/fonts/arabic/Amiri/Amiri-Regular.woff b/odex25_base/odex_themecraft/static/src/fonts/arabic/Amiri/Amiri-Regular.woff new file mode 100755 index 000000000..66713c77d Binary files /dev/null and b/odex25_base/odex_themecraft/static/src/fonts/arabic/Amiri/Amiri-Regular.woff differ diff --git a/odex25_base/odex_themecraft/static/src/fonts/arabic/Amiri/Amiri-Regular.woff2 b/odex25_base/odex_themecraft/static/src/fonts/arabic/Amiri/Amiri-Regular.woff2 new file mode 100755 index 000000000..27fbc9388 Binary files /dev/null and b/odex25_base/odex_themecraft/static/src/fonts/arabic/Amiri/Amiri-Regular.woff2 differ diff --git a/odex25_base/odex_themecraft/static/src/fonts/arabic/Amiri/Amiri-Slanted.eot b/odex25_base/odex_themecraft/static/src/fonts/arabic/Amiri/Amiri-Slanted.eot new file mode 100755 index 000000000..7bc87fe16 Binary files /dev/null and b/odex25_base/odex_themecraft/static/src/fonts/arabic/Amiri/Amiri-Slanted.eot differ diff --git a/odex25_base/odex_themecraft/static/src/fonts/arabic/Amiri/Amiri-Slanted.woff b/odex25_base/odex_themecraft/static/src/fonts/arabic/Amiri/Amiri-Slanted.woff new file mode 100755 index 000000000..875fd3283 Binary files /dev/null and b/odex25_base/odex_themecraft/static/src/fonts/arabic/Amiri/Amiri-Slanted.woff differ diff --git a/odex25_base/odex_themecraft/static/src/fonts/arabic/Amiri/Amiri-Slanted.woff2 b/odex25_base/odex_themecraft/static/src/fonts/arabic/Amiri/Amiri-Slanted.woff2 new file mode 100755 index 000000000..645dfd70e Binary files /dev/null and b/odex25_base/odex_themecraft/static/src/fonts/arabic/Amiri/Amiri-Slanted.woff2 differ diff --git a/odex25_base/odex_themecraft/static/src/fonts/arabic/Amiri/amiri-bold.ttf b/odex25_base/odex_themecraft/static/src/fonts/arabic/Amiri/amiri-bold.ttf new file mode 100755 index 000000000..90152fea5 Binary files /dev/null and b/odex25_base/odex_themecraft/static/src/fonts/arabic/Amiri/amiri-bold.ttf differ diff --git a/odex25_base/odex_themecraft/static/src/fonts/arabic/Amiri/amiri-boldslanted.ttf b/odex25_base/odex_themecraft/static/src/fonts/arabic/Amiri/amiri-boldslanted.ttf new file mode 100755 index 000000000..6a957b97e Binary files /dev/null and b/odex25_base/odex_themecraft/static/src/fonts/arabic/Amiri/amiri-boldslanted.ttf differ diff --git a/odex25_base/odex_themecraft/static/src/fonts/arabic/Amiri/amiri-quran.ttf b/odex25_base/odex_themecraft/static/src/fonts/arabic/Amiri/amiri-quran.ttf new file mode 100755 index 000000000..351dd5d59 Binary files /dev/null and b/odex25_base/odex_themecraft/static/src/fonts/arabic/Amiri/amiri-quran.ttf differ diff --git a/odex25_base/odex_themecraft/static/src/fonts/arabic/Amiri/amiri-slanted.ttf b/odex25_base/odex_themecraft/static/src/fonts/arabic/Amiri/amiri-slanted.ttf new file mode 100755 index 000000000..08774361a Binary files /dev/null and b/odex25_base/odex_themecraft/static/src/fonts/arabic/Amiri/amiri-slanted.ttf differ diff --git a/odex25_base/odex_themecraft/static/src/fonts/arabic/Frutiger/Black.ttf b/odex25_base/odex_themecraft/static/src/fonts/arabic/Frutiger/Black.ttf new file mode 100644 index 000000000..94e347ab2 Binary files /dev/null and b/odex25_base/odex_themecraft/static/src/fonts/arabic/Frutiger/Black.ttf differ diff --git a/odex25_base/odex_themecraft/static/src/fonts/arabic/Frutiger/Bold.ttf b/odex25_base/odex_themecraft/static/src/fonts/arabic/Frutiger/Bold.ttf new file mode 100644 index 000000000..679fc937a Binary files /dev/null and b/odex25_base/odex_themecraft/static/src/fonts/arabic/Frutiger/Bold.ttf differ diff --git a/odex25_base/odex_themecraft/static/src/fonts/arabic/Frutiger/Light.ttf b/odex25_base/odex_themecraft/static/src/fonts/arabic/Frutiger/Light.ttf new file mode 100644 index 000000000..54ff72527 Binary files /dev/null and b/odex25_base/odex_themecraft/static/src/fonts/arabic/Frutiger/Light.ttf differ diff --git a/odex25_base/odex_themecraft/static/src/fonts/arabic/Frutiger/Roman.ttf b/odex25_base/odex_themecraft/static/src/fonts/arabic/Frutiger/Roman.ttf new file mode 100644 index 000000000..02d82cb92 Binary files /dev/null and b/odex25_base/odex_themecraft/static/src/fonts/arabic/Frutiger/Roman.ttf differ diff --git a/odex25_base/odex_themecraft/static/src/fonts/arabic/Kufi/DroidKufi-Bold.eot b/odex25_base/odex_themecraft/static/src/fonts/arabic/Kufi/DroidKufi-Bold.eot new file mode 100755 index 000000000..c98ced39f Binary files /dev/null and b/odex25_base/odex_themecraft/static/src/fonts/arabic/Kufi/DroidKufi-Bold.eot differ diff --git a/odex25_base/odex_themecraft/static/src/fonts/arabic/Kufi/DroidKufi-Bold.ttf b/odex25_base/odex_themecraft/static/src/fonts/arabic/Kufi/DroidKufi-Bold.ttf new file mode 100755 index 000000000..650919e26 Binary files /dev/null and b/odex25_base/odex_themecraft/static/src/fonts/arabic/Kufi/DroidKufi-Bold.ttf differ diff --git a/odex25_base/odex_themecraft/static/src/fonts/arabic/Kufi/DroidKufi-Bold.woff b/odex25_base/odex_themecraft/static/src/fonts/arabic/Kufi/DroidKufi-Bold.woff new file mode 100755 index 000000000..565c0036b Binary files /dev/null and b/odex25_base/odex_themecraft/static/src/fonts/arabic/Kufi/DroidKufi-Bold.woff differ diff --git a/odex25_base/odex_themecraft/static/src/fonts/arabic/Kufi/DroidKufi-Bold.woff2 b/odex25_base/odex_themecraft/static/src/fonts/arabic/Kufi/DroidKufi-Bold.woff2 new file mode 100755 index 000000000..27f95d004 Binary files /dev/null and b/odex25_base/odex_themecraft/static/src/fonts/arabic/Kufi/DroidKufi-Bold.woff2 differ diff --git a/odex25_base/odex_themecraft/static/src/fonts/arabic/Kufi/DroidKufi-Regular.eot b/odex25_base/odex_themecraft/static/src/fonts/arabic/Kufi/DroidKufi-Regular.eot new file mode 100755 index 000000000..d29fcdc8d Binary files /dev/null and b/odex25_base/odex_themecraft/static/src/fonts/arabic/Kufi/DroidKufi-Regular.eot differ diff --git a/odex25_base/odex_themecraft/static/src/fonts/arabic/Kufi/DroidKufi-Regular.ttf b/odex25_base/odex_themecraft/static/src/fonts/arabic/Kufi/DroidKufi-Regular.ttf new file mode 100755 index 000000000..af859750b Binary files /dev/null and b/odex25_base/odex_themecraft/static/src/fonts/arabic/Kufi/DroidKufi-Regular.ttf differ diff --git a/odex25_base/odex_themecraft/static/src/fonts/arabic/Kufi/DroidKufi-Regular.woff b/odex25_base/odex_themecraft/static/src/fonts/arabic/Kufi/DroidKufi-Regular.woff new file mode 100755 index 000000000..2c328bbd8 Binary files /dev/null and b/odex25_base/odex_themecraft/static/src/fonts/arabic/Kufi/DroidKufi-Regular.woff differ diff --git a/odex25_base/odex_themecraft/static/src/fonts/arabic/Kufi/DroidKufi-Regular.woff2 b/odex25_base/odex_themecraft/static/src/fonts/arabic/Kufi/DroidKufi-Regular.woff2 new file mode 100755 index 000000000..44cd1a9ae Binary files /dev/null and b/odex25_base/odex_themecraft/static/src/fonts/arabic/Kufi/DroidKufi-Regular.woff2 differ diff --git a/odex25_base/odex_themecraft/static/src/fonts/arabic/Naskh/DroidNaskh-Bold.eot b/odex25_base/odex_themecraft/static/src/fonts/arabic/Naskh/DroidNaskh-Bold.eot new file mode 100755 index 000000000..be6a9abf7 Binary files /dev/null and b/odex25_base/odex_themecraft/static/src/fonts/arabic/Naskh/DroidNaskh-Bold.eot differ diff --git a/odex25_base/odex_themecraft/static/src/fonts/arabic/Naskh/DroidNaskh-Bold.ttf b/odex25_base/odex_themecraft/static/src/fonts/arabic/Naskh/DroidNaskh-Bold.ttf new file mode 100755 index 000000000..692b79678 Binary files /dev/null and b/odex25_base/odex_themecraft/static/src/fonts/arabic/Naskh/DroidNaskh-Bold.ttf differ diff --git a/odex25_base/odex_themecraft/static/src/fonts/arabic/Naskh/DroidNaskh-Bold.woff b/odex25_base/odex_themecraft/static/src/fonts/arabic/Naskh/DroidNaskh-Bold.woff new file mode 100755 index 000000000..61c4ce65a Binary files /dev/null and b/odex25_base/odex_themecraft/static/src/fonts/arabic/Naskh/DroidNaskh-Bold.woff differ diff --git a/odex25_base/odex_themecraft/static/src/fonts/arabic/Naskh/DroidNaskh-Bold.woff2 b/odex25_base/odex_themecraft/static/src/fonts/arabic/Naskh/DroidNaskh-Bold.woff2 new file mode 100755 index 000000000..a480760f3 Binary files /dev/null and b/odex25_base/odex_themecraft/static/src/fonts/arabic/Naskh/DroidNaskh-Bold.woff2 differ diff --git a/odex25_base/odex_themecraft/static/src/fonts/arabic/Naskh/DroidNaskh-Regular.eot b/odex25_base/odex_themecraft/static/src/fonts/arabic/Naskh/DroidNaskh-Regular.eot new file mode 100755 index 000000000..00213363c Binary files /dev/null and b/odex25_base/odex_themecraft/static/src/fonts/arabic/Naskh/DroidNaskh-Regular.eot differ diff --git a/odex25_base/odex_themecraft/static/src/fonts/arabic/Naskh/DroidNaskh-Regular.ttf b/odex25_base/odex_themecraft/static/src/fonts/arabic/Naskh/DroidNaskh-Regular.ttf new file mode 100755 index 000000000..da9a45f15 Binary files /dev/null and b/odex25_base/odex_themecraft/static/src/fonts/arabic/Naskh/DroidNaskh-Regular.ttf differ diff --git a/odex25_base/odex_themecraft/static/src/fonts/arabic/Naskh/DroidNaskh-Regular.woff b/odex25_base/odex_themecraft/static/src/fonts/arabic/Naskh/DroidNaskh-Regular.woff new file mode 100755 index 000000000..7726404df Binary files /dev/null and b/odex25_base/odex_themecraft/static/src/fonts/arabic/Naskh/DroidNaskh-Regular.woff differ diff --git a/odex25_base/odex_themecraft/static/src/fonts/arabic/Naskh/DroidNaskh-Regular.woff2 b/odex25_base/odex_themecraft/static/src/fonts/arabic/Naskh/DroidNaskh-Regular.woff2 new file mode 100755 index 000000000..a5fd31b8f Binary files /dev/null and b/odex25_base/odex_themecraft/static/src/fonts/arabic/Naskh/DroidNaskh-Regular.woff2 differ diff --git a/odex25_base/odex_themecraft/static/src/img/app_drawer.jpeg b/odex25_base/odex_themecraft/static/src/img/app_drawer.jpeg new file mode 100755 index 000000000..de94dccec Binary files /dev/null and b/odex25_base/odex_themecraft/static/src/img/app_drawer.jpeg differ diff --git a/odex25_base/odex_themecraft/static/src/img/favicon.ico b/odex25_base/odex_themecraft/static/src/img/favicon.ico new file mode 100755 index 000000000..1a5cafdca Binary files /dev/null and b/odex25_base/odex_themecraft/static/src/img/favicon.ico differ diff --git a/odex25_base/odex_themecraft/static/src/img/logo.png b/odex25_base/odex_themecraft/static/src/img/logo.png new file mode 100755 index 000000000..e3b9e6da9 Binary files /dev/null and b/odex25_base/odex_themecraft/static/src/img/logo.png differ diff --git a/odex25_base/odex_themecraft/static/src/img/odex_bg.jpg b/odex25_base/odex_themecraft/static/src/img/odex_bg.jpg new file mode 100755 index 000000000..9c49b586e Binary files /dev/null and b/odex25_base/odex_themecraft/static/src/img/odex_bg.jpg differ diff --git a/odex25_base/odex_themecraft/static/src/img/smiling_face.svg b/odex25_base/odex_themecraft/static/src/img/smiling_face.svg new file mode 100755 index 000000000..250900ea0 --- /dev/null +++ b/odex25_base/odex_themecraft/static/src/img/smiling_face.svg @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/odex25_base/odex_themecraft/static/src/js/customize_user_menu.js b/odex25_base/odex_themecraft/static/src/js/customize_user_menu.js new file mode 100644 index 000000000..e04795e90 --- /dev/null +++ b/odex25_base/odex_themecraft/static/src/js/customize_user_menu.js @@ -0,0 +1,168 @@ +odoo.define('odex_themecraft.UserMenu', function (require) { + "use strict"; + + /** + * This widget is appended by the webclient to the right of the navbar. + * It displays the avatar and the name of the logged user (and optionally the + * db name, in debug mode). + * If clicked, it opens a dropdown allowing the user to perform actions like + * editing its preferences, accessing the documentation, logging out... + */ + + var UserMenu = require('web.UserMenu'); + //避免错误,要再定义 + var documentation_url = 'https://www.odooai.cn'; + var documentation_dev_url = 'https://www.odooai.cn'; + var support_url = 'https://www.odooai.cn'; + var account_title = 'My Account'; + var account_url = 'https://www.odooai.cn'; + + UserMenu.include({ + init: function () { + this._super.apply(this, arguments); + var self = this; + var session = this.getSession(); + var lang_list = ''; + + self._rpc({ + model: 'res.lang', + method: 'search_read', + domain: [], + fields: ['name', 'code'], + lazy: false, + }).then(function (res) { + _.each(res, function (lang) { + var a = ''; + if (lang['code'] === session.user_context.lang) { + a = ''; + } else { + a = ''; + } + lang_list += '' + lang['name'] + a + ''; + }); + lang_list += '