19.0 vanilla

This commit is contained in:
Ernad Husremovic 2026-03-09 09:32:12 +01:00
parent 79f83631d5
commit 73afc09215
6267 changed files with 1534193 additions and 1130106 deletions

View file

@ -1,50 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<template name="Add to Cart Button" id="s_add_to_cart">
<div class="s_add_to_cart">
<button class="s_add_to_cart_btn disabled btn btn-secondary mb-2">
<!--
TODO: `.oe_website_sale` is used as a selector in `tracking.js`. This
is a temporary solution to load the tracking utilities and will be removed once
tracking utilities will be fully integrated into a service.
-->
<div class="s_add_to_cart oe_website_sale" data-action="add_to_cart">
<button type="button" class="s_add_to_cart_btn disabled btn btn-secondary mb-2" data-action="add_to_cart">
<i class="fa fa-cart-plus me-2"/>Add to Cart
</button>
</div>
</template>
<template id="s_add_to_cart_options" inherit_id="website.snippet_options">
<xpath expr="." position="inside">
<div data-js="AddToCart"
data-selector=".s_add_to_cart">
<we-row>
<we-many2one string="Product"
data-model="product.template"
data-set-product-template=""
data-name="product_template_picker_opt"
data-no-preview="true"
data-domain='[["is_published", "=", true], ["sale_ok", "=", true]]'
/>
<we-button data-name="product_template_reset_opt"
class="reset-product-picker align-self-end fa fa-fw fa-times">
</we-button>
</we-row>
<we-row>
<we-many2one-default-message string="Variant" class="o_we_sublevel_1"
data-model="product.product"
data-set-product-variant=""
data-name="product_variant_picker_opt"
data-no-preview="true"
data-default-message="Visitor's Choice"
/>
<we-button data-name="product_variant_reset_opt"
class="reset-variant-picker align-self-end fa fa-fw fa-times">
</we-button>
</we-row>
<we-select data-name="action_picker_opt" string="Action" data-no-preview="true">
<we-button data-set-action="add_to_cart">Add to Cart</we-button>
<we-button data-set-action="buy_now">Buy Now</we-button>
</we-select>
</div>
</xpath>
</template>
<record id="website_sale.s_add_to_cart_000_js" model="ir.asset">
<field name="name">Add to Cart 000 JS</field>
<field name="bundle">web.assets_frontend</field>
<field name="path">website_sale/static/src/snippets/s_add_to_cart/000.js</field>
</record>
</odoo>

View file

@ -0,0 +1,28 @@
<?xml version="1.0" encoding="UTF-8"?>
<odoo>
<template
id="website_sale.s_dynamic_snippet_category_template"
inherit_id="website.s_dynamic_snippet_template"
primary="True"
>
<xpath expr="//section[contains(@t-attf-class, 's_dynamic_snippet_title')]/*" position="replace">
<div>
<h2 class="h3">Crafting Beautiful Spaces</h2>
<p class="lead">Designing elegant, inviting environments that inspire and delight.</p>
</div>
</xpath>
</template>
<template id="s_dynamic_snippet_category_list" name="Category List">
<t t-call="website_sale.s_dynamic_snippet_category_template">
<t t-set="snippet_name" t-value="'s_dynamic_snippet_category_list'"/>
<t
t-set="snippet_classes"
t-value="'oe_website_sale s_dynamic_category_clickable_items
s_dynamic_snippet_category s_dynamic_category_no_arrows'"
/>
<t t-set="main_page_url" t-value="'/shop'"/>
<t t-call="website_sale.s_dynamic_snippet_category_preview_data"/>
</t>
</template>
</odoo>

View file

@ -0,0 +1,135 @@
<?xml version="1.0" encoding="UTF-8"?>
<odoo>
<template id="s_dynamic_snippet_category_preview_data" name="Category List Preview Data">
<div
class="o_category_container d-grid gap-2 rounded-2"
contenteditable="false"
style="--DynamicCategory-columns: 4; grid-auto-rows: minmax(5vh, auto);"
>
<div class="d-contents o_not_editable" contenteditable="false">
<div
class="s_dynamic_category_item bg-black position-relative overflow-hidden"
role="article"
style="grid-row: span 2;"
>
<img
name="category_image"
alt="Desks"
class="o_category_image img-fluid position-absolute w-100 h-100 object-fit-cover"
src="/website_sale/static/src/img/categories/desks.jpg"
/>
<div
class="position-relative w-100 h-100 p-3 bg-black-25"
>
<h4 class="position-absolute start-50 top-50 translate-middle">Desks</h4>
</div>
</div>
<div
class="s_dynamic_category_item bg-black position-relative overflow-hidden"
role="article"
style="grid-row: span 2;"
>
<img
name="category_image"
alt="Furnitures"
class="o_category_image img-fluid position-absolute w-100 h-100 object-fit-cover"
src="/website_sale/static/src/img/categories/furnitures.jpg"
/>
<div class="position-relative w-100 h-100 p-3 bg-black-25">
<h4 class="position-absolute start-50 top-50 translate-middle">Furnitures</h4>
</div>
</div>
<div
class="s_dynamic_category_item bg-black position-relative overflow-hidden"
role="article"
style="grid-row: span 2;"
>
<img
name="category_image"
alt="Boxes"
class="o_category_image img-fluid position-absolute w-100 h-100 object-fit-cover"
src="/website_sale/static/src/img/categories/boxes.jpg"
/>
<div class="position-relative w-100 h-100 p-3 bg-black-25">
<h4 class="position-absolute start-50 top-50 translate-middle">Boxes</h4>
</div>
</div>
<div
class="s_dynamic_category_item bg-black position-relative overflow-hidden"
role="article"
style="grid-row: span 2;"
>
<img
name="category_image"
alt="Drawers"
class="o_category_image img-fluid position-absolute w-100 h-100 object-fit-cover"
src="/website_sale/static/src/img/categories/drawers.jpg"
/>
<div class="position-relative w-100 h-100 p-3 bg-black-25">
<h4 class="position-absolute start-50 top-50 translate-middle">Drawers</h4>
</div>
</div>
<div
class="s_dynamic_category_item position-relative bg-black overflow-hidden"
role="article"
style="grid-row: span 2;"
>
<img
name="category_image"
alt="Cabinets"
class="o_category_image img-fluid position-absolute w-100 h-100 object-fit-cover"
src="/website_sale/static/src/img/categories/cabinets.jpg"
/>
<div class="position-relative w-100 h-100 p-3 bg-black-25">
<h4 class="position-absolute start-50 top-50 translate-middle">Cabinets</h4>
</div>
</div>
<div
class="s_dynamic_category_item position-relative bg-black overflow-hidden"
role="article"
style="grid-row: span 2;"
>
<img
name="category_image"
alt="Bins"
class="o_category_image img-fluid position-absolute w-100 h-100 object-fit-cover"
src="/website_sale/static/src/img/categories/bins.jpg"
/>
<div class="position-relative w-100 h-100 p-3 bg-black-25">
<h4 class="position-absolute start-50 top-50 translate-middle">Bins</h4>
</div>
</div>
<div
class="s_dynamic_category_item position-relative bg-black overflow-hidden"
role="article"
style="grid-row: span 2;"
>
<img
name="category_image"
alt="Lamps"
class="o_category_image img-fluid position-absolute w-100 h-100 object-fit-cover"
src="/website_sale/static/src/img/categories/lamps.jpg"
/>
<div class="position-relative w-100 h-100 p-3 bg-black-25">
<h4 class="position-absolute start-50 top-50 translate-middle">Lamps</h4>
</div>
</div>
<div
class="s_dynamic_category_item position-relative bg-black overflow-hidden"
role="article"
style="grid-row: span 2;"
>
<img
name="category_image"
alt="Services"
class="o_category_image img-fluid position-absolute w-100 h-100 object-fit-cover"
src="/website_sale/static/src/img/categories/services.jpg"
/>
<div class="position-relative w-100 h-100 p-3 bg-black-25">
<h4 class="position-absolute start-50 top-50 translate-middle">Services</h4>
</div>
</div>
</div>
</div>
</template>
</odoo>

