Browse Source

don en ligne modif js

master
root 3 years ago
parent
commit
799fe4cffa
11 changed files with 876 additions and 117 deletions
  1. +1
    -2
      __manifest__.py
  2. +1
    -1
      controllers/donation.py
  3. +0
    -1
      models/__init__.py
  4. +19
    -1
      models/partner.py
  5. +0
    -26
      models/partner_draft.py
  6. +0
    -1
      security/ir.model.access.csv
  7. +828
    -0
      static/src/js/website_sale.js
  8. +2
    -8
      views/partner.xml
  9. +0
    -60
      views/partner_draft.xml
  10. +14
    -13
      views/website_donation.xml
  11. +11
    -4
      views/website_sale.xml

+ 1
- 2
__manifest__.py View File

@ -30,7 +30,6 @@
'views/email.xml',
'views/phone.xml',
'views/partner.xml',
'views/partner_draft.xml',
'views/donation.xml',
'views/relationship.xml',
'views/operation.xml',
@ -40,7 +39,7 @@
'views/payment_batch.xml',
'views/website_sale.xml',
'views/aggregate.xml',
'wizard/operation_duplicate_wizard.xml',
'wizard/operation_duplicate_wizard.xml'
#'views/website_donation.xml'


+ 1
- 1
controllers/donation.py View File

@ -4,7 +4,7 @@ from odoo.exceptions import UserError
import json
class donation():
class donation(http.Controller):
@http.route(['/makedonation'], type='http', auth="public", methods=['POST'], website=True)
def make_donation(self, **kw):


+ 0
- 1
models/__init__.py View File

@ -14,4 +14,3 @@ from . import payment_batch
from . import sale_order
from . import product
from . import aggregate
from . import partner_draft

+ 19
- 1
models/partner.py View File

@ -176,8 +176,26 @@ class partner(models.Model):
#rec.write({'key':3})
#raise Warning(rec.id)
for rec in self.env['res.partner'].search([]):
rec.key=2
rec.key=int(rec.id)*40456
#raise Warning(len())
def _update_source(self):
#for rec in self.env:
#rec.write({'key':3})
#raise Warning(rec.id)
for rec in self.env['res.partner'].search([]):
rec.source='joomla'
#raise Warning(len())
def _remove_source(self):
#for rec in self.env:
#rec.write({'key':3})
#raise Warning(rec.id)
self.env["res.partner"].search([('source','=','joomla')]).unlink()
#raise Warning(len())
@api.onchange('street')
def _onchange_street(self):


+ 0
- 26
models/partner_draft.py View File

@ -1,32 +1,6 @@
# -*- coding: utf-8 -*-
from odoo import models, fields, api
from odoo.exceptions import UserError, ValidationError
from psycopg2 import sql, DatabaseError
from odoo.tools.safe_eval import safe_eval, datetime
from werkzeug import utils
class opendons_partnerdraft(models.Model):
_name = 'opendons.partnerdraft'
_description = 'import draft partner'
external_id=fields.Integer(string='external id',required=True)
source=fields.Char(String='source file',required=True)
name=fields.Char(string='name',required=True)
firstname=fields.Char(string='firstname')
phone = fields.Char(string='phone')
mobile = fields.Char(string='mobile')
email = fields.Char(string='email')
complement_ident = fields.Char(string='N° appartment,floor')
complement_geo = fields.Char(string='entry,tower,bat')
street = fields.Char(string='street')
street2 = fields.Char(string='street2')
city = fields.Char(string='city')
zip = fields.Char(string='zip code')
country = fields.Char(string='country')


+ 0
- 1
security/ir.model.access.csv View File

@ -24,4 +24,3 @@ access_opendons_payment_batch_qr_code,opendons_payment_batch_qrcode,model_opendo
access_opendons_duplicate_operation_wizard,opendons_duplicate_operation_wizard,model_opendons_operation_duplicate,donation.group_donation_manager,1,1,1,1
access_opendons_aggregate_partner,opendons_aggregate_partner,model_opendons_aggregate_partner,donation.group_donation_manager,1,1,1,1
access_opendons_partnerdraft,opendons_partnerdraft,model_opendons_partnerdraft,donation.group_donation_manager,1,1,1,1

+ 828
- 0
static/src/js/website_sale.js View File

