diff --git a/product_visibility_website/__manifest__.py b/product_visibility_website/__manifest__.py index 8818f56ad..5b3a350e8 100644 --- a/product_visibility_website/__manifest__.py +++ b/product_visibility_website/__manifest__.py @@ -22,7 +22,7 @@ ################################################################################ { 'name': 'Website Product Visibility', - 'version': '16.0.1.1.0', + 'version': '16.0.1.1.1', 'category': 'Website', 'summary': 'Website Product visibility for Users', 'description': """Website Product visibility for Users""", @@ -33,8 +33,9 @@ 'depends': ['contacts', 'website_sale','website'], 'data': [ 'views/website_product_visibility.xml', + 'views/res_config_settings_views.xml' ], - 'images': ['static/description/banner.png'], + 'images': ['static/description/1.png'], 'license': 'AGPL-3', 'installable': True, 'auto_install': False, diff --git a/product_visibility_website/controllers/main.py b/product_visibility_website/controllers/main.py index 20e1db4df..5d436c5c0 100644 --- a/product_visibility_website/controllers/main.py +++ b/product_visibility_website/controllers/main.py @@ -75,12 +75,7 @@ class ProductVisibilityCon(WebsiteSale): domains.append([('public_categ_ids', 'child_of', categories.ids)]) return expression.AND(domains) - @http.route([ - '/shop', - '/shop/page/', - '/shop/category/', - '/shop/category//page/', - ], type='http', auth="public", website=True, sitemap=sitemap_shop) + @http.route(type='http', auth="public", website=True) def shop(self, page=0, category=None, search='', min_price=0.0, max_price=0.0, ppg=False, **post): available_categ = available_products = '' @@ -91,14 +86,15 @@ class ProductVisibilityCon(WebsiteSale): 'filter_mode') products = literal_eval( request.env['ir.config_parameter'].sudo().get_param( - 'website_product_visibility.available_product_ids', - 'False')) + 'website_product_visibility.' + 'available_products_for_guest_ids', 'False')) if mode == 'product_only': available_products = request.env['product.template'].search( [('id', 'in', products)]) cat = literal_eval( request.env['ir.config_parameter'].sudo().get_param( - 'website_product_visibility.available_cat_ids', 'False')) + 'website_product_visibility.available_cat_for_guest_ids', + 'False')) available_categ = request.env['product.public.category'].search( [('id', 'in', cat)]) else: @@ -119,7 +115,28 @@ class ProductVisibilityCon(WebsiteSale): categ = Category.search([('parent_id', '=', False), ( 'product_tmpl_ids', 'in', available_products.ids)]) # supering shop*** - if not available_categ and not available_products: + if not available_categ and not available_products and \ + request.env.user.has_group( + 'base.group_portal'): + mode = request.env['ir.config_parameter'].sudo().get_param( + 'filter_mode_portal') + products = literal_eval( + request.env['ir.config_parameter'].sudo().get_param( + 'website_product_visibility.' + 'available_products_for_portal_ids', 'False')) + if mode == 'product_only': + available_products = request.env['product.template'].search( + [('id', 'in', products)]) + cat = literal_eval( + request.env['ir.config_parameter'].sudo().get_param( + 'website_product_visibility.available_cat_for_portal_ids', + 'False')) + available_categ = request.env['product.public.category'].search( + [('id', 'in', cat)]) + + if not available_categ and not available_products and \ + not request.env.user.has_group( + 'base.group_user'): return super(ProductVisibilityCon, self).shop(page, category, search, ppg, **post) add_qty = int(post.get('add_qty', 1)) @@ -195,20 +212,24 @@ class ProductVisibilityCon(WebsiteSale): conversion_rate=conversion_rate, **post ) - fuzzy_search_term, product_count, search_product = self._shop_lookup_products( - attrib_set, options, post, search, website) + fuzzy_search_term, product_count, search_product = \ + self._shop_lookup_products( + attrib_set, options, post, search, website) filter_by_price_enabled = website.is_view_active( 'website_sale.filter_products_price') if filter_by_price_enabled: - # TODO Find an alternative way to obtain the domain through the search metadata. + # TODO Find an alternative way to obtain the domain through the + # search metadata. Product = request.env['product.template'].with_context( bin_size=True) domain = self._get_search_domain(search, category, attrib_values) - # This is ~4 times more efficient than a search for the cheapest and most expensive products + # This is ~4 times more efficient than a search for the cheapest + # and most expensive products from_clause, where_clause, where_params = Product._where_calc( domain).get_sql() query = f""" - SELECT COALESCE(MIN(list_price), 0) * {conversion_rate}, COALESCE(MAX(list_price), 0) * {conversion_rate} + SELECT COALESCE(MIN(list_price), 0) * {conversion_rate}, + COALESCE(MAX(list_price), 0) * {conversion_rate} FROM {from_clause} WHERE {where_clause} """ @@ -222,10 +243,12 @@ class ProductVisibilityCon(WebsiteSale): # price filter is set to their respective available prices when the specified # min exceeds the max, and / or the specified max is lower than the available min. if min_price: - min_price = min_price if min_price <= available_max_price else available_min_price + min_price = min_price if min_price <= available_max_price \ + else available_min_price post['min_price'] = min_price if max_price: - max_price = max_price if max_price >= available_min_price else available_max_price + max_price = max_price if max_price >= available_min_price \ + else available_max_price post['max_price'] = max_price website_domain = website.website_domain() categs_domain = [('parent_id', '=', False)] + website_domain @@ -369,14 +392,14 @@ class ProductVisibilityCon(WebsiteSale): 'filter_mode') products = literal_eval( request.env['ir.config_parameter'].sudo().get_param( - 'website_product_visibility.available_product_ids', - 'False')) + 'website_product_visibility.' + 'available_products_for_guest_ids', 'False')) if mode == 'product_only': available_products = request.env['product.template'].search( [('id', 'in', products)]) cat = literal_eval( request.env['ir.config_parameter'].sudo().get_param( - 'website_product_visibility.available_cat_ids', + 'website_product_visibility.available_cat_for_guest_ids', 'False')) available_categ = request.env['product.public.category'].search( [('id', 'in', cat)]) @@ -394,7 +417,27 @@ class ProductVisibilityCon(WebsiteSale): max_nb_chars = options.get('max_nb_chars', 999) category = options.get('category') attrib_values = options.get('attrib_values') - if not available_products and not available_categ: + if not available_categ and not available_products \ + and request.env.user.has_group( + 'base.group_portal'): + mode = request.env['ir.config_parameter'].sudo().get_param( + 'filter_mode_portal') + products = literal_eval( + request.env['ir.config_parameter'].sudo().get_param( + 'website_product_visibility.' + 'available_products_for_portal_ids', 'False')) + if mode == 'product_only': + available_products = request.env['product.template'].search( + [('id', 'in', products)]) + cat = literal_eval( + request.env['ir.config_parameter'].sudo().get_param( + 'website_product_visibility.available_cat_for_portal_ids', + 'False')) + available_categ = request.env['product.public.category'].search( + [('id', 'in', cat)]) + if not available_products and not available_categ \ + and not request.env.user.has_group( + 'base.group_portal'): domain = self._get_search_domain(term, category, attrib_values, display_description) else: @@ -422,7 +465,8 @@ class ProductVisibilityCon(WebsiteSale): if display_price: FieldMonetary = request.env['ir.qweb.field.monetary'] monetary_options = { - 'display_currency': request.website.get_current_pricelist().currency_id, + 'display_currency': + request.website.get_current_pricelist().currency_id, } for res_product, product in zip(res['products'], products): combination_info = product._get_combination_info( diff --git a/product_visibility_website/doc/RELEASE_NOTES.md b/product_visibility_website/doc/RELEASE_NOTES.md index f124505c4..099d9349c 100644 --- a/product_visibility_website/doc/RELEASE_NOTES.md +++ b/product_visibility_website/doc/RELEASE_NOTES.md @@ -8,3 +8,8 @@ #### Version 16.0.1.0.0 ##### FIX - Bug Fixed + +#### 12.10.2023 +#### Version 16.0.1.1.1 +##### FIX +- Feature Of Website Product Visibility For Portal Users Is Added diff --git a/product_visibility_website/models/__init__.py b/product_visibility_website/models/__init__.py index d98d952fc..07a034e53 100644 --- a/product_visibility_website/models/__init__.py +++ b/product_visibility_website/models/__init__.py @@ -20,4 +20,5 @@ # along with this program. If not, see . # ################################################################################ +from . import res_config_settings from . import website_product_visibility diff --git a/product_visibility_website/models/res_config_settings.py b/product_visibility_website/models/res_config_settings.py new file mode 100644 index 000000000..5ee7b6e29 --- /dev/null +++ b/product_visibility_website/models/res_config_settings.py @@ -0,0 +1,155 @@ +# -*- coding: utf-8 -*- +################################################################################ +# +# Cybrosys Technologies Pvt. Ltd. +# +# Copyright (C) 2022-TODAY Cybrosys Technologies () +# Author: Neeraj Krishnan V M, Saneen K () +# +# This program is free software: you can modify +# it under the terms of the GNU Affero General Public License (AGPL) as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# 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 for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +################################################################################ +from odoo import fields, models, api +from ast import literal_eval + + +class ResConfigSettings(models.TransientModel): + """Inherit the model res.config.settings for adding the fields for + selecting the product for website visitors and portal users""" + _inherit = 'res.config.settings' + + product_visibility_guest_user = fields.Boolean( + string="Product visibility Guest User", help="Product Visibility") + filter_mode = fields.Selection([('product_only', 'Product Wise'), + ('categ_only', 'Category Wise')], + string='Filter Mode', default='product_only') + available_products_for_guest_ids = fields.Many2many( + 'product.template', + string='Available Product', + domain="[('is_published', '=', True)]", + help='The website will only display products which are within one of ' + 'the selected category trees. If no category is specified,all ' + 'available products will be shown') + available_cat_for_guest_ids = fields.Many2many( + 'product.public.category', + string='Available Product Categories', + help='The website will only display products which are selected. If no ' + 'product is specified,all available products will be shown') + product_visibility_portal_user = fields.Boolean( + string="Product visibility Portal User", help="Product Visibility") + filter_mode_portal = fields.Selection([('product_only', 'Product Wise'), + ('categ_only', 'Category Wise')], + string='Filter Mode', + default='product_only') + available_products_for_portal_ids = fields.Many2many( + 'product.template', + relation="available_product_for_portal_rel", + string='Available Product', + domain="[('is_published', '=', True)]", + help='The website will only display products which are within one of ' + 'the selected category trees. If no category is specified,all ' + 'available products will be shown') + available_cat_for_portal_ids = fields.Many2many( + 'product.public.category', + relation="available_cat_for_portal_rel", + string='Available Product Categories', + help='The website will only display products which are selected. If no ' + 'product is specified,all available products will be shown') + + @api.model + def set_values(self): + res = super(ResConfigSettings, self).set_values() + self.env['ir.config_parameter'].sudo().set_param( + 'product_visibility_guest_user', + self.product_visibility_guest_user) + self.env['ir.config_parameter'].sudo().set_param( + 'product_visibility_portal_user', + self.product_visibility_portal_user) + self.env['ir.config_parameter'].sudo().set_param('filter_mode', + self.filter_mode) + self.env['ir.config_parameter'].sudo().set_param( + 'filter_mode_portal', self.filter_mode_portal) + if not self.product_visibility_guest_user: + self.available_cat_for_guest_ids = None + self.available_products_for_guest_ids = None + self.env['ir.config_parameter'].sudo().set_param('filter_mode', + 'product_only') + if not self.product_visibility_portal_user: + self.available_products_for_portal_ids = None + self.available_cat_for_portal_ids = None + if self.filter_mode == 'product_only': + self.available_cat_for_guest_ids = None + elif self.filter_mode == 'categ_only': + self.available_products_for_guest_ids = None + if self.filter_mode_portal == 'product_only': + self.available_cat_for_portal_ids = None + elif self.filter_mode_portal == 'categ_only': + self.available_products_for_portal_ids = None + self.env['ir.config_parameter'].sudo().set_param( + 'website_product_visibility.available_products_for_guest_ids', + self.available_products_for_guest_ids.ids) + self.env['ir.config_parameter'].sudo().set_param( + 'website_product_visibility.available_products_for_portal_ids', + self.available_products_for_portal_ids.ids) + self.env['ir.config_parameter'].sudo().set_param( + 'website_product_visibility.available_cat_for_guest_ids', + self.available_cat_for_guest_ids.ids) + self.env['ir.config_parameter'].sudo().set_param( + 'website_product_visibility.available_cat_for_portal_ids', + self.available_cat_for_portal_ids.ids) + return res + + @api.model + def get_values(self): + res = super(ResConfigSettings, self).get_values() + product_visibility_guest_user = self.env[ + 'ir.config_parameter'].sudo().get_param( + 'product_visibility_guest_user') + product_visibility_portal_user = self.env[ + 'ir.config_parameter'].sudo().get_param( + 'product_visibility_portal_user') + filter_mode = self.env['ir.config_parameter'].sudo().get_param( + 'filter_mode') + filter_mode_portal = self.env['ir.config_parameter'].sudo().get_param( + 'filter_mode_portal') + available_products_for_guest_ids = literal_eval( + self.env['ir.config_parameter'].sudo().get_param( + 'website_product_visibility.available_products_for_guest_ids', + 'False')) or [] + available_products_for_portal_ids = literal_eval( + self.env['ir.config_parameter'].sudo().get_param( + 'website_product_visibility.available_products_for_portal_ids', + 'False')) or [] + available_cat_for_guest_ids = literal_eval( + self.env['ir.config_parameter'].sudo().get_param( + 'website_product_visibility.available_cat_for_guest_ids', + 'False')) or [] + available_cat_for_portal_ids = literal_eval( + self.env['ir.config_parameter'].sudo().get_param( + 'website_product_visibility.available_cat_for_portal_ids', + 'False')) or [] + res.update( + product_visibility_guest_user=product_visibility_guest_user, + product_visibility_portal_user=product_visibility_portal_user, + filter_mode=filter_mode if filter_mode else 'product_only', + filter_mode_portal=filter_mode_portal if filter_mode_portal + else 'product_only', + available_products_for_guest_ids=[ + (6, 0, available_products_for_guest_ids)], + available_products_for_portal_ids=[ + (6, 0, available_products_for_portal_ids)], + available_cat_for_guest_ids=[(6, 0, available_cat_for_guest_ids)], + available_cat_for_portal_ids=[(6, 0, available_cat_for_portal_ids)] + ) + return res diff --git a/product_visibility_website/models/website_product_visibility.py b/product_visibility_website/models/website_product_visibility.py index 627ab1bf6..828dc9450 100644 --- a/product_visibility_website/models/website_product_visibility.py +++ b/product_visibility_website/models/website_product_visibility.py @@ -21,7 +21,6 @@ # ################################################################################ from odoo import fields, models, api -from ast import literal_eval class ProductVisibility(models.Model): @@ -64,78 +63,3 @@ class ProductVisibility(models.Model): if self.filter_mode == 'null': self.website_available_cat_ids = None self.website_available_product_ids = None - - -class WebsiteGuestVisibility(models.TransientModel): - """Inherit the model res.config.settings for adding the fields for - selecting the product for visitors""" - _inherit = 'res.config.settings' - - product_visibility_guest_user = fields.Boolean( - string="Product visibility Guest User", help="Product Visibility") - filter_mode = fields.Selection([('product_only', 'Product Wise'), - ('categ_only', 'Category Wise')], - string='Filter Mode', default='product_only') - available_product_ids = fields.Many2many('product.template', - string='Available Product', - domain="[('is_published', '=', " - "True)]", - help='The website will only ' - 'display products which are ' - 'within one of the selected' - ' category trees. If no' - ' category is specified,' - 'all available products ' - 'will be shown') - available_cat_ids = fields.Many2many('product.public.category', - string='Available Product Categories', - help='The website will only display ' - 'products which are selected.' - ' If no product is specified,' - 'all available products will be ' - 'shown') - - @api.model - def set_values(self): - res = super(WebsiteGuestVisibility, self).set_values() - self.env['ir.config_parameter'].sudo().set_param( - 'product_visibility_guest_user', - self.product_visibility_guest_user) - self.env['ir.config_parameter'].sudo().set_param('filter_mode', - self.filter_mode) - if not self.product_visibility_guest_user: - self.available_cat_ids = None - self.available_product_ids = None - self.env['ir.config_parameter'].sudo().set_param('filter_mode', - 'product_only') - if self.filter_mode == 'product_only': - self.available_cat_ids = None - elif self.filter_mode == 'categ_only': - self.available_product_ids = None - self.env['ir.config_parameter'].sudo().set_param( - 'website_product_visibility.available_product_ids', - self.available_product_ids.ids) - self.env['ir.config_parameter'].sudo().set_param( - 'website_product_visibility.available_cat_ids', - self.available_cat_ids.ids) - return res - - @api.model - def get_values(self): - res = super(WebsiteGuestVisibility, self).get_values() - product_ids = literal_eval( - self.env['ir.config_parameter'].sudo().get_param( - 'website_product_visibility.available_product_ids', 'False')) - cat_ids = literal_eval(self.env['ir.config_parameter'].sudo().get_param( - 'website_product_visibility.available_cat_ids', 'False')) - mod = self.env['ir.config_parameter'].sudo().get_param('filter_mode') - if mod: - res.update( - product_visibility_guest_user=self.env[ - 'ir.config_parameter'].sudo().get_param( - 'product_visibility_guest_user'), - filter_mode=mod if mod else 'product_only', - available_product_ids=[(6, 0, product_ids)], - available_cat_ids=[(6, 0, cat_ids)], - ) - return res diff --git a/product_visibility_website/static/description/assets/screenshots/10.png b/product_visibility_website/static/description/assets/screenshots/10.png index 58d6c0fe5..0bc62b8a1 100644 Binary files a/product_visibility_website/static/description/assets/screenshots/10.png and b/product_visibility_website/static/description/assets/screenshots/10.png differ diff --git a/product_visibility_website/static/description/assets/screenshots/11.png b/product_visibility_website/static/description/assets/screenshots/11.png new file mode 100644 index 000000000..ddd7e7317 Binary files /dev/null and b/product_visibility_website/static/description/assets/screenshots/11.png differ diff --git a/product_visibility_website/static/description/assets/screenshots/12.png b/product_visibility_website/static/description/assets/screenshots/12.png new file mode 100644 index 000000000..b791673d7 Binary files /dev/null and b/product_visibility_website/static/description/assets/screenshots/12.png differ diff --git a/product_visibility_website/static/description/assets/screenshots/13.png b/product_visibility_website/static/description/assets/screenshots/13.png new file mode 100644 index 000000000..02ce89cf4 Binary files /dev/null and b/product_visibility_website/static/description/assets/screenshots/13.png differ diff --git a/product_visibility_website/static/description/assets/screenshots/14.png b/product_visibility_website/static/description/assets/screenshots/14.png new file mode 100644 index 000000000..c2e844bf2 Binary files /dev/null and b/product_visibility_website/static/description/assets/screenshots/14.png differ diff --git a/product_visibility_website/static/description/assets/screenshots/15.png b/product_visibility_website/static/description/assets/screenshots/15.png new file mode 100644 index 000000000..58d6c0fe5 Binary files /dev/null and b/product_visibility_website/static/description/assets/screenshots/15.png differ diff --git a/product_visibility_website/static/description/assets/screenshots/6.png b/product_visibility_website/static/description/assets/screenshots/6.png index ddd7e7317..d756cbc52 100644 Binary files a/product_visibility_website/static/description/assets/screenshots/6.png and b/product_visibility_website/static/description/assets/screenshots/6.png differ diff --git a/product_visibility_website/static/description/assets/screenshots/7.png b/product_visibility_website/static/description/assets/screenshots/7.png index b791673d7..b54fe976d 100644 Binary files a/product_visibility_website/static/description/assets/screenshots/7.png and b/product_visibility_website/static/description/assets/screenshots/7.png differ diff --git a/product_visibility_website/static/description/assets/screenshots/8.png b/product_visibility_website/static/description/assets/screenshots/8.png index 02ce89cf4..8a2d0df42 100644 Binary files a/product_visibility_website/static/description/assets/screenshots/8.png and b/product_visibility_website/static/description/assets/screenshots/8.png differ diff --git a/product_visibility_website/static/description/assets/screenshots/9.png b/product_visibility_website/static/description/assets/screenshots/9.png index c2e844bf2..29d3c2700 100644 Binary files a/product_visibility_website/static/description/assets/screenshots/9.png and b/product_visibility_website/static/description/assets/screenshots/9.png differ diff --git a/product_visibility_website/static/description/index.html b/product_visibility_website/static/description/index.html index 585f255bd..ec5764098 100644 --- a/product_visibility_website/static/description/index.html +++ b/product_visibility_website/static/description/index.html @@ -1,19 +1,20 @@
- + style="border-bottom: 1px solid #875A7B; padding: 15px; display: flex; justify-content: space-between; align-items: center;"> +
+ class="mr-2"> Community
+ class="mr-2"> Enterprise
+ class="mr-2"> Odoo.sh
@@ -21,66 +22,72 @@ -

