Skip to content

Commit 306c40a

Browse files
author
Hwashiang Yu
committed
MC-4156: Slider with autoplay cannot be inline edited
- Added interaction prevention to slider while slide is changing - Resolved issue when auto play is enabled and user clicks slide mid switching
1 parent 1760bd0 commit 306c40a

File tree

4 files changed

+87
-47
lines changed

4 files changed

+87
-47
lines changed

app/code/Magento/PageBuilder/view/adminhtml/web/js/content-type/slide/preview.js

Lines changed: 6 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

app/code/Magento/PageBuilder/view/adminhtml/web/js/content-type/slide/wysiwyg/tinymce4/component-initializer.js

Lines changed: 38 additions & 26 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

app/code/Magento/PageBuilder/view/adminhtml/web/ts/js/content-type/slide/preview.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -159,15 +159,18 @@ export default class Preview extends BasePreview {
159159
element.focus();
160160
};
161161

162+
if (!this.slideChanged) {
163+
event.preventDefault();
164+
return false;
165+
}
162166
if (!this.wysiwyg) {
163-
const selection = this.saveSelection();
164167
this.element.removeAttribute("contenteditable");
165168
_.defer(() => {
166169
this.initWysiwyg(true)
167170
.then(() => delayUntil(
168171
() => {
169172
activate();
170-
this.restoreSelection(this.element, selection);
173+
this.restoreSelection(this.element, this.saveSelection());
171174
},
172175
() => this.element.classList.contains("mce-edit-focus"),
173176
10,

app/code/Magento/PageBuilder/view/adminhtml/web/ts/js/content-type/slide/wysiwyg/tinymce4/component-initializer.ts

Lines changed: 38 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import $ from "jquery";
77
import WysiwygEvents from "mage/adminhtml/wysiwyg/events";
88
import {AdditionalDataConfigInterface} from "../../../../content-type-config";
9+
import delayUntil from "../../../../utils/delay-until";
910
import WysiwygComponentInitializerInterface from "../../../wysiwyg/component-initializer-interface";
1011
import WysiwygInterface from "../../../wysiwyg/wysiwyg-interface";
1112

@@ -55,6 +56,11 @@ export default class ComponentInitializer implements WysiwygComponentInitializer
5556
*/
5657
private fade: boolean;
5758

59+
/**
60+
* Slider changing flag
61+
*/
62+
private slideChanging: boolean = false;
63+
5864
/**
5965
* Initialize the instance
6066
*
@@ -67,6 +73,15 @@ export default class ComponentInitializer implements WysiwygComponentInitializer
6773

6874
tinymce.eventBus.attachEventHandler(WysiwygEvents.afterFocus, this.onFocus.bind(this));
6975
tinymce.eventBus.attachEventHandler(WysiwygEvents.afterBlur, this.onBlur.bind(this));
76+
// Update our KO pointer to the active slide on change
77+
$(this.$element.parents(this.sliderSelector)).parent().on(
78+
"beforeChange",
79+
() => {
80+
this.slideChanging = true;
81+
},
82+
).on("afterChange", () => {
83+
this.slideChanging = false;
84+
});
7085
}
7186

7287
/**
@@ -79,23 +94,29 @@ export default class ComponentInitializer implements WysiwygComponentInitializer
7994
const sliderContent = this.$element.parents(this.sliderContentSelector)[0];
8095
const $notActiveSlides = $slider.find(this.slideSelector).not(this.activeSlideSelector);
8196

82-
$.each(this.config.adapter_config.parentSelectorsToUnderlay, (i, selector) => {
83-
this.$element.closest(selector as string).css("z-index", 100);
84-
});
85-
86-
// Disable slider keyboard events and fix problem with overflow hidden issue
87-
$slider.parent().slick("slickSetOption", "accessibility", false);
88-
this.autoplay = $slider.parent().slick("slickGetOption", "autoplay") as boolean;
89-
this.fade = $slider.parent().slick("slickGetOption", "fade") as boolean;
90-
if (this.autoplay) {
91-
$slider.parent().slick("slickPause");
92-
}
93-
if (!this.fade) {
94-
$notActiveSlides.css("display", "none");
95-
}
96-
this.sliderTransform = sliderContent.style.transform;
97-
sliderContent.style.transform = "";
98-
$slider.css("overflow", "visible");
97+
delayUntil(
98+
() => {
99+
$.each(this.config.adapter_config.parentSelectorsToUnderlay, (i, selector) => {
100+
this.$element.closest(selector as string).css("z-index", 100);
101+
});
102+
103+
// Disable slider keyboard events and fix problem with overflow hidden issue
104+
$slider.parent().slick("slickSetOption", "accessibility", false);
105+
this.autoplay = $slider.parent().slick("slickGetOption", "autoplay") as boolean;
106+
this.fade = $slider.parent().slick("slickGetOption", "fade") as boolean;
107+
if (this.autoplay) {
108+
$slider.parent().slick("slickPause");
109+
}
110+
if (!this.fade) {
111+
$notActiveSlides.css("display", "none");
112+
}
113+
this.sliderTransform = sliderContent.style.transform;
114+
sliderContent.style.transform = "";
115+
$slider.css("overflow", "visible");
116+
},
117+
() => !this.slideChanging,
118+
10,
119+
);
99120
}
100121

101122
/**

0 commit comments

Comments
 (0)