[FIX] website: prevent carousel indicators errors

In this commit [1] (merged in 16.0) a bugfix has been made in the
`removeSlide` function but this one should have been applied on all
supported versions because the bug it fixes is present on all versions.
The bug it fixes is the following:
- Drop a carousel block on a page
- Remove the *first* slide

=> There is no active indicator.

Moreover, the bugfix made in 16.0 [1] introduces another error: when a
slide is removed from the carousel the indicators are not in a correct
state anymore.

Following the same steps with the changes of [1]:
- Drop a carousel block on a page
- Remove a slide

=> Indicators are no longer consistent with the slides so tracebacks
appear during the carousel slides. The list of indicators must have on
each element a `data-slide-to` attribute which must reflect the
position of the slide (starting with 0).

So this commit is to backport the fix from 16.0 [1] to 14.0 and to fix
the new bug that [1] introduces.

[1]: https://github.com/odoo/odoo/commit/f7055d3dbabfbe471f490bd65c2032f5251f3f37

task-3040931
opw-3051615

closes odoo/odoo#106639

X-original-commit: 212e8ce620f6eb95aeff6426e06cb29b2c06d0c1
Signed-off-by: Quentin Smetz (qsm) <qsm@odoo.com>
This commit is contained in:
Guillaume (gdi)
2022-11-26 14:02:14 +01:00
committed by qsm-odoo
parent 67a383a13d
commit 63c66dbf5c
@@ -1823,9 +1823,17 @@ options.registry.CarouselItem = options.Class.extend({
const $items = this.$carousel.find('.carousel-item');
const newLength = $items.length - 1;
if (!this.removing && newLength > 0) {
// The active indicator is deleted to ensure that the other
// indicators will still work after the deletion.
const $toDelete = $items.filter('.active').add(this.$indicators.find('.active'));
this.$carousel.one('active_slide_targeted.carousel_item_option', () => {
$toDelete.remove();
// To ensure the proper functioning of the indicators, their
// attributes must reflect the position of the slides.
const indicatorsEls = this.$indicators[0].querySelectorAll('li');
for (let i = 0; i < indicatorsEls.length; i++) {
indicatorsEls[i].setAttribute('data-bs-slide-to', i);
}
this.$controls.toggleClass('d-none', newLength === 1);
this.$carousel.trigger('content_changed');
this.removing = false;