Website Product Image

This commit is contained in:
Anand Doshi
2015-02-24 17:50:44 +05:30
parent 93b3a37a3b
commit da858cc587
15 changed files with 313 additions and 140 deletions

View File

@@ -11,7 +11,7 @@ error_report_email = "support@erpnext.com"
app_include_js = "assets/js/erpnext.min.js" app_include_js = "assets/js/erpnext.min.js"
app_include_css = "assets/css/erpnext.css" app_include_css = "assets/css/erpnext.css"
web_include_js = "assets/js/erpnext-web.min.js" web_include_js = "assets/js/erpnext-web.min.js"
web_include_css = "assets/css/shopping-cart-web.css" web_include_css = "assets/erpnext/css/website.css"
after_install = "erpnext.setup.install.after_install" after_install = "erpnext.setup.install.after_install"

View File

@@ -2,23 +2,17 @@
margin: 11px auto; margin: 11px auto;
text-align: center; text-align: center;
} }
.show-all-reports { .show-all-reports {
margin-top: 5px; margin-top: 5px;
font-size: 11px; font-size: 11px;
} }
/* toolbar */ /* toolbar */
.toolbar-splash { .toolbar-splash {
width: 32px; width: 32px;
height: 32px; height: 32px;
margin: -10px auto; margin: -10px auto;
} }
/* pos */ /* pos */
.pos {
}
.pos-item { .pos-item {
display: inline-block; display: inline-block;
overflow: hidden; overflow: hidden;
@@ -31,90 +25,73 @@
margin: 1.6%; margin: 1.6%;
border: 1px solid #d1d8dd; border: 1px solid #d1d8dd;
} }
.pos-item-text { .pos-item-text {
padding: 0px 5px; padding: 0px 5px;
} }
.pos-item .item-code { .pos-item .item-code {
margin-bottom: 0px; margin-bottom: 0px;
} }
.pos-item .no-image { .pos-item .no-image {
background-color: #fafbfc; background-color: #fafbfc;
border: 1px dashed #d1d8dd; border: 1px dashed #d1d8dd;
} }
.pos-item-image { .pos-item-image {
padding-bottom: 100%; padding-bottom: 100%;
background-size: cover; background-size: cover;
border: 1px solid transparent; border: 1px solid transparent;
} }
.pos-item-area { .pos-item-area {
border: 1px solid #d1d8dd; border: 1px solid #d1d8dd;
border-top: none; border-top: none;
} }
.pos-item-toolbar { .pos-item-toolbar {
padding: 10px 0px; padding: 10px 0px;
border-bottom: 1px solid #d1d8dd; border-bottom: 1px solid #d1d8dd;
} }
.item-list-area { .item-list-area {
padding: 15px 0px; padding: 15px 0px;
} }
.pos-toolbar,
.pos-toolbar, .pos-bill-toolbar { .pos-bill-toolbar {
padding: 10px 0px; padding: 10px 0px;
border-bottom: 1px solid #d1d8dd; border-bottom: 1px solid #d1d8dd;
height: 51px; height: 51px;
} }
.pos-item-toolbar .form-group { .pos-item-toolbar .form-group {
margin-bottom: 0px; margin-bottom: 0px;
} }
.pos-bill-wrapper { .pos-bill-wrapper {
border: 1px solid #d1d8dd; border: 1px solid #d1d8dd;
border-top: none; border-top: none;
margin-right: -1px; margin-right: -1px;
} }
.pos-bill { .pos-bill {
margin-left: -15px; margin-left: -15px;
margin-right: -15px; margin-right: -15px;
} }
.pos-bill-row { .pos-bill-row {
margin: 0px; margin: 0px;
padding: 7px 0px; padding: 7px 0px;
border-top: 1px solid #d1d8dd; border-top: 1px solid #d1d8dd;
} }
.pos-bill-header { .pos-bill-header {
border: none !important; border: none !important;
background-color: #f5f7fa; background-color: #f5f7fa;
} }
.pos-item-qty { .pos-item-qty {
display: inline-block; display: inline-block;
} }
.pos-qty-row > div { .pos-qty-row > div {
padding: 5px 0px; padding: 5px 0px;
} }
.pos-qty-btn { .pos-qty-btn {
margin-top: 3px; margin-top: 3px;
cursor: pointer; cursor: pointer;
font-size: 120%; font-size: 120%;
} }
.pos .search-area .form-group { .pos .search-area .form-group {
max-width: 100% !important; max-width: 100% !important;
} }
.pos .tax-table { .pos .tax-table {
margin-bottom: 10px; margin-bottom: 10px;
} }