@ -0,0 +1,828 @@
odoo.define('website_sale.cart', function (require) {
'use strict';
var publicWidget = require('web.public.widget');
var core = require('web.core');
var _t = core._t;
var timeout;
publicWidget.registry.websiteSaleCartLink = publicWidget.Widget.extend({
selector: '#top_menu a[href$="/shop/cart"]',
events: {
'mouseenter': '_onMouseEnter',
'mouseleave': '_onMouseLeave',
'click': '_onClick',
},
/**
* @constructor
*/
init: function () {
this._super.apply(this, arguments);
this._popoverRPC = null;
},
/**
* @override
*/
start: function () {
this.$el.popover({
trigger: 'manual',
animation: true,
html: true,
title: function () {
return _t("My Cart");
},
container: 'body',
placement: 'auto',
template: '<div class="popover mycart-popover" role="tooltip"><div class="arrow"></div><h3 class="popover-header"></h3><div class="popover-body"></div></div>'
});
return this._super.apply(this, arguments);
},
//--------------------------------------------------------------------------
// Handlers
//--------------------------------------------------------------------------
/**
* @private
* @param {Event} ev
*/
_onMouseEnter: function (ev) {
var self = this;
clearTimeout(timeout);
$(this.selector).not(ev.currentTarget).popover('hide');
timeout = setTimeout(function () {
if (!self.$el.is(':hover') || $('.mycart-popover:visible').length) {
return;
}
self._popoverRPC = $.get("/shop/cart", {
type: 'popover',
}).then(function (data) {
self.$el.data("bs.popover").config.content = data;
self.$el.popover("show");
$('.popover').on('mouseleave', function () {
self.$el.trigger('mouseleave');
});
});
}, 300);
},
/**
* @private
* @param {Event} ev
*/
_onMouseLeave: function (ev) {
var self = this;
setTimeout(function () {
if ($('.popover:hover').length) {
return;
}
if (!self.$el.is(':hover')) {
self.$el.popover('hide');
}
}, 1000);
},
/**
* @private
* @param {Event} ev
*/
_onClick: function (ev) {
// When clicking on the cart link, prevent any popover to show up (by
// clearing the related setTimeout) and, if a popover rpc is ongoing,
// wait for it to be completed before going to the link's href. Indeed,
// going to that page may perform the same computation the popover rpc
// is already doing.
clearTimeout(timeout);
if (this._popoverRPC && this._popoverRPC.state() === 'pending') {
ev.preventDefault();
var href = ev.currentTarget.href;
this._popoverRPC.then(function () {
window.location.href = href;
});
}
},
});
});
odoo.define('website_sale.website_sale_category', function (require) {
'use strict';
var publicWidget = require('web.public.widget');
publicWidget.registry.websiteSaleCategory = publicWidget.Widget.extend({
selector: '#o_shop_collapse_category',
events: {
'click .fa-chevron-right': '_onOpenClick',
'click .fa-chevron-down': '_onCloseClick',
},
//--------------------------------------------------------------------------
// Handlers
//--------------------------------------------------------------------------
/**
* @private
* @param {Event} ev
*/
_onOpenClick: function (ev) {
var $fa = $(ev.currentTarget);
$fa.parent().siblings().find('.fa-chevron-down:first').click();
$fa.parents('li').find('ul:first').show('normal');
$fa.toggleClass('fa-chevron-down fa-chevron-right');
},
/**
* @private
* @param {Event} ev
*/
_onCloseClick: function (ev) {
var $fa = $(ev.currentTarget);
$fa.parent().find('ul:first').hide('normal');
$fa.toggleClass('fa-chevron-down fa-chevron-right');
},
});
});
odoo.define('website_sale.website_sale', function (require) {
'use strict';
var core = require('web.core');
var config = require('web.config');
var publicWidget = require('web.public.widget');
var VariantMixin = require('sale.VariantMixin');
var wSaleUtils = require('website_sale.utils');
const wUtils = require('website.utils');
require("web.zoomodoo");
publicWidget.registry.WebsiteSale = publicWidget.Widget.extend(VariantMixin, {
selector: '.oe_website_sale',
events: _.extend({}, VariantMixin.events || {}, {
'change form .js_product:first input[name="add_qty"]': '_onChangeAddQuantity',
'mouseup .js_publish': '_onMouseupPublish',
'touchend .js_publish': '_onMouseupPublish',
'change .oe_cart input.js_quantity[data-product-id]': '_onChangeCartQuantity',
'click .oe_cart a.js_add_suggested_products': '_onClickSuggestedProduct',
'click a.js_add_cart_json': '_onClickAddCartJSON',
'click .a-submit': '_onClickSubmit',
'change form.js_attributes input, form.js_attributes select': '_onChangeAttribute',
'mouseup form.js_add_cart_json label': '_onMouseupAddCartLabel',
'touchend form.js_add_cart_json label': '_onMouseupAddCartLabel',
'click .show_coupon': '_onClickShowCoupon',
'submit .o_wsale_products_searchbar_form': '_onSubmitSaleSearch',
'change select[name="country_id"]': '_onChangeCountry',
'change #shipping_use_same': '_onChangeShippingUseSame',
'click .toggle_summary': '_onToggleSummary',
'click #add_to_cart, #buy_now, #products_grid .o_wsale_product_btn .a-submit': 'async _onClickAdd',
'click input.js_product_change': 'onChangeVariant',
'change .js_main_product [data-attribute_exclusions]': 'onChangeVariant',
'change oe_optional_products_modal [data-attribute_exclusions]': 'onChangeVariant',
}),
/**
* @constructor
*/
init: function () {
this._super.apply(this, arguments);
this._changeCartQuantity = _.debounce(this._changeCartQuantity.bind(this), 500);
this._changeCountry = _.debounce(this._changeCountry.bind(this), 500);
this.isWebsite = true;
delete this.events['change .main_product:not(.in_cart) input.js_quantity'];
delete this.events['change [data-attribute_exclusions]'];
},
/**
* @override
*/
start() {
const def = this._super(...arguments);
this._applyHashFromSearch();
_.each(this.$('div.js_product'), function (product) {
$('input.js_product_change', product).first().trigger('change');
});
// This has to be triggered to compute the "out of stock" feature and the hash variant changes
this.triggerVariantChange(this.$el);
this.$('select[name="country_id"]').change();
core.bus.on('resize', this, function () {
if (config.device.size_class === config.device.SIZES.XL) {
$('.toggle_summary_div').addClass('d-none d-xl-block');
}
});
this._startZoom();
window.addEventListener('hashchange', () => {
this._applyHash();
this.triggerVariantChange(this.$el);
});
return def;
},
/**
* The selector is different when using list view of variants.
*
* @override
*/
getSelectedVariantValues: function ($container) {
var combination = $container.find('input.js_product_change:checked')
.data('combination');
if (combination) {
return combination;
}
return VariantMixin.getSelectedVariantValues.apply(this, arguments);
},
//--------------------------------------------------------------------------
// Private
//--------------------------------------------------------------------------
_applyHash: function () {
var hash = window.location.hash.substring(1);
if (hash) {
var params = $.deparam(hash);
if (params['attr']) {
var attributeIds = params['attr'].split(',');
var $inputs = this.$('input.js_variant_change, select.js_variant_change option');
_.each(attributeIds, function (id) {
var $toSelect = $inputs.filter('[data-value_id="' + id + '"]');
if ($toSelect.is('input[type="radio"]')) {
$toSelect.prop('checked', true);
} else if ($toSelect.is('option')) {
$toSelect.prop('selected', true);
}
});
this._changeColorAttribute();
}
}
},
/**
* Sets the url hash from the selected product options.
*
* @private
*/
_setUrlHash: function ($parent) {
var $attributes = $parent.find('input.js_variant_change:checked, select.js_variant_change option:selected');
var attributeIds = _.map($attributes, function (elem) {
return $(elem).data('value_id');
});
history.replaceState(undefined, undefined, '#attr=' + attributeIds.join(','));
},
/**
* Set the checked color active.
*
* @private
*/
_changeColorAttribute: function () {
$('.css_attribute_color').removeClass("active")
.filter(':has(input:checked)')
.addClass("active");
},
/**
* @private
*/
_changeCartQuantity: function ($input, value, $dom_optional, line_id, productIDs) {
_.each($dom_optional, function (elem) {
$(elem).find('.js_quantity').text(value);
productIDs.push($(elem).find('span[data-product-id]').data('product-id'));
});
$input.data('update_change', true);
this._rpc({
route: "/shop/cart/update_json",
params: {
line_id: line_id,
product_id: parseInt($input.data('product-id'), 10),
set_qty: value
},
}).then(function (data) {
$input.data('update_change', false);
var check_value = parseInt($input.val() || 0, 10);
if (isNaN(check_value)) {
check_value = 1;
}
if (value !== check_value) {
$input.trigger('change');
return;
}
if (!data.cart_quantity) {
return window.location = '/shop/cart';
}
wSaleUtils.updateCartNavBar(data);
$input.val(data.quantity);
$('.js_quantity[data-line-id='+line_id+']').val(data.quantity).html(data.quantity);
if (data.warning) {
var cart_alert = $('.oe_cart').parent().find('#data_warning');
if (cart_alert.length === 0) {
$('.oe_cart').prepend('<div class="alert alert-danger alert-dismissable" role="alert" id="data_warning">'+
'<button type="button" class="close" data-dismiss="alert" aria-hidden="true">&times;</button> ' + data.warning + '</div>');
}
else {
cart_alert.html('<button type="button" class="close" data-dismiss="alert" aria-hidden="true">&times;</button> ' + data.warning);
}
$input.val(data.quantity);
}
});
},
/**
* @private
*/
_changeCountry: function () {
if (!$("#country_id").val()) {
return;
}
this._rpc({
route: "/shop/country_infos/" + $("#country_id").val(),
params: {
mode: $("#country_id").attr('mode'),
},
}).then(function (data) {
// placeholder phone_code
$("input[name='phone']").attr('placeholder', data.phone_code !== 0 ? '+'+ data.phone_code : '');
// populate states and display
var selectStates = $("select[name='state_id']");
// dont reload state at first loading (done in qweb)
if (selectStates.data('init')===0 || selectStates.find('option').length===1) {
if (data.states.length || data.state_required) {
selectStates.html('');
_.each(data.states, function (x) {
var opt = $('<option>').text(x[1])
.attr('value', x[0])
.attr('data-code', x[2]);
selectStates.append(opt);
});
selectStates.parent('div').show();
} else {
selectStates.val('').parent('div').hide();
}
selectStates.data('init', 0);
} else {
selectStates.data('init', 0);
}
// manage fields order / visibility
if (data.fields) {
if ($.inArray('zip', data.fields) > $.inArray('city', data.fields)){
$(".div_zip").before($(".div_city"));
} else {
$(".div_zip").after($(".div_city"));
}
var all_fields = ["street", "zip", "city", "country_name"]; // "state_code"];
_.each(all_fields, function (field) {
$(".checkout_autoformat .div_" + field.split('_')[0]).toggle($.inArray(field, data.fields)>=0);
});
}
if ($("label[for='zip']").length) {
$("label[for='zip']").toggleClass('label-optional', !data.zip_required);
$("label[for='zip']").get(0).toggleAttribute('required', !!data.zip_required);
}
if ($("label[for='zip']").length) {
$("label[for='state_id']").toggleClass('label-optional', !data.state_required);
$("label[for='state_id']").get(0).toggleAttribute('required', !!data.state_required);
}
});
},
/**
* This is overridden to handle the "List View of Variants" of the web shop.
* That feature allows directly selecting the variant from a list instead of selecting the
* attribute values.
*
* Since the layout is completely different, we need to fetch the product_id directly
* from the selected variant.
*
* @override
*/
_getProductId: function ($parent) {
if ($parent.find('input.js_product_change').length !== 0) {
return parseInt($parent.find('input.js_product_change:checked').val());
}
else {
return VariantMixin._getProductId.apply(this, arguments);
}
},
/**
* @private
*/
_startZoom: function () {
// Do not activate image zoom for mobile devices, since it might prevent users from scrolling the page
if (!config.device.isMobile) {
var autoZoom = $('.ecom-zoomable').data('ecom-zoom-auto') || false,
attach = '#o-carousel-product';
_.each($('.ecom-zoomable img[data-zoom]'), function (el) {
onImageLoaded(el, function () {
var $img = $(el);
$img.zoomOdoo({event: autoZoom ? 'mouseenter' : 'click', attach: attach});
$img.attr('data-zoom', 1);
});
});
}
function onImageLoaded(img, callback) {
// On Chrome the load event already happened at this point so we
// have to rely on complete. On Firefox it seems that the event is
// always triggered after this so we can rely on it.
//
// However on the "complete" case we still want to keep listening to
// the event because if the image is changed later (eg. product
// configurator) a new load event will be triggered (both browsers).
$(img).on('load', function () {
callback();
});
if (img.complete) {
callback();
}
}
},
/**
* On website, we display a carousel instead of only one image
*
* @override
* @private
*/
_updateProductImage: function ($productContainer, displayImage, productId, productTemplateId, newCarousel, isCombinationPossible) {
var $carousel = $productContainer.find('#o-carousel-product');
// When using the web editor, don't reload this or the images won't
// be able to be edited depending on if this is done loading before
// or after the editor is ready.
if (window.location.search.indexOf('enable_editor') === -1) {
var $newCarousel = $(newCarousel);
$carousel.after($newCarousel);
$carousel.remove();
$carousel = $newCarousel;
$carousel.carousel(0);
this._startZoom();
// fix issue with carousel height
this.trigger_up('widgets_start_request', {$target: $carousel});
}
$carousel.toggleClass('css_not_available', !isCombinationPossible);
},
/**
* @private
* @param {MouseEvent} ev
*/
_onClickAdd: function (ev) {
ev.preventDefault();
this.isBuyNow = $(ev.currentTarget).attr('id') === 'buy_now';
return this._handleAdd($(ev.currentTarget).closest('form'));
},
/**
* Initializes the optional products modal
* and add handlers to the modal events (confirm, back, ...)
*
* @private
* @param {$.Element} $form the related webshop form
*/
_handleAdd: function ($form) {
var self = this;
this.$form = $form;
var productSelector = [
'input[type="hidden"][name="product_id"]',
'input[type="radio"][name="product_id"]:checked'
];
var productReady = this.selectOrCreateProduct(
$form,
parseInt($form.find(productSelector.join(', ')).first().val(), 10),
$form.find('.product_template_id').val(),
false
);
return productReady.then(function (productId) {
$form.find(productSelector.join(', ')).val(productId);
self.rootProduct = {
product_id: productId,
donation_amount: $form.find('input[name="donation_amount"]').val(),
quantity: parseFloat($form.find('input[name="add_qty"]').val() || 1),
product_custom_attribute_values: self.getCustomVariantValues($form.find('.js_product')),
variant_values: self.getSelectedVariantValues($form.find('.js_product')),
no_variant_attribute_values: self.getNoVariantAttributeValues($form.find('.js_product'))
};
return self._onProductReady();
});
},
_onProductReady: function () {
return this._submitForm();
},
/**
* Add custom variant values and attribute values that do not generate variants
* in the form data and trigger submit.
*
* @private
* @returns {Promise} never resolved
*/
_submitForm: function () {
let params = this.rootProduct;
params.add_qty = params.quantity;
params.product_custom_attribute_values = JSON.stringify(params.product_custom_attribute_values);
params.no_variant_attribute_values = JSON.stringify(params.no_variant_attribute_values);
if (this.isBuyNow) {
params.express = true;
}
return wUtils.sendRequest('/shop/cart/update', params);
},
/**
* @private
* @param {MouseEvent} ev
*/
_onClickAddCartJSON: function (ev){
this.onClickAddCartJSON(ev);
},
/**
* @private
* @param {Event} ev
*/
_onChangeAddQuantity: function (ev) {
this.onChangeAddQuantity(ev);
},
/**
* @private
* @param {Event} ev
*/
_onMouseupPublish: function (ev) {
$(ev.currentTarget).parents('.thumbnail').toggleClass('disabled');
},
/**
* @private
* @param {Event} ev
*/
_onChangeCartQuantity: function (ev) {
var $input = $(ev.currentTarget);
if ($input.data('update_change')) {
return;
}
var value = parseInt($input.val() || 0, 10);
if (isNaN(value)) {
value = 1;
}
var $dom = $input.closest('tr');
// var default_price = parseFloat($dom.find('.text-danger > span.oe_currency_value').text());
var $dom_optional = $dom.nextUntil(':not(.optional_product.info)');
var line_id = parseInt($input.data('line-id'), 10);
var productIDs = [parseInt($input.data('product-id'), 10)];
this._changeCartQuantity($input, value, $dom_optional, line_id, productIDs);
},
/**
* @private
* @param {Event} ev
*/
_onClickSuggestedProduct: function (ev) {
$(ev.currentTarget).prev('input').val(1).trigger('change');
},
/**
* @private
* @param {Event} ev
*/
_onClickSubmit: function (ev, forceSubmit) {
if ($(ev.currentTarget).is('#add_to_cart, #products_grid .a-submit') && !forceSubmit) {
return;
}
var $aSubmit = $(ev.currentTarget);
if (!ev.isDefaultPrevented() && !$aSubmit.is(".disabled")) {
ev.preventDefault();
$aSubmit.closest('form').submit();
}
if ($aSubmit.hasClass('a-submit-disable')){
$aSubmit.addClass("disabled");
}
if ($aSubmit.hasClass('a-submit-loading')){
var loading = '<span class="fa fa-cog fa-spin"/>';
var fa_span = $aSubmit.find('span[class*="fa"]');
if (fa_span.length){
fa_span.replaceWith(loading);
} else {
$aSubmit.append(loading);
}
}
},
/**
* @private
* @param {Event} ev
*/
_onChangeAttribute: function (ev) {
if (!ev.isDefaultPrevented()) {
ev.preventDefault();
$(ev.currentTarget).closest("form").submit();
}
},
/**
* @private
* @param {Event} ev
*/
_onMouseupAddCartLabel: function (ev) { // change price when they are variants
var $label = $(ev.currentTarget);
var $price = $label.parents("form:first").find(".oe_price .oe_currency_value");
if (!$price.data("price")) {
$price.data("price", parseFloat($price.text()));
}
var value = $price.data("price") + parseFloat($label.find(".badge span").text() || 0);
var dec = value % 1;
$price.html(value + (dec < 0.01 ? ".00" : (dec < 1 ? "0" : "") ));
},
/**
* @private
* @param {Event} ev
*/
_onClickShowCoupon: function (ev) {
$(ev.currentTarget).hide();
$('.coupon_form').removeClass('d-none');
},
/**
* @private
* @param {Event} ev
*/
_onSubmitSaleSearch: function (ev) {
if (!this.$('.dropdown_sorty_by').length) {
return;
}
var $this = $(ev.currentTarget);
if (!ev.isDefaultPrevented() && !$this.is(".disabled")) {
ev.preventDefault();
var oldurl = $this.attr('action');
oldurl += (oldurl.indexOf("?")===-1) ? "?" : "";
var search = $this.find('input.search-query');
window.location = oldurl + '&' + search.attr('name') + '=' + encodeURIComponent(search.val());
}
},
/**
* @private
* @param {Event} ev
*/
_onChangeCountry: function (ev) {
if (!this.$('.checkout_autoformat').length) {
return;
}
this._changeCountry();
},
/**
* @private
* @param {Event} ev
*/
_onChangeShippingUseSame: function (ev) {
$('.ship_to_other').toggle(!$(ev.currentTarget).prop('checked'));
},
/**
* Toggles the add to cart button depending on the possibility of the
* current combination.
*
* @override
*/
_toggleDisable: function ($parent, isCombinationPossible) {
VariantMixin._toggleDisable.apply(this, arguments);
$parent.find("#add_to_cart").toggleClass('disabled', !isCombinationPossible);
$parent.find("#buy_now").toggleClass('disabled', !isCombinationPossible);
},
/**
* Write the properties of the form elements in the DOM to prevent the
* current selection from being lost when activating the web editor.
*
* @override
*/
onChangeVariant: function (ev) {
var $component = $(ev.currentTarget).closest('.js_product');
$component.find('input').each(function () {
var $el = $(this);
$el.attr('checked', $el.is(':checked'));
});
$component.find('select option').each(function () {
var $el = $(this);
$el.attr('selected', $el.is(':selected'));
});
this._setUrlHash($component);
return VariantMixin.onChangeVariant.apply(this, arguments);
},
/**
* @private
*/
_onToggleSummary: function () {
$('.toggle_summary_div').toggleClass('d-none');
$('.toggle_summary_div').removeClass('d-xl-block');
},
/**
* @private
*/
_applyHashFromSearch() {
const params = $.deparam(window.location.search.slice(1));
if (params.attrib) {
const dataValueIds = [];
for (const attrib of [].concat(params.attrib)) {
const attribSplit = attrib.split('-');
const attribValueSelector = `.js_variant_change[name="ptal-${attribSplit[0]}"][value="${attribSplit[1]}"]`;
const attribValue = this.el.querySelector(attribValueSelector);
if (attribValue !== null) {
dataValueIds.push(attribValue.dataset.value_id);
}
}
if (dataValueIds.length) {
history.replaceState(undefined, undefined, `#attr=${dataValueIds.join(',')}`);
}
}
this._applyHash();
},
});
publicWidget.registry.WebsiteSaleLayout = publicWidget.Widget.extend({
selector: '.oe_website_sale',
disabledInEditableMode: false,
events: {
'change .o_wsale_apply_layout': '_onApplyShopLayoutChange',
},
//--------------------------------------------------------------------------
// Handlers
//--------------------------------------------------------------------------
/**
* @private
* @param {Event} ev
*/
_onApplyShopLayoutChange: function (ev) {
var switchToList = $(ev.currentTarget).find('.o_wsale_apply_list input').is(':checked');
if (!this.editableMode) {
this._rpc({
route: '/shop/save_shop_layout_mode',
params: {
'layout_mode': switchToList ? 'list' : 'grid',
},
});
}
var $grid = this.$('#products_grid');
// Disable transition on all list elements, then switch to the new
// layout then reenable all transitions after having forced a redraw
// TODO should probably be improved to allow disabling transitions
// altogether with a class/option.
$grid.find('*').css('transition', 'none');
$grid.toggleClass('o_wsale_layout_list', switchToList);
void $grid[0].offsetWidth;
$grid.find('*').css('transition', '');
},
});
publicWidget.registry.websiteSaleCart = publicWidget.Widget.extend({
selector: '.oe_website_sale .oe_cart',
events: {
'click .js_change_shipping': '_onClickChangeShipping',
'click .js_edit_address': '_onClickEditAddress',
'click .js_delete_product': '_onClickDeleteProduct',
},
//--------------------------------------------------------------------------
// Handlers
//--------------------------------------------------------------------------
/**
* @private
* @param {Event} ev
*/
_onClickChangeShipping: function (ev) {
var $old = $('.all_shipping').find('.card.border.border-primary');
$old.find('.btn-ship').toggle();
$old.addClass('js_change_shipping');
$old.removeClass('border border-primary');
var $new = $(ev.currentTarget).parent('div.one_kanban').find('.card');
$new.find('.btn-ship').toggle();
$new.removeClass('js_change_shipping');
$new.addClass('border border-primary');
var $form = $(ev.currentTarget).parent('div.one_kanban').find('form.d-none');
$.post($form.attr('action'), $form.serialize()+'&xhr=1');
},
/**
* @private
* @param {Event} ev
*/
_onClickEditAddress: function (ev) {
ev.preventDefault();
$(ev.currentTarget).closest('div.one_kanban').find('form.d-none').attr('action', '/shop/address').submit();
},
/**
* @private
* @param {Event} ev
*/
_onClickDeleteProduct: function (ev) {
ev.preventDefault();
$(ev.currentTarget).closest('tr').find('.js_quantity').val(0).trigger('change');
},
});
});

