Skip to content

Commit 855513e

Browse files
committed
PB-375: Align video background with embedded video
- add autoplay and support video files
1 parent 3c58e51 commit 855513e

File tree

12 files changed

+121
-10
lines changed

12 files changed

+121
-10
lines changed

app/code/Magento/PageBuilder/view/adminhtml/pagebuilder/content_type/video.xml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
label="Video"
1111
component="Magento_PageBuilder/js/content-type"
1212
preview_component="Magento_PageBuilder/js/content-type/video/preview"
13+
master_component="Magento_PageBuilder/js/content-type/video/master"
1314
form="pagebuilder_video_form"
1415
menu_section="media"
1516
icon="icon-pagebuilder-video"
@@ -42,7 +43,8 @@
4243
<style name="padding" storage_key="margins_and_padding" reader="Magento_PageBuilder/js/property/paddings" converter="Magento_PageBuilder/js/converter/style/paddings"/>
4344
</element>
4445
<element name="video">
45-
<attribute name="video_source" source="src" converter="Magento_PageBuilder/js/content-type/video/converter/attribute/src" preview_converter="Magento_PageBuilder/js/content-type/video/converter/attribute/src"/>
46+
<attribute name="video_source" source="src" converter="Magento_PageBuilder/js/content-type/video/converter/attribute/videosrc" preview_converter="Magento_PageBuilder/js/content-type/video/converter/attribute/videosrc"/>
47+
<attribute name="autoplay" source="autoplay"/>
4648
</element>
4749
</elements>
4850
</appearance>

app/code/Magento/PageBuilder/view/adminhtml/ui_component/pagebuilder_video_form.xml

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,11 +77,13 @@
7777
<field name="video_source" formElement="input">
7878
<settings>
7979
<validation>
80-
<rule name="validate-video-url" xsi:type="boolean">true</rule>
80+
<rule name="validate-video-source" xsi:type="boolean">true</rule>
8181
</validation>
8282
<dataType>text</dataType>
8383
<label translate="true">Video URL</label>
84-
<notice translate="true">YouTube and Vimeo supported</notice>
84+
<tooltip>
85+
<description translate="true">Video URLs can be links to videos on YouTube or Vimeo, or HTTP(S) links to files with valid video extensions (we recommend .mp4)</description>
86+
</tooltip>
8587
</settings>
8688
</field>
8789
<field name="max_width" formElement="input">
@@ -94,5 +96,28 @@
9496
</additionalClasses>
9597
</settings>
9698
</field>
99+
<field name="autoplay" sortOrder="110" formElement="checkbox">
100+
<argument name="data" xsi:type="array">
101+
<item name="config" xsi:type="array">
102+
<item name="default" xsi:type="string">false</item>
103+
</item>
104+
</argument>
105+
<settings>
106+
<dataType>boolean</dataType>
107+
<label translate="true">Autoplay</label>
108+
<dataScope>autoplay</dataScope>
109+
</settings>
110+
<formElements>
111+
<checkbox>
112+
<settings>
113+
<valueMap>
114+
<map name="false" xsi:type="string">false</map>
115+
<map name="true" xsi:type="string">true</map>
116+
</valueMap>
117+
<prefer>toggle</prefer>
118+
</settings>
119+
</checkbox>
120+
</formElements>
121+
</field>
97122
</fieldset>
98123
</form>

app/code/Magento/PageBuilder/view/adminhtml/web/css/source/content-type/video/_default.less

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
}
3939