View File

@@ -1,11 +0,0 @@
.item-main-image {
max-width: 100%;
margin: auto;
}
.web-long-description {
font-size: 18px;
line-height: 200%;
}
.item-stock {
margin-bottom: 10px !important;
}

View File

@@ -0,0 +1,50 @@
.web-long-description {
font-size: 18px;
line-height: 200%;
}
.item-stock {
margin-bottom: 10px !important;
}
.product-link {
display: block;
text-align: center;
}
.product-image-wrapper {
max-width: 300px;
margin: auto;
border-radius: 4px;
}
@media (max-width: 767px) {
.product-image {
height: 0px;
padding: 0px 0px 100%;
overflow: hidden;
}
}
.product-image-square {
width: 100%;
height: 0;
padding: 50% 0px;
background-size: cover;
background-repeat: no-repeat;
background-position: center top;
border-radius: 0.5em;
}
.product-image.missing-image {
width: 100%;
height: 0;
padding: 50% 0px;
background-size: cover;
background-repeat: no-repeat;
background-position: center top;
border-radius: 0.5em;
border: 1px dashed #d1d8dd;
position: relative;
}
.product-image.missing-image .octicon {
font-size: 32px;
color: #d1d8dd;
}
.product-text {
padding: 15px 0px;
}

View File

@@ -45,22 +45,16 @@ $.extend(shopping_cart, {
set_cart_count: function() { set_cart_count: function() {
var cart_count = getCookie("cart_count"); var cart_count = getCookie("cart_count");
var $cart = $("#website-post-login").find('[data-label="Cart"]'); var $cart = $('.dropdown [data-label="Cart"]');
var $badge = $cart.find(".badge"); var $badge = $cart.find(".badge");
var $cog = $("#website-post-login").find(".dropdown-toggle");
var $cog_count = $cog.find(".cart-count");
if(cart_count) { if(cart_count) {
if($badge.length === 0) { if($badge.length === 0) {
var $badge = $('<span class="badge pull-right"></span>').prependTo($cart.find("a")); var $badge = $('<span class="badge pull-right"></span>')
.prependTo($cart.find("a").addClass("badge-hover"));
} }
$badge.html(cart_count); $badge.html(cart_count);
if($cog_count.length === 0) {
var $cog_count = $('<sup class="cart-count"></span>').insertAfter($cog.find(".icon-cog"));
}
$cog_count.html(cart_count);
} else { } else {
$badge.remove(); $badge.remove();
$cog_count.remove();
} }
} }
}); });

View File

@@ -0,0 +1,121 @@
.erpnext-footer {
margin: 11px auto;
text-align: center;
}
.show-all-reports {
margin-top: 5px;
font-size: 11px;
}
/* toolbar */
.toolbar-splash {
width: 32px;
height: 32px;
margin: -10px auto;
}
/* pos */
.pos {
}
.pos-item {
display: inline-block;
overflow: hidden;
text-overflow: ellipsis;
cursor: pointer;
padding: 5px;
height: 0px;
padding-bottom: 38%;
width: 30%;
margin: 1.6%;
border: 1px solid #d1d8dd;
}
.pos-item-text {
padding: 0px 5px;
}
.pos-item .item-code {
margin-bottom: 0px;
}
.pos-item .no-image {
background-color: #fafbfc;
border: 1px dashed #d1d8dd;
}
.pos-item-image {
padding-bottom: 100%;
background-size: cover;
border: 1px solid transparent;
}
.pos-item-area {
border: 1px solid #d1d8dd;
border-top: none;
}
.pos-item-toolbar {
padding: 10px 0px;
border-bottom: 1px solid #d1d8dd;
}
.item-list-area {
padding: 15px 0px;
}
.pos-toolbar, .pos-bill-toolbar {
padding: 10px 0px;
border-bottom: 1px solid #d1d8dd;
height: 51px;
}
.pos-item-toolbar .form-group {
margin-bottom: 0px;
}
.pos-bill-wrapper {
border: 1px solid #d1d8dd;
border-top: none;
margin-right: -1px;
}
.pos-bill {
margin-left: -15px;
margin-right: -15px;
}
.pos-bill-row {
margin: 0px;
padding: 7px 0px;
border-top: 1px solid #d1d8dd;
}
.pos-bill-header {
border: none !important;
background-color: #f5f7fa;
}
.pos-item-qty {
display: inline-block;
}
.pos-qty-row > div {
padding: 5px 0px;
}
.pos-qty-btn {
margin-top: 3px;
cursor: pointer;
font-size: 120%;
}
.pos .search-area .form-group {
max-width: 100% !important;
}
.pos .tax-table {
margin-bottom: 10px;
}

