@xibosignage/xibo-layout-renderer 1.0.2 → 1.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -77,9 +77,10 @@ interface IRegion {
77
77
  layout: ILayout;
78
78
  id: string;
79
79
  regionId: string;
80
+ uniqueId: string;
80
81
  xml: null | Element;
81
82
  mediaObjects: IMedia[];
82
- mediaObjectsActions: String[];
83
+ mediaObjectsActions: IMedia[];
83
84
  currentMedia: number;
84
85
  complete: boolean;
85
86
  containerName: string;
@@ -104,6 +105,7 @@ interface IRegion {
104
105
  emitter?: Emitter<DefaultEvents>;
105
106
  prepareRegion(): void;
106
107
  playNextMedia(): void;
108
+ playPreviousMedia(): void;
107
109
  transitionNodes(oldMedia: IMedia | undefined, newMedia: IMedia | undefined): void;
108
110
  finished(): void;
109
111
  run(): void;
@@ -121,6 +123,37 @@ interface ILayoutEvents {
121
123
  end: (layout: ILayout) => void;
122
124
  }
123
125
 
126
+ declare class Action {
127
+ readonly id: string;
128
+ readonly xml: Element;
129
+ constructor(id: string, xml: Element);
130
+ }
131
+ declare class ActionsWrapper extends HTMLDivElement {
132
+ constructor();
133
+ }
134
+ type InactOptions = {
135
+ [k: string]: any;
136
+ } & OptionsType['previewTranslations'];
137
+ declare class ActionController {
138
+ readonly parent: ILayout;
139
+ readonly actions: Action[];
140
+ readonly options: InactOptions;
141
+ readonly $actionController: ActionsWrapper;
142
+ readonly $actionListContainer: Element | null;
143
+ translations: any;
144
+ constructor(parent: ILayout, actions: Action[], options: InactOptions);
145
+ init(): void;
146
+ openLayoutInNewTab(layoutCode: string, options: InactOptions): void;
147
+ /** Change media in region (next/previous) */
148
+ nextMediaInRegion(regionId: string, actionType: string): void;
149
+ loadMediaInRegion(regionId: string, widgetId: string): void;
150
+ /** Run action based on action data */
151
+ runAction(actionData: {
152
+ [k: string]: any;
153
+ }, options: InactOptions): void;
154
+ initTouchActions(): void;
155
+ }
156
+
124
157
  type InputLayoutType = {
125
158
  layoutId: number | null;
126
159
  path?: string;
@@ -142,6 +175,9 @@ type OptionsType = {
142
175
  cmsKey: string | null;
143
176
  hardwareKey: string | null;
144
177
  };
178
+ previewTranslations?: {
179
+ [k: string]: any;
180
+ };
145
181
  };
146
182
  interface ILayout {
147
183
  id: number | null;
@@ -164,10 +200,10 @@ interface ILayout {
164
200
  regionMaxZIndex: number;
165
201
  ready: boolean;
166
202
  regionObjects: IRegion[];
167
- drawer: String[];
203
+ drawer: Element | null;
168
204
  allExpired: boolean;
169
205
  regions: IRegion[];
170
- actions: String[];
206
+ actions: Action[];
171
207
  options: OptionsType;
172
208
  done: boolean;
173
209
  allEnded: boolean;
@@ -183,6 +219,7 @@ interface ILayout {
183
219
  stopAllMedia(): Promise<void>;
184
220
  resetLayout(): Promise<void>;
185
221
  index: number;
222
+ actionController: ActionController | undefined;
186
223
  }
187
224
  declare const initialLayout: ILayout;
188
225
  type GetLayoutParamType = {
@@ -1,3 +1,21 @@
1
+ function _callSuper(t, o, e) {
2
+ return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, [], _getPrototypeOf(t).constructor) : o.apply(t, e));
3
+ }
4
+ function _construct(t, e, r) {
5
+ if (_isNativeReflectConstruct()) return Reflect.construct.apply(null, arguments);
6
+ var o = [null];
7
+ o.push.apply(o, e);
8
+ var p = new (t.bind.apply(t, o))();
9
+ return r && _setPrototypeOf(p, r.prototype), p;
10
+ }
11
+ function _isNativeReflectConstruct() {
12
+ try {
13
+ var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {}));
14
+ } catch (t) {}
15
+ return (_isNativeReflectConstruct = function () {
16
+ return !!t;
17
+ })();
18
+ }
1
19
  function ownKeys(e, r) {
2
20
  var t = Object.keys(e);
3
21
  if (Object.getOwnPropertySymbols) {
@@ -364,6 +382,27 @@ function _asyncToGenerator(fn) {
364
382
  });
365
383
  };
366
384
  }
