Merge pull request #5296 from KanchanChauhan/websitemakeover

New look to the website
This commit is contained in:
Rushabh Mehta 2016-05-02 15:54:41 +05:30
commit c711b82889
32 changed files with 508 additions and 238 deletions

View File

@ -667,9 +667,12 @@ class SalesInvoice(SellingController):
def get_list_context(context=None):
from erpnext.controllers.website_list_for_contact import get_list_context
list_context = get_list_context(context)
list_context["title"] = _("My Invoices")
list_context["show_sidebar"] = True
list_context["show_search"] = True
list_context.update({
'show_sidebar': True,
'show_search': True,
'no_breadcrumbs': True,
'title': _('Invoices'),
})
return list_context
@frappe.whitelist()

View File

@ -257,7 +257,7 @@
"issingle": 0,
"istable": 1,
"max_attachments": 0,
"modified": "2016-04-22 05:57:06.261401",
"modified": "2016-04-25 15:51:52.811124",
"modified_by": "Administrator",
"module": "Portal",
"name": "Homepage Featured Product",

View File

@ -185,7 +185,8 @@ def get_list_context(context=None):
return {
"show_sidebar": True,
"show_search": True,
"title": _("My Projects"),
'no_breadcrumbs': True,
"title": _("Projects"),
"get_list": get_project_list,
"row_template": "templates/includes/projects/project_row.html"
}

View File

@ -80,7 +80,6 @@
background-color: #fafbfc;
}
.transaction-list-item .indicator {
font-size: inherit;
font-weight: inherit;
color: #8D99A6;
margin-left: -15px;
@ -126,6 +125,75 @@
border-top: 1px solid #d1d8dd;
padding-top: 15px;
}
.cart-container {
margin: 50px 0px;
}
.cart-container .cart-item-header .h6 {
padding: 7px 15px;
}
.cart-container .cart-items {
margin: 30px 0px 0px;
}
.cart-container .cart-item-table {
margin: 0px -15px;
}
.cart-container .cart-item-header {
border-bottom: 1px solid #d1d8dd;
}
.cart-container .cart-image-col {
padding-right: 0px;
}
.cart-container .cart-image {
max-width: 55px;
max-height: 55px;
margin-top: -5px;
}
.cart-container .cart-taxes {
margin-top: 30px;
}
.cart-container .cart-taxes .row {
margin-top: 15px;
}
.cart-container .tax-grand-total-row {
border-top: 1px solid #d1d8dd;
padding-top: 15px;
}
.cart-container .cart-addresses {
margin-top: 50px;
}
.cart-items .cart-dropdown,
.item_name_dropdown {
display: none;
}
.cart-dropdown-container {
width: 350px;
padding: 15px;
}
.cart-dropdown-container .item-price {
display: block !important;
padding-bottom: 10px;
}
.cart-dropdown-container .cart-item-header {
border-bottom: 1px solid #d1d8dd;
}
.cart-dropdown-container .cart-items .cart-dropdown {
display: block;
margin-top: 15px;
}
.cart-dropdown-container .item_name_dropdown {
display: block;
}
.cart-dropdown-container .item-description,
.cart-dropdown-container .cart-items .checkout,
.cart-dropdown-container .item_name_and_description {
display: none;
}
.cart-dropdown-container .checkout-btn {
margin: 15px;
}
.cart-dropdown-container .col-name-description {
margin-bottom: 8px;
}
.product-list-link .row {
border-bottom: 1px solid #EBEFF2;
}
@ -147,3 +215,36 @@
max-width: 350px;
}
}
.item-group-content {
margin-top: 30px;
}
.product-image-img {
border: 1px solid #EBEFF2;
border-radius: 3px;
}
.product-text {
border-top: 1px solid #EBEFF2;
padding: 15px;
word-wrap: break-word;
height: 75px;
}
.product-image-wrapper {
padding-bottom: 30px;
}
.featured-product-heading,
.all-products {
text-transform: uppercase;
letter-spacing: 0.5px;
font-size: 12px;
font-weight: 500;
}
.all-products {
font-weight: 300;
padding-left: 25px;
padding-right: 25px;
padding-top: 10px;
padding-bottom: 10px;
}
.homepage-tagline {
font-size: 40px !important;
}