View File

@@ -0,0 +1,53 @@
@border-color: #d1d8dd;
.web-long-description {
font-size: 18px;
line-height: 200%;
}
.item-stock {
margin-bottom: 10px !important;
}
.product-link {
display: block;
text-align: center;
}
.product-image-wrapper {
max-width: 300px;
margin: auto;
border-radius: 4px;
}
@media (max-width: 767px) {
.product-image {
height: 0px;
padding: 0px 0px 100%;
overflow: hidden;
}
}
.product-image-square {
width: 100%;
height: 0;
padding: 50% 0px;
background-size: cover;
background-repeat: no-repeat;
background-position: center top;
border-radius: 0.5em;
}
.product-image.missing-image {
.product-image-square;
border: 1px dashed @border-color;
position: relative;
}
.product-image.missing-image .octicon {
font-size: 32px;
color: @border-color;
}
.product-text {
padding: 15px 0px;
}

View File

@@ -25,7 +25,7 @@ def clear_cart_count(login_manager):
if show_cart_count(): if show_cart_count():
frappe.local.cookie_manager.delete_cookie("cart_count") frappe.local.cookie_manager.delete_cookie("cart_count")
def update_website_params(context): def update_website_context(context):
cart_enabled = is_cart_enabled() cart_enabled = is_cart_enabled()
context["shopping_cart_enabled"] = cart_enabled context["shopping_cart_enabled"] = cart_enabled
@@ -44,6 +44,6 @@ def update_my_account_context(context):
{"label": _("Orders"), "url": "orders"}, {"label": _("Orders"), "url": "orders"},
{"label": _("Invoices"), "url": "invoices"}, {"label": _("Invoices"), "url": "invoices"},
{"label": _("Shipments"), "url": "shipments"}, {"label": _("Shipments"), "url": "shipments"},
{"label": _("Issues"), "url": "tickets"}, # {"label": _("Issues"), "url": "tickets"},
{"label": _("Addresses"), "url": "addresses"}, {"label": _("Addresses"), "url": "addresses"},
]) ])

View File