+ 2
- 8
views/partner.xml View File

@ -62,12 +62,7 @@
<field name="domain">[('recurring_template', '!=', False)]</field>
</record>
<record id="partnerdraft_action" model="ir.actions.act_window">
<field name="name">Partners draft</field>
<field name="res_model">opendons.partnerdraft</field>
<field name="view_mode">tree,form</field>
<field name="context"></field>
</record>
<record id="view_partner_form" model="ir.ui.view">
<field name="name">opendons.res.partner.form</field>
@ -188,8 +183,7 @@
<menuitem id="opendons_relationship_title_menu" name ="Relationships"
parent="contacts.menu_contacts" sequence="22"/>
<menuitem id="opendons_partnerdraft_title_menu" action="partnerdraft_action" name ="Partners import"
parent="contacts.menu_contacts" sequence="4"/>


+ 0
- 60
views/partner_draft.xml View File

@ -1,60 +0,0 @@
<?xml version="1.0"?>
<odoo>
<record model="ir.ui.view" id="opendons.partner_draft">
<field name="name">opendons_partner_draft list</field>
<field name="model">opendons.partnerdraft</field>
<field name="arch" type="xml">
<tree>
<field name="source"/>
<field name="external_id"/>
<field name="name"/>
<field name="firstname"/>
<field name="phone"/>
<field name="mobile"/>
<field name="email"/>
<field name="complement_ident"/>
<field name="complement_geo"/>
<field name="street"/>
<field name="street2"/>
<field name="city"/>
<field name="zip"/>
<field name="country"/>
</tree>
</field>
</record>
<record model="ir.ui.view" id="opendons.partnerdraft_form" >
<field name="name">opendons_partnerdraft_form</field>
<field name="model">opendons.partnerdraft</field>
<field name="arch" type="xml">
<form string="Partner draft import">
<header>
<!-- <button name="compute_aggregate" type="object" string="Compute"/> -->
</header>
<sheet>
<group name="main">
<field name="source"/>
<field name="external_id"/>
<field name="name"/>
<field name="firstname"/>
<field name="phone"/>
<field name="mobile"/>
<field name="email"/>
<field name="complement_ident"/>
<field name="complement_geo"/>
<field name="street"/>
<field name="street2"/>
<field name="city"/>
<field name="zip"/>
<field name="country"/>
</group>
</sheet>
</form>
</field>
</record>
</odoo>

