| @ -0,0 +1,41 @@ | |||
| Master Search | |||
| ============= | |||
| * Master Search module for Odoo 14 community editions | |||
| 
 | |||
| Installation | |||
| ============ | |||
| 	- www.odoo.com/documentation/14.0/setup/install.html | |||
| 	- Install our custom addon | |||
| 
 | |||
| License | |||
| ------- | |||
| General Public License, Version 3 (LGPL v3). | |||
| (https://www.odoo.com/documentation/user/14.0/legal/licenses/licenses.html) | |||
| 
 | |||
| Company | |||
| ------- | |||
| * 'Cybrosys Techno Solutions <https://cybrosys.com/>`__ | |||
| 
 | |||
| Credits | |||
| ------- | |||
| * Developer: | |||
| (v14) Shahil @ Cybrosys | |||
| 
 | |||
| Contacts | |||
| -------- | |||
| * Mail Contact : odoo@cybrosys.com | |||
| 
 | |||
| Bug Tracker | |||
| ----------- | |||
| Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported. | |||
| 
 | |||
| Maintainer | |||
| ========== | |||
| This module is maintained by Cybrosys Technologies. | |||
| 
 | |||
| For support and more information, please visit https://www.cybrosys.com | |||
| 
 | |||
| Further information | |||
| =================== | |||
| HTML Description: `<static/description/index.html>`__ | |||
| 
 | |||
| @ -0,0 +1,22 @@ | |||
| # -*- coding: utf-8 -*- | |||
| ############################################################################## | |||
| # | |||
| #    Cybrosys Technologies Pvt. Ltd. | |||
| # | |||
| #    Copyright (C) 2021-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). | |||
| #    Author: Cybrosys Techno Solutions (odoo@cybrosys.com) | |||
| #    you can modify it under the terms of the GNU AFFERO | |||
| #    GENERAL PUBLIC LICENSE (AGPL 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 AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details. | |||
| # | |||
| #    You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE | |||
| #    GENERAL PUBLIC LICENSE (AGPL v3) along with this program. | |||
| #    If not, see <http://www.gnu.org/licenses/>. | |||
| # | |||
| ############################################################################## | |||
| 
 | |||
| from . import models | |||
| @ -0,0 +1,45 @@ | |||
| # -*- coding: utf-8 -*- | |||
| ############################################################################## | |||
| # | |||
| #    Cybrosys Technologies Pvt. Ltd. | |||
| # | |||
| #    Copyright (C) 2021-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). | |||
| #    Author: Cybrosys Techno Solutions (odoo@cybrosys.com) | |||
| #    you can modify it under the terms of the GNU AFFERO | |||
| #    GENERAL PUBLIC LICENSE (AGPL 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 AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details. | |||
| # | |||
| #    You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE | |||
| #    GENERAL PUBLIC LICENSE (AGPL v3) along with this program. | |||
| #    If not, see <http://www.gnu.org/licenses/>. | |||
| # | |||
| ############################################################################## | |||
| 
 | |||
| { | |||
|     'name': 'Odoo14 Master Search', | |||
|     'version': '14.0.1.0.0', | |||
|     'summary': """Easy Search in Customers, Products, Sale, Purchase, Inventory and Accounting modules""", | |||
|     'description': """Easy Search in Customers, Products, Sale, Purchase, Inventory and Accounting modules,  | |||
|                       Search, Advance search, master search, odoo14, """, | |||
|     'category': 'Settings', | |||
|     'author': 'Cybrosys Techno Solutions', | |||
|     'company': 'Cybrosys Techno Solutions', | |||
|     'maintainer': 'Cybrosys Techno Solutions', | |||
|     'website': 'https://www.cybrosys.com', | |||
|     'license': 'AGPL-3', | |||
|     'images': ['static/description/banner.jpg'], | |||
|     'depends': ['base', 'stock', 'sale', 'purchase'], | |||
|     'data': [ | |||
|         'security/ir.model.access.csv', | |||
|         'security/security.xml', | |||
|         'views/master_search_view.xml', | |||
|         'views/template.xml', | |||
|     ], | |||
|     'installable': True, | |||
|     'auto_install': False, | |||
|     'application': False, | |||
| } | |||
| @ -0,0 +1,6 @@ | |||
| ## Module <master_search> | |||
| 
 | |||
| #### 25.05.2021 | |||
| #### Version 14.0.1.0.0 | |||
| #### ADD | |||
| Initial Commit | |||
| @ -0,0 +1,22 @@ | |||
| # -*- coding: utf-8 -*- | |||
| ############################################################################## | |||
| # | |||
| #    Cybrosys Technologies Pvt. Ltd. | |||
| # | |||
| #    Copyright (C) 2021-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). | |||
| #    Author: Cybrosys Techno Solutions (odoo@cybrosys.com) | |||
| #    you can modify it under the terms of the GNU AFFERO | |||
| #    GENERAL PUBLIC LICENSE (AGPL 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 AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details. | |||
| # | |||
| #    You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE | |||
| #    GENERAL PUBLIC LICENSE (AGPL v3) along with this program. | |||
| #    If not, see <http://www.gnu.org/licenses/>. | |||
| # | |||
| ############################################################################## | |||
| 
 | |||
| from . import master_search | |||
| @ -0,0 +1,366 @@ | |||
| # -*- coding: utf-8 -*- | |||
| ############################################################################## | |||
| # | |||
| #    Cybrosys Technologies Pvt. Ltd. | |||
| # | |||
| #    Copyright (C) 2021-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). | |||
| #    Author: Cybrosys Techno Solutions (odoo@cybrosys.com) | |||
| #    you can modify it under the terms of the GNU AFFERO | |||
| #    GENERAL PUBLIC LICENSE (AGPL 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 AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details. | |||
| # | |||
| #    You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE | |||
| #    GENERAL PUBLIC LICENSE (AGPL v3) along with this program. | |||
| #    If not, see <http://www.gnu.org/licenses/>. | |||
| # | |||
| ############################################################################## | |||
| 
 | |||
| from odoo import fields, models, api, _ | |||
| from odoo.exceptions import UserError | |||
| 
 | |||
| 
 | |||
| class MasterSearch(models.Model): | |||
|     _name = 'master.search' | |||
|     _description = "Model for master search" | |||
|     _rec_name = 'name' | |||
|     _order = "create_date desc" | |||
| 
 | |||
|     name = fields.Char(string="Name", default=lambda self: _('Search')) | |||
|     res_customers_id = fields.Many2many('res.partner', 'res_customers_search_rel', 'res_customers_id', 'search_id', | |||
|                                         string="Locations") | |||
|     search_string = fields.Char(string="Search") | |||
|     search_mode = fields.Selection([('all', 'All'), ('active', 'Active'), ('inactive', 'Inactive')], | |||
|                                    string="Search Mode", default="active") | |||
|     search_by = fields.Selection( | |||
|         [('any', 'Any'), ('customer', 'Customer'), ('product', 'Product'), ('sale details', 'Sale'), | |||
|          ('purchase details', 'Purchase'), ('transaction details', 'Inventory'), ('account details', 'Accounting')], | |||
|         string="Search By", default='any') | |||
|     master_search_ids = fields.Many2many('master.search', 'master_search_self_rel', 'search_id', | |||
|                                          'search_id1', compute="_get_recent_searches", limit=1) | |||
|     history_count = fields.Integer(string="History Count", compute="_get_history_count") | |||
|     customer_ids = fields.Many2many('res.partner', 'master_search_company_rel', 'search_id', 'company_id') | |||
|     product_ids = fields.Many2many('product.template', 'master_search_product_rel', 'search_id', 'company_id') | |||
|     transaction_details = fields.Many2many('stock.picking', 'master_search_transaction_details_rel', 'search_id', | |||
|                                            'company_id', string="Inventory") | |||
|     customer_count = fields.Integer(string="Company Count", compute="_get_operator_count") | |||
|     product_count = fields.Integer(string="Product Count", compute="_get_product_count") | |||
|     transaction_count = fields.Integer(string="Transaction Count", compute="_get_transaction_count") | |||
|     sale_count = fields.Integer(string="Sale Count", compute="_get_sale_count") | |||
|     purchase_count = fields.Integer(string="Sale Count", compute="_get_purchase_count") | |||
|     account_count = fields.Integer(string="Account Count", compute="_get_account_count") | |||
|     user_id = fields.Many2one('res.users', string="User", default=lambda self: self.env.user) | |||
|     match_entire = fields.Boolean(string="Match entire sentence") | |||
|     sale_details = fields.Many2many('sale.order', 'master_search_sale_details_rel', 'search_id', | |||
|                                     'company_id', string="Sale") | |||
|     purchase_details = fields.Many2many('purchase.order', 'master_search_purchase_details_rel', 'search_id', | |||
|                                         'company_id', string="Sale") | |||
|     account_details = fields.Many2many('account.move', 'master_search_account_details_rel', 'search_id', | |||
|                                        'company_id', string="Account") | |||
| 
 | |||
|     @api.depends('search_string') | |||
|     def _get_recent_searches(self): | |||
|         """ Get recent searches """ | |||
|         # unlink search result with empty string | |||
|         try: | |||
|             current_id = self.id if isinstance(self.id, int) \ | |||
|                 else self._origin.id | |||
|         except: | |||
|             current_id = False | |||
|             pass | |||
|         empty_search = self.env['master.search'].search( | |||
|             [('search_string', 'in', ['', False]), | |||
|              ('id', 'not in', [current_id, False] | |||
|              if current_id else [False])]) | |||
|         if empty_search: | |||
|             empty_search.unlink() | |||
|         # get search histories avoid null strings | |||
|         recent_searches = self.env['master.search'].search([ | |||
|             ('search_string', 'not in', ['', False])]) | |||
|         # commended for viewing last search | |||
|         # self.master_search_ids = recent_searches.filtered( | |||
|         #     lambda x: x.id != self.id) if self.id else recent_searches | |||
|         self.master_search_ids = recent_searches | |||
| 
 | |||
|     def action_unlink_search(self): | |||
|         """ Unlink search """ | |||
|         self.unlink() | |||
|         action = self.env.ref('master_search.master_search_action').read()[0] | |||
|         return action | |||
| 
 | |||
|     @api.depends('master_search_ids') | |||
|     def _get_history_count(self): | |||
|         """ Get history count """ | |||
|         self.history_count = len(self.master_search_ids) | |||
| 
 | |||
|     @api.depends('product_ids') | |||
|     def _get_product_count(self): | |||
|         """ Get product count """ | |||
|         self.product_count = len(self.product_ids) | |||
| 
 | |||
|     @api.depends('customer_ids') | |||
|     def _get_operator_count(self): | |||
|         """ Get customer count """ | |||
|         self.customer_count = len(self.customer_ids) | |||
| 
 | |||
|     @api.depends('transaction_count') | |||
|     def _get_transaction_count(self): | |||
|         """ Get transaction details count """ | |||
|         self.transaction_count = len(self.transaction_details) | |||
| 
 | |||
|     @api.depends('sale_count') | |||
|     def _get_sale_count(self): | |||
|         """ Get sale details count """ | |||
|         self.sale_count = len(self.sale_details) | |||
| 
 | |||
|     @api.depends('purchase_count') | |||
|     def _get_purchase_count(self): | |||
|         """ Get purchase details count """ | |||
|         self.purchase_count = len(self.purchase_details) | |||
| 
 | |||
|     @api.depends('account_count') | |||
|     def _get_account_count(self): | |||
|         """ Get account details count """ | |||
|         self.account_count = len(self.account_details) | |||
| 
 | |||
|     def action_clear_search(self): | |||
|         """ clear search input """ | |||
|         self.search_string = "" | |||
|         self.name = "Search" | |||
| 
 | |||
|     @api.model_create_multi | |||
|     def create(self, vals_list): | |||
|         """ Function for unlink first result and raise error if no string """ | |||
|         res = super(MasterSearch, self).create(vals_list) | |||
|         search_index = self.env['master.search'].search_count([('user_id', '=', self.env.user.id)]) | |||
|         # unlink old search result if count greater than 10 | |||
|         if search_index > 10: | |||
|             last_search = self.env['master.search'].search([('id', '!=', res.id), ('user_id', '=', self.env.user.id)], | |||
|                                                            order="create_date asc", limit=1) | |||
|             last_search.unlink() if last_search else False | |||
|         return res | |||
| 
 | |||
|     def action_search(self): | |||
|         """ search for the string and store search data """ | |||
|         if self.search_string and "*" in self.search_string: | |||
|             return | |||
|         if not self.search_string: | |||
|             raise UserError(_("Please provide a search string!")) | |||
|         search_keys = self.search_string.split(" ") | |||
|         # delete all the lines | |||
|         self.customer_ids = self.product_ids = self.transaction_details = False | |||
|         # search for entire sentence | |||
|         if self.match_entire: | |||
|             return self._search_query(self.search_string) | |||
|         # search for all the words | |||
|         for key in search_keys: | |||
|             self._search_query(key) | |||
|         self.name = self.search_string | |||
| 
 | |||
|     def _search_query(self, key): | |||
|         """ search for the model with given key and update result """ | |||
|         company_id = self.env.user.company_id.id | |||
|         if self.search_mode == 'all': | |||
|             active_qry = """  | |||
|             and obj.active in ({},{}) | |||
|             """.format("'FALSE'", "'TRUE'") | |||
|         elif self.search_mode == 'active': | |||
|             active_qry = """ and obj.active in ({})""".format("'TRUE'") | |||
|         else: | |||
|             active_qry = """ and obj.active in ({})""".format("'FALSE'") | |||
| 
 | |||
|         #  search for customers | |||
|         self._search_customer(key, active_qry) \ | |||
|             if self.search_by in ['any', 'customer'] else False | |||
|         # search for products | |||
|         self._search_products(key, active_qry, company_id) \ | |||
|             if self.search_by in ['any', 'product'] else False | |||
|         # search for inventory transactions | |||
|         self._search_inventory_transactions(key, active_qry, company_id) \ | |||
|             if self.search_by in ['any', 'transaction details'] else False | |||
|         # search for inventory transactions | |||
|         self._search_sale_transactions(key, active_qry, company_id) \ | |||
|             if self.search_by in ['any', 'sale details'] else False | |||
|         # search for purchase transactions | |||
|         self._search_purchase_transactions(key, active_qry, company_id) \ | |||
|             if self.search_by in ['any', 'purchase details'] else False | |||
|         # search for account transactions | |||
|         self._search_account_transactions(key, active_qry, company_id) \ | |||
|             if self.search_by in ['any', 'account details'] else False | |||
| 
 | |||
|     def _search_account_transactions(self, key, active_qry, company_id): | |||
|         """ Search for all account transactions """ | |||
|         sp_query = """ | |||
|         SELECT  | |||
|             am.id from account_move am | |||
|         LEFT JOIN  | |||
|             res_partner p on p.id = am.partner_id | |||
|         WHERE  | |||
|             am.company_id = {op_id} | |||
|                 AND  | |||
|                  (am.name ILIKE '%{key}%' | |||
|                 OR  | |||
|                  p.name ILIKE '%{key}%' | |||
|                 OR  | |||
|                  am.state ILIKE '%{key}%') | |||
|         GROUP BY  | |||
|             am.id,p.name | |||
|         """ | |||
|         self._cr.execute(sp_query.format(op_id=company_id, key=key, active=active_qry)) | |||
|         moves = self._cr.dictfetchall() | |||
|         move_ids = self.env['account.move'].browse([i['id'] for i in moves]) | |||
|         self.account_details += move_ids | |||
| 
 | |||
|     def _search_purchase_transactions(self, key, active_qry, company_id): | |||
|         """ Search for all purchase transactions """ | |||
|         sp_query = """ | |||
|         SELECT  | |||
|             po.id from purchase_order po | |||
|         LEFT JOIN  | |||
|             res_partner p on p.id = po.partner_id | |||
|         WHERE  | |||
|             po.company_id = {op_id} | |||
|                 AND  | |||
|                  (po.name ILIKE '%{key}%' | |||
|                 OR  | |||
|                  p.name ILIKE '%{key}%' | |||
|                 OR  | |||
|                  po.state ILIKE '%{key}%') | |||
|         GROUP BY  | |||
|             po.id,p.name | |||
|         """ | |||
|         self._cr.execute(sp_query.format(op_id=company_id, key=key, active=active_qry)) | |||
|         purchases = self._cr.dictfetchall() | |||
|         purchase_ids = self.env['purchase.order'].browse([i['id'] for i in purchases]) | |||
|         self.purchase_details += purchase_ids | |||
| 
 | |||
|     def _search_sale_transactions(self, key, active_qry, company_id): | |||
|         """ Search for all sale transactions """ | |||
|         sp_query = """ | |||
|         SELECT  | |||
|             sl.id from sale_order sl | |||
|         LEFT JOIN  | |||
|             res_partner p on p.id = sl.partner_id | |||
|         LEFT JOIN  | |||
|             product_pricelist pl | |||
|                 ON  | |||
|                  pl.id = sl.pricelist_id | |||
|         LEFT JOIN  | |||
|             account_payment_term pt | |||
|                 ON  | |||
|                  pt.id = sl.payment_term_id | |||
|         WHERE  | |||
|             sl.company_id = {op_id} | |||
|                 AND  | |||
|                  (sl.name ILIKE '%{key}%' | |||
|                 OR  | |||
|                  p.name ILIKE '%{key}%' | |||
|                 OR  | |||
|                  sl.state ILIKE '%{key}%' | |||
|                 OR  | |||
|                  pl.name ILIKE '%{key}%') | |||
|         GROUP BY  | |||
|             sl.id,p.name,pl.name,pt.name | |||
|         """ | |||
|         self._cr.execute(sp_query.format(op_id=company_id, key=key, active=active_qry)) | |||
|         sales = self._cr.dictfetchall() | |||
|         sale_ids = self.env['sale.order'].browse([i['id'] for i in sales]) | |||
|         self.sale_details += sale_ids | |||
| 
 | |||
|     def _search_inventory_transactions(self, key, active_qry, company_id): | |||
|         """ Search for all inventory transactions """ | |||
|         sp_query = """ | |||
|         SELECT  | |||
|             sp.id from stock_picking sp | |||
|         LEFT JOIN  | |||
|             res_partner p on p.id = sp.partner_id | |||
|         LEFT JOIN  | |||
|             stock_picking_type t  | |||
|                 ON  | |||
|                  t.id = sp.picking_type_id | |||
|         WHERE  | |||
|             sp.company_id = {op_id} | |||
|                 AND  | |||
|                  (sp.name ILIKE '%{key}%' | |||
|                 OR  | |||
|                  p.name ILIKE '%{key}%' | |||
|                 OR  | |||
|                  sp.state ILIKE '%{key}%' | |||
|                 OR  | |||
|                  t.name ILIKE '%{key}%') | |||
|         GROUP BY  | |||
|             sp.id,p.name,t.name | |||
|         """ | |||
|         self._cr.execute(sp_query.format(op_id=company_id, key=key, active=active_qry)) | |||
|         transactions = self._cr.dictfetchall() | |||
|         transaction_ids = self.env['stock.picking'].browse([i['id'] for i in transactions]) | |||
|         self.transaction_details += transaction_ids | |||
| 
 | |||
|     def _search_products(self, key, active_qry, company_id): | |||
|         """ search for products """ | |||
|         pt_query = """ | |||
|         SELECT  | |||
|             pt.id  | |||
|         FROM  | |||
|             product_template pt | |||
|         LEFT JOIN  | |||
|             product_category pc  | |||
|                 ON  | |||
|                  pc.id = pt.categ_id | |||
|         WHERE  | |||
|             (pt.name ILIKE '%{key}%' | |||
|             OR  | |||
|              pt.default_code ILIKE '%{key}%' | |||
|             OR  | |||
|              pt.type ILIKE '%{key}%' | |||
|             OR  | |||
|              pt.description ILIKE '%{key}%' | |||
|             OR  | |||
|              pc.name ILIKE '%{key}%') | |||
|     """ | |||
|         self._cr.execute(pt_query.format(op_id=company_id, key=key, active=active_qry).replace('obj', 'pt')) | |||
|         template_ids = self._cr.dictfetchall() | |||
|         product_template_ids = self.env['product.template'].browse([i['id'] for i in template_ids]) | |||
|         self.product_ids += product_template_ids | |||
| 
 | |||
|     def _search_customer(self, key, active_qry): | |||
|         """ search for customer """ | |||
|         query = """  | |||
|         SELECT  | |||
|             r.id from res_partner r  | |||
|         LEFT JOIN  | |||
|             res_country_state rs  | |||
|                 ON  | |||
|                  rs.id = r.state_id | |||
|         LEFT JOIN  | |||
|             res_country rc  | |||
|                 ON  | |||
|                  rc.id = r.country_id | |||
|         WHERE  | |||
|             (r.parent_id is NULL )  | |||
|                 AND  | |||
|                  r.type = 'contact' {active} | |||
|                 AND  | |||
|                  (r.name ILIKE '%{key}%' | |||
|                 OR  | |||
|                  r.street ILIKE '%{key}%' | |||
|                 OR  | |||
|                  r.street2 ILIKE '%{key}%' | |||
|                 OR  | |||
|                  r.city ILIKE '%{key}%' | |||
|                 OR  | |||
|                  r.zip ILIKE '%{key}%' | |||
|                 OR  | |||
|                  rs.name ILIKE '%{key}%' | |||
|                 OR  | |||
|                  rc.name ILIKE '%{key}%' | |||
|                 OR  | |||
|                  r.email ILIKE '%{key}%') | |||
|         """ | |||
|         self._cr.execute(query.format(key=key, active=active_qry).replace('obj', 'r')) | |||
|         customers = self._cr.dictfetchall() | |||
|         customer_ids = self.env['res.partner'].browse([i['id'] for i in customers]) | |||
|         self.customer_ids += customer_ids | |||
| 
 | 
| @ -0,0 +1,20 @@ | |||
| <?xml version="1.0" encoding="utf-8"?> | |||
| <odoo> | |||
|     <!--   Record rule for search history   --> | |||
|     <record model="ir.rule" id="company_search_rule"> | |||
|         <field name="name">Company Search Rule</field> | |||
|         <field name="model_id" ref="model_master_search"/> | |||
|         <field name="domain_force">[('user_id', '=', user.id)]</field> | |||
|     </record> | |||
| 
 | |||
|     <!--    Record rules for restrict search access    --> | |||
|     <record model="ir.module.category" id="module_master_search"> | |||
|         <field name="name">Search Rights</field> | |||
|         <field name="sequence">11</field> | |||
|     </record> | |||
| 
 | |||
|     <record id="master_search_read" model="res.groups"> | |||
|         <field name="name">Master Search</field> | |||
|         <field name="comment">Master Search Group</field> | |||
|     </record> | |||
| </odoo> | |||
| After Width: | Height: | Size: 236 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: 404 B | 
| After Width: | Height: | Size: 492 B | 
| After Width: | Height: | Size: 1.2 KiB | 
| After Width: | Height: | Size: 911 B | 
| After Width: | Height: | Size: 1.1 KiB | 
| After Width: | Height: | Size: 1.2 KiB | 
| After Width: | Height: | Size: 673 B | 
| 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: 85 KiB | 
| After Width: | Height: | Size: 180 KiB | 
| After Width: | Height: | Size: 184 KiB | 
| After Width: | Height: | Size: 113 KiB | 
| After Width: | Height: | Size: 87 KiB | 
| After Width: | Height: | Size: 113 KiB | 
| After Width: | Height: | Size: 69 KiB | 
| After Width: | Height: | Size: 59 KiB | 
| After Width: | Height: | Size: 43 KiB | 
| After Width: | Height: | Size: 82 KiB | 
| After Width: | Height: | Size: 75 KiB | 
| After Width: | Height: | Size: 66 KiB | 
| After Width: | Height: | Size: 45 KiB | 
| After Width: | Height: | Size: 88 KiB | 
| After Width: | Height: | Size: 72 KiB | 
| After Width: | Height: | Size: 54 KiB | 
| After Width: | Height: | Size: 65 KiB | 
| After Width: | Height: | Size: 178 KiB | 
| After Width: | Height: | Size: 21 KiB | 
| @ -0,0 +1,634 @@ | |||
| <!--- HERO CONTAINER  --> | |||
|  <section class="container" style="padding: 6rem 1.5rem;"> | |||
|   <div class="row"> | |||
|     <div class="col-lg-6 d-flex flex-column justify-content-center"> | |||
|       <h1 | |||
|         style="font-family: Montserrat, 'sans-serif'; color: #000 !important; font-weight: 800 !important; font-size: 3rem !important;"> | |||
|         Master Search | |||
|       </h1> | |||
|       <h4 class="mt-3" | |||
|         style="font-family: Montserrat, 'sans-serif'; color: #1a1a1a !important; font-weight: 300 !important; font-size: 1.5rem !important;"> | |||
|         Easy Search in Customers, Products, Sale, Purchase, Inventory and Accounting modules</h4> | |||
|       <h5 class="mt-4" | |||
|         style="font-family: Montserrat, 'sans-serif'; color: #000 !important; font-weight: 800 !important;"> | |||
|         Key Features</h5> | |||
| 
 | |||
|       <span class="d-flex align-items-center" style="margin: -0.5rem 0rem 0rem -0.4rem !important;"> | |||
|         <img src="./assets/icons/chevron.png" height="18" width="18" class="img-responsive mr-1"> | |||
|         <p class="mt-3" style="font-family: Montserrat, 'sans-serif'; font-weight: 500;">Dynamic Search View Option</p> | |||
|       </span> | |||
| 
 | |||
|       <span class="d-flex align-items-center" style="margin: -1rem 0rem 0rem -0.4rem !important;"> | |||
|         <img src="./assets/icons/chevron.png" height="18" width="18" class="img-responsive mr-1"> | |||
|         <p class="mt-3" style="font-family: Montserrat, 'sans-serif'; font-weight: 500;">Easily Search Records in Customers, Products, Sale, Purchase, Inventory and Accounting Data </p> | |||
|       </span> | |||
| 
 | |||
|       <span class="d-flex align-items-center" style="margin: -1rem 0rem 0rem -0.4rem !important;"> | |||
|         <img src="./assets/icons/chevron.png" height="18" width="18" class="img-responsive mr-1"> | |||
|         <p class="mt-3" style="font-family: Montserrat, 'sans-serif'; font-weight: 500;">Possible to search with | |||
|           different attributes like name, reference, number, etc. | |||
|         </p> | |||
|       </span> | |||
| 
 | |||
|     </div> | |||
|     <div class="col-lg-6 d-flex flex-column justify-content-center"> | |||
|       <img src="./assets/hero.png" class="img-responsive"> | |||
|     </div> | |||
|   </div> | |||
| </section> | |||
| <!--- END OF HERO CONTAINER  --> | |||
| 
 | |||
| 
 | |||
| <!--- OVERVIEW CONTAINER  --> | |||
| <section class="container" style="background-color: #ffffff !important; padding: 4rem 3rem;"> | |||
|   <div class="row"> | |||
|     <div class="col-lg-12 d-flex flex-column justify-content-center align-items-center"> | |||
|       <h2 class="text-center" | |||
|         style="font-family: Montserrat, 'sans-serif'; color: #000 !important; font-weight: 800 !important; font-size: 2rem !important; width: 80%;"> | |||
|         Overview</h2> | |||
|     </div> | |||
| 
 | |||
|     <div class="col-lg-12 mt-3"> | |||
|       <p class="mt-3 text-center" style="font-family: Montserrat, 'sans-serif'; font-weight: 500; font-size: 1rem;"> | |||
|         Master Search module enables advance and simple search in different modules. It helps users to search the records | |||
|         in Customers, Products, Sale, Purchase, Inventory and Accounting Modules for | |||
|         'Master Search' group users. Possible to search using different attributes like name, reference, number, etc. | |||
|       </p> | |||
|     </div> | |||
| 
 | |||
|   </div> | |||
| </section> | |||
| <!--- END OF OVERVIEW CONTAINER  --> | |||
| 
 | |||
| 
 | |||
| 
 | |||
| <!--- FEATURES CONTAINER  --> | |||
|  <section class="container" style="background-color: #ffffff !important; padding: 4rem 3rem;"> | |||
|   <div class="row"> | |||
|     <div class="col-lg-6"> | |||
|       <div class="d-flex flex-column justify-column-center align-items-center" | |||
|         style="background-color: #f6f8f9 !important; padding: 2rem !important; border-radius: 10px !important; height: 100% !important;"> | |||
|         <h4 class="text-center" | |||
|           style="font-family: Montserrat, 'sans-serif'; color: #000 !important; font-weight: 800 !important; font-size: 1.2rem !important; width: 80%;"> | |||
|           Dynamic Search View Option</h4> | |||
|         <p class="text-center" | |||
|           style="font-family: Montserrat, 'sans-serif'; color: #1a1a1a !important; font-weight: 300 !important; font-size: 1rem !important; margin-bottom: 0 !important;"> | |||
|           Separate View for Search bar and also to show the search results</p> | |||
|       </div> | |||
|     </div> | |||
|     <div class="col-lg-6"> | |||
|       <div class="d-flex flex-column justify-column-center align-items-center" | |||
|         style="background-color: #f6f8f9 !important; padding: 2rem !important; border-radius: 10px !important; height: 100% !important;"> | |||
|         <h4 class="text-center" | |||
|           style="font-family: Montserrat, 'sans-serif'; color: #000 !important; font-weight: 800 !important; font-size: 1.2rem !important; width: 80%;"> | |||
|           Easily Search Records in Different Modules</h4> | |||
|         <p class="text-center" | |||
|           style="font-family: Montserrat, 'sans-serif'; color: #1a1a1a !important; font-weight: 300 !important; font-size: 1rem !important; margin-bottom: 0 !important;"> | |||
|           Easily Search Records in Customers, Products, Sale, Purchase, Inventory and Accounting Module </p> | |||
|       </div> | |||
|     </div> | |||
|   </div> | |||
| 
 | |||
|   <div class="row" style="margin-top: 2rem !important"> | |||
|     <div class="col-lg-6"> | |||
|       <div class="d-flex flex-column justify-column-center align-items-center" | |||
|         style="background-color: #f6f8f9 !important; padding: 2rem !important; border-radius: 10px !important; height: 100% !important;"> | |||
|         <h4 class="text-center" | |||
|           style="font-family: Montserrat, 'sans-serif'; color: #000 !important; font-weight: 800 !important; font-size: 1.2rem !important; width: 80%;"> | |||
|           Option to Search with different attributes</h4> | |||
|         <p class="text-center" | |||
|           style="font-family: Montserrat, 'sans-serif'; color: #1a1a1a !important; font-weight: 300 !important; font-size: 1rem !important; margin-bottom: 0 !important;"> | |||
|           Possible to search with | |||
|           different attributes like name, reference, customer name, number, etc. </p> | |||
|       </div> | |||
|     </div> | |||
|     <div class="col-lg-6"> | |||
|       <div class="d-flex flex-column justify-column-center align-items-center" | |||
|         style="background-color: #f6f8f9 !important; padding: 2rem !important; border-radius: 10px !important; height: 100% !important;"> | |||
|         <h4 class="text-center" | |||
|           style="font-family: Montserrat, 'sans-serif'; color: #000 !important; font-weight: 800 !important; font-size: 1.2rem !important; width: 80%;"> | |||
|           Recent Search Results</h4> | |||
|         <p class="text-center" | |||
|           style="font-family: Montserrat, 'sans-serif'; color: #1a1a1a !important; font-weight: 300 !important; font-size: 1rem !important; margin-bottom: 0 !important;"> | |||
|           Possible to access the Recent Search History </p> | |||
|       </div> | |||
|     </div> | |||
|   </div> | |||
| 
 | |||
| 
 | |||
| 
 | |||
| </section> | |||
| <!--- END OF FEATURES CONTAINER  --> | |||
| 
 | |||
| 
 | |||
| <!-- SCREENSHOTS SECTION --> | |||
| 
 | |||
| <section class="container" style="padding: 4rem 1.5rem 0rem;"> | |||
|   <div class="row"> | |||
|     <div class="col-lg-12 d-flex flex-column justify-content-center align-items-center"> | |||
|       <h2 class="text-center" | |||
|         style="font-family: Montserrat, 'sans-serif'; color: #000 !important; font-weight: 800 !important; font-size: 2rem !important; width: 80%;"> | |||
|         Screenshots</h2> | |||
|     </div> | |||
| 
 | |||
|     <div class="col-lg-12 my-3" style="background-color: #f6f6f6 !important; padding: 4rem 3rem;"> | |||
|       <div class="d-flex mb-3"> | |||
|         <div class="d-flex justify-content-center align-items-center" | |||
|           style="background-color: #3498DB !important; border: 4px solid #d6eaf8 !important; box-shadow: 0px 0px 0px 4px #ebf5fb !important; color: #fff !important; height: 35px; width: 35px; border-radius: 50% !important; font-size: 1.1rem !important; "> | |||
|           <h6 style="margin-top: 0.5rem; color: #fff !important;">1</h6> | |||
|         </div> | |||
|         <h6 class="mt-2 ml-2">Master Search User Access</h6> | |||
|       </div> | |||
|       <img src="assets/screenshots/1-Master-Search-User-Access.png" width="100%" class="img-resposive" | |||
|         style="border-radius: 10px !important;"> | |||
|     </div> | |||
| 
 | |||
|     <div class="col-lg-12" style="background-color: #ffffff !important; padding: 4rem 3rem;"> | |||
|       <div class="d-flex my-3"> | |||
|         <div class="d-flex justify-content-center align-items-center" | |||
|           style="background-color: #3498DB !important; border: 4px solid #d6eaf8 !important; box-shadow: 0px 0px 0px 4px #ebf5fb !important; color: #fff !important; height: 35px; width: 35px; border-radius: 50% !important; font-size: 1.1rem !important;"> | |||
|           <h6 style="margin-top: 0.6rem; color: #fff !important;">2</h6> | |||
|         </div> | |||
|         <h6 class="mt-2 ml-2">Master Search</h6> | |||
|       </div> | |||
|       <img src="assets/screenshots/2-Master-Search-main-screenshot.png" width="100%" class="img-resposive" | |||
|         style="border-radius: 10px !important;"> | |||
|     </div> | |||
| 
 | |||
|     <div class="col-lg-12" style="background-color: #f6f6f6 !important; padding: 4rem 3rem;"> | |||
|       <div class="d-flex my-3"> | |||
|         <div class="d-flex justify-content-center align-items-center" | |||
|           style="background-color: #3498DB !important; border: 4px solid #d6eaf8 !important; box-shadow: 0px 0px 0px 4px #ebf5fb !important; color: #fff !important; height: 35px; width: 35px; border-radius: 50% !important; font-size: 1.1rem !important;"> | |||
|           <h6 style="margin-top: 0.6rem; color: #fff !important;">3</h6> | |||
|         </div> | |||
|         <h6 class="mt-2 ml-2">Search in Customer Data</h6> | |||
|       </div> | |||
|       <img src="assets/screenshots/A1-Search-in-Customer-data.png" width="100%" class="img-resposive" | |||
|         style="border-radius: 10px !important;"> | |||
|     </div> | |||
| 
 | |||
| 
 | |||
|     <div class="col-lg-12" style="background-color: #ffffff !important; padding: 4rem 3rem;"> | |||
|       <div class="d-flex my-3"> | |||
|         <div class="d-flex justify-content-center align-items-center" | |||
|           style="background-color: #3498DB !important; border: 4px solid #d6eaf8 !important; box-shadow: 0px 0px 0px 4px #ebf5fb !important; color: #fff !important; height: 35px; width: 35px; border-radius: 50% !important; font-size: 1.1rem !important;"> | |||
|           <h6 style="margin-top: 0.6rem; color: #fff !important;">4</h6> | |||
|         </div> | |||
|         <h6 class="mt-2 ml-2">Customer Search Record View</h6> | |||
|       </div> | |||
|       <img src="assets/screenshots/A2-Customer-Search-record-view.png" width="100%" class="img-resposive" | |||
|         style="border-radius: 10px !important;"> | |||
|     </div> | |||
| 
 | |||
|     <div class="col-lg-12" style="background-color: #f6f6f6 !important; padding: 4rem 3rem;"> | |||
|       <div class="d-flex my-3"> | |||
|         <div class="d-flex justify-content-center align-items-center" | |||
|           style="background-color: #3498DB !important; border: 4px solid #d6eaf8 !important; box-shadow: 0px 0px 0px 4px #ebf5fb !important; color: #fff !important; height: 35px; width: 35px; border-radius: 50% !important; font-size: 1.1rem !important;"> | |||
|           <h6 style="margin-top: 0.6rem; color: #fff !important;">5</h6> | |||
|         </div> | |||
|         <h6 class="mt-2 ml-2">Search in Inventory Data</h6> | |||
|       </div> | |||
|       <img src="assets/screenshots/B1-Search-in-Inventory-Data.png" width="100%" class="img-resposive" | |||
|         style="border-radius: 10px !important;"> | |||
|     </div> | |||
| 
 | |||
| 
 | |||
|     <div class="col-lg-12" style="background-color: #ffffff !important; padding: 4rem 3rem;"> | |||
|       <div class="d-flex my-3"> | |||
|         <div class="d-flex justify-content-center align-items-center" | |||
|           style="background-color: #3498DB !important; border: 4px solid #d6eaf8 !important; box-shadow: 0px 0px 0px 4px #ebf5fb !important; color: #fff !important; height: 35px; width: 35px; border-radius: 50% !important; font-size: 1.1rem !important;"> | |||
|           <h6 style="margin-top: 0.6rem; color: #fff !important;">6</h6> | |||
|         </div> | |||
|         <h6 class="mt-2 ml-2">Search in Inventory Data</h6> | |||
|       </div> | |||
|       <img src="assets/screenshots/B1-Search-in-Inventory-Data.png" width="100%" class="img-resposive" | |||
|         style="border-radius: 10px !important;"> | |||
|     </div> | |||
| 
 | |||
|     <div class="col-lg-12" style="background-color: #f6f6f6 !important; padding: 4rem 3rem;"> | |||
|       <div class="d-flex my-3"> | |||
|         <div class="d-flex justify-content-center align-items-center" | |||
|           style="background-color: #3498DB !important; border: 4px solid #d6eaf8 !important; box-shadow: 0px 0px 0px 4px #ebf5fb !important; color: #fff !important; height: 35px; width: 35px; border-radius: 50% !important; font-size: 1.1rem !important;"> | |||
|           <h6 style="margin-top: 0.6rem; color: #fff !important;">7</h6> | |||
|         </div> | |||
|         <h6 class="mt-2 ml-2">Search Record View</h6> | |||
|       </div> | |||
|       <img src="assets/screenshots/B2-Inventory-Search-record-view.png" width="100%" class="img-resposive" | |||
|         style="border-radius: 10px !important;"> | |||
|     </div> | |||
| 
 | |||
|     <div class="col-lg-12" style="background-color: #ffffff !important; padding: 4rem 3rem;"> | |||
|       <div class="d-flex my-3"> | |||
|         <div class="d-flex justify-content-center align-items-center" | |||
|           style="background-color: #3498DB !important; border: 4px solid #d6eaf8 !important; box-shadow: 0px 0px 0px 4px #ebf5fb !important; color: #fff !important; height: 35px; width: 35px; border-radius: 50% !important; font-size: 1.1rem !important;"> | |||
|           <h6 style="margin-top: 0.6rem; color: #fff !important;">8</h6> | |||
|         </div> | |||
|         <h6 class="mt-2 ml-2">Accounting Search Record View</h6> | |||
|       </div> | |||
|       <img src="assets/screenshots/C2-Accounting-Search-record-view.png" width="100%" class="img-resposive" | |||
|         style="border-radius: 10px !important;"> | |||
|     </div> | |||
| 
 | |||
|     <div class="col-lg-12" style="background-color: #f6f6f6 !important; padding: 4rem 3rem;"> | |||
|       <div class="d-flex my-3"> | |||
|         <div class="d-flex justify-content-center align-items-center" | |||
|           style="background-color: #3498DB !important; border: 4px solid #d6eaf8 !important; box-shadow: 0px 0px 0px 4px #ebf5fb !important; color: #fff !important; height: 35px; width: 35px; border-radius: 50% !important; font-size: 1.1rem !important;"> | |||
|           <h6 style="margin-top: 0.6rem; color: #fff !important;">9</h6> | |||
|         </div> | |||
|         <h6 class="mt-2 ml-2">Search in Product Data</h6> | |||
|       </div> | |||
|       <img src="assets/screenshots/Search-in-Product-data.png" width="100%" class="img-resposive" | |||
|         style="border-radius: 10px !important;"> | |||
|     </div> | |||
| 
 | |||
|     <div class="col-lg-12" style="background-color: #ffffff !important; padding: 4rem 3rem;"> | |||
|       <div class="d-flex my-3"> | |||
|         <div class="d-flex justify-content-center align-items-center" | |||
|           style="background-color: #3498DB !important; border: 4px solid #d6eaf8 !important; box-shadow: 0px 0px 0px 4px #ebf5fb !important; color: #fff !important; height: 35px; width: 35px; border-radius: 50% !important; font-size: 1.1rem !important;"> | |||
|           <h6 style="margin-top: 0.6rem; color: #fff !important;">10</h6> | |||
|         </div> | |||
|         <h6 class="mt-2 ml-2">Search in Purchase Data</h6> | |||
|       </div> | |||
|       <img src="assets/screenshots/Search-in-Purchase-data.png" width="100%" class="img-resposive" | |||
|         style="border-radius: 10px !important;"> | |||
|     </div> | |||
| 
 | |||
|     <div class="col-lg-12" style="background-color: #f6f6f6 !important; padding: 4rem 3rem;"> | |||
|       <div class="d-flex my-3"> | |||
|         <div class="d-flex justify-content-center align-items-center" | |||
|           style="background-color: #3498DB !important; border: 4px solid #d6eaf8 !important; box-shadow: 0px 0px 0px 4px #ebf5fb !important; color: #fff !important; height: 35px; width: 35px; border-radius: 50% !important; font-size: 1.1rem !important;"> | |||
|           <h6 style="margin-top: 0.6rem; color: #fff !important;">11</h6> | |||
|         </div> | |||
|         <h6 class="mt-2 ml-2">Search in Sale Data</h6> | |||
|       </div> | |||
|       <img src="assets/screenshots/Search-in-Sale-data.png" width="100%" class="img-resposive" | |||
|         style="border-radius: 10px !important;"> | |||
|     </div> | |||
| 
 | |||
|   </div> | |||
| </section> | |||
| <!-- END OF SCREENSHOTS SECTION --> | |||
| 
 | |||
| 
 | |||
| <!-- SUGGESTED PRODUCTS--> | |||
| <section class="container" style="margin-top: 6rem !important;"> | |||
|   <div class="row"> | |||
|     <div class="col-lg-12 d-flex flex-column justify-content-center align-items-center"> | |||
|       <h2 class="text-center" | |||
|         style="font-family: Montserrat, 'sans-serif'; color: #000 !important; font-weight: 800 !important; font-size: 2rem !important; width: 80%;"> | |||
|         Suggested Products</h2> | |||
|       <p class="text-center" | |||
|         style="font-family: Montserrat, 'sans-serif'; color: #1a1a1a !important; font-weight: 300 !important; font-size: 1.3rem !important;"> | |||
|         Check out our other products</p> | |||
|     </div> | |||
|     <div class="col-lg-12 my-4"> | |||
|       <div id="suggestedSlider" class="row carousel slide" data-ride="carousel"> | |||
|         <!-- The slideshow --> | |||
|         <div class="carousel-inner"> | |||
|           <div class="carousel-item" style="min-height: 191px;"> | |||
|             <div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" style="float:left"> | |||
|               <a href="https://apps.odoo.com/apps/modules/14.0/dynamic_accounts_report/" target="_blank"> | |||
|                 <div style="border-radius:10px"> | |||
|                   <img class="img img-responsive center-block" | |||
|                     style="border-top-left-radius:10px; border-top-right-radius:10px" | |||
|                     src="./assets/modules/dynamic_financial_report.jpg"> | |||
|                 </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/14.0/dashboard_pos/" target="_blank"> | |||
|                 <div style="border-radius:10px"> | |||
|                   <img class="img img-responsive center-block" | |||
|                     style="border-top-left-radius:10px; border-top-right-radius:10px" | |||
|                     src="./assets/modules/pos_dashboard.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/14.0/sale_discount_total/" target="_blank"> | |||
|                 <div style="border-radius:10px"> | |||
|                   <img class="img img-responsive center-block" | |||
|                     style="border-top-left-radius:10px; border-top-right-radius:10px" | |||
|                     src="./assets/modules/discount.png"> | |||
|                 </div> | |||
|               </a> | |||
|             </div> | |||
|           </div> | |||
|           <div class="carousel-item active" style="min-height: 191px;"> | |||
|             <div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" style="float:left"> | |||
|               <a href="https://apps.odoo.com/apps/modules/14.0/hr_payroll_account_community/" target="_blank"> | |||
|                 <div style="border-radius:10px"> | |||
|                   <img class="img img-responsive center-block" | |||
|                     style="border-top-left-radius:10px; border-top-right-radius:10px" | |||
|                     src="./assets/modules/payroll_accounting.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/14.0/invoice_format_editor/" target="_blank"> | |||
|                 <div style="border-radius:10px"> | |||
|                   <img class="img img-responsive center-block" | |||
|                     style="border-top-left-radius:10px; border-top-right-radius:10px" | |||
|                     src="./assets/modules/invoice.jpg"> | |||
|                 </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/14.0/shopify_odoo_connector/" target="_blank"> | |||
|                 <div style="border-radius:10px"> | |||
|                   <img class="img img-responsive center-block" | |||
|                     style="border-top-left-radius:10px; border-top-right-radius:10px" | |||
|                     src="./assets/modules/shopify.png"> | |||
|                 </div> | |||
|               </a> | |||
|             </div> | |||
|           </div> | |||
|         </div> | |||
|         <!-- Left and right controls --> | |||
|         <a class="carousel-control-prev" href="#suggestedSlider" 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="#suggestedSlider" 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> | |||
| </section> | |||
| <!-- END OF SUGGESTED PRODUCTS --> | |||
| 
 | |||
| <!-- OUR SERVICES --> | |||
| <section class="container" style="margin-top: 6rem !important;"> | |||
|   <div class="row"> | |||
|     <div class="col-lg-12 d-flex flex-column justify-content-center align-items-center"> | |||
|       <h2 class="text-center" | |||
|         style="font-family: Montserrat, 'sans-serif'; color: #000 !important; font-weight: 800 !important; font-size: 2rem !important; width: 80%;"> | |||
|         Our Services</h2> | |||
|       <p class="text-center" | |||
|         style="font-family: Montserrat, 'sans-serif'; color: #1a1a1a !important; font-weight: 300 !important; font-size: 1.3rem !important;"> | |||
|         We provide following services</p> | |||
|     </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: #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> | |||
| </section> | |||
| <!-- END OF END OF OUR SERVICES --> | |||
| 
 | |||
| <!-- OUR INDUSTRIES --> | |||
| <section class="container" style="margin-top: 6rem !important;"> | |||
|   <div class="row"> | |||
|     <div class="col-lg-12 d-flex flex-column justify-content-center align-items-center"> | |||
|       <h2 class="text-center" | |||
|         style="font-family: Montserrat, 'sans-serif'; color: #000 !important; font-weight: 800 !important; font-size: 2rem !important; width: 80%;"> | |||
|         Our Industries</h2> | |||
|       <p class="text-center" | |||
|         style="font-family: Montserrat, 'sans-serif'; color: #1a1a1a !important; font-weight: 300 !important; font-size: 1.3rem !important;"> | |||
|         Our Industry Specifics And Process Segments To Solve Your Complex Business Barriers.</p> | |||
|     </div> | |||
| 
 | |||
|     <div class="col-lg-3"> | |||
|       <div class="my-4 d-flex flex-column justify-content-center" | |||
|         style="background-color: #f6f8f9 !important; border-radius: 10px; 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: 10px; 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: 10px; 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: 10px; 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: 10px; 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: 10px; 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: 10px; 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: 10px; 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> | |||
| </section> | |||
| 
 | |||
| <!-- END OF END OF OUR INDUSTRIES --> | |||
| 
 | |||
| <!-- FOOTER --> | |||
| <!-- Footer Section --> | |||
| <section class="container" style="margin: 5rem auto 2rem;"> | |||
|   <div class="row" style="max-width:1540px;"> | |||
|     <div class="col-lg-12 d-flex flex-column justify-content-center align-items-center"> | |||
|       <h2 class="text-center" | |||
|         style="font-family: Montserrat, 'sans-serif'; color: #000 !important; font-weight: 800 !important; font-size: 2rem !important; width: 80%;"> | |||
|         Need Help?</h2> | |||
|       <p class="text-center" | |||
|         style="font-family: Montserrat, 'sans-serif'; color: #1a1a1a !important; font-weight: 300 !important; font-size: 1.3rem !important;"> | |||
|         Do you have any queries regarding our products & services? Let us know.</p> | |||
|     </div> | |||
|   </div> | |||
| 
 | |||
|   <!-- Contact Cards --> | |||
|   <div class="row d-flex justify-content-center align-items-center" | |||
|     style="max-width:1540px; margin: 0 auto 2rem auto;"> | |||
| 
 | |||
|     <div class="col-lg-12" style="padding: 0rem 3rem 2rem; border-radius: 10px; margin-right: 3rem; "> | |||
| 
 | |||
|       <div class="row mt-4"> | |||
|         <div class="col-lg-4"> | |||
|           <a href="mailto:odoo@cybrosys.com" target="_blank" class="btn btn-block mb-2 deep_hover" | |||
|             style="text-decoration: none;  background-color: #4d4d4d; color: #FFF;  border-radius: 4px;"><i | |||
|               class="fa fa-envelope mr-2"></i>odoo@cybrosys.com</a> | |||
|         </div> | |||
|         <div class="col-lg-4"> | |||
|           <a href="https://api.whatsapp.com/send?phone=918606827707" target="_blank" | |||
|             class="btn btn-block mb-2 deep_hover" | |||
|             style="text-decoration: none;  background-color: #25D366; color: #FFF;  border-radius: 4px;"><i | |||
|               class="fa fa-whatsapp mr-2"></i>WhatsApp</a> | |||
|         </div> | |||
|         <div class="col-lg-4"> | |||
|           <a href="mailto:info@cybrosys.com" target="_blank" class="btn btn-block deep_hover" | |||
|             style="text-decoration: none; background-color: #4d4d4d; color: #FFF;  border-radius: 4px;"><i | |||
|               class="fa fa-envelope mr-2"></i>info@cybrosys.com</a> | |||
|         </div> | |||
|       </div> | |||
|     </div> | |||
| 
 | |||
|   </div> | |||
|   <!-- End of Contact Cards --> | |||
| </section> | |||
| <!-- Footer --> | |||
| <section class="oe_container" style="padding: 2rem 3rem 1rem;"> | |||
|   <div class="row" style="max-width:1540px; margin: 0 auto; margin-right: 3rem; "> | |||
|     <!-- Logo --> | |||
|     <div class="col-lg-12 d-flex justify-content-center align-items-center" style="margin-top: 3rem;"> | |||
|       <img src="https://www.cybrosys.com/images/logo.png" width="200px" height="auto" /> | |||
|     </div> | |||
|     <!-- End of Logo --> | |||
|     <div class="col-lg-12"> | |||
|       <hr | |||
|         style="margin-top: 3rem;background: linear-gradient(90deg, rgba(2,0,36,0) 0%, rgba(229,229,229,1) 33%, rgba(229,229,229,1) 58%, rgba(0,212,255,0) 100%); height: 2px; border-style: none;"> | |||
|       <!-- End of Footer Section --> | |||
|     </div> | |||
|   </div> | |||
| </section> | |||
| <!-- END OF FOOTER --> | |||
| @ -0,0 +1,143 @@ | |||
| odoo.define('master_search.FormRenderer', function(require) { | |||
| "use strict"; | |||
| 
 | |||
|     var FormRenderer = require('web.FormRenderer'); | |||
|     var framework = require('web.framework'); | |||
| 
 | |||
|     FormRenderer.include({ | |||
|         events: _.extend({}, FormRenderer.prototype.events, { | |||
|             'click .oe_search_tab': '_onSearchTabClick', | |||
|             'click .oe_search_btn': '_onSearchButtonClick', | |||
|             'keyup .search_input': '_onKeypressSearch', | |||
|             'click .re_search': '_onHistoryClick', | |||
|         }), | |||
|         // Research on history click
 | |||
|         _onHistoryClick: function(ev){ | |||
|             var history_key = ev.currentTarget.parentElement.firstChild.innerText; | |||
|             var edit_flag = $(".search_input").hasClass('o_input') | |||
|             // search if in edit mode
 | |||
|             if (edit_flag){ | |||
|                 $(".search_input").val(history_key) | |||
|                                     .trigger('change'); | |||
|                 $('.oe_search_btn').trigger('click'); | |||
|             } | |||
|             else{ | |||
|                 // trigger edit mode if search screen
 | |||
|                 $('.o_form_button_edit').trigger('click'); | |||
|                 //var search_input = $(".search_input").length
 | |||
|                 //if (search_input <= 0 ){$('.o_form_button_edit').trigger('click');}
 | |||
|             } | |||
|         }, | |||
|         // Trigger search while enter is pressed and process input
 | |||
|         _onKeypressSearch: function(ev){ | |||
|             var search_string = $(".search_input").val(); | |||
|             if(search_string.includes("*") == true){ | |||
|                 $(".not-allowed").css("display", 'block'); | |||
|                 // remove * from the input
 | |||
|                 $(".search_input") | |||
|                                 .val(search_string.replace('*', '')) | |||
|                                 .trigger('change'); | |||
|             } | |||
|             else{$(".not-allowed").css("display", 'none');} | |||
|             if (ev.which == 13){$('.oe_search_btn').trigger('click');} | |||
|         }, | |||
|          // block UI while searching
 | |||
|         _onSearchButtonClick: function(ev){ | |||
|             if( $(".search_input").val() != ''){framework.blockUI();} | |||
|         }, | |||
| 
 | |||
|         // collapse and expand tabs
 | |||
|         _onSearchTabClick: function(ev){ | |||
|             var targetDiv = ev.currentTarget.parentElement.children[1] | |||
|             var targetIcon = ev.currentTarget.getElementsByClassName('fa')[0] | |||
|             if (targetDiv){ | |||
|                 if(targetDiv.style.display == "block") { | |||
|                     console.log(targetDiv.style.display, "ddddddd") | |||
|                     targetDiv.style.display = "none"; | |||
|                     targetIcon.className = "fa fa-caret-down" | |||
|                 } | |||
|                 else { | |||
|                     console.log(targetDiv.style.display, "sssssss") | |||
|                     targetDiv.style.display = "block"; | |||
|                     targetIcon.className = "fa fa-caret-up" | |||
|                 } | |||
|             } | |||
|         }, | |||
| 
 | |||
|         // override existing form renderer function
 | |||
|         _renderView: function () { | |||
|             var self = this; | |||
| 
 | |||
|             // render the form and evaluate the modifiers
 | |||
|             var defs = []; | |||
|             var colour_list = [] | |||
|             this.defs = defs; | |||
|             this.inactiveNotebooks = []; | |||
|             var $form = this._renderNode(this.arch).addClass(this.className); | |||
|             delete this.defs; | |||
| 
 | |||
|             return Promise.all(defs).then(function () { | |||
|                 self._updateView($form.contents()); | |||
|                 if (self.state.res_id in self.alertFields) { | |||
|                     self.displayTranslationAlert(); | |||
|                 } | |||
|                 self.trigger_up('edit_mode'); | |||
|             }).then(function(){ | |||
|                 if (self.lastActivatedFieldIndex >= 0) { | |||
|                     self._activateNextFieldWidget(self.state, self.lastActivatedFieldIndex); | |||
|                 } | |||
|                 if (self._isInDom) { | |||
|                     _.forEach(self.allFieldWidgets, function (widgets){ | |||
|                         _.invoke(widgets, 'on_attach_callback'); | |||
|                     }); | |||
|                 } | |||
|                 // function for getting random light colors
 | |||
|                 function getRandomColor() { | |||
|                     var color = "hsl(" + Math.random() * 360 + ", 100%, 75%)"; | |||
|                     // avoid colour repetition
 | |||
|                     if(colour_list.indexOf(color) > -1){color = getRandomColor()} | |||
|                     colour_list.push(color); | |||
|                     return color; | |||
|                 } | |||
|                 // function for expanding tabs with result count
 | |||
|                 function onSearchButtonClick(ev){ | |||
|                     $('.oe_search_tab').each(function(i, obj) { | |||
|                         var result_count = parseInt(obj.getElementsByClassName('oe_tab_count')[0].innerHTML) | |||
|                         if (result_count > 0){ | |||
|                             obj.click() | |||
|                         } | |||
|                     }); | |||
|                 } | |||
|                 // Highlight all the words in result with different color
 | |||
|                 var text = $(".search_input").val(); | |||
|                 if (text){ | |||
|                     var keyword_list = [] | |||
|                     var key_list = text.split(" ") | |||
|                     for (var i = 0; i< key_list.length; i++) { | |||
|                         keyword_list[i] = {'key': key_list[i], 'color':getRandomColor()} | |||
|                     } | |||
|                     for (var i = 0; i< keyword_list.length; i++) { | |||
|                         var key = keyword_list[i].key; | |||
|                         var color = keyword_list[i].color | |||
|                         var regex = new RegExp("("+key+")", "ig"); | |||
|                         $('.o_data_cell').each(function(i, obj) { | |||
|                             var old_text = obj.innerHTML | |||
|                             if (!obj.firstChild || obj.firstChild.type != 'button'){ | |||
|                                 obj.innerHTML = old_text.replace(regex, "<span style='background-color: "+ color +";'>$1</span>"); | |||
|                             } | |||
|                         }); | |||
|                     } | |||
|                 } | |||
|                 // trigger search button click for expand tab with value
 | |||
|                 if((self.$el.find(".search_input")).length > 0){onSearchButtonClick()} | |||
|                 // unblock UI
 | |||
|                 framework.unblockUI(); | |||
|                 // change document title on search refresh
 | |||
|                 var search_input = $(".search_input").length | |||
|                 if (search_input <= 0 ){document.title = 'Search';} | |||
|             }).guardedCatch(function () { | |||
|                 $form.remove(); | |||
|             }); | |||
|         }, | |||
|     }); | |||
| }); | |||
| @ -0,0 +1,31 @@ | |||
| .oe_search_tab{ | |||
|     cursor: pointer; | |||
|     transition: .2s; | |||
|     &:hover { | |||
|         background-color: #7c7bad !important; | |||
|     } | |||
| } | |||
| .oe_details_tree{ | |||
|     display: none; | |||
| } | |||
| .btn_master_search{ | |||
|     display: inline-block; | |||
|     background-color:#5f5e97; | |||
|     color:#fff !important; | |||
|     color: #fff;margin-left: 1px; | |||
|     margin-top: -1px; | |||
| } | |||
| .btn_master_search:hover{ | |||
|     background-color: rgb(255, 255, 255) !important; | |||
|     color: rgb(61, 155, 187) !important; | |||
| } | |||
| .not-allowed{ | |||
|     color: #d94242; | |||
|     border: 1px solid #ea9292; | |||
|     border-radius: 5px; | |||
|     background-color: #f9e7e7; | |||
|     padding: 1px 55px; | |||
|     width: 370px; | |||
|     margin-bottom: 5px; | |||
|     display: none; | |||
| } | |||
| @ -0,0 +1,253 @@ | |||
| <?xml version="1.0" encoding="utf-8"?> | |||
| <odoo> | |||
|     <data> | |||
|         <!-- form view  --> | |||
|         <record model="ir.ui.view" id="master_search_form"> | |||
|             <field name="name">Search</field> | |||
|             <field name="model">master.search</field> | |||
|             <field name="arch" type="xml"> | |||
|                 <form string="Search"> | |||
|                     <style> | |||
|                         .o_control_panel{display: none;} | |||
|                     </style> | |||
|                     <script> | |||
|                         $(document).ready(function(){ | |||
|                         // Disable click events of tree view for history | |||
|                         $(".disable_open").unbind("click"); | |||
|                         if ($(".oe_search_bgnd").length > 0){document.title = 'Search';} | |||
|                         }); | |||
|                     </script> | |||
|                     <sheet> | |||
|                         <div class="row oe_search_bgnd" | |||
|                              style="padding: 24px 32px;background-color:#e5e4f9;border-radius: 5px;"> | |||
|                             <div class="col-12 col-md-8 col-xl-8"> | |||
|                                 <label for="search_string" string="Search  " style="display: inline-block;" | |||
|                                        class="oe_read_only"/> | |||
|                                 <field name="search_string" default_focus="1" class="search_input" | |||
|                                        style="width: 80%; display: inline-block;margin-right: 0px;block-size: 32px;" | |||
|                                        placeholder="Type here to search.."/> | |||
|                                 <button name="action_clear_search" | |||
|                                         type="object" class="fa fa-times oe_edit_only btn_master_search"/> | |||
|                                 <button name="action_search" | |||
|                                         type="object" | |||
|                                         class="fa fa-search oe_search_btn btn_master_search oe_edit_only"/> | |||
|                                 <div class="not-allowed">Regular expressions are not allowed in search!</div> | |||
|                                 <div> | |||
|                                     <label for="match_entire" string="Match Phrase :" style="display: inline-block;"/> | |||
|                                     <field name="match_entire" style="display: inline-block; margin-left: 10px;"/> | |||
|                                 </div> | |||
|                                 <div style="display: block;"> | |||
|                                     <label for="search_by" string="Search For :" class="oe_read_only"/> | |||
|                                     <field name="search_by" widget="radio" options="{'horizontal': true}"/> | |||
|                                 </div> | |||
|                             </div> | |||
|                             <div class="col-12 col-md-4 col-xl-4"> | |||
|                                 <div style="display: block;"> | |||
|                                     <label for="search_mode" string="Mode :" class="oe_read_only"/> | |||
|                                     <field name="search_mode" widget="radio" nolabel="1" | |||
|                                            options="{'horizontal': false}"/> | |||
|                                 </div> | |||
|                             </div> | |||
|                         </div> | |||
| 
 | |||
|                         <div class="oe_result_div"> | |||
|                             <div style="background-color: #5f5e97; color: #fff; width: 100%; padding: 5px 10px; | |||
|                             margin-top: 10px; border-top-right-radius: 5px;border-top-left-radius: 5px;" | |||
|                                  class="oe_search_tab"> | |||
|                                 Recent Searches | |||
|                                 <div style="float: right;"> | |||
|                                     <field name="history_count" class="oe_tab_count" readonly="1"/> | |||
|                                     Records Found | |||
|                                     <span class="oe_drop_down"> | |||
|                                         <i style="color: #fff !important; font-size: 16px;" class="fa fa-caret-down"/> | |||
|                                     </span> | |||
|                                 </div> | |||
|                             </div> | |||
|                             <div style="height: 200px; overflow-y: scroll;width: 100%;" class="oe_details_tree"> | |||
|                                 <field name="master_search_ids"> | |||
|                                     <tree create="0" class="disable_open"> | |||
|                                         <field name="search_string" class="re_search oe_key"/> | |||
|                                         <field name="search_mode" string="Mode" class="re_search"/> | |||
|                                         <field name="search_by" string="Type" class="re_search"/> | |||
|                                         <!--<field name="create_date" string="Date" optional="hide" class="re_search"/>--> | |||
|                                         <button style="display: inline-block;" name="action_unlink_search" | |||
|                                                 type="object" class="fa fa-trash"/> | |||
|                                     </tree> | |||
|                                 </field> | |||
|                             </div> | |||
|                         </div> | |||
| 
 | |||
|                         <div attrs="{'invisible':[('search_by', 'not in', ('any', 'customer'))]}" class="oe_result_div"> | |||
|                             <div style="background-color: #5f5e97; color: #fff; width: 100%; padding: 5px 10px; | |||
|                             margin-top: 10px; border-top-right-radius: 5px;border-top-left-radius: 5px;" | |||
|                                  class="oe_search_tab"> | |||
|                                 Customer Search Results | |||
|                                 <div style="float: right;"> | |||
|                                     <field name="customer_count" class="oe_tab_count" readonly="1"/> | |||
|                                     Records Found | |||
|                                     <span class="oe_drop_down"> | |||
|                                         <i style="color: #fff !important; font-size: 16px;" class="fa fa-caret-down"/> | |||
|                                     </span> | |||
|                                 </div> | |||
|                             </div> | |||
|                             <div style="height: 200px; overflow-y: scroll;width: 100%;" class="oe_details_tree"> | |||
|                                 <field name="customer_ids"> | |||
|                                     <tree create="0" delete="0"> | |||
|                                         <field name="name"/> | |||
|                                         <field name="email"/> | |||
|                                     </tree> | |||
|                                 </field> | |||
|                             </div> | |||
|                         </div> | |||
|                         <div attrs="{'invisible':[('search_by', 'not in', ('any', 'product'))]}" class="oe_result_div"> | |||
|                             <div style="background-color: #5f5e97; color: #fff; width: 100%; padding: 5px 10px; | |||
|                             margin-top: 10px; border-top-right-radius: 5px;border-top-left-radius: 5px;" | |||
|                                  class="oe_search_tab"> | |||
|                                 Product Search Results | |||
|                                 <div style="float: right;"> | |||
|                                     <field name="product_count" class="oe_tab_count" readonly="1"/> | |||
|                                     Records Found | |||
|                                     <span class="oe_drop_down"> | |||
|                                         <i style="color: #fff !important; font-size: 16px;" class="fa fa-caret-down"/> | |||
|                                     </span> | |||
|                                 </div> | |||
|                             </div> | |||
|                             <div style="height: 200px; overflow-y: scroll;width: 100%;" class="oe_details_tree" | |||
|                                  name="products"> | |||
|                                 <field name="product_ids"> | |||
|                                     <tree create="0" delete="0"> | |||
|                                         <field name="name" string="Name"/> | |||
|                                         <field name="default_code" string="Code"/> | |||
|                                         <field name="description" string="Description"/> | |||
|                                         <field name="type" string="Product Type"/> | |||
|                                         <field name="categ_id" string="Category"/> | |||
|                                         <field name="uom_id" string="Base UoM" optional="hide"/> | |||
|                                         <field name="qty_available" string="Stock"/> | |||
|                                     </tree> | |||
|                                 </field> | |||
|                             </div> | |||
|                         </div> | |||
|                         <div attrs="{'invisible':[('search_by', 'not in', ('any', 'transaction details'))]}" | |||
|                              class="oe_result_div"> | |||
|                             <div style="background-color: #5f5e97; color: #fff; width: 100%; padding: 5px 10px; | |||
|                             margin-top: 10px; border-top-right-radius: 5px;border-top-left-radius: 5px;" | |||
|                                  class="oe_search_tab"> | |||
|                                 Inventory Search Results | |||
|                                 <div style="float: right;"> | |||
|                                     <field name="transaction_count" class="oe_tab_count" readonly="1"/> | |||
|                                     Records Found | |||
|                                     <span class="oe_drop_down"> | |||
|                                         <i style="color: #fff !important; font-size: 16px;" class="fa fa-caret-down"/> | |||
|                                     </span> | |||
|                                 </div> | |||
|                             </div> | |||
| 
 | |||
|                             <div style="height: 200px; overflow-y: scroll;width: 100%;" class="oe_details_tree"> | |||
|                                 <field name="transaction_details"> | |||
|                                     <tree create="0" delete="0"> | |||
|                                         <field name="name" string="Trans. # "/> | |||
|                                         <field name="date_done" string="Transaction Date"/> | |||
|                                         <field name="picking_type_id" string="Transaction Type"/> | |||
|                                         <field name="partner_id" string="Reference Name"/> | |||
|                                         <field name="state" string="Transaction Status"/> | |||
|                                     </tree> | |||
|                                 </field> | |||
|                             </div> | |||
|                         </div> | |||
|                         <div attrs="{'invisible':[('search_by', 'not in', ('any', 'sale details'))]}" | |||
|                              class="oe_result_div"> | |||
|                             <div style="background-color: #5f5e97; color: #fff; width: 100%; padding: 5px 10px; | |||
|                             margin-top: 10px; border-top-right-radius: 5px;border-top-left-radius: 5px;" | |||
|                                  class="oe_search_tab"> | |||
|                                 Sale Search Results | |||
|                                 <div style="float: right;"> | |||
|                                     <field name="sale_count" class="oe_tab_count" readonly="1"/> | |||
|                                     Records Found | |||
|                                     <span class="oe_drop_down"> | |||
|                                         <i style="color: #fff !important; font-size: 16px;" class="fa fa-caret-down"/> | |||
|                                     </span> | |||
|                                 </div> | |||
|                             </div> | |||
| 
 | |||
|                             <div style="height: 200px; overflow-y: scroll;width: 100%;" class="oe_details_tree"> | |||
|                                 <field name="sale_details"> | |||
|                                     <tree create="0" delete="0"> | |||
|                                         <field name="name" string="Trans. # "/> | |||
|                                         <field name="partner_id" string="Customer"/> | |||
|                                         <field name="pricelist_id" string="Pricelist"/> | |||
|                                         <field name="payment_term_id" string="Payment Term"/> | |||
|                                         <field name="state" string="Status"/> | |||
|                                     </tree> | |||
|                                 </field> | |||
|                             </div> | |||
|                         </div> | |||
|                         <div attrs="{'invisible':[('search_by', 'not in', ('any', 'purchase details'))]}" | |||
|                              class="oe_result_div"> | |||
|                             <div style="background-color: #5f5e97; color: #fff; width: 100%; padding: 5px 10px; | |||
|                             margin-top: 10px; border-top-right-radius: 5px;border-top-left-radius: 5px;" | |||
|                                  class="oe_search_tab"> | |||
|                                 Purchase Search Results | |||
|                                 <div style="float: right;"> | |||
|                                     <field name="purchase_count" class="oe_tab_count" readonly="1"/> | |||
|                                     Records Found | |||
|                                     <span class="oe_drop_down"> | |||
|                                         <i style="color: #fff !important; font-size: 16px;" class="fa fa-caret-down"/> | |||
|                                     </span> | |||
|                                 </div> | |||
|                             </div> | |||
| 
 | |||
|                             <div style="height: 200px; overflow-y: scroll;width: 100%;" class="oe_details_tree"> | |||
|                                 <field name="purchase_details"> | |||
|                                     <tree create="0" delete="0"> | |||
|                                         <field name="name" string="Trans. # "/> | |||
|                                         <field name="partner_id" string="Customer"/> | |||
|                                         <field name="state" string="Status"/> | |||
|                                     </tree> | |||
|                                 </field> | |||
|                             </div> | |||
|                         </div> | |||
|                         <div attrs="{'invisible':[('search_by', 'not in', ('any', 'account details'))]}" | |||
|                              class="oe_result_div"> | |||
|                             <div style="background-color: #5f5e97; color: #fff; width: 100%; padding: 5px 10px; | |||
|                             margin-top: 10px; border-top-right-radius: 5px;border-top-left-radius: 5px;" | |||
|                                  class="oe_search_tab"> | |||
|                                 Accounting Search Results | |||
|                                 <div style="float: right;"> | |||
|                                     <field name="account_count" class="oe_tab_count" readonly="1"/> | |||
|                                     Records Found | |||
|                                     <span class="oe_drop_down"> | |||
|                                         <i style="color: #fff !important; font-size: 16px;" class="fa fa-caret-down"/> | |||
|                                     </span> | |||
|                                 </div> | |||
|                             </div> | |||
| 
 | |||
|                             <div style="height: 200px; overflow-y: scroll;width: 100%;" class="oe_details_tree"> | |||
|                                 <field name="account_details"> | |||
|                                     <tree create="false" delete="false" edit="false"> | |||
|                                         <field name="name" string="Trans. # "/> | |||
|                                         <field name="partner_id" string="Customer"/> | |||
|                                         <field name="state" string="Status"/> | |||
|                                     </tree> | |||
|                                 </field> | |||
|                             </div> | |||
|                         </div> | |||
|                     </sheet> | |||
|                 </form> | |||
|             </field> | |||
|         </record> | |||
| 
 | |||
| 
 | |||
|         <!-- actions opening views on models --> | |||
|         <record model="ir.actions.act_window" id="master_search_action"> | |||
|             <field name="name">Search</field> | |||
|             <field name="res_model">master.search</field> | |||
|             <field name="view_mode">form</field> | |||
|             <field name="context">{'active_test': False, 'search_default_filter_active': 1}</field> | |||
|         </record> | |||
| 
 | |||
|         <!-- Search root menu --> | |||
|         <menuitem id="master_search_root" name="Search" action="master_search_action" | |||
|                   web_icon="master_search,static/description/icon.png" | |||
|                   sequence="2" groups="master_search.master_search_read"/> | |||
|     </data> | |||
| </odoo> | |||
| @ -0,0 +1,9 @@ | |||
| <?xml version="1.0" encoding="UTF-8" ?> | |||
| <odoo> | |||
|     <template id="assets_backend" inherit_id="web.assets_backend"> | |||
|         <xpath expr="." position="inside"> | |||
|             <script type="text/javascript" src="/master_search/static/src/js/form_renderer.js"/> | |||
|             <link rel="stylesheet" href="/master_search/static/src/scss/master_search.scss"/> | |||
|         </xpath> | |||
|     </template> | |||
| </odoo> | |||