View file

@ -1,46 +1,40 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- Snippet -->
<template id="s_dynamic_snippet_products" name="Products">
<t t-call="website.s_dynamic_snippet_template">
<t t-set="snippet_name" t-value="'s_dynamic_snippet_products'"/>
<t
t-set="default_design_classes"
t-value="request and request.env['website'].get_current_website().shop_opt_products_design_classes or ''"
/>
<t
t-if="'o_wsale_products_opt_layout_catalog' not in default_design_classes"
t-set="default_design_classes"
t-value="'o_wsale_products_opt_name_color_regular
o_wsale_products_opt_thumb_cover o_wsale_products_opt_img_secondary_show
o_wsale_products_opt_img_hover_zoom_out_light o_wsale_products_opt_cc1
o_wsale_products_opt_rounded_2 o_wsale_products_opt_layout_catalog
o_wsale_products_opt_design_thumbs o_wsale_products_opt_has_description
o_wsale_products_opt_name_size_body o_wsale_products_opt_actions_onhover
o_wsale_products_opt_wishlist_fixed o_wsale_products_opt_actions_theme
o_wsale_products_opt_has_cta'"
/>
<!--
TODO: `.oe_website_sale` is used as a selector in `tracking.js`. This
is a temporary solution to load the tracking utilities and will be removed once
tracking utilities will be fully integrated into a service.
-->
<t
t-set="snippet_classes"
t-value="'oe_website_sale ' + default_design_classes"
/>
<t t-set="main_page_url" t-value="'/shop'"/>
<t t-call="website_sale.s_dynamic_snippet_products_preview_data"/>
</t>
</template>
<template id="s_dynamic_snippet_products_options" inherit_id="website.snippet_options">
<xpath expr="." position="inside">
<t t-call="website.dynamic_snippet_carousel_options_template">
<t t-set="snippet_name" t-value="'dynamic_snippet_products'"/>
<t t-set="snippet_selector" t-value="'.s_dynamic_snippet_products'"/>
</t>
</xpath>
</template>
<template id="s_dynamic_snippet_products_template_options" inherit_id="website.s_dynamic_snippet_options_template">
<xpath expr="//we-select[@data-name='filter_opt']" position="after">
<t t-if="snippet_name == 'dynamic_snippet_products'">
<we-select string="Category" data-name="product_category_opt" data-attribute-name="productCategoryId" data-no-preview="true">
<we-button data-select-data-attribute="all">All Products</we-button>
<we-button data-select-data-attribute="current">Current Category or All</we-button>
</we-select>
<t t-set="domain" t-translation="off">["|", ["website_id", "=", false], ["website_id", "=", <t t-out="current_website.id"/>]]</t>
<we-many2many string="Tags"
data-name="product_tag_opt"
data-attribute-name="productTagIds"
data-no-preview="true"
data-model="product.tag"
t-att-data-domain="domain"
data-allow-delete="true"
data-fakem2m="true"
data-select-data-attribute=""/>
<we-input string="Product names" class="o_we_large" data-name="product_names_opt"
data-attribute-name="productNames" data-no-preview="true" data-select-data-attribute=""
placeholder="e.g. lamp,bin" title="Comma-separated list of parts of product names, barcodes or internal reference"/>
</t>
</xpath>
</template>
<record id="website_sale.s_dynamic_snippet_products_000_js" model="ir.asset">
<field name="name">Dynamic snippet products 000 JS</field>
<field name="bundle">web.assets_frontend</field>
<field name="path">website_sale/static/src/snippets/s_dynamic_snippet_products/000.js</field>
</record>
<!-- Multi record snippets (coming soon...) -->
<!-- Single record snippets (coming soon...) -->
</odoo>

View file

