Skip to content

Commit 842e0e1

Browse files
committed
PB-266: Video background for Slide
1 parent 1d338fd commit 842e0e1

File tree

2 files changed

+113
-84
lines changed
  • app/code/Magento/PageBuilder/view/adminhtml/web

2 files changed

+113
-84
lines changed

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

Lines changed: 56 additions & 50 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: 57 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,12 @@ import $ from "jquery";
99
import ko from "knockout";
1010
import $t from "mage/translate";
1111
import events from "Magento_PageBuilder/js/events";
12+
import mageUtils from "mageUtils";
1213
import _ from "underscore";
1314
import "vimeoWrapper";
1415
import {PreviewSortableSortUpdateEventParams} from "../../binding/sortable-children.types";
15-
import ContentTypeConfigInterface from "../../content-type-config.types";
1616
import ConditionalRemoveOption from "../../content-type-menu/conditional-remove-option";
1717
import {OptionsInterface} from "../../content-type-menu/option.types";
18-
import ContentTypeInterface from "../../content-type.types";
1918
import {DataObject} from "../../data-store";
2019
import Uploader from "../../uploader";
2120
import delayUntil from "../../utils/delay-until";
@@ -31,7 +30,6 @@ import nestingLinkDialog from "../../utils/nesting-link-dialog";
3130
import WysiwygFactory from "../../wysiwyg/factory";
3231
import WysiwygInterface from "../../wysiwyg/wysiwyg-interface";
3332
import {ContentTypeMountEventParamsInterface, ContentTypeReadyEventParamsInterface} from "../content-type-events.types";
34-
import ObservableUpdater from "../observable-updater";
3533
import BasePreview from "../preview";
3634
import SliderPreview from "../slider/preview";
3735

@@ -81,6 +79,18 @@ export default class Preview extends BasePreview {
8179
*/
8280
private handledDoubleClick: boolean = false;
8381

82+
/**
83+
* Properties change that should cause rebuilding video background
84+
*/
85+
private videoUpdateProperties = [
86+
"background_type",
87+
"video_fallback_image",
88+
"video_lazy_load",
89+
"video_loop",
90+
"video_play_only_visible",
91+
"video_source",
92+
];
93+
8494
/**
8595
* Debounce and defer the init of Jarallax
8696
*
@@ -112,7 +122,7 @@ export default class Preview extends BasePreview {
112122
const viewportElement = $("<div class=\"jarallax-viewport-element\"></div>") as JQuery;
113123

114124
$(this.wrapper).append(
115-
$('.jarallax-viewport-element', this.wrapper).length ? '' : viewportElement
125+
$(".jarallax-viewport-element", this.wrapper).length ? "" : viewportElement,
116126
);
117127

118128
jarallax(
@@ -123,34 +133,14 @@ export default class Preview extends BasePreview {
123133
videoLoop: (this.contentType.dataStore.get("video_loop") as string) === "true",
124134
speed: 1,
125135
videoPlayOnlyVisible: (this.contentType.dataStore.get("video_play_only_visible") as string) === "true",
126-
elementInViewport: $('.jarallax-viewport-element', this.wrapper)
136+
elementInViewport: $(".jarallax-viewport-element", this.wrapper),
127137
},
128138
);
129139
});
130140
}
131141

132142
}, 50);
133143

134-
/**
135-
* @param {ContentTypeInterface} contentType
136-
* @param {ContentTypeConfigInterface} config
137-
* @param {ObservableUpdater} observableUpdater
138-
*/
139-
constructor(
140-
contentType: ContentTypeInterface,
141-
config: ContentTypeConfigInterface,
142-
observableUpdater: ObservableUpdater,
143-
) {
144-
super(contentType, config, observableUpdater);
145-
146-
this.contentType.dataStore.subscribe(this.buildJarallax);
147-
events.on("slide:mountAfter", (args: ContentTypeReadyEventParamsInterface) => {
148-
if (args.id === this.contentType.id) {
149-
this.buildJarallax();
150-
}
151-
});
152-
}
153-
154144
/**
155145
* @param {HTMLElement} element
156146
*/
@@ -475,6 +465,12 @@ export default class Preview extends BasePreview {
475465
protected bindEvents() {
476466
super.bindEvents();
477467

468+
events.on("slide:mountAfter", (args: ContentTypeReadyEventParamsInterface) => {
469+
if (args.id === this.contentType.id) {
470+
this.buildJarallax();
471+
}
472+
});
473+
478474
events.on(`${this.config.name}:${this.contentType.id}:updateAfter`, () => {
479475
const dataStore = this.contentType.dataStore.getState();
480476
const imageObject = (dataStore[this.config.additional_data.uploaderConfig.dataScope] as object[])[0] || {};
@@ -508,23 +504,29 @@ export default class Preview extends BasePreview {
508504
$((slider.preview as SliderPreview).element).on("beforeChange", () => {
509505
this.slideChanged = false;
510506
});
511-
$((slider.preview as SliderPreview).element).on("afterChange", (event, slider) => {
512-
$(slider.$slides).each((index, slide) => {
513-
const videoSlide = slide.querySelector('.jarallax');
507+
$((slider.preview as SliderPreview).element).on("afterChange", (event, slick) => {
508+
$(slick.$slides).each((index, slide) => {
509+
const videoSlide = slide.querySelector(".jarallax");
514510
if (videoSlide) {
515-
jarallax(videoSlide, 'onScroll');
511+
jarallax(videoSlide, "onScroll");
516512
}
517513
});
518514
this.slideChanged = true;
519515
});
520516
}
521517
});
522518

523-
this.contentType.dataStore.subscribe(
524-
(data: DataObject) => {
525-
this.slideName(data.slide_name);
526-
},
527-
);
519+
this.contentType.dataStore.subscribe(function(data: DataObject) {
520+
this.slideName(data.slide_name);
521+
522+
if (this.isVideoShouldBeUpdated(data)) {
523+
this.buildJarallax();
524+
}
525+
}.bind(this));
526+
527+
events.on(`image:${this.contentType.id}:uploadAfter`, () => {
528+
this.contentType.dataStore.set("background_type", "image");
529+
});
528530
}
529531

530532
/**
@@ -554,4 +556,25 @@ export default class Preview extends BasePreview {
554556

555557
$(this.textarea).height(scrollHeight);
556558
}
559+
560+
/**
561+
* Check if video background should be rebuilt
562+
*
563+
* @return boolean
564+
*/
565+
private isVideoShouldBeUpdated(state: DataObject): boolean {
566+
const previousState = this.contentType.dataStore.previousState;
567+
const diff = mageUtils.compare(previousState, state).changes;
568+
569+
if (diff.length > 0) {
570+
return _.some(diff, (element) => {
571+
if (element.name === "video_fallback_image") {
572+
return (!_.isEmpty(previousState.video_fallback_image) && previousState.video_fallback_image) !==
573+
(!_.isEmpty(state.video_fallback_image) && state.video_fallback_image);
574+
}
575+
576+
return this.videoUpdateProperties.indexOf(element.name) !== -1;
577+
});
578+
}
579+
}
557580
}

0 commit comments

Comments
 (0)