summaryrefslogtreecommitdiff
path: root/addons/website_sale_comparison/static
diff options
context:
space:
mode:
authorstephanchrst <stephanchrst@gmail.com>2022-05-10 21:51:50 +0700
committerstephanchrst <stephanchrst@gmail.com>2022-05-10 21:51:50 +0700
commit3751379f1e9a4c215fb6eb898b4ccc67659b9ace (patch)
treea44932296ef4a9b71d5f010906253d8c53727726 /addons/website_sale_comparison/static
parent0a15094050bfde69a06d6eff798e9a8ddf2b8c21 (diff)
initial commit 2
Diffstat (limited to 'addons/website_sale_comparison/static')
-rw-r--r--addons/website_sale_comparison/static/description/icon.pngbin0 -> 8241 bytes
-rw-r--r--addons/website_sale_comparison/static/description/icon.svg1
-rw-r--r--addons/website_sale_comparison/static/src/js/website_sale_comparison.js294
-rw-r--r--addons/website_sale_comparison/static/src/scss/website_sale_comparison.scss65
-rw-r--r--addons/website_sale_comparison/static/src/xml/comparison.xml35
-rw-r--r--addons/website_sale_comparison/static/tests/tours/website_sale_comparison.js242
6 files changed, 637 insertions, 0 deletions
diff --git a/addons/website_sale_comparison/static/description/icon.png b/addons/website_sale_comparison/static/description/icon.png
new file mode 100644
index 00000000..47b5b88d
--- /dev/null
+++ b/addons/website_sale_comparison/static/description/icon.png
Binary files differ
diff --git a/addons/website_sale_comparison/static/description/icon.svg b/addons/website_sale_comparison/static/description/icon.svg
new file mode 100644
index 00000000..ce3a5421
--- /dev/null
+++ b/addons/website_sale_comparison/static/description/icon.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="70" height="70" viewBox="0 0 70 70"><defs><path id="a" d="M4 0h61c4 0 5 1 5 5v60c0 4-1 5-5 5H4c-3 0-4-1-4-5V5c0-4 1-5 4-5z"/><linearGradient id="c" x1="100%" x2="0%" y1="0%" y2="100%"><stop offset="0%" stop-color="#DA956B"/><stop offset="100%" stop-color="#CC7039"/></linearGradient><path id="d" d="M23 27.281L27 43l1 4h19c1 0 1 2 0 2H26l-6-24h-2v1c0 .667-.333 1-1 1s-1-.333-1-1v-2c.066-.667.4-1 1-1h4c.517 0 .85.333 1 1l1 3.281zM45.5 55a2.5 2.5 0 1 1 0-5 2.5 2.5 0 0 1 0 5zm-19 0a2.5 2.5 0 1 1 0-5 2.5 2.5 0 0 1 0 5zM50 37.299v2.449c0 .11-.038.206-.115.287a.363.363 0 0 1-.272.121H32.977v2.45c0 .11-.038.206-.114.287a.363.363 0 0 1-.272.121.442.442 0 0 1-.29-.128l-3.857-4.082a.393.393 0 0 1-.11-.28.41.41 0 0 1 .11-.294l3.868-4.083a.366.366 0 0 1 .279-.114c.104 0 .195.04.272.12.076.082.114.177.114.288v2.45h16.636c.105 0 .196.04.272.12.077.081.115.177.115.288zm0-7.199a.41.41 0 0 1-.109.294l-3.869 4.082a.366.366 0 0 1-.278.115.363.363 0 0 1-.272-.121.403.403 0 0 1-.115-.287v-2.45H28.722a.363.363 0 0 1-.272-.12.403.403 0 0 1-.115-.288v-2.45c0-.11.038-.206.115-.286a.363.363 0 0 1 .272-.122h16.635v-2.449a.41.41 0 0 1 .11-.293.366.366 0 0 1 .277-.115c.097 0 .194.042.29.127l3.857 4.07A.41.41 0 0 1 50 30.1z"/><path id="e" d="M23 25.281L27 41l1 3h19c1 0 1 3 0 3H26l-6-24h-2v1c0 .667-.333 1-1 1s-1-.333-1-1v-2c.066-.667.4-1 1-1h4c.517 0 .85.333 1 1l1 3.281zM45.5 53a2.5 2.5 0 1 1 0-5 2.5 2.5 0 0 1 0 5zm-19 0a2.5 2.5 0 1 1 0-5 2.5 2.5 0 0 1 0 5zM50 34.689v2.45c0 .11-.038.205-.115.286a.363.363 0 0 1-.272.121H32.977v2.45c0 .11-.038.206-.114.287a.363.363 0 0 1-.272.121.442.442 0 0 1-.29-.127l-3.857-4.083a.393.393 0 0 1-.11-.28.41.41 0 0 1 .11-.294l3.868-4.082a.366.366 0 0 1 .279-.115c.104 0 .195.04.272.121.076.08.114.176.114.287v2.45h16.636c.105 0 .196.04.272.12.077.082.115.177.115.288zm0-7.198a.41.41 0 0 1-.109.293l-3.869 4.083a.366.366 0 0 1-.278.114.363.363 0 0 1-.272-.12.403.403 0 0 1-.115-.288v-2.45H28.722a.363.363 0 0 1-.272-.12.403.403 0 0 1-.115-.288v-2.449c0-.11.038-.206.115-.287a.363.363 0 0 1 .272-.121h16.635v-2.45a.41.41 0 0 1 .11-.293.366.366 0 0 1 .277-.115c.097 0 .194.043.29.128l3.857 4.07a.41.41 0 0 1 .109.293z"/></defs><g fill="none" fill-rule="evenodd"><mask id="b" fill="#fff"><use xlink:href="#a"/></mask><g mask="url(#b)"><path fill="url(#c)" d="M0 0H70V70H0z"/><path fill="#FFF" fill-opacity=".383" d="M4 1h61c2.667 0 4.333.667 5 2V0H0v3c.667-1.333 2-2 4-2z"/><path fill="#393939" d="M32.073 69H4c-2 0-4-1-4-4V38.16l16.339-16.914L21 21l3.218 10.05 4.433-4.928h14.216l2.738-2.955 4.233 4.435-5.877 6.823c3.956-.137 5.915-.137 5.877 0-.013.046-.013 1.01 0 2.894L43.961 45H47l.709.999-3.337 3.855 2.886 2.366L32.073 69z" opacity=".324"/><path fill="#000" fill-opacity=".383" d="M4 69h61c2.667 0 4.333-1 5-3v4H0v-4c.667 2 2 3 4 3z"/><use fill="#000" fill-rule="nonzero" opacity=".3" xlink:href="#d"/><use fill="#FFF" fill-rule="nonzero" xlink:href="#e"/></g></g></svg> \ No newline at end of file
diff --git a/addons/website_sale_comparison/static/src/js/website_sale_comparison.js b/addons/website_sale_comparison/static/src/js/website_sale_comparison.js
new file mode 100644
index 00000000..8e8a4436
--- /dev/null
+++ b/addons/website_sale_comparison/static/src/js/website_sale_comparison.js
@@ -0,0 +1,294 @@
+odoo.define('website_sale_comparison.comparison', function (require) {
+'use strict';
+
+var concurrency = require('web.concurrency');
+var core = require('web.core');
+var publicWidget = require('web.public.widget');
+var utils = require('web.utils');
+var VariantMixin = require('sale.VariantMixin');
+var website_sale_utils = require('website_sale.utils');
+
+var qweb = core.qweb;
+var _t = core._t;
+
+// VariantMixin events are overridden on purpose here
+// to avoid registering them more than once since they are already registered
+// in website_sale.js
+var ProductComparison = publicWidget.Widget.extend(VariantMixin, {
+ xmlDependencies: ['/website_sale_comparison/static/src/xml/comparison.xml'],
+
+ template: 'product_comparison_template',
+ events: {
+ 'click .o_product_panel_header': '_onClickPanelHeader',
+ },
+
+ /**
+ * @constructor
+ */
+ init: function () {
+ this._super.apply(this, arguments);
+
+ this.product_data = {};
+ this.comparelist_product_ids = JSON.parse(utils.get_cookie('comparelist_product_ids') || '[]');
+ this.product_compare_limit = 4;
+ this.guard = new concurrency.Mutex();
+ },
+ /**
+ * @override
+ */
+ start: function () {
+ var self = this;
+
+ self._loadProducts(this.comparelist_product_ids).then(function () {
+ self._updateContent('hide');
+ });
+ self._updateComparelistView();
+
+ $('#comparelist .o_product_panel_header').popover({
+ trigger: 'manual',
+ animation: true,
+ html: true,
+ title: function () {
+ return _t("Compare Products");
+ },
+ container: '.o_product_feature_panel',
+ placement: 'top',
+ template: qweb.render('popover'),
+ content: function () {
+ return $('#comparelist .o_product_panel_content').html();
+ }
+ });
+ // We trigger a resize to launch the event that checks if this element hides
+ // a button when the page is loaded.
+ $(window).trigger('resize');
+
+ $(document.body).on('click.product_comparaison_widget', '.comparator-popover .o_comparelist_products .o_remove', function (ev) {
+ ev.preventDefault();
+ self._removeFromComparelist(ev);
+ });
+ $(document.body).on('click.product_comparaison_widget', '.o_comparelist_remove', function (ev) {
+ self._removeFromComparelist(ev);
+ self.guard.exec(function() {
+ var new_link = '/shop/compare/?products=' + self.comparelist_product_ids.toString();
+ window.location.href = _.isEmpty(self.comparelist_product_ids) ? '/shop' : new_link;
+ });
+ });
+
+ return this._super.apply(this, arguments);
+ },
+ /**
+ * @override
+ */
+ destroy: function () {
+ this._super.apply(this, arguments);
+ $(document.body).off('.product_comparaison_widget');
+ },
+
+ //--------------------------------------------------------------------------
+ // Public
+ //--------------------------------------------------------------------------
+
+ /**
+ * @param {jQuery} $elem
+ */
+ handleCompareAddition: function ($elem) {
+ var self = this;
+ if (this.comparelist_product_ids.length < this.product_compare_limit) {
+ var productId = $elem.data('product-product-id');
+ if ($elem.hasClass('o_add_compare_dyn')) {
+ productId = $elem.parent().find('.product_id').val();
+ if (!productId) { // case List View Variants
+ productId = $elem.parent().find('input:checked').first().val();
+ }
+ }
+
+ this.selectOrCreateProduct(
+ $elem.closest('form'),
+ productId,
+ $elem.closest('form').find('.product_template_id').val(),
+ false
+ ).then(function (productId) {
+ productId = parseInt(productId, 10) || parseInt($elem.data('product-product-id'), 10);
+ if (!productId) {
+ return;
+ }
+ self._addNewProducts(productId).then(function () {
+ website_sale_utils.animateClone(
+ $('#comparelist .o_product_panel_header'),
+ $elem.closest('form'),
+ -50,
+ 10
+ );
+ });
+ });
+ } else {
+ this.$('.o_comparelist_limit_warning').show();
+ $('#comparelist .o_product_panel_header').popover('show');
+ }
+ },
+
+ //--------------------------------------------------------------------------
+ // Private
+ //--------------------------------------------------------------------------
+
+ /**
+ * @private
+ */
+ _loadProducts: function (product_ids) {
+ var self = this;
+ return this._rpc({
+ route: '/shop/get_product_data',
+ params: {
+ product_ids: product_ids,
+ cookies: JSON.parse(utils.get_cookie('comparelist_product_ids') || '[]'),
+ },
+ }).then(function (data) {
+ self.comparelist_product_ids = JSON.parse(data.cookies);
+ delete data.cookies;
+ _.each(data, function (product) {
+ self.product_data[product.product.id] = product;
+ });
+ if (product_ids.length > Object.keys(data).length) {
+ /* If some products have been archived
+ they are not displayed but the count & cookie
+ need to be updated.
+ */
+ self._updateCookie();
+ }
+ });
+ },
+ /**
+ * @private
+ */
+ _togglePanel: function () {
+ $('#comparelist .o_product_panel_header').popover('toggle');
+ },
+ /**
+ * @private
+ */
+ _addNewProducts: function (product_id) {
+ return this.guard.exec(this._addNewProductsImpl.bind(this, product_id));
+ },
+ _addNewProductsImpl: function (product_id) {
+ var self = this;
+ $('.o_product_feature_panel').addClass('d-md-block');
+ if (!_.contains(self.comparelist_product_ids, product_id)) {
+ self.comparelist_product_ids.push(product_id);
+ if (_.has(self.product_data, product_id)){
+ self._updateContent();
+ } else {
+ return self._loadProducts([product_id]).then(function () {
+ self._updateContent();
+ self._updateCookie();
+ });
+ }
+ }
+ self._updateCookie();
+ },
+ /**
+ * @private
+ */
+ _updateContent: function (force) {
+ var self = this;
+ this.$('.o_comparelist_products .o_product_row').remove();
+ _.each(this.comparelist_product_ids, function (res) {
+ var $template = self.product_data[res].render;
+ self.$('.o_comparelist_products').append($template);
+ });
+ if (force !== 'hide' && (this.comparelist_product_ids.length > 1 || force === 'show')) {
+ $('#comparelist .o_product_panel_header').popover('show');
+ }
+ else {
+ $('#comparelist .o_product_panel_header').popover('hide');
+ }
+ },
+ /**
+ * @private
+ */
+ _removeFromComparelist: function (e) {
+ this.guard.exec(this._removeFromComparelistImpl.bind(this, e));
+ },
+ _removeFromComparelistImpl: function (e) {
+ var target = $(e.target.closest('.o_comparelist_remove, .o_remove'));
+ this.comparelist_product_ids = _.without(this.comparelist_product_ids, target.data('product_product_id'));
+ target.parents('.o_product_row').remove();
+ this._updateCookie();
+ $('.o_comparelist_limit_warning').hide();
+ this._updateContent('show');
+ },
+ /**
+ * @private
+ */
+ _updateCookie: function () {
+ document.cookie = 'comparelist_product_ids=' + JSON.stringify(this.comparelist_product_ids) + '; path=/';
+ this._updateComparelistView();
+ },
+ /**
+ * @private
+ */
+ _updateComparelistView: function () {
+ this.$('.o_product_circle').text(this.comparelist_product_ids.length);
+ this.$('.o_comparelist_button').removeClass('d-md-block');
+ if (_.isEmpty(this.comparelist_product_ids)) {
+ $('.o_product_feature_panel').removeClass('d-md-block');
+ } else {
+ $('.o_product_feature_panel').addClass('d-md-block');
+ this.$('.o_comparelist_products').addClass('d-md-block');
+ if (this.comparelist_product_ids.length >=2) {
+ this.$('.o_comparelist_button').addClass('d-md-block');
+ this.$('.o_comparelist_button a').attr('href', '/shop/compare/?products='+this.comparelist_product_ids.toString());
+ }
+ }
+ },
+
+ //--------------------------------------------------------------------------
+ // Handlers
+ //--------------------------------------------------------------------------
+
+ /**
+ * @private
+ */
+ _onClickPanelHeader: function () {
+ this._togglePanel();
+ },
+});
+
+publicWidget.registry.ProductComparison = publicWidget.Widget.extend({
+ selector: '.oe_website_sale',
+ events: {
+ 'click .o_add_compare, .o_add_compare_dyn': '_onClickAddCompare',
+ 'click #o_comparelist_table tr': '_onClickComparelistTr',
+ },
+
+ /**
+ * @override
+ */
+ start: function () {
+ var def = this._super.apply(this, arguments);
+ this.productComparison = new ProductComparison(this);
+ return Promise.all([def, this.productComparison.appendTo(this.$el)]);
+ },
+
+ //--------------------------------------------------------------------------
+ // Handlers
+ //--------------------------------------------------------------------------
+
+ /**
+ * @private
+ * @param {Event} ev
+ */
+ _onClickAddCompare: function (ev) {
+ this.productComparison.handleCompareAddition($(ev.currentTarget));
+ },
+ /**
+ * @private
+ * @param {Event} ev
+ */
+ _onClickComparelistTr: function (ev) {
+ var $target = $(ev.currentTarget);
+ $($target.data('target')).children().slideToggle(100);
+ $target.find('.fa-chevron-circle-down, .fa-chevron-circle-right').toggleClass('fa-chevron-circle-down fa-chevron-circle-right');
+ },
+});
+return ProductComparison;
+});
diff --git a/addons/website_sale_comparison/static/src/scss/website_sale_comparison.scss b/addons/website_sale_comparison/static/src/scss/website_sale_comparison.scss
new file mode 100644
index 00000000..204d9d1b
--- /dev/null
+++ b/addons/website_sale_comparison/static/src/scss/website_sale_comparison.scss
@@ -0,0 +1,65 @@
+.o_product_feature_panel {
+ position: fixed;
+ bottom: 0;
+ left: 50%;
+ transform: translateX(-50%);
+ z-index:10;
+ border-top-left-radius: 10px;
+ border-top-right-radius: 10px;
+ border-bottom: 0px;
+ padding: 10px 20px;
+ text-align: center;
+ border: 2px solid theme-color('primary');
+ border-bottom: 0px;
+ background-color: white;
+ opacity: 0.95;
+
+ .o_product_panel {
+ position: relative;
+ .o_product_panel_header {
+ margin: 0 10px 0 10px;
+ cursor: pointer;
+ .o_product_icon {
+ margin-right: 5px;
+ }
+ .o_product_text {
+ text-transform: uppercase;
+ vertical-align: middle;
+ font-size: 16px;
+ }
+ .o_product_circle {
+ vertical-align: 6px;
+ padding: 0 3px;
+ line-height: 14px;
+ }
+ }
+ .o_product_panel_content {
+ display: none !important;
+ }
+ }
+}
+
+.oe_website_sale {
+ .product_summary > *{
+ display: block;
+ margin: 15px 0 15px 0;
+ }
+ .table-comparator {
+ .o_product_comparison_collpase {
+ margin-right: 8px;
+ }
+ }
+
+ div.css_not_available .o_add_compare_dyn {
+ display: none;
+ }
+
+ .o_comparelist_remove {
+ @include o-position-absolute($top: 0, $right: 0.5rem);
+ }
+
+ .o_ws_compare_image {
+ vertical-align: middle;
+ }
+}
+
diff --git a/addons/website_sale_comparison/static/src/xml/comparison.xml b/addons/website_sale_comparison/static/src/xml/comparison.xml
new file mode 100644
index 00000000..47085955
--- /dev/null
+++ b/addons/website_sale_comparison/static/src/xml/comparison.xml
@@ -0,0 +1,35 @@
+<templates id="compare_products" xml:space="preserve">
+
+ <t t-name="product_comparison_template">
+ <div class="o_product_feature_panel d-none css_editable_mode_hidden o_bottom_fixed_element">
+ <span class="o_product_panel" id="comparelist">
+ <span class="o_product_panel_header">
+ <span class="o_product_icon"><i class="fa fa-exchange" role="img" aria-label="Product" title="Product"></i></span>
+ <span class="o_product_text">Compare</span>
+ <span class="o_product_circle o_animate_blink badge badge-primary">0</span>
+ </span>
+ <span class="o_product_panel_content">
+ <div class="o_comparelist_products">
+ <div class="o_comparelist_limit_warning" style="display:none">
+ <div class="o_shortlog alert alert-warning" role="alert">
+ <span><i class="fa fa-warning text-danger" role="img" aria-label="Warning" title="Warning"></i> You can compare max 4 products.</span>
+ </div>
+ </div>
+ </div>
+ <div class="o_comparelist_button" style='display:none'>
+ <a role="button" class="btn btn-primary btn-block" href="#"><i class="fa fa-exchange mr4"/>Compare</a>
+ </div>
+ </span>
+ </span>
+ </div>
+ </t>
+
+ <t t-name="popover">
+ <div style="width:600px;" class="popover comparator-popover" role="tooltip">
+ <div class="arrow"/>
+ <h3 class="popover-header"/>
+ <div class="popover-body"/>
+ </div>
+ </t>
+
+</templates>
diff --git a/addons/website_sale_comparison/static/tests/tours/website_sale_comparison.js b/addons/website_sale_comparison/static/tests/tours/website_sale_comparison.js
new file mode 100644
index 00000000..9e31b218
--- /dev/null
+++ b/addons/website_sale_comparison/static/tests/tours/website_sale_comparison.js
@@ -0,0 +1,242 @@
+odoo.define('website_sale_comparison.tour_comparison', function (require) {
+ 'use strict';
+
+ var tour = require('web_tour.tour');
+ var rpc = require('web.rpc');
+
+ tour.register('product_comparison', {
+ test: true,
+ url: "/shop",
+ }, [
+ // test from shop page
+ {
+ content: "add first product 'Three-Seat Sofa' in a comparison list",
+ trigger: '.oe_product_cart:contains("Three-Seat Sofa") .o_add_compare',
+ },
+ {
+ content: "check compare button contains one product",
+ trigger: '.o_product_circle:contains(1)',
+ run: function () {},
+ },
+ {
+ content: "check popover is closed when only one product",
+ trigger: 'body:not(:has(.comparator-popover))',
+ run: function () {},
+ },
+ {
+ content: "add second product 'Conference Chair' in a comparison list",
+ trigger: '.oe_product_cart:contains("Conference Chair") .o_add_compare',
+ },
+ {
+ content: "check popover is now open and compare button contains two products",
+ extra_trigger: '.comparator-popover',
+ trigger: ' .o_product_circle:contains(2)',
+ run: function () {},
+ },
+ {
+ content: "check products name are correct in the comparelist",
+ extra_trigger: '.o_product_row:contains("Three-Seat Sofa")',
+ trigger: '.o_product_row:contains("Conference Chair")',
+ run: function () {},
+ },
+ // test form product page
+ {
+ content: "go to product page of customizable desk(with variants)",
+ trigger: '.oe_product_cart a:contains("Customizable Desk")',
+ },
+ {
+ content: "check compare button is still there and contains 2 products",
+ extra_trigger: '#product_details',
+ trigger: '.o_product_circle:contains(2)',
+ run: function () {},
+ },
+ {
+ content: "check popover is closed after changing page",
+ trigger: 'body:not(:has(.comparator-popover))',
+ run: function () {},
+ },
+ {
+ content: "add first variant to comparelist",
+ trigger: '.o_add_compare_dyn',
+ },
+ {
+ content: "check the comparelist is now open and contains 3rd product with correct variant",
+ extra_trigger: '.comparator-popover',
+ trigger: '.o_product_row:contains("Customizable Desk (CONFIG) (Steel, White)")',
+ run: function () {},
+ },
+ {
+ content: "select 2nd variant(Black Color)",
+ trigger: '.variant_attribute[data-attribute_name="Color"] input[data-value_name="Black"]',
+ run: function (actions) {
+ $('img[class*="product_detail_img"]').attr('data-image-to-change', 1);
+ actions.click();
+ },
+ },
+ {
+ content: "click on compare button to add in comparison list when variant changed",
+ extra_trigger: 'img[class*="product_detail_img"]:not([data-image-to-change])',
+ trigger: '.o_add_compare_dyn',
+ },
+ {
+ content: "comparelist contains 4th product with correct variant",
+ extra_trigger: '.o_product_circle:contains(4)',
+ trigger: '.o_product_row:contains("Customizable Desk (CONFIG) (Steel, Black)")',
+ run: function () {},
+ },
+ {
+ content: "check limit is not reached",
+ trigger: ':not(.o_comparelist_limit_warning)',
+ run: function () {},
+ },
+ {
+ content: "select 3nd variant(Custom)",
+ trigger: '.variant_attribute[data-attribute_name="Legs"] input[data-value_name="Custom"]',
+ },
+ {
+ content: "click on compare button to add in comparison list when variant changed",
+ extra_trigger: 'body:not(:has(.carousel-indicators))', // there is 1 image on the custom variant
+ trigger: '.o_add_compare_dyn',
+ },
+ {
+ content: "check limit is reached",
+ trigger: '.o_comparelist_limit_warning',
+ run: function () {},
+ },
+ {
+ content: "click on compare button",
+ trigger: '.o_comparelist_button a',
+ },
+ // test on compare page
+ {
+ content: "check 1st product contains correct variant",
+ trigger: '.o_product_comparison_table:contains("Conference Chair (CONFIG) (Steel)")',
+ run: function () {},
+ },
+ {
+ content: "check 2nd product contains correct variant",
+ trigger: '.o_product_comparison_table:contains("Customizable Desk (CONFIG) (Steel, White)")',
+ run: function () {},
+ },
+ {
+ content: "check 3rd product is correctly added",
+ trigger: '.o_product_comparison_table:contains("Customizable Desk (CONFIG) (Steel, Black)")',
+ run: function () {},
+ },
+ {
+ content: "check 4th product is correctly added",
+ trigger: '.o_product_comparison_table:contains("Three-Seat Sofa")',
+ run: function () {},
+ },
+ {
+ content: "remove Customizable Desk (CONFIG) (Steel, Black) from compare table",
+ trigger: '#o_comparelist_table .o_comparelist_remove:eq(2)',
+ },
+ {
+ content: "check customizable table with black variant is removed",
+ trigger: '#o_comparelist_table:not(:contains("Customizable Desk (CONFIG) (Steel, Black)"))',
+ run: function () {},
+ },
+ {
+ content: "open compare menu",
+ extra_trigger: 'body:has(.o_product_row:contains("Three-Seat Sofa") .o_remove)',
+ trigger: '.o_product_panel_header',
+ },
+ {
+ content: "remove product",
+ trigger: '.o_product_row:contains("Three-Seat Sofa") .o_remove',
+ },
+ {
+ content: "click on compare button to reload",
+ trigger: '.o_comparelist_button a',
+ },
+ {
+ content: "check product 'Three-Seat Sofa' is removed",
+ trigger: '#o_comparelist_table:not(:contains("Three-Seat Sofa"))',
+ run: function () {},
+ },
+ {
+ content: "add product 'Conference Chair' to cart",
+ trigger: '.product_summary:contains("Conference Chair") .a-submit:contains("Add to Cart")',
+ },
+ {
+ content: "check product correctly added to cart",
+ trigger: '#cart_products:contains("Conference Chair") .js_quantity[value="1"]',
+ run: function () {},
+ },
+ // test advanced configuration and alternative product
+ {
+ content: "create product with newly created attribute and its values and set alternative product",
+ trigger: 'body',
+ run: function () {
+ rpc.query({
+ model: 'product.attribute',
+ method: 'create',
+ args: [{
+ 'name': 'color',
+ 'display_type': 'color',
+ 'create_variant': 'dynamic',
+ }],
+ }).then(function (attributeId) {
+ rpc.query({
+ model: 'product.template',
+ method: 'create',
+ args: [{
+ 'name': 'Basic Chair',
+ 'is_published': true,
+ 'attribute_line_ids': [[0, 0, {
+ 'attribute_id': attributeId,
+ 'value_ids': [
+ [0, 0, {'name': 'red', 'attribute_id': attributeId, 'sequence': 1}],
+ [0, 0, {'name': 'blue', 'attribute_id': attributeId, 'sequence': 2}],
+ ],
+ }]],
+ }],
+ }).then(function (productId) {
+ rpc.query({
+ model: 'product.template',
+ method: 'create',
+ args: [{
+ 'name': 'Classic Chair',
+ 'is_published': true,
+ 'attribute_line_ids': [[0, 0, {
+ 'attribute_id': attributeId,
+ 'value_ids': [
+ [0, 0, {'name': 'green', 'attribute_id': attributeId, 'sequence': 3}],
+ [0, 0, {'name': 'yellow', 'attribute_id': attributeId, 'sequence': 4}],
+ ],
+ }]],
+ 'alternative_product_ids': [[6, 0, [productId]]],
+ }],
+ }).then(function () {
+ window.location.href = '/shop?search=Classic Chair';
+ });
+ });
+ });
+ },
+ },
+ {
+ content: "click on product",
+ trigger: '.oe_product_cart a:contains("Classic Chair")',
+ },
+ {
+ content: "click on compare button",
+ trigger: '.btn.btn-primary:not(.btn-block):contains("Compare")',
+ },
+ {
+ content: "check product 'Classic Chair' with first variant (green) is on compare page",
+ trigger: '.o_product_comparison_table:contains("Classic Chair (green)")',
+ run: function () {},
+ },
+ {
+ content: "check alternative product 'Basic Chair' with first variant (red) is on compare page",
+ trigger: '.o_product_comparison_table:contains("Basic Chair (red)")',
+ run: function () {},
+ },
+ {
+ content: "check there is the correct attribute",
+ trigger: '.o_ws_category_0:contains("color"):contains("red")',
+ run: function () {},
+ },
+ ]);
+});