Website Product Visibility

-

Website Product visibility for logged in and logged out users/Visitors

+

+ Website Product Visibility

+

+ Website Product visibility for logged in and logged out + users/Visitors

+ style="width: 75%; height: auto; position: absolute; margin-left: auto; margin-right: auto; top: 45%; left: 12%; right: auto;"/>
-
+
- + style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;"> +
-

Explore This +

+ Explore This Module

@@ -88,134 +95,222 @@ -
+
- + style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;"> +
-

Overview +

+ Overview

-
+
- This module helps you to make visible only the filtered products and product categories for a logged in and logged out users/visitors. - Also, it enables the user to search products and product categories only from those available products and categories. + This module helps you to make visible only the filtered products and + product categories for a logged in and logged out users/visitors. + Also, it enables the user to search products and product categories only + from those available products and categories.
-
+
- + style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;"> +
-

Features +

+ Features

-
+
-
- +
+ Filter according to the logged users

- Filter product and product categories according to the logged user.

+ Filter product and product categories according to the logged + user.

-
- +
+ Filter according to the public users/visitors

- Filter product and product categories according to the public users/visitors.

+ Filter product and product categories according to the public + users/visitors.

-
- +
+ Restrict user searches to available product/category only

- User can only search product and category among from the available product/category.

-
+ User can only search product and category among from the + available product/category.