@ -0,0 +1,95 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<template id="s_dynamic_snippet_products_preview_data" name="Products Preview Data">
<div class="carousel slide s_dialog_preview">
<div class="carousel-inner row w-100 mx-auto">
<div role="option" class="carousel-item active" style="min-height: 357.875px;">
<div class="row">
<div class="d-flex flex-grow-0 flex-shrink-0 col-3">
<div class="o_carousel_product_card bg-transparent w-100 card border-0">
<a class="o_carousel_product_img_link o_dynamic_product_hovered stretched-link" href="#">
<div class="overflow-hidden rounded">
<img class="card-img-top o_img_product_square o_img_product_cover h-auto" loading="lazy" src="/website_sale/static/src/img/product_previews/product_1.jpg"/>
</div>
</a>
<div class="o_carousel_product_card_body d-flex flex-wrap flex-column justify-content-between h-100 p-3">
<div class="h6 card-title">Three-Seat Sofa</div>
<div>
<div class="mt-2">
<span class="fw-bold" name="product_price" data-oe-type="monetary" data-oe-expression="data['price']">
<span class="oe_currency_value">1,500.00</span>
</span>
</div>
</div>
</div>
</div>
</div>
<div class="d-flex flex-grow-0 flex-shrink-0 col-3">
<div class="o_carousel_product_card bg-transparent w-100 card border-0">
<a class="o_carousel_product_img_link o_dynamic_product_hovered stretched-link" href="#">
<div class="overflow-hidden rounded">
<img class="card-img-top o_img_product_square o_img_product_cover h-auto" loading="lazy" src="/website_sale/static/src/img/product_previews/product_2.jpg" alt="Warranty (2 year)"/>
</div>
</a>
<div class="o_carousel_product_card_body d-flex flex-wrap flex-column justify-content-between h-100 p-3">
<div class="h6 card-title">Customizable Desk</div>
<div>
<div class="mt-2">
<span class="fw-bold" name="product_price" data-oe-type="monetary" data-oe-expression="data['price']">
<span class="oe_currency_value">750.00</span>
</span>
</div>
</div>
</div>
</div>
</div>
<div class="d-flex flex-grow-0 flex-shrink-0 col-3">
<div class="o_carousel_product_card bg-transparent w-100 card border-0">
<a class="o_carousel_product_img_link o_dynamic_product_hovered stretched-link" href="#">
<div class="overflow-hidden rounded">
<img class="card-img-top o_img_product_square o_img_product_cover h-auto" loading="lazy" src="/website_sale/static/src/img/product_previews/product_3.jpg" alt="Warranty (2 year)"/>
</div>
</a>
<div class="o_carousel_product_card_body d-flex flex-wrap flex-column justify-content-between h-100 p-3">
<div class="h6 card-title">Conference Chair</div>
<div>
<div class="mt-2">
<span class="fw-bold" name="product_price" data-oe-type="monetary" data-oe-expression="data['price']">
<span class="oe_currency_value">33.00</span>
</span>
</div>
</div>
</div>
</div>
</div>
<div class="d-flex flex-grow-0 flex-shrink-0 col-3">
<div class="o_carousel_product_card bg-transparent w-100 card border-0">
<a class="o_carousel_product_img_link o_dynamic_product_hovered stretched-link" href="#">
<div class="overflow-hidden rounded">
<img class="card-img-top o_img_product_square o_img_product_cover h-auto" loading="lazy" src="/website_sale/static/src/img/product_previews/product_4.jpg" alt="Warranty (2 year)"/>
</div>
</a>
<div class="o_carousel_product_card_body d-flex flex-wrap flex-column justify-content-between h-100 p-3">
<div class="h6 card-title">Cabinet with Doors</div>
<div>
<div class="mt-2">
<span class="fw-bold" name="product_price" data-oe-type="monetary" data-oe-expression="data['price']">
<span class="oe_currency_value">140.00</span>
</span>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<a class="carousel-control-prev" data-bs-slide="prev" role="button" aria-label="Previous" title="Previous" href="#s_dynamic_snippet_1">
<span class="fa fa-chevron-circle-left fa-2x"></span>
</a>
<a class="carousel-control-next" data-bs-slide="next" role="button" aria-label="Next" title="Next" href="#s_dynamic_snippet_1">
<span class="fa fa-chevron-circle-right fa-2x"></span>
</a>
</div>
</template>
</odoo>

View file

@ -0,0 +1,48 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<template
id="website_sale.s_mega_menu_big_icons_subtitles"
name="eCommerce: Menu - Big icons &amp; subtitles"
groups="base.group_user"
>
<section
class="s_mega_menu_big_icons_subtitles pt24 pb24 o_colored_level o_cc o_cc1"
data-oe-shape-data="{'shape':'html_builder/Grids/07','colors':{'c5':'o-color-3'},'flip':[]}"
>
<div class="o_we_shape o_html_builder_Grids_07" style="background-image: url('/html_editor/shape/html_builder/Grids/07.svg?c5=o-color-3');"/>
<div class="container">
<div class="row">
<t
t-foreach="request.env['product.public.category'].search([
('parent_id', '=', False), ('has_published_products', '=', True),
], limit=9)"
t-as="category"
>
<div class="col-12 col-lg-4">
<nav class="nav flex-column w-100">
<a
t-att-href="'/shop/category/%s' % category.id"
class="col-lg-4 nav-link px-2 my-2 rounded text-wrap"
>
<div class="d-flex align-items-center">
<img
t-if="category.image_1920"
t-att-src="image_data_uri(category.image_1920)"
class="fa rounded rounded-circle shadow me-3"
alt=""
/>
<div class="flex-grow-1">
<h4 class="mt-0 mb-0" t-esc="category.name"/>
</div>
</div>
</a>
</nav>
</div>
</t>
</div>
</div>
</section>
</template>
</odoo>

View file