385
+ function _classCallCheck(instance, Constructor) {
386
+ if (!(instance instanceof Constructor)) {
387
+ throw new TypeError("Cannot call a class as a function");
388
+ }
389
+ }
390
+ function _defineProperties(target, props) {
391
+ for (var i = 0; i < props.length; i++) {
392
+ var descriptor = props[i];
393
+ descriptor.enumerable = descriptor.enumerable || false;
394
+ descriptor.configurable = true;
395
+ if ("value" in descriptor) descriptor.writable = true;
396
+ Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor);
397
+ }
398
+ }
399
+ function _createClass(Constructor, protoProps, staticProps) {
400
+ if (protoProps) _defineProperties(Constructor.prototype, protoProps);
401
+ Object.defineProperty(Constructor, "prototype", {
402
+ writable: false
403
+ });
404
+ return Constructor;
405
+ }
367
406
  function _defineProperty(obj, key, value) {
368
407
  key = _toPropertyKey(key);
369
408
  if (key in obj) {
@@ -378,6 +417,82 @@ function _defineProperty(obj, key, value) {
378
417
  }
379
418
  return obj;
380
419
  }
420
+ function _inherits(subClass, superClass) {
421
+ if (typeof superClass !== "function" && superClass !== null) {
422
+ throw new TypeError("Super expression must either be null or a function");
423
+ }
424
+ subClass.prototype = Object.create(superClass && superClass.prototype, {
425
+ constructor: {
426
+ value: subClass,
427
+ writable: true,
428
+ configurable: true
429
+ }
430
+ });
431
+ Object.defineProperty(subClass, "prototype", {
432
+ writable: false
433
+ });
434
+ if (superClass) _setPrototypeOf(subClass, superClass);
435
+ }
436
+ function _getPrototypeOf(o) {
437
+ _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) {
438
+ return o.__proto__ || Object.getPrototypeOf(o);
439
+ };
440
+ return _getPrototypeOf(o);
441
+ }
442
+ function _setPrototypeOf(o, p) {
443
+ _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) {
444
+ o.__proto__ = p;
445
+ return o;
446
+ };
447
+ return _setPrototypeOf(o, p);
448
+ }
449
+ function _isNativeFunction(fn) {
450
+ try {
451
+ return Function.toString.call(fn).indexOf("[native code]") !== -1;
452
+ } catch (e) {
453
+ return typeof fn === "function";
454
+ }
455
+ }
456
+ function _wrapNativeSuper(Class) {
457
+ var _cache = typeof Map === "function" ? new Map() : undefined;
458
+ _wrapNativeSuper = function _wrapNativeSuper(Class) {
459
+ if (Class === null || !_isNativeFunction(Class)) return Class;
460
+ if (typeof Class !== "function") {
461
+ throw new TypeError("Super expression must either be null or a function");
462
+ }
463
+ if (typeof _cache !== "undefined") {
464
+ if (_cache.has(Class)) return _cache.get(Class);
465
+ _cache.set(Class, Wrapper);
466
+ }
467
+ function Wrapper() {
468
+ return _construct(Class, arguments, _getPrototypeOf(this).constructor);
469
+ }
470
+ Wrapper.prototype = Object.create(Class.prototype, {
471
+ constructor: {
472
+ value: Wrapper,
473
+ enumerable: false,
474
+ writable: true,
475
+ configurable: true
476
+ }
477
+ });
478
+ return _setPrototypeOf(Wrapper, Class);
479
+ };
480
+ return _wrapNativeSuper(Class);
481
+ }
482
+ function _assertThisInitialized(self) {
483
+ if (self === void 0) {
484
+ throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
485
+ }
486
+ return self;
487
+ }
488
+ function _possibleConstructorReturn(self, call) {
489
+ if (call && (typeof call === "object" || typeof call === "function")) {
490
+ return call;
491
+ } else if (call !== void 0) {
492
+ throw new TypeError("Derived constructors may only return object or undefined");
493
+ }
494
+ return _assertThisInitialized(self);
495
+ }
381
496
  function _toConsumableArray(arr) {
382
497
  return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread();
383
498
  }