+ 14
- 13
views/website_donation.xml View File

@ -12,26 +12,27 @@
<title>
Make donation
</title>
</head>
<body>
<div class="container-fluid">
<div class="row-fluid">
<h2>Faire un don en ligne</h2>
<p> * Champs obligatoires</p>
<form method="post" action="connexion-contact?middlepage" id="addForm">
<input type="hidden" name="type" value="don">
<input type="hidden" name="type" value="don"/>
<ul id="left"> <li>Civilité<br></br>
<select name="civ" form="addForm"> <option value="Monsieur">Monsieur</option> <option value="Madame">Madame</option> <option value="Mademoiselle">Mademoiselle</option> </select> </li>
<li>*Prénom<br><input required="" onchange="inputCheck()" id="prenom" type="text" placeholder="Prenom" name="prenom"></li>
<li>*Nom<br><input required="" onchange="inputCheck()" id="nom" type="text" placeholder="Nom" name="nom"></li>
<li>*Adresse 1<br><input required="" type="text" placeholder="Adresse 1" name="adr1"></li>
<li>Adresse 2<br><input type="text" placeholder="Adresse 2" name="adr2"></li>
<li>*Ville<br><input required="" type="text" placeholder="Ville" name="ville"></li>
<li>Pays<br><input onchange="inputCheck()" id="pays" type="text" placeholder="Pays" name="pays"></li>
<li>*Code postal<br><input required="" onchange="inputCheck()" id="zip" type="text" placeholder="Code postal" name="zip"></li>
<li>Telephone<br><input type="text" placeholder="Telephone" name="tel"></li>
<li>*Email<br><input required="" onchange="inputCheck()" id="mail" type="text" placeholder="email@mail.fr" name="mail"></li>
<li>Montant du don<br><input required="" type="float" id="donation_amount" name="montant" value="10"><input type="hidden" name="type" value="don"> </li>
<li>Destination du don<br> <select name="dest" form="addForm"> <option value="KO" selected="true" disabled="disabled">Selection</option>
<li>*Prénom<br></br><input required="" onchange="inputCheck()" id="prenom" type="text" placeholder="Prenom" name="prenom"/></li>
<li>*Nom<br></br><input required="" onchange="inputCheck()" id="nom" type="text" placeholder="Nom" name="nom"/></li>
<li>*Adresse 1<br></br><input required="" type="text" placeholder="Adresse 1" name="adr1"/></li>
<li>Adresse 2<br></br><input type="text" placeholder="Adresse 2" name="adr2"/></li>
<li>*Ville<br></br><input required="" type="text" placeholder="Ville" name="ville"/></li>
<li>Pays<br></br><input onchange="inputCheck()" id="pays" type="text" placeholder="Pays" name="pays"/></li>
<li>*Code postal<br></br><input required="" onchange="inputCheck()" id="zip" type="text" placeholder="Code postal" name="zip"/></li>
<li>Telephone<br></br><input type="text" placeholder="Telephone" name="tel"/></li>
<li>*Email<br></br><input required="" onchange="inputCheck()" id="mail" type="text" placeholder="email@mail.fr" name="mail"/></li>
<li>Montant du don<br></br><input required="" type="float" id="donation_amount" name="montant" value="10"/></li>
<li>Destination du don<br></br> <select name="dest" form="addForm"> <option value="KO" selected="true" disabled="disabled">Selection</option>
<option value="Selon besoins du centre">Selon besoins du centre</option>
<option value="Soutien Lamas">Soutien Lamas</option>
<option value="Aider Sangha ordonnée">Aider Sangha ordonnée</option>
@ -39,7 +40,7 @@
<option value="Rituels et prières">Rituels et prières</option>
<option value="Activités en ligne">Activités en ligne</option>
<option value="Autre">Autre</option> </select> </li>
<li><input type="submit" class="btn" value="Faire un don et payer par carte bancaire" style="width:300px;margin-left:0;"></li>
<li><input type="submit" class="btn" value="Faire un don et payer par carte bancaire" style="width:300px;margin-left:0;"/></li>
</ul>
</form>
</div>