4040
iframe,
41+
video,
4142
.pagebuilder-video-placeholder {
4243
height: 100%;
4344
left: 0;

app/code/Magento/PageBuilder/view/adminhtml/web/js/content-type/video/converter/attribute/src.js

Lines changed: 2 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/video/preview.js

Lines changed: 6 additions & 0 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/template/content-type/video/default/master.html

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@
99
<div class="pagebuilder-video-inner" attr="data.inner.attributes" ko-style="data.inner.style" css="data.inner.css">
1010
<div class="pagebuilder-video-wrapper" attr="data.wrapper.attributes" ko-style="Object.assign(data.wrapper.style(), {backgroundColor: data.wrapper.style().borderColor})" css="data.wrapper.css">
1111
<div class="pagebuilder-video-container" if="data.video.attributes().src">
12-
<iframe frameborder="0" allowfullscreen attr="data.video.attributes"/>
12+
<iframe frameborder="0" allowfullscreen attr="data.video.attributes" if="isHosted(data.video.attributes().src)"/>
13+
<video frameborder="0" controls data-bind="attr: { 'autoplay': data.video.attributes().autoplay ==='true' ? 'true' : null, 'src': data.video.attributes().src }" ifnot="isHosted(data.video.attributes().src)"/>
1314
</div>
1415
</div>
1516
</div>

app/code/Magento/PageBuilder/view/adminhtml/web/template/content-type/video/default/preview.html

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@
1010
<div class="pagebuilder-video-inner" attr="data.inner.attributes" ko-style="data.inner.style" css="data.inner.css">
1111
<div class="pagebuilder-video-wrapper" attr="data.wrapper.attributes" ko-style="Object.assign(data.wrapper.style(), {backgroundColor: data.wrapper.style().borderColor})" css="data.wrapper.css">
1212
<div class="pagebuilder-video-container">
13-
<iframe frameborder="0" allowfullscreen attr="data.video.attributes"/>
13+
<iframe frameborder="0" allowfullscreen attr="data.video.attributes" if="isHosted(data.video.attributes().src)"/>
14+
<video frameborder="0" controls data-bind="attr: { 'autoplay': data.video.attributes().autoplay ==='true' ? 'true' : null, 'src': data.video.attributes().src }" ifnot="isHosted(data.video.attributes().src)"/>
1415
<i class="icon-pagebuilder-video pagebuilder-video-placeholder" ifnot="data.video.attributes().src"/>
1516
</div>
1617
</div>

app/code/Magento/PageBuilder/view/adminhtml/web/ts/js/content-type/video/converter/attribute/src.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,9 +43,9 @@ export default class Src implements ConverterInterface {
4343
const fileRegExp = new RegExp("^(?:https:|http:)?\\/\\/.*[\\\\\\/].+\\.(webm|mp4|ogv)(?!\w)");
4444

4545
if (youtubeRegExp.test(value)) {
46-
return "https://www.youtube.com/embed/" + youtubeRegExp.exec(value)[1];
46+
return "https://www.youtube.com/embed/" + youtubeRegExp.exec(value)[1] + (data.autoplay === "true" ? "?autoplay=1" : "");
4747
} else if (vimeoRegExp.test(value)) {
48-
return "https://player.vimeo.com/video/" + vimeoRegExp.exec(value)[3] + "?title=0&byline=0&portrait=0";
48+
return "https://player.vimeo.com/video/" + vimeoRegExp.exec(value)[3] + "?title=0&byline=0&portrait=0" + (data.autoplay === "true" ? "&autoplay=1" : "");
4949
} else if (fileRegExp.test(value)) {
5050
const result = fileRegExp.exec(value);
5151
return result[1] + ":" + value;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
/**
2+
* Copyright © Magento, Inc. All rights reserved.
3+
* See COPYING.txt for license details.
4+
*/
5+
6+
import ConverterInterface from "../../../../converter/converter-interface";
7+
import {DataObject} from "../../../../data-store";
8+
import {get} from "../../../../utils/object";
9+
10+
export default class VideoSrc implements ConverterInterface {
11+
/**
12+
* Convert value to internal format
13+
*
14+
* @param value string
15+
* @returns {string | object}
16+
*/
17+
public fromDom(value: string): string | object {
18+
return value;
19+
}
20+
21+
/**
22+
* Convert value to knockout format
23+
*
24+
* @param name string
25+
* @param data Object
26+
* @returns {string}
27+
*/
28+
public toDom(name: string, data: DataObject): string {
29+
const value = get<string>(data, name);
30+
if (value === undefined) {
31+
return "";
32+
}
33+
34+
const youtubeRegExp = new RegExp("^(?:https?:\/\/|\/\/)?(?:www\\.|m\\.)?" +
35+
"(?:youtu\\.be\/|youtube\\.com\/(?:embed\/|v\/|watch\\?v=|watch\\?.+&v=))([\\w-]{11})(?![\\w-])");
36+
const vimeoRegExp = new RegExp("https?:\/\/(?:www\\.|player\\.)?vimeo.com\/(?:channels\/" +
37+
"(?:\\w+\/)?|groups\/([^\/]*)\/videos\/|album\/(\\d+)\/video\/|video\/|)(\\d+)(?:$|\/|\\?)");
38+
39+
if (youtubeRegExp.test(value)) {
40+
return "https://www.youtube.com/embed/" + youtubeRegExp.exec(value)[1] + (data.autoplay === "true" ? "?autoplay=1" : "");
41+
} else if (vimeoRegExp.test(value)) {
42+
return "https://player.vimeo.com/video/" + vimeoRegExp.exec(value)[3] + "?title=0&byline=0&portrait=0" + (data.autoplay === "true" ? "&autoplay=1" : "");
43+
}
44+
45+
return value;
46+
}
47+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
/**
2+
* Copyright © Magento, Inc. All rights reserved.
3+
* See COPYING.txt for license details.
4+
*/
5+
6+
import BaseMaster from "../master";
7+
8+
export default class Master extends BaseMaster {
9+
10+
public isHosted(src: string): boolean {
11+
const youtubeRegExp = new RegExp("^(?:https?:\/\/|\/\/)?(?:www\\.|m\\.)?" +
12+
"(?:youtu\\.be\/|youtube\\.com\/(?:embed\/|v\/|watch\\?v=|watch\\?.+&v=))([\\w-]{11})(?![\\w-])");
13+
const vimeoRegExp = new RegExp("https?:\/\/(?:www\\.|player\\.)?vimeo.com\/(?:channels\/" +
14+
"(?:\\w+\/)?|groups\/([^\/]*)\/videos\/|album\/(\\d+)\/video\/|video\/|)(\\d+)(?:$|\/|\\?)");
15+
return (vimeoRegExp.test(src) || youtubeRegExp.test(src));
16+
}
17+
18+
}

0 commit comments

Comments
 (0)