Skip to content

Commit

Permalink
[ADD] website_sale_infinite_scroll: add module
Browse files Browse the repository at this point in the history
  • Loading branch information
dessanhemrayev committed May 10, 2023
1 parent 12263d2 commit be1e802
Show file tree
Hide file tree
Showing 23 changed files with 573 additions and 0 deletions.
6 changes: 6 additions & 0 deletions setup/website_sale_infinite_scroll/setup.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
import setuptools

setuptools.setup(
setup_requires=['setuptools-odoo'],
odoo_addon=True,
)
Empty file.
5 changes: 5 additions & 0 deletions website_sale_infinite_scroll/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
# Copyright 2020 Advitus MB
# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl-3.0).

from . import models
from . import controllers
20 changes: 20 additions & 0 deletions website_sale_infinite_scroll/__manifest__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
# Copyright 2020 Advitus MB
# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl-3.0).

{
"name": "eCommerce Infinite Scroll",
"category": "Website",
"version": "14.0.1.0.0",
"author": "Advitus MB, Ooops, Cetmix, Odoo Community Association (OCA)",
"website": "https://github.com/OCA/e-commerce",
"license": "LGPL-3",
"depends": ["website_sale"],
"data": [
"views/assets.xml",
"views/templates.xml",
"views/res_config_settings.xml",
],
"maintainers": ["dessanhemrayev", "CetmixGitDrone"],
"application": False,
"installable": True,
}
4 changes: 4 additions & 0 deletions website_sale_infinite_scroll/controllers/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
# Copyright 2020 Advitus MB
# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl-3.0).

from . import main
75 changes: 75 additions & 0 deletions website_sale_infinite_scroll/controllers/main.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
# Copyright 2020 Advitus MB
# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl-3.0).

from odoo import http
from odoo.http import request

from odoo.addons.website_sale.controllers.main import WebsiteSale


class WebsiteSaleInfinityScroll(WebsiteSale):
@http.route()
def shop(self, page=0, category=None, ppg=False, search="", **post):
res = super().shop(
page=page,
category=category,
search=search,
ppg=self._get_shop_ppg(ppg),
**post
)
return request.render("website_sale.products", res.qcontext)

def _get_shop_ppg(self, ppg):
return (
request.website.infinity_scroll_ppg
if request.website.viewref("website_sale_infinite_scroll.scroll_products")
.sudo()
.active
else ppg
)

@http.route(
[
"""/website_sale_infinite_scroll""",
"""/website_sale_infinite_scroll/""" """page/<int:page>""",
"""/website_sale_infinite_scroll/"""
"""category/<model("product.public.category", """
""""[('website_id', 'in', (False, current_website_id))]")"""
""":category>""",
"""/website_sale_infinite_scroll/category/"""
"""<model("product.public.category", "[('website_id', 'in', """
"""(False, current_website_id))]"):category>/page/<int:page>""",
],
type="http",
auth="public",
methods=["POST"],
website=True,
)
def website_sale_infinite_scroll_get_page(
self, page=0, category=None, search="", ppg=False, **post
):
res = super().shop(page=page, category=category, search=search, ppg=ppg, **post)
if page > res.qcontext["pager"]["page_count"]:
return False
return request.render(
"website_sale_infinite_scroll.infinite_products",
res.qcontext,
)

@http.route(
["/infinite_scroll_preloader"],
type="http",
auth="public",
website=True,
multilang=False,
sitemap=False,
)
def get_website_sale_infinite_scroll_preloader(self):
website = request.website
response = request.redirect(
website.image_url(website, "infinite_scroll_preloader"), code=301
)
response.headers["Cache-Control"] = (
"public, max-age=%s" % http.STATIC_CACHE_LONG
)
return response
2 changes: 2 additions & 0 deletions website_sale_infinite_scroll/models/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
from . import website
from . import res_config_settings
10 changes: 10 additions & 0 deletions website_sale_infinite_scroll/models/res_config_settings.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
from odoo import fields, models


class ResConfigSettings(models.TransientModel):
_inherit = "res.config.settings"

website_sale_infinite_scroll_preloader = fields.Binary(
related="website_id.infinite_scroll_preloader",
readonly=False,
)
23 changes: 23 additions & 0 deletions website_sale_infinite_scroll/models/website.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
import base64

from odoo import fields, models, tools
from odoo.modules.module import get_resource_path


class Website(models.Model):

_inherit = "website"
_description = "Website"

def _default_preloader(self):
img_path = get_resource_path("web", "static/src/img/throbber-large.gif")
with tools.file_open(img_path, "rb") as f:
return base64.b64encode(f.read())