+ 11
- 4
views/website_sale.xml View File

@ -16,13 +16,19 @@
</template> -->
<template id="assets_opendons_frontend" inherit_id="website.assets_frontend">
<xpath expr="script[last()]" position="after">
<script type="text/javascript" src="/opendons/static/src/js/website_sale.js"></script>
</xpath>
</template>
<!-- /usr/lib/python3/dist-packages/odoo/addons/website_sale/views/templates.xml ligne 593 -->
<template id="product_donation_set_price" inherit_id="website_sale.product" customize_show="True" name="Product donation set price">
<xpath expr="//div[@class='js_product js_main_product']" position="replace">
<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" />
<t t-if="combination" t-call="sale.variants">
<t t-if="combination" t-call="sale.variants">
<t t-set="ul_class" t-value="'flex-column'" />
<t t-set="parent_combination" t-value="None" />
</t>
@ -32,11 +38,12 @@
</t>
<t t-if="product.donation">
<h2> Saisir le montant :</h2>
<!-- <input name="donation_amount" type="text" class="form-control donation_amount" data-oe-model="ir.ui.view"/> -->
<input type="hidden" class="donation_amount" name="donation_amount" t-att-value="33" />
<input name="donation_amount" type="text" class="form-control donation_amount" data-oe-model="ir.ui.view"/>
</t>
<t t-if="not product.donation" t-call="website_sale.product_price"/>
<!-- <t t-if="not product.donation" t-call="website_sale.product_price"/> -->
<t t-call="website_sale.product_price"/>
<!-- <input type="hidden" name="donation_amount" data-oe-model="ir.ui.view" t-att-value="0"/> -->
<p t-if="True" class="css_not_available_msg alert alert-warning">This combination does not exist.</p>


Loading…
Cancel
Save