@@ -1,6 +1,7 @@
frappe.listview_settings['Item'] = { frappe.listview_settings['Item'] = {
add_fields: ["item_name", "stock_uom", "item_group", "image", "variant_of", add_fields: ["item_name", "stock_uom", "item_group", "image", "variant_of",
"has_variants", "end_of_life", "is_sales_item"], "has_variants", "end_of_life", "is_sales_item"],
get_indicator: function(doc) { get_indicator: function(doc) {
if(doc.end_of_life < frappe.datetime.get_today()) { if(doc.end_of_life < frappe.datetime.get_today()) {
return [__("Expired"), "grey", "end_of_life,<,Today"] return [__("Expired"), "grey", "end_of_life,<,Today"]

View File

@@ -3,25 +3,19 @@
{% block header %}<h2>{{ title }}</h2>{% endblock %} {% block header %}<h2>{{ title }}</h2>{% endblock %}
{% block content %} {% block content %}
{% from "erpnext/templates/includes/macros.html" import product_image %}
<div class="item-content"> <div class="item-content">
{% include 'templates/includes/product_search_box.html' %} {% include 'templates/includes/product_search_box.html' %}
<div class="product-page-content" itemscope itemtype="http://schema.org/Product"> <div class="product-page-content" itemscope itemtype="http://schema.org/Product">
<div class="row"> <div class="row">
<div class="col-md-6"> <div class="col-sm-5">
{% if slideshow %} {% if slideshow %}
{% include "templates/includes/slideshow.html" %} {% include "templates/includes/slideshow.html" %}
{% else %} {% else %}
{% if website_image %} {{ product_image(website_image, "product-full-image") }}
<image itemprop="image" class="item-main-image"
src="{{ website_image }}" />
{% else %}
<div class="img-area">
{% include 'templates/includes/product_missing_image.html' %}
</div>
{% endif %}
{% endif %} {% endif %}
</div> </div>
<div class="col-md-6"> <div class="col-sm-7">
<!-- <h3 itemprop="name" style="margin-top: 0px;">{{ item_name }}</h3> --> <!-- <h3 itemprop="name" style="margin-top: 0px;">{{ item_name }}</h3> -->
<div itemprop="description"> <div itemprop="description">
{{ web_long_description or description or _("No description given") }} {{ web_long_description or description or _("No description given") }}

View File

@@ -39,33 +39,12 @@ $(function() {
{% block style %} {% block style %}
<style> <style>
.product-link {
display: block;
text-align: center;
}
.product-image-wrapper {
max-width: 300px;
margin: auto;
}
.product-image {
width: 100%;
height: 0;
padding-bottom: 100%;
border-radius: 4px;
border: 1px solid transparent;
background-size: cover;
background-repeat: no-repeat;
}
.product-image.missing-image { .product-image.missing-image {
border: 1px dashed {{ border_color or "#d1d8dd" }}; border: 1px dashed {{ theme.border_color or "#d1d8dd" }};
} }
.product-text { .product-image.missing-image .octicon {
padding: 15px 0px; color: {{ theme.border_color or "#d1d8dd" }};
} }
</style> </style>
{% endblock %} {% endblock %}

View File

@@ -105,8 +105,7 @@ $.extend(shopping_cart, {
render_item_row: function($cart_items, doc) { render_item_row: function($cart_items, doc) {
doc.image_html = doc.website_image ? doc.image_html = doc.website_image ?
'<div style="height: 120px; overflow: hidden;"><img src="' + doc.website_image + '" /></div>' : '<div style="height: 120px; overflow: hidden;"><img src="' + doc.website_image + '" /></div>': "";
'{% include "templates/includes/product_missing_image.html" %}';
if(doc.description === doc.item_name) doc.description = ""; if(doc.description === doc.item_name) doc.description = "";
@@ -265,7 +264,7 @@ $.extend(shopping_cart, {
.html(msg || frappe._("Something went wrong!")) .html(msg || frappe._("Something went wrong!"))
.toggle(true); .toggle(true);
} else { } else {
window.location.href = "order?name=" + encodeURIComponent(r.message); window.location.href = "/orders/" + encodeURIComponent(r.message);
} }
} }
}); });

View File

@@ -0,0 +1,17 @@
{% macro product_image_square(website_image, css_class="") %}
<div class="product-image product-image-square {% if not website_image -%} missing-image {%- endif %} {{ css_class }}"
{% if website_image -%} style="background-image: url({{ website_image }});" {%- endif %}>
{% if not website_image -%}<i class="centered octicon octicon-device-camera"></i>{%- endif %}
</div>
{% endmacro %}
{% 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="{{ website_image }}" class="img-responsive">
{%- else -%}
<i class="centered octicon octicon-device-camera"></i>
{%- endif %}
</div>
{% endmacro %}

View File

@@ -1,8 +1,8 @@
{% from "erpnext/templates/includes/macros.html" import product_image_square %}
<a class="product-link" href="{{ route or page_name }}"> <a class="product-link" href="{{ route or page_name }}">
<div class="col-sm-2 product-image-wrapper"> <div class="col-sm-2 col-xs-4 product-image-wrapper">
<div class="product-image {% if not website_image -%}missing-image{%- endif %}" {{ product_image_square(website_image) }}
{% if website_image -%} style="background-image: url({{ website_image }});" {%- endif %}>
</div>
<div class="product-text small">{{ item_name }}</div> <div class="product-text small">{{ item_name }}</div>
</div> </div>
</a> </a>

View File

@@ -1 +0,0 @@
<div class="missing-image"><i class="icon-camera"></i></div>