@ -1,27 +1,26 @@ |
|||
<?xml version="1.0" encoding="UTF-8" ?> |
|||
<odoo> |
|||
<data noupdate="1"> |
|||
|
|||
<!-- Define a menu item for "About us" --> |
|||
<record id="menu_about_sub" model="website.menu"> |
|||
<field name="name">About us</field> |
|||
<field name="url">/about</field> |
|||
<field name="parent_id" ref="website.main_menu"/> |
|||
<field name="sequence" type="int">30</field> |
|||
</record> |
|||
|
|||
<!-- Define a menu item for "Features" --> |
|||
<record id="menu_feature" model="website.menu"> |
|||
<field name="name">Features</field> |
|||
<field name="url">/feature</field> |
|||
<field name="parent_id" ref="website.main_menu"/> |
|||
<field name="sequence" type="int">35</field> |
|||
</record> |
|||
|
|||
<!-- Define a menu item for "Menu" --> |
|||
<record id="menu_menu" model="website.menu"> |
|||
<field name="name">Menu</field> |
|||
<field name="url">/menu</field> |
|||
<field name="parent_id" ref="website.main_menu"/> |
|||
<field name="sequence" type="int">15</field> |
|||
</record> |
|||
|
|||
|
|||
</data> |
|||
</odoo> |
|||
</odoo> |
@ -1,7 +1,6 @@ |
|||
## Module <theme_coffee_shop> |
|||
|
|||
#### 21.02.2023 |
|||
#### 22.01.2024 |
|||
#### Version 16.0.1.0.0 |
|||
#### ADD |
|||
|
|||
- Initial commit for Theme Coffee Shop |
|||
|
Before Width: | Height: | Size: 219 KiB After Width: | Height: | Size: 403 KiB |
After Width: | Height: | Size: 38 KiB |
After Width: | Height: | Size: 288 KiB |
After Width: | Height: | Size: 1.1 MiB |
After Width: | Height: | Size: 207 KiB |
After Width: | Height: | Size: 33 KiB |
After Width: | Height: | Size: 638 KiB |
After Width: | Height: | Size: 442 KiB |
After Width: | Height: | Size: 299 KiB |
After Width: | Height: | Size: 20 KiB |
Before Width: | Height: | Size: 2.6 KiB After Width: | Height: | Size: 2.6 KiB |
Before Width: | Height: | Size: 3.9 KiB After Width: | Height: | Size: 3.9 KiB |
Before Width: | Height: | Size: 735 KiB |
Before Width: | Height: | Size: 576 KiB |
Before Width: | Height: | Size: 954 KiB |
Before Width: | Height: | Size: 46 KiB |
Before Width: | Height: | Size: 972 KiB |
Before Width: | Height: | Size: 86 KiB |
Before Width: | Height: | Size: 809 KiB |
Before Width: | Height: | Size: 922 KiB |
Before Width: | Height: | Size: 168 KiB |
Before Width: | Height: | Size: 990 KiB After Width: | Height: | Size: 990 KiB |
Before Width: | Height: | Size: 930 KiB After Width: | Height: | Size: 930 KiB |
Before Width: | Height: | Size: 29 KiB After Width: | Height: | Size: 29 KiB |
Before Width: | Height: | Size: 165 KiB After Width: | Height: | Size: 165 KiB |
Before Width: | Height: | Size: 1.7 MiB After Width: | Height: | Size: 1.7 MiB |
Before Width: | Height: | Size: 269 KiB After Width: | Height: | Size: 269 KiB |
Before Width: | Height: | Size: 195 KiB After Width: | Height: | Size: 195 KiB |
Before Width: | Height: | Size: 950 KiB After Width: | Height: | Size: 950 KiB |
Before Width: | Height: | Size: 570 KiB After Width: | Height: | Size: 570 KiB |
Before Width: | Height: | Size: 107 KiB After Width: | Height: | Size: 107 KiB |
Before Width: | Height: | Size: 245 KiB After Width: | Height: | Size: 245 KiB |
Before Width: | Height: | Size: 328 KiB After Width: | Height: | Size: 328 KiB |
Before Width: | Height: | Size: 44 KiB After Width: | Height: | Size: 44 KiB |
Before Width: | Height: | Size: 39 KiB After Width: | Height: | Size: 39 KiB |
Before Width: | Height: | Size: 890 KiB After Width: | Height: | Size: 890 KiB |
Before Width: | Height: | Size: 84 KiB After Width: | Height: | Size: 84 KiB |
Before Width: | Height: | Size: 283 KiB After Width: | Height: | Size: 283 KiB |
Before Width: | Height: | Size: 993 KiB After Width: | Height: | Size: 993 KiB |
Before Width: | Height: | Size: 928 KiB After Width: | Height: | Size: 928 KiB |
Before Width: | Height: | Size: 940 KiB After Width: | Height: | Size: 940 KiB |
Before Width: | Height: | Size: 553 KiB After Width: | Height: | Size: 553 KiB |
Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 13 KiB |
Before Width: | Height: | Size: 975 KiB After Width: | Height: | Size: 975 KiB |
Before Width: | Height: | Size: 999 KiB After Width: | Height: | Size: 999 KiB |
Before Width: | Height: | Size: 329 KiB After Width: | Height: | Size: 329 KiB |
Before Width: | Height: | Size: 969 KiB After Width: | Height: | Size: 969 KiB |
Before Width: | Height: | Size: 924 KiB After Width: | Height: | Size: 924 KiB |
Before Width: | Height: | Size: 953 KiB After Width: | Height: | Size: 953 KiB |
Before Width: | Height: | Size: 109 KiB After Width: | Height: | Size: 109 KiB |
Before Width: | Height: | Size: 670 KiB After Width: | Height: | Size: 670 KiB |
Before Width: | Height: | Size: 269 KiB After Width: | Height: | Size: 269 KiB |
Before Width: | Height: | Size: 658 KiB |
Before Width: | Height: | Size: 2.2 KiB |
Before Width: | Height: | Size: 5.8 KiB |
Before Width: | Height: | Size: 4.0 KiB |
Before Width: | Height: | Size: 26 KiB |
Before Width: | Height: | Size: 1.7 KiB |
Before Width: | Height: | Size: 359 B |
@ -1,63 +0,0 @@ |
|||
odoo.define("theme_coffee_shop.theme_coffee_shop_template", function (require) { |
|||
"use strict"; |
|||
var ajax = require('web.ajax'); |
|||
|
|||
const navicon = document.getElementById('nav-icon'); |
|||
const navitem = document.getElementById('nav-item'); |
|||
|
|||
if(navicon){ |
|||
navicon.addEventListener("click",function(e){ |
|||
e.preventDefault(); |
|||
navitem.classList.toggle('active'); |
|||
}) |
|||
} |
|||
|
|||
function functionLike(r) { |
|||
r.classList.toggle("fa-solid"); |
|||
} |
|||
|
|||
function fliterclick() { |
|||
var x = document.querySelector(".pr-categories"); |
|||
if (x.style.display === "none") { |
|||
x.style.display = "block"; |
|||
} else { |
|||
x.style.display = "none"; |
|||
} |
|||
} |
|||
|
|||
|
|||
var acc = document.getElementsByClassName("accordion"); |
|||
var i; |
|||
|
|||
for (i = 0; i < acc.length; i++) { |
|||
acc[i].addEventListener("click", function() { |
|||
/* Toggle between adding and removing the "active" class, |
|||
to highlight the button that controls the panel */ |
|||
this.classList.toggle("active"); |
|||
|
|||
/* Toggle between hiding and showing the active panel */ |
|||
var panel = this.nextElementSibling; |
|||
if (panel.style.display === "block") { |
|||
panel.style.display = "none"; |
|||
} else { |
|||
panel.style.display = "block"; |
|||
} |
|||
}); |
|||
} |
|||
|
|||
const loginPage=document.querySelectorAll("#login-btn"); |
|||
|
|||
loginPage.forEach(login=>{ |
|||
login.addEventListener('click',e=>{ |
|||
e.preventDefault(); |
|||
document.querySelector('.login-form-container').classList.toggle('show'); |
|||
}) |
|||
}) |
|||
|
|||
document.querySelector(".login-close").onclick=()=>{ |
|||
document.querySelector('.login-form-container').classList.toggle('show'); |
|||
} |
|||
|
|||
}); |
|||
|
|||
|
@ -0,0 +1,32 @@ |
|||
/** @odoo-module **/ |
|||
|
|||
import publicWidget from 'web.public.widget'; |
|||
import {generateGMapLink, generateGMapIframe} from 'website.utils'; |
|||
|
|||
publicWidget.registry.Map_1 = publicWidget.Widget.extend({ |
|||
selector: '.s_map.s_map_1', |
|||
|
|||
/** |
|||
* @override |
|||
*/ |
|||
async start() { |
|||
console.log("kkkkk") |
|||
const address = await this._rpc({ |
|||
route: "/get-company/address", |
|||
}); |
|||
|
|||
const existingIframe = this.el.querySelector('.s_map.s_map_1 iframe'); |
|||
if (existingIframe) { |
|||
existingIframe.remove(); |
|||
} |
|||
|
|||
if (address) { |
|||
const iframeEl = generateGMapIframe(); |
|||
iframeEl.setAttribute('src', generateGMapLink({mapType: 'm', mapZoom: "12", name: 'Map', snippet: 's_map', mapAddress: address})); |
|||
this.el.querySelector('.s_map_color_filter_1').before(iframeEl); |
|||
} |
|||
}, |
|||
|
|||
}); |
|||
|
|||
export default publicWidget.registry.Map_1; |
@ -1,31 +1,135 @@ |
|||
<?xml version="1.0" encoding="UTF-8" ?> |
|||
<odoo> |
|||
|
|||
<!-- This XML defines a new page named "About" for the coffee shop theme --> |
|||
<record id="coffee_about_us" model="website.page"> |
|||
<field name="name">About</field> |
|||
<field name="type">qweb</field> |
|||
<field name="key">theme_coffee_shop.coffee_about_us</field> |
|||
<field name="url">/about</field> |
|||
<field name="url">/about</field> |
|||
<field name="is_published">True</field> |
|||
<field name="arch" type="xml"> |
|||
<t name="About" t-name="theme_coffee_shop.coffee_about_us"> |
|||
<t t-call="website.layout"> |
|||
<div id="wrap"> |
|||
<section id="banner" class="banner-imgAbout"> |
|||
<div class="container wrapper"> |
|||
<div class="banner-content"> |
|||
<div class="banner-text"> |
|||
<p class="banner-head">More than</p> |
|||
<p class="banner-head">Just Coffee</p> |
|||
<div id="wrap" class="oe_structure oe_empty"> |
|||
<section id="banner" class="banner-imgAbout"> |
|||
<div class="container wrapper"> |
|||
<div class="banner-content"> |
|||
<div class="banner-text"> |
|||
<p class="banner-head">More than</p> |
|||
<p class="banner-head">Just Coffee</p> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</section> |
|||
<div class="oe_structure"/> |
|||
</div> |
|||
</section> |
|||
<section class="s_company_team pt48 pb48"> |
|||
<div class="container"> |
|||
<div class="row s_nb_column_fixed"> |
|||
<div class="col-lg-6 pt24 pb24"> |
|||
<div class="row s_col_no_resize s_col_no_bgcolor"> |
|||
<div class="col-lg-4 pb16 o_not_editable" contenteditable="false"> |
|||
<img alt="" src="/web/image/website.s_company_team_image_1" |
|||
class="img-fluid rounded-circle mx-auto o_editable_media" |
|||
contenteditable="true"/> |
|||
</div> |
|||
<div class="col-lg-8"> |
|||
<h4>Tony Fred, CEO</h4> |
|||
<p> |
|||
Founder and chief visionary, Tony is the driving force behind the |
|||
company. He loves |
|||
to keep his hands full by participating in the development of the |
|||
software, |
|||
marketing, and customer experience strategies. |
|||
</p> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
<div class="col-lg-6 pt24 pb24"> |
|||
<div class="row s_col_no_resize s_col_no_bgcolor"> |
|||
<div class="col-lg-4 pb16 o_not_editable" contenteditable="false"> |
|||
<img alt="" src="/web/image/website.s_company_team_image_2" |
|||
class="img-fluid rounded-circle mx-auto o_editable_media" |
|||
contenteditable="true"/> |
|||
</div> |
|||
<div class="col-lg-8"> |
|||
<h4>Mich Stark, COO</h4> |
|||
<p>Mich loves taking on challenges. With his multi-year experience as |
|||
Commercial Director in the software industry, Mich has helped the |
|||
company to get where it is today. Mich is among the best minds. |
|||
</p> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
<div class="col-lg-6 pt24 pb24"> |
|||
<div class="row s_col_no_resize s_col_no_bgcolor"> |
|||
<div class="col-lg-4 pb16 o_not_editable" contenteditable="false"> |
|||
<img alt="" src="/web/image/website.s_company_team_image_3" |
|||
class="img-fluid rounded-circle mx-auto o_editable_media" |
|||
contenteditable="true"/> |
|||
</div> |
|||
<div class="col-lg-8"> |
|||
<h4>Aline Turner, CTO</h4> |
|||
<p>Aline is one of the iconic people in life who can say they love what |
|||
they do. She mentors 100+ in-house developers and looks after the |
|||
community of thousands of developers. |
|||
</p> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
<div class="col-lg-6 pt24 pb24"> |
|||
<div class="row s_col_no_resize s_col_no_bgcolor"> |
|||
<div class="col-lg-4 pb16 o_not_editable" contenteditable="false"> |
|||
<img alt="" src="/web/image/website.s_company_team_image_4" |
|||
class="img-fluid rounded-circle mx-auto o_editable_media" |
|||
contenteditable="true"/> |
|||
</div> |
|||
<div class="col-lg-8"> |
|||
<h4>Iris Joe, CFO</h4> |
|||
<p>Iris, with her international experience, helps us easily understand |
|||
the numbers and improves them. She is determined to drive success |
|||
and delivers her professional acumen to bring the company to the |
|||
next level. |
|||
</p> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</section> |
|||
<section class="s_references pt48 pb32"> |
|||
<div class="container"> |
|||
<h2 style="text-align: center;">Our References</h2> |
|||
<p style="text-align: center;">We are in good company.</p> |
|||
<div class="row"> |
|||
<div class="col-lg-2 pt16 pb16"> |
|||
<img src="/web/image/website.s_reference_demo_image_1" |
|||
class="img img-fluid mx-auto" alt=""/> |
|||
</div> |
|||
<div class="col-lg-2 pt16 pb16"> |
|||
<img src="/web/image/website.s_reference_demo_image_2" |
|||
class="img img-fluid mx-auto" alt=""/> |
|||
</div> |
|||
<div class="col-lg-2 pt16 pb16"> |
|||
<img src="/web/image/website.s_reference_demo_image_3" |
|||
class="img img-fluid mx-auto" alt=""/> |
|||
</div> |
|||
<div class="col-lg-2 pt16 pb16"> |
|||
<img src="/web/image/website.s_reference_demo_image_4" |
|||
class="img img-fluid mx-auto" alt=""/> |
|||
</div> |
|||
<div class="col-lg-2 pt16 pb16"> |
|||
<img src="/web/image/website.s_reference_demo_image_5" |
|||
class="img img-fluid mx-auto" alt=""/> |
|||
</div> |
|||
<div class="col-lg-2 pt16 pb16"> |
|||
<img src="/web/image/website.s_reference_default_image_6" |
|||
class="img img-fluid mx-auto" alt=""/> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</section> |
|||
</div> |
|||
</t> |
|||
</t> |
|||
</field> |
|||
</record> |
|||
|
|||
</odoo> |
@ -1,52 +1,49 @@ |
|||
<?xml version="1.0" encoding="UTF-8" ?> |
|||
<odoo> |
|||
<!-- This XML template customizes the appearance and functionality of the cart popover in the website --> |
|||
<template id="coffee_cart_popover" inherit_id="website_sale.cart_popover" |
|||
name="Coffee Cart Popover"> |
|||
<xpath expr="." position="replace"> |
|||
<div> |
|||
<div class="items-cart"> |
|||
<t t-foreach="website_sale_order.website_order_line" t-as="order_line"> |
|||
<div class="item"> |
|||
<div class="item-img"> |
|||
<img t-attf-src="data:image/png;base64,{{order_line.product_id.image_1920}}" |
|||
alt=""/> |
|||
<xpath expr="." position="replace"> |
|||
<div> |
|||
<div class="items-cart"> |
|||
<t t-foreach="website_sale_order.website_order_line" |
|||
t-as="order_line"> |
|||
<div class="item"> |
|||
<div class="item-img"> |
|||
<img t-attf-src="data:image/png;base64,{{order_line.product_id.image_1920}}" |
|||
alt=""/> |
|||
</div> |
|||
<div class="item-desc"> |
|||
<p class="item-cartname"> |
|||
<t t-esc="order_line.product_id.name"/> |
|||
</p> |
|||
<p class="item-cartabout"> |
|||
<t t-esc="order_line.product_id.categ_id.name"/> |
|||
</p> |
|||
<p class="item-rate"> |
|||
<t t-esc="order_line.price_unit"/> |
|||
</p> |
|||
</div> |
|||
</div> |
|||
<div class="item-desc"> |
|||
<p class="item-cartname"> |
|||
<t t-esc="order_line.product_id.name"/> |
|||
</p> |
|||
<p class="item-cartabout"> |
|||
<t t-esc="order_line.product_id.categ_id.name"/> |
|||
</p> |
|||
<p class="item-rate"> |
|||
<t t-esc="order_line.price_unit"/> |
|||
</p> |
|||
</div> |
|||
|
|||
</div> |
|||
</t> |
|||
</div> |
|||
<div class="cart-border"> |
|||
</div> |
|||
<div class="row list-row cart-box-total"> |
|||
<p class="list">Subtotal:</p> |
|||
<p class="amount"> |
|||
<t t-esc="website_sale_order.amount_total"/> |
|||
</p> |
|||
</div> |
|||
|
|||
<div class="cart-buttons"> |
|||
<a href="/shop/cart" |
|||
t-attf-class="nav-link"> |
|||
<button class="cartview">View Cart</button> |
|||
</a> |
|||
<a href="/shop/payment"> |
|||
<button class="cartcheckout">checkout</button> |
|||
</a> |
|||
|
|||
</t> |
|||
</div> |
|||
<div class="cart-border"/> |
|||
<div class="row list-row cart-box-total"> |
|||
<p class="list">Subtotal:</p> |
|||
<p class="amount"> |
|||
<t t-esc="website_sale_order.amount_total"/> |
|||
</p> |
|||
</div> |
|||
<div class="cart-buttons"> |
|||
<a href="/shop/cart" |
|||
t-attf-class="nav-link"> |
|||
<button class="cartview">View Cart</button> |
|||
</a> |
|||
<a href="/shop/payment"> |
|||
<button class="cartcheckout">checkout</button> |
|||
</a> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
|
|||
</xpath> |
|||
</template> |
|||
</odoo> |
|||
</odoo> |
|||
|
@ -1,123 +1,75 @@ |
|||
<?xml version="1.0" encoding="UTF-8" ?> |
|||
<odoo> |
|||
<!-- Navbar--> |
|||
<template id="header_coffee_shop" |
|||
inherit_id="website.template_header_default" |
|||
name="Template Header Theme" active="True"> |
|||
<xpath expr="//t[@t-call='website.navbar']" position="replace"> |
|||
|
|||
<t t-call="website.navbar"> |
|||
|
|||
<div id="top_menu_container" |
|||
class="container justify-content-start justify-content-lg-between"> |
|||
<div class="logo"> |
|||
<img src="/theme_coffee_shop/static/src/images/logo.png" |
|||
alt=""/> |
|||
</div> |
|||
|
|||
<div id="top_menu_collapse" class="collapse navbar-collapse order-last order-lg-0"> |
|||
<div id="top_menu_collapse" |
|||
class="collapse navbar-collapse order-last order-lg-0"> |
|||
<t t-call="website.navbar_nav"> |
|||
<t t-set="_nav_class" t-valuef="flex-grow"/> |
|||
<!-- Menu --> |
|||
<t t-foreach="website.menu_id.child_id" t-as="submenu"> |
|||
<t t-call="website.submenu"> |
|||
<t t-set="item_class" t-valuef="nav-item"/> |
|||
<t t-set="link_class" t-valuef="nav-link"/> |
|||
</t> |
|||
<t t-foreach="website.menu_id.child_id" |
|||
t-as="submenu"> |
|||
<t t-call="website.submenu"> |
|||
<t t-set="item_class" t-valuef="nav-item"/> |
|||
<t t-set="link_class" t-valuef="nav-link"/> |
|||
</t> |
|||
<!-- Cart--> |
|||
<t t-call="website_sale.header_cart_link"> |
|||
<t t-set="_icon" t-value="True"/> |
|||
<t t-set="_item_class" t-value="'mx-lg-3 '"/> |
|||
<t t-set="_link_class" t-value="'nav-link'"/> |
|||
</t> |
|||
<!-- Wishlist--> |
|||
<t t-call="website_sale_wishlist.header_wishlist_link"> |
|||
<t t-set="_icon" t-value="True"/> |
|||
<t t-set="_item_class" t-value="'mx-lg-3'"/> |
|||
<t t-set="_link_class" t-value="'nav-link'"/> |
|||
</t> |
|||
|
|||
<!-- Sign In --> |
|||
<t t-call="portal.placeholder_user_sign_in"> |
|||
<t t-set="_item_class" t-valuef="nav-item ms-lg-auto"/> |
|||
<t t-set="_link_class" t-valuef="nav-link fw-bold"/> |
|||
</t> |
|||
</t> |
|||
<!-- Cart --> |
|||
<t t-call="website_sale.header_cart_link"> |
|||
<t t-set="_icon" t-value="True"/> |
|||
<t t-set="_item_class" t-value="'mx-lg-3 '"/> |
|||
<t t-set="_link_class" t-value="'nav-link'"/> |
|||
</t> |
|||
<!-- Wishlist --> |
|||
<t t-call="website_sale_wishlist.header_wishlist_link"> |
|||
<t t-set="_icon" t-value="True"/> |
|||
<t t-set="_item_class" t-value="'mx-lg-3'"/> |
|||
<t t-set="_link_class" t-value="'nav-link'"/> |
|||
</t> |
|||
<!-- Sign In --> |
|||
<t t-call="portal.placeholder_user_sign_in"> |
|||
<t t-set="_item_class" |
|||
t-valuef="nav-item ms-lg-auto"/> |
|||
<t t-set="_link_class" |
|||
t-valuef="nav-link fw-bold"/> |
|||
</t> |
|||
<!-- User Dropdown --> |
|||
<t t-call="portal.user_dropdown"> |
|||
<t t-set="_user_name" t-value="true"/> |
|||
<t t-set="_item_class" t-valuef="dropdown ms-lg-auto "/> |
|||
<t t-set="_link_class" t-valuef="nav-link fw-bold"/> |
|||
<t t-set="_item_class" |
|||
t-valuef="dropdown ms-lg-auto "/> |
|||
<t t-set="_link_class" |
|||
t-valuef="nav-link fw-bold"/> |
|||
</t> |
|||
</t> |
|||
|
|||
</div> |
|||
|
|||
|
|||
<!-- Navbar Toggler --> |
|||
<t t-call="website.navbar_toggler"> |
|||
<t t-set="_toggler_class" t-valuef="ms-auto"/> |
|||
</t> |
|||
|
|||
</div> |
|||
|
|||
|
|||
</t> |
|||
</xpath> |
|||
</template> |
|||
|
|||
<!-- TEMPLATE FOR CART IN HEADER--> |
|||
<template id="coffee_header_cart_link" name=" Coffee Header Cart Link" |
|||
inherit_id="website_sale.header_cart_link"> |
|||
<xpath expr="//t" position="replace"> |
|||
<t t-nocache="The number of products is dynamic, this rendering cannot be cached." |
|||
t-nocache-_icon="_icon" |
|||
t-nocache-_text="_text" |
|||
t-nocache-_item_class="_item_class" |
|||
t-nocache-_link_class="_link_class"> |
|||
<t t-set="website_sale_cart_quantity" t-value="request.session['website_sale_cart_quantity'] if 'website_sale_cart_quantity' in request.session else website.sale_get_order().cart_quantity or 0"/> |
|||
<t t-set="show_cart" t-value="true"/> |
|||
<li t-attf-class="#{_item_class} divider d-none"/> |
|||
<li t-attf-class="o_wsale_my_cart align-self-md-start #{not show_cart and 'd-none'} #{_item_class}"> |
|||
<a href="/shop/cart" t-attf-class="#{_link_class}"> |
|||
<img class="cart-icon" |
|||
src="/theme_coffee_shop/static/src/images/cart.png" |
|||
alt=""/> |
|||
<span t-if="_text">Cart items</span> |
|||
<sup class="my_cart_quantity badge text-bg-primary d-none" t-esc="website_sale_cart_quantity" t-att-data-order-id="request.session.get('sale_order_id', '')"/> |
|||
<div class="notify"/> |
|||
</a> |
|||
|
|||
</li> |
|||
</t> |
|||
|
|||
</xpath> |
|||
</template> |
|||
|
|||
<!-- TEMPLATE FOR WISHLIST IN HEADER--> |
|||
<!-- TEMPLATE FOR WISHLIST AND CART IN HEADER--> |
|||
<template id="coffee_header_wishlist_link" |
|||
name=" Coffee Header Wishlist Link" |
|||
inherit_id="website_sale_wishlist.header_wishlist_link"> |
|||
<xpath expr="//t" position="replace"> |
|||
<t t-nocache="The wishlist may vary and depends on the user." |
|||
t-nocache-_icon="_icon" |
|||
t-nocache-_item_class="_item_class" |
|||
t-nocache-_link_class="_link_class" |
|||
t-nocache-_text="_text"> |
|||
<t t-set="wishcount" |
|||
t-value="len(request.env['product.wishlist'].current())"/> |
|||
<t t-set="show_wishes" t-value="True"/> |
|||
<li t-attf-class="o_wsale_my_wish #{not show_wishes and 'd-none'} #{_item_class}"> |
|||
<a href="/shop/wishlist" t-attf-class="#{_link_class}"> |
|||
<img src="/theme_coffee_shop/static/src/images/wishlist.png" |
|||
alt=""/> |
|||
<span t-if="_text">Wishlist</span> |
|||
<div class="notify"/> |
|||
</a> |
|||
</li> |
|||
</t> |
|||
inherit_id="website_sale_wishlist.template_header_default"> |
|||
<xpath expr="//t[@t-call='website_sale.header_cart_link']" |
|||
position="replace"> |
|||
</xpath> |
|||
<xpath expr="//t[@t-call='website_sale_wishlist.header_wishlist_link']" |
|||
position="replace"> |
|||
</xpath> |
|||
</template> |
|||
|
|||
|
|||
|
|||
</odoo> |
|||
|
@ -1,280 +0,0 @@ |
|||
<?xml version="1.0" encoding="UTF-8" ?> |
|||
<odoo> |
|||
|
|||
<!-- SIGN IN FIELDS--> |
|||
<template id="coffee_auth_fields" inherit_id="auth_signup.fields" name="Auth Signup/ResetPassword form fields"> |
|||
<xpath expr="//t" position="replace"> |
|||
|
|||
<div class="form-group"> |
|||
<input type="text" name="login" t-att-value="login" |
|||
id="login" class="login-input form-control form-control-sm" |
|||
placeholder="Email" autofocus="autofocus" |
|||
autocapitalize="off" required="required" |
|||
t-att-readonly="'readonly' if only_passwords else None" |
|||
style="margin-bottom: 15px;"/> |
|||
</div> |
|||
<div class="form-group"> |
|||
<input type="text" name="name" t-att-value="name" |
|||
id="name" class="login-input" placeholder="Your Name" |
|||
style="margin-bottom: 15px;" |
|||
required="required" t-att-readonly="'readonly' if only_passwords else None" |
|||
t-att-autofocus="'autofocus' if login and not only_passwords else None" /> |
|||
</div> |
|||
<div class="form-group"> |
|||
<input type="password" name="password" id="password" |
|||
class="login-input" placeholder="Password" |
|||
style="margin-bottom: 15px;" |
|||
required="required" t-att-autofocus="'autofocus' if only_passwords else None"/> |
|||
</div> |
|||
<div class="form-group"> |
|||
<input type="password" name="confirm_password" id="confirm_password" |
|||
class="login-input" placeholder="Confirm Password" |
|||
style="margin-bottom: 15px;" required="required"/> |
|||
</div> |
|||
|
|||
</xpath> |
|||
</template> |
|||
|
|||
|
|||
<!-- SIGN UP--> |
|||
<template id="coffee_signup" name="Sign up login" inherit_id="auth_signup.signup"> |
|||
<xpath expr="//t[@t-call='web.login_layout']" position="replace"> |
|||
<t t-call="web.login_layout"> |
|||
<section class="login-form-container show"> |
|||
<form style="width: 505px;height: auto;" role="form" method="post" t-if="not message"> |
|||
<input type="hidden" name="csrf_token" |
|||
t-att-value="request.csrf_token()"/> |
|||
<i class="fa-solid fa-xmark login-close">X</i> |
|||
<div class="form-content"> |
|||
<h3 class="login-form-head">Create New Account |
|||
</h3> |
|||
<div class="form-group"> |
|||
<div class="o_login_auth"> |
|||
<t t-call="auth_oauth.providers"/> |
|||
</div> |
|||
</div> |
|||
|
|||
<div class="form-group"> |
|||
<input type="text" name="login" t-att-value="login" |
|||
id="login" class="login-input form-control form-control-sm" |
|||
placeholder="Email" autofocus="autofocus" |
|||
autocapitalize="off" required="required" |
|||
t-att-readonly="'readonly' if only_passwords else None" |
|||
style="margin-bottom: 15px;"/> |
|||
</div> |
|||
<div class="form-group"> |
|||
<input type="text" name="name" t-att-value="name" |
|||
id="name" class="login-input" placeholder="Your Name" |
|||
style="margin-bottom: 15px;" |
|||
required="required" t-att-readonly="'readonly' if only_passwords else None" |
|||
t-att-autofocus="'autofocus' if login and not only_passwords else None" /> |
|||
</div> |
|||
<div class="form-group"> |
|||
<input type="password" name="password" id="password" |
|||
class="login-input" placeholder="Password" |
|||
style="margin-bottom: 15px;" |
|||
required="required" t-att-autofocus="'autofocus' if only_passwords else None"/> |
|||
</div> |
|||
<div class="form-group"> |
|||
<input type="password" name="confirm_password" id="confirm_password" |
|||
class="login-input" placeholder="Confirm Password" |
|||
style="margin-bottom: 15px;" required="required"/> |
|||
</div> |
|||
|
|||
<t t-set="only_passwords" t-value="bool(token and not invalid_token)"/> |
|||
|
|||
<input type="hidden" name="redirect" t-att-value="redirect"/> |
|||
<input type="hidden" name="token" t-att-value="token"/> |
|||
|
|||
<button type="submit" class="login-google"> Sign up</button> |
|||
<p class="register"> |
|||
<a t-attf-href="/web/login?{{ keep_query() }}" class="frgt-text" role="button">Already have an account?</a> |
|||
</p> |
|||
|
|||
</div> |
|||
</form> |
|||
</section> |
|||
</t> |
|||
</xpath> |
|||
</template> |
|||
|
|||
<!-- RESET PASSWORD--> |
|||
|
|||
<template id="coffee_reset" inherit_id="auth_signup.reset_password" name="Reset password"> |
|||
<xpath expr="//t[@t-call='web.login_layout']" position="replace"> |
|||
<t t-call="web.login_layout"> |
|||
<section class="login-form-container show"> |
|||
<form style="width: 445px;height: auto;" |
|||
role="form" method="post" t-if="not message" > |
|||
<input type="hidden" name="csrf_token" t-att-value="request.csrf_token()"/> |
|||
<i class="fa-solid fa-xmark login-close">X</i> |
|||
<div class="form-content"> |
|||
<h3 class="login-form-head">Reset Password |
|||
</h3> |
|||
|
|||
<t t-if="token and not invalid_token"> |
|||
<t t-call="auth_signup.fields"> |
|||
<t t-set="only_passwords" t-value="1"/> |
|||
</t> |
|||
</t> |
|||
<t t-if="not token"> |
|||
<div class="form-group"> |
|||
<input type="text" name="login" t-att-value="login" |
|||
id="login" class="login-input" placeholder="Your Email" |
|||
style="margin-bottom: 15px;" autofocus="autofocus" |
|||
required="required" autocapitalize="off"/> |
|||
</div> |
|||
</t> |
|||
<input type="hidden" name="redirect" t-att-value="redirect"/> |
|||
<input type="hidden" name="token" t-att-value="token"/> |
|||
<button type="submit" class="login-google" style="margin-bottom: 15px;">Reset Password</button> |
|||
<p class="register"> |
|||
<a t-if="not token" t-attf-href="/web/login?{{ keep_query() }}" class="frgt-text">Back to Login</a> |
|||
<a t-if="invalid_token" href="/web/login" class="frgt-text">Back to Login</a> |
|||
</p> |
|||
|
|||
</div> |
|||
|
|||
</form> |
|||
</section> |
|||
</t> |
|||
</xpath> |
|||
</template> |
|||
|
|||
|
|||
<!-- TEMPLATE FOR LOGIN--> |
|||
<template id="coffee_user_sign_in" name="User Sign In" inherit_id="portal.user_sign_in"> |
|||
<xpath expr="." position="replace"> |
|||
<li t-nocache="Profile session and user group can change unrelated to parent caches." |
|||
t-nocache-_item_class="_item_class" |
|||
t-nocache-_link_class="_link_class" |
|||
groups="base.group_public" t-attf-class="#{_item_class} o_no_autohide_item"> |
|||
<a t-attf-href="/web/login" t-attf-class="#{_link_class}"> |
|||
<span> Log in</span> |
|||
<span t-if="request.session.profile_session" class="text-danger fa fa-circle"/> |
|||
</a> |
|||
</li> |
|||
</xpath> |
|||
</template> |
|||
|
|||
|
|||
<!-- PROFILE--> |
|||
<template id="user_dropdown" name="Portal User Dropdown" inherit_id="portal.user_dropdown"> |
|||
<xpath expr="//t" position="replace"> |
|||
<t t-nocache="Each user is different regardless of the page visited." |
|||
t-nocache-_avatar="_avatar" |
|||
t-nocache-_icon="_icon" |
|||
t-nocache-_icon_class="_icon_class" |
|||
t-nocache-_user_name="_user_name" |
|||
t-nocache-_user_name_class="_user_name_class" |
|||
t-nocache-_item_class="_item_class" |
|||
t-nocache-_link_class="_link_class" |
|||
t-nocache-_dropdown_menu_class="_dropdown_menu_class"> |
|||
<t t-set="is_connected" t-value="not user_id._is_public()"/> |
|||
<li t-if="is_connected" t-attf-class="#{_item_class} o_no_autohide_item"> |
|||
<a href="#" role="button" data-bs-toggle="dropdown" t-attf-class="dropdown-toggle #{_link_class}"> |
|||
<t t-if="_avatar"> |
|||
<t t-set="avatar_source" t-value="image_data_uri(user_id.avatar_256)"/> |
|||
<img t-att-src="avatar_source" t-attf-class="rounded-circle o_object_fit_cover #{_avatar_class}" width="24" height="24" alt="" loading="eager"/> |
|||
</t> |
|||
<i t-if="_icon" t-attf-class="fa fa-1x fa-fw fa-user-circle-o #{_icon_class}"/> |
|||
<span t-if="_user_name" t-attf-class="#{_user_name_class}" t-esc="user_id.name[:23] + '...' if user_id.name and len(user_id.name) > 25 else user_id.name"/> |
|||
</a> |
|||
<div t-attf-class=" dropdown-menu js_usermenu #{_dropdown_menu_class}" role="menu"> |
|||
<a groups="base.group_user" href="/web" role="menuitem" class="dropdown-item ps-3 my_coffee" id="o_backend_user_dropdown_link"> |
|||
Apps |
|||
</a> |
|||
<a href="/my/home" role="menuitem" class="dropdown-item ps-3 my_coffee "> |
|||
My Account |
|||
</a> |
|||
<a t-attf-href="/web/session/logout?redirect=/" role="menuitem" id="o_logout" class="dropdown-item ps-3 my_coffee"> |
|||
Logout |
|||
</a> |
|||
</div> |
|||
</li> |
|||
</t> |
|||
</xpath> |
|||
</template> |
|||
|
|||
|
|||
<!-- LOGIN--> |
|||
<template id="coffee_login" inherit_id="web.login" name="Coffee login"> |
|||
<xpath expr="//t[@t-call='web.login_layout']" position="replace"> |
|||
|
|||
<t t-call="web.login_layout"> |
|||
<section class="login-form-container show"> |
|||
|
|||
<form action="" style="width: 505px;height: auto;" |
|||
role="form" t-attf-action="/web/login" method="post" |
|||
onsubmit="this.action = '/web/login' + location.hash"> |
|||
<input type="hidden" name="csrf_token" |
|||
t-att-value="request.csrf_token()"/> |
|||
<i class="fa-solid fa-xmark login-close">X</i> |
|||
<div class="form-content"> |
|||
<h3 class="login-form-head">Welcome to expresoo</h3> |
|||
<div class="form-group"> |
|||
<div class="o_login_auth"> |
|||
<t t-call="auth_oauth.providers"></t> |
|||
</div> |
|||
<input type="text" |
|||
class="login-input" |
|||
placeholder="Email" |
|||
name="login" |
|||
t-att-value="login" |
|||
id="login" |
|||
required="required" |
|||
autofocus="autofocus" |
|||
autocapitalize="off" |
|||
style="margin-bottom: 15px;"/> |
|||
</div> |
|||
<div class="form-group"> |
|||
<input type="password" |
|||
class="login-input" |
|||
placeholder="Password" |
|||
name="password" |
|||
id="password" |
|||
required="required" |
|||
autocomplete="current-password" |
|||
t-att-autofocus="'autofocus' if login else None" |
|||
maxlength="4096"/> |
|||
</div> |
|||
|
|||
<div class="password-settings"> |
|||
<a t-if="signup_enabled" t-attf-href="/web/signup?{{ keep_query() }}" class="frgt-text">Create an account</a> |
|||
<a t-if="reset_password_enabled" t-attf-href="/web/reset_password?{{ keep_query() }}" class="frgt-text">Forgot password?</a> |
|||
</div> |
|||
|
|||
<button type="submit" class="login-google">Login</button> |
|||
<br></br> |
|||
<t t-if="debug"> |
|||
<button type="submit" name="redirect" style="padding-top: 10px;" value="/web/become" class="btn btn-link btn-sm frgt-text">Log in as superuser</button> |
|||
</t> |
|||
</div> |
|||
<input type="hidden" name="redirect" t-att-value="redirect"/> |
|||
</form> |
|||
|
|||
</section> |
|||
</t> |
|||
</xpath> |
|||
|
|||
</template> |
|||
|
|||
|
|||
<!--REMOVE 'OR' FROM LOGIN PAGE--> |
|||
<template id="remove_or" inherit_id="auth_oauth.providers"> |
|||
<xpath expr="//t" position="replace"> |
|||
<t t-if="len(providers) > 0"> |
|||
<em t-attf-class="d-block d-none text-center text-muted small my-#{len(providers) if len(providers) < 3 else 3}">- or -</em> |
|||
<div class="o_auth_oauth_providers list-group mt-1 mb-1 text-start"> |
|||
<a t-foreach="providers" t-as="p" class="list-group-item list-group-item-action py-2 my_superlogin" t-att-href="p['auth_link']"> |
|||
<i t-att-class="p['css_class']"/> |
|||
<t t-esc="p['body']"/> |
|||
</a> |
|||
</div> |
|||
<p class="login-or">Or sign in with Email</p> |
|||
</t> |
|||
</xpath> |
|||
</template> |
|||
|
|||
|
|||
</odoo> |
@ -1,76 +1,93 @@ |
|||
<?xml version="1.0" encoding="UTF-8" ?> |
|||
<odoo> |
|||
<!-- This XML template inherits from the existing "website_sale.payment" template --> |
|||
<template id="coffee_shop_payment" inherit_id="website_sale.payment" |
|||
name="Coffee Payment"> |
|||
<xpath expr="." position="replace"> |
|||
<t t-call="website.layout"> |
|||
<t t-set="additional_title">Shop - Select Payment Provider</t> |
|||
<t t-set="no_footer" t-value="1"/> |
|||
|
|||
<div id="wrap"> |
|||
<div class="container oe_website_sale py-2"> |
|||
<div class="row"> |
|||
<div class='col-12'> |
|||
<t t-call="website_sale.wizard_checkout"> |
|||
<t t-set="step" t-value="40" /> |
|||
</t> |
|||
</div> |
|||
<div class="col-12" t-if="errors"> |
|||
<t t-foreach="errors" t-as="error"> |
|||
<div class="alert alert-danger" t-if="error" role="alert"> |
|||
<h4> |
|||
<t t-esc="error[0]" /> |
|||
</h4> |
|||
<t t-esc="error[1]" /> |
|||
</div> |
|||
</t> |
|||
</div> |
|||
<div class="col-12 col-xl-auto order-xl-2"> |
|||
<t t-call="website_sale.cart_summary"/> |
|||
</div> |
|||
<div class="col-12 col-xl order-xl-1 oe_cart"> |
|||
<div id='address_on_payment'> |
|||
<t t-call="website_sale.address_on_payment"/> |
|||
<t t-set="additional_title">Shop - Select Payment Provider</t> |
|||
<t t-set="no_footer" t-value="1"/> |
|||
<div id="wrap"> |
|||
<div class="container oe_website_sale py-2"> |
|||
<div class="row"> |
|||
<div class='col-12'> |
|||
<t t-call="website_sale.wizard_checkout"> |
|||
<t t-set="step" t-value="40"/> |
|||
</t> |
|||
</div> |
|||
|
|||
<div class="oe_structure clearfix mt-3" id="oe_structure_website_sale_payment_1"/> |
|||
|
|||
<t t-if="website_sale_order.amount_total"> |
|||
<div t-if="providers or tokens" id="payment_method" class="mt-3"> |
|||
<h3 class="mb24">Pay with </h3> |
|||
<t t-call="payment.checkout"> |
|||
<t t-set="footer_template_id" t-value="'website_sale.payment_footer'"/> |
|||
<t t-set="submit_button_label" class="btn-color">Pay Now</t> |
|||
</t> |
|||
</div> |
|||
<div t-else="" class="alert alert-warning"> |
|||
<strong>No suitable payment option could be found.</strong><br/> |
|||
If you believe that it is an error, please contact the website administrator. |
|||
<div class="col-12" t-if="errors"> |
|||
<t t-foreach="errors" t-as="error"> |
|||
<div class="alert alert-danger" |
|||
t-if="error" role="alert"> |
|||
<h4> |
|||
<t t-esc="error[0]"/> |
|||
</h4> |
|||
<t t-esc="error[1]"/> |
|||
</div> |
|||
</t> |
|||
</div> |
|||
<div class="col-12 col-xl-auto order-xl-2"> |
|||
<t t-call="website_sale.cart_summary"/> |
|||
</div> |
|||
<div class="col-12 col-xl order-xl-1 oe_cart"> |
|||
<div id='address_on_payment'> |
|||
<t t-call="website_sale.address_on_payment"/> |
|||
</div> |
|||
</t> |
|||
|
|||
<div t-if="not providers" class="mt-2"> |
|||
<div class="oe_structure clearfix mt-3" |
|||
id="oe_structure_website_sale_payment_1"/> |
|||
<t t-if="website_sale_order.amount_total"> |
|||
<div t-if="providers or tokens" |
|||
id="payment_method" class="mt-3"> |
|||
<h3 class="mb24">Pay with</h3> |
|||
<t t-call="payment.checkout"> |
|||
<t t-set="footer_template_id" |
|||
t-value="'website_sale.payment_footer'"/> |
|||
<t t-set="submit_button_label" |
|||
class="btn-color">Pay Now |
|||
</t> |
|||
</t> |
|||
</div> |
|||
<div t-else="" class="alert alert-warning"> |
|||
<strong>No suitable payment option |
|||
could be found. |
|||
</strong> |
|||
<br/> |
|||
If you believe that it is an error, |
|||
please contact the website |
|||
administrator. |
|||
</div> |
|||
</t> |
|||
<div t-if="not providers" class="mt-2"> |
|||
<a role="button" groups="base.group_system" |
|||
t-attf-href="/web#action=#{payment_action_id}"> |
|||
<i class="fa fa-arrow-right"></i> Add payment providers |
|||
</a> |
|||
</div> |
|||
<div class="js_payment mt-3" t-if="not website_sale_order.amount_total" id="payment_method" name="o_website_sale_free_cart"> |
|||
<form target="_self" action="/shop/payment/validate" method="post"> |
|||
<input type="hidden" name="csrf_token" t-att-value="request.csrf_token()" /> |
|||
<t t-call="website_sale.payment_footer" class="btn-color"> |
|||
<t t-set="submit_button_label" class="btn-color">Confirm Order</t> |
|||
</t> |
|||
</form> |
|||
t-attf-href="/web#action=#{payment_action_id}"> |
|||
<i class="fa fa-arrow-right"/> |
|||
Add payment providers |
|||
</a> |
|||
</div> |
|||
<div class="js_payment mt-3" |
|||
t-if="not website_sale_order.amount_total" |
|||
id="payment_method" |
|||
name="o_website_sale_free_cart"> |
|||
<form target="_self" |
|||
action="/shop/payment/validate" |
|||
method="post"> |
|||
<input type="hidden" name="csrf_token" |
|||
t-att-value="request.csrf_token()"/> |
|||
<t t-call="website_sale.payment_footer" |
|||
class="btn-color"> |
|||
<t t-set="submit_button_label" |
|||
class="btn-color">Confirm Order |
|||
</t> |
|||
</t> |
|||
</form> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
<div class="oe_structure" |
|||
id="oe_structure_website_sale_payment_2"/> |
|||
</div> |
|||
<div class="oe_structure" id="oe_structure_website_sale_payment_2"/> |
|||
</div> |
|||
</t> |
|||
</t> |
|||
</xpath> |
|||
</template> |
|||
|
|||
|
|||
</odoo> |
|||
</odoo> |
|||
|
@ -1,67 +1,90 @@ |
|||
<?xml version="1.0" encoding="UTF-8" ?> |
|||
<odoo> |
|||
<template id="coffee_shop_payment_summary" inherit_id="website_sale.cart_summary" |
|||
<!-- Template for cart summary--> |
|||
<template id="coffee_shop_payment_summary" |
|||
inherit_id="website_sale.cart_summary" |
|||
name="Coffee Payment Total"> |
|||
<xpath expr="." position="replace"> |
|||
|
|||
<div class="card tbl-tbl"> |
|||
<div class="card-body"> |
|||
<div class="toggle_summary d-xl-none"> |
|||
<b>Your order: </b> <span id="amount_total_summary" class="monetary_field" t-field="website_sale_order.amount_total" t-options='{"widget": "monetary", "display_currency": website_sale_order.pricelist_id.currency_id}'/> |
|||
<span class='fa fa-chevron-down fa-border float-end' role="img" aria-label="Details" title="Details"></span> |
|||
</div> |
|||
<div t-if="not website_sale_order or not website_sale_order.website_order_line" class="alert alert-info"> |
|||
Your cart is empty! |
|||
</div> |
|||
<div class="toggle_summary_div d-none d-xl-block"> |
|||
<table class="table table-striped table-sm" id="cart_products" t-if="website_sale_order and website_sale_order.website_order_line"> |
|||
<thead> |
|||
<h3>Order Summary</h3> |
|||
</thead> |
|||
<tbody> |
|||
<tr t-foreach="website_sale_order.website_order_line" t-as="line" class="d-none"> |
|||
<td colspan="2" t-if="not line.product_id.product_tmpl_id"/> |
|||
<t t-else=""> |
|||
<td class='td-img text-center'> |
|||
<span t-if="line._is_not_sellable_line() and line.product_id.image_128"> |
|||
<img t-att-src="image_data_uri(line.product_id.image_128)" class="img o_image_64_max rounded" t-att-alt="line.name_short"/> |
|||
</span> |
|||
<span t-else="" |
|||
t-field="line.product_id.image_128" |
|||
t-options="{'widget': 'image', 'qweb_img_responsive': False, 'class': 'rounded o_image_64_max'}" |
|||
/> |
|||
<div class="card-body"> |
|||
<div class="toggle_summary d-xl-none"> |
|||
<b>Your order:</b> |
|||
<span id="amount_total_summary" class="monetary_field" |
|||
t-field="website_sale_order.amount_total" |
|||
t-options='{"widget": "monetary", "display_currency": website_sale_order.pricelist_id.currency_id}'/> |
|||
<span class='fa fa-chevron-down fa-border float-end' |
|||
role="img" aria-label="Details" title="Details"/> |
|||
</div> |
|||
<div t-if="not website_sale_order or not website_sale_order.website_order_line" |
|||
class="alert alert-info"> |
|||
Your cart is empty! |
|||
</div> |
|||
<div class="toggle_summary_div d-none d-xl-block"> |
|||
<table class="table table-striped table-sm" |
|||
id="cart_products" |
|||
t-if="website_sale_order and website_sale_order.website_order_line"> |
|||
<thead> |
|||
<h3>Order Summary</h3> |
|||
</thead> |
|||
<tbody> |
|||
<tr t-foreach="website_sale_order.website_order_line" |
|||
t-as="line" class="d-none"> |
|||
<td colspan="2" |
|||
t-if="not line.product_id.product_tmpl_id"/> |
|||
<t t-else=""> |
|||
<td class='td-img text-center'> |
|||
<span t-if="line._is_not_sellable_line() and line.product_id.image_128"> |
|||
<img t-att-src="image_data_uri(line.product_id.image_128)" |
|||
class="img o_image_64_max rounded" |
|||
t-att-alt="line.name_short"/> |
|||
</span> |
|||
<span t-else="" |
|||
t-field="line.product_id.image_128" |
|||
t-options="{'widget': 'image', 'qweb_img_responsive': False, 'class': 'rounded o_image_64_max'}" |
|||
/> |
|||
</td> |
|||
<td class='td-product_name'> |
|||
<div> |
|||
<strong t-field="line.name_short"/> |
|||
</div> |
|||
</td> |
|||
</t> |
|||
<td class='td-qty'> |
|||
<div t-esc="line.product_uom_qty"/> |
|||
<t t-if='line._get_shop_warning(clear=False)'> |
|||
<i class='fa fa-warning text-warning' |
|||
t-att-title="line._get_shop_warning()" |
|||
role="img" |
|||
aria-label="Warning"/> |
|||
</t> |
|||
</td> |
|||
<td class='td-product_name'> |
|||
<div> |
|||
<strong t-field="line.name_short" /> |
|||
</div> |
|||
<td class="text-center td-price text-nowrap"> |
|||
<span t-field="line.price_reduce_taxexcl" |
|||
t-options="{'widget': 'monetary', 'display_currency': website_sale_order.currency_id}" |
|||
groups="account.group_show_line_subtotals_tax_excluded"/> |
|||
<span t-field="line.price_reduce_taxinc" |
|||
t-options="{'widget': 'monetary', 'display_currency': website_sale_order.currency_id}" |
|||
groups="account.group_show_line_subtotals_tax_included"/> |
|||
</td> |
|||
</t> |
|||
<td class='td-qty'> |
|||
<div t-esc="line.product_uom_qty" /> |
|||
<t t-if='line._get_shop_warning(clear=False)'> |
|||
<i class='fa fa-warning text-warning' t-att-title="line._get_shop_warning()" role="img" aria-label="Warning"/> |
|||
</t> |
|||
</td> |
|||
<td class="text-center td-price"> |
|||
<span t-field="line.price_reduce_taxexcl" style="white-space: nowrap;" t-options="{'widget': 'monetary', 'display_currency': website_sale_order.currency_id}" groups="account.group_show_line_subtotals_tax_excluded" /> |
|||
<span t-field="line.price_reduce_taxinc" style="white-space: nowrap;" t-options="{'widget': 'monetary', 'display_currency': website_sale_order.currency_id}" groups="account.group_show_line_subtotals_tax_included" /> |
|||
</td> |
|||
</tr> |
|||
</tbody> |
|||
</table> |
|||
<t t-if='website_sale_order'> |
|||
<t t-set='warning' t-value='website_sale_order._get_shop_warning(clear=False)' /> |
|||
<div t-if='warning' class="alert alert-warning" role="alert"> |
|||
<strong>Warning!</strong> <t t-esc='website_sale_order._get_shop_warning()'/> |
|||
</div> |
|||
</t> |
|||
<t t-call="website_sale.total"> |
|||
<t t-set='redirect' t-value="redirect or '/shop/payment'"></t> |
|||
</t> |
|||
</tr> |
|||
</tbody> |
|||
</table> |
|||
<t t-if='website_sale_order'> |
|||
<t t-set='warning' |
|||
t-value='website_sale_order._get_shop_warning(clear=False)'/> |
|||
<div t-if='warning' class="alert alert-warning" |
|||
role="alert"> |
|||
<strong>Warning!</strong> |
|||
<t t-esc='website_sale_order._get_shop_warning()'/> |
|||
</div> |
|||
</t> |
|||
<t t-call="website_sale.total"> |
|||
<t t-set='redirect' |
|||
t-value="redirect or '/shop/payment'"/> |
|||
</t> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</xpath> |
|||
</template> |
|||
</odoo> |
|||
</odoo> |
|||
|
@ -1,117 +1,173 @@ |
|||
<?xml version="1.0" encoding="UTF-8" ?> |
|||
<odoo> |
|||
|
|||
<!-- Template for product page--> |
|||
<template id="coffee_product_page" inherit_id="website_sale.product"> |
|||
<xpath expr="//div[@id='product_detail_main']" position="replace"> |
|||
<div class="row" id="product_detail_main" data-name="Product Page" |
|||
t-att-data-image_width="website.product_page_image_width" |
|||
t-att-data-image_layout="website.product_page_image_layout"> |
|||
<t t-set="image_cols" t-value="website._get_product_page_proportions()"/> |
|||
<div t-attf-class="col-lg-#{image_cols[0]} mt-lg-4 o_wsale_product_images position-relative" t-if="website.product_page_image_width != 'none'"> |
|||
<t t-call="website_sale.shop_product_images"/> |
|||
<xpath expr="//div[@id='product_detail_main']" position="replace"> |
|||
<div class="row" id="product_detail_main" data-name="Product Page" |
|||
t-att-data-image_width="website.product_page_image_width" |
|||
t-att-data-image_layout="website.product_page_image_layout"> |
|||
<t t-set="image_cols" |
|||
t-value="website._get_product_page_proportions()"/> |
|||
<div t-attf-class="col-lg-#{image_cols[0]} mt-lg-4 o_wsale_product_images position-relative" |
|||
t-if="website.product_page_image_width != 'none'"> |
|||
<t t-call="website_sale.shop_product_images"/> |
|||
</div> |
|||
<div t-attf-class="col-lg-#{image_cols[1]} mt-md-4" |
|||
id="product_details"> |
|||
<div class="pr-descr"> |
|||
<t t-set="base_url" t-value="product.get_base_url()"/> |
|||
<h1 itemprop="name" t-field="product.name" |
|||
class="pr-title">Product Name |
|||
</h1> |
|||
<div class="pr-price"> |
|||
<b> |
|||
<t t-call="website_sale.product_price"/> |
|||
</b> |
|||
<small t-if="combination_info['base_unit_price']" |
|||
class="ms-1 text-muted o_base_unit_price_wrapper d-none" |
|||
groups="website_sale.group_show_uom_price"> |
|||
<t t-call='website_sale.base_unit_price'/> |
|||
</small> |
|||
</div> |
|||
</div> |
|||
|
|||
<div t-attf-class="col-lg-#{image_cols[1]} mt-md-4" id="product_details"> |
|||
<div class="pr-descr"> |
|||
<t t-set="base_url" t-value="product.get_base_url()"/> |
|||
<h1 itemprop="name" t-field="product.name" class="pr-title">Product Name</h1> |
|||
<div class="pr-price"> |
|||
<b><t t-call="website_sale.product_price"/></b> |
|||
<small t-if="combination_info['base_unit_price']" |
|||
class="ms-1 text-muted o_base_unit_price_wrapper d-none" groups="website_sale.group_show_uom_price"> |
|||
<t t-call='website_sale.base_unit_price'/> |
|||
</small> |
|||
</div> |
|||
<span itemprop="url" class="d-none" |
|||
t-esc="base_url + product.website_url"/> |
|||
<span itemprop="image" class="d-none" |
|||
t-esc="base_url + website.image_url(product, 'image_1920')"/> |
|||
<t t-if="is_view_active('website_sale.product_comment')"> |
|||
<a href="#o_product_page_reviews" |
|||
class="o_product_page_reviews_link text-decoration-none"> |
|||
<t t-call="portal_rating.rating_widget_stars_static"> |
|||
<t t-set="rating_avg" |
|||
t-value="product.rating_avg"/> |
|||
<t t-set="trans_text_plural">%s reviews</t> |
|||
<t t-set="trans_text_singular">%s review</t> |
|||
<t t-set="rating_count" |
|||
t-value="(trans_text_plural if product.rating_count > 1 else trans_text_singular) % product.rating_count"/> |
|||
</t> |
|||
</a> |
|||
</t> |
|||
<p t-field="product.description_sale" |
|||
class="text-muted my-2" |
|||
placeholder="A short description that will also appear on documents."/> |
|||
<form t-if="product._is_add_to_cart_possible()" |
|||
action="/shop/cart/update" method="POST"> |
|||
<input type="hidden" name="csrf_token" |
|||
t-att-value="request.csrf_token()"/> |
|||
<div class="js_product js_main_product mb-3"> |
|||
<div class="d-none"> |
|||
<t t-call="website_sale.product_price"/> |
|||
<small t-if="combination_info['base_unit_price']" |
|||
class="ms-1 text-muted o_base_unit_price_wrapper d-none" |
|||
groups="website_sale.group_show_uom_price"> |
|||
<t t-call='website_sale.base_unit_price'/> |
|||
</small> |
|||
</div> |
|||
<span itemprop="url" style="display:none;" t-esc="base_url + product.website_url"/> |
|||
<span itemprop="image" style="display:none;" t-esc="base_url + website.image_url(product, 'image_1920')" /> |
|||
<t t-if="is_view_active('website_sale.product_comment')"> |
|||
<a href="#o_product_page_reviews" class="o_product_page_reviews_link text-decoration-none"> |
|||
<t t-call="portal_rating.rating_widget_stars_static"> |
|||
<t t-set="rating_avg" t-value="product.rating_avg"/> |
|||
<t t-set="trans_text_plural">%s reviews</t> |
|||
<t t-set="trans_text_singular">%s review</t> |
|||
<t t-set="rating_count" t-value="(trans_text_plural if product.rating_count > 1 else trans_text_singular) % product.rating_count"/> |
|||
<t t-placeholder="select"> |
|||
<input type="hidden" class="product_id" |
|||
name="product_id" |
|||
t-att-value="product_variant.id"/> |
|||
<input type="hidden" |
|||
class="product_template_id" |
|||
name="product_template_id" |
|||
t-att-value="product.id"/> |
|||
<input t-if="product.public_categ_ids.ids" |
|||
type="hidden" |
|||
class="product_category_id" |
|||
name="product_category_id" |
|||
t-att-value="product.public_categ_ids.ids[0]"/> |
|||
<input t-if="product.product_tag_ids.ids" |
|||
type="hidden" class="product_tag_id" |
|||
name="product_tag_id" |
|||
t-att-value="product.product_tag_ids.ids[0]"/> |
|||
<t t-if="combination" t-call="sale.variants"> |
|||
<t t-set="ul_class" |
|||
t-valuef="flex-column"/> |
|||
<t t-set="parent_combination" |
|||
t-value="None"/> |
|||
</t> |
|||
</a> |
|||
</t> |
|||
<p t-field="product.description_sale" class="text-muted my-2" placeholder="A short description that will also appear on documents." /> |
|||
<form t-if="product._is_add_to_cart_possible()" action="/shop/cart/update" method="POST"> |
|||
<input type="hidden" name="csrf_token" t-att-value="request.csrf_token()" /> |
|||
<div class="js_product js_main_product mb-3"> |
|||
<div class="d-none"> |
|||
<t t-call="website_sale.product_price"/> |
|||
<small t-if="combination_info['base_unit_price']" |
|||
class="ms-1 text-muted o_base_unit_price_wrapper d-none" groups="website_sale.group_show_uom_price"> |
|||
<t t-call='website_sale.base_unit_price'/> |
|||
</small> |
|||
</div> |
|||
<t t-placeholder="select"> |
|||
<input type="hidden" class="product_id" name="product_id" t-att-value="product_variant.id" /> |
|||
<input type="hidden" class="product_template_id" name="product_template_id" t-att-value="product.id" /> |
|||
<input t-if="product.public_categ_ids.ids" type="hidden" class="product_category_id" name="product_category_id" t-att-value="product.public_categ_ids.ids[0]" /> |
|||
<input t-if="product.product_tag_ids.ids" type="hidden" class="product_tag_id" name="product_tag_id" t-att-value="product.product_tag_ids.ids[0]" /> |
|||
<t t-if="combination" t-call="sale.variants"> |
|||
<t t-set="ul_class" t-valuef="flex-column" /> |
|||
<t t-set="parent_combination" t-value="None" /> |
|||
</t> |
|||
<t t-else=""> |
|||
<ul class="d-none js_add_cart_variants mb-0" t-att-data-attribute_exclusions="{'exclusions: []'}"/> |
|||
</t> |
|||
<t t-else=""> |
|||
<ul class="d-none js_add_cart_variants mb-0" |
|||
t-att-data-attribute_exclusions="{'exclusions: []'}"/> |
|||
</t> |
|||
<p t-if="True" class="css_not_available_msg alert alert-warning">This combination does not exist.</p> |
|||
<div id="o_wsale_cta_wrapper" class="d-flex flex-wrap align-items-center"> |
|||
<t t-set="hasQuantities" t-value="false"/> |
|||
<t t-set="hasBuyNow" t-value="false"/> |
|||
<t t-set="ctaSizeBig" t-value="not hasQuantities or not hasBuyNow"/> |
|||
</t> |
|||
<p t-if="True" |
|||
class="css_not_available_msg alert alert-warning"> |
|||
This combination does not exist. |
|||
</p> |
|||
<div id="o_wsale_cta_wrapper" |
|||
class="d-flex flex-wrap align-items-center"> |
|||
<t t-set="hasQuantities" t-value="false"/> |
|||
<t t-set="hasBuyNow" t-value="false"/> |
|||
<t t-set="ctaSizeBig" |
|||
t-value="not hasQuantities or not hasBuyNow"/> |
|||
|
|||
<div id="add_to_cart_wrap" t-attf-class="{{'d-none' if combination_info['prevent_zero_price_sale'] else 'd-inline-flex'}} mb-2"> |
|||
<a role="button" id="add_to_cart" t-attf-class="btn js_check_product a-submit flex-grow-1 #{'btn-lg' if ctaSizeBig else ''} add_to" href="#"> |
|||
<span style="font-weight: bold">ADD TO CART</span> |
|||
</a> |
|||
</div> |
|||
<div id="product_option_block" class="d-flex flex-wrap w-100"/> |
|||
</div> |
|||
<div id="contact_us_wrapper" |
|||
t-attf-class="{{'d-flex' if combination_info['prevent_zero_price_sale'] else 'd-none'}} oe_structure oe_structure_solo #{_div_classes}"> |
|||
<section class="s_text_block" data-snippet="s_text_block" data-name="Text"> |
|||
<div class="container"> |
|||
<a t-att-href="website.contact_us_button_url" |
|||
class="btn btn-primary btn_cta">Contact Us |
|||
</a> |
|||
</div> |
|||
</section> |
|||
<div id="add_to_cart_wrap" |
|||
t-attf-class="{{'d-none' if combination_info['prevent_zero_price_sale'] else 'd-inline-flex'}} mb-2"> |
|||
<a role="button" id="add_to_cart" |
|||
t-attf-class="btn js_check_product a-submit flex-grow-1 #{'btn-lg' if ctaSizeBig else ''} add_to" |
|||
href="#"> |
|||
<span class="bold">ADD TO CART</span> |
|||
</a> |
|||
</div> |
|||
<div id="product_option_block" |
|||
class="d-flex flex-wrap w-100"/> |
|||
</div> |
|||
<div id="contact_us_wrapper" |
|||
t-attf-class="{{'d-flex' if combination_info['prevent_zero_price_sale'] else 'd-none'}} oe_structure oe_structure_solo #{_div_classes}"> |
|||
<section class="s_text_block" |
|||
data-snippet="s_text_block" |
|||
data-name="Text"> |
|||
<div class="container"> |
|||
<a t-att-href="website.contact_us_button_url" |
|||
class="btn btn-primary btn_cta"> |
|||
Contact Us |
|||
</a> |
|||
</div> |
|||
</section> |
|||
</div> |
|||
</form> |
|||
<p t-elif="not product.active" class="alert alert-warning">This product is no longer available.</p> |
|||
<p t-else="" class="alert alert-warning">This product has no valid combination.</p> |
|||
<div id="product_attributes_simple"> |
|||
<t t-set="single_value_attributes" t-value="product.valid_product_template_attribute_line_ids._prepare_single_value_for_display()"/> |
|||
<table t-attf-class="table table-sm text-muted {{'' if single_value_attributes else 'd-none'}}"> |
|||
<t t-foreach="single_value_attributes" t-as="attribute"> |
|||
<tr> |
|||
<td> |
|||
<span t-field="attribute.name"/>: |
|||
<t t-foreach="single_value_attributes[attribute]" t-as="ptal"> |
|||
<span t-field="ptal.product_template_value_ids._only_active().name"/><t t-if="not ptal_last">, </t> |
|||
</t> |
|||
</td> |
|||
</tr> |
|||
</t> |
|||
</table> |
|||
</div> |
|||
<div id="o_product_terms_and_share" class="d-flex justify-content-between flex-column flex-md-row align-items-md-end mb-3"> |
|||
</div> |
|||
</form> |
|||
<p t-elif="not product.active" class="alert alert-warning"> |
|||
This product is no longer available. |
|||
</p> |
|||
<p t-else="" class="alert alert-warning">This product has |
|||
no valid combination. |
|||
</p> |
|||
<div id="product_attributes_simple"> |
|||
<t t-set="single_value_attributes" |
|||
t-value="product.valid_product_template_attribute_line_ids._prepare_single_value_for_display()"/> |
|||
<table t-attf-class="table table-sm text-muted {{'' if single_value_attributes else 'd-none'}}"> |
|||
<t t-foreach="single_value_attributes" |
|||
t-as="attribute"> |
|||
<tr> |
|||
<td> |
|||
<span t-field="attribute.name"/>: |
|||
<t t-foreach="single_value_attributes[attribute]" |
|||
t-as="ptal"> |
|||
<span t-field="ptal.product_template_value_ids._only_active().name"/> |
|||
<t t-if="not ptal_last">,</t> |
|||
</t> |
|||
</td> |
|||
</tr> |
|||
</t> |
|||
</table> |
|||
</div> |
|||
<div id="o_product_terms_and_share" |
|||
class="d-flex justify-content-between flex-column flex-md-row align-items-md-end mb-3"> |
|||
</div> |
|||
</div> |
|||
</xpath> |
|||
</template> |
|||
|
|||
<template id="alternative_products_coffee" name="Alternative Products Coffee" inherit_id="website_sale.alternative_products" active="True"> |
|||
<xpath expr="//section[hasclass('s_dynamic_snippet_products')]" position="attributes"> |
|||
<attribute name="data-template-key">website_sale.dynamic_filter_template_product_product_borderless_2</attribute> |
|||
</div> |
|||
</xpath> |
|||
</template> |
|||
|
|||
</odoo> |
|||
<template id="alternative_products_coffee" |
|||
name="Alternative Products Coffee" |
|||
inherit_id="website_sale.alternative_products" active="True"> |
|||
<xpath expr="//section[hasclass('s_dynamic_snippet_products')]" |
|||
position="attributes"> |
|||
<attribute name="data-template-key"> |
|||
website_sale.dynamic_filter_template_product_product_borderless_2 |
|||
</attribute> |
|||
</xpath> |
|||
</template> |
|||
</odoo> |
|||
|