infinite_scroll_preloader = fields.Binary(
string="eCommerce Infinite Scroll", default=_default_preloader
)
infinity_scroll_ppg = fields.Integer(
default=21,
string="Number of products in the grid on the shop for infinity scroll",
)
2 changes: 2 additions & 0 deletions website_sale_infinite_scroll/readme/CONFIGURE.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
To select different preload go to * General Settings > Website:
- "Website sale infinite scroll preloader" change preloader;
2 changes: 2 additions & 0 deletions website_sale_infinite_scroll/readme/CONTRIBUTORS.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
* Cetmix <https://cetmix.com>
* Dessan Hemrayev <dessanhemrayev@gmail.com>
1 change: 1 addition & 0 deletions website_sale_infinite_scroll/readme/DESCRIPTION.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
This module removes pagination in /shop page and replaces it with infinite scrolling of products.
1 change: 1 addition & 0 deletions website_sale_infinite_scroll/readme/USAGE.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Go to /shop page > Customize > activate "Infinite Products Scroll"
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
98 changes: 98 additions & 0 deletions website_sale_infinite_scroll/static/src/js/main.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
odoo.define("website_sale_infinite_scroll.main", function (require) {
"use strict";

var sAnimations = require("website.content.snippets.animation");
var ajax = require("web.ajax");
var core = require("web.core");
var _t = core._t;

sAnimations.registry.infinite_scroll = sAnimations.Class.extend({
selector: "#wrapwrap",
allow_load: true,
init: function () {
var self = this;
this._super.apply(this, arguments);
// Parse current page number and compute next one
var current_url = window.location.pathname;

if (current_url.indexOf("/shop") !== -1 && self._check_pagination()) {
var current_arguments = window.location.search;
self.current_page = 1;
if (current_url.indexOf("/page") === -1) {
current_url = current_url.replace(
"/shop",
"/shop/page/" + self.current_page
);
}
var match = current_url.match(/\/page\/(\d*)/);
self.current_page = match[1];
current_url = current_url.replace("/page/" + self.current_page, "");
self.next_page = self.current_page;
// Build fetch endpoint url
self.fetch_url =
current_url.replace("/shop", "/website_sale_infinite_scroll") +
"/page/" +
self.next_page +
current_arguments;
}
},

start: function () {
var current_url = window.location.pathname;
if (current_url.indexOf("/shop") !== -1) {
var self = this;
const container = this.el;
container.addEventListener("scroll", () => {
if (self._check_pagination()) {
self._onScroll();
}
});
}
},
_check_pagination: function () {
var pagination = document.querySelector(".products_pager .pagination");
if (!pagination) return false;
var style = window.getComputedStyle(pagination).display;
return style === "none";
},

load_next_page: function () {
var self = this;
self.next_page++;
// Set page in fetch url
var url = self.fetch_url.replace(
"/page/" + self.current_page,
"/page/" + self.next_page
);

// Add spinner
var $spinner = $("<span/>", {
class: "website_sale_infinite_scroll-spinner",
text: _t("Loading more products..."),
});
self.$el.append($spinner);
ajax.post(url, {}).then(function (table) {
// Remove spinner
self.$el.find(".website_sale_infinite_scroll-spinner").remove();
// Append table
if (table) {
self.$("tbody").append(table);
self.allow_load = true;
} else {
self.allow_load = false;
}
});
},

_onScroll: function () {
var self = this;
var documentRect = document.documentElement.getBoundingClientRect();
if (
documentRect.bottom < document.documentElement.clientHeight + 100 &&
self.allow_load
) {
self.load_next_page();
}
},
});
});
32 changes: 32 additions & 0 deletions website_sale_infinite_scroll/static/src/js/toors/toor.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
odoo.define("website_sale_infinite_scroll.tour", function (require) {
"use strict";

var tour = require("web_tour.tour");

var steps = [
{
trigger: "#wrapwrap",
run: function () {
window.location.href = "/website_sale_infinite_scroll/page/2";
},
},
{
trigger: "#wrapwrap",
run: function () {
window.location.href = "/shop";
window.location.href = "/website_sale_infinite_scroll/page/1000";
},
},
];
tour.register(
"website_sale_infinite_scroll",
{
url: "/shop",
test: true,
},
steps
);
return {
steps: steps,
};
});
44 changes: 44 additions & 0 deletions website_sale_infinite_scroll/static/src/scss/main.scss
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
.website_sale_infinite_scroll-spinner {
text-align: center;
margin: 0 auto;
display: block;
background: url(/infinite_scroll_preloader) center top no-repeat;
padding-top: 115px;
margin-top: 30px;
}

#scrollUp {
color: rgba(0, 0, 0, 0.7) !important;
mix-blend-mode: unset !important;
}

.website_sale_infinite_scroll_custom {
> form {
height: 100%;
height: -moz-available; /* WebKit-based browsers will ignore this. */
height: -webkit-fill-available; /* Mozilla-based browsers will ignore this. */
height: fill-available;
}
}

/* Safari only */

@media not all and (min-resolution: 0.001dpcm) {
/* Styles only for Safari 6 and earlier versions */
.only-safari {
padding-bottom: 0.75rem !important;
}
}

/* Styles only for Safari 7 and later */
_::-webkit-full-page-media,
_:future,
:root .only-safari {
padding-bottom: 0.75rem !important;
}

@media not all and (min-resolution: 0.001dpcm) and (-webkit-min-device-pixel-ratio: 0) and (min-color-index: 0) {
.only-safari {
padding-bottom: 0.75rem !important;
}
}
1 change: 1 addition & 0 deletions website_sale_infinite_scroll/tests/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
from . import test_website_sale_infinite_scroll
Loading

0 comments on commit be1e802

Please sign in to comment.