@ -0,0 +1,40 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<template
id="website_sale.s_mega_menu_cards"
name="eCommerce: Menu - Cards"
groups="base.group_user"
>
<section class="s_mega_menu_cards pt16 pb16 o_colored_level o_cc o_cc1">
<div class="container">
<nav class="row">
<t
t-foreach="request.env['product.public.category'].search([
('parent_id', '=', False), ('has_published_products', '=', True),
], limit=8)"
t-as="category"
>
<div class="col-12 col-lg-3">
<a
t-att-href="'/shop/category/%s' % category.id"
class="nav-link rounded text-wrap text-center p-3"
>
<div class="mb-3 rounded shadow" style="height:80px">
<img
t-if="category.image_1920"
t-att-src="image_data_uri(category.image_1920)"
class="img-fluid w-100 h-100 object-fit-cover"
alt=""
/>
</div>
<h4 t-esc="category.name"/>
</a>
</div>
</t>
</nav>
</div>
</section>
</template>
</odoo>

View file

@ -0,0 +1,51 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<template
id="website_sale.s_mega_menu_menu_image_menu"
name="eCommerce: Menu - Image - Menu"
groups="base.group_user"
>
<section class="s_mega_menu_menu_image_menu py-4 o_colored_level o_cc o_cc1">
<div class="container">
<div class="row align-items-center">
<t
t-foreach="request.env['product.public.category'].search(
[('parent_id', '=', False), ('has_published_products', '=', True)],
limit=2,
)"
t-as="category"
>
<div class="col-12 col-lg-4 py-2 text-center">
<h4>
<a
t-att-href="'/shop/category/%s' % category.id"
class="nav-link p-0 text-black"
t-esc="category.name"
/>
</h4>
<nav class="nav flex-column">
<t t-foreach="category.child_id.filtered('has_published_products')"
t-as="sub_category">
<a
t-att-href="'/shop/category/%s' % sub_category.id"
class="nav-link"
t-esc="sub_category.name"
/>
</t>
</nav>
</div>
<div t-if="not category_last" class="col-12 col-lg-4 py-2 text-center">
<img
class="img-fluid"
src="/web/image/website.s_mega_menu_menu_image_menu_default_image"
alt="Mega menu default image"
/>
</div>
</t>
</div>
</div>
</section>
</template>
</odoo>

View file

@ -0,0 +1,52 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<template
id="website_sale.s_mega_menu_images_subtitles"
name="eCommerce: Menu - images &amp; subtitles"
groups="base.group_user"
>
<section class="s_mega_menu_images_subtitles pt16 pb16 o_colored_level o_cc o_cc1">
<div class="container">
<div class="row">
<div class="col-12 col-lg-8">
<nav class="nav d-flex">
<t
t-foreach="request.env['product.public.category'].search([
('parent_id', '=', False), ('has_published_products', '=', True)
], limit=8)"
t-as="category"
>
<a
t-att-href="'/shop/category/%s' % category.id"
class="col-lg-6 nav-link px-2 rounded text-wrap"
>
<div class="d-flex">
<img
t-if="category.image_1920"
t-att-src="image_data_uri(category.image_1920)"
class="me-3 rounded shadow"
alt=""
/>
<div class="flex-grow-1 align-content-center">
<h4 class="mt-0 mb-0" t-esc="category.name"/>
</div>
</div>
</a>
</t>
</nav>
</div>
<div class="col-12 col-lg-4 py-2">
<img src="/web/image/website.s_mega_menu_images_subtitles_default_image_7" class="mb-3 rounded shadow img-fluid" alt=""/>
<h4>The team</h4>
<p class="text-muted small">
Created in 2021, the company is young and dynamic. Discover the composition of the team and their skills.
</p>
<a href="#" class="btn btn-primary">Discover our team</a>
</div>
</div>
</div>
</section>
</template>
</odoo>

View file

@ -0,0 +1,48 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<template
id="website_sale.s_mega_menu_little_icons"
name="eCommerce: Menu - Little icons"
groups="base.group_user"
>
<section class="s_mega_menu_little_icons overflow-hidden o_colored_level o_cc o_cc1">
<div class="container">
<div class="row">
<div class="col-lg-9 py-2 align-content-center">
<nav class="nav col-12 d-flex">
<t
t-foreach="request.env['product.public.category'].search([
('parent_id', '=', False), ('has_published_products', '=', True)
], limit=9)"
t-as="category"
>
<a
t-att-href="'/shop/category/%s' % category.id"
class="col-lg-4 nav-link px-2 rounded text-wrap"
>
<img
t-if="category.image_1920"
t-att-src="image_data_uri(category.image_1920)"
class="fa fa-fw me-2"
alt=""
/>
<b t-esc="category.name"/>
</a>
</t>
</nav>
</div>
<div class="col-lg-3 p-4 s_mega_menu_gray_area">
<h4>The team</h4>
<p class="text-muted small">
Created in 2021, the company is young and dynamic. Discover the composition of the team and their skills.
</p>
<a href="#" class="btn btn-primary">Discover our team</a>
</div>
</div>
</div>
</section>
</template>
</odoo>

View file

