Richard Mathot (OpenERP) 2013-10-23 08:43:48 +02:00
commit 16a1bbcf6c
12 changed files with 169 additions and 178 deletions

View File

@ -1360,7 +1360,7 @@ CKEDITOR.dom.range = function( root ) {
* * {@link CKEDITOR#SHRINK_TEXT} - Shrink the range boudaries to anchor by the side of enclosed text
* node, range remains if there's no text nodes on boundaries at all.
*
* @param {Boolean} selectContents Whether result range anchors at the inner OR outer boundary of the node.
* @param {Boolean} [selectContents] Whether result range anchors at the inner OR outer boundary of the node.
*/
shrink: function( mode, selectContents, shrinkOnBlockBoundary ) {
// Unable to shrink a collapsed range.

View File

@ -798,7 +798,7 @@
*
* @method
* @member CKEDITOR.editor
* @param {Boolean} forceRealSelection Return real selection, instead of saved or fake one.
* @param {Boolean} [forceRealSelection] Return real selection, instead of saved or fake one.
* @returns {CKEDITOR.dom.selection} A selection object or null if not available for the moment.
*/
CKEDITOR.editor.prototype.getSelection = function( forceRealSelection ) {

View File

@ -56,7 +56,7 @@
//noinspection JSValidateTypes
editor.addCommand('link', {
exec: function (editor, data) {
exec: function (editor) {
link_dialog(editor);
return true;
},
@ -65,7 +65,7 @@
});
//noinspection JSValidateTypes
editor.addCommand('image', {
exec: function (editor, data) {
exec: function (editor) {
image_dialog(editor);
return true;
},
@ -219,7 +219,7 @@
var view_id = $(event.currentTarget).data('view-id');
openerp.jsonRpc('/website/customize_template_toggle', 'call', {
'view_id': view_id
}).then( function(result) {
}).then( function() {
window.location.reload();
});
});
@ -253,7 +253,6 @@
);
},
edit: function () {
var self = this;
this.$buttons.edit.prop('disabled', true);
this.$('#website-top-view').hide();
this.$('#website-top-edit').show();
@ -423,7 +422,7 @@
return true;
},
start_edition: function ($elements) {
start_edition: function () {
var self = this;
// create a single editor for the whole page
var root = document.getElementById('wrapwrap');
@ -484,7 +483,7 @@
.filter(function () {
var $this = $(this);
// keep view sections and fields which are *not* in
// view sections for toplevel editables
// view sections for top-level editables
return $this.data('oe-model') === 'ir.ui.view'
|| !$this.closest('[data-oe-model = "ir.ui.view"]').length;
});
@ -855,7 +854,7 @@
this.preview_image();
},
file_selection: function (e) {
file_selection: function () {
this.$('button.filepicker').removeClass('btn-danger btn-success');
var self = this;

View File

@ -21,9 +21,6 @@
templates.push(template);
};
website.load_templates = function(templates) {
var def = $.Deferred();
var count = templates.length;
var dones = _(templates).map(function (t) {
return new $.Deferred(function (d) {
openerp.qweb.add_template(t, function(err) {
@ -151,7 +148,7 @@
});
});
$(document).on('click', '.js_publish_management .js_publish_btn', function (e) {
$(document).on('click', '.js_publish_management .js_publish_btn', function () {
var $data = $(this).parents(".js_publish_management:first");
var $btn = $data.find('.btn:first');
var publish = $btn.hasClass("btn-success");

View File

@ -196,7 +196,7 @@
}
self.make_active($target);
});
$("[data-oe-model]").on('click', function (ev) {
$("[data-oe-model]").on('click', function () {
if (!snipped_event_flag && self.$active_snipped_id && !self.$active_snipped_id.parents("[data-snippet-id]:first")) {
self.make_active(false);
}
@ -224,6 +224,7 @@
},
clean_for_save: function () {
for (var k in this.snippets) {
if (!this.snippets.hasOwnProperty(k)) { continue; }
var editor = $(this.snippets[k]).data("snippet-editor");
if (editor) {
editor.clean_for_save();
@ -342,9 +343,9 @@
},
stop: function(ev, ui){
if (action === 'insert' && ! dropped) {
var el = $('.oe_drop_zone').nearest({x: ui.position.left, y: ui.position.top}).first()
if (el) {
el.after($toInsert)
var $el = $('.oe_drop_zone').nearest({x: ui.position.left, y: ui.position.top}).first();
if ($el) {
$el.after($toInsert);
dropped = true;
}
}
@ -460,7 +461,7 @@
// count += $zones.length;
// $zones.remove();
$zones = $('.oe_drop_zone > .oe_drop_zone:not(.oe_vertical)').remove(); // no recusrive zones
$zones = $('.oe_drop_zone > .oe_drop_zone:not(.oe_vertical)').remove(); // no recursive zones
count += $zones.length;
$zones.remove();
} while (count > 0);
@ -471,14 +472,13 @@
var zone = $(this);
var prev = zone.prev();
var next = zone.next();
var float_prev = zone.prev().css('float') || 'none';
var float_next = zone.next().css('float') || 'none';
var disp_prev = zone.prev().css('display') || null;
var disp_next = zone.next().css('display') || null;
var float_prev = prev.css('float') || 'none';
var float_next = next.css('float') || 'none';
var disp_prev = prev.css('display') || null;
var disp_next = next.css('display') || null;
if( (float_prev === 'left' || float_prev === 'right')
&& (float_next === 'left' || float_next === 'right') ){
zone.remove();
return;
}else if( !( disp_prev === null
|| disp_next === null
|| disp_prev === 'block'
@ -689,7 +689,7 @@
var self = this;
var $styles = this.$overlay.find('.oe_options');
var $ul = $styles.find('ul:first');
_.each(this.parent.style_templates, function (val, key) {
_.each(this.parent.style_templates, function (val) {
if (!self.parent.dom_filter(val.selector).is(self.$target)) {
return;
}
@ -757,7 +757,7 @@
/*
* build_snippet
* This method is called just after that a thumbnail is drag and droped into a drop zone
* This method is called just after that a thumbnail is drag and dropped into a drop zone
* (after the insertion of this.$body, if this.$body exists)
*/
build_snippet: function ($target) {
@ -771,7 +771,7 @@
},
/* onFocus
* This method is called when the user click outide the snippet in the dom, after a focus
* This method is called when the user click outside the snippet in the dom, after a focus
*/
onBlur : function () {
this.$overlay.removeClass('oe_active');
@ -790,7 +790,7 @@
var $ul = this.$editor.find(ul_options);
var bg_value = (typeof bg === 'string' ? this.$target.find(bg) : $(bg)).css("background-image").replace(/url\(['"]*|['"]*\)/g, "");
// bind envent on options
// bind event on options
var $li = $ul.find("li");
$li.on('click', function (event) {
if ($(this).data("value")) {
@ -893,7 +893,8 @@
var regClass = new RegExp("\\s*" + resize[0][begin].replace(/[-]*[0-9]+/, '[-]*[0-9]+'), 'g');
var cursor = $handle.css("cursor")+'-important';
$("body").addClass(cursor);
var $body = $(document.body);
$body.addClass(cursor);
var body_mousemove = function (event){
event.preventDefault();
@ -920,15 +921,15 @@
self.parent.cover_target(self.$overlay, self.$target);
}
};
$('body').mousemove(body_mousemove);
var body_mouseup = function(){
$('body').unbind('mousemove', body_mousemove);
$('body').unbind('mouseup', body_mouseup);
$("body").removeClass(cursor);
$body.unbind('mousemove', body_mousemove);
$body.unbind('mouseup', body_mouseup);
$body.removeClass(cursor);
self.parent.editor_busy = false;
};
$('body').mouseup(body_mouseup);
$body.mousemove(body_mousemove);
$body.mouseup(body_mouseup);
});
},
getSize: function () {
@ -998,7 +999,7 @@
if (compass !== 'w')
return;
// don't change the rigth border position when we change the offset (replace col size)
// don't change the right border position when we change the offset (replace col size)
var beginCol = Number(beginClass.match(/col-md-([0-9]+)|$/)[1] || 0);
var beginOffset = Number(beginClass.match(/col-md-offset-([0-9-]+)|$/)[1] || beginClass.match(/col-lg-offset-([0-9-]+)|$/)[1] || 0);
var offset = Number(this.grid.w[0][current].match(/col-md-offset-([0-9-]+)|$/)[1] || 0);
@ -1128,7 +1129,6 @@
var style = false;
var $el = this.$inner.find('.item.active');
var $ul = this.$editor.find('ul[name="carousel-style"]');
var $li = $ul.find("li");
if ($el.hasClass('text_only'))
style = 'text_only';
@ -1160,7 +1160,6 @@
});
},
change_size: function () {
var self = this;
var $el = this.$target;
var size = 'oe_big';
@ -1197,7 +1196,6 @@
this.change_size();
},
scroll: function(){
var self = this;
var $ul = this.$editor.find('ul[name="parallax-scroll"]');
var $li = $ul.find("li");
var $parallax = this.$target.find('.parallax');
@ -1207,7 +1205,7 @@
$li.on('click', function (event) {
$li.removeClass("active");
$(this).addClass("active");
var speed = $(this).data('value')
var speed = $(this).data('value');
$parallax.attr('data-stellar-background-ratio', speed);
});

View File

@ -10,6 +10,7 @@
name: "Insert a banner",
init: function (editor) {
var self = this;
var $body = $(document.body);
self.steps = [
{
stepId: 'welcome',
@ -56,15 +57,16 @@
onShow: function () {
function beginDrag () {
$('.popover.tour').remove();
$('body').off('mousedown', beginDrag);
function goToNextStep () {
$('#oe_snippets').hide();
self.movetoStep('edit-title');
$('body').off('mouseup', goToNextStep);
$body.off('mouseup', goToNextStep);
}
$('body').on('mouseup', goToNextStep);
$body.off('mousedown', beginDrag);
$body.on('mouseup', goToNextStep);
}
$('body').on('mousedown', beginDrag);
$body.on('mousedown', beginDrag);
},
},
{
@ -121,7 +123,7 @@
title: "Help is always available",
content: "But you can always click here if you want more tutorials.",
template: render('website.tour_popover', { end: "Close" }),
},
}
];
return this._super();
},
@ -158,4 +160,4 @@
},
});
}());
}());

View File

@ -24,7 +24,7 @@
dialog.on('activate', this, function () {
localStorage[nodialog] = dialog.$('input[name=do_not_show]').prop('checked') || '';
dialog.$el.modal('hide');
this.translate().then(function () {
self.translate().then(function () {
mysuper.call(self);
});
});
@ -44,7 +44,7 @@
self.translations = translations;
self.processTranslatableNodes();
// Disable non translatable t-fields
$('[data-oe-type][data-oe-translate=0]').removeAttr('data-oe-type');
$('[data-oe-type][data-oe-translate="0"]').removeAttr('data-oe-type');
});
},
processTranslatableNodes: function () {
@ -143,7 +143,6 @@
if (node.attributes['data-oe-translate'].value == '1') {
node.className += ' oe_translatable_field';
}
return;
} else if (node.childNodes.length === 1
&& this.isTextNode(node.childNodes[0])
&& !node.getAttribute('data-oe-model')) {
@ -175,7 +174,7 @@
$(root).click(function (ev) {
ev.preventDefault();
});
return $('[data-oe-translate=1]');
return $('[data-oe-translate="1"]');
}
});

View File

@ -104,7 +104,7 @@
(len(website.language_ids) > 1 or editable)" class="dropdown">
<!-- TODO: use flags for language selection -->
<a class="dropdown-toggle" data-toggle="dropdown" href="#">
<t t-esc="lang_selected[0]['name']"/> <span class="caret"></span>
<t t-esc="lang_selected[0]['name'].split('/').pop()"/> <span class="caret"></span>
</a>
<ul class="dropdown-menu" role="menu">
<li t-foreach="website.language_ids" t-as="lg">

View File

@ -1,17 +1,16 @@
$(document).ready(function () {
$form = $('.js_nav_year a:first').on('click', function (e) {
$('.js_nav_year a:first').on('click', function (e) {
e.preventDefault();
$(this).next("ul").toggle();
});
$form = $('.js_nav_month a:first').on('click', function (e) {
$('.js_nav_month a:first').on('click', function (e) {
e.preventDefault();
var $ul = $(this).next("ul");
if (!$ul.find('li').length) {
$.post('/blog/nav', {'domain': $(this).data("domain")}, function (result) {
var result = JSON.parse(result);
var blog_id = +window.location.pathname.split("/").pop();
$(result).each(function () {
$(JSON.parse(result)).each(function () {
var $a = $('<a href="/blog/' + this.category_id + '/' + this.id + '"/>').text(this.name);
var $li = $("<li/>").append($a);
if (blog_id == this.id)
@ -27,7 +26,7 @@ $(document).ready(function () {
}
});
$form = $('.js_website_blog form#comment');
var $form = $('.js_website_blog form#comment');
$form.submit(function (e) {
e.preventDefault();
var error = $form.find("textarea").val().length < 3;
@ -39,4 +38,4 @@ $(document).ready(function () {
});
}
});
});
});

View File

@ -28,7 +28,7 @@ def get_order(order_id=None):
order_value['pricelist_id'] = request.httprequest.session['ecommerce_pricelist']
order_value['partner_id'] = request.registry.get('res.users').browse(request.cr, SUPERUSER_ID, request.uid, context=request.context).partner_id.id
order_value.update(order_obj.onchange_partner_id(request.cr, SUPERUSER_ID, [], order_value['partner_id'], context=request.context)['value'])
# add website_session_id key for access rules
if not request.httprequest.session.get('website_session_id'):
request.httprequest.session['website_session_id'] = str(uuid.uuid4())
@ -182,7 +182,7 @@ class Ecommerce(http.Controller):
bin_packing[line + copy_y][col + copy_x] = False
bin_packing[line + copy_y][col + copy_x] = product_list[index]
break
if not insert:
line += 1
else:
@ -281,7 +281,7 @@ class Ecommerce(http.Controller):
if post.get("search"):
domain += ['|', '|', '|',
('name', 'ilike', "%%%s%%" % post.get("search")),
('name', 'ilike', "%%%s%%" % post.get("search")),
('description', 'ilike', "%%%s%%" % post.get("search")),
('website_description', 'ilike', "%%%s%%" % post.get("search")),
('product_variant_ids.public_categ_id.name', 'ilike', "%%%s%%" % post.get("search"))]
@ -298,7 +298,7 @@ class Ecommerce(http.Controller):
step = 20
product_count = len(product_obj.search(request.cr, request.uid, domain, context=request.context))
pager = request.website.pager(url="/shop/%s" % post, total=product_count, page=page, step=step, scope=7, url_args=post)
pager = request.website.pager(url="/shop/", total=product_count, page=page, step=step, scope=7, url_args=post)
request.context['pricelist'] = self.get_pricelist()
@ -354,7 +354,7 @@ class Ecommerce(http.Controller):
@website.route(['/shop/add_product/', '/shop/category/<int:cat_id>/add_product/'], type='http', auth="public", multilang=True)
def add_product(self, cat_id=0, **post):
product_id = request.registry.get('product.product').create(request.cr, request.uid,
product_id = request.registry.get('product.product').create(request.cr, request.uid,
{'name': 'New Product', 'public_categ_id': cat_id}, request.context)
return request.redirect("/shop/product/%s/?unable_editor=1" % product_id)
@ -376,7 +376,7 @@ class Ecommerce(http.Controller):
if not pricelist_id:
partner_id = request.registry.get('res.users').browse(request.cr, SUPERUSER_ID, request.uid, request.context).partner_id.id
pricelist_id = request.registry['sale.order'].onchange_partner_id(request.cr, SUPERUSER_ID, [], partner_id, context=request.context)['value']['pricelist_id']
request.httprequest.session['ecommerce_pricelist'] = pricelist_id
order = get_current_order()

View File

@ -3,8 +3,8 @@ $(document).ready(function () {
$(".oe_website_sale .js_shipping").toggle();
});
$payment = $(".oe_website_sale .js_payment");
$("input[name='payment_type']", $payment).click(function (ev) {
var $payment = $(".oe_website_sale .js_payment");
$payment.find("input[name='payment_type']").click(function (ev) {
var payment_id = $(ev.currentTarget).val();
$("div[data-id]", $payment).addClass("hidden");
$("a.btn:last, div[data-id='"+payment_id+"']", $payment).removeClass("hidden");

View File

@ -72,16 +72,15 @@
<link rel='stylesheet' href='/website_sale/static/src/css/website_sale.css'/>
<t t-raw="head or ''"/>
</t>
<t t-set="additional_title">Our Products</t>
<t t-set="additional_title">Shop</t>
<div id="wrap">
<div class="oe_structure"/>
<div class="container oe_website_sale">
<div class="row">
<div class="col-sm-4">
<h1>Our Products</h1>
</div><div class="col-sm-2 pagination text-center">
<div class="col-sm-6 pagination" style="padding-left: 15px;">
<a t-if="editable" t-href="/shop/add_product/" class="btn btn-primary btn-default" t-keep-query="category,search,facettes">New Product</a>
</div><div class="col-sm-6">
</div>
<div class="col-sm-6">
<t t-call="website.pager">
<t t-set="classname">pull-right</t>
</t>
@ -170,8 +169,10 @@
</table>
</div>
</div>
<div class="text-center">
<t t-call="website.pager" />
<div>
<t t-call="website.pager">
<t t-set="classname">pull-right</t>
</t>
</div>
</div>
<div class="oe_structure mb32"/>
@ -356,120 +357,116 @@
<li class="text-muted">Payment<span class="chevron"></span></li>
<li class="text-muted">Confirmation<span class="chevron"></span></li>
</ul>
<h1 class="mb32">Your Cart</h1>
<h1 class="mb32">Shopping Cart</h1>
<div class="row">
<div class="col-md-8 oe_mycart">
<div t-if="not website_sale_order or not website_sale_order.order_line" class="well well-lg">
Your cart is empty!
<div class="col-md-3 text-muted" id="right_column">
<h4>Policies</h4>
<ul class="list-unstyled mb32">
<li>&#9745; 30-days money-back guarantee</li>
<li>&#9745; Invoice sent by e-Mail</li>
</ul>
<h4>Secure Payment</h4>
<ul class="list-unstyled mb32">
<li>&#9745; 256 bit encryption</li>
<li>&#9745; Processed by Ogone</li>
</ul>
</div>
<table class='table table-striped table-condensed' id="mycart_products" t-if="website_sale_order and website_sale_order.order_line">
<colgroup>
<col width="80"/>
<col/>
<col width="100"/>
<col width="120"/>
</colgroup>
<thead>
<tr>
<th colspan="2">Product</th>
<th>Price</th>
<th>Quantity</th>
</tr>
</thead>
<tbody>
<tr t-foreach="website_sale_order.order_line" t-as="line">
<td colspan="2" t-if="not line.product_id.product_tmpl_id"></td>
<td t-if="line.product_id.product_tmpl_id">
<span t-field="line.product_id.image_small"
t-field-options='{"widget": "image", "class": "img-rounded"}'/>
</td>
<td t-if="line.product_id.product_tmpl_id">
<div>
<a t-href="/shop/product/#{ line.product_id.product_tmpl_id.id }/">
<strong t-field="line.product_id.name"/>
</a>
</div>
<div class="text-muted" t-field="line.product_id.description_sale"/>
</td>
<td class="text-center">
<del class="text-danger" t-if="line.product_id.lst_price &gt; line.price_unit">
<span t-field="line.product_id.lst_price" t-field-options='{
<div class="col-md-8 col-md-offset-1 oe_mycart">
<div t-if="not website_sale_order or not website_sale_order.order_line" class="well well-lg">
Your cart is empty!
</div>
<table class='table table-striped table-condensed' id="mycart_products" t-if="website_sale_order and website_sale_order.order_line">
<colgroup>
<col width="80"/>
<col/>
<col width="100"/>
<col width="120"/>
</colgroup>
<thead>
<tr>
<th colspan="2">Product</th>
<th>Price</th>
<th>Quantity</th>
</tr>
</thead>
<tbody>
<tr t-foreach="website_sale_order.order_line" t-as="line">
<td colspan="2" t-if="not line.product_id.product_tmpl_id"></td>
<td t-if="line.product_id.product_tmpl_id">
<span t-field="line.product_id.image_small"
t-field-options='{"widget": "image", "class": "img-rounded"}'/>
</td>
<td t-if="line.product_id.product_tmpl_id">
<div>
<a t-href="/shop/product/#{ line.product_id.product_tmpl_id.id }/">
<strong t-field="line.product_id.name"/>
</a>
</div>
<div class="text-muted" t-field="line.product_id.description_sale"/>
</td>
<td class="text-center">
<del class="text-danger" t-if="line.product_id.lst_price &gt; line.price_unit">
<span t-field="line.product_id.lst_price" t-field-options='{
"widget": "monetary",
"display_currency": "website.pricelist_id.currency_id"
}'/>
</del>
<span t-field="line.price_unit" t-field-options='{
"widget": "monetary",
"display_currency": "website.pricelist_id.currency_id"
}'/>
</del>
<span t-field="line.price_unit" t-field-options='{
"widget": "monetary",
"display_currency": "website.pricelist_id.currency_id"
}'/>
</td>
<td>
<div class="input-group">
<span class="input-group-addon">
<a t-href="./remove_cart/?order_line_id=#{ line.id }" t-att-data-id="line.id" class="mb8 js_add_cart_json">
<span class="icon-minus"/>
</a>
</span>
<input type="text" class="js_quantity form-control"
t-att-data-id="line.id" t-att-value="int(line.product_uom_qty)"/>
<span class="input-group-addon">
<a t-href="./add_cart/?order_line_id=#{ line.id }" t-att-data-id="line.id" class="mb8 float_left js_add_cart_json">
<span class="icon-plus"/>
</a>
</span>
</div>
</td>
<td>
<div class="input-group">
<span class="input-group-addon">
<a t-href="./remove_cart/?order_line_id=#{ line.id }" t-att-data-id="line.id" class="mb8 js_add_cart_json">
<span class="icon-minus"/>
</a>
</span>
<input type="text" class="js_quantity form-control"
t-att-data-id="line.id" t-att-value="int(line.product_uom_qty)"/>
<span class="input-group-addon">
<a t-href="./add_cart/?order_line_id=#{ line.id }" t-att-data-id="line.id" class="mb8 float_left js_add_cart_json">
<span class="icon-plus"/>
</a>
</span>
</div>
</td>
</tr>
</tbody>
</table>
<table class='pull-right mb16' id="mycart_total">
<colgroup>
<col width="100"/>
<col width="120"/>
</colgroup>
<thead>
<tr style="border-top: 1px solid #000">
<th><h3>Total:</h3></th>
<th class="text-right"><h3>
<span t-field="website_sale_order.amount_total" t-field-options='{
"widget": "monetary",
"display_currency": "website.pricelist_id.currency_id"
}'/></h3>
</th>
</tr>
<tr class="text-muted">
<td><abbr title="Taxes may be updated after providing shipping address">Incl. Taxes:</abbr></td>
<td class="text-right">
<span t-field="website_sale_order.amount_tax" t-field-options='{
"widget": "monetary",
"display_currency": "website.pricelist_id.currency_id"
}'/>
</td>
</tr>
</thead>
</table>
<div class="clearfix"/>
<a t-href="/shop" class="btn btn-default"><span class="icon-long-arrow-left"/> Continue Shopping</a>
<a t-if="website_sale_order and website_sale_order.order_line" t-href="/shop/checkout/" class="btn btn-primary pull-right mb32">Process Checkout <span class="icon-long-arrow-right"/></a>
<div class="oe_structure"/>
</div>
<div class="col-md-3 col-md-offset-1 text-muted" id="right_column">
<h4>Policies</h4>
<ul class="list-unstyled mb32">
<li>&#9745; 30-days money-back guarantee</li>
<li>&#9745; Invoice sent by e-Mail</li>
</ul>
<h4>Secure Payment</h4>
<ul class="list-unstyled mb32">
<li>&#9745; Transation 256bit encrypted</li>
<li>&#9745; Processed by Ogone</li>
</ul>
</div>
</td>
</tr>
</tbody>
</table>
<table class='pull-right mb16' id="mycart_total">
<colgroup>
<col width="100"/>
<col width="120"/>
</colgroup>
<thead>
<tr style="border-top: 1px solid #000">
<th><h3>Total:</h3></th>
<th class="text-right"><h3>
<span t-field="website_sale_order.amount_total" t-field-options='{
"widget": "monetary",
"display_currency": "website.pricelist_id.currency_id"
}'/></h3>
</th>
</tr>
<tr class="text-muted">
<td><abbr title="Taxes may be updated after providing shipping address">Incl. Taxes:</abbr></td>
<td class="text-right">
<span t-field="website_sale_order.amount_tax" t-field-options='{
"widget": "monetary",
"display_currency": "website.pricelist_id.currency_id"
}'/>
</td>
</tr>
</thead>
</table>
<div class="clearfix"/>
<a t-href="/shop" class="btn btn-default"><span class="icon-long-arrow-left"/> Continue Shopping</a>
<a t-if="website_sale_order and website_sale_order.order_line" t-href="/shop/checkout/" class="btn btn-primary pull-right mb32">Process Checkout <span class="icon-long-arrow-right"/></a>
<div class="oe_structure"/>
</div>
</div>
</div>