Browse Source

[13.0][ADD] initial commit 'master_search'

pull/167/head
ShahilCybro 4 years ago
parent
commit
7db456fca0
  1. 41
      master_search/README.rst
  2. 22
      master_search/__init__.py
  3. 44
      master_search/__manifest__.py
  4. 6
      master_search/doc/RELEASE_NOTES.md
  5. 22
      master_search/models/__init__.py
  6. 366
      master_search/models/master_search.py
  7. 2
      master_search/security/ir.model.access.csv
  8. 20
      master_search/security/security.xml
  9. BIN
      master_search/static/description/assets/arrow-circle-black.png
  10. BIN
      master_search/static/description/assets/arrow-circle-magenta.png
  11. BIN
      master_search/static/description/assets/hero.png
  12. BIN
      master_search/static/description/assets/icons/ecom.png
  13. BIN
      master_search/static/description/assets/icons/education.png
  14. BIN
      master_search/static/description/assets/icons/hotel.png
  15. BIN
      master_search/static/description/assets/icons/manufacturing.png
  16. BIN
      master_search/static/description/assets/icons/pos.png
  17. BIN
      master_search/static/description/assets/icons/restaurant.png
  18. BIN
      master_search/static/description/assets/icons/service.png
  19. BIN
      master_search/static/description/assets/icons/trading.png
  20. BIN
      master_search/static/description/assets/modules/advanced_ecom.png
  21. BIN
      master_search/static/description/assets/modules/export_excel.png
  22. BIN
      master_search/static/description/assets/modules/functional_tutorial.png
  23. BIN
      master_search/static/description/assets/modules/gantt_view.png
  24. BIN
      master_search/static/description/assets/modules/mobile_service.png
  25. BIN
      master_search/static/description/assets/modules/shopify_connector.png
  26. BIN
      master_search/static/description/assets/respnsive-img.png
  27. BIN
      master_search/static/description/assets/screenshots/master_search.png
  28. BIN
      master_search/static/description/assets/screenshots/master_search_2.png
  29. BIN
      master_search/static/description/assets/screenshots/master_search_3.png
  30. BIN
      master_search/static/description/assets/screenshots/master_search_4.png
  31. BIN
      master_search/static/description/banner.jpg
  32. BIN
      master_search/static/description/icon.png
  33. 594
      master_search/static/description/index.html
  34. 143
      master_search/static/src/js/form_renderer.js
  35. 31
      master_search/static/src/scss/master_search.scss
  36. 253
      master_search/views/master_search_view.xml
  37. 9
      master_search/views/template.xml

41
master_search/README.rst