@@ -520,7 +635,7 @@ var initialLayout = {
520
635
  regionMaxZIndex: 0,
521
636
  ready: false,
522
637
  regionObjects: [],
523
- drawer: [],
638
+ drawer: null,
524
639
  allExpired: false,
525
640
  regions: [],
526
641
  actions: [],
@@ -544,7 +659,8 @@ var initialLayout = {
544
659
  return Promise.resolve();
545
660
  },
546
661
  emitter: {},
547
- index: -1
662
+ index: -1,
663
+ actionController: undefined
548
664
  };
549
665
 
550
666
  function nextId(options) {
@@ -740,11 +856,22 @@ function getIndexByLayoutId(layoutsInput, layoutId) {
740
856
  index: 0
741
857
  };
742
858
  }
859
+ function getAllAttributes(elem) {
860
+ if (!elem || elem === null) {
861
+ return {};
862
+ }
863
+ return elem.getAttributeNames().reduce(function (obj, name) {
864
+ return _objectSpread2(_objectSpread2({}, obj), {}, _defineProperty({}, name, {
865
+ value: elem.getAttribute(name)
866
+ }));
867
+ }, {});
868
+ }
743
869
 
744
870
  var initialRegion = {
745
871
  layout: initialLayout,
746
872
  id: '',
747
873
  regionId: '',
874
+ uniqueId: '',
748
875
  xml: null,
749
876
  mediaObjects: [],
750
877
  mediaObjectsActions: [],
@@ -769,6 +896,7 @@ var initialRegion = {
769
896
  index: -1,
770
897
  prepareRegion: function prepareRegion() {},
771
898
  playNextMedia: function playNextMedia() {},
899
+ playPreviousMedia: function playPreviousMedia() {},
772
900
  transitionNodes: function transitionNodes() {},
773
901
  finished: function finished() {},
774
902
  run: function run() {},
@@ -1602,7 +1730,7 @@ function Region(layout, xml, regionId, options, xlr) {
1602
1730
  var emitter = createNanoEvents();
1603
1731
  var regionObject = _objectSpread2(_objectSpread2({}, initialRegion), props);
1604
1732
  regionObject.prepareRegion = function () {
1605
- var _self$xml, _self$xml2, _self$xml3, _self$xml4, _self$xml5, _self$xml6;
1733
+ var _self$xml, _self$xml2, _self$xml3, _self$xml4, _self$xml5, _self$xml6, _self$layout$actionCo;
1606
1734
  var self = regionObject;
1607
1735
  var layout = self.layout,
1608
1736
  options = self.options;
@@ -1610,8 +1738,9 @@ function Region(layout, xml, regionId, options, xlr) {
1610
1738
  self.ending = false;
1611
1739
  self.ended = false;
1612
1740
  self.id = props.regionId;
1741
+ self.uniqueId = "".concat(nextId(self.options));
1613
1742
  self.options = _objectSpread2(_objectSpread2({}, platform), props.options);
1614
- self.containerName = "R-".concat(self.id, "-").concat(nextId(self.options));
1743
+ self.containerName = "R-".concat(self.id, "-").concat(self.uniqueId);
1615
1744
  self.xml = props.xml;
1616
1745
  self.mediaObjects = [];
1617
1746
  self.sWidth = self.xml && Number((_self$xml = self.xml) === null || _self$xml === void 0 ? void 0 : _self$xml.getAttribute('width')) * layout.scaleFactor;
@@ -1650,6 +1779,20 @@ function Region(layout, xml, regionId, options, xlr) {
1650
1779
  mediaObj.index = indx;
1651
1780
  self.mediaObjects.push(mediaObj);
1652
1781
  });
1782
+ // Add media to region for targetted actions
1783
+ (_self$layout$actionCo = self.layout.actionController) === null || _self$layout$actionCo === void 0 || _self$layout$actionCo.actions.forEach(function (action) {
1784
+ var attributes = getAllAttributes(action.xml);
1785
+ if (attributes.target.value === 'region' && attributes.actionType.value === 'navWidget' && attributes.targetId.value == self.id) {
1786
+ var _self$layout$drawer;
1787
+ var drawerMediaItems = Array.from(((_self$layout$drawer = self.layout.drawer) === null || _self$layout$drawer === void 0 ? void 0 : _self$layout$drawer.getElementsByTagName('media')) || []);
1788
+ drawerMediaItems.forEach(function (drawerMedia) {
1789
+ if (drawerMedia.id === attributes.widgetId.value) {
1790
+ // Add drawer media to the region
1791
+ self.mediaObjectsActions.push(Media(self, (drawerMedia === null || drawerMedia === void 0 ? void 0 : drawerMedia.getAttribute('id')) || '', drawerMedia, options, xlr));
1792
+ }
1793
+ });
1794
+ }
1795
+ });
1653
1796
  self.prepareMediaObjects();
1654
1797
  };
1655
1798
  regionObject.finished = function () {
@@ -1807,6 +1950,18 @@ function Region(layout, xml, regionId, options, xlr) {
1807
1950
  console.debug('region::playNextMedia', self);
1808
1951
  self.transitionNodes(self.oldMedia, self.curMedia);
1809
1952
  };
1953
+ regionObject.playPreviousMedia = function () {
1954
+ var self = regionObject;
1955
+ self.currentMediaIndex = self.currentMediaIndex - 1;
1956
+ if (self.currentMediaIndex < 0 || self.ended) {
1957
+ self.currentMediaIndex = 0;
1958
+ return;
1959
+ }
1960
+ self.prepareMediaObjects();
1961
+ console.debug('region::playPreviousMedia', self);
1962
+ /* Do the transition */
1963
+ self.transitionNodes(self.oldMedia, self.curMedia);
1964
+ };
1810
1965
  regionObject.end = function () {
1811
1966
  var self = regionObject;
1812
1967
  self.ending = true;
@@ -1847,6 +2002,251 @@ function Region(layout, xml, regionId, options, xlr) {
1847
2002
  return regionObject;
1848
2003
  }
1849
2004
 
2005
+ var Action = /*#__PURE__*/_createClass(function Action(id, xml) {
2006
+ _classCallCheck(this, Action);
2007
+ _defineProperty(this, "id", void 0);
2008
+ _defineProperty(this, "xml", void 0);
2009
+ this.id = id;
2010
+ this.xml = xml;
2011
+ });
2012
+ var ActionsWrapper = /*#__PURE__*/function (_HTMLDivElement) {
2013
+ function ActionsWrapper() {
2014
+ var _this;
2015
+ _classCallCheck(this, ActionsWrapper);
2016
+ _this = _callSuper(this, ActionsWrapper);
2017
+ _this.classList.add('action-controller', 'noselect');
2018
+ return _this;
2019
+ }
2020
+ _inherits(ActionsWrapper, _HTMLDivElement);
2021
+ return _createClass(ActionsWrapper);
2022
+ }( /*#__PURE__*/_wrapNativeSuper(HTMLDivElement));
2023
+ customElements.define('action-controller', ActionsWrapper, {
2024
+ "extends": 'div'
2025
+ });
2026
+ var ActionController = /*#__PURE__*/function () {
2027
+ function ActionController(parent, actions, options) {
2028
+ _classCallCheck(this, ActionController);
2029
+ _defineProperty(this, "parent", void 0);
2030
+ _defineProperty(this, "actions", void 0);
2031
+ _defineProperty(this, "options", void 0);
2032
+ _defineProperty(this, "$actionController", void 0);
2033
+ _defineProperty(this, "$actionListContainer", void 0);
2034
+ _defineProperty(this, "translations", {});
2035
+ this.parent = parent;
2036
+ this.actions = actions;
2037
+ this.options = options;
2038
+ this.$actionController = document.createElement('div', {
2039
+ is: 'action-controller'
2040
+ });
2041
+ this.$actionListContainer = null;
2042
+ this.init();
2043
+ }
2044
+ return _createClass(ActionController, [{
2045
+ key: "init",
2046
+ value: function init() {
2047
+ var self = this;
2048
+ var previewTranslations = {};
2049
+ // get preview translations
2050
+ if ('previewTranslations' in window) {
2051
+ previewTranslations = window['previewTranslations'];
2052
+ self.translations = previewTranslations;
2053
+ }
2054
+ var $container = document.getElementById(this.parent.containerName);
2055
+ var $actionTitle = document.createElement('div');
2056
+ var $actionsContainer = document.createElement('div');
2057
+ $actionTitle.classList.add('action-controller-title');
2058
+ $actionTitle.innerHTML = "\n <button class=\"toggle\"></button>\n <span class=\"title\">".concat(previewTranslations.actionControllerTitle, "</span>\n ");
2059
+ $actionsContainer.classList.add('actions-container');
2060
+ if ($container) {
2061
+ $container.insertBefore(this.$actionController, $container.firstElementChild);
2062
+ this.$actionController.appendChild($actionTitle);
2063
+ this.$actionController.appendChild($actionsContainer);
2064
+ // Loop through actions
2065
+ Array.from(this.actions).forEach(function (newAction) {
2066
+ // Create new action object
2067
+ var $newAction = document.createElement('div');
2068
+ // Copy element attributes
2069
+ var attributes = getAllAttributes(newAction.xml);
2070
+ Array.from(Object.keys(attributes)).forEach(function (attribKey) {
2071
+ $newAction.setAttribute("data-".concat(attribKey), attributes[attribKey].value);
2072
+ $newAction.setAttribute(attribKey, attributes[attribKey].value);
2073
+ });
2074
+ // Build html for the new action
2075
+ var html = '';
2076
+ // Add action type
2077
+ html += '<span class="action-row-title">' + previewTranslations[$newAction.getAttribute('actiontype') || ''];
2078
+ if ($newAction.getAttribute('actiontype') == 'navWidget') {
2079
+ html += ' <span title="' + previewTranslations.widgetId + '">[' + $newAction.getAttribute('widgetid') + ']</span>';
2080
+ } else if ($newAction.getAttribute('actiontype') == 'navLayout') {
2081
+ html += ' <span title="' + previewTranslations.layoutCode + '">[' + $newAction.getAttribute('layoutcode') + ']</span>';
2082
+ }
2083
+ html += '</span>';
2084
+ // Add target
2085
+ html += '<span class="action-row-target" title="' + previewTranslations.target + '">' + $newAction.getAttribute('target');
2086
+ if ($newAction.getAttribute('targetid') != '') {
2087
+ html += '(' + $newAction.getAttribute('targetid') + $newAction.getAttribute('layoutcode') + ')';
2088
+ }
2089
+ html += '</span>';
2090
+ // Add HTML string to the action
2091
+ $newAction.innerHTML = html;
2092
+ // Append new action to the controller
2093
+ $newAction.classList.add('action');
2094
+ $newAction.setAttribute('originalid', newAction.id);
2095
+ $newAction.setAttribute('id', 'A-' + newAction.id + '-' + nextId(self.options));
2096
+ $actionsContainer.insertBefore($newAction, $actionsContainer.lastElementChild);
2097
+ });
2098
+ //
2099
+ // Enable dragging
2100
+ // const $draggableContainer = new Moveable($container, {
2101
+ // target: this.$actionController,
2102
+ // draggable: true,
2103
+ // });
2104
+ // Toggle actions visibility
2105
+ var $actionsToggler = this.$actionController.querySelector('.toggle');
2106
+ if ($actionsToggler) {
2107
+ $actionsToggler.onclick = function () {
2108
+ self.$actionController.classList.toggle('d-none');
2109
+ };
2110
+ }
2111
+ var $webhookActions = this.$actionController.querySelectorAll('.action[triggertype="webhook"]');
2112
+ // Display according to the number of clickable actions
2113
+ this.$actionController.style.setProperty('display', $webhookActions.length === 0 ? 'none' : 'flex');
2114
+ // Handle webhook action trigger click
2115
+ if ($webhookActions.length > 0) {
2116
+ $webhookActions.forEach(function ($webhookAction) {
2117
+ $webhookAction.onclick = function (event) {
2118
+ event.stopPropagation();
2119
+ self.runAction($webhookAction.dataset, self.options);
2120
+ };
2121
+ $webhookAction.classList.add('clickable');
2122
+ });
2123
+ }
2124
+ }
2125
+ }
2126
+ }, {
2127
+ key: "openLayoutInNewTab",
2128
+ value: function openLayoutInNewTab(layoutCode, options) {
2129
+ if (confirm(this.translations.navigateToLayout.replace('[layoutTag]', layoutCode))) {
2130
+ var url = options.layoutPreviewUrl.replace('[layoutCode]', layoutCode) + '?findByCode=1';
2131
+ window.open(url, '_blank');
2132
+ }
2133
+ }
2134
+ /** Change media in region (next/previous) */
2135
+ }, {
2136
+ key: "nextMediaInRegion",
2137
+ value: function nextMediaInRegion(regionId, actionType) {
2138
+ // Find target region
2139
+ this.parent.regions.forEach(function (regionObj) {
2140
+ if (regionObj.id === regionId) {
2141
+ if (actionType === 'next') {
2142
+ regionObj.playNextMedia();
2143
+ } else {
2144
+ regionObj.playPreviousMedia();
2145
+ }
2146
+ }
2147
+ });
2148
+ }
2149
+ }, {
2150
+ key: "loadMediaInRegion",
2151
+ value: function loadMediaInRegion(regionId, widgetId) {
2152
+ var _targetRegion, _targetRegion2, _targetRegion3;
2153
+ var self = this;
2154
+ // Find target region
2155
+ var targetRegion;
2156
+ self.parent.regions.forEach(function (regionObj) {
2157
+ if (regionObj.id === regionId) {
2158
+ targetRegion = regionObj;
2159
+ }
2160
+ });
2161
+ // Find media in actions
2162
+ var targetMedia;
2163
+ if (targetRegion) {
2164
+ targetRegion.mediaObjectsActions.forEach(function (media) {
2165
+ if (media.id === widgetId) {
2166
+ targetMedia = media;
2167
+ }
2168
+ });
2169
+ }
2170
+ // Mark media as temporary (removed after region stop playing or loops)
2171
+ if (targetMedia) {
2172
+ targetMedia.singlePlay = true;
2173
+ }
2174
+ // If region is empty, remove the background color and empty message
2175
+ if (((_targetRegion = targetRegion) === null || _targetRegion === void 0 ? void 0 : _targetRegion.mediaObjects.length) === 0) {
2176
+ targetRegion.complete = false;
2177
+ }
2178
+ // Create media in region and play it next
2179
+ (_targetRegion2 = targetRegion) === null || _targetRegion2 === void 0 || _targetRegion2.mediaObjects.splice(targetRegion.currentMediaIndex + 1, 0, targetMedia);
2180
+ (_targetRegion3 = targetRegion) === null || _targetRegion3 === void 0 || _targetRegion3.playNextMedia();
2181
+ }
2182
+ /** Run action based on action data */
2183
+ }, {
2184
+ key: "runAction",
2185
+ value: function runAction(actionData, options) {
2186
+ if (actionData.actiontype == 'navLayout') {
2187
+ // Open layout preview in a new tab
2188
+ this.openLayoutInNewTab(actionData.layoutcode, options);
2189
+ } else if ((actionData.actiontype == 'previous' || actionData.actiontype == 'next') && actionData.target == 'region') {
2190
+ this.nextMediaInRegion(actionData.targetid, actionData.actiontype);
2191
+ } else if (actionData.actiontype == 'navWidget' && actionData.target == 'region') {
2192
+ this.loadMediaInRegion(actionData.targetid, actionData.widgetid);
2193
+ } else {
2194
+ // TODO Handle other action types ( later? )
2195
+ console.log(actionData.actiontype + ' > ' + actionData.target + '[' + actionData.targetid + ']');
2196
+ }
2197
+ }
2198
+ }, {
2199
+ key: "initTouchActions",
2200
+ value: function initTouchActions() {
2201
+ var self = this;
2202
+ this.$actionController.querySelectorAll('.action[triggerType="touch"]').forEach(function ($el) {
2203
+ var dataset = $el.dataset;
2204
+ // Find source object
2205
+ var $sourceObj;
2206
+ if (dataset.source === 'layout') {
2207
+ $sourceObj = document.getElementById(self.parent.containerName);
2208
+ } else {
2209
+ var regionObjects = Array.from(self.parent.regions);
2210
+ // Loop through layout regions
2211
+ for (var _i = 0, _regionObjects = regionObjects; _i < _regionObjects.length; _i++) {
2212
+ var regionObj = _regionObjects[_i];
2213
+ if (dataset.source === 'region') {
2214
+ // Try to find the region
2215
+ if (regionObj.id === dataset.sourceid) {
2216
+ $sourceObj = document.getElementById(regionObj.containerName);
2217
+ break;
2218
+ }
2219
+ } else if (dataset.source === 'widget') {
2220
+ // Try to find widget/media
2221
+ var mediaObjects = Array.from(regionObj.mediaObjects);
2222
+ for (var _i2 = 0, _mediaObjects = mediaObjects; _i2 < _mediaObjects.length; _i2++) {
2223
+ var mediaObject = _mediaObjects[_i2];
2224
+ if (mediaObject.id === dataset.sourceid) {
2225
+ $sourceObj = document.getElementById(mediaObject.containerName);
2226
+ break;
2227
+ }
2228
+ }
2229
+ }
2230
+ // Break loop if we already have a $sourceObj
2231
+ if ($sourceObj != undefined) {
2232
+ break;
2233
+ }
2234
+ }
2235
+ }
2236
+ // Handle source click
2237
+ // FIXME: We need to handle the case where a drawer widget has an action and it has been loaded to the preview
2238
+ if ($sourceObj != undefined) {
2239
+ $sourceObj.onclick = function (ev) {
2240
+ ev.stopPropagation();
2241
+ self.runAction(dataset, self.options);
2242
+ };
2243
+ $sourceObj.classList.add('clickable');
2244
+ }
2245
+ });
2246
+ }
2247
+ }]);
2248
+ }();
2249
+
1850
2250
  var playAgainClickHandle = function playAgainClickHandle(ev) {
1851
2251
  ev.preventDefault();
1852
2252
  history.go(0);
@@ -2058,7 +2458,7 @@ function Layout(data, options, xlr, layout) {
2058
2458
  layoutObject.parseXlf();
2059
2459
  };
2060
2460
  layoutObject.parseXlf = function () {
2061
- var _layout$layoutNode, _layout$layoutNode2, _layout$layoutNode3, _layout$layoutNode4, _layout$layoutNode5, _layout$layoutNode6;
2461
+ var _layout$layoutNode, _layout$layoutNode2, _layout$layoutNode3, _layout$layoutNode4, _layout$layoutNode5, _layout$layoutNode6, _layout$layoutNode7, _layout$layoutNode8;
2062
2462
  var layout = this;
2063
2463
  var options = layout.options;
2064
2464
  layout.done = false;
@@ -2128,13 +2528,26 @@ function Layout(data, options, xlr, layout) {
2128
2528
  if ($layout && xlr.currentLayoutId !== undefined && xlr.currentLayoutId !== layout.id) {
2129
2529
  $layout.style.display = 'none';
2130
2530
  }
2531
+ // Create actions
2532
+ var layoutActions = Array.from((layout === null || layout === void 0 || (_layout$layoutNode6 = layout.layoutNode) === null || _layout$layoutNode6 === void 0 ? void 0 : _layout$layoutNode6.getElementsByTagName('action')) || []);
2533
+ Array.from(layoutActions).forEach(function (actionXml, indx) {
2534
+ layout.actions.push(new Action((actionXml === null || actionXml === void 0 ? void 0 : actionXml.getAttribute('id')) || '', actionXml));
2535
+ });
2536
+ // Create interactive actions
2537
+ layout.actionController = new ActionController(layout, layout.actions, options);
2538
+ // Create drawer
2539
+ var layoutDrawers = Array.from((layout === null || layout === void 0 || (_layout$layoutNode7 = layout.layoutNode) === null || _layout$layoutNode7 === void 0 ? void 0 : _layout$layoutNode7.getElementsByTagName('drawer')) || []);
2540
+ Array.from(layoutDrawers).forEach(function (layoutDrawerXml) {
2541
+ layout.drawer = layoutDrawerXml;
2542
+ });
2131
2543
  // Create regions
2132
- var layoutRegions = Array.from((layout === null || layout === void 0 || (_layout$layoutNode6 = layout.layoutNode) === null || _layout$layoutNode6 === void 0 ? void 0 : _layout$layoutNode6.getElementsByTagName('region')) || []);
2544
+ var layoutRegions = Array.from((layout === null || layout === void 0 || (_layout$layoutNode8 = layout.layoutNode) === null || _layout$layoutNode8 === void 0 ? void 0 : _layout$layoutNode8.getElementsByTagName('region')) || []);
2133
2545
  Array.from(layoutRegions).forEach(function (regionXml, indx) {
2134
2546
  var regionObj = Region(layout, regionXml, (regionXml === null || regionXml === void 0 ? void 0 : regionXml.getAttribute('id')) || '', options, xlr);
2135
2547
  regionObj.index = indx;
2136
2548
  layout.regions.push(regionObj);
2137
2549
  });
2550
+ layout.actionController.initTouchActions();
2138
2551
  };
2139
2552
  layoutObject.regionExpired = function () {
2140
2553
  var self = layoutObject;