+
-
+
- + style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;"> +
-

Screenshots +

+ Screenshots

-

Set filter for a logged user

-

Setting the filtering mode for a logged user.

+

+ Set filter for a logged user

+

+ Setting the filtering mode for a logged user.

-

Product wise filtering for website shop (Logged in Users)

-

Product wise filtering mode for logged user in website shop.

+

+ Product wise filtering for website shop (Logged in Users)

+

+ Product wise filtering mode for logged user in website shop.

-

Product wise visibility for website shop (Product wise)

-

Product visibility (Product wise) for the logged user in website shop.

+

+ Product wise visibility for website shop (Product wise)

+

+ Product visibility (Product wise) for the logged user in website + shop.

- - - -
-

Category wise filtering for website shop (Logged in Users)

-

Category wise filtering mode for logged user in website shop.

+
+

+ Category wise filtering for website shop (Logged in Users)

+

+ Category wise filtering mode for logged user in website + shop.

-
-

Product visibility for website shop (Category wise)

-

Product visibility (Category wise) for the logged user in website shop.

+
+

+ Product visibility for website shop (Category wise)

+

+ Product visibility (Category wise) for the logged user in + website shop.

-
-

Product wise filtering for website shop (Visitors)

-

Product wise filtering mode for the visitors in the website shop.

