Skip to content

Commit 2d20e31

Browse files
committed
ACP2E-3286: Related products SelectAll/Unselect All Issue
1 parent 1819fe7 commit 2d20e31

File tree

2 files changed

+74
-6
lines changed

2 files changed

+74
-6
lines changed

app/code/Magento/Catalog/view/frontend/web/js/related-products.js

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -47,14 +47,15 @@ define([
4747
* @return {Boolean} - Prevent default event action and event propagation.
4848
*/
4949
_selectAllRelated: function (e) {
50-
var innerHTML = this.options.relatedProductsCheckFlag ?
51-
this.options.selectAllMessage : this.options.unselectAllMessage;
50+
var self = this,
51+
innerHTML = this.options.relatedProductsCheckFlag ?
52+
this.options.selectAllMessage : this.options.unselectAllMessage;
5253

5354
$(e.target).html(innerHTML);
54-
$(this.options.relatedCheckbox + ':visible').attr(
55-
'checked',
56-
this.options.relatedProductsCheckFlag = !this.options.relatedProductsCheckFlag
57-
);
55+
56+
this.options.relatedProductsCheckFlag = !this.options.relatedProductsCheckFlag;
57+
$(this.options.relatedCheckbox + ':visible').each(function () {
58+
$(this).prop('checked', self.options.relatedProductsCheckFlag); });
5859
this._addRelatedToProduct();
5960

6061
return false;
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
/**
2+
* Copyright 2024 Adobe
3+
* All Rights Reserved.
4+
*/
5+
define([
6+
'jquery',
7+
'Magento_Catalog/js/related-products',
8+
'jquery-ui-modules/widget'
9+
], function ($) {
10+
'use strict';
11+
12+
describe('Related Products Widget', function () {
13+
var widgetElement,
14+
selectAllLinkSelector = '[data-role="select-all"]',
15+
relatedCheckboxSelector = '.related-checkbox';
16+
17+
beforeEach(function () {
18+
// Create elements and initialize widget manually
19+
widgetElement = $('<div>')
20+
.append('<a href="#" data-role="select-all">select all</a>')
21+
.append('<input type="checkbox" class="related-checkbox" value="1">')
22+
.append('<input type="checkbox" class="related-checkbox" value="2">')
23+
.append('<input type="hidden" id="related-products-field">')
24+
.appendTo('body');
25+
26+
// Initialize the widget
27+
widgetElement.relatedProducts();
28+
});
29+
30+
afterEach(function () {
31+
widgetElement.remove();
32+
});
33+
34+
it('should select all related products when "Select All" is clicked', function () {
35+
$(selectAllLinkSelector).trigger('click');
36+
37+
// Verify all checkboxes are checked
38+
expect($(relatedCheckboxSelector + ':checked').length).toBe(2);
39+
});
40+
41+
it('should unselect all related products when "Unselect All" is clicked', function () {
42+
$(selectAllLinkSelector).trigger('click');
43+
$(selectAllLinkSelector).trigger('click');
44+
45+
// Verify all checkboxes are unchecked
46+
expect($(relatedCheckboxSelector + ':checked').length).toBe(0);
47+
});
48+
49+
it('should select all except manually selected product when "Select All" is clicked after manual selection',
50+
function () {
51+
$(relatedCheckboxSelector).first().prop('checked', true).trigger('click');
52+
$(selectAllLinkSelector).trigger('click');
53+
54+
// Verify all products are selected, including the manually selected one
55+
expect($(relatedCheckboxSelector + ':checked').length).toBe(2);
56+
});
57+
58+
it('should unselect all products when "Unselect All" is clicked after manual selection', function () {
59+
$(relatedCheckboxSelector).first().prop('checked', true).trigger('click');
60+
$(selectAllLinkSelector).trigger('click');
61+
$(selectAllLinkSelector).trigger('click');
62+
63+
// Verify all checkboxes are unchecked
64+
expect($(relatedCheckboxSelector + ':checked').length).toBe(0);
65+
});
66+
});
67+
});

0 commit comments

Comments
 (0)