@ -0,0 +1,95 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<template
id="website_sale.s_mega_menu_menus_logos"
name="eCommerce: Menus &amp; logos"
groups="base.group_user"
>
<section class="s_mega_menu_menus_logos overflow-hidden o_colored_level o_cc o_cc1">
<div class="container">
<div class="row">
<div class="col-12 col-lg-8">
<div class="row py-3 h-100">
<t
t-foreach="request.env['product.public.category'].search([
('parent_id', '=', False), ('has_published_products', '=', True)
], limit=6)"
t-as="category"
>
<div class="col-12 col-lg-4 py-2">
<h4>
<a
t-att-href="'/shop/category/%s' % category.id"
class="col-lg-4 nav-link text-black p-0"
t-esc="category.name"
/>
</h4>
<nav class="nav flex-column">
<t t-foreach="category.child_id.filtered('has_published_products')"
t-as="sub_category">
<a
t-att-href="'/shop/category/%s' % sub_category.id"
class="nav-link px-0"
t-esc="sub_category.name"
/>
</t>
</nav>
</div>
</t>
</div>
</div>
<div class="col-12 col-lg-4 py-4 d-flex align-items-center justify-content-center s_mega_menu_gray_area">
<a href="#" class="nav-link text-center px-0" data-name="Menu Item">
<img src="/web/image/website.s_mega_menu_menus_logos_default_image" class="mb-3 rounded shadow img-fluid" alt=""/>
<h4>Spring collection has arrived!</h4>
</a>
</div>
</div>
</div>
<div class="s_mega_menu_menus_logos_wrapper border-top">
<div class="container">
<div class="row py-3">
<div class="col-4 col-lg-2">
<img
src="/web/image/website.s_mega_menu_menus_logos_default_logo_1"
class="img-fluid"
alt=""/>
</div>
<div class="col-4 col-lg-2">
<img
src="/web/image/website.s_mega_menu_menus_logos_default_logo_2"
class="img-fluid"
alt=""/>
</div>
<div class="col-4 col-lg-2">
<img
src="/web/image/website.s_mega_menu_menus_logos_default_logo_3"
class="img-fluid"
alt=""/>
</div>
<div class="col-4 col-lg-2">
<img
src="/web/image/website.s_mega_menu_menus_logos_default_logo_4"
class="img-fluid"
alt=""/>
</div>
<div class="col-4 col-lg-2">
<img
src="/web/image/website.s_mega_menu_menus_logos_default_logo_5"
class="img-fluid"
alt=""/>
</div>
<div class="col-4 col-lg-2">
<img
src="/web/image/website.s_mega_menu_menus_logos_default_logo_6"
class="img-fluid"
alt=""/>
</div>
</div>
</div>
</div>
</section>
</template>
</odoo>

View file

@ -0,0 +1,43 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<template
id="website_sale.s_mega_menu_multi_menus"
name="eCommerce: Multi-Menus"
groups="base.group_user"
>
<section class="s_mega_menu_multi_menus py-4 o_colored_level o_cc o_cc1">
<div class="container">
<div class="row">
<t
t-foreach="request.env['product.public.category'].search([
('parent_id', '=', False), ('has_published_products', '=', True),
], limit=4)"
t-as="category"
>
<div class="col-12 col-sm py-2 text-center">
<h4>
<a
t-att-href="'/shop/category/%s' % category.id"
class="nav-link p-0 text-black"
t-esc="category.name"
/>
</h4>
<nav class="nav flex-column">
<t t-foreach="category.child_id.filtered('has_published_products')"
t-as="sub_category">
<a
t-att-href="'/shop/category/%s' % sub_category.id"
class="nav-link"
t-esc="sub_category.name"
/>
</t>
</nav>
</div>
</t>
</div>
</div>
</section>
</template>
</odoo>

View file

@ -0,0 +1,47 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<template
id="website_sale.s_mega_menu_odoo_menu"
name="eCommerce: Odoo Menu"
groups="base.group_user"
>
<section class="s_mega_menu_odoo_menu pt16 o_colored_level o_cc o_cc1">
<div class="container">
<div class="row">
<t
t-foreach="request.env['product.public.category'].search([
('parent_id', '=', False), ('has_published_products', '=', True),
], limit=4)"
t-as="category"
>
<div class="col-12 col-lg-3 pt16 pb24">
<h4 class="h5 fw-bold mt-0">
<a
t-att-href="'/shop/category/%s' % category.id"
class="nav-link p-0 text-black"
t-esc="category.name"
/>
</h4>
<div class="s_hr pt4 pb16">
<hr class="w-100 mx-auto"
style="border-top-width: 2px; border-top-color: var(--primary);"
/>
</div>
<nav class="nav flex-column">
<t t-foreach="category.child_id.filtered('has_published_products')"
t-as="sub_category">
<a
t-att-href="'/shop/category/%s' % sub_category.id"
class="nav-link px-0"
t-esc="sub_category.name"/>
</t>
</nav>
</div>
</t>
</div>
</div>
</section>
</template>
</odoo>

View file

@ -0,0 +1,48 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<template
id="website_sale.s_mega_menu_thumbnails"
name="eCommerce: Menu - Thumbnails"
groups="base.group_user"
>
<section class="s_mega_menu_thumbnails pt24 o_colored_level o_cc o_cc1">
<div class="container">
<div class="row ustify-content-center">
<t t-set="counter" t-value="0"/>
<t
t-foreach="request.env['product.public.category'].search([
('parent_id', '=', False), ('has_published_products', '=', True),
], limit=10)"
t-as="category"
>
<t t-set="counter" t-value="counter + 1"/>
<t t-if="(counter - 1) % 5 == 0 and counter != 1">
<div class="w-100 d-none d-lg-block"></div>
</t>
<div class="col-6 col-lg-2 text-center py-2">
<a
t-att-href="'/shop/category/%s' % category.id"
class="nav-link p-0"
>
<img
t-if="category.image_1920"
t-att-src="image_data_uri(category.image_1920)"
class="img-fluid rounded shadow"
alt=""
/>
<br/>
<span class="d-block p-2 small">
<b>
<t t-esc="category.name"/>
</b>
</span>
</a>
</div>
</t>
</div>
</div>
</section>
</template>
</odoo>

View file

