@ -0,0 +1,45 @@ | 
				
			|||||
 | 
					.. 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 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					Advanced Search In Systray | 
				
			||||
 | 
					========================== | 
				
			||||
 | 
					* Master Search Systray enables Users to search the records based on name in any Module. | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					Company | 
				
			||||
 | 
					------- | 
				
			||||
 | 
					* `Cybrosys Techno Solutions <https://cybrosys.com/>`__ | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					License | 
				
			||||
 | 
					------- | 
				
			||||
 | 
					General Public License, Version 3 (LGPL v3). | 
				
			||||
 | 
					(https://www.gnu.org/licenses/lgpl-3.0-standalone.html) | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					Credits | 
				
			||||
 | 
					------- | 
				
			||||
 | 
					Developer:  (V16)Gayathri V, | 
				
			||||
 | 
					            (V17)Anfas Faisal K, | 
				
			||||
 | 
					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 | 
				
			||||
 | 
					========== | 
				
			||||
 | 
					.. image:: https://cybrosys.com/images/logo.png | 
				
			||||
 | 
					   :target: https://cybrosys.com | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					This module is maintained by Cybrosys Technologies. | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					For support and more information, please visit `Our Website <https://cybrosys.com/>`__ | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					Further information | 
				
			||||
 | 
					=================== | 
				
			||||
 | 
					HTML Description: `<static/description/index.html>` | 
				
			||||
@ -0,0 +1,23 @@ | 
				
			|||||
 | 
					# -*- coding: utf-8 -*- | 
				
			||||
 | 
					############################################################################# | 
				
			||||
 | 
					# | 
				
			||||
 | 
					#    Cybrosys Technologies Pvt. Ltd. | 
				
			||||
 | 
					# | 
				
			||||
 | 
					#    Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) | 
				
			||||
 | 
					#    Author: Gayathri V (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 <http://www.gnu.org/licenses/>. | 
				
			||||
 | 
					# | 
				
			||||
 | 
					############################################################################# | 
				
			||||
 | 
					from . import controllers | 
				
			||||
 | 
					from . import models | 
				
			||||
@ -0,0 +1,56 @@ | 
				
			|||||
 | 
					# -*- coding: utf-8 -*- | 
				
			||||
 | 
					############################################################################# | 
				
			||||
 | 
					# | 
				
			||||
 | 
					#    Cybrosys Technologies Pvt. Ltd. | 
				
			||||
 | 
					# | 
				
			||||
 | 
					#    Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) | 
				
			||||
 | 
					#    Author: Gayathri V (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 <http://www.gnu.org/licenses/>. | 
				
			||||
 | 
					# | 
				
			||||
 | 
					############################################################################# | 
				
			||||
 | 
					{ | 
				
			||||
 | 
					    'name': 'Advanced Search In Systray', | 
				
			||||
 | 
					    'version': '16.0.1.0.0', | 
				
			||||
 | 
					    'category': 'Extra Tools', | 
				
			||||
 | 
					    'summary': "Advanced Search in Systray enables Users to search the records" | 
				
			||||
 | 
					               "based on name in any Module.", | 
				
			||||
 | 
					    'description': "The Advanced Search Systray is a feature-rich Odoo module " | 
				
			||||
 | 
					                   "designed to elevate the search experience for users. With " | 
				
			||||
 | 
					                   "a focus on simplicity and effectiveness, this tool allows " | 
				
			||||
 | 
					                   "users to conduct searches seamlessly across all modules " | 
				
			||||
 | 
					                   "within the Odoo platform.", | 
				
			||||
 | 
					    'author': "Cybrosys Techno Solutions", | 
				
			||||
 | 
					    'company': 'Cybrosys Techno Solutions', | 
				
			||||
 | 
					    'maintainer': 'Cybrosys Techno Solutions', | 
				
			||||
 | 
					    'depends': ['base'], | 
				
			||||
 | 
					    'website': "https://www.cybrosys.com", | 
				
			||||
 | 
					    'data': [ | 
				
			||||
 | 
					        'views/res_config_settings_views.xml', | 
				
			||||
 | 
					    ], | 
				
			||||
 | 
					    'assets': { | 
				
			||||
 | 
					        'web.assets_backend': [ | 
				
			||||
 | 
					            'master_search_systray/static/src/css/style.css', | 
				
			||||
 | 
					            'master_search_systray/static/src/scss/master_search_bar.scss', | 
				
			||||
 | 
					            'master_search_systray/static/src/xml/master_search_icon.xml', | 
				
			||||
 | 
					            'master_search_systray/static/src/js/master_search_icon.js', | 
				
			||||
 | 
					            'master_search_systray/static/src/js/MasterSearchDialog.js', | 
				
			||||
 | 
					            'master_search_systray/static/src/xml/MasterSearchDialog.xml' | 
				
			||||
 | 
					        ], | 
				
			||||
 | 
					    }, | 
				
			||||
 | 
					    'images': ['static/description/banner.jpg'], | 
				
			||||
 | 
					    'license': 'LGPL-3', | 
				
			||||
 | 
					    'installable': True, | 
				
			||||
 | 
					    'auto_install': False, | 
				
			||||
 | 
					    'application': False, | 
				
			||||
 | 
					} | 
				
			||||
@ -0,0 +1,22 @@ | 
				
			|||||
 | 
					# -*- coding: utf-8 -*- | 
				
			||||
 | 
					############################################################################# | 
				
			||||
 | 
					# | 
				
			||||
 | 
					#    Cybrosys Technologies Pvt. Ltd. | 
				
			||||
 | 
					# | 
				
			||||
 | 
					#    Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) | 
				
			||||
 | 
					#    Author: Gayathri V (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 <http://www.gnu.org/licenses/>. | 
				
			||||
 | 
					# | 
				
			||||
 | 
					############################################################################# | 
				
			||||
 | 
					from . import master_search_systray | 
				
			||||
@ -0,0 +1,133 @@ | 
				
			|||||
 | 
					# -*- coding: utf-8 -*- | 
				
			||||
 | 
					############################################################################# | 
				
			||||
 | 
					# | 
				
			||||
 | 
					#    Cybrosys Technologies Pvt. Ltd. | 
				
			||||
 | 
					# | 
				
			||||
 | 
					#    Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) | 
				
			||||
 | 
					#    Author: Gayathri V (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 <http://www.gnu.org/licenses/>. | 
				
			||||
 | 
					# | 
				
			||||
 | 
					############################################################################# | 
				
			||||
 | 
					import psycopg2 | 
				
			||||
 | 
					from ast import literal_eval | 
				
			||||
 | 
					from odoo import http | 
				
			||||
 | 
					from odoo.http import request | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					class MasterSearch(http.Controller): | 
				
			||||
 | 
					    """Controller for the master search functionality.""" | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    @http.route("/master/search", methods=["POST"], type="json", | 
				
			||||
 | 
					                auth="user") | 
				
			||||
 | 
					    def master_search(self, query): | 
				
			||||
 | 
					        """ | 
				
			||||
 | 
					        Perform a master search across all models in the system based on the | 
				
			||||
 | 
					        given query. | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					        This method performs a search across multiple models in the Odoo | 
				
			||||
 | 
					        system using the provided query string. The search is conducted on | 
				
			||||
 | 
					        all stored fields within the models associated with the installed | 
				
			||||
 | 
					        modules configured in the system. | 
				
			||||
 | 
					        """ | 
				
			||||
 | 
					        data = [] | 
				
			||||
 | 
					        # Check if the query is not empty | 
				
			||||
 | 
					        if query != '': | 
				
			||||
 | 
					            # Get all models in the system in the res.config.settings | 
				
			||||
 | 
					            config_settings = request.env['ir.config_parameter'].sudo().get_param( | 
				
			||||
 | 
					                'master_search_systray.master_search_installed_ids') | 
				
			||||
 | 
					            if config_settings: | 
				
			||||
 | 
					                config_settings_str = literal_eval(config_settings) | 
				
			||||
 | 
					                # Convert to list of integers | 
				
			||||
 | 
					                config_settings_ids = [int(id_str) for id_str in config_settings_str] | 
				
			||||
 | 
					                # Fetch ir.module.module records for the selected module IDs | 
				
			||||
 | 
					                config_modules = request.env['ir.module.module'].sudo().search([ | 
				
			||||
 | 
					                    ('id', 'in', config_settings_ids)]) | 
				
			||||
 | 
					                # Collect module names from master_search_values | 
				
			||||
 | 
					                module_names = [module.name for module in config_modules] | 
				
			||||
 | 
					                # Fetch ir.module.module records for the selected module names | 
				
			||||
 | 
					                modules = request.env['ir.module.module'].sudo().search([ | 
				
			||||
 | 
					                    ('name', 'in', module_names)]) | 
				
			||||
 | 
					                for module in modules: | 
				
			||||
 | 
					                    models = request.env['ir.model'].sudo().search([]) | 
				
			||||
 | 
					                    filtered_models = models.filtered( | 
				
			||||
 | 
					                        lambda m: module.name in m.modules) | 
				
			||||
 | 
					                    # Loop through each model to perform the search | 
				
			||||
 | 
					                    for rec in filtered_models: | 
				
			||||
 | 
					                        # Filter out fields that are not stored in the database | 
				
			||||
 | 
					                        fields = rec.field_id.filtered(lambda f: f.store).mapped('name') | 
				
			||||
 | 
					                        # Check if the model's main name field is in the stored fields | 
				
			||||
 | 
					                        if rec._rec_name in fields: | 
				
			||||
 | 
					                            # Temporary list to store results for the current model | 
				
			||||
 | 
					                            temp_data = [] | 
				
			||||
 | 
					                            try: | 
				
			||||
 | 
					                                # Execute a raw SQL query to search records in the current model | 
				
			||||
 | 
					                                request.env.cr.execute( | 
				
			||||
 | 
					                                    "SELECT * FROM %s WHERE name ILIKE '%s'" % ( | 
				
			||||
 | 
					                                        rec.model.replace('.', '_'), '%' + query + '%')) | 
				
			||||
 | 
					                                # Fetch the results as a list of dictionaries | 
				
			||||
 | 
					                                records = request.env.cr.dictfetchall() | 
				
			||||
 | 
					                                # If there are matching records, process and append them to temp_data | 
				
			||||
 | 
					                                if len(records) >= 1: | 
				
			||||
 | 
					                                    temp_data.append({ | 
				
			||||
 | 
					                                        'title': rec.name, | 
				
			||||
 | 
					                                        'name': None, | 
				
			||||
 | 
					                                        'id': None, | 
				
			||||
 | 
					                                        'isChild': False, | 
				
			||||
 | 
					                                        'isParent': True, | 
				
			||||
 | 
					                                        'model': rec.model | 
				
			||||
 | 
					                                    }) | 
				
			||||
 | 
					                                    for val in records: | 
				
			||||
 | 
					                                        temp_data.append({ | 
				
			||||
 | 
					                                            'title': None, | 
				
			||||
 | 
					                                            'name': val['name'], | 
				
			||||
 | 
					                                            'id': val['id'], | 
				
			||||
 | 
					                                            'isChild': True, | 
				
			||||
 | 
					                                            'isParent': False, | 
				
			||||
 | 
					                                            'model': rec.model | 
				
			||||
 | 
					                                        }) | 
				
			||||
 | 
					                                # Append temp_data to the main result data | 
				
			||||
 | 
					                                if records: | 
				
			||||
 | 
					                                    data.append(temp_data) | 
				
			||||
 | 
					                                request.env.cr.commit() | 
				
			||||
 | 
					                            except psycopg2.Error: | 
				
			||||
 | 
					                                request.env.cr.rollback() | 
				
			||||
 | 
					                                try: | 
				
			||||
 | 
					                                    # If an exception occurs, attempt to perform a search using Odoo API | 
				
			||||
 | 
					                                    records = request.env[rec.model].search( | 
				
			||||
 | 
					                                        [('name', 'ilike', query)]) | 
				
			||||
 | 
					                                    temp_data = [] | 
				
			||||
 | 
					                                    # If there are matching records, process and append them to temp_data | 
				
			||||
 | 
					                                    if records: | 
				
			||||
 | 
					                                        temp_data.append({ | 
				
			||||
 | 
					                                            'title': rec.name, | 
				
			||||
 | 
					                                            'name': None, | 
				
			||||
 | 
					                                            'id': None, | 
				
			||||
 | 
					                                            'isChild': False, | 
				
			||||
 | 
					                                            'isParent': True, | 
				
			||||
 | 
					                                            'model': rec.model | 
				
			||||
 | 
					                                        }) | 
				
			||||
 | 
					                                        for val in records: | 
				
			||||
 | 
					                                            temp_data.append({ | 
				
			||||
 | 
					                                                'title': None, | 
				
			||||
 | 
					                                                'name': val['name'], | 
				
			||||
 | 
					                                                'id': val['id'], | 
				
			||||
 | 
					                                                'isChild': True, | 
				
			||||
 | 
					                                                'isParent': False, | 
				
			||||
 | 
					                                                'model': rec.model | 
				
			||||
 | 
					                                            }) | 
				
			||||
 | 
					                                        data.append(temp_data) | 
				
			||||
 | 
					                                    request.env.cr.commit() | 
				
			||||
 | 
					                                except Exception as e: | 
				
			||||
 | 
					                                    request.env.cr.rollback() | 
				
			||||
 | 
					        return data | 
				
			||||
@ -0,0 +1,7 @@ | 
				
			|||||
 | 
					## Module <master_search_systray> | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					#### 26.12.2024 | 
				
			||||
 | 
					#### Version 17.0.1.0.0 | 
				
			||||
 | 
					#### ADD | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					- Initial commit for Advanced Search In Systray | 
				
			||||
@ -0,0 +1,22 @@ | 
				
			|||||
 | 
					# -*- coding: utf-8 -*- | 
				
			||||
 | 
					############################################################################# | 
				
			||||
 | 
					# | 
				
			||||
 | 
					#    Cybrosys Technologies Pvt. Ltd. | 
				
			||||
 | 
					# | 
				
			||||
 | 
					#    Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) | 
				
			||||
 | 
					#    Author: Gayathri V(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 <http://www.gnu.org/licenses/>. | 
				
			||||
 | 
					# | 
				
			||||
 | 
					############################################################################# | 
				
			||||
 | 
					from . import res_config_settings | 
				
			||||
@ -0,0 +1,68 @@ | 
				
			|||||
 | 
					# -*- coding: utf-8 -*- | 
				
			||||
 | 
					############################################################################# | 
				
			||||
 | 
					# | 
				
			||||
 | 
					#    Cybrosys Technologies Pvt. Ltd. | 
				
			||||
 | 
					# | 
				
			||||
 | 
					#    Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) | 
				
			||||
 | 
					#    Author: Gayathri V(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 <http://www.gnu.org/licenses/>. | 
				
			||||
 | 
					# | 
				
			||||
 | 
					############################################################################# | 
				
			||||
 | 
					from odoo import api, fields, models | 
				
			||||
 | 
					from ast import literal_eval | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					class ResConfigSettings(models.TransientModel): | 
				
			||||
 | 
					    """ | 
				
			||||
 | 
					    This class extends the 'res.config.settings' model in Odoo to add a new | 
				
			||||
 | 
					    Many2many field for selecting installed modules that will be included in | 
				
			||||
 | 
					    the master search functionality. | 
				
			||||
 | 
					    """ | 
				
			||||
 | 
					    _inherit = "res.config.settings" | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    master_search_installed_ids = fields.Many2many( | 
				
			||||
 | 
					        'ir.module.module', | 
				
			||||
 | 
					        string='Installed Modules', | 
				
			||||
 | 
					        help="Select the installed modules you want to include in the master " | 
				
			||||
 | 
					             "search.", | 
				
			||||
 | 
					        domain="[('state', '=', 'installed')]" | 
				
			||||
 | 
					    ) | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    @api.model | 
				
			||||
 | 
					    def get_values(self): | 
				
			||||
 | 
					        """ | 
				
			||||
 | 
					        Retrieve the current values for the configuration settings, including | 
				
			||||
 | 
					        the selected installed modules for the master search. | 
				
			||||
 | 
					        """ | 
				
			||||
 | 
					        res = super(ResConfigSettings, self).get_values() | 
				
			||||
 | 
					        master_search_installed_ids = self.env[ | 
				
			||||
 | 
					            'ir.config_parameter'].sudo().get_param( | 
				
			||||
 | 
					            'master_search_systray.master_search_installed_ids') | 
				
			||||
 | 
					        if master_search_installed_ids: | 
				
			||||
 | 
					            res.update({ | 
				
			||||
 | 
					                'master_search_installed_ids': [ | 
				
			||||
 | 
					                    (6, 0, literal_eval(master_search_installed_ids))] | 
				
			||||
 | 
					            }) | 
				
			||||
 | 
					        return res | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    def set_values(self): | 
				
			||||
 | 
					        """ | 
				
			||||
 | 
					        Save the current values for the configuration settings, including the | 
				
			||||
 | 
					        selected installed modules for the master search. | 
				
			||||
 | 
					        """ | 
				
			||||
 | 
					        res = super(ResConfigSettings, self).set_values() | 
				
			||||
 | 
					        self.env['ir.config_parameter'].sudo().set_param( | 
				
			||||
 | 
					            'master_search_systray.master_search_installed_ids', | 
				
			||||
 | 
					            self.master_search_installed_ids.ids) | 
				
			||||
 | 
					        return res | 
				
			||||
| 
		 After Width: | Height: | Size: 36 KiB  | 
| 
		 After Width: | Height: | Size: 3.6 KiB  | 
| 
		 After Width: | Height: | Size: 310 B  | 
| 
		 After Width: | Height: | Size: 1.3 KiB  | 
| 
		 After Width: | Height: | Size: 1.4 KiB  | 
| 
		 After Width: | Height: | Size: 576 B  | 
| 
		 After Width: | Height: | Size: 733 B  | 
| 
		 After Width: | Height: | Size: 911 B  | 
| 
		 After Width: | Height: | Size: 1.1 KiB  | 
| 
		 After Width: | Height: | Size: 1.1 KiB  | 
| 
		 After Width: | Height: | Size: 1.2 KiB  | 
| 
		 After Width: | Height: | Size: 673 B  | 
| 
		 After Width: | Height: | Size: 11 KiB  | 
| 
		 After Width: | Height: | Size: 878 B  | 
| 
		 After Width: | Height: | Size: 653 B  | 
| 
		 After Width: | Height: | Size: 905 B  | 
| 
		 After Width: | Height: | Size: 839 B  | 
| 
		 After Width: | Height: | Size: 427 B  | 
| 
		 After Width: | Height: | Size: 627 B  | 
| 
		 After Width: | Height: | Size: 1.2 KiB  | 
| 
		 After Width: | Height: | Size: 988 B  | 
| 
		 After Width: | Height: | Size: 1.2 KiB  | 
| 
		 After Width: | Height: | Size: 80 KiB  | 
| 
		 After Width: | Height: | Size: 1.5 KiB  | 
| 
		 After Width: | Height: | Size: 1.1 KiB  | 
| 
		 After Width: | Height: | Size: 1.9 KiB  | 
| 
		 After Width: | Height: | Size: 1.1 KiB  | 
| 
		 After Width: | Height: | Size: 2.1 KiB  | 
| 
		 After Width: | Height: | Size: 4.4 KiB  | 
| 
		 After Width: | Height: | Size: 3.2 KiB  | 
| 
		 After Width: | Height: | Size: 589 B  | 
| 
		 After Width: | Height: | Size: 3.4 KiB  | 
| 
		 After Width: | Height: | Size: 565 B  | 
| 
		 After Width: | Height: | Size: 1.7 KiB  | 
| 
		 After Width: | Height: | Size: 2.3 KiB  | 
| 
		 After Width: | Height: | Size: 967 B  | 
| 
		 After Width: | Height: | Size: 26 KiB  | 
| 
		 After Width: | Height: | Size: 1.6 KiB  | 
| 
		 After Width: | Height: | Size: 43 KiB  | 
| 
		 After Width: | Height: | Size: 1.4 KiB  | 
| 
		 After Width: | Height: | Size: 3.8 KiB  | 
| 
		 After Width: | Height: | Size: 4.0 KiB  | 
| 
		 After Width: | Height: | Size: 38 KiB  | 
| 
		 After Width: | Height: | Size: 5.0 KiB  | 
| 
		 After Width: | Height: | Size: 4.3 KiB  | 
| 
		 After Width: | Height: | Size: 87 KiB  | 
| 
		 After Width: | Height: | Size: 72 KiB  | 
| 
		 After Width: | Height: | Size: 82 KiB  | 
| 
		 After Width: | Height: | Size: 88 KiB  | 
| 
		 After Width: | Height: | Size: 96 KiB  | 
| 
		 After Width: | Height: | Size: 82 KiB  | 
| 
		 After Width: | Height: | Size: 79 KiB  | 
| 
		 After Width: | Height: | Size: 71 KiB  | 
| 
		 After Width: | Height: | Size: 71 KiB  | 
| 
		 After Width: | Height: | Size: 88 KiB  | 
| 
		 After Width: | Height: | Size: 128 KiB  | 
| 
		 After Width: | Height: | Size: 51 KiB  | 
| 
		 After Width: | Height: | Size: 514 KiB  | 
| 
		 After Width: | Height: | Size: 81 KiB  | 
| 
		 After Width: | Height: | Size: 96 KiB  | 
| 
		 After Width: | Height: | Size: 44 KiB  | 
| 
		 After Width: | Height: | Size: 119 KiB  | 
| 
		 After Width: | Height: | Size: 98 KiB  | 
| 
		 After Width: | Height: | Size: 141 KiB  | 
| 
		 After Width: | Height: | Size: 225 KiB  | 
| 
		 After Width: | Height: | Size: 72 KiB  | 
| 
		 After Width: | Height: | Size: 13 KiB  | 
@ -0,0 +1,648 @@ | 
				
			|||||
 | 
					<div style="background-color: #714B67; height: 810px; width: 100%; padding: 15px; position: relative;"> | 
				
			||||
 | 
					    <!-- TITLE BAR --> | 
				
			||||
 | 
					    <div class="d-flex align-items-center justify-content-between" | 
				
			||||
 | 
					         style="border-bottom: 1px solid #875A7B; padding: 15px; display: flex; justify-content: space-between; align-items: center;"> | 
				
			||||
 | 
					        <img src="assets/misc/cybrosys-logo.png" width="42" height="42" | 
				
			||||
 | 
					             style="width: 42px; height: 42px;"/> | 
				
			||||
 | 
					        <div> | 
				
			||||
 | 
					            <div style="color: #7C7BAD; font-size: 14px; font-family: 'Montserrat', sans-serif; font-weight: bold; background-color: white; display: inline-block; padding: 3px 10px; border-radius: 50px;" | 
				
			||||
 | 
					                 class="mr-2"> | 
				
			||||
 | 
					                <i class="fa fa-check mr-1"></i>Community | 
				
			||||
 | 
					            </div> | 
				
			||||
 | 
					            <div style="color: #7C7BAD; font-size: 14px; font-family: 'Montserrat', sans-serif; font-weight: bold; background-color: white; display: inline-block; padding: 3px 10px; border-radius: 50px;" | 
				
			||||
 | 
					                 class="mr-2"> | 
				
			||||
 | 
					                <i class="fa fa-check mr-1"></i>Enterprise | 
				
			||||
 | 
					            </div> | 
				
			||||
 | 
					            <div style="color: #7C7BAD; font-size: 14px; font-family: 'Montserrat', sans-serif; font-weight: bold; background-color: white; display: inline-block; padding: 3px 10px; border-radius: 50px;" | 
				
			||||
 | 
					                 class="mr-2"> | 
				
			||||
 | 
					                <i class="fa fa-check mr-1"></i>Odoo.sh | 
				
			||||
 | 
					            </div> | 
				
			||||
 | 
					        </div> | 
				
			||||
 | 
					    </div> | 
				
			||||
 | 
					    <!-- END OF TITLE BAR --> | 
				
			||||
 | 
					    <div class="container"> | 
				
			||||
 | 
					        <div class="row"> | 
				
			||||
 | 
					            <div class="col-sm-12 col-md-12 col-lg-12"> | 
				
			||||
 | 
					                <!-- APP HERO --> | 
				
			||||
 | 
					                <h1 style="color: #FFFFFF; font-weight: bolder; font-size: 50px; text-align: center; margin-top: 50px;"> | 
				
			||||
 | 
					                    Advanced Search In Systray</h1> | 
				
			||||
 | 
					                <p style="color:#FFFFFF; padding: 8px 15px; text-align: center; font-size: 24px;"> | 
				
			||||
 | 
					                    The module enables Users to search the records based on name | 
				
			||||
 | 
					                    in any Module. | 
				
			||||
 | 
					                </p> | 
				
			||||
 | 
					                <!-- END OF APP HERO --> | 
				
			||||
 | 
					                <img src="assets/screenshots/hero.gif" class="img-responsive" | 
				
			||||
 | 
					                     style="width: 100%; margin-left: auto; margin-right: auto;"/> | 
				
			||||
 | 
					            </div> | 
				
			||||
 | 
					        </div> | 
				
			||||
 | 
					    </div> | 
				
			||||
 | 
					</div> | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					<!-- NAVIGATION SECTION --> | 
				
			||||
 | 
					<div class="d-flex align-items-center" | 
				
			||||
 | 
					     style="border-bottom: 2px solid #714B67; padding: 15px 0px; margin-top: 300px;"> | 
				
			||||
 | 
					    <div class="d-flex justify-content-center align-items-center mr-2" | 
				
			||||
 | 
					         style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;"> | 
				
			||||
 | 
					        <img src="assets/misc/compass.png"/> | 
				
			||||
 | 
					    </div> | 
				
			||||
 | 
					    <h2 class="mt-2" | 
				
			||||
 | 
					        style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;"> | 
				
			||||
 | 
					        Explore This | 
				
			||||
 | 
					        Module</h2> | 
				
			||||
 | 
					</div> | 
				
			||||
 | 
					<div class="row my-4" style="font-family: 'Montserrat', sans-serif;"> | 
				
			||||
 | 
					    <div class="col-sm-12 col-md-6 my-3"> | 
				
			||||
 | 
					        <a href="#overview"> | 
				
			||||
 | 
					            <div class="d-flex justify-content-between align-items-center" | 
				
			||||
 | 
					                 style="background-color: #f5f5f5; padding: 30px; width: 100%;"> | 
				
			||||
 | 
					                <div> | 
				
			||||
 | 
					                    <span style="color: #714B67; font-size: 24px; font-weight: 500; display: block;">Overview</span> | 
				
			||||
 | 
					                    <span style="color: #714B67; font-size: 16px; font-weight: 400; color:#282F33;  display: block;">Learn more about this module</span> | 
				
			||||
 | 
					                </div> | 
				
			||||
 | 
					                <img src="assets/misc/right-arrow.png" width="36" height="36"/> | 
				
			||||
 | 
					            </div> | 
				
			||||
 | 
					        </a> | 
				
			||||
 | 
					    </div> | 
				
			||||
 | 
					    <div class="col-sm-12 col-md-6 my-3"> | 
				
			||||
 | 
					        <a href="#features"> | 
				
			||||
 | 
					            <div class="d-flex justify-content-between align-items-center" | 
				
			||||
 | 
					                 style="background-color: #f5f5f5; padding: 30px; width: 100%;"> | 
				
			||||
 | 
					                <div> | 
				
			||||
 | 
					                    <span style="color: #714B67; font-size: 24px; font-weight: 500; display: block;">Features</span> | 
				
			||||
 | 
					                    <span style="color: #714B67; font-size: 16px; font-weight: 400; color:#282F33;  display: block;">View features of this module</span> | 
				
			||||
 | 
					                </div> | 
				
			||||
 | 
					                <img src="assets/misc/right-arrow.png" width="36" height="36"/> | 
				
			||||
 | 
					            </div> | 
				
			||||
 | 
					        </a> | 
				
			||||
 | 
					    </div> | 
				
			||||
 | 
					    <div class="col-sm-12 col-md-6 my-3"> | 
				
			||||
 | 
					        <a href="#screenshots"> | 
				
			||||
 | 
					            <div class="d-flex justify-content-between align-items-center" | 
				
			||||
 | 
					                 style="background-color: #f5f5f5; padding: 30px; width: 100%;"> | 
				
			||||
 | 
					                <div> | 
				
			||||
 | 
					                    <span style="color: #714B67; font-size: 24px; font-weight: 500; display: block;">Screenshots</span> | 
				
			||||
 | 
					                    <span style="color: #714B67; font-size: 16px; font-weight: 400; color:#282F33;  display: block;">View screenshots for this module</span> | 
				
			||||
 | 
					                </div> | 
				
			||||
 | 
					                <img src="assets/misc/right-arrow.png" width="36" height="36"/> | 
				
			||||
 | 
					            </div> | 
				
			||||
 | 
					        </a> | 
				
			||||
 | 
					    </div> | 
				
			||||
 | 
					</div> | 
				
			||||
 | 
					<!-- END OF NAVIGATION SECTION --> | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					<!-- OVERVIEW SECTION --> | 
				
			||||
 | 
					<div class="d-flex align-items-center" | 
				
			||||
 | 
					     style="border-bottom: 2px solid #714B67; padding: 15px 0px;" id="overview"> | 
				
			||||
 | 
					    <div class="d-flex justify-content-center align-items-center mr-2" | 
				
			||||
 | 
					         style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;"> | 
				
			||||
 | 
					        <img src="assets/misc/pie-chart.png"/> | 
				
			||||
 | 
					    </div> | 
				
			||||
 | 
					    <h2 class="mt-2" | 
				
			||||
 | 
					        style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;"> | 
				
			||||
 | 
					        Overview | 
				
			||||
 | 
					    </h2> | 
				
			||||
 | 
					</div> | 
				
			||||
 | 
					<div class="row" | 
				
			||||
 | 
					     style="font-family: 'Montserrat', sans-serif; font-weight: 400; font-size: 14px; line-height: 200%;"> | 
				
			||||
 | 
					    <div class="col-sm-12 py-4"> | 
				
			||||
 | 
					        The Advanced Search Systray is a feature-rich Odoo module designed to | 
				
			||||
 | 
					        elevate the search experience for users. With | 
				
			||||
 | 
					        a focus on simplicity and effectiveness, this tool allows users to | 
				
			||||
 | 
					        conduct searches seamlessly across all modules within the Odoo platform. | 
				
			||||
 | 
					    </div> | 
				
			||||
 | 
					</div> | 
				
			||||
 | 
					<!-- END OF OVERVIEW SECTION --> | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					<!-- FEATURES SECTION --> | 
				
			||||
 | 
					<div class="d-flex align-items-center" | 
				
			||||
 | 
					     style="border-bottom: 2px solid #714B67; padding: 15px 0px;" id="features"> | 
				
			||||
 | 
					    <div class="d-flex justify-content-center align-items-center mr-2" | 
				
			||||
 | 
					         style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;"> | 
				
			||||
 | 
					        <img src="assets/misc/features.png"/> | 
				
			||||
 | 
					    </div> | 
				
			||||
 | 
					    <h2 class="mt-2" | 
				
			||||
 | 
					        style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;"> | 
				
			||||
 | 
					        Features | 
				
			||||
 | 
					    </h2> | 
				
			||||
 | 
					</div> | 
				
			||||
 | 
					<div class="row" | 
				
			||||
 | 
					     style="font-family: 'Montserrat', sans-serif; font-weight: 400; font-size: 14px; line-height: 200%;"> | 
				
			||||
 | 
					    <div class="col-sm-12 col-md-6"> | 
				
			||||
 | 
					        <div class="d-flex align-items-center" | 
				
			||||
 | 
					             style="margin-top: 40px; margin-bottom: 40px"> | 
				
			||||
 | 
					            <img src="assets/misc/check-box.png" class="mr-2"/> | 
				
			||||
 | 
					            <span style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Advance Search user.</span> | 
				
			||||
 | 
					        </div> | 
				
			||||
 | 
					        <div class="d-flex align-items-center" | 
				
			||||
 | 
					             style="margin-top: 30px; margin-bottom: 30px"> | 
				
			||||
 | 
					            <img src="assets/misc/check-box.png" class="mr-2"/> | 
				
			||||
 | 
					            <span style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Intuitive Navigation.</span> | 
				
			||||
 | 
					        </div> | 
				
			||||
 | 
					    </div> | 
				
			||||
 | 
					</div> | 
				
			||||
 | 
					<!-- END OF FEATURES SECTION --> | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					<!-- SCREENSHOTS SECTION --> | 
				
			||||
 | 
					<div class="d-flex align-items-center" | 
				
			||||
 | 
					     style="border-bottom: 2px solid #714B67; padding: 15px 0px;" | 
				
			||||
 | 
					     id="screenshots"> | 
				
			||||
 | 
					    <div class="d-flex justify-content-center align-items-center mr-2" | 
				
			||||
 | 
					         style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;"> | 
				
			||||
 | 
					        <img src="assets/misc/pictures.png"/> | 
				
			||||
 | 
					    </div> | 
				
			||||
 | 
					    <h2 class="mt-2" | 
				
			||||
 | 
					        style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;"> | 
				
			||||
 | 
					        Screenshots | 
				
			||||
 | 
					    </h2> | 
				
			||||
 | 
					</div> | 
				
			||||
 | 
					<div class="row"> | 
				
			||||
 | 
					    <div class="col-sm-12"> | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					        <div style="display: block; margin: 30px auto;"> | 
				
			||||
 | 
					            <h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;"> | 
				
			||||
 | 
					                Go to Settings then Select Master Search Management | 
				
			||||
 | 
					            </h3> | 
				
			||||
 | 
					            <img src="assets/screenshots/1.png" | 
				
			||||
 | 
					                 class="img-thumbnail"> | 
				
			||||
 | 
					        </div> | 
				
			||||
 | 
					        <div style="display: block; margin: 30px auto;"> | 
				
			||||
 | 
					            <h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;"> | 
				
			||||
 | 
					                Please select any modules you want to include in your master | 
				
			||||
 | 
					                search. | 
				
			||||
 | 
					            </h3> | 
				
			||||
 | 
					            <p> | 
				
			||||
 | 
					                Note: Adding too many modules may significantly increase | 
				
			||||
 | 
					                processing time. | 
				
			||||
 | 
					            </p> | 
				
			||||
 | 
					            <img src="assets/screenshots/2.png" | 
				
			||||
 | 
					                 class="img-thumbnail"> | 
				
			||||
 | 
					        </div> | 
				
			||||
 | 
					        <h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;"> | 
				
			||||
 | 
					            Click on the Search Icon located in the top-right corner of the | 
				
			||||
 | 
					            Systray | 
				
			||||
 | 
					        </h3> | 
				
			||||
 | 
					        <div style="display: block; margin: 30px auto;"> | 
				
			||||
 | 
					            <img src="assets/screenshots/3.png" | 
				
			||||
 | 
					                 class="img-thumbnail"> | 
				
			||||
 | 
					        </div> | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					        <div style="display: block; margin: 30px auto;"> | 
				
			||||
 | 
					            <h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;"> | 
				
			||||
 | 
					                Input your desired search query and click the Search Icon to | 
				
			||||
 | 
					                retrieve relevant results. | 
				
			||||
 | 
					            </h3> | 
				
			||||
 | 
					            <img src="assets/screenshots/4.png" | 
				
			||||
 | 
					                 class="img-thumbnail"> | 
				
			||||
 | 
					        </div> | 
				
			||||
 | 
					        <div style="display: block; margin: 30px auto;"> | 
				
			||||
 | 
					            <h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;"> | 
				
			||||
 | 
					                You will get the results from here and by clicking the record | 
				
			||||
 | 
					                from related menus | 
				
			||||
 | 
					            </h3> | 
				
			||||
 | 
					            <img src="assets/screenshots/5.png" | 
				
			||||
 | 
					                 class="img-thumbnail"> | 
				
			||||
 | 
					        </div> | 
				
			||||
 | 
					        <div style="display: block; margin: 30px auto;"> | 
				
			||||
 | 
					            <h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;"> | 
				
			||||
 | 
					                Clicking on the record will take you directly to the | 
				
			||||
 | 
					                corresponding menu. | 
				
			||||
 | 
					            </h3> | 
				
			||||
 | 
					            <img src="assets/screenshots/6.png" | 
				
			||||
 | 
					                 class="img-thumbnail"> | 
				
			||||
 | 
					        </div> | 
				
			||||
 | 
					        <div style="display: block; margin: 30px auto;"> | 
				
			||||
 | 
					            <h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;"> | 
				
			||||
 | 
					                Clicking on records outside related menus . | 
				
			||||
 | 
					            </h3> | 
				
			||||
 | 
					            <img src="assets/screenshots/7.png" | 
				
			||||
 | 
					                 class="img-thumbnail"> | 
				
			||||
 | 
					        </div> | 
				
			||||
 | 
					        <div style="display: block; margin: 30px auto;"> | 
				
			||||
 | 
					            <h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;"> | 
				
			||||
 | 
					                Clicking on the record will take you directly to the | 
				
			||||
 | 
					                corresponding record. | 
				
			||||
 | 
					            </h3> | 
				
			||||
 | 
					            <img src="assets/screenshots/8.png" | 
				
			||||
 | 
					                 class="img-thumbnail"> | 
				
			||||
 | 
					        </div> | 
				
			||||
 | 
					    </div> | 
				
			||||
 | 
					</div> | 
				
			||||
 | 
					<!-- END OF SCREENSHOTS SECTION --> | 
				
			||||
 | 
					<!-- RELATED PRODUCTS --> | 
				
			||||
 | 
					<div class="d-flex align-items-center" | 
				
			||||
 | 
					     style="border-bottom: 2px solid #714B67; padding: 15px 0px;"> | 
				
			||||
 | 
					    <div class="d-flex justify-content-center align-items-center mr-2" | 
				
			||||
 | 
					         style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;"> | 
				
			||||
 | 
					        <img src="assets/misc/categories.png"/> | 
				
			||||
 | 
					    </div> | 
				
			||||
 | 
					    <h2 class="mt-2" | 
				
			||||
 | 
					        style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;"> | 
				
			||||
 | 
					        Related Products | 
				
			||||
 | 
					    </h2> | 
				
			||||
 | 
					</div> | 
				
			||||
 | 
					<div class="row"> | 
				
			||||
 | 
					    <div class="col-sm-12"> | 
				
			||||
 | 
					        <div id="demo1" class="row carousel slide" data-ride="carousel"> | 
				
			||||
 | 
					            <!-- The slideshow --> | 
				
			||||
 | 
					            <div class="carousel-inner" style="padding: 30px;"> | 
				
			||||
 | 
					                <div class="carousel-item" style="min-height: 198.656px;"> | 
				
			||||
 | 
					                    <div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" | 
				
			||||
 | 
					                         style="float:left"> | 
				
			||||
 | 
					                        <a href="https://apps.odoo.com/apps/modules/16.0/manufacturing_reports/" | 
				
			||||
 | 
					                           target="_blank"> | 
				
			||||
 | 
					                            <div style="border-radius:10px"> | 
				
			||||
 | 
					                                <img class="img img-responsive center-block" | 
				
			||||
 | 
					                                     style="border-radius: 0px;" | 
				
			||||
 | 
					                                     src="assets/modules/1.png"> | 
				
			||||
 | 
					                            </div> | 
				
			||||
 | 
					                        </a> | 
				
			||||
 | 
					                    </div> | 
				
			||||
 | 
					                    <div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" | 
				
			||||
 | 
					                         style="float:left"> | 
				
			||||
 | 
					                        <a href="https://apps.odoo.com/apps/modules/16.0/manufacturing_timesheet/#" | 
				
			||||
 | 
					                           target="_blank"> | 
				
			||||
 | 
					                            <div style="border-radius:10px"> | 
				
			||||
 | 
					                                <img class="img img-responsive center-block" | 
				
			||||
 | 
					                                     style="border-radius: 0px;" | 
				
			||||
 | 
					                                     src="assets/modules/2.png"> | 
				
			||||
 | 
					                            </div> | 
				
			||||
 | 
					                        </a> | 
				
			||||
 | 
					                    </div> | 
				
			||||
 | 
					                    <div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" | 
				
			||||
 | 
					                         style="float:left"> | 
				
			||||
 | 
					                        <a href="https://apps.odoo.com/apps/modules/16.0/mrp_work_order_print/" | 
				
			||||
 | 
					                           target="_blank"> | 
				
			||||
 | 
					                            <div style="border-radius:10px"> | 
				
			||||
 | 
					                                <img class="img img-responsive center-block" | 
				
			||||
 | 
					                                     style="border-radius: 0px;" | 
				
			||||
 | 
					                                     src="assets/modules/3.png"> | 
				
			||||
 | 
					                            </div> | 
				
			||||
 | 
					                        </a> | 
				
			||||
 | 
					                    </div> | 
				
			||||
 | 
					                </div> | 
				
			||||
 | 
					                <div class="carousel-item active" | 
				
			||||
 | 
					                     style="min-height: 198.656px;"> | 
				
			||||
 | 
					                    <div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" | 
				
			||||
 | 
					                         style="float:left"> | 
				
			||||
 | 
					                        <a href="https://apps.odoo.com/apps/modules/16.0/duplicate_product_bom/#" | 
				
			||||
 | 
					                           target="_blank"> | 
				
			||||
 | 
					                            <div style="border-radius:10px"> | 
				
			||||
 | 
					                                <img class="img img-responsive center-block" | 
				
			||||
 | 
					                                     style="border-radius: 0px;" | 
				
			||||
 | 
					                                     src="assets/modules/4.png"> | 
				
			||||
 | 
					                            </div> | 
				
			||||
 | 
					                        </a> | 
				
			||||
 | 
					                    </div> | 
				
			||||
 | 
					                    <div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" | 
				
			||||
 | 
					                         style="float:left"> | 
				
			||||
 | 
					                        <a href="https://apps.odoo.com/apps/modules/16.0/so_bom_selection/" | 
				
			||||
 | 
					                           target="_blank"> | 
				
			||||
 | 
					                            <div style="border-radius:10px"> | 
				
			||||
 | 
					                                <img class="img img-responsive center-block" | 
				
			||||
 | 
					                                     style="border-radius: 0px;" | 
				
			||||
 | 
					                                     src="assets/modules/5.png"> | 
				
			||||
 | 
					                            </div> | 
				
			||||
 | 
					                        </a> | 
				
			||||
 | 
					                    </div> | 
				
			||||
 | 
					                    <div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" | 
				
			||||
 | 
					                         style="float:left"> | 
				
			||||
 | 
					                        <a href="https://apps.odoo.com/apps/modules/16.0/task_overdue_email_odoo/#" | 
				
			||||
 | 
					                           target="_blank"> | 
				
			||||
 | 
					                            <div style="border-radius:10px"> | 
				
			||||
 | 
					                                <img class="img img-responsive center-block" | 
				
			||||
 | 
					                                     style="border-radius: 0px;" | 
				
			||||
 | 
					                                     src="assets/modules/6.png"> | 
				
			||||
 | 
					                            </div> | 
				
			||||
 | 
					                        </a> | 
				
			||||
 | 
					                    </div> | 
				
			||||
 | 
					                </div> | 
				
			||||
 | 
					            </div> | 
				
			||||
 | 
					            <!-- Left and right controls --> | 
				
			||||
 | 
					            <a class="carousel-control-prev" href="#demo1" data-slide="prev" | 
				
			||||
 | 
					               style="width:35px; color:#000"> <span | 
				
			||||
 | 
					                    class="carousel-control-prev-icon"><i | 
				
			||||
 | 
					                    class="fa fa-chevron-left" | 
				
			||||
 | 
					                    style="font-size:24px"></i></span> | 
				
			||||
 | 
					            </a> <a class="carousel-control-next" href="#demo1" | 
				
			||||
 | 
					                    data-slide="next" style="width:35px; color:#000"> | 
				
			||||
 | 
					            <span class="carousel-control-next-icon"><i | 
				
			||||
 | 
					                    class="fa fa-chevron-right" | 
				
			||||
 | 
					                    style="font-size:24px"></i></span></a> | 
				
			||||
 | 
					        </div> | 
				
			||||
 | 
					    </div> | 
				
			||||
 | 
					</div> | 
				
			||||
 | 
					<!-- END OF RELATED PRODUCTS --> | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					<!-- OUR SERVICES --> | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					<div class="d-flex align-items-center" | 
				
			||||
 | 
					     style="border-bottom: 2px solid #714B67; padding: 15px 0px;"> | 
				
			||||
 | 
					    <div class="d-flex justify-content-center align-items-center mr-2" | 
				
			||||
 | 
					         style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;"> | 
				
			||||
 | 
					        <img src="assets/misc/star.png"/> | 
				
			||||
 | 
					    </div> | 
				
			||||
 | 
					    <h2 class="mt-2" | 
				
			||||
 | 
					        style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;"> | 
				
			||||
 | 
					        Our Services | 
				
			||||
 | 
					    </h2> | 
				
			||||
 | 
					</div> | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					<div class="container my-5"> | 
				
			||||
 | 
					    <div class="row"> | 
				
			||||
 | 
					        <div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4"> | 
				
			||||
 | 
					            <div class="d-flex justify-content-center align-items-center mx-3 my-3" | 
				
			||||
 | 
					                 style="background-color: #1dd1a1 !important; border-radius: 15px !important; height: 80px; width: 80px;"> | 
				
			||||
 | 
					                <img src="assets/icons/cogs.png" class="img-responsive" | 
				
			||||
 | 
					                     height="48px" width="48px"> | 
				
			||||
 | 
					            </div> | 
				
			||||
 | 
					            <h6 class="text-center" | 
				
			||||
 | 
					                style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;"> | 
				
			||||
 | 
					                Odoo | 
				
			||||
 | 
					                Customization</h6> | 
				
			||||
 | 
					        </div> | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					        <div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4"> | 
				
			||||
 | 
					            <div class="d-flex justify-content-center align-items-center mx-3 my-3" | 
				
			||||
 | 
					                 style="background-color: #ff6b6b !important; border-radius: 15px !important; height: 80px; width: 80px;"> | 
				
			||||
 | 
					                <img src="assets/icons/wrench.png" class="img-responsive" | 
				
			||||
 | 
					                     height="48px" width="48px"> | 
				
			||||
 | 
					            </div> | 
				
			||||
 | 
					            <h6 class="text-center" | 
				
			||||
 | 
					                style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;"> | 
				
			||||
 | 
					                Odoo | 
				
			||||
 | 
					                Implementation</h6> | 
				
			||||
 | 
					        </div> | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					        <div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4"> | 
				
			||||
 | 
					            <div class="d-flex justify-content-center align-items-center mx-3 my-3" | 
				
			||||
 | 
					                 style="background-color: #6462CD !important; border-radius: 15px !important; height: 80px; width: 80px;"> | 
				
			||||
 | 
					                <img src="assets/icons/lifebuoy.png" class="img-responsive" | 
				
			||||
 | 
					                     height="48px" width="48px"> | 
				
			||||
 | 
					            </div> | 
				
			||||
 | 
					            <h6 class="text-center" | 
				
			||||
 | 
					                style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;"> | 
				
			||||
 | 
					                Odoo | 
				
			||||
 | 
					                Support</h6> | 
				
			||||
 | 
					        </div> | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					        <div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4"> | 
				
			||||
 | 
					            <div class="d-flex justify-content-center align-items-center mx-3 my-3" | 
				
			||||
 | 
					                 style="background-color: #ffa801 !important; border-radius: 15px !important; height: 80px; width: 80px;"> | 
				
			||||
 | 
					                <img src="assets/icons/user.png" class="img-responsive" | 
				
			||||
 | 
					                     height="48px" width="48px"> | 
				
			||||
 | 
					            </div> | 
				
			||||
 | 
					            <h6 class="text-center" | 
				
			||||
 | 
					                style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;"> | 
				
			||||
 | 
					                Hire | 
				
			||||
 | 
					                Odoo | 
				
			||||
 | 
					                Developer</h6> | 
				
			||||
 | 
					        </div> | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					        <div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4"> | 
				
			||||
 | 
					            <div class="d-flex justify-content-center align-items-center mx-3 my-3" | 
				
			||||
 | 
					                 style="background-color: #54a0ff  !important; border-radius: 15px !important; height: 80px; width: 80px;"> | 
				
			||||
 | 
					                <img src="assets/icons/puzzle.png" class="img-responsive" | 
				
			||||
 | 
					                     height="48px" width="48px"> | 
				
			||||
 | 
					            </div> | 
				
			||||
 | 
					            <h6 class="text-center" | 
				
			||||
 | 
					                style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;"> | 
				
			||||
 | 
					                Odoo | 
				
			||||
 | 
					                Integration</h6> | 
				
			||||
 | 
					        </div> | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					        <div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4"> | 
				
			||||
 | 
					            <div class="d-flex justify-content-center align-items-center mx-3 my-3" | 
				
			||||
 | 
					                 style="background-color: #6d7680 !important; border-radius: 15px !important; height: 80px; width: 80px;"> | 
				
			||||
 | 
					                <img src="assets/icons/update.png" class="img-responsive" | 
				
			||||
 | 
					                     height="48px" width="48px"> | 
				
			||||
 | 
					            </div> | 
				
			||||
 | 
					            <h6 class="text-center" | 
				
			||||
 | 
					                style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;"> | 
				
			||||
 | 
					                Odoo | 
				
			||||
 | 
					                Migration</h6> | 
				
			||||
 | 
					        </div> | 
				
			||||
 | 
					        <div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4"> | 
				
			||||
 | 
					            <div class="d-flex justify-content-center align-items-center mx-3 my-3" | 
				
			||||
 | 
					                 style="background-color: #786fa6 !important; border-radius: 15px !important; height: 80px; width: 80px;"> | 
				
			||||
 | 
					                <img src="assets/icons/consultation.png" class="img-responsive" | 
				
			||||
 | 
					                     height="48px" width="48px"> | 
				
			||||
 | 
					            </div> | 
				
			||||
 | 
					            <h6 class="text-center" | 
				
			||||
 | 
					                style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;"> | 
				
			||||
 | 
					                Odoo | 
				
			||||
 | 
					                Consultancy</h6> | 
				
			||||
 | 
					        </div> | 
				
			||||
 | 
					        <div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4"> | 
				
			||||
 | 
					            <div class="d-flex justify-content-center align-items-center mx-3 my-3" | 
				
			||||
 | 
					                 style="background-color: #f8a5c2 !important; border-radius: 15px !important; height: 80px; width: 80px;"> | 
				
			||||
 | 
					                <img src="assets/icons/training.png" class="img-responsive" | 
				
			||||
 | 
					                     height="48px" width="48px"> | 
				
			||||
 | 
					            </div> | 
				
			||||
 | 
					            <h6 class="text-center" | 
				
			||||
 | 
					                style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;"> | 
				
			||||
 | 
					                Odoo | 
				
			||||
 | 
					                Implementation</h6> | 
				
			||||
 | 
					        </div> | 
				
			||||
 | 
					        <div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4"> | 
				
			||||
 | 
					            <div class="d-flex justify-content-center align-items-center mx-3 my-3" | 
				
			||||
 | 
					                 style="background-color: #e6be26 !important; border-radius: 15px !important; height: 80px; width: 80px;"> | 
				
			||||
 | 
					                <img src="assets/icons/license.png" class="img-responsive" | 
				
			||||
 | 
					                     height="48px" width="48px"> | 
				
			||||
 | 
					            </div> | 
				
			||||
 | 
					            <h6 class="text-center" | 
				
			||||
 | 
					                style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;"> | 
				
			||||
 | 
					                Odoo | 
				
			||||
 | 
					                Licensing Consultancy</h6> | 
				
			||||
 | 
					        </div> | 
				
			||||
 | 
					    </div> | 
				
			||||
 | 
					</div> | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					<!-- END OF OUR SERVICES --> | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					<!-- OUR INDUSTRIES --> | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					<div class="d-flex align-items-center" | 
				
			||||
 | 
					     style="border-bottom: 2px solid #714B67; padding: 15px 0px;"> | 
				
			||||
 | 
					    <div class="d-flex justify-content-center align-items-center mr-2" | 
				
			||||
 | 
					         style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;"> | 
				
			||||
 | 
					        <img src="assets/misc/corporate.png"/> | 
				
			||||
 | 
					    </div> | 
				
			||||
 | 
					    <h2 class="mt-2" | 
				
			||||
 | 
					        style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;"> | 
				
			||||
 | 
					        Our | 
				
			||||
 | 
					        Industries | 
				
			||||
 | 
					    </h2> | 
				
			||||
 | 
					</div> | 
				
			||||
 | 
					<div class="container my-5"> | 
				
			||||
 | 
					    <div class="row"> | 
				
			||||
 | 
					        <div class="col-lg-3"> | 
				
			||||
 | 
					            <div class="my-4 d-flex flex-column justify-content-center" | 
				
			||||
 | 
					                 style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;"> | 
				
			||||
 | 
					                <img src="assets/icons/trading-black.png" | 
				
			||||
 | 
					                     class="img-responsive mb-3" height="48px" width="48px"> | 
				
			||||
 | 
					                <h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;"> | 
				
			||||
 | 
					                    Trading | 
				
			||||
 | 
					                </h5> | 
				
			||||
 | 
					                <p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;"> | 
				
			||||
 | 
					                    Easily procure | 
				
			||||
 | 
					                    and | 
				
			||||
 | 
					                    sell your products</p> | 
				
			||||
 | 
					            </div> | 
				
			||||
 | 
					        </div> | 
				
			||||
 | 
					        <div class="col-lg-3"> | 
				
			||||
 | 
					            <div class="my-4 d-flex flex-column justify-content-center" | 
				
			||||
 | 
					                 style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;"> | 
				
			||||
 | 
					                <img src="assets/icons/pos-black.png" | 
				
			||||
 | 
					                     class="img-responsive mb-3" height="48px" width="48px"> | 
				
			||||
 | 
					                <h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;"> | 
				
			||||
 | 
					                    POS | 
				
			||||
 | 
					                </h5> | 
				
			||||
 | 
					                <p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;"> | 
				
			||||
 | 
					                    Easy configuration and convivial experience</p> | 
				
			||||
 | 
					            </div> | 
				
			||||
 | 
					        </div> | 
				
			||||
 | 
					        <div class="col-lg-3"> | 
				
			||||
 | 
					            <div class="my-4 d-flex flex-column justify-content-center" | 
				
			||||
 | 
					                 style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;"> | 
				
			||||
 | 
					                <img src="assets/icons/education-black.png" | 
				
			||||
 | 
					                     class="img-responsive mb-3" height="48px" width="48px"> | 
				
			||||
 | 
					                <h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;"> | 
				
			||||
 | 
					                    Education | 
				
			||||
 | 
					                </h5> | 
				
			||||
 | 
					                <p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;"> | 
				
			||||
 | 
					                    A platform for | 
				
			||||
 | 
					                    educational management</p> | 
				
			||||
 | 
					            </div> | 
				
			||||
 | 
					        </div> | 
				
			||||
 | 
					        <div class="col-lg-3"> | 
				
			||||
 | 
					            <div class="my-4 d-flex flex-column justify-content-center" | 
				
			||||
 | 
					                 style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;"> | 
				
			||||
 | 
					                <img src="assets/icons/manufacturing-black.png" | 
				
			||||
 | 
					                     class="img-responsive mb-3" height="48px" width="48px"> | 
				
			||||
 | 
					                <h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;"> | 
				
			||||
 | 
					                    Manufacturing | 
				
			||||
 | 
					                </h5> | 
				
			||||
 | 
					                <p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;"> | 
				
			||||
 | 
					                    Plan, track and | 
				
			||||
 | 
					                    schedule your operations</p> | 
				
			||||
 | 
					            </div> | 
				
			||||
 | 
					        </div> | 
				
			||||
 | 
					        <div class="col-lg-3"> | 
				
			||||
 | 
					            <div class="my-4 d-flex flex-column justify-content-center" | 
				
			||||
 | 
					                 style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;"> | 
				
			||||
 | 
					                <img src="assets/icons/ecom-black.png" | 
				
			||||
 | 
					                     class="img-responsive mb-3" height="48px" width="48px"> | 
				
			||||
 | 
					                <h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;"> | 
				
			||||
 | 
					                    E-commerce & Website | 
				
			||||
 | 
					                </h5> | 
				
			||||
 | 
					                <p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;"> | 
				
			||||
 | 
					                    Mobile | 
				
			||||
 | 
					                    friendly, | 
				
			||||
 | 
					                    awe-inspiring product pages</p> | 
				
			||||
 | 
					            </div> | 
				
			||||
 | 
					        </div> | 
				
			||||
 | 
					        <div class="col-lg-3"> | 
				
			||||
 | 
					            <div class="my-4 d-flex flex-column justify-content-center" | 
				
			||||
 | 
					                 style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;"> | 
				
			||||
 | 
					                <img src="assets/icons/service-black.png" | 
				
			||||
 | 
					                     class="img-responsive mb-3" height="48px" width="48px"> | 
				
			||||
 | 
					                <h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;"> | 
				
			||||
 | 
					                    Service Management | 
				
			||||
 | 
					                </h5> | 
				
			||||
 | 
					                <p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;"> | 
				
			||||
 | 
					                    Keep track of | 
				
			||||
 | 
					                    services and invoice</p> | 
				
			||||
 | 
					            </div> | 
				
			||||
 | 
					        </div> | 
				
			||||
 | 
					        <div class="col-lg-3"> | 
				
			||||
 | 
					            <div class="my-4 d-flex flex-column justify-content-center" | 
				
			||||
 | 
					                 style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;"> | 
				
			||||
 | 
					                <img src="assets/icons/restaurant-black.png" | 
				
			||||
 | 
					                     class="img-responsive mb-3" height="48px" width="48px"> | 
				
			||||
 | 
					                <h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;"> | 
				
			||||
 | 
					                    Restaurant | 
				
			||||
 | 
					                </h5> | 
				
			||||
 | 
					                <p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;"> | 
				
			||||
 | 
					                    Run your bar or | 
				
			||||
 | 
					                    restaurant methodically</p> | 
				
			||||
 | 
					            </div> | 
				
			||||
 | 
					        </div> | 
				
			||||
 | 
					        <div class="col-lg-3"> | 
				
			||||
 | 
					            <div class="my-4 d-flex flex-column justify-content-center" | 
				
			||||
 | 
					                 style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;"> | 
				
			||||
 | 
					                <img src="assets/icons/hotel-black.png" | 
				
			||||
 | 
					                     class="img-responsive mb-3" height="48px" width="48px"> | 
				
			||||
 | 
					                <h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;"> | 
				
			||||
 | 
					                    Hotel Management | 
				
			||||
 | 
					                </h5> | 
				
			||||
 | 
					                <p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;"> | 
				
			||||
 | 
					                    An | 
				
			||||
 | 
					                    all-inclusive | 
				
			||||
 | 
					                    hotel management application</p> | 
				
			||||
 | 
					            </div> | 
				
			||||
 | 
					        </div> | 
				
			||||
 | 
					    </div> | 
				
			||||
 | 
					</div> | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					<!--  END OF OUR INDUSTRIES --> | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					<!-- SUPPORT --> | 
				
			||||
 | 
					<div class="d-flex align-items-center" | 
				
			||||
 | 
					     style="border-bottom: 2px solid #714B67; padding: 15px 0px;"> | 
				
			||||
 | 
					    <div class="d-flex justify-content-center align-items-center mr-2" | 
				
			||||
 | 
					         style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;"> | 
				
			||||
 | 
					        <img src="assets/misc/customer-support.png"/> | 
				
			||||
 | 
					    </div> | 
				
			||||
 | 
					    <h2 class="mt-2" | 
				
			||||
 | 
					        style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;"> | 
				
			||||
 | 
					        Support | 
				
			||||
 | 
					    </h2> | 
				
			||||
 | 
					</div> | 
				
			||||
 | 
					<div class="container mt-5"> | 
				
			||||
 | 
					    <div class="row"> | 
				
			||||
 | 
					        <div class="col-sm-12 col-md-6"> | 
				
			||||
 | 
					            <div style="background-color: #F6F8F9; padding: 30px; display: flex; align-items: center;"> | 
				
			||||
 | 
					                <div class="mr-4 d-flex justify-content-center align-items-center" | 
				
			||||
 | 
					                     style="background-color: #714B67; display: inline-block; height: 70px; width: 70px; display: flex; align-items: center; justify-content: center;"> | 
				
			||||
 | 
					                    <img src="assets/misc/support.png" height="48" width="48" | 
				
			||||
 | 
					                         style="width: 42px; height: 42px;"/> | 
				
			||||
 | 
					                </div> | 
				
			||||
 | 
					                <div> | 
				
			||||
 | 
					                    <h4>Need Help?</h4> | 
				
			||||
 | 
					                    <p style="line-height: 100%;">Got questions or need help? | 
				
			||||
 | 
					                        Get in touch.</p> | 
				
			||||
 | 
					                    <a href="mailto:odoo@cybrosys.com"> | 
				
			||||
 | 
					                        <p style="font-weight: 400; font-size: 28px; line-height: 80%; color: #714B67;"> | 
				
			||||
 | 
					                            odoo@cybrosys.com</p> | 
				
			||||
 | 
					                    </a> | 
				
			||||
 | 
					                </div> | 
				
			||||
 | 
					            </div> | 
				
			||||
 | 
					        </div> | 
				
			||||
 | 
					        <div class="col-sm-12 col-md-6"> | 
				
			||||
 | 
					            <div style="background-color: #F6F8F9; padding: 30px; display: flex; align-items: center;"> | 
				
			||||
 | 
					                <div class="mr-4 d-flex justify-content-center align-items-center" | 
				
			||||
 | 
					                     style="background-color: #2AC44D; display: inline-block; height: 70px; width: 70px; display: flex; align-items: center; justify-content: center;"> | 
				
			||||
 | 
					                    <img src="assets/misc/whatsapp.png" height="52" width="52" | 
				
			||||
 | 
					                         style="width: 52px; height: 52px;"/> | 
				
			||||
 | 
					                </div> | 
				
			||||
 | 
					                <div> | 
				
			||||
 | 
					                    <h4>WhatsApp</h4> | 
				
			||||
 | 
					                    <p style="line-height: 100%;">Say hi to us on WhatsApp!</p> | 
				
			||||
 | 
					                    <a href="https://api.whatsapp.com/send?phone=918606827707"> | 
				
			||||
 | 
					                        <p style="font-weight: 400; font-size: 28px; line-height: 80%; color: #714B67;"> | 
				
			||||
 | 
					                            +91 86068 | 
				
			||||
 | 
					                            27707</p> | 
				
			||||
 | 
					                    </a> | 
				
			||||
 | 
					                </div> | 
				
			||||
 | 
					            </div> | 
				
			||||
 | 
					        </div> | 
				
			||||
 | 
					    </div> | 
				
			||||
 | 
					    <div class="row"> | 
				
			||||
 | 
					        <div class="col-sm-12 my-5 d-flex justify-content-center align-items-center"> | 
				
			||||
 | 
					            <img src="assets/misc/logo.png" width="144" height="31" | 
				
			||||
 | 
					                 style="width:144px; height: 31px; margin-top: 40px;"/> | 
				
			||||
 | 
					        </div> | 
				
			||||
 | 
					    </div> | 
				
			||||
 | 
					</div> | 
				
			||||
 | 
					<!-- END OF SUPPORT --> | 
				
			||||
@ -0,0 +1,143 @@ | 
				
			|||||
 | 
					.search-button{ | 
				
			||||
 | 
					    background-color: white; | 
				
			||||
 | 
					    color: black; | 
				
			||||
 | 
					    border-radius: 4px; | 
				
			||||
 | 
					    border: none; | 
				
			||||
 | 
					    padding: 0.4rem 0.6rem; | 
				
			||||
 | 
					    font-size: 25px; | 
				
			||||
 | 
					} | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					.small-heading{ | 
				
			||||
 | 
					    padding-bottom: 0.5rem; | 
				
			||||
 | 
					    font-weight: bold; | 
				
			||||
 | 
					    margin-bottom: 0.5rem; | 
				
			||||
 | 
					    border-bottom: 1px solid; | 
				
			||||
 | 
					    display: flex; | 
				
			||||
 | 
					    justify-content: space-between; | 
				
			||||
 | 
					} | 
				
			||||
 | 
					.master-onboard_modal-container { | 
				
			||||
 | 
					    position: fixed; | 
				
			||||
 | 
					    top: 0; | 
				
			||||
 | 
					    left: 0; | 
				
			||||
 | 
					    width: 100%; | 
				
			||||
 | 
					    height: 100vh; | 
				
			||||
 | 
					    background: rgba(9, 13, 17, 0.78); | 
				
			||||
 | 
					    -webkit-backdrop-filter: blur(9px); | 
				
			||||
 | 
					    backdrop-filter: blur(9px); | 
				
			||||
 | 
					    display: -webkit-box; | 
				
			||||
 | 
					    display: -ms-flexbox; | 
				
			||||
 | 
					    display: flex; | 
				
			||||
 | 
					    -webkit-box-align: center; | 
				
			||||
 | 
					    -ms-flex-align: center; | 
				
			||||
 | 
					    align-items: center; | 
				
			||||
 | 
					    -webkit-box-pack: center; | 
				
			||||
 | 
					    -ms-flex-pack: center; | 
				
			||||
 | 
					    justify-content: center; | 
				
			||||
 | 
					    z-index: 999; | 
				
			||||
 | 
					} | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					.master_modal-container input { | 
				
			||||
 | 
					    height: 50px; | 
				
			||||
 | 
					    outline: none; | 
				
			||||
 | 
					    border: none; | 
				
			||||
 | 
					    font-size: 13px !important; | 
				
			||||
 | 
					    display: block; | 
				
			||||
 | 
					    width: 100%; | 
				
			||||
 | 
					    padding: 0.3125rem 0.625rem; | 
				
			||||
 | 
					    font-weight: 600; | 
				
			||||
 | 
					    line-height: 1.5; | 
				
			||||
 | 
					    color: #495057; | 
				
			||||
 | 
					    background-color: transparent; | 
				
			||||
 | 
					    background-clip: padding-box; | 
				
			||||
 | 
					    -webkit-appearance: none; | 
				
			||||
 | 
					    -moz-appearance: none; | 
				
			||||
 | 
					    appearance: none; | 
				
			||||
 | 
					    transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; | 
				
			||||
 | 
					} | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					.master_modal-container .o_input_dropdown { | 
				
			||||
 | 
					    width: 100%; | 
				
			||||
 | 
					} | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					.master_modal-container .o_field_tags { | 
				
			||||
 | 
					    border: none; | 
				
			||||
 | 
					    width: 100%; | 
				
			||||
 | 
					    padding: 0 !important; | 
				
			||||
 | 
					} | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					.master_modal-container .o-autocomplete--input { | 
				
			||||
 | 
					    display: block; | 
				
			||||
 | 
					    width: 100%; | 
				
			||||
 | 
					    padding: 0.375rem 2.25rem 0.375rem 0.75rem; | 
				
			||||
 | 
					    -moz-padding-start: calc(0.75rem - 3px); | 
				
			||||
 | 
					    font-size: 1rem; | 
				
			||||
 | 
					    font-weight: 400; | 
				
			||||
 | 
					    line-height: 1.5; | 
				
			||||
 | 
					    color: #212529; | 
				
			||||
 | 
					    background-color: #fff; | 
				
			||||
 | 
					    background-image: url(data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e); | 
				
			||||
 | 
					    background-repeat: no-repeat; | 
				
			||||
 | 
					    background-position: right 0.75rem center; | 
				
			||||
 | 
					    background-size: 16px 12px; | 
				
			||||
 | 
					    border-radius: 0.25rem; | 
				
			||||
 | 
					    transition: border-color .15s ease-in-out, box-shadow .15s ease-in-out; | 
				
			||||
 | 
					    -webkit-appearance: none; | 
				
			||||
 | 
					    -moz-appearance: none; | 
				
			||||
 | 
					    appearance: none; | 
				
			||||
 | 
					} | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					.master_modal-container .modal_content { | 
				
			||||
 | 
					    border-radius: unset; | 
				
			||||
 | 
					    background: #FFF; | 
				
			||||
 | 
					    -webkit-box-shadow: 0px 10px 100px 0px rgba(0, 0, 0, 0.15); | 
				
			||||
 | 
					    box-shadow: 0px 10px 100px 0px rgba(0, 0, 0, 0.15); | 
				
			||||
 | 
					} | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					.modal_content-header { | 
				
			||||
 | 
					    display: block; | 
				
			||||
 | 
					    border-bottom: none; | 
				
			||||
 | 
					    padding: 2rem; | 
				
			||||
 | 
					} | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					.modal_content-header h5 { | 
				
			||||
 | 
					    color: #222; | 
				
			||||
 | 
					    font-family: "Inter", sans-serif; | 
				
			||||
 | 
					    font-size: 25px; | 
				
			||||
 | 
					    font-weight: 700; | 
				
			||||
 | 
					} | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					.modal_content-header p { | 
				
			||||
 | 
					    color: #717684; | 
				
			||||
 | 
					    font-family: "Inter", sans-serif; | 
				
			||||
 | 
					    font-size: 16px; | 
				
			||||
 | 
					    font-weight: 500; | 
				
			||||
 | 
					    margin-bottom: 0px; | 
				
			||||
 | 
					} | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					.master-onboard_modal-container .custom-search:focus{ | 
				
			||||
 | 
					    background-color:#FAF9F6; | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					} | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					.master_searchview_autocomplete .o_menu_item.dropdown-item.focus{ | 
				
			||||
 | 
					    padding-bottom: 0.5rem; | 
				
			||||
 | 
					    font-weight: bold; | 
				
			||||
 | 
					    margin-bottom: 0.5rem; | 
				
			||||
 | 
					    border-bottom: 1px solid; | 
				
			||||
 | 
					    display: flex; | 
				
			||||
 | 
					    justify-content: space-between; | 
				
			||||
 | 
					} | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					.master_searchview_autocomplete .menu{ | 
				
			||||
 | 
					    padding-left: 1rem; | 
				
			||||
 | 
					} | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					.cy_master-create-icon{ | 
				
			||||
 | 
					    padding: 0.3rem; | 
				
			||||
 | 
					    border: 1px solid #151E4E; | 
				
			||||
 | 
					    border-radius: 50%; | 
				
			||||
 | 
					} | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					.master_modal-container .dashboard_modal-box{ | 
				
			||||
 | 
					    bottom : 20%; | 
				
			||||
 | 
					} | 
				
			||||
@ -0,0 +1,217 @@ | 
				
			|||||
 | 
					/** @odoo-module **/ | 
				
			||||
 | 
					import { Component, useRef, useExternalListener, useState} from "@odoo/owl"; | 
				
			||||
 | 
					import { _t } from "@web/core/l10n/translation"; | 
				
			||||
 | 
					import { Dialog } from "@web/core/dialog/dialog"; | 
				
			||||
 | 
					import { useService } from "@web/core/utils/hooks"; | 
				
			||||
 | 
					let nextItemId = 1; | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					export class MasterSearchDialog extends Component { | 
				
			||||
 | 
					    setup() { | 
				
			||||
 | 
					        // Set up the initial state and services.
 | 
				
			||||
 | 
					        this.state = useState({ | 
				
			||||
 | 
					          focusedIndex: 0, | 
				
			||||
 | 
					          menu_list: [], | 
				
			||||
 | 
					          result: null, | 
				
			||||
 | 
					          query: "", | 
				
			||||
 | 
					          isSearchVisible: false, // Add a state variable to control visibility
 | 
				
			||||
 | 
					        }); | 
				
			||||
 | 
					        this.orm = useService("orm"); | 
				
			||||
 | 
					        this.inputRef = !this.props.autofocus ? useRef("autofocus") : useAutofocus(); | 
				
			||||
 | 
					        this.items = useState([]); | 
				
			||||
 | 
					        this.rpc = useService("rpc"); | 
				
			||||
 | 
					        this.menuService = useService("menu"); | 
				
			||||
 | 
					        this.actionService = useService("action"); | 
				
			||||
 | 
					        this.dialogService = useService("dialog") | 
				
			||||
 | 
					        useExternalListener(window, "click", this.onWindowClick); | 
				
			||||
 | 
					        useExternalListener(window, "keydown", this.onWindowKeydown); | 
				
			||||
 | 
					    } | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    toggleSearchVisibility() { | 
				
			||||
 | 
					    // Toggle the visibility of the search bar.
 | 
				
			||||
 | 
					    this.state.isSearchVisible = !this.state.isSearchVisible; | 
				
			||||
 | 
					    } | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    selectItem(item) { | 
				
			||||
 | 
					        this.props.close() | 
				
			||||
 | 
					        // Handle the selection of an item in the search results.
 | 
				
			||||
 | 
					        if (item.isChild) { | 
				
			||||
 | 
					          this.state.isSearchVisible = false; | 
				
			||||
 | 
					          this.actionService.doAction( | 
				
			||||
 | 
					            { | 
				
			||||
 | 
					              res_model: item.model, | 
				
			||||
 | 
					              res_id: item.rec_id, | 
				
			||||
 | 
					              target: "current", | 
				
			||||
 | 
					              type: "ir.actions.act_window", | 
				
			||||
 | 
					              views: [[false, "form"]], | 
				
			||||
 | 
					            }, | 
				
			||||
 | 
					          ); | 
				
			||||
 | 
					        } else { | 
				
			||||
 | 
					          this.resetState(); | 
				
			||||
 | 
					        } | 
				
			||||
 | 
					    } | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    async computeState(options = {}) { | 
				
			||||
 | 
					    // Compute the state based on the provided options.
 | 
				
			||||
 | 
					        const query = "query" in options ? options.query : this.state.query; | 
				
			||||
 | 
					        const focusedIndex = "focusedIndex" in options ? options.focusedIndex : this.state.focusedIndex; | 
				
			||||
 | 
					        this.state.query = query; | 
				
			||||
 | 
					        this.state.focusedIndex = focusedIndex; | 
				
			||||
 | 
					        this.inputRef.el.value = query; | 
				
			||||
 | 
					        const result = await this.rpc("/master/search", { | 
				
			||||
 | 
					          query: query, | 
				
			||||
 | 
					        }); | 
				
			||||
 | 
					        const trimmedQuery = this.state.query.trim(); | 
				
			||||
 | 
					        this.items.length = 0; | 
				
			||||
 | 
					        if (!trimmedQuery) { | 
				
			||||
 | 
					          this.render(); | 
				
			||||
 | 
					          return; | 
				
			||||
 | 
					        } | 
				
			||||
 | 
					        if (result.length != 0) { | 
				
			||||
 | 
					          for (const record of result) { | 
				
			||||
 | 
					            var temp_items = []; | 
				
			||||
 | 
					            for (const rec of record) { | 
				
			||||
 | 
					                temp_items.push({ | 
				
			||||
 | 
					                    id: nextItemId++, | 
				
			||||
 | 
					                    name: rec.name, | 
				
			||||
 | 
					                    title: rec.title, | 
				
			||||
 | 
					                    rec_id: rec.id, | 
				
			||||
 | 
					                    isChild: rec.isChild, | 
				
			||||
 | 
					                    isParent: rec.isParent, | 
				
			||||
 | 
					                    model: rec.model, | 
				
			||||
 | 
					                }); | 
				
			||||
 | 
					            } | 
				
			||||
 | 
					            this.items.push(temp_items); | 
				
			||||
 | 
					          } | 
				
			||||
 | 
					          this.render(); | 
				
			||||
 | 
					        } else { | 
				
			||||
 | 
					          this.items = []; | 
				
			||||
 | 
					          this.render(); | 
				
			||||
 | 
					        } | 
				
			||||
 | 
					    } | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    resetState() { | 
				
			||||
 | 
					        // Reset the state of the search bar.
 | 
				
			||||
 | 
					        this.computeState({ | 
				
			||||
 | 
					          focusedIndex: 0, | 
				
			||||
 | 
					          query: "", | 
				
			||||
 | 
					        }); | 
				
			||||
 | 
					        this.inputRef.el.focus(); | 
				
			||||
 | 
					    } | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    // * Handles the search input event.
 | 
				
			||||
 | 
					    //This method is triggered when the user types in the search input field. It fetches
 | 
				
			||||
 | 
					    //* the menu items and records results based on the query and updates the state with the
 | 
				
			||||
 | 
					    //* combined results. If the query is empty, it resets the state and clears the items.
 | 
				
			||||
 | 
					    async onSearchInput(ev) { | 
				
			||||
 | 
					        const query = this.inputRef.el.value; | 
				
			||||
 | 
					        if (query.trim()) { | 
				
			||||
 | 
					            const [menuItems, serverResults] = await Promise.all([ | 
				
			||||
 | 
					                this.fetchMenuItems(query), | 
				
			||||
 | 
					                this.fetchServerResults(query), | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					            ]); | 
				
			||||
 | 
					            this.state.items = [...menuItems, ...serverResults]; | 
				
			||||
 | 
					            this.computeState({ | 
				
			||||
 | 
					                query, | 
				
			||||
 | 
					                focusedIndex: 0, | 
				
			||||
 | 
					            }); | 
				
			||||
 | 
					        } else if (this.items.length) { | 
				
			||||
 | 
					            this.resetState(); | 
				
			||||
 | 
					            this.state.items = []; | 
				
			||||
 | 
					        } | 
				
			||||
 | 
					    } | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    async fetchMenuItems(query) { | 
				
			||||
 | 
					    //Fetches menu items based on the query.
 | 
				
			||||
 | 
					    //This method searches through the available menu items and filters them
 | 
				
			||||
 | 
					    //based on the query string. It returns a list of matching menu items.
 | 
				
			||||
 | 
					        const app_list = this.menuService.getAll(); | 
				
			||||
 | 
					        const menu_list = []; | 
				
			||||
 | 
					        const apps = this.menuService.getApps(); | 
				
			||||
 | 
					        let app_name = ""; | 
				
			||||
 | 
					        for (const app_list_item of app_list) { | 
				
			||||
 | 
					            if ( | 
				
			||||
 | 
					                app_list_item.id !== "root" && | 
				
			||||
 | 
					                app_list_item.actionModel !== false && | 
				
			||||
 | 
					                app_list_item.name.toLowerCase().match(new RegExp(query.trim().toLowerCase().replace(/[.*+\-?^${}()|[\]\\]/g, '\\$&'))) | 
				
			||||
 | 
					            ) { | 
				
			||||
 | 
					                const app = apps.find((app) => app.appID === app_list_item.appID); | 
				
			||||
 | 
					                if (app) { | 
				
			||||
 | 
					                    app_name = app.name; | 
				
			||||
 | 
					                } | 
				
			||||
 | 
					                menu_list.push({ | 
				
			||||
 | 
					                    id: app_list_item.id, | 
				
			||||
 | 
					                    name: `${app_name}/${app_list_item.name}`, | 
				
			||||
 | 
					                    actionModel: app_list_item.actionModel, | 
				
			||||
 | 
					                    class: "", | 
				
			||||
 | 
					                }); | 
				
			||||
 | 
					            } | 
				
			||||
 | 
					        } | 
				
			||||
 | 
					        return menu_list; | 
				
			||||
 | 
					    } | 
				
			||||
 | 
					    async fetchServerResults(query) { | 
				
			||||
 | 
					        // * Fetches search results from the records based on the query.
 | 
				
			||||
 | 
					        const result = await this.rpc("/master/search", { | 
				
			||||
 | 
					            query: query, | 
				
			||||
 | 
					        }); | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					        const trimmedQuery = query.trim(); | 
				
			||||
 | 
					        const serverResults = []; | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					        if (!trimmedQuery) { | 
				
			||||
 | 
					            return serverResults; | 
				
			||||
 | 
					        } | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					        if (result.length !== 0) { | 
				
			||||
 | 
					            for (const record of result) { | 
				
			||||
 | 
					                const temp_items = []; | 
				
			||||
 | 
					                for (const rec of record) { | 
				
			||||
 | 
					                    temp_items.push({ | 
				
			||||
 | 
					                        id: nextItemId++, | 
				
			||||
 | 
					                        name: rec.name, | 
				
			||||
 | 
					                        title: rec.title, | 
				
			||||
 | 
					                        rec_id: rec.id, | 
				
			||||
 | 
					                        isChild: rec.isChild, | 
				
			||||
 | 
					                        isParent: rec.isParent, | 
				
			||||
 | 
					                        model: rec.model, | 
				
			||||
 | 
					                    }); | 
				
			||||
 | 
					                } | 
				
			||||
 | 
					                serverResults.push(temp_items); | 
				
			||||
 | 
					            } | 
				
			||||
 | 
					        } | 
				
			||||
 | 
					        return serverResults; | 
				
			||||
 | 
					    } | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    onWindowClick(ev) { | 
				
			||||
 | 
					        this.props.close() | 
				
			||||
 | 
					        // Handle clicks on the window.
 | 
				
			||||
 | 
					        if (this.items.length) { | 
				
			||||
 | 
					          this.resetState(); | 
				
			||||
 | 
					        } | 
				
			||||
 | 
					    } | 
				
			||||
 | 
					    onWindowKeydown(ev) { | 
				
			||||
 | 
					        // Check if the pressed key is the "Esc" key
 | 
				
			||||
 | 
					        if (ev.key === "Escape") { | 
				
			||||
 | 
					            this.onClickMenu(); | 
				
			||||
 | 
					        } | 
				
			||||
 | 
					    } | 
				
			||||
 | 
					    onClickMenu() { | 
				
			||||
 | 
					        this.props.close() | 
				
			||||
 | 
					  } | 
				
			||||
 | 
					  onSearchIconClick() { | 
				
			||||
 | 
					    // Handle clicks on the search icon.
 | 
				
			||||
 | 
					    this.dialogService.add(MasterSearchDialog) | 
				
			||||
 | 
					    this.toggleSearchVisibility(); | 
				
			||||
 | 
					  } | 
				
			||||
 | 
					  onCLickMasterModal(ev){ | 
				
			||||
 | 
					    ev.stopPropagation() | 
				
			||||
 | 
					  } | 
				
			||||
 | 
					  closeSearch() { | 
				
			||||
 | 
					    // Close the search bar.
 | 
				
			||||
 | 
					    this.state.isSearchVisible = false; | 
				
			||||
 | 
					  } | 
				
			||||
 | 
					} | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					MasterSearchDialog.template = "master_search_systray.MasterSearchDialog" | 
				
			||||
 | 
					MasterSearchDialog.components = { Dialog } | 
				
			||||
@ -0,0 +1,20 @@ | 
				
			|||||
 | 
					/** @odoo-module **/ | 
				
			||||
 | 
					import { registry } from "@web/core/registry"; | 
				
			||||
 | 
					import { Component } from "@odoo/owl"; | 
				
			||||
 | 
					import { useService } from "@web/core/utils/hooks"; | 
				
			||||
 | 
					import { MasterSearchDialog } from "./MasterSearchDialog" | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					export class SearchBarSystray extends Component { | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					  // Component for the search bar in the systray.
 | 
				
			||||
 | 
					  setup() { | 
				
			||||
 | 
					    this.dialogService = useService("dialog") | 
				
			||||
 | 
					  } | 
				
			||||
 | 
					  onSearchIconClick() { | 
				
			||||
 | 
					    // Handle clicks on the search icon.
 | 
				
			||||
 | 
					    this.dialogService.add(MasterSearchDialog) | 
				
			||||
 | 
					  } | 
				
			||||
 | 
					} | 
				
			||||
 | 
					SearchBarSystray.template = "master_search_systray.SearchBarSystray"; | 
				
			||||
 | 
					export const systrayItem = { Component: SearchBarSystray, }; | 
				
			||||
 | 
					registry.category("systray").add("SearchBar", systrayItem, { sequence: 1,}); | 
				
			||||
@ -0,0 +1,76 @@ | 
				
			|||||
 | 
					.master_searchview_autocomplete { | 
				
			||||
 | 
					  top: 100%; | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					  > li { | 
				
			||||
 | 
					    margin: 5px 0px; | 
				
			||||
 | 
					  } | 
				
			||||
 | 
					} | 
				
			||||
 | 
					.master_searchview_input_container { | 
				
			||||
 | 
					  padding:5px; | 
				
			||||
 | 
					  display: flex; | 
				
			||||
 | 
					  position: relative; | 
				
			||||
 | 
					} | 
				
			||||
 | 
					.master_searchview_input { | 
				
			||||
 | 
					  border-bottom: 1px solid $o-brand-secondary; | 
				
			||||
 | 
					  margin-bottom: 15px; | 
				
			||||
 | 
					  width: 100%; | 
				
			||||
 | 
					  background-color: #fdfcfc; | 
				
			||||
 | 
					} | 
				
			||||
 | 
					.o_search_bar_systray{ | 
				
			||||
 | 
					    align-self: center; | 
				
			||||
 | 
					    } | 
				
			||||
 | 
					.search_bar_style { | 
				
			||||
 | 
					    border: 1px solid gainsboro !important; | 
				
			||||
 | 
					    min-width: 100%; | 
				
			||||
 | 
					    min-height: 40vh; | 
				
			||||
 | 
					    height:40vh; | 
				
			||||
 | 
					display: flex !important;} | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					.custom-search{ | 
				
			||||
 | 
					    background: white; | 
				
			||||
 | 
					    padding: 0.3125rem 0.625rem; | 
				
			||||
 | 
					    font-size: 0.875rem; | 
				
			||||
 | 
					    font-weight: 400; | 
				
			||||
 | 
					    line-height: 1.5; | 
				
			||||
 | 
					    color: #495057; | 
				
			||||
 | 
					    background-color: white; | 
				
			||||
 | 
					    background-clip: padding-box; | 
				
			||||
 | 
					    border: 1px solid #ced4da; | 
				
			||||
 | 
					    appearance: none; | 
				
			||||
 | 
					    border-radius: 0.5rem; | 
				
			||||
 | 
					    transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; | 
				
			||||
 | 
					} | 
				
			||||
 | 
					.search_div{ | 
				
			||||
 | 
					display: flex; | 
				
			||||
 | 
					margin: 3%; | 
				
			||||
 | 
					} | 
				
			||||
 | 
					.search_icon{ | 
				
			||||
 | 
					margin-left: 5%; | 
				
			||||
 | 
					 margin-top: 3%; | 
				
			||||
 | 
					} | 
				
			||||
 | 
					.create_icon{ | 
				
			||||
 | 
					margin-left: 10%; | 
				
			||||
 | 
					} | 
				
			||||
 | 
					.master_searchview_autocomplete { | 
				
			||||
 | 
					  @include o-position-absolute(calc(100% + #{$border-width * 3}), 0); | 
				
			||||
 | 
					  width: 100%; | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					  .o_menu_item { | 
				
			||||
 | 
					    align-items: center; | 
				
			||||
 | 
					    display: flex; | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    &.o_indent { | 
				
			||||
 | 
					      padding-left: 0.5rem; | 
				
			||||
 | 
					    } | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    a { | 
				
			||||
 | 
					      color: inherit; | 
				
			||||
 | 
					      &.o_expand { | 
				
			||||
 | 
					        display: flex; | 
				
			||||
 | 
					        justify-content: center; | 
				
			||||
 | 
					        width: 25px; | 
				
			||||
 | 
					        @include o-position-absolute($left: 0); | 
				
			||||
 | 
					      } | 
				
			||||
 | 
					    } | 
				
			||||
 | 
					  } | 
				
			||||
 | 
					} | 
				
			||||
@ -0,0 +1,91 @@ | 
				
			|||||
 | 
					<?xml version="1.0" encoding="UTF-8" ?> | 
				
			||||
 | 
					<!-- Template for the Search Bar in the Systray --> | 
				
			||||
 | 
					<templates xml:space="preserve"> | 
				
			||||
 | 
					    <t t-name="master_search_systray.MasterSearchDialog" owl="1"> | 
				
			||||
 | 
					            <div class="master-onboard_modal-container master_modal-container"> | 
				
			||||
 | 
					                <div class="modal-dialog  w-100 dashboard_modal-box"> | 
				
			||||
 | 
					                    <div class="modal-content modal_content" | 
				
			||||
 | 
					                         t-on-click="(ev) => this.onCLickMasterModal(ev)"> | 
				
			||||
 | 
					                        <div class="modal-body py-0"> | 
				
			||||
 | 
					                            <div class="search_div"> | 
				
			||||
 | 
					                                <input type="text" | 
				
			||||
 | 
					                                       class="custom-search" | 
				
			||||
 | 
					                                       accesskey="Q" | 
				
			||||
 | 
					                                       placeholder="Search..." | 
				
			||||
 | 
					                                       role="searchbox" | 
				
			||||
 | 
					                                       t-ref="autofocus" | 
				
			||||
 | 
					                                /> | 
				
			||||
 | 
					                                <button class="search-button" | 
				
			||||
 | 
					                                        t-on-click="onSearchInput"><i class="fa fa-search"/></button> | 
				
			||||
 | 
					                            </div> | 
				
			||||
 | 
					                            <div class="rounded-0 dropdown-menu master_searchview_autocomplete dropdown-menu show search_bar_style" | 
				
			||||
 | 
					                                 t-att-style="items.length ? 'height:50vh;': ''"> | 
				
			||||
 | 
					                                <div t-if="state.items" | 
				
			||||
 | 
					                                     class="modal-body search_modal-body px-3 pt-0" | 
				
			||||
 | 
					                                     style="border-right:1px solid #dfdfdf"> | 
				
			||||
 | 
					                                        <t t-if="state.items.length > 0"> | 
				
			||||
 | 
					                                            <p class="small-heading dropdown-item">Related Menus</p> | 
				
			||||
 | 
					                                            <ul class="nav flex-column" | 
				
			||||
 | 
					                                                t-foreach="state.items" | 
				
			||||
 | 
					                                                t-as="item" t-key="item.id"> | 
				
			||||
 | 
					                                            <li class="o_menu_item dropdown-item"> | 
				
			||||
 | 
					                                                <a class="nav-link d-flex align-items-center justify-content-between gap-2 sidebar-nav search_suggestion-list" | 
				
			||||
 | 
					                                                   t-attf-class="search-item-{{item.id}}" | 
				
			||||
 | 
					                                                   t-att-id="item.id" | 
				
			||||
 | 
					                                                   t-attf-href="#menu_id={{item.id}}" | 
				
			||||
 | 
					                                                   t-att-title="item.title" | 
				
			||||
 | 
					                                                   t-on-click="onClickMenu" | 
				
			||||
 | 
					                                                > | 
				
			||||
 | 
					                                                    <div class="d-flex align-items-center gap-2"> | 
				
			||||
 | 
					                                                        <i class="icons-class" | 
				
			||||
 | 
					                                                           t-att-class="item.webIcon" | 
				
			||||
 | 
					                                                           t-if="item.webIcon"/> | 
				
			||||
 | 
					                                                        <t t-esc="item.name"/> | 
				
			||||
 | 
					                                                    </div> | 
				
			||||
 | 
					                                                </a> | 
				
			||||
 | 
					                                            </li> | 
				
			||||
 | 
					                                        </ul> | 
				
			||||
 | 
					                                        </t> | 
				
			||||
 | 
					                                    </div> | 
				
			||||
 | 
					                                <t t-if="items"> | 
				
			||||
 | 
					                                     <t t-foreach="items" t-as="content" | 
				
			||||
 | 
					                                        t-key="content[0]['title']"> | 
				
			||||
 | 
					                                                <div class="w-100" | 
				
			||||
 | 
					                                                     style="border-right:1px solid #dfdfdf"> | 
				
			||||
 | 
					                                                <ul role="menu px-0" | 
				
			||||
 | 
					                                                    style="padding-left: 1rem; padding-right : 1rem;"> | 
				
			||||
 | 
					                                                    <t t-if="content.length!=0"> | 
				
			||||
 | 
					                                                        <t t-foreach="content" | 
				
			||||
 | 
					                                                           t-as="item" | 
				
			||||
 | 
					                                                           t-key="item.id"> | 
				
			||||
 | 
					                                                            <li class="o_menu_item dropdown-item" | 
				
			||||
 | 
					                                                                t-att-class="{ o_indent: item.isChild, focus: item_index === state.focusedIndex}" | 
				
			||||
 | 
					                                                                t-on-click="() => this.selectItem(item)" | 
				
			||||
 | 
					                                                                t-att-id="item.id"> | 
				
			||||
 | 
					                                                                <t t-if="item.isParent"> | 
				
			||||
 | 
					                                                                    <t t-esc="item.title"/> | 
				
			||||
 | 
					                                                                </t> | 
				
			||||
 | 
					                                                                <t t-if="item.isChild"> | 
				
			||||
 | 
					                                                                    <t t-esc="item.name"/> | 
				
			||||
 | 
					                                                                </t> | 
				
			||||
 | 
					                                                            </li> | 
				
			||||
 | 
					                                                        </t> | 
				
			||||
 | 
					                                                    </t> | 
				
			||||
 | 
					                                                </ul> | 
				
			||||
 | 
					                                            </div> | 
				
			||||
 | 
					                                        </t> | 
				
			||||
 | 
					                                    </t> | 
				
			||||
 | 
					                                <t t-else=""> | 
				
			||||
 | 
					                                        <div class="d-flex justify-content-center align-items-center flex-column w-100"> | 
				
			||||
 | 
					                                            <h1> | 
				
			||||
 | 
					                                                No records Found | 
				
			||||
 | 
					                                            </h1> | 
				
			||||
 | 
					                                        </div> | 
				
			||||
 | 
					                                    </t> | 
				
			||||
 | 
					                                </div> | 
				
			||||
 | 
					                        </div> | 
				
			||||
 | 
					                    </div> | 
				
			||||
 | 
					                </div> | 
				
			||||
 | 
					            </div> | 
				
			||||
 | 
					    </t> | 
				
			||||
 | 
					</templates> | 
				
			||||
@ -0,0 +1,15 @@ | 
				
			|||||
 | 
					<?xml version="1.0" encoding="UTF-8"?> | 
				
			||||
 | 
					<!-- Template for the Search Bar in the Systray --> | 
				
			||||
 | 
					<templates xml:space="preserve"> | 
				
			||||
 | 
					    <t t-name="master_search_systray.SearchBarSystray" owl="1"> | 
				
			||||
 | 
					        <div class="o_search_bar_systray"> | 
				
			||||
 | 
					            <div class="master_searchview_input_container d-flex flex-grow-1 flex-wrap gap-1"> | 
				
			||||
 | 
					                <div class="o_search_icon " style="color:black" | 
				
			||||
 | 
					                     t-on-click="onSearchIconClick"> | 
				
			||||
 | 
					                    <i class="fa fa-search"/> | 
				
			||||
 | 
					                </div> | 
				
			||||
 | 
					            </div> | 
				
			||||
 | 
					        </div> | 
				
			||||
 | 
					    </t> | 
				
			||||
 | 
					</templates> | 
				
			||||
 | 
					
 | 
				
			||||
@ -0,0 +1,15 @@ | 
				
			|||||
 | 
					<?xml version="1.0" encoding="utf-8"?> | 
				
			||||
 | 
					<odoo> | 
				
			||||
 | 
					    <!-- View Form of ir.model  --> | 
				
			||||
 | 
					    <record id="view_model_form" model="ir.ui.view"> | 
				
			||||
 | 
					        <field name="name">ir.model.view.form.inherit.master.search.systray | 
				
			||||
 | 
					        </field> | 
				
			||||
 | 
					        <field name="model">ir.model</field> | 
				
			||||
 | 
					        <field name="inherit_id" ref="base.view_model_form"/> | 
				
			||||
 | 
					        <field name="arch" type="xml"> | 
				
			||||
 | 
					            <xpath expr="//field[@name='transient']" position="after"> | 
				
			||||
 | 
					                <field name="is_search"/> | 
				
			||||
 | 
					            </xpath> | 
				
			||||
 | 
					        </field> | 
				
			||||
 | 
					    </record> | 
				
			||||
 | 
					</odoo> | 
				
			||||
@ -0,0 +1,35 @@ | 
				
			|||||
 | 
					<?xml version="1.0" encoding="utf-8"?> | 
				
			||||
 | 
					<odoo> | 
				
			||||
 | 
					    <!-- View Form of ir.model  --> | 
				
			||||
 | 
					    <record id="res_config_settings_view_form" model="ir.ui.view"> | 
				
			||||
 | 
					        <field name="name"> | 
				
			||||
 | 
					            res.config.settings.view.form.inherit.master.search.systray | 
				
			||||
 | 
					        </field> | 
				
			||||
 | 
					        <field name="model">res.config.settings</field> | 
				
			||||
 | 
					        <field name="priority" eval="15"/> | 
				
			||||
 | 
					        <field name="inherit_id" ref="base.res_config_settings_view_form"/> | 
				
			||||
 | 
					        <field name="arch" type="xml"> | 
				
			||||
 | 
					            <xpath expr="//div[hasclass('settings')]" position="inside"> | 
				
			||||
 | 
					                <div class="app_settings_block" data-string="Master Search Management" string="Master Search Management" data-key="master_search_systray"> | 
				
			||||
 | 
					                    <h2>Master Search Management</h2> | 
				
			||||
 | 
					                    <div class="row mt16 o_settings_container"> | 
				
			||||
 | 
					                        <div class="col-12 col-lg-6 o_setting_box"> | 
				
			||||
 | 
					                            <div class="o_setting_right_pane"> | 
				
			||||
 | 
					                                <label for="master_search_installed_ids"/> | 
				
			||||
 | 
					                                <div class="text-muted"> | 
				
			||||
 | 
					                                    Select the modules to include in your master search. | 
				
			||||
 | 
					                                </div> | 
				
			||||
 | 
					                                <div class="o_setting_left_pane"> | 
				
			||||
 | 
					                                    <field name="master_search_installed_ids" | 
				
			||||
 | 
					                                       class="o_light_label" | 
				
			||||
 | 
					                                       widget="many2many_tags" | 
				
			||||
 | 
					                                       options="{'no_create': True, 'no_open': True}"/> | 
				
			||||
 | 
					                                </div> | 
				
			||||
 | 
					                            </div> | 
				
			||||
 | 
					                        </div> | 
				
			||||
 | 
					                    </div> | 
				
			||||
 | 
					                </div> | 
				
			||||
 | 
					            </xpath> | 
				
			||||
 | 
					        </field> | 
				
			||||
 | 
					    </record> | 
				
			||||
 | 
					</odoo> | 
				
			||||