sense-media-box
Version:
Include web pages, videos, images and much more into your Qlik Sense app.
390 lines (368 loc) • 9.9 kB
JavaScript
/*global define*/
define([], function () {
'use strict';
// ****************************************************************************************
// MediaBox Type
// ****************************************************************************************
var mbTypeItem = {
type: "string",
ref: "props.mbType",
component: "radiobuttons",
label: "MediaBox type",
options: [
{
value: "html",
label: "HTML"
},
{
value: "image",
label: "Image from Url"
},
{
value: "imageFromLib",
label: "Image from library"
},
{
value: "video",
label: "Video"
},
{
value: "website",
label: "Web site"
}
],
defaultValue: "html"
};
var mbTypeHeader = {
type: "items",
label: "MediaBox type",
items: {
mbType: mbTypeItem
}
};
// ****************************************************************************************
// Image Header
// ****************************************************************************************
var imagePropsHeader = {
type: "items",
label: "Image from Url",
items: {
imageSource: {
type: "string",
ref: "props.image.source",
label: "Image source (Url)",
expression: "optional"
}
},
show: function (data) {
return data.props.mbType === 'image';
}
};
// ****************************************************************************************
// Image from Media Library
// ****************************************************************************************
var imageFromLibHeader = {
type: "items",
label: "Image from Library",
items: {
backgroundUrl: {
ref: "props.imageFromLib.url",
layoutRef: "props.imageFromLib.url",
schemaIgnore: true,
translation: "Common.Image",
tooltip: {select: "Select image", remove: "Remove image"},
type: "string",
component: "media",
defaultValue: ""
}
},
show: function (data) {
return data.props.mbType === 'imageFromLib'
}
};
// ****************************************************************************************
// Image formatting
// ****************************************************************************************
var imageFormattingHeader = {
type: "items",
label: "Image formatting",
items: {
imageHorizontalAlign: {
type: "string",
ref: "props.image.horizontalAlign",
component: "buttongroup",
label: "Horizontal align",
options: [
{
value: "left",
label: "Left"
},
{
value: "center",
label: "Center"
},
{
value: "right",
label: "Right"
}
],
defaultValue: "left"
},
imageVerticalAlign: {
type: "string",
ref: "props.image.verticalAlign",
component: "buttongroup",
label: "Vertical align",
options: [
{
value: "top",
label: "Top"
},
{
value: "middle",
label: "Middle"
},
{
value: "bottom",
label: "Bottom"
}
],
defaultValue: "top"
},
imageAspectRatio: {
type: "string",
ref: "props.image.imageAspectRatio",
component: "dropdown",
label: "Image aspect ratio",
options: [
{
value: "keep",
label: "Keep size"
},
{
value: "bestfit",
label: "Best fit"
}
],
defaultValue: "bestfit"
}
},
show: function (data) {
return data.props.mbType === 'imageFromLib' || data.props.mbType === 'image'
}
};
// ****************************************************************************************
// Html Header
// ****************************************************************************************
var htmlPropsHeader = {
type: "items",
label: "Html",
items: {
htmlSource: {
type: "string",
ref: "props.html.source",
expression: "optional",
defaultValue: '<div style="font-weight:bold;color: darkgreen;">This is the MediaBox</div>'
},
htmlScrollBehavior: {
ref: "props.html.scrollBehavior",
label: "Scrollbars",
type: "string",
component: "dropdown",
options: [
{
value: "auto",
label: "Auto"
},
{
value: "always",
label: "Always on"
},
{
value: "none",
label: "None"
}
],
defaultValue: "auto"
}
},
show: function (data) {
return data.props.mbType === 'html'
}
};
// ****************************************************************************************
// Video
// ****************************************************************************************
var videoPropsHeader = {
type: "items",
label: "Video",
items: {
videoType: {
type: "string",
ref: "props.video.videoType",
component: "dropdown",
label: "Video type",
options: [
{
value: "video-mp4",
label: "MP4"
}
// ,
// {
// value: "vimeo",
// label: "Vimeo"
// },
// {
// value: "video-youtube",
// label: "YouTube"
// }
],
defaultValue: "video-mp4",
show: function (data) {
return data.props.video;
}
},
videoPoster: {
type: "string",
ref: "props.video.poster",
label: "Video poster image (Url)",
show: function (data) {
return data.props.video && data.props.video.videoType && data.props.video.videoType === 'video-mp4';
}
},
videoSourceMP4: {
type: "string",
ref: "props.video.sourceMP4",
label: "Video source (Url)",
expression: "optional",
show: function (data) {
return data.props.video && data.props.video.videoType && data.props.video.videoType === 'video-mp4';
}
},
//,
//videoSourceVimeo: {
// type: "string",
// ref: "props.video.sourceVimeo",
// label: "Vimeo Id",
// expression: "optional",
// show: function ( data ) {
// return data.props.video && data.props.video.videoType && data.props.video.videoType === 'vimeo';
// }
//}
videoSourceYouTube: {
type: "string",
ref: "props.video.sourceYouTube",
label: "YouTube Url",
expression: "optional",
show: function (data) {
return data.props.video && data.props.video.videoType && data.props.video.videoType === 'video-youtube';
}
}
},
show: function (data) {
return data.props.mbType === 'video';
}
};
// ****************************************************************************************
// Website Header
// ****************************************************************************************
var websitePropsHeader = {
type: "items",
label: "Web site",
items: {
settings: {
type: "items",
label: "Source",
items: {
websiteSource: {
ref: "props.website.source",
label: "Web site (Url):",
type: "string",
expression: "optional",
defaultValue: ""
},
websiteScrollbars: {
ref: "props.website.scrollBehavior",
label: "Scrollbars",
type: "string",
component: "dropdown",
options: [
{
value: "auto",
label: "Auto"
},
{
value: "on",
label: "Always on"
},
{
value: "none",
label: "Always hidden"
}
],
defaultValue: "none"
},
websiteNoInteraction: {
ref: "props.website.interaction",
label: "Interaction",
type: "boolean",
component: "switch",
options: [
{
value: true,
label: "On"
},
{
value: false,
label: "Off"
}
],
defaultValue: false
}
}
}
},
show: function (data) {
return data.props.mbType === 'website';
}
};
// ****************************************************************************************
// Property Panel Definition
// ****************************************************************************************
// Appearance Panel
var appearanceSection = {
uses: 'settings',
items: {
general: {
items: {
showTitles: {
defaultValue: false
}
}
}
}
};
var mediaBoxSection = {
type: "items",
component: "expandable-items",
label: "MediaBox",
items: {
mbType: mbTypeHeader,
image: imagePropsHeader,
imageFromLib: imageFromLibHeader,
imageFormatting: imageFormattingHeader,
html: htmlPropsHeader,
website: websitePropsHeader,
video: videoPropsHeader
}
};
// Return values
return {
type: "items",
component: "accordion",
items: {
appearance: appearanceSection,
mediaBoxSection: mediaBoxSection
}
};
});