View File

@ -12,6 +12,19 @@ frappe.ready(function() {
}
// update login
shopping_cart.set_cart_count();
$(".shopping-cart").on('shown.bs.dropdown', function() {
if (!$('.shopping-cart-menu .cart-container').length) {
return frappe.call({
method: 'erpnext.shopping_cart.cart.get_shopping_cart_menu',
callback: function(r) {
if (r.message) {
$('.shopping-cart-menu').html(r.message);
}
}
});
}
});
});
$.extend(shopping_cart, {
@ -32,7 +45,11 @@ $.extend(shopping_cart, {
},
btn: opts.btn,
callback: function(r) {
shopping_cart.set_cart_count();
shopping_cart.set_cart_count();
if (r.message.shopping_cart_menu) {
$('.shopping-cart-menu').html(r.message.shopping_cart_menu);
}
if(opts.callback)
opts.callback(r);
}
@ -43,14 +60,9 @@ $.extend(shopping_cart, {
set_cart_count: function() {
var cart_count = getCookie("cart_count");
if($(".cart-icon").length == 0) {
$('<div class="cart-icon small" style="float:right;padding:3px;border-radius:10px;\
border: 1px solid #7575ff;">\
<a href="/cart" style="color:#7575ff; text-decoration: none">\
Cart\
<span style="color:#7575ff;" class="badge" id="cart-count">5</span>\
</a></div>').appendTo($('.shopping-cart'))
}
if(cart_count) {
$(".shopping-cart").toggle(true);
}
var $cart = $('.cart-icon');
var $badge = $cart.find("#cart-count");

View File

@ -94,7 +94,6 @@
}
.indicator {
font-size: inherit;
font-weight: inherit;
color: @text-muted;
margin-left: -15px;
@ -161,6 +160,95 @@
}
}
.cart-container {
margin: 50px 0px;
.cart-item-header .h6 {
padding: 7px 15px;
}
.cart-items {
margin: 30px 0px 0px;
}
.cart-item-table {
margin: 0px -15px;
}
.cart-item-header {
border-bottom: 1px solid #d1d8dd;
}
.cart-image-col {
padding-right: 0px;
}
.cart-image {
max-width: 55px;
max-height: 55px;
margin-top: -5px;
}
.cart-taxes {
margin-top: 30px;
.row {
margin-top: 15px;
}
}
.tax-grand-total-row {
border-top: 1px solid @border-color;
padding-top: 15px;
}
.cart-addresses {
margin-top: 50px;
}
}
.cart-items .cart-dropdown,
.item_name_dropdown {
display:none;
}
.cart-dropdown-container {
width: 350px;
padding: 15px;
.item-price {
display: block !important;
padding-bottom: 10px;
}
.cart-item-header {
border-bottom: 1px solid #d1d8dd;
}
.cart-items .cart-dropdown {
display:block;
margin-top:15px;
}
.item_name_dropdown {
display:block;
}
.item-description,
.cart-items .checkout,
.item_name_and_description {
display: none;
}
.checkout-btn {
margin:15px;
}
.col-name-description {
margin-bottom:8px;
}
}
.product-list-link {
.row {
border-bottom: 1px solid @light-border-color;
@ -189,3 +277,43 @@
max-width: 350px;
}
}
.item-group-content {
margin-top: 30px;
}
.product-image-img {
border: 1px solid @light-border-color;
border-radius: 3px;
}
.product-text {
border-top: 1px solid @light-border-color;
padding: 15px;
word-wrap: break-word;
height: 75px;
}
.product-image-wrapper {
padding-bottom: 30px;
}
.featured-product-heading, .all-products {
text-transform: uppercase;
letter-spacing: 0.5px;
font-size: 12px;
font-weight: 500;
}
.all-products {
font-weight: 300;
padding-left: 25px;
padding-right: 25px;
padding-top: 10px;
padding-bottom: 10px;
}
.homepage-tagline {
font-size:40px !important;
}

View File

@ -58,7 +58,7 @@ class ItemGroup(NestedSet, WebsiteGenerator):
if start < 0:
start = 0
context.update({
"items": get_product_list_for_group(product_group = self.name, start=start, limit=24, search=frappe.form_dict.get("q")),
"items": get_product_list_for_group(product_group = self.name, start=start, limit=24, search=frappe.form_dict.get("search")),
"parent_groups": get_parent_item_groups(self.name),
"title": self.name,
"products_as_list": cint(frappe.db.get_single_value('Website Settings', 'products_as_list'))

View File

@ -92,8 +92,9 @@ def update_cart(item_code, qty, with_items=False):
set_cart_count(quotation)
if with_items:
context = get_cart_quotation(quotation)
context = get_cart_quotation(quotation)
if cint(with_items):
return {
"items": frappe.render_template("templates/includes/cart/cart_items.html",
context),
@ -101,7 +102,17 @@ def update_cart(item_code, qty, with_items=False):
context),
}
else:
return quotation.name
return {
'name': quotation.name,
'shopping_cart_menu': get_shopping_cart_menu(context)
}
@frappe.whitelist()
def get_shopping_cart_menu(context=None):
if not context:
context = get_cart_quotation()
return frappe.render_template('templates/includes/cart/cart_dropdown.html', context)
@frappe.whitelist()
def update_cart_address(address_fieldname, address_name):

View File

@ -329,9 +329,12 @@ def update_billed_amount_based_on_so(so_detail, update_modified=True):
def get_list_context(context=None):
from erpnext.controllers.website_list_for_contact import get_list_context
list_context = get_list_context(context)
list_context["title"] = _("My Shipments")
list_context["show_sidebar"] = True
list_context["show_search"] = True
list_context.update({
'show_sidebar': True,
'show_search': True,
'no_breadcrumbs': True,
'title': _('Shipments'),
})
return list_context
def get_invoiced_qty_map(delivery_note):

View File

@ -147,7 +147,8 @@ class Item(WebsiteGenerator):
file = frappe.get_all("File", filters={
"file_url": self.website_image
}, fields=["name", "is_private"], order_by="is_private asc", limit_page_length=1)
if file:
file = file[0]

View File

@ -55,11 +55,12 @@ class Issue(Document):
def get_list_context(context=None):
return {
"title": _("My Issues"),
"title": _("Issues"),
"get_list": get_issue_list,
"row_template": "templates/includes/issue_row.html",
"show_sidebar": True,
"show_search": True
"show_search": True,
'no_breadcrumbs': True
}
def get_issue_list(doctype, txt, filters, limit_start, limit_page_length=20):

View File

@ -52,8 +52,10 @@
</div>
<br>
<div style="min-height: 100px; margin: 10px 0;">
<h4 class="item-price" itemprop="price"></h4>
<div class="item-stock" itemprop="availablity"></div>
<div itemprop="offers" itemscope itemtype="http://schema.org/Offer">
<h4 class="item-price" itemprop="price"></h4>
<div class="item-stock" itemprop="availability"></div>
</div>
<div class="item-cart hide">
<div id="item-add-to-cart">
<button class="btn btn-primary btn-sm">
@ -71,7 +73,7 @@
</div>
<div class="row item-website-description" style="margin-top:30px; margin-bottom:20px">
<div class="col-md-12">
<h4>{{ _("DESCRIPTION") }}</h4>
<div class="h6 text-uppercase">{{ _("Description") }}</div>
<div itemprop="description" class="item-desc">
{{ web_long_description or description or _("No description given") }}
</div>
@ -81,7 +83,7 @@
{% if website_specifications -%}
<div class="row item-website-specification" style="margin-top: 40px">
<div class="col-md-12">
<h4>{{ _("SPECIFICATIONS") }}</h4>
<div class="h6 text-uppercase">{{ _("Specifications") }}</div>
<table class="table borderless" style="width: 100%">
{% for d in website_specifications -%}

View File

@ -1,8 +1,5 @@
{% extends "templates/web.html" %}
{#{% block header_actions %}
{% include 'templates/includes/product_search_box.html' %}
{% endblock %}#}
{% block header %}<h1>{{ _("Products") }}</h1>{% endblock %}
{% block breadcrumbs %}
<div class="page-breadcrumbs" data-html-block="breadcrumbs">
@ -16,7 +13,7 @@
{% endblock %}
{% block page_content %}
<div class="item-group-content">
<div class="item-group-content" itemscope itemtype="http://schema.org/Product">
<div>
{% if slideshow %}<!-- slideshow -->
{% include "templates/includes/slideshow.html" %}

View File

@ -1,32 +0,0 @@
.cart-content {
min-height: 400px;
margin-top: 60px;
}
.cart-header, .cart-footer {
margin-bottom: 60px;
}
.cart-item-header {
padding-bottom: 10px;
margin-bottom: 10px;
border-bottom: 1px solid #d1d8dd;
}
.tax-grand-total-row {
font-size: 14px;
margin-top: 30px;
font-weight: bold;
}
.cart-addresses {
margin-top: 80px;
margin-bottom: 60px;
}
.cart-link {
margin-top: 40px;
text-align: right;
}

View File

@ -16,6 +16,7 @@ $.extend(shopping_cart, {
shopping_cart.bind_address_select();
shopping_cart.bind_place_order();
shopping_cart.bind_change_qty();
shopping_cart.bind_remove_item();
},
@ -71,6 +72,24 @@ $.extend(shopping_cart, {
});
});
},
bind_remove_item: function() {
$(".cart-items").on("click", ".remove-item", function() {
var item_code = $(this).attr("data-item-code");
shopping_cart.update_cart({
item_code: item_code,
qty: "0",
callback: function(r) {
location.reload();
if(!r.exc) {
$(".cart-items").html(r.message.items);
$(".cart-tax-items").html(r.message.taxes);
$(".cart-icon").hide();
}
},
});
});
},
render_tax_row: function($cart_taxes, doc, shipping_rules) {
var shipping_selector;

View File

@ -1,11 +1,10 @@
{% from "erpnext/templates/includes/cart/cart_macros.html"
import show_address %}
{% from "erpnext/templates/includes/cart/cart_macros.html" import show_address %}
<div class="row">
{% if addresses|length == 1%}
{% set select_address = True %}
{% endif %}
<div class="col-sm-6">
<h4>{{ _("Shipping Address") }}</h4>
<div class="h6 text-uppercase">{{ _("Shipping Address") }}</div>
<div id="cart-shipping-address" class="panel-group"
data-fieldname="shipping_address_name">
{% for address in addresses %}
@ -16,7 +15,7 @@
{{ _("Manage Addresses") }}</a>
</div>
<div class="col-sm-6">
<h4>Billing Address</h4>
<div class="h6 text-uppercase">Billing Address</div>
<div id="cart-billing-address" class="panel-group"
data-fieldname="customer_address">
{% for address in addresses %}

View File

@ -0,0 +1,26 @@
<div class="cart-dropdown-container">
<div id="cart-error" class="alert alert-danger"
style="display: none;"></div>
<div class="row cart-items-dropdown cart-item-header text-muted">
<div class="col-sm-7 col-xs-6 h6 text-uppercase">
{{ _("Item") }}
</div>
<div class="col-sm-2 col-xs-2 text-right h6 text-uppercase">
{{ _("Qty") }}
</div>
<div class="col-sm-3 col-xs-2 text-right h6 text-uppercase">
{{ _("Price") }}
</div>
</div>
{% if doc.items %}
<div class="cart-items">
{% include "templates/includes/cart/cart_items.html" %}
</div>
<div class="text-center checkout-btn">
<p class="text-center"><a href="/cart" class="btn btn-primary">{{ _("Checkout") }}</a></p>
</div>
{% else %}
<p>{{ _("Cart is Empty") }}</p>
{% endif %}
</div>

View File

@ -1,23 +1,34 @@
{% from "erpnext/templates/includes/order/order_macros.html" import item_name_and_description %}
{% for d in doc.items %}
<div class="cart-item">
<div class="row">
<div class="col-sm-8 col-xs-6" style="margin-bottom: 10px;">
{{ item_name_and_description(d) }}
</div>
<div class="col-sm-2 col-xs-3 text-right">
<span style="max-width: 50px; display: inline-block">
<input class="form-control text-right cart-qty"
value = "{{ d.get_formatted('qty') }}"
data-item-code="{{ d.item_code }}"></span>
<p class="text-muted small" style="margin-top: 10px;">
{{ _("Rate") + ': ' + d.get_formatted("rate") }}
</p>
</div>
<div class="col-sm-2 col-xs-3 text-right">
{{ d.get_formatted("amount") }}
</div>
<div class="row cart-items checkout">
<div class="col-sm-8 col-xs-6 col-name-description">
{{ item_name_and_description(d) }}
</div>
<div class="col-sm-2 col-xs-3 text-right col-qty">
<span style="max-width: 50px; display: inline-block">
<input class="form-control text-right cart-qty"
value = "{{ d.get_formatted('qty') }}"
data-item-code="{{ d.item_code }}"></span>
<span class="text-muted small remove-item" data-item-code="{{ d.item_code }}">{{_("Remove")}}</span>
</div>
<div class="col-sm-2 col-xs-3 text-right col-amount">
{{ d.get_formatted("amount") }}
<p class="text-muted small item-rate">{{
_("Rate: {0}").format(d.get_formatted("rate")) }}</p>
</div>
</div>
{% endfor %}
<div class="row cart-items cart-dropdown">
<div class="col-sm-7 col-xs-6 col-name-description">
{{ item_name_and_description(d) }}
</div>
<div class="col-sm-2 col-xs-2 text-right col-qty">
{{ d.get_formatted('qty') }}
</div>
<div class="col-sm-3 col-xs-2 text-right col-amount">
{{ d.get_formatted("amount") }}
</div>
</div>
{% endfor %}

View File

@ -1,11 +1,11 @@
<div class="web-list-item">
<a class="no-decoration" href="/issues?name={{ doc.name }}">
<div class="web-list-item transaction-list-item">
<a href="/issues?name={{ doc.name }}">
<div class="row">
<div class="col-xs-8">
<span class="indicator {{ "red" if doc.status=="Open" else "darkgrey" }}">
{{ doc.name }}</span>
<span style="margin-left: 15px;">
{{ doc.subject }}</span>
<div class="items-preview text-ellipsis">
{{ doc.subject }}</div>
</div>
<div class="col-xs-4 text-right small text-muted">
{{ frappe.format_date(doc.modified) }}

View File

@ -1,4 +1,5 @@
{% macro product_image_square(website_image, css_class="") %}
{% if website_image -%} <meta itemprop="image" content="{{ frappe.utils.quoted(website_image) | abs_url }}"></meta>{%- endif %}
<div class="product-image product-image-square {% if not website_image -%} missing-image {%- endif %} {{ css_class }}"
{% if website_image -%} style="background-image: url('{{ frappe.utils.quoted(website_image) | abs_url }}');" {%- endif %}>
</div>
@ -7,7 +8,7 @@
{% macro product_image(website_image, css_class="") %}
<div class="product-image {% if not website_image -%} missing-image {%- endif %} {{ css_class }}">
{% if website_image -%}
<img src="{{ frappe.utils.quoted(website_image) | abs_url }}" class="img-responsive">
<img itemprop="image" src="{{ frappe.utils.quoted(website_image) | abs_url }}" class="img-responsive">
{%- endif %}
</div>
{% endmacro %}

View File

@ -0,0 +1,12 @@
{% extends 'frappe/templates/includes/navbar/navbar_items.html' %}
{% block navbar_right_extension %}
<li class="dropdown shopping-cart">
<div class="cart-icon small">
<a class="dropdown-toggle" href="#" data-toggle="dropdown" id="navLogin">
Cart <span class="badge-wrapper" id="cart-count"></span>
</a>
<div class="dropdown-menu shopping-cart-menu"></div>
</div>
</li>
{% endblock %}

View File

@ -1,7 +1,7 @@
{% from "erpnext/templates/includes/macros.html" import product_image_square %}
{% macro item_name_and_description(d) %}
<div class="row">
<div class="row item_name_and_description">
<div class="col-xs-4 col-sm-2 order-image-col">
<div class="order-image">
{{ product_image_square(d.image) }}
@ -9,7 +9,18 @@
</div>
<div class="col-xs-8 col-sm-10">
{{ d.item_code }}
<p class="text-muted small">{{ d.description }}</p>
<p class="text-muted small item-description">{{ d.description }}</p>
</div>
</div>
{% endmacro %}
<div class="row item_name_dropdown">
<div class="col-xs-4 col-sm-4 order-image-col">
<div class="order-image">
{{ product_image_square(d.image) }}
</div>
</div>
<div class="col-xs-8 col-sm-8">
{{ d.item_code }}
</div>
</div>
{% endmacro %}

View File

@ -1,8 +1,10 @@
{% from "erpnext/templates/includes/macros.html" import product_image_square %}
<a class="product-link" href="{{ (route or page_name)|abs_url }}">
<div class="col-sm-2 col-xs-4 product-image-wrapper">
<div class="col-sm-4 col-xs-4 product-image-wrapper">
<div class="product-image-img">
{{ product_image_square(thumbnail or website_image) }}
<div class="text-ellipsis inline-block small product-text">{{ item_name }}</div>
<div class="product-text" itemprop="name">{{ item_name }}</div>
</div>
</div>
</a>

View File

@ -83,7 +83,6 @@
}
.progress-hg{
margin-bottom: 0!important;
margin-top: 30px!important;
height:5px;
margin-bottom: 30!important;
height:2px;
}

View File

@ -2,22 +2,18 @@
<a href="/{{ pathname }}/{{ doc.name }}">
<div class="row">
<div class="col-sm-6">
<span>{{ doc.name }}</span>
<div class="small text-muted items-preview text-ellipsis">
<span class="indicator small {{ doc.indicator_color or "darkgrey" }}">
{{ doc.name }}</span>
<div class="items-preview text-ellipsis">
{{ doc.items_preview }}
</div>
</div>
<div class="col-sm-4">
<span class="indicator {{ doc.indicator_color or "darkgrey" }}">
{{ doc.indicator_title or doc.status }}
</span>
<div class="col-sm-6 text-right">
<div class="small text-muted transaction-time"
title="{{ frappe.utils.format_datetime(doc.modified, "medium") }}">
{{ frappe.utils.pretty_date(doc.modified) }}
{{ frappe.utils.format_datetime(doc.modified, "medium") }}
</div>
</div>
<div class="col-sm-2 text-right">
{{ doc.get_formatted("grand_total") }}
{{ doc.get_formatted("grand_total") }}
</div>
<!-- <div class="col-sm-3 text-right">

View File

@ -8,12 +8,6 @@
<script>{% include "templates/includes/cart.js" %}</script>
{% endblock %}
{% block style %}
<style>
{% include "templates/includes/cart.css" %}
</style>
{% endblock %}
{% block header_actions %}
{% if doc.items %}
@ -27,57 +21,55 @@
{% from "templates/includes/macros.html" import item_name_and_description %}
<div class="cart-content">
<div id="cart-container">
<div id="cart-error" class="alert alert-danger"
style="display: none;"></div>
<div id="cart-items">
<div class="row cart-item-header">
<div class="col-sm-8 col-xs-6">
Items
</div>
<div class="col-sm-2 col-xs-3 text-right">
Qty
</div>
<div class="col-sm-2 col-xs-3 text-right">
Amount
</div>
</div>
{% if doc.items %}
<div class="cart-items">
{% include "templates/includes/cart/cart_items.html" %}
</div>
{% else %}
<p>{{ _("Cart is Empty") }}</p>
{% endif %}
</div>
{% if doc.items %}
<!-- taxes -->
<div class="cart-taxes row small">
<div class="col-sm-8"><!-- empty --></div>
<div class="col-sm-4 cart-tax-items">
{% include "templates/includes/order/order_taxes.html" %}
</div>
</div>
<div id="cart-totals">
</div>
{% if doc.tc_name %}
<div class="cart-terms" style="display: none;" title={{doc.tc_name}}>
{{doc.tc_name}}
{{doc.terms}}
</div>
<div class="cart-link">
<a href="#" onclick="show_terms();return false;">*Terms and Conditions</a>
</div>
{% endif %}
<div class="cart-addresses">
{% include "templates/includes/cart/cart_address.html" %}
</div>
<p class="cart-footer text-right">
<button class="btn btn-primary btn-place-order btn-sm" type="button">
{{ _("Place Order") }}</button></p>
{% endif %}
</div>
<div class="cart-container">
<div id="cart-error" class="alert alert-danger"
style="display: none;"></div>
<div class="row cart-items cart-item-header text-muted">
<div class="col-sm-8 col-xs-6 h6 text-uppercase">
{{ _("Item") }}
</div>
<div class="col-sm-2 col-xs-3 text-right h6 text-uppercase">
{{ _("Qty") }}
</div>
<div class="col-sm-2 col-xs-3 text-right h6 text-uppercase">
{{ _("Subtotal") }}
</div>
</div>
{% if doc.items %}
<div class="cart-items">
{% include "templates/includes/cart/cart_items.html" %}
</div>
{% else %}
<p>{{ _("Cart is Empty") }}</p>
{% endif %}
{% if doc.items %}
<!-- taxes -->
<div class="row cart-taxes">
<div class="col-sm-6"><!-- empty --></div>
<div class="col-sm-6 text-right">
{% include "templates/includes/order/order_taxes.html" %}
</div>
</div>
{% if doc.tc_name %}
<div class="cart-terms" style="display: none;" title={{doc.tc_name}}>
{{doc.tc_name}}
{{doc.terms}}
</div>
<div class="cart-link">
<a href="#" onclick="show_terms();return false;">*Terms and Conditions</a>
</div>
{% endif %}
<div class="cart-addresses">
{% include "templates/includes/cart/cart_address.html" %}
</div>
<p class="cart-footer text-right">
<button class="btn btn-primary btn-place-order btn-sm" type="button">
{{ _("Place Order") }}</button></p>
{% endif %}
</div>
<!-- no-sidebar -->

View File

@ -7,32 +7,27 @@
<div class="row">
<div class="col-sm-12">
<h2 class="text-center">{{ homepage.tag_line or '' }}</h2>
<p class="lead text-center">{{ homepage.description or '' }}</p>
<p class="text-center">
<a href="/login" class="btn btn-primary text-center">Login</a>
</p>
<div class="homepage-tagline h1 text-center">{{ homepage.tag_line or '' }}</div>
<p class="text-center">{{ homepage.description or '' }}</p>
{% if homepage.products %}
<!-- TODO: styling of this section -->
<div class='featured-products-section'>
<h5 class='text-uppercase'>{{ _("Featured Products") }}</h5>
<div class='featured-products-section' itemscope itemtype="http://schema.org/Product">
<h5 class='featured-product-heading'>{{ _("Featured Products") }}</h5>
<div class="featured-products">
<div id="search-list" class="row" style="margin-top:40px;">
{% for item in homepage.products %}
<a class="product-link" href="{{ item.route | abs_url }}">
<div class="col-sm-4 product-image-wrapper">
{{ product_image_square(item.thumbnail or item.image) }}
<div class="text-ellipsis inline-block small product-text">
{{ item.item_name }}
</div>
<a class="product-link" href="{{ item.route|abs_url }}">
<div class="col-sm-4 col-xs-4 product-image-wrapper">
<div class="product-image-img">
{{ product_image_square(item.thumbnail or item.image) }}
<div class="product-text" itemprop="name">{{ item.item_name }}</div>
</div>
</a>
</div>
</a>
{% endfor %}
</div>
</div>
<!-- TODO: remove hardcoding of /products -->
<p class="text-center"><a href="/products" class="btn btn-primary">More Products</a></p>
<div class=" text-center text-uppercase"><a href="/products" class="btn btn-primary all-products"> {{ _("View All Products") }}</a></div>
</div>
{% endif %}
</div>
@ -42,7 +37,16 @@
{% block style %}
<style>
.featured-products-section {
margin-top: 75px;
margin-top: 95px;
}
.home-login {
margin-top: 30px;
}
.btn-login {
width: 80px;
}
</style>
{% endblock %}

View File

@ -11,34 +11,11 @@ no_sitemap = 1
def get_context(context):
homepage = frappe.get_doc('Homepage')
for item in homepage.products:
item.route = '/' + '/'.join(frappe.db.get_value('Item', item.item_code, ['parent_website_route', 'page_name']))
return {
'homepage': homepage
}
@frappe.whitelist(allow_guest=True)
def get_product_list(search=None, start=0, limit=6):
# limit = 12 because we show 12 items in the grid view
# base query
query = """select name, item_name, page_name, website_image, thumbnail, item_group,
web_long_description as website_description, parent_website_route
from `tabItem`
where show_in_website = 1
and disabled=0
and (end_of_life is null or end_of_life='0000-00-00' or end_of_life > %(today)s)
and (variant_of is null or variant_of = '')"""
# order by
query += """ order by weightage desc, idx desc, modified desc limit %s, %s""" % (start, limit)
data = frappe.db.sql(query, {
"today": nowdate()
}, as_dict=1)
for d in data:
d.route = ((d.parent_website_route + "/") if d.parent_website_route else "") \
+ (d.page_name or "")
return [get_item_for_list_in_html(r) for r in data]
}

View File

@ -4,6 +4,9 @@
{% block breadcrumbs %}
{% include "templates/includes/breadcrumbs.html" %}
{% endblock %}
{% block title %}
{{ doc.name }}
{% endblock %}
{% block header %}
<h1>{{ doc.name }}</h1>

View File

@ -3,27 +3,10 @@
{% block title %}{{ doc.project_name }}{% endblock %}
{%- from "templates/includes/projects/macros.html" import back_link -%}
{% block header %}<h1>{{ doc.project_name }}</h1>{% endblock %}
{% block header_actions %}{% if doc.percent_complete %}
<div class="progress progress-hg">
<div class="progress-bar progress-bar-{{ "warning" if doc.percent_complete|round < 100 else "success" }} active" role="progressbar"
aria-valuenow="{{ doc.percent_complete|round|int }}"
aria-valuemin="0" aria-valuemax="100" style="width:{{ doc.percent_complete|round|int }}%;">
</div>
</div>
{% endif %}{% endblock %}
{% block breadcrumbs %}
<div class="page-breadcrumbs" data-html-block="breadcrumbs">
<ul class="breadcrumb">
<li>
<span class="icon icon-angle-left"></span>
<a href="/project">Projects</a>
</li>
</ul>
</div>
{% block header %}
<h1>{{ doc.project_name }}</h1>
{% endblock %}
{% block style %}
<style>
{% include "templates/includes/projects.css" %}
@ -32,7 +15,13 @@
{% block page_content %}
{% if doc.percent_complete %}
<div class="progress progress-hg">
<div class="progress-bar progress-bar-{{ "warning" if doc.percent_complete|round < 100 else "success" }} active" role="progressbar" aria-valuenow="{{ doc.percent_complete|round|int }}"
aria-valuemin="0" aria-valuemax="100" style="width:{{ doc.percent_complete|round|int }}%;">
</div>
</div>
{% endif %}
<div class="clearfix">
<h4 style="float: left;">{{ _("Tasks") }}</h4>

View File

@ -18,10 +18,10 @@ def get_context(context):
project.has_permission('read')
project.tasks = get_tasks(project.name, start=0, item_status='open',
search=frappe.form_dict.get("q"))
search=frappe.form_dict.get("search"))
project.timelogs = get_timelogs(project.name, start=0,
search=frappe.form_dict.get("q"))
search=frappe.form_dict.get("search"))
context.doc = project

View File

@ -122,9 +122,10 @@ def get_territory_from_address(address):
def get_list_context(context=None):
from erpnext.shopping_cart.cart import get_address_docs
return {
"title": _("My Addresses"),
"title": _("Addresses"),
"get_list": get_address_docs,
"row_template": "templates/includes/address_row.html",
'no_breadcrumbs': True,
}
def has_website_permission(doc, ptype, user, verbose=False):