@ -0,0 +1,41 @@
Support Package Management
==========================
* Master Search module for Odoo 13 community editions
Installation
============
- www.odoo.com/documentation/13.0/setup/install.html
- Install our custom addon
License
-------
General Public License, Version 3 (LGPL v3).
(https://www.odoo.com/documentation/user/13.0/legal/licenses/licenses.html)
Company
-------
* 'Cybrosys Techno Solutions <https://cybrosys.com/>`__
Credits
-------
* Developer:
(v13) 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>`__

22
master_search/__init__.py

@ -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(<https://www.cybrosys.com>)
#
# You can modify it under the terms of the GNU LESSER
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
#
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
# (LGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
#############################################################################
from . import models

44
master_search/__manifest__.py

@ -0,0 +1,44 @@
# -*- coding: utf-8 -*-
#############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2021-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Cybrosys Techno Solutions(<https://www.cybrosys.com>)
#
# You can modify it under the terms of the GNU LESSER
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
#
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
# (LGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
#############################################################################
{
'name': 'Master Search',
'version': '13.0.1.0.0',
'summary': """Helps to search the records of the objects""",
'description': """This module helps users search the records of the objects for all the
master search group enabled users.""",
'category': 'settings',
'author': 'Cybrosys Techno Solutions',
'website': 'https://www.cybrosys.com',
'company': "Cybrosys Techno Solutions",
'maintainer': "Cybrosys Techno Solutions",
'license': 'LGPL-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,
}

6
master_search/doc/RELEASE_NOTES.md

@ -0,0 +1,6 @@
## Module <master_search>
#### 25.05.2021
#### Version 13.0.1.0.0
#### ADD
Initial Commit

22
master_search/models/__init__.py

@ -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(<https://www.cybrosys.com>)
#
# You can modify it under the terms of the GNU LESSER
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
#
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
# (LGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
#############################################################################
from . import master_search

366
master_search/models/master_search.py

@ -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(<https://www.cybrosys.com>)
#
# You can modify it under the terms of the GNU LESSER
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
#
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
# (LGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
#############################################################################
from odoo import 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

2
master_search/security/ir.model.access.csv

@ -0,0 +1,2 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_master_search,master.search,model_master_search,,1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 access_master_search master.search model_master_search 1 1 1 1

20
master_search/security/security.xml

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

BIN
master_search/static/description/assets/arrow-circle-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

BIN
master_search/static/description/assets/arrow-circle-magenta.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

BIN
master_search/static/description/assets/hero.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 90 KiB

BIN
master_search/static/description/assets/icons/ecom.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

BIN
master_search/static/description/assets/icons/education.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

BIN
master_search/static/description/assets/icons/hotel.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

BIN
master_search/static/description/assets/icons/manufacturing.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

BIN
master_search/static/description/assets/icons/pos.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

BIN
master_search/static/description/assets/icons/restaurant.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

BIN
master_search/static/description/assets/icons/service.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 KiB

BIN
master_search/static/description/assets/icons/trading.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

BIN
master_search/static/description/assets/modules/advanced_ecom.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 99 KiB

BIN
master_search/static/description/assets/modules/export_excel.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 KiB

BIN
master_search/static/description/assets/modules/functional_tutorial.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 118 KiB

BIN
master_search/static/description/assets/modules/gantt_view.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 61 KiB

BIN
master_search/static/description/assets/modules/mobile_service.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 90 KiB

BIN
master_search/static/description/assets/modules/shopify_connector.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 93 KiB

BIN
master_search/static/description/assets/respnsive-img.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

BIN
master_search/static/description/assets/screenshots/master_search.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 69 KiB

BIN
master_search/static/description/assets/screenshots/master_search_2.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 59 KiB

BIN
master_search/static/description/assets/screenshots/master_search_3.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

BIN
master_search/static/description/assets/screenshots/master_search_4.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 KiB

BIN
master_search/static/description/banner.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 178 KiB

BIN
master_search/static/description/icon.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

594
master_search/static/description/index.html

@ -0,0 +1,594 @@
<!-- HERO SECTION -->
<section class="container">
<div class="row">
<div class="col-lg-6" style="background-color:#CB114A !important; padding: 4rem 2.5rem 6rem;">
<hr style="border: 2px solid #fff; width: 100px; margin-left: 0; margin-bottom: 3rem;">
<h1 style="font-family: Montserrat, 'sans-serif'; font-weight: 700; color: #FFF; margin-top: -1rem;">
Master Search
</h1>
<p style="font-family: Tahoma, 'sans-serif'; font-size: 18px; font-weight: 500; color: #FFF;">
Record search management module.
</p>
<h2 style="font-size: 26px; color: #fff; text-transform: uppercase; margin-top: 3rem;">Key Highlights
</h2>
<!-- KEY HIGHLIGHTS -->
<div class="d-flex mt-2">
<div class="d-flex justify-content-center align-items-center mr-1"
style="background-color: #fff; height: 40px; width: 40px; border-radius: 2px !important;">
<img src="./assets/arrow-circle-black.png" height="26px" width="26px">
</div>
<div class="d-flex justify-content-start align-items-center"
style="background-color: #fff; height: 40px; width: 100%; border-radius: 2px !important; padding: 10px">
<p
style="font-family: Tahoma, 'sans-serif'; font-size: 13px; font-weight: 600; color: #000; margin-top: 1rem;">
Easy to search the records in odoo.</p>
</div>
</div>
<div class="d-flex mt-2">
<div class="d-flex justify-content-center align-items-center mr-1"
style="background-color: #fff; height: 40px; width: 40px; border-radius: 2px !important;">
<img src="./assets/arrow-circle-black.png" height="26px" width="26px">
</div>
<div class="d-flex justify-content-start align-items-center"
style="background-color: #fff; height: 40px; width: 100%; border-radius: 2px !important; padding: 10px">
<p
style="font-family: Tahoma, 'sans-serif'; font-size: 13px; font-weight: 600; color: #000; margin-top: 1rem;">
You don't need to go to individual objects.</p>
</div>
</div>
<div class="d-flex mt-2">
<div class="d-flex justify-content-center align-items-center mr-1"
style="background-color: #fff; height: 40px; width: 40px; border-radius: 2px !important;">
<img src="./assets/arrow-circle-black.png" height="26px" width="26px">
</div>
<div class="d-flex justify-content-start align-items-center"
style="background-color: #fff; height: 40px; width: 100%; border-radius: 2px !important; padding: 10px">
<p
style="font-family: Tahoma, 'sans-serif'; font-size: 13px; font-weight: 600; color: #000; margin-top: 1rem;">
You can search using different attributes like name, ref. no, etc.</p>
</div>
</div>
<!-- END OF KEY HIGHLIGHTS -->
</div>
<div class="col-lg-6">
<!-- HERO IMAGE -->
<img src="./assets/hero.png" width="100%" height="auto" class="img img-responsive">
<!-- END OF HERO IMAGE-->
</div>
</div>
</section>
<!-- END OF HERO SECTION -->
<!-- OVERVIEW SECTION -->
<section class="container">
<div class="row">
<div class="col-lg-12" style="background-color:#ffffff !important; padding: 4rem 2.5rem;">
<hr style="border: 2px solid #000; width: 100px; margin-left: 0; margin-bottom: 3rem;">
<h1
style="font-family: Montserrat, 'sans-serif'; font-weight: 700; color: #000; margin-top: -1rem; text-transform: uppercase;">
Overview
</h1>
<p style="font-family: Tahoma, 'sans-serif'; font-size: 18px; font-weight: 500; color: #000; width: 90%;">
Master Search module is a search management app. It helps users search the records of the objects
for all the master search group enabled users. You can search using different attributes like name, reference no, etc.
</p>
</div>
</div>
</section>
<!-- END OF OVERVIEW SECTION -->
<!-- FEATURES SECTION -->
<section class="container">
<div class="row">
<div class="col-lg-6 d-flex flex-column align-items-center justify-content-center"
style="background-color:#D4D4D4 !important; padding: 4rem 2.5rem;">
<img src="./assets/respnsive-img.png" width="80%" height="auto" class="img img-responsive">
</div>
<div class="col-lg-6" style="background-color:#D4D4D4 !important; padding: 3rem 2.5rem 4rem 0;">
<hr style="border: 2px solid #000; width: 100px; margin-left: 0; margin-bottom: 3rem;">
<h1
style="font-family: Montserrat, 'sans-serif'; font-weight: 700; color: #000; margin-top: -1rem; text-transform: uppercase;">
Features
</h1>
<div class="d-flex mt-2">
<div class="d-flex justify-content-center align-items-center mr-1 deep-2"
style="background-color: #fff; height: 40px; width: 40px; border-radius: 2px !important;">
<img src="./assets/arrow-circle-magenta.png" height="26px" width="26px">
</div>
<div class="d-flex justify-content-start align-items-center deep-2"
style="background-color: #fff; height: 40px; width: 100%; border-radius: 2px !important; padding: 10px">
<p
style="font-family: Tahoma, 'sans-serif'; font-size: 13px; font-weight: 600; color: #000; margin-top: 1rem;">
Easy to search the records of the objects.</p>
</div>
</div>
<div class="d-flex mt-2">
<div class="d-flex justify-content-center align-items-center mr-1 deep-2"
style="background-color: #fff; height: 40px; width: 40px; border-radius: 2px !important;">
<img src="./assets/arrow-circle-magenta.png" height="26px" width="26px">
</div>
<div class="d-flex justify-content-start align-items-center deep-2"
style="background-color: #fff; height: 40px; width: 100%; border-radius: 2px !important; padding: 10px">
<p
style="font-family: Tahoma, 'sans-serif'; font-size: 13px; font-weight: 600; color: #000; margin-top: 1rem;">
You don't need to go to individual objects.</p>
</div>
</div>
<div class="d-flex mt-2">
<div class="d-flex justify-content-center align-items-center mr-1 deep-2"
style="background-color: #fff; height: 40px; width: 40px; border-radius: 2px !important;">
<img src="./assets/arrow-circle-magenta.png" height="26px" width="26px">
</div>
<div class="d-flex justify-content-start align-items-center deep-2"
style="background-color: #fff; height: 40px; width: 100%; border-radius: 2px !important; padding: 10px">
<p
style="font-family: Tahoma, 'sans-serif'; font-size: 13px; font-weight: 600; color: #000; margin-top: 1rem;">
You can search using different attributes like name, reference no, etc.</p>
</div>
</div>
<div class="d-flex mt-2">
<div class="d-flex justify-content-center align-items-center mr-1 deep-2"
style="background-color: #fff; height: 40px; width: 40px; border-radius: 2px !important;">
<img src="./assets/arrow-circle-magenta.png" height="26px" width="26px">
</div>
<div class="d-flex justify-content-start align-items-center deep-2"
style="background-color: #fff; height: 40px; width: 100%; border-radius: 2px !important; padding: 10px">
<p
style="font-family: Tahoma, 'sans-serif'; font-size: 13px; font-weight: 600; color: #000; margin-top: 1rem;">
It saves your time.</p>
</div>
</div>
</div>
</div>
</section>
<!-- END OF FEATURES SECTION -->
<!-- SCREENSHOTS SECTION -->
<section class="container">
<div class="row">
<div class="col-lg-12" style="background-color:#ffffff !important; padding: 4rem 2.5rem;">
<hr style="border: 2px solid #CB114A; width: 100px; margin-left: 0; margin-bottom: 3rem;">
<h1
style="font-family: Montserrat, 'sans-serif'; font-weight: 700; color: #000; margin-top: -1rem; margin-bottom: 1rem; text-transform: uppercase;">
SCREENSHOTS
</h1>
</div>
<div class="col-lg-12" style="background-color:#CB114A !important; padding: 2.5rem; border-radius: 8px;">
<div id="odooAppsIndicators" class="carousel slide" data-ride="carousel">
<ol class="carousel-indicators"
style="position: absolute !important; bottom: -90px !important; left: -65.5rem !important">
<li data-target="#odooAppsIndicators" data-slide-to="0" class="active"
style="height: 15px !important; width: 15px !important; background-color: #000 !important;">
</li>
<li data-target="#odooAppsIndicators" data-slide-to="1"
style="height: 15px !important; width: 15px !important; background-color: #000 !important;">
</li>
<li data-target="#odooAppsIndicators" data-slide-to="2"
style="height: 15px !important; width: 15px !important; background-color: #000 !important;">
</li>
<li data-target="#odooAppsIndicators" data-slide-to="3"
style="height: 15px !important; width: 15px !important; background-color: #000 !important;">
</li>
</ol>
<div class="carousel-inner">
<div class="carousel-item active" style="overflow: visible;">
<div class="col-xs-12 col-sm-12 col-md-12 mb16 mt16 d-flex w-100"
style="float:left; margin-bottom: 1rem; margin-left: -15px;">
<div class="d-flex justify-content-center align-items-center mr-1 deep-2"
style="background-color: #fff; height: 40px; width: 40px; border-radius: 2px !important;">
<img src="./assets/arrow-circle-black.png" height="26px" width="26px">
</div>
<div class="d-flex justify-content-start align-items-center deep-2"
style="background-color: #fff; height: 40px; width: 100%; border-radius: 2px !important; padding: 10px">
<p
style="font-family: Tahoma, 'sans-serif'; font-size: 12px; font-weight: 600; color: #000; margin-top: 1rem;">
After installation, Give Access to the user to 'Master Search' from User
settings.</p>
</div>
</div>
<img class="d-block w-100" src="./assets/screenshots/master_search.png" alt="First slide">
</div>
<div class="carousel-item" style="overflow: visible;">
<div class="col-xs-12 col-sm-12 col-md-12 mb16 mt16 d-flex w-100"
style="float:left; margin-bottom: 1rem; margin-left: -15px;">
<div class="d-flex justify-content-center align-items-center mr-1 deep-2"
style="background-color: #fff; height: 40px; width: 40px; border-radius: 2px !important;">
<img src="./assets/arrow-circle-black.png" height="26px" width="26px">
</div>
<div class="d-flex justify-content-start align-items-center deep-2"
style="background-color: #fff; height: 40px; width: 100%; border-radius: 2px !important; padding: 10px">
<p
style="font-family: Tahoma, 'sans-serif'; font-size: 13px; font-weight: 600; color: #000; margin-top: 1rem;">
You can see the master search menu after giving the access.</p>
</div>
</div>
<img class="d-block w-100" src="./assets/screenshots/master_search_2.png" alt="First slide">
</div>
<div class="carousel-item" style="overflow: visible;">
<div class="col-xs-12 col-sm-12 col-md-12 mb16 mt16 d-flex w-50"
style="float:left; margin-bottom: 1rem; margin-left: -15px;">
<div class="d-flex justify-content-center align-items-center mr-1 deep-2"
style="background-color: #fff; height: 40px; width: 40px; border-radius: 2px !important;">
<img src="./assets/arrow-circle-black.png" height="26px" width="26px">
</div>
<div class="d-flex justify-content-start align-items-center deep-2"
style="background-color: #fff; height: 40px; width: 100%; border-radius: 2px !important; padding: 10px">
<p
style="font-family: Tahoma, 'sans-serif'; font-size: 13px; font-weight: 600; color: #000; margin-top: 1rem;">
Search results will appear like this.</p>
</div>
</div>
<img class="d-block w-100" src="./assets/screenshots/master_search_3.png" alt="First slide">
</div>
<div class="carousel-item" style="overflow: visible;">
<div class="col-xs-12 col-sm-12 col-md-12 mb16 mt16 d-flex w-50"
style="float:left; margin-bottom: 1rem; margin-left: -15px;">
<div class="d-flex justify-content-center align-items-center mr-1 deep-2"
style="background-color: #fff; height: 40px; width: 40px; border-radius: 2px !important;">
<img src="./assets/arrow-circle-black.png" height="26px" width="26px">
</div>
<div class="d-flex justify-content-start align-items-center deep-2"
style="background-color: #fff; height: 40px; width: 100%; border-radius: 2px !important; padding: 10px">
<p
style="font-family: Tahoma, 'sans-serif'; font-size: 13px; font-weight: 600; color: #000; margin-top: 1rem;">
Search Results.</p>
</div>
</div>
<img class="d-block w-100" src="./assets/screenshots/master_search_4.png" alt="First slide">
</div>
</div>
<!-- <a class="carousel-control-prev" href="#odooAppsIndicators" role="button" data-slide="prev">
<span class="carousel-control-prev-icon" aria-hidden="true"></span>
<span class="sr-only">Previous</span>
</a>
<a class="carousel-control-next" href="#odooAppsIndicators" role="button" data-slide="next">
<span class="carousel-control-next-icon" aria-hidden="true"></span>
<span class="sr-only">Next</span>
</a> -->
</div>
</div>
</div>
</section>
<!-- END OF SCREENSHOTS SECTION-->
<section class="container">
<div class="row">
<div class="col-lg-12" style="background-color:#ffffff !important; padding: 4rem 2.5rem;">
<hr style="border: 2px solid #CB114A; width: 100px; margin-left: 0; margin-bottom: 3rem;">
<h1
style="font-family: Montserrat, 'sans-serif'; font-weight: 700; color: #000; margin-top: -1rem; margin-bottom: 0rem; text-transform: uppercase;">
Suggested Products
</h1>
</div>
</div>
<div class="col-lg-12">
<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/custom_gantt_view/" 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/gantt_view.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/odoo_functional_tutorial_com/" 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/functional_tutorial.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/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_connector.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/mobile_service_shop_pro/" 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/mobile_service.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/website_sale_extend/" 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/advanced_ecom.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/export_stockinfo_xls/" 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/export_excel.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>
</section>
<!-- Our Services -->
<section class="container" style="margin-top: 6rem;">
<div class="row mt-4 position-relative" style="max-width:1540px; margin: 0 auto;">
<div class="col-lg-12 jumbotron text-white position-relative"
style="background-color: #D4D4D4 !important; border-radius: 10px;">
<span class="badge badge-pill px-3 py-2 text-white deep-2-sm font-weight-bold"
style="background-color: #CB114A;"><i class="fa fa-trophy mr-2"></i>Odoo Gold Partner</span>
<div class="row">
<div class="col-lg-12 mt-4">
<h1 style="color: #000;">Our Services</h1>
<p class="lead" style="color: #000;">We provide following services</p>
<div class="row d-flex flex-row justify-content-start flex-wrap mt-4 pl-4">
<a class="text-dark" href="https://www.cybrosys.com/odoo-customization-and-installation/"
style="color: white; text-decoration: none;" target="_blank">
<div class="bg-white deep-2 d-flex flex-column justify-content-center align-items-center rounded"
style="padding: 2rem; margin-right: 1rem; height: 150px; width: 150px;">
<i class="fa fa-cogs mr-2 mt-2" style="color: #CB114A; font-size: 3rem"></i>
<h6 class="text-center mt-3" style="color: #000;">Odoo Customization</h6>
</div>
</a>
<a class="text-dark" href="https://www.cybrosys.com/odoo-erp-implementation/"
style="color: white; text-decoration: none;" target="_blank">
<div class="bg-white deep-2 d-flex flex-column justify-content-center align-items-center rounded"
style="padding: 2rem; margin-right: 1rem; height: 150px; width: 150px;">
<i class="fa fa-wrench mr-2 mt-2" style="color: #CB114A; font-size: 3rem"></i>
<h6 class="text-center mt-3" style="color: #000;">Odoo Implementation</h6>
</div>
</a>
<a class="text-dark" href="https://www.cybrosys.com/odoo-erp-support/"
style="color: white; text-decoration: none;" target="_blank">
<div class="bg-white deep-2 d-flex flex-column justify-content-center align-items-center rounded"
style="padding: 2rem; margin-right: 1rem; height: 150px; width: 150px;">
<i class="fa fa-life-ring mr-2 mt-2" style="color: #CB114A; font-size: 3rem"></i>
<h6 class="text-center mt-3" style="color: #000;">Odoo Support</h6>
</div>
</a>
<a class="text-dark" href="https://www.cybrosys.com/hire-odoo-developer/" style=text-decoration:
none;" target="_blank">
<div class="bg-white deep-2 d-flex flex-column justify-content-center align-items-center rounded"
style="padding: 2rem; margin-right: 1rem; height: 150px; width: 150px;">
<i class="fa fa-user mr-2 mt-2" style="color: #CB114A; font-size: 3rem"></i>
<h6 class="text-center mt-3" style="color: #000;">Hire Odoo Developers</h6>
</div>
</a>
</div>
</div>
</div>
</div>
</div>
</section>
<!-- End of Our Services -->
<!-- Our Industries -->
<section class="container" style="margin-top: 0rem;">
<div class="row" style="max-width:1540px; ">
<div class="col-lg-12" style="background-color:#ffffff !important; padding: 4rem 2.5rem;">
<hr style="border: 2px solid #CB114A; width: 100px; margin-left: 0; margin-bottom: 3rem;">
<h1
style="font-family: Montserrat, 'sans-serif'; font-weight: 700; color: #000; margin-top: -1rem; margin-bottom: 0rem; text-transform: uppercase;">
Our Industries
</h1>
</div>
<div class="row mt-4 position-relative" style="max-width:1540px; margin: 0 auto;">
<!-- Left Column -->
<div class="col-lg-6">
<div class="bg-white deep-2 px-4 py-3 mb-3" style="border-radius: 10px;">
<a href="https://www.cybrosys.com/odoo/industries/best-trading-erp/" target="_blank"
class="text-dark" style="text-decoration: none;">
<div class="row">
<div class="col-lg-3 no-gutters">
<img src="./assets/icons/trading.png">
</div>
<div class="col-lg-9 no-gutters pt-3">
<h4 style="font-family: Roboto, 'sans-serif">Trading</h4>
<p style="font-weight: 300;">Easily procure and sell your products</p>
</div>
</div>
</a>
</div>
<div class="bg-white deep-2 px-4 py-3 my-3" style="border-radius: 10px;">
<a href="https://www.cybrosys.com/odoo/industries/education-erp-software/" target="_blank"
class="text-dark" style="text-decoration: none;">
<div class="row">
<div class="col-lg-3 no-gutters">
<img src="./assets/icons/education.png">
</div>
<div class="col-lg-9 no-gutters pt-3">
<h4 style="font-family: Roboto, 'sans-serif">Education</h4>
<p style="font-weight: 300;">A collaborative platform for educational management</p>
</div>
</div>
</a>
</div>
<div class="bg-white deep-2 px-4 py-3 my-3" style="border-radius: 10px;">
<a href="https://www.cybrosys.com/odoo/industries/manufacturing-erp-software/" target="_blank"
class="text-dark" style="text-decoration: none;">
<div class="row">
<div class="col-lg-3 no-gutters">
<img src="./assets/icons/manufacturing.png">
</div>
<div class="col-lg-9 no-gutters pt-3">
<h4 style="font-family: Roboto, 'sans-serif">Manufacturing</h4>
<p style="font-weight: 300;">Plan, track and schedule your operations</p>
</div>
</div>
</a>
</div>
<div class="bg-white deep-2 px-4 py-3 my-3" style="border-radius: 10px;">
<a href="https://www.cybrosys.com/odoo/industries/ecommerce-website/" target="_blank"
class="text-dark" style="text-decoration: none;">
<div class="row">
<div class="col-lg-3 no-gutters">
<img src="./assets/icons/ecom.png">
</div>
<div class="col-lg-9 no-gutters pt-3">
<h4 style="font-family: Roboto, 'sans-serif">E-commerce & Website</h4>
<p style="font-weight: 300;">Mobile friendly, awe-inspiring product pages
</p>
</div>
</div>
</a>
</div>
</div>
<!-- End of Left Column -->
<!-- Right Column -->
<div class="col-lg-6">
<div class="bg-white deep-2 px-4 py-3 mb-3" style="border-radius: 10px;">
<a href="https://www.cybrosys.com/odoo/industries/pos/" target="_blank" class="text-dark"
style="text-decoration: none;">
<div class="row">
<div class="col-lg-3 no-gutters">
<img src="./assets/icons/pos.png">
</div>
<div class="col-lg-9 no-gutters pt-3">
<h4 style="font-family: Roboto, 'sans-serif">POS</h4>
<p style="font-weight: 300;">Easy configuration and convivial experience</p>
</div>
</div>
</a>
</div>
<div class="bg-white deep-2 px-4 py-3 my-3" style="border-radius: 10px;">
<a href="https://www.cybrosys.com/odoo/industries/service-management/" target="_blank"
class="text-dark" style="text-decoration: none;">
<div class="row">
<div class="col-lg-3 no-gutters">
<img src="./assets/icons/service.png">
</div>
<div class="col-lg-9 no-gutters pt-3">
<h4 style="font-family: Roboto, 'sans-serif">Service Management</h4>
<p style="font-weight: 300;">Keep track of services and invoice
</p>
</div>
</div>
</a>
</div>
<div class="bg-white deep-2 px-4 py-3 my-3" style="border-radius: 10px;">
<a href="https://www.cybrosys.com/odoo/industries/restaurant-management/" target="_blank"
class="text-dark" style="text-decoration: none;">
<div class="row">
<div class="col-lg-3 no-gutters">
<img src="./assets/icons/restaurant.png">
</div>
<div class="col-lg-9 no-gutters pt-3">
<h4 style="font-family: Roboto, 'sans-serif">Restaurant</h4>
<p style="font-weight: 300;">Run your bar or restaurant methodically</p>
</div>
</div>
</a>
</div>
<div class="bg-white deep-2 px-4 py-3 my-3" style="border-radius: 10px;">
<a href="https://www.cybrosys.com/odoo/industries/hotel-management-erp/" target="_blank"
class="text-dark" style="text-decoration: none;">
<div class="row">
<div class="col-lg-3 no-gutters">
<img src="./assets/icons/hotel.png">
</div>
<div class="col-lg-9 no-gutters pt-3">
<h4 style="font-family: Roboto, 'sans-serif">Hotel Management</h4>
<p style="font-weight: 300;">An all-inclusive hotel management application
</p>
</div>
</div>
</a>
</div>
</div>
<!-- End of Right Column -->
</div>
</div>
</section>
<!-- End of Our Industries-->
<!-- Footer Section -->
<section class="container">
<div class="row" style="max-width:1540px;">
<div class="col-lg-12" style="background-color:#ffffff !important; padding: 4rem 2.5rem;">
<hr style="border: 2px solid #CB114A; width: 100px; margin-left: 0; margin-bottom: 3rem;">
<h1
style="font-family: Montserrat, 'sans-serif'; font-weight: 700; color: #000; margin-top: -1rem; margin-bottom: 0rem; text-transform: uppercase;">
Need Help?
</h1>
</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; margin-top: -3.5rem; !important">
<p class="mb-4" style="color: #808e9b; font-size: 1.2rem;">Do you have any queries regarding our
products &amp; services? Let us know.</p>
<div class="row">
<div class="col-lg-6">
<a href="mailto:odoo@cybrosys.com" target="_blank" class="btn btn-block mb-2 deep_hover"
style="text-decoration: none; background-color: #CB114A; color: #FFF; border-radius: 4px;">odoo@cybrosys.com</a>
</div>
<div class="col-lg-6">
<a href="mailto:info@cybrosys.com" target="_blank" class="btn btn-block deep_hover"
style="text-decoration: none; background-color: #CB114A; color: #FFF; border-radius: 4px;">info@cybrosys.com</a>
</div>
</div>
</div>
</div>
<!-- End of Contact Cards -->
</div>
</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" style="margin-top: 2rem;">
<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>

143
master_search/static/src/js/form_renderer.js

@ -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();
});
},
});
});

31
master_search/static/src/scss/master_search.scss

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

253
master_search/views/master_search_view.xml

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

9
master_search/views/template.xml

@ -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>
Loading…
Cancel
Save