+
+

+ Product wise filtering for website shop (Portal Users)

+

+ Product wise filtering mode for the portal users in the website + shop.

-
-

Product wise visibility for website shop (Visitors)

-

Product visibility (Product wise) for the visitors in website shop.

+
+

+ Set filter for a portal user

+

+ Setting the filtering mode for a portal user as No Filter.

-
-

Category wise filtering for website shop (Visitors)

-

Category wise filtering mode for the visitors in the website shop.

+
+

+ Product wise visibility for website shop (Portal Users)

+

+ Product visibility (Product wise) for the portal users in + website shop when no filter is set for them.

-
-

Product visibility for website shop visitors (Category wise)

-

Product visibility (Category wise) for the visitors in website shop.

+
+

+ Category wise filtering for website shop (Portal Users)

+

+ Category wise filtering mode for the portal users in the website + shop.

-

Search available product from the list

-

Search product from the available product list.

+

+ Product visibility for website shop portal users (Category + wise)

+

+ Product visibility (Category wise) for the portal users in + website shop when no filter is set for them.

+
+

+ Product wise filtering for website shop (Visitors)

+

+ Product wise filtering mode for the visitors in the website + shop.

+ +
+
+

+ Product wise visibility for website shop (Visitors)

+

+ Product visibility (Product wise) for the visitors in website + shop.

+ +
+
+

+ Category wise filtering for website shop (Visitors)

+

+ Category wise filtering mode for the visitors in the website + shop.

+ +
+
+

+ Product visibility for website shop visitors (Category + wise)

+

+ Product visibility (Category wise) for the visitors in website + shop.

+ +
+
+

+ Search available product from the list

+

+ Search product from the available product list.

+ +
-
+
- + style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;"> +
-

Related +

+ Related Products

@@ -225,65 +320,89 @@