@ -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> | 
				
			|||