@ -3,346 +3,11 @@
<template id="snippets" inherit_id="website.snippets" name="e-commerce snippets">
<xpath expr="//t[@id='sale_products_hook']" position="replace">
<t t-snippet="website_sale.s_dynamic_snippet_products" string="Products" t-thumbnail="/website_sale/static/src/img/snippets_thumbs/s_dynamic_products.svg"/>
<t t-snippet="website_sale.s_dynamic_snippet_products" string="Products" label="Dynamic Content" group="catalog"/>
<t t-snippet="website_sale.s_dynamic_snippet_category_list" string="Category List" label="Dynamic Content" group="catalog"/>
</xpath>
<xpath expr="//t[@id='snippet_add_to_cart_hook']" position="replace">
<t t-snippet="website_sale.s_add_to_cart" string="Add to Cart Button" t-thumbnail="/website/static/src/img/snippets_thumbs/s_add_to_cart.svg"/>
</xpath>
</template>
<template id="snippet_options" inherit_id="website.snippet_options" name="e-commerce snippet options">
<xpath expr="." position="inside">
<!-- All products page -->
<div data-js="WebsiteSaleGridLayout" data-page-options="true" groups="website.group_website_designer" data-selector="main:has(.o_wsale_products_page)" data-no-check="true"
string="Products Page" data-target="#products_grid .o_wsale_products_grid_table_wrapper > table">
<we-select string="Layout" data-no-preview="true" data-reload="/">
<we-button data-customize-website-views="" data-name="grid_view_opt">Grid</we-button>
<we-button data-customize-website-views="website_sale.products_list_view">List</we-button>
</we-select>
<we-row string="Size" class="o_we_sublevel_1">
<we-input data-set-ppg="" data-no-preview="true" data-reload="/"/>
<span class="mx-2 o_wsale_ppr_by">by</span>
<we-select class="o_wsale_ppr_submenu" data-dependencies="grid_view_opt" data-no-preview="true" data-reload="/">
<we-button data-set-ppr="2">2</we-button>
<we-button data-set-ppr="3">3</we-button>
<we-button data-set-ppr="4">4</we-button>
</we-select>
</we-row>
<we-select string="Style" class="o_we_sublevel_1">
<we-button data-select-class=""
data-customize-website-views="">
Default
</we-button>
<we-button data-select-class="o_wsale_design_cards"
data-customize-website-views="website_sale.products_design_card">
Cards
</we-button>
<we-button data-select-class="o_wsale_design_thumbs"
data-customize-website-views="website_sale.products_design_thumbs">
Thumbnails
</we-button>
<we-button data-select-class="o_wsale_design_grid"
data-customize-website-views="website_sale.products_design_grid">
Grid
</we-button>
</we-select>
<we-select string="Images Size" class="o_we_sublevel_1">
<we-button data-select-class="o_wsale_context_thumb_4_3"
data-customize-website-views="website_sale.products_thumb_4_3">
Landscape (4/3)
</we-button>
<we-button data-select-class=""
data-customize-website-views="">
Default (1/1)
</we-button>
<we-button data-select-class="o_wsale_context_thumb_4_5"
data-customize-website-views="website_sale.products_thumb_4_5">
Portrait (4/5)
</we-button>
<we-button data-select-class="o_wsale_context_thumb_2_3"
data-customize-website-views="website_sale.products_thumb_2_3">
Vertical (2/3)
</we-button>
</we-select>
<we-button-group string="Fill" class="o_we_sublevel_2" data-variable="thumb_size">
<we-button data-select-class=""
data-img="/website/static/src/img/snippets_options/content_width_normal.svg"
data-customize-website-views="">
</we-button>
<we-button data-select-class="o_wsale_context_thumb_cover"
data-name="thumb_cover"
data-variable="thumb_cover"
data-img="/website/static/src/img/snippets_options/content_width_full.svg"
data-customize-website-views="website_sale.products_thumb_cover">
</we-button>
</we-button-group>
<we-checkbox string="Prod. Desc."
data-customize-website-views="website_sale.products_description"
data-no-preview="true"
data-reload="/"/>
<we-row id="o_wsale_grid_left_panel" string="Categories" data-variable="filmstrip">
<we-button string="Left"
data-customize-website-views="website_sale.products_categories"
data-name="categories_opt"
data-no-preview="true"
data-reload="/"/>
<we-button string="Top"
data-customize-website-views="website_sale.products_categories_top"
data-name="categories_opt_top"
data-no-preview="true"
data-reload="/"/>
</we-row>
<we-checkbox id="collapse_category_recursive" string="Collapse Category Recursive"
class="o_we_sublevel_1"
data-customize-website-views="website_sale.option_collapse_products_categories"
data-dependencies="categories_opt"
data-no-preview="true"
data-reload="/"/>
<we-row string="Attributes" class="o_we_full_row">
<we-button string="Left"
data-customize-website-views="website_sale.products_attributes"
data-name="attributes_opt"
data-no-preview="true"
data-reload="/"/>
<we-button string="Top"
data-customize-website-views="website_sale.products_attributes_top"
data-name="attributes_opt_top"
data-no-preview="true"
data-reload="/"/>
</we-row>
<we-checkbox string="Price Filter"
class="o_we_sublevel_1"
data-customize-website-views="website_sale.filter_products_price"
data-dependencies="attributes_opt, attributes_opt_top"
data-no-preview="true"
data-reload="/"/>
<we-row string="Top Bar" class="o_we_full_row">
<we-button string="Sort by"
data-customize-website-views="website_sale.sort"
data-no-preview="true"
data-reload="/"/>
<we-button string="Layout"
data-customize-website-views="website_sale.add_grid_or_list_option"
data-no-preview="true"
data-reload="/"/>
</we-row>
<we-select string="Default Sort" class="o_wsale_sort_submenu" data-no-preview="true" data-reload="/">
<t t-foreach="request.env['website']._get_product_sort_mapping()" t-as="query_and_label">
<we-button t-att-data-set-default-sort="query_and_label[0]"><t t-esc="query_and_label[1]"/></we-button>
</t>
</we-select>
<we-row string="Buttons" class="o_we_full_row">
<we-button title="Add to Cart" class="fa fa-fw fa-shopping-cart o_we_add_to_cart_btn"
data-customize-website-views="website_sale.products_add_to_cart"
data-no-preview="true"
data-reload="/"/>
</we-row>
</div>
<!-- Product -->
<div data-js="WebsiteSaleProductsItem"
data-selector="#products_grid .oe_product"
data-no-check="true">
<div class="o_wsale_soptions_menu_sizes">
<we-row string="Size">
<table>
<tr>
<td/><td/><td/><td/>
</tr>
<tr>
<td/><td/><td/><td/>
</tr>
<tr>
<td/><td/><td/><td/>
</tr>
<tr>
<td/><td/><td/><td/>
</tr>
</table>
</we-row>
</div>
<we-row string="Re-order" data-no-preview="true">
<we-button title="Push to top" data-change-sequence="top" class="fa fa-fw fa-angle-double-left"/>
<we-button title="Push up" data-change-sequence="up" class="fa fa-fw fa-angle-left"/>
<we-button title="Push down" data-change-sequence="down" class="fa fa-fw fa-angle-right"/>
<we-button title="Push to bottom" data-change-sequence="bottom" class="fa fa-fw fa-angle-double-right"/>
</we-row>
<we-row>
<we-select string="Badge" class="o_wsale_ribbon_select">
<we-button data-set-ribbon="" data-name="no_ribbon_opt">None</we-button>
<!-- Ribbons are filled in JS -->
</we-select>
<we-button data-edit-ribbon="" title="Edit" class="fa fa-edit" data-no-preview="true" data-dependencies="!no_ribbon_opt"/>
<we-button data-create-ribbon="" data-name="create_ribbon_opt" title="Create" class="fa fa-plus text-success" data-no-preview="true"/>
</we-row>
<div class="d-none" data-name="ribbon_customize_opt">
<we-input string="Content" class="o_we_sublevel_1 o_we_large"
data-set-ribbon-html="Badge Text" data-apply-to=".o_ribbon"/>
<we-colorpicker string="Background" class="o_we_sublevel_1"
title="" data-select-style="" data-css-property="background-color" data-color-prefix="bg-" data-apply-to=".o_ribbon"/>
<we-colorpicker string="Text" class="o_we_sublevel_1"
title="" data-select-style="" data-css-property="color" data-apply-to=".o_ribbon"/>
<we-select string="Style" class="o_we_sublevel_1">
<we-button data-set-ribbon-mode="ribbon">Slanted</we-button>
<we-button data-set-ribbon-mode="tag">Tag</we-button>
</we-select>
<we-select string="Position" class="o_we_sublevel_1">
<we-button data-set-ribbon-position="left">Left</we-button>
<we-button data-set-ribbon-position="right">Right</we-button>
</we-select>
<we-row string=" ">
<we-button class="o_we_bg_danger" data-delete-ribbon="" data-no-preview="true">Delete Badge</we-button>
</we-row>
</div>
</div>
<div data-selector="#wrapwrap > header"
data-no-check="true"
groups="website.group_website_designer">
<we-checkbox string="Show Empty Cart"
data-customize-website-views="website_sale.header_hide_empty_cart_link|"
data-no-preview="true"
data-reload="/"/>
</div>
<!-- Product image -->
<div data-js="WebsiteSaleProductAttribute" data-selector="#product_detail .o_wsale_product_attribute" data-no-check="true">
<we-select string="Display Type" data-no-preview="true">
<we-button data-set-display-type="radio">Radio</we-button>
<we-button data-set-display-type="pills">Pills</we-button>
<we-button data-set-display-type="select">Select</we-button>
<we-button data-set-display-type="color">Color</we-button>
</we-select>
</div>
<!-- Product page -->
<div data-js="WebsiteSaleProductPage" data-selector="main:has(.o_wsale_product_page)" data-page-options="true" groups="website.group_website_designer" data-no-check="true" string="Product Page">
<we-row string="Customers" class="o_we_full_row">
<we-button string="Rating"
data-customize-website-views="website_sale.product_comment"
data-no-preview="true"
data-reload="/"/>
<we-button string="Share"
data-name="attributes_opt"
data-customize-website-views="website_sale.product_share_buttons"
data-no-preview="true"
data-reload="/"/>
</we-row>
<we-checkbox string="Select Quantity"
data-customize-website-views="website_sale.product_quantity"
data-no-preview="true"
data-reload="/"/>
<we-checkbox string="Tax Indication"
data-customize-website-views="website_sale.tax_indication"
data-no-preview="true"
data-reload="/"/>
<we-select data-name="variants_opt" groups="product.group_product_variant" string="Variants" data-no-preview="true" data-reload="/">
<we-button data-name="variants_options_opt" data-customize-website-views="">Options</we-button>
<we-button data-name="variants_products_list_opt" data-customize-website-views="website_sale.product_variants">Products List</we-button>
</we-select>
<we-row string="Cart" class="o_we_full_row" data-name="o_wsale_buy_now_opt">
<we-button title="Buy Now" class="o_we_buy_now_btn"
data-customize-website-views="website_sale.product_buy_now"
data-no-preview="true"
data-reload="/">
<i class="fa fa-fw fa-bolt"/>
Buy Now
</we-button>
</we-row>
<!-- Image config -->
<we-button-group string="Images Width" data-no-preview="true" data-reload="/">
<we-button data-set-image-width="none" data-img="/website_sale/static/src/img/snippet_options/image-width-none.svg" title="None"/>
<we-button data-set-image-width="50_pc" data-img="/website_sale/static/src/img/snippet_options/image-width-50.svg" title="50 percent"/>
<we-button data-set-image-width="66_pc" data-img="/website_sale/static/src/img/snippet_options/image-width-66.svg" title="66 percent"/>
<we-button data-set-image-width="100_pc" data-img="/website_sale/static/src/img/snippet_options/image-width-100.svg" title="100 percent"/>
</we-button-group>
<we-select string="Layout" data-name="o_wsale_image_layout" data-no-preview="true" data-reload="/">
<we-button data-set-image-layout="carousel">Carousel</we-button>
<we-button data-set-image-layout="grid">Grid</we-button>
</we-select>
<we-select string="Image Zoom" class="o_we_sublevel_1" data-name="o_wsale_zoom_mode" data-no-preview="true" data-reload="/">
<we-button data-name="o_wsale_zoom_hover" data-customize-website-views="website_sale.product_picture_magnify_hover">Magnifier on hover</we-button>
<we-button data-name="o_wsale_zoom_click" data-customize-website-views="website_sale.product_picture_magnify_click">Pop-up on Click</we-button>
<we-button data-name="o_wsale_zoom_both" data-customize-website-views="website_sale.product_picture_magnify_both">Both</we-button>
<we-button data-name="o_wsale_zoom_none" data-customize-website-views="">None</we-button>
</we-select>
<!-- Carousel config -->
<we-button-group string="Thumbnails" class="o_we_sublevel_1" data-name="o_wsale_thumbnail_pos" data-no-preview="true" data-reload="/">
<we-button class="fa fa-fw fa-long-arrow-left" title="Left" data-customize-website-views="website_sale.carousel_product_indicators_left"/>
<we-button class="fa fa-fw fa-long-arrow-down" title="Bottom" data-customize-website-views="website_sale.carousel_product_indicators_bottom"/>
</we-button-group>
<!-- Grid config -->
<we-range string="Image Spacing" class="o_we_sublevel_1" data-name="o_wsale_grid_spacing" data-no-preview="true" data-reload="/" data-max="3" data-step="1" data-set-spacing=""/>
<we-select string="Columns" class="o_we_sublevel_1" data-name="o_wsale_grid_columns" data-no-preview="true" data-reload="/">
<we-button data-set-columns="1">1</we-button>
<we-button data-set-columns="2">2</we-button>
<we-button data-set-columns="3">3</we-button>
</we-select>
<we-row string="Main image">
<we-button class="o_we_bg_brand_primary" data-name="o_wsale_replace_main_image" data-replace-main-image="true" data-no-preview="true">Replace</we-button>
</we-row>
<we-row string="Extra Images">
<we-button class="o_we_bg_success" data-name="o_wsale_add_extra_images" data-add-images="true" data-no-preview="true">Add</we-button>
<we-button class="o_we_bg_danger" data-name="o_wsale_clear_extra_images" data-clear-images="true" data-no-preview="true">Remove all</we-button>
</we-row>
</div>
<!-- Checkout page -->
<div data-selector="main:has(.oe_website_sale .wizard)" data-page-options="true" groups="website.group_website_designer" data-no-check="true" string="Checkout Pages">
<we-checkbox string="Extra Step Option"
data-customize-website-views="website_sale.extra_info_option"
data-no-preview="true"
data-reload="/"/>
<we-checkbox string="Suggested Accessories"
data-customize-website-views="website_sale.suggested_products_list"
data-no-preview="true"
data-reload="/"/>
<we-checkbox string="Promo Code"
data-customize-website-views="website_sale.reduction_code"
data-no-preview="true"
data-reload="/"/>
<we-checkbox string="Accept Terms &amp; Conditions"
data-customize-website-views="website_sale.payment_sale_note"
data-no-preview="true"
data-reload="/"/>
<we-checkbox string="Show b2b Fields"
data-customize-website-views="website_sale.address_b2b"
data-no-preview="true"
data-reload="/"/>
</div>
</xpath>
</template>
<template id="snippets_options_web_editor" inherit_id="web_editor.snippet_options" name="e-commerce base snippet options">
<xpath expr="//div[@data-js='ReplaceMedia']" position="inside">
<we-row string="Re-order">
<we-button class="fa fa-fw fa-angle-double-left" data-no-preview="true" title="Move to first" data-set-position="first" data-name="media_wsale_resequence"/>
<we-button class="fa fa-fw fa-angle-left" data-no-preview="true" title="Move to previous" data-set-position="left" data-name="media_wsale_resequence"/>
<we-button class="fa fa-fw fa-angle-right" data-no-preview="true" title="Move to next" data-set-position="right" data-name="media_wsale_resequence"/>
<we-button class="fa fa-fw fa-angle-double-right" data-no-preview="true" title="Move to last" data-set-position="last" data-name="media_wsale_resequence"/>
</we-row>
</xpath>
<xpath expr="//div[@data-js='ReplaceMedia']/we-row" position="inside">
<we-button class="o_we_bg_danger" data-remove-media="true" data-no-preview="true" data-name="media_wsale_remove">Remove</we-button>
</xpath>
</template>
<template id="product_searchbar_input_snippet_options" inherit_id="website.searchbar_input_snippet_options" name="product search bar snippet options">
<xpath expr="//div[@data-js='SearchBar']/we-select[@data-name='scope_opt']" position="inside">
<we-button data-set-search-type="products" data-select-data-attribute="products" data-name="search_products_opt" data-form-action="/shop">Products</we-button>
</xpath>
<xpath expr="//div[@data-js='SearchBar']/we-select[@data-name='order_opt']" position="inside">
<t t-foreach="request.env['website']._get_product_sort_mapping()" t-as="query_and_label">
<!-- name asc is already part of the general sorting methods of this snippet. -->
<we-button t-if="query_and_label[0] != 'name asc'" t-att-data-set-order-by="query_and_label[0]" t-att-data-select-data-attribute="query_and_label[0]" data-dependencies="search_products_opt"><t t-out="query_and_label[1]"/></we-button>
</t>
</xpath>
<xpath expr="//div[@data-js='SearchBar']/div[@data-dependencies='limit_opt']" position="inside">
<we-checkbox string="Description" data-dependencies="search_products_opt" data-select-data-attribute="true" data-attribute-name="displayDescription"
data-apply-to=".search-query"/>
<we-checkbox string="Category" data-dependencies="search_products_opt" data-select-data-attribute="true" data-attribute-name="displayExtraLink"
data-apply-to=".search-query"/>
<we-checkbox string="Price" data-dependencies="search_products_opt" data-select-data-attribute="true" data-attribute-name="displayDetail"
data-apply-to=".search-query"/>
<we-checkbox string="Image" data-dependencies="search_products_opt" data-select-data-attribute="true" data-attribute-name="displayImage"
data-apply-to=".search-query"/>
<t t-snippet="website_sale.s_add_to_cart" string="Add to Cart Button" t-thumbnail="/website/static/src/img/snippets_thumbs/s_add_to_cart.svg" t-grid-column-span="3"/>
</xpath>
</template>