@xibosignage/xibo-layout-renderer 1.0.0
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.
- package/LICENSE +165 -0
- package/README.md +2 -0
- package/dist/assets/logo-BLa_l1uk.png +0 -0
- package/dist/rollup.config.dev.d.ts +3 -0
- package/dist/rollup.config.prod.d.ts +3 -0
- package/dist/src/Modules/Generators/Generators.d.ts +30 -0
- package/dist/src/Modules/Generators/index.d.ts +1 -0
- package/dist/src/Modules/Layout/Layout.d.ts +12 -0
- package/dist/src/Modules/Layout/index.d.ts +1 -0
- package/dist/src/Modules/Media/AudioMedia.d.ts +5 -0
- package/dist/src/Modules/Media/Media.d.ts +9 -0
- package/dist/src/Modules/Media/VideoMedia.d.ts +4 -0
- package/dist/src/Modules/Media/index.d.ts +3 -0
- package/dist/src/Modules/Platform/Platform.d.ts +2 -0
- package/dist/src/Modules/Platform/index.d.ts +1 -0
- package/dist/src/Modules/Region/Region.d.ts +4 -0
- package/dist/src/Modules/Region/index.d.ts +1 -0
- package/dist/src/Modules/SplashScreen/SplashScreen.d.ts +11 -0
- package/dist/src/Modules/SplashScreen/index.d.ts +1 -0
- package/dist/src/Modules/Transitions/Transitions.d.ts +90 -0
- package/dist/src/Modules/Transitions/index.d.ts +1 -0
- package/dist/src/Types/Layout/Layout.types.d.ts +78 -0
- package/dist/src/Types/Layout/index.d.ts +1 -0
- package/dist/src/Types/Media/Media.types.d.ts +45 -0
- package/dist/src/Types/Media/index.d.ts +1 -0
- package/dist/src/Types/Region/Region.types.d.ts +49 -0
- package/dist/src/Types/Region/index.d.ts +1 -0
- package/dist/src/Types/XLR/XLR.types.d.ts +25 -0
- package/dist/src/Types/XLR/index.d.ts +1 -0
- package/dist/src/index.d.ts +2 -0
- package/dist/src/types.d.ts +4 -0
- package/dist/src/xibo-layout-renderer.d.ts +3 -0
- package/dist/styles.css +171 -0
- package/dist/xibo-layout-renderer.cjs.js +2634 -0
- package/dist/xibo-layout-renderer.cjs.js.map +1 -0
- package/dist/xibo-layout-renderer.d.ts +201 -0
- package/dist/xibo-layout-renderer.esm.js +2626 -0
- package/dist/xibo-layout-renderer.esm.js.map +1 -0
- package/dist/xibo-layout-renderer.js +2638 -0
- package/dist/xibo-layout-renderer.min.js +2 -0
- package/dist/xibo-layout-renderer.min.js.map +1 -0
- package/package.json +45 -0
|
@@ -0,0 +1,2634 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
5
|
+
function ownKeys(e, r) {
|
|
6
|
+
var t = Object.keys(e);
|
|
7
|
+
if (Object.getOwnPropertySymbols) {
|
|
8
|
+
var o = Object.getOwnPropertySymbols(e);
|
|
9
|
+
r && (o = o.filter(function (r) {
|
|
10
|
+
return Object.getOwnPropertyDescriptor(e, r).enumerable;
|
|
11
|
+
})), t.push.apply(t, o);
|
|
12
|
+
}
|
|
13
|
+
return t;
|
|
14
|
+
}
|
|
15
|
+
function _objectSpread2(e) {
|
|
16
|
+
for (var r = 1; r < arguments.length; r++) {
|
|
17
|
+
var t = null != arguments[r] ? arguments[r] : {};
|
|
18
|
+
r % 2 ? ownKeys(Object(t), !0).forEach(function (r) {
|
|
19
|
+
_defineProperty(e, r, t[r]);
|
|
20
|
+
}) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) {
|
|
21
|
+
Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r));
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
return e;
|
|
25
|
+
}
|
|
26
|
+
function _regeneratorRuntime() {
|
|
27
|
+
_regeneratorRuntime = function () {
|
|
28
|
+
return e;
|
|
29
|
+
};
|
|
30
|
+
var t,
|
|
31
|
+
e = {},
|
|
32
|
+
r = Object.prototype,
|
|
33
|
+
n = r.hasOwnProperty,
|
|
34
|
+
o = Object.defineProperty || function (t, e, r) {
|
|
35
|
+
t[e] = r.value;
|
|
36
|
+
},
|
|
37
|
+
i = "function" == typeof Symbol ? Symbol : {},
|
|
38
|
+
a = i.iterator || "@@iterator",
|
|
39
|
+
c = i.asyncIterator || "@@asyncIterator",
|
|
40
|
+
u = i.toStringTag || "@@toStringTag";
|
|
41
|
+
function define(t, e, r) {
|
|
42
|
+
return Object.defineProperty(t, e, {
|
|
43
|
+
value: r,
|
|
44
|
+
enumerable: !0,
|
|
45
|
+
configurable: !0,
|
|
46
|
+
writable: !0
|
|
47
|
+
}), t[e];
|
|
48
|
+
}
|
|
49
|
+
try {
|
|
50
|
+
define({}, "");
|
|
51
|
+
} catch (t) {
|
|
52
|
+
define = function (t, e, r) {
|
|
53
|
+
return t[e] = r;
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
function wrap(t, e, r, n) {
|
|
57
|
+
var i = e && e.prototype instanceof Generator ? e : Generator,
|
|
58
|
+
a = Object.create(i.prototype),
|
|
59
|
+
c = new Context(n || []);
|
|
60
|
+
return o(a, "_invoke", {
|
|
61
|
+
value: makeInvokeMethod(t, r, c)
|
|
62
|
+
}), a;
|
|
63
|
+
}
|
|
64
|
+
function tryCatch(t, e, r) {
|
|
65
|
+
try {
|
|
66
|
+
return {
|
|
67
|
+
type: "normal",
|
|
68
|
+
arg: t.call(e, r)
|
|
69
|
+
};
|
|
70
|
+
} catch (t) {
|
|
71
|
+
return {
|
|
72
|
+
type: "throw",
|
|
73
|
+
arg: t
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
e.wrap = wrap;
|
|
78
|
+
var h = "suspendedStart",
|
|
79
|
+
l = "suspendedYield",
|
|
80
|
+
f = "executing",
|
|
81
|
+
s = "completed",
|
|
82
|
+
y = {};
|
|
83
|
+
function Generator() {}
|
|
84
|
+
function GeneratorFunction() {}
|
|
85
|
+
function GeneratorFunctionPrototype() {}
|
|
86
|
+
var p = {};
|
|
87
|
+
define(p, a, function () {
|
|
88
|
+
return this;
|
|
89
|
+
});
|
|
90
|
+
var d = Object.getPrototypeOf,
|
|
91
|
+
v = d && d(d(values([])));
|
|
92
|
+
v && v !== r && n.call(v, a) && (p = v);
|
|
93
|
+
var g = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(p);
|
|
94
|
+
function defineIteratorMethods(t) {
|
|
95
|
+
["next", "throw", "return"].forEach(function (e) {
|
|
96
|
+
define(t, e, function (t) {
|
|
97
|
+
return this._invoke(e, t);
|
|
98
|
+
});
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
function AsyncIterator(t, e) {
|
|
102
|
+
function invoke(r, o, i, a) {
|
|
103
|
+
var c = tryCatch(t[r], t, o);
|
|
104
|
+
if ("throw" !== c.type) {
|
|
105
|
+
var u = c.arg,
|
|
106
|
+
h = u.value;
|
|
107
|
+
return h && "object" == typeof h && n.call(h, "__await") ? e.resolve(h.__await).then(function (t) {
|
|
108
|
+
invoke("next", t, i, a);
|
|
109
|
+
}, function (t) {
|
|
110
|
+
invoke("throw", t, i, a);
|
|
111
|
+
}) : e.resolve(h).then(function (t) {
|
|
112
|
+
u.value = t, i(u);
|
|
113
|
+
}, function (t) {
|
|
114
|
+
return invoke("throw", t, i, a);
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
a(c.arg);
|
|
118
|
+
}
|
|
119
|
+
var r;
|
|
120
|
+
o(this, "_invoke", {
|
|
121
|
+
value: function (t, n) {
|
|
122
|
+
function callInvokeWithMethodAndArg() {
|
|
123
|
+
return new e(function (e, r) {
|
|
124
|
+
invoke(t, n, e, r);
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
return r = r ? r.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg();
|
|
128
|
+
}
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
function makeInvokeMethod(e, r, n) {
|
|
132
|
+
var o = h;
|
|
133
|
+
return function (i, a) {
|
|
134
|
+
if (o === f) throw Error("Generator is already running");
|
|
135
|
+
if (o === s) {
|
|
136
|
+
if ("throw" === i) throw a;
|
|
137
|
+
return {
|
|
138
|
+
value: t,
|
|
139
|
+
done: !0
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
for (n.method = i, n.arg = a;;) {
|
|
143
|
+
var c = n.delegate;
|
|
144
|
+
if (c) {
|
|
145
|
+
var u = maybeInvokeDelegate(c, n);
|
|
146
|
+
if (u) {
|
|
147
|
+
if (u === y) continue;
|
|
148
|
+
return u;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
if ("next" === n.method) n.sent = n._sent = n.arg;else if ("throw" === n.method) {
|
|
152
|
+
if (o === h) throw o = s, n.arg;
|
|
153
|
+
n.dispatchException(n.arg);
|
|
154
|
+
} else "return" === n.method && n.abrupt("return", n.arg);
|
|
155
|
+
o = f;
|
|
156
|
+
var p = tryCatch(e, r, n);
|
|
157
|
+
if ("normal" === p.type) {
|
|
158
|
+
if (o = n.done ? s : l, p.arg === y) continue;
|
|
159
|
+
return {
|
|
160
|
+
value: p.arg,
|
|
161
|
+
done: n.done
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
"throw" === p.type && (o = s, n.method = "throw", n.arg = p.arg);
|
|
165
|
+
}
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
function maybeInvokeDelegate(e, r) {
|
|
169
|
+
var n = r.method,
|
|
170
|
+
o = e.iterator[n];
|
|
171
|
+
if (o === t) return r.delegate = null, "throw" === n && e.iterator.return && (r.method = "return", r.arg = t, maybeInvokeDelegate(e, r), "throw" === r.method) || "return" !== n && (r.method = "throw", r.arg = new TypeError("The iterator does not provide a '" + n + "' method")), y;
|
|
172
|
+
var i = tryCatch(o, e.iterator, r.arg);
|
|
173
|
+
if ("throw" === i.type) return r.method = "throw", r.arg = i.arg, r.delegate = null, y;
|
|
174
|
+
var a = i.arg;
|
|
175
|
+
return a ? a.done ? (r[e.resultName] = a.value, r.next = e.nextLoc, "return" !== r.method && (r.method = "next", r.arg = t), r.delegate = null, y) : a : (r.method = "throw", r.arg = new TypeError("iterator result is not an object"), r.delegate = null, y);
|
|
176
|
+
}
|
|
177
|
+
function pushTryEntry(t) {
|
|
178
|
+
var e = {
|
|
179
|
+
tryLoc: t[0]
|
|
180
|
+
};
|
|
181
|
+
1 in t && (e.catchLoc = t[1]), 2 in t && (e.finallyLoc = t[2], e.afterLoc = t[3]), this.tryEntries.push(e);
|
|
182
|
+
}
|
|
183
|
+
function resetTryEntry(t) {
|
|
184
|
+
var e = t.completion || {};
|
|
185
|
+
e.type = "normal", delete e.arg, t.completion = e;
|
|
186
|
+
}
|
|
187
|
+
function Context(t) {
|
|
188
|
+
this.tryEntries = [{
|
|
189
|
+
tryLoc: "root"
|
|
190
|
+
}], t.forEach(pushTryEntry, this), this.reset(!0);
|
|
191
|
+
}
|
|
192
|
+
function values(e) {
|
|
193
|
+
if (e || "" === e) {
|
|
194
|
+
var r = e[a];
|
|
195
|
+
if (r) return r.call(e);
|
|
196
|
+
if ("function" == typeof e.next) return e;
|
|
197
|
+
if (!isNaN(e.length)) {
|
|
198
|
+
var o = -1,
|
|
199
|
+
i = function next() {
|
|
200
|
+
for (; ++o < e.length;) if (n.call(e, o)) return next.value = e[o], next.done = !1, next;
|
|
201
|
+
return next.value = t, next.done = !0, next;
|
|
202
|
+
};
|
|
203
|
+
return i.next = i;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
throw new TypeError(typeof e + " is not iterable");
|
|
207
|
+
}
|
|
208
|
+
return GeneratorFunction.prototype = GeneratorFunctionPrototype, o(g, "constructor", {
|
|
209
|
+
value: GeneratorFunctionPrototype,
|
|
210
|
+
configurable: !0
|
|
211
|
+
}), o(GeneratorFunctionPrototype, "constructor", {
|
|
212
|
+
value: GeneratorFunction,
|
|
213
|
+
configurable: !0
|
|
214
|
+
}), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, u, "GeneratorFunction"), e.isGeneratorFunction = function (t) {
|
|
215
|
+
var e = "function" == typeof t && t.constructor;
|
|
216
|
+
return !!e && (e === GeneratorFunction || "GeneratorFunction" === (e.displayName || e.name));
|
|
217
|
+
}, e.mark = function (t) {
|
|
218
|
+
return Object.setPrototypeOf ? Object.setPrototypeOf(t, GeneratorFunctionPrototype) : (t.__proto__ = GeneratorFunctionPrototype, define(t, u, "GeneratorFunction")), t.prototype = Object.create(g), t;
|
|
219
|
+
}, e.awrap = function (t) {
|
|
220
|
+
return {
|
|
221
|
+
__await: t
|
|
222
|
+
};
|
|
223
|
+
}, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, c, function () {
|
|
224
|
+
return this;
|
|
225
|
+
}), e.AsyncIterator = AsyncIterator, e.async = function (t, r, n, o, i) {
|
|
226
|
+
void 0 === i && (i = Promise);
|
|
227
|
+
var a = new AsyncIterator(wrap(t, r, n, o), i);
|
|
228
|
+
return e.isGeneratorFunction(r) ? a : a.next().then(function (t) {
|
|
229
|
+
return t.done ? t.value : a.next();
|
|
230
|
+
});
|
|
231
|
+
}, defineIteratorMethods(g), define(g, u, "Generator"), define(g, a, function () {
|
|
232
|
+
return this;
|
|
233
|
+
}), define(g, "toString", function () {
|
|
234
|
+
return "[object Generator]";
|
|
235
|
+
}), e.keys = function (t) {
|
|
236
|
+
var e = Object(t),
|
|
237
|
+
r = [];
|
|
238
|
+
for (var n in e) r.push(n);
|
|
239
|
+
return r.reverse(), function next() {
|
|
240
|
+
for (; r.length;) {
|
|
241
|
+
var t = r.pop();
|
|
242
|
+
if (t in e) return next.value = t, next.done = !1, next;
|
|
243
|
+
}
|
|
244
|
+
return next.done = !0, next;
|
|
245
|
+
};
|
|
246
|
+
}, e.values = values, Context.prototype = {
|
|
247
|
+
constructor: Context,
|
|
248
|
+
reset: function (e) {
|
|
249
|
+
if (this.prev = 0, this.next = 0, this.sent = this._sent = t, this.done = !1, this.delegate = null, this.method = "next", this.arg = t, this.tryEntries.forEach(resetTryEntry), !e) for (var r in this) "t" === r.charAt(0) && n.call(this, r) && !isNaN(+r.slice(1)) && (this[r] = t);
|
|
250
|
+
},
|
|
251
|
+
stop: function () {
|
|
252
|
+
this.done = !0;
|
|
253
|
+
var t = this.tryEntries[0].completion;
|
|
254
|
+
if ("throw" === t.type) throw t.arg;
|
|
255
|
+
return this.rval;
|
|
256
|
+
},
|
|
257
|
+
dispatchException: function (e) {
|
|
258
|
+
if (this.done) throw e;
|
|
259
|
+
var r = this;
|
|
260
|
+
function handle(n, o) {
|
|
261
|
+
return a.type = "throw", a.arg = e, r.next = n, o && (r.method = "next", r.arg = t), !!o;
|
|
262
|
+
}
|
|
263
|
+
for (var o = this.tryEntries.length - 1; o >= 0; --o) {
|
|
264
|
+
var i = this.tryEntries[o],
|
|
265
|
+
a = i.completion;
|
|
266
|
+
if ("root" === i.tryLoc) return handle("end");
|
|
267
|
+
if (i.tryLoc <= this.prev) {
|
|
268
|
+
var c = n.call(i, "catchLoc"),
|
|
269
|
+
u = n.call(i, "finallyLoc");
|
|
270
|
+
if (c && u) {
|
|
271
|
+
if (this.prev < i.catchLoc) return handle(i.catchLoc, !0);
|
|
272
|
+
if (this.prev < i.finallyLoc) return handle(i.finallyLoc);
|
|
273
|
+
} else if (c) {
|
|
274
|
+
if (this.prev < i.catchLoc) return handle(i.catchLoc, !0);
|
|
275
|
+
} else {
|
|
276
|
+
if (!u) throw Error("try statement without catch or finally");
|
|
277
|
+
if (this.prev < i.finallyLoc) return handle(i.finallyLoc);
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
},
|
|
282
|
+
abrupt: function (t, e) {
|
|
283
|
+
for (var r = this.tryEntries.length - 1; r >= 0; --r) {
|
|
284
|
+
var o = this.tryEntries[r];
|
|
285
|
+
if (o.tryLoc <= this.prev && n.call(o, "finallyLoc") && this.prev < o.finallyLoc) {
|
|
286
|
+
var i = o;
|
|
287
|
+
break;
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
i && ("break" === t || "continue" === t) && i.tryLoc <= e && e <= i.finallyLoc && (i = null);
|
|
291
|
+
var a = i ? i.completion : {};
|
|
292
|
+
return a.type = t, a.arg = e, i ? (this.method = "next", this.next = i.finallyLoc, y) : this.complete(a);
|
|
293
|
+
},
|
|
294
|
+
complete: function (t, e) {
|
|
295
|
+
if ("throw" === t.type) throw t.arg;
|
|
296
|
+
return "break" === t.type || "continue" === t.type ? this.next = t.arg : "return" === t.type ? (this.rval = this.arg = t.arg, this.method = "return", this.next = "end") : "normal" === t.type && e && (this.next = e), y;
|
|
297
|
+
},
|
|
298
|
+
finish: function (t) {
|
|
299
|
+
for (var e = this.tryEntries.length - 1; e >= 0; --e) {
|
|
300
|
+
var r = this.tryEntries[e];
|
|
301
|
+
if (r.finallyLoc === t) return this.complete(r.completion, r.afterLoc), resetTryEntry(r), y;
|
|
302
|
+
}
|
|
303
|
+
},
|
|
304
|
+
catch: function (t) {
|
|
305
|
+
for (var e = this.tryEntries.length - 1; e >= 0; --e) {
|
|
306
|
+
var r = this.tryEntries[e];
|
|
307
|
+
if (r.tryLoc === t) {
|
|
308
|
+
var n = r.completion;
|
|
309
|
+
if ("throw" === n.type) {
|
|
310
|
+
var o = n.arg;
|
|
311
|
+
resetTryEntry(r);
|
|
312
|
+
}
|
|
313
|
+
return o;
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
throw Error("illegal catch attempt");
|
|
317
|
+
},
|
|
318
|
+
delegateYield: function (e, r, n) {
|
|
319
|
+
return this.delegate = {
|
|
320
|
+
iterator: values(e),
|
|
321
|
+
resultName: r,
|
|
322
|
+
nextLoc: n
|
|
323
|
+
}, "next" === this.method && (this.arg = t), y;
|
|
324
|
+
}
|
|
325
|
+
}, e;
|
|
326
|
+
}
|
|
327
|
+
function _toPrimitive(t, r) {
|
|
328
|
+
if ("object" != typeof t || !t) return t;
|
|
329
|
+
var e = t[Symbol.toPrimitive];
|
|
330
|
+
if (void 0 !== e) {
|
|
331
|
+
var i = e.call(t, r || "default");
|
|
332
|
+
if ("object" != typeof i) return i;
|
|
333
|
+
throw new TypeError("@@toPrimitive must return a primitive value.");
|
|
334
|
+
}
|
|
335
|
+
return ("string" === r ? String : Number)(t);
|
|
336
|
+
}
|
|
337
|
+
function _toPropertyKey(t) {
|
|
338
|
+
var i = _toPrimitive(t, "string");
|
|
339
|
+
return "symbol" == typeof i ? i : i + "";
|
|
340
|
+
}
|
|
341
|
+
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
|
|
342
|
+
try {
|
|
343
|
+
var info = gen[key](arg);
|
|
344
|
+
var value = info.value;
|
|
345
|
+
} catch (error) {
|
|
346
|
+
reject(error);
|
|
347
|
+
return;
|
|
348
|
+
}
|
|
349
|
+
if (info.done) {
|
|
350
|
+
resolve(value);
|
|
351
|
+
} else {
|
|
352
|
+
Promise.resolve(value).then(_next, _throw);
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
function _asyncToGenerator(fn) {
|
|
356
|
+
return function () {
|
|
357
|
+
var self = this,
|
|
358
|
+
args = arguments;
|
|
359
|
+
return new Promise(function (resolve, reject) {
|
|
360
|
+
var gen = fn.apply(self, args);
|
|
361
|
+
function _next(value) {
|
|
362
|
+
asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);
|
|
363
|
+
}
|
|
364
|
+
function _throw(err) {
|
|
365
|
+
asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err);
|
|
366
|
+
}
|
|
367
|
+
_next(undefined);
|
|
368
|
+
});
|
|
369
|
+
};
|
|
370
|
+
}
|
|
371
|
+
function _defineProperty(obj, key, value) {
|
|
372
|
+
key = _toPropertyKey(key);
|
|
373
|
+
if (key in obj) {
|
|
374
|
+
Object.defineProperty(obj, key, {
|
|
375
|
+
value: value,
|
|
376
|
+
enumerable: true,
|
|
377
|
+
configurable: true,
|
|
378
|
+
writable: true
|
|
379
|
+
});
|
|
380
|
+
} else {
|
|
381
|
+
obj[key] = value;
|
|
382
|
+
}
|
|
383
|
+
return obj;
|
|
384
|
+
}
|
|
385
|
+
function _toConsumableArray(arr) {
|
|
386
|
+
return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread();
|
|
387
|
+
}
|
|
388
|
+
function _arrayWithoutHoles(arr) {
|
|
389
|
+
if (Array.isArray(arr)) return _arrayLikeToArray(arr);
|
|
390
|
+
}
|
|
391
|
+
function _iterableToArray(iter) {
|
|
392
|
+
if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter);
|
|
393
|
+
}
|
|
394
|
+
function _unsupportedIterableToArray(o, minLen) {
|
|
395
|
+
if (!o) return;
|
|
396
|
+
if (typeof o === "string") return _arrayLikeToArray(o, minLen);
|
|
397
|
+
var n = Object.prototype.toString.call(o).slice(8, -1);
|
|
398
|
+
if (n === "Object" && o.constructor) n = o.constructor.name;
|
|
399
|
+
if (n === "Map" || n === "Set") return Array.from(o);
|
|
400
|
+
if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);
|
|
401
|
+
}
|
|
402
|
+
function _arrayLikeToArray(arr, len) {
|
|
403
|
+
if (len == null || len > arr.length) len = arr.length;
|
|
404
|
+
for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];
|
|
405
|
+
return arr2;
|
|
406
|
+
}
|
|
407
|
+
function _nonIterableSpread() {
|
|
408
|
+
throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
|
|
409
|
+
}
|
|
410
|
+
function _createForOfIteratorHelper(o, allowArrayLike) {
|
|
411
|
+
var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"];
|
|
412
|
+
if (!it) {
|
|
413
|
+
if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike ) {
|
|
414
|
+
if (it) o = it;
|
|
415
|
+
var i = 0;
|
|
416
|
+
var F = function () {};
|
|
417
|
+
return {
|
|
418
|
+
s: F,
|
|
419
|
+
n: function () {
|
|
420
|
+
if (i >= o.length) return {
|
|
421
|
+
done: true
|
|
422
|
+
};
|
|
423
|
+
return {
|
|
424
|
+
done: false,
|
|
425
|
+
value: o[i++]
|
|
426
|
+
};
|
|
427
|
+
},
|
|
428
|
+
e: function (e) {
|
|
429
|
+
throw e;
|
|
430
|
+
},
|
|
431
|
+
f: F
|
|
432
|
+
};
|
|
433
|
+
}
|
|
434
|
+
throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
|
|
435
|
+
}
|
|
436
|
+
var normalCompletion = true,
|
|
437
|
+
didErr = false,
|
|
438
|
+
err;
|
|
439
|
+
return {
|
|
440
|
+
s: function () {
|
|
441
|
+
it = it.call(o);
|
|
442
|
+
},
|
|
443
|
+
n: function () {
|
|
444
|
+
var step = it.next();
|
|
445
|
+
normalCompletion = step.done;
|
|
446
|
+
return step;
|
|
447
|
+
},
|
|
448
|
+
e: function (e) {
|
|
449
|
+
didErr = true;
|
|
450
|
+
err = e;
|
|
451
|
+
},
|
|
452
|
+
f: function () {
|
|
453
|
+
try {
|
|
454
|
+
if (!normalCompletion && it.return != null) it.return();
|
|
455
|
+
} finally {
|
|
456
|
+
if (didErr) throw err;
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
};
|
|
460
|
+
}
|
|
461
|
+
|
|
462
|
+
var createNanoEvents = function createNanoEvents() {
|
|
463
|
+
return {
|
|
464
|
+
emit: function emit(event) {
|
|
465
|
+
for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
|
|
466
|
+
args[_key - 1] = arguments[_key];
|
|
467
|
+
}
|
|
468
|
+
for (var i = 0, callbacks = this.events[event] || [], length = callbacks.length; i < length; i++) {
|
|
469
|
+
callbacks[i].apply(callbacks, args);
|
|
470
|
+
}
|
|
471
|
+
},
|
|
472
|
+
events: {},
|
|
473
|
+
on: function on(event, cb) {
|
|
474
|
+
var _this$events,
|
|
475
|
+
_this = this;
|
|
476
|
+
((_this$events = this.events)[event] || (_this$events[event] = [])).push(cb);
|
|
477
|
+
return function () {
|
|
478
|
+
var _this$events$event;
|
|
479
|
+
_this.events[event] = (_this$events$event = _this.events[event]) === null || _this$events$event === void 0 ? void 0 : _this$events$event.filter(function (i) {
|
|
480
|
+
return cb !== i;
|
|
481
|
+
});
|
|
482
|
+
};
|
|
483
|
+
}
|
|
484
|
+
};
|
|
485
|
+
};
|
|
486
|
+
|
|
487
|
+
var RESOURCE_URL = '/playlist/widget/resource/:regionId/:id';
|
|
488
|
+
var XLF_URL = '/layout/xlf/:layoutId';
|
|
489
|
+
var LAYOUT_BACKGROUND_DOWNLOAD_URL = '/layout/background/:id';
|
|
490
|
+
var LAYOUT_PREVIEW_URL = '/layout/preview/[layoutCode]';
|
|
491
|
+
var LIBRARY_DOWNLOAD_URL = '/library/download/:id';
|
|
492
|
+
var LOADER_URL = '/theme/default/img/loader.gif';
|
|
493
|
+
var platform = {
|
|
494
|
+
getResourceUrl: RESOURCE_URL,
|
|
495
|
+
xlfUrl: XLF_URL,
|
|
496
|
+
layoutBackgroundDownloadUrl: LAYOUT_BACKGROUND_DOWNLOAD_URL,
|
|
497
|
+
layoutPreviewUrl: LAYOUT_PREVIEW_URL,
|
|
498
|
+
libraryDownloadUrl: LIBRARY_DOWNLOAD_URL,
|
|
499
|
+
loaderUrl: LOADER_URL,
|
|
500
|
+
idCounter: 0,
|
|
501
|
+
inPreview: true,
|
|
502
|
+
appHost: null,
|
|
503
|
+
platform: 'CMS'
|
|
504
|
+
};
|
|
505
|
+
|
|
506
|
+
var initialLayout = {
|
|
507
|
+
id: null,
|
|
508
|
+
layoutId: null,
|
|
509
|
+
sw: 0,
|
|
510
|
+
sh: 0,
|
|
511
|
+
xw: 0,
|
|
512
|
+
xh: 0,
|
|
513
|
+
zIndex: 0,
|
|
514
|
+
scaleFactor: 1,
|
|
515
|
+
sWidth: 0,
|
|
516
|
+
sHeight: 0,
|
|
517
|
+
offsetX: 0,
|
|
518
|
+
offsetY: 0,
|
|
519
|
+
bgColor: '',
|
|
520
|
+
bgImage: '',
|
|
521
|
+
bgId: '',
|
|
522
|
+
containerName: '',
|
|
523
|
+
layoutNode: null,
|
|
524
|
+
regionMaxZIndex: 0,
|
|
525
|
+
ready: false,
|
|
526
|
+
regionObjects: [],
|
|
527
|
+
drawer: [],
|
|
528
|
+
allExpired: false,
|
|
529
|
+
regions: [],
|
|
530
|
+
actions: [],
|
|
531
|
+
options: platform,
|
|
532
|
+
done: false,
|
|
533
|
+
allEnded: false,
|
|
534
|
+
path: '',
|
|
535
|
+
prepareLayout: function prepareLayout() {},
|
|
536
|
+
parseXlf: function parseXlf() {},
|
|
537
|
+
run: function run() {},
|
|
538
|
+
on: function on(event, callback) {
|
|
539
|
+
return {};
|
|
540
|
+
},
|
|
541
|
+
regionExpired: function regionExpired() {},
|
|
542
|
+
end: function end() {},
|
|
543
|
+
regionEnded: function regionEnded() {},
|
|
544
|
+
stopAllMedia: function stopAllMedia() {
|
|
545
|
+
return Promise.resolve();
|
|
546
|
+
},
|
|
547
|
+
resetLayout: function resetLayout() {
|
|
548
|
+
return Promise.resolve();
|
|
549
|
+
},
|
|
550
|
+
emitter: {},
|
|
551
|
+
index: -1
|
|
552
|
+
};
|
|
553
|
+
|
|
554
|
+
function nextId(options) {
|
|
555
|
+
if (options.idCounter > 500) {
|
|
556
|
+
options.idCounter = 0;
|
|
557
|
+
}
|
|
558
|
+
options.idCounter = options.idCounter + 1;
|
|
559
|
+
return options.idCounter;
|
|
560
|
+
}
|
|
561
|
+
var getMediaId = function getMediaId(_ref) {
|
|
562
|
+
var mediaType = _ref.mediaType,
|
|
563
|
+
containerName = _ref.containerName;
|
|
564
|
+
var mediaId = containerName;
|
|
565
|
+
if (mediaType === 'video') {
|
|
566
|
+
mediaId = mediaId + '-vid';
|
|
567
|
+
} else if (mediaType === 'audio') {
|
|
568
|
+
mediaId = mediaId + '-aud';
|
|
569
|
+
}
|
|
570
|
+
return mediaId;
|
|
571
|
+
};
|
|
572
|
+
var capitalizeStr = function capitalizeStr(inputStr) {
|
|
573
|
+
if (inputStr === null) {
|
|
574
|
+
return '';
|
|
575
|
+
}
|
|
576
|
+
return String(inputStr).charAt(0).toUpperCase() + String(inputStr).substring(1);
|
|
577
|
+
};
|
|
578
|
+
function getDataBlob(_x) {
|
|
579
|
+
return _getDataBlob.apply(this, arguments);
|
|
580
|
+
}
|
|
581
|
+
function _getDataBlob() {
|
|
582
|
+
_getDataBlob = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(src) {
|
|
583
|
+
return _regeneratorRuntime().wrap(function _callee$(_context) {
|
|
584
|
+
while (1) switch (_context.prev = _context.next) {
|
|
585
|
+
case 0:
|
|
586
|
+
return _context.abrupt("return", fetch(src, {
|
|
587
|
+
mode: 'no-cors'
|
|
588
|
+
}).then(function (res) {
|
|
589
|
+
return res.blob();
|
|
590
|
+
}).then(function (blob) {
|
|
591
|
+
return new Promise(function (res, rej) {
|
|
592
|
+
var reader = new FileReader();
|
|
593
|
+
reader.onloadend = function () {
|
|
594
|
+
return res(reader.result);
|
|
595
|
+
};
|
|
596
|
+
reader.onerror = rej;
|
|
597
|
+
reader.readAsDataURL(blob);
|
|
598
|
+
});
|
|
599
|
+
}));
|
|
600
|
+
case 1:
|
|
601
|
+
case "end":
|
|
602
|
+
return _context.stop();
|
|
603
|
+
}
|
|
604
|
+
}, _callee);
|
|
605
|
+
}));
|
|
606
|
+
return _getDataBlob.apply(this, arguments);
|
|
607
|
+
}
|
|
608
|
+
function preloadMediaBlob(_x2, _x3) {
|
|
609
|
+
return _preloadMediaBlob.apply(this, arguments);
|
|
610
|
+
}
|
|
611
|
+
function _preloadMediaBlob() {
|
|
612
|
+
_preloadMediaBlob = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2(src, type) {
|
|
613
|
+
var res, blob, data;
|
|
614
|
+
return _regeneratorRuntime().wrap(function _callee2$(_context2) {
|
|
615
|
+
while (1) switch (_context2.prev = _context2.next) {
|
|
616
|
+
case 0:
|
|
617
|
+
_context2.next = 2;
|
|
618
|
+
return fetch(src, {
|
|
619
|
+
mode: 'no-cors'
|
|
620
|
+
});
|
|
621
|
+
case 2:
|
|
622
|
+
res = _context2.sent;
|
|
623
|
+
blob = new Blob();
|
|
624
|
+
if (!(type === 'image')) {
|
|
625
|
+
_context2.next = 8;
|
|
626
|
+
break;
|
|
627
|
+
}
|
|
628
|
+
blob = new Blob();
|
|
629
|
+
_context2.next = 19;
|
|
630
|
+
break;
|
|
631
|
+
case 8:
|
|
632
|
+
if (!(type === 'video')) {
|
|
633
|
+
_context2.next = 14;
|
|
634
|
+
break;
|
|
635
|
+
}
|
|
636
|
+
_context2.next = 11;
|
|
637
|
+
return res.blob();
|
|
638
|
+
case 11:
|
|
639
|
+
blob = _context2.sent;
|
|
640
|
+
_context2.next = 19;
|
|
641
|
+
break;
|
|
642
|
+
case 14:
|
|
643
|
+
if (!(type === 'audio')) {
|
|
644
|
+
_context2.next = 19;
|
|
645
|
+
break;
|
|
646
|
+
}
|
|
647
|
+
_context2.next = 17;
|
|
648
|
+
return res.arrayBuffer();
|
|
649
|
+
case 17:
|
|
650
|
+
data = _context2.sent;
|
|
651
|
+
blob = new Blob([data], {
|
|
652
|
+
type: audioFileType(getFileExt(src))
|
|
653
|
+
});
|
|
654
|
+
case 19:
|
|
655
|
+
return _context2.abrupt("return", URL.createObjectURL(blob));
|
|
656
|
+
case 20:
|
|
657
|
+
case "end":
|
|
658
|
+
return _context2.stop();
|
|
659
|
+
}
|
|
660
|
+
}, _callee2);
|
|
661
|
+
}));
|
|
662
|
+
return _preloadMediaBlob.apply(this, arguments);
|
|
663
|
+
}
|
|
664
|
+
function fetchJSON(_x4) {
|
|
665
|
+
return _fetchJSON.apply(this, arguments);
|
|
666
|
+
}
|
|
667
|
+
function _fetchJSON() {
|
|
668
|
+
_fetchJSON = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee3(url) {
|
|
669
|
+
return _regeneratorRuntime().wrap(function _callee3$(_context3) {
|
|
670
|
+
while (1) switch (_context3.prev = _context3.next) {
|
|
671
|
+
case 0:
|
|
672
|
+
return _context3.abrupt("return", fetch(url).then(function (res) {
|
|
673
|
+
return res.json();
|
|
674
|
+
})["catch"](function (err) {
|
|
675
|
+
console.debug(err);
|
|
676
|
+
}));
|
|
677
|
+
case 1:
|
|
678
|
+
case "end":
|
|
679
|
+
return _context3.stop();
|
|
680
|
+
}
|
|
681
|
+
}, _callee3);
|
|
682
|
+
}));
|
|
683
|
+
return _fetchJSON.apply(this, arguments);
|
|
684
|
+
}
|
|
685
|
+
function getFileExt(filename) {
|
|
686
|
+
var filenameArr = String(filename).split('.');
|
|
687
|
+
return filenameArr[filenameArr.length - 1];
|
|
688
|
+
}
|
|
689
|
+
function audioFileType(str) {
|
|
690
|
+
var validAudioTypes = {
|
|
691
|
+
'mp3': 'audio/mp3',
|
|
692
|
+
'wav': 'audio/wav',
|
|
693
|
+
'ogg': 'audio/ogg'
|
|
694
|
+
};
|
|
695
|
+
if (Boolean(validAudioTypes[str])) {
|
|
696
|
+
return validAudioTypes[str];
|
|
697
|
+
}
|
|
698
|
+
return undefined;
|
|
699
|
+
}
|
|
700
|
+
function composeResourceUrlByPlatform(options, params) {
|
|
701
|
+
var resourceUrl = params.regionOptions.getResourceUrl.replace(":regionId", params.regionId).replace(":id", params.mediaId) + '?preview=1&layoutPreview=1';
|
|
702
|
+
if (options.platform === 'chromeOS') {
|
|
703
|
+
var resourceEndpoint = '/required-files/resource/';
|
|
704
|
+
if (!params.isGlobalContent && params.isImageOrVideo) {
|
|
705
|
+
resourceUrl = resourceEndpoint + params.fileId + '?saveAs=' + params.uri;
|
|
706
|
+
}
|
|
707
|
+
} else if (!Boolean(params['mediaType'])) {
|
|
708
|
+
resourceUrl += '&scale_override=' + params.scaleFactor;
|
|
709
|
+
}
|
|
710
|
+
return resourceUrl;
|
|
711
|
+
}
|
|
712
|
+
function composeResourceUrl(options, params) {
|
|
713
|
+
var _options$config, _options$config2, _options$config3;
|
|
714
|
+
var schemaVersion = options && ((_options$config = options.config) === null || _options$config === void 0 ? void 0 : _options$config.schemaVersion);
|
|
715
|
+
var hardwareKey = options && ((_options$config2 = options.config) === null || _options$config2 === void 0 ? void 0 : _options$config2.hardwareKey);
|
|
716
|
+
var serverKey = options && ((_options$config3 = options.config) === null || _options$config3 === void 0 ? void 0 : _options$config3.cmsKey);
|
|
717
|
+
return '/pwa/getResource' + '?v=' + schemaVersion + '&serverKey=' + serverKey + '&hardwareKey=' + hardwareKey + '&layoutId=' + params.layoutId + '®ionId=' + params.regionId + '&mediaId=' + params.mediaId;
|
|
718
|
+
}
|
|
719
|
+
function composeBgUrlByPlatform(platform, params) {
|
|
720
|
+
var bgImageUrl = params.layoutBackgroundDownloadUrl.replace(":id", params.layout.id) + '?preview=1&width=' + params.layout.sWidth + '&height=' + params.layout.sHeight + '&dynamic&proportional=0';
|
|
721
|
+
if (platform === 'chromeOS') {
|
|
722
|
+
bgImageUrl = '/required-files/resource/' + params.layout.id + '?saveAs=' + params.layout.bgImage;
|
|
723
|
+
}
|
|
724
|
+
return bgImageUrl;
|
|
725
|
+
}
|
|
726
|
+
function getIndexByLayoutId(layoutsInput, layoutId) {
|
|
727
|
+
var layoutIndexes = layoutsInput.reduce(function (a, b, indx) {
|
|
728
|
+
a[Number(b.layoutId)] = _objectSpread2(_objectSpread2({}, b), {}, {
|
|
729
|
+
index: indx
|
|
730
|
+
});
|
|
731
|
+
return a;
|
|
732
|
+
}, {});
|
|
733
|
+
if (layoutId === null || !layoutId) {
|
|
734
|
+
return layoutIndexes;
|
|
735
|
+
}
|
|
736
|
+
if (Boolean(layoutIndexes[layoutId])) {
|
|
737
|
+
return layoutIndexes[layoutId];
|
|
738
|
+
}
|
|
739
|
+
// Defaults to 0
|
|
740
|
+
return {
|
|
741
|
+
index: 0
|
|
742
|
+
};
|
|
743
|
+
}
|
|
744
|
+
|
|
745
|
+
var initialRegion = {
|
|
746
|
+
layout: initialLayout,
|
|
747
|
+
id: '',
|
|
748
|
+
regionId: '',
|
|
749
|
+
xml: null,
|
|
750
|
+
mediaObjects: [],
|
|
751
|
+
mediaObjectsActions: [],
|
|
752
|
+
currentMedia: -1,
|
|
753
|
+
complete: false,
|
|
754
|
+
containerName: '',
|
|
755
|
+
ending: false,
|
|
756
|
+
ended: false,
|
|
757
|
+
oneMedia: false,
|
|
758
|
+
oldMedia: undefined,
|
|
759
|
+
curMedia: undefined,
|
|
760
|
+
nxtMedia: undefined,
|
|
761
|
+
currentMediaIndex: 0,
|
|
762
|
+
totalMediaObjects: 0,
|
|
763
|
+
ready: false,
|
|
764
|
+
options: {},
|
|
765
|
+
sWidth: 0,
|
|
766
|
+
sHeight: 0,
|
|
767
|
+
offsetX: 0,
|
|
768
|
+
offsetY: 0,
|
|
769
|
+
zIndex: 0,
|
|
770
|
+
index: -1,
|
|
771
|
+
prepareRegion: function prepareRegion() {},
|
|
772
|
+
playNextMedia: function playNextMedia() {},
|
|
773
|
+
transitionNodes: function transitionNodes() {},
|
|
774
|
+
finished: function finished() {},
|
|
775
|
+
run: function run() {},
|
|
776
|
+
end: function end() {},
|
|
777
|
+
exitTransition: function exitTransition() {},
|
|
778
|
+
exitTransitionComplete: function exitTransitionComplete() {},
|
|
779
|
+
on: function on(event, callback) {
|
|
780
|
+
return {};
|
|
781
|
+
},
|
|
782
|
+
prepareMediaObjects: function prepareMediaObjects() {},
|
|
783
|
+
reset: function reset() {}
|
|
784
|
+
};
|
|
785
|
+
|
|
786
|
+
var initialMedia = {
|
|
787
|
+
region: initialRegion,
|
|
788
|
+
xml: null,
|
|
789
|
+
id: '',
|
|
790
|
+
mediaId: '',
|
|
791
|
+
index: 0,
|
|
792
|
+
idCounter: 0,
|
|
793
|
+
containerName: '',
|
|
794
|
+
html: null,
|
|
795
|
+
iframe: null,
|
|
796
|
+
iframeName: '',
|
|
797
|
+
mediaType: '',
|
|
798
|
+
render: 'html',
|
|
799
|
+
attachedAudio: false,
|
|
800
|
+
singlePlay: false,
|
|
801
|
+
timeoutId: setTimeout(function () {}, 0),
|
|
802
|
+
ready: true,
|
|
803
|
+
checkIframeStatus: false,
|
|
804
|
+
loadIframeOnRun: false,
|
|
805
|
+
tempSrc: '',
|
|
806
|
+
finished: false,
|
|
807
|
+
schemaVersion: '1',
|
|
808
|
+
type: '',
|
|
809
|
+
duration: 0,
|
|
810
|
+
useDuration: Boolean(0),
|
|
811
|
+
fileId: '',
|
|
812
|
+
uri: '',
|
|
813
|
+
options: {},
|
|
814
|
+
divWidth: 0,
|
|
815
|
+
divHeight: 0,
|
|
816
|
+
url: null,
|
|
817
|
+
loop: false,
|
|
818
|
+
run: function run() {},
|
|
819
|
+
init: function init() {},
|
|
820
|
+
stop: function stop() {
|
|
821
|
+
return Promise.resolve();
|
|
822
|
+
},
|
|
823
|
+
on: function on(event, callback) {
|
|
824
|
+
return {};
|
|
825
|
+
},
|
|
826
|
+
emitter: {}
|
|
827
|
+
};
|
|
828
|
+
|
|
829
|
+
/*
|
|
830
|
+
* Copyright (C) 2024 Xibo Signage Ltd
|
|
831
|
+
*
|
|
832
|
+
* Xibo - Digital Signage - https://www.xibosignage.com
|
|
833
|
+
*
|
|
834
|
+
* This file is part of Xibo.
|
|
835
|
+
*
|
|
836
|
+
* Xibo is free software: you can redistribute it and/or modify
|
|
837
|
+
* it under the terms of the GNU Lesser General Public License as published by
|
|
838
|
+
* the Free Software Foundation, either version 3 of the License, or
|
|
839
|
+
* any later version.
|
|
840
|
+
*
|
|
841
|
+
* Xibo is distributed in the hope that it will be useful,
|
|
842
|
+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
843
|
+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
844
|
+
* GNU Lesser General Public License for more details.
|
|
845
|
+
*
|
|
846
|
+
* You should have received a copy of the GNU Lesser General Public License
|
|
847
|
+
* along with Xibo. If not, see <http://www.gnu.org/licenses/>.
|
|
848
|
+
*/
|
|
849
|
+
var defaultTrans = function defaultTrans(duration, trans) {
|
|
850
|
+
var defaultKeyframes = [{
|
|
851
|
+
display: trans === 'in' ? 'none' : 'block'
|
|
852
|
+
}, {
|
|
853
|
+
display: trans === 'out' ? 'none' : 'block'
|
|
854
|
+
}];
|
|
855
|
+
var defaultTiming = {
|
|
856
|
+
duration: duration
|
|
857
|
+
};
|
|
858
|
+
return {
|
|
859
|
+
keyframes: defaultKeyframes,
|
|
860
|
+
timing: defaultTiming
|
|
861
|
+
};
|
|
862
|
+
};
|
|
863
|
+
var fadeInElem = function fadeInElem(duration) {
|
|
864
|
+
var fadeInKeyframes = [{
|
|
865
|
+
opacity: 0
|
|
866
|
+
}, {
|
|
867
|
+
opacity: 1
|
|
868
|
+
}];
|
|
869
|
+
var fadeInTiming = {
|
|
870
|
+
duration: duration,
|
|
871
|
+
fill: 'forwards'
|
|
872
|
+
};
|
|
873
|
+
return {
|
|
874
|
+
keyframes: fadeInKeyframes,
|
|
875
|
+
timing: fadeInTiming
|
|
876
|
+
};
|
|
877
|
+
};
|
|
878
|
+
var fadeOutElem = function fadeOutElem(duration) {
|
|
879
|
+
var fadeOutKeyframes = [{
|
|
880
|
+
opacity: 1
|
|
881
|
+
}, {
|
|
882
|
+
opacity: 0,
|
|
883
|
+
zIndex: -1
|
|
884
|
+
}];
|
|
885
|
+
var fadeOutTiming = {
|
|
886
|
+
duration: duration,
|
|
887
|
+
fill: 'forwards'
|
|
888
|
+
};
|
|
889
|
+
return {
|
|
890
|
+
keyframes: fadeOutKeyframes,
|
|
891
|
+
timing: fadeOutTiming
|
|
892
|
+
};
|
|
893
|
+
};
|
|
894
|
+
var flyInElem = function flyInElem(duration, keyframeOptions, direction) {
|
|
895
|
+
var flyInKeyframes = [{
|
|
896
|
+
opacity: 0
|
|
897
|
+
}, {
|
|
898
|
+
opacity: 1,
|
|
899
|
+
zIndex: 1
|
|
900
|
+
}];
|
|
901
|
+
var flyInTiming = {
|
|
902
|
+
duration: duration,
|
|
903
|
+
fill: 'forwards'
|
|
904
|
+
};
|
|
905
|
+
if (keyframeOptions && Boolean(keyframeOptions.from)) {
|
|
906
|
+
flyInKeyframes[0] = _objectSpread2(_objectSpread2({}, keyframeOptions.from), flyInKeyframes[0]);
|
|
907
|
+
}
|
|
908
|
+
if (keyframeOptions && Boolean(keyframeOptions.to)) {
|
|
909
|
+
flyInKeyframes[1] = _objectSpread2(_objectSpread2({}, keyframeOptions.to), flyInKeyframes[1]);
|
|
910
|
+
}
|
|
911
|
+
return {
|
|
912
|
+
keyframes: flyInKeyframes,
|
|
913
|
+
timing: flyInTiming
|
|
914
|
+
};
|
|
915
|
+
};
|
|
916
|
+
var flyOutElem = function flyOutElem(duration, keyframeOptions, direction) {
|
|
917
|
+
var flyOutKeyframes = [{
|
|
918
|
+
opacity: 1
|
|
919
|
+
}, {
|
|
920
|
+
opacity: 0,
|
|
921
|
+
zIndex: -1
|
|
922
|
+
}];
|
|
923
|
+
var flyOutTiming = {
|
|
924
|
+
duration: duration,
|
|
925
|
+
fill: 'forwards'
|
|
926
|
+
};
|
|
927
|
+
if (keyframeOptions && Boolean(keyframeOptions.from)) {
|
|
928
|
+
flyOutKeyframes[0] = _objectSpread2(_objectSpread2({}, keyframeOptions.from), flyOutKeyframes[0]);
|
|
929
|
+
}
|
|
930
|
+
if (keyframeOptions && Boolean(keyframeOptions.to)) {
|
|
931
|
+
flyOutKeyframes[1] = _objectSpread2(_objectSpread2({}, keyframeOptions.to), flyOutKeyframes[1]);
|
|
932
|
+
}
|
|
933
|
+
return {
|
|
934
|
+
keyframes: flyOutKeyframes,
|
|
935
|
+
timing: flyOutTiming
|
|
936
|
+
};
|
|
937
|
+
};
|
|
938
|
+
var transitionElement = function transitionElement(transition, options) {
|
|
939
|
+
var transitions = {
|
|
940
|
+
fadeIn: fadeInElem(options.duration),
|
|
941
|
+
fadeOut: fadeOutElem(options.duration),
|
|
942
|
+
flyIn: flyInElem(options.duration, options.keyframes, options.direction),
|
|
943
|
+
flyOut: flyOutElem(options.duration, options.keyframes, options.direction),
|
|
944
|
+
defaultIn: defaultTrans(options.duration, 'in'),
|
|
945
|
+
defaultOut: defaultTrans(options.duration, 'out')
|
|
946
|
+
};
|
|
947
|
+
return transitions[transition];
|
|
948
|
+
};
|
|
949
|
+
var flyTransitionKeyframes = function flyTransitionKeyframes(params) {
|
|
950
|
+
var keyframes = {
|
|
951
|
+
from: {},
|
|
952
|
+
to: {}
|
|
953
|
+
};
|
|
954
|
+
var opacityAttr = function opacityAttr(source) {
|
|
955
|
+
if (source === 'from') {
|
|
956
|
+
return params.trans === 'in' ? 0 : 1;
|
|
957
|
+
}
|
|
958
|
+
return params.trans === 'out' ? 1 : 0;
|
|
959
|
+
};
|
|
960
|
+
switch (params.direction) {
|
|
961
|
+
case 'N':
|
|
962
|
+
keyframes.from = {
|
|
963
|
+
opacity: opacityAttr('from'),
|
|
964
|
+
top: params.trans === 'in' ? "".concat(params.height, "px") : 0
|
|
965
|
+
};
|
|
966
|
+
keyframes.to = {
|
|
967
|
+
opacity: opacityAttr('to'),
|
|
968
|
+
top: params.trans === 'in' ? 0 : "-".concat(params.height, "px")
|
|
969
|
+
};
|
|
970
|
+
break;
|
|
971
|
+
case 'NE':
|
|
972
|
+
keyframes.from = {
|
|
973
|
+
opacity: opacityAttr('from'),
|
|
974
|
+
top: params.trans === 'in' ? "".concat(params.height, "px") : 0,
|
|
975
|
+
left: params.trans === 'in' ? "-".concat(params.width, "px") : 0
|
|
976
|
+
};
|
|
977
|
+
keyframes.to = {
|
|
978
|
+
opacity: opacityAttr('to'),
|
|
979
|
+
top: params.trans === 'in' ? 0 : "-".concat(params.height, "px"),
|
|
980
|
+
left: params.trans === 'in' ? 0 : "".concat(params.width, "px")
|
|
981
|
+
};
|
|
982
|
+
break;
|
|
983
|
+
case 'E':
|
|
984
|
+
keyframes.from = {
|
|
985
|
+
opacity: opacityAttr('from'),
|
|
986
|
+
left: params.trans === 'in' ? "-".concat(params.width, "px") : 0
|
|
987
|
+
};
|
|
988
|
+
keyframes.to = {
|
|
989
|
+
opacity: opacityAttr('to'),
|
|
990
|
+
left: params.trans === 'in' ? 0 : "".concat(params.width, "px")
|
|
991
|
+
};
|
|
992
|
+
break;
|
|
993
|
+
case 'SE':
|
|
994
|
+
keyframes.from = {
|
|
995
|
+
opacity: opacityAttr('from'),
|
|
996
|
+
top: params.trans === 'in' ? "-".concat(params.height, "px") : 0,
|
|
997
|
+
left: params.trans === 'in' ? "-".concat(params.width, "px") : 0
|
|
998
|
+
};
|
|
999
|
+
keyframes.to = {
|
|
1000
|
+
opacity: opacityAttr('to'),
|
|
1001
|
+
top: params.trans === 'in' ? 0 : "".concat(params.height, "px"),
|
|
1002
|
+
left: params.trans === 'in' ? 0 : "".concat(params.width, "px")
|
|
1003
|
+
};
|
|
1004
|
+
break;
|
|
1005
|
+
case 'S':
|
|
1006
|
+
keyframes.from = {
|
|
1007
|
+
opacity: opacityAttr('from'),
|
|
1008
|
+
top: params.trans === 'in' ? "-".concat(params.height, "px") : 0
|
|
1009
|
+
};
|
|
1010
|
+
keyframes.to = {
|
|
1011
|
+
opacity: opacityAttr('to'),
|
|
1012
|
+
top: params.trans === 'in' ? 0 : "".concat(params.height, "px")
|
|
1013
|
+
};
|
|
1014
|
+
break;
|
|
1015
|
+
case 'SW':
|
|
1016
|
+
keyframes.from = {
|
|
1017
|
+
opacity: opacityAttr('from'),
|
|
1018
|
+
top: params.trans === 'in' ? "-".concat(params.height, "px") : 0,
|
|
1019
|
+
left: params.trans === 'in' ? "".concat(params.width, "px") : 0
|
|
1020
|
+
};
|
|
1021
|
+
keyframes.to = {
|
|
1022
|
+
opacity: opacityAttr('to'),
|
|
1023
|
+
top: params.trans === 'in' ? 0 : "".concat(params.height, "px"),
|
|
1024
|
+
left: params.trans === 'in' ? 0 : "-".concat(params.width, "px")
|
|
1025
|
+
};
|
|
1026
|
+
break;
|
|
1027
|
+
case 'W':
|
|
1028
|
+
keyframes.from = {
|
|
1029
|
+
opacity: opacityAttr('from'),
|
|
1030
|
+
left: params.trans === 'in' ? "".concat(params.width, "px") : 0
|
|
1031
|
+
};
|
|
1032
|
+
keyframes.to = {
|
|
1033
|
+
opacity: opacityAttr('to'),
|
|
1034
|
+
left: params.trans === 'in' ? 0 : "-".concat(params.width, "px")
|
|
1035
|
+
};
|
|
1036
|
+
break;
|
|
1037
|
+
case 'NW':
|
|
1038
|
+
keyframes.from = {
|
|
1039
|
+
opacity: opacityAttr('from'),
|
|
1040
|
+
top: params.trans === 'in' ? "".concat(params.height, "px") : 0,
|
|
1041
|
+
left: params.trans === 'in' ? "".concat(params.width, "px") : 0
|
|
1042
|
+
};
|
|
1043
|
+
keyframes.to = {
|
|
1044
|
+
opacity: opacityAttr('to'),
|
|
1045
|
+
top: params.trans === 'in' ? 0 : "-".concat(params.height, "px"),
|
|
1046
|
+
left: params.trans === 'in' ? 0 : "-".concat(params.width, "px")
|
|
1047
|
+
};
|
|
1048
|
+
break;
|
|
1049
|
+
default:
|
|
1050
|
+
keyframes.from = {
|
|
1051
|
+
opacity: opacityAttr('from'),
|
|
1052
|
+
top: params.trans === 'in' ? "".concat(params.height, "px") : 0
|
|
1053
|
+
};
|
|
1054
|
+
keyframes.to = {
|
|
1055
|
+
opacity: opacityAttr('to'),
|
|
1056
|
+
top: params.trans === 'in' ? 0 : "-".concat(params.height, "px")
|
|
1057
|
+
};
|
|
1058
|
+
break;
|
|
1059
|
+
}
|
|
1060
|
+
return keyframes;
|
|
1061
|
+
};
|
|
1062
|
+
|
|
1063
|
+
function VideoMedia(media) {
|
|
1064
|
+
var videoMediaObject = {
|
|
1065
|
+
init: function init() {
|
|
1066
|
+
var $videoMedia = document.getElementById(getMediaId(media));
|
|
1067
|
+
if ($videoMedia) {
|
|
1068
|
+
$videoMedia.onloadstart = function () {
|
|
1069
|
+
console.debug("".concat(capitalizeStr(media.mediaType), " for media > ").concat(media.id, " has started loading data . . ."));
|
|
1070
|
+
};
|
|
1071
|
+
$videoMedia.onloadeddata = function () {
|
|
1072
|
+
if ($videoMedia.readyState >= 2) {
|
|
1073
|
+
console.debug("".concat(capitalizeStr(media.mediaType), " data for media > ").concat(media.id, " has been fully loaded . . ."));
|
|
1074
|
+
}
|
|
1075
|
+
};
|
|
1076
|
+
$videoMedia.oncanplay = function () {
|
|
1077
|
+
console.debug("".concat(capitalizeStr(media.mediaType), " for media > ").concat(media.id, " can be played . . ."));
|
|
1078
|
+
var videoPlayPromise = $videoMedia.play();
|
|
1079
|
+
if (videoPlayPromise !== undefined) {
|
|
1080
|
+
videoPlayPromise.then(function () {
|
|
1081
|
+
console.debug('autoplay started . . .');
|
|
1082
|
+
// Autoplay restarted
|
|
1083
|
+
})["catch"](function (error) {
|
|
1084
|
+
$videoMedia.muted = true;
|
|
1085
|
+
$videoMedia.play();
|
|
1086
|
+
});
|
|
1087
|
+
}
|
|
1088
|
+
};
|
|
1089
|
+
$videoMedia.onplaying = function () {
|
|
1090
|
+
console.debug("".concat(capitalizeStr(media.mediaType), " for media > ").concat(media.id, " is now playing . . ."));
|
|
1091
|
+
};
|
|
1092
|
+
if (media.duration === 0) {
|
|
1093
|
+
$videoMedia.ondurationchange = function () {
|
|
1094
|
+
console.debug('Showing Media ' + media.id + ' for ' + $videoMedia.duration + 's of Region ' + media.region.regionId);
|
|
1095
|
+
};
|
|
1096
|
+
$videoMedia.onended = function () {
|
|
1097
|
+
var _media$emitter;
|
|
1098
|
+
console.debug("".concat(capitalizeStr(media.mediaType), " for media > ").concat(media.id, " has ended playing . . ."));
|
|
1099
|
+
(_media$emitter = media.emitter) === null || _media$emitter === void 0 || _media$emitter.emit('end', media);
|
|
1100
|
+
};
|
|
1101
|
+
}
|
|
1102
|
+
}
|
|
1103
|
+
}
|
|
1104
|
+
};
|
|
1105
|
+
return videoMediaObject;
|
|
1106
|
+
}
|
|
1107
|
+
|
|
1108
|
+
function AudioMedia(media) {
|
|
1109
|
+
var audioMediaObject = {
|
|
1110
|
+
init: function init() {
|
|
1111
|
+
var $audioMedia = document.getElementById(getMediaId(media));
|
|
1112
|
+
var $playBtn = null;
|
|
1113
|
+
if ($audioMedia) {
|
|
1114
|
+
$audioMedia.onloadstart = function () {
|
|
1115
|
+
console.debug("".concat(capitalizeStr(media.mediaType), " for media > ").concat(media.id, " has started loading data . . ."));
|
|
1116
|
+
};
|
|
1117
|
+
$audioMedia.onloadeddata = function () {
|
|
1118
|
+
if ($audioMedia.readyState >= 2) {
|
|
1119
|
+
console.debug("".concat(capitalizeStr(media.mediaType), " data for media > ").concat(media.id, " has been fully loaded . . ."));
|
|
1120
|
+
}
|
|
1121
|
+
};
|
|
1122
|
+
$audioMedia.oncanplay = function () {
|
|
1123
|
+
console.debug("".concat(capitalizeStr(media.mediaType), " for media > ").concat(media.id, " can be played . . ."));
|
|
1124
|
+
};
|
|
1125
|
+
$audioMedia.onplaying = function () {
|
|
1126
|
+
console.debug("".concat(capitalizeStr(media.mediaType), " for media > ").concat(media.id, " is now playing . . ."));
|
|
1127
|
+
if ($playBtn !== null) {
|
|
1128
|
+
$playBtn.remove();
|
|
1129
|
+
}
|
|
1130
|
+
};
|
|
1131
|
+
var audioPlayPromise = $audioMedia.play();
|
|
1132
|
+
if (audioPlayPromise !== undefined) {
|
|
1133
|
+
audioPlayPromise.then(function () {
|
|
1134
|
+
console.debug('autoplay started . . .');
|
|
1135
|
+
// Autoplay restarted
|
|
1136
|
+
})["catch"](function (error) {
|
|
1137
|
+
if (error.name === 'NotAllowedError') {
|
|
1138
|
+
var _$audioMedia$parentNo;
|
|
1139
|
+
// Let's show a play audio button
|
|
1140
|
+
$playBtn = document.createElement('button');
|
|
1141
|
+
$playBtn.classList.add('play-audio-btn');
|
|
1142
|
+
$playBtn.textContent = 'Play Audio';
|
|
1143
|
+
$playBtn.addEventListener('click', function () {
|
|
1144
|
+
$audioMedia.muted = false;
|
|
1145
|
+
$audioMedia.play();
|
|
1146
|
+
});
|
|
1147
|
+
(_$audioMedia$parentNo = $audioMedia.parentNode) === null || _$audioMedia$parentNo === void 0 || _$audioMedia$parentNo.insertBefore($playBtn, $audioMedia.nextSibling);
|
|
1148
|
+
}
|
|
1149
|
+
});
|
|
1150
|
+
}
|
|
1151
|
+
if (media.duration === 0) {
|
|
1152
|
+
$audioMedia.ondurationchange = function () {
|
|
1153
|
+
console.debug('Showing Media ' + media.id + ' for ' + $audioMedia.duration + 's of Region ' + media.region.regionId);
|
|
1154
|
+
};
|
|
1155
|
+
$audioMedia.onended = function () {
|
|
1156
|
+
var _media$emitter;
|
|
1157
|
+
console.debug("".concat(capitalizeStr(media.mediaType), " for media > ").concat(media.id, " has ended playing . . ."));
|
|
1158
|
+
(_media$emitter = media.emitter) === null || _media$emitter === void 0 || _media$emitter.emit('end', media);
|
|
1159
|
+
};
|
|
1160
|
+
}
|
|
1161
|
+
}
|
|
1162
|
+
}
|
|
1163
|
+
};
|
|
1164
|
+
return audioMediaObject;
|
|
1165
|
+
}
|
|
1166
|
+
|
|
1167
|
+
function Media(region, mediaId, xml, options, xlr) {
|
|
1168
|
+
var props = {
|
|
1169
|
+
region: region,
|
|
1170
|
+
mediaId: mediaId,
|
|
1171
|
+
xml: xml,
|
|
1172
|
+
options: options
|
|
1173
|
+
};
|
|
1174
|
+
var mediaTimer = null;
|
|
1175
|
+
var mediaTimeCount = 0;
|
|
1176
|
+
var emitter = createNanoEvents();
|
|
1177
|
+
var mediaObject = _objectSpread2(_objectSpread2({}, initialMedia), props);
|
|
1178
|
+
var startMediaTimer = function startMediaTimer(media) {
|
|
1179
|
+
mediaTimer = setInterval(function () {
|
|
1180
|
+
mediaTimeCount++;
|
|
1181
|
+
if (mediaTimeCount > media.duration) {
|
|
1182
|
+
media.emitter.emit('end', media);
|
|
1183
|
+
}
|
|
1184
|
+
}, 1000);
|
|
1185
|
+
console.debug('Showing Media ' + media.id + ' for ' + media.duration + 's of Region ' + media.region.regionId);
|
|
1186
|
+
};
|
|
1187
|
+
emitter.on('start', function (media) {
|
|
1188
|
+
if (media.mediaType === 'video') {
|
|
1189
|
+
VideoMedia(media).init();
|
|
1190
|
+
if (media.duration > 0) {
|
|
1191
|
+
startMediaTimer(media);
|
|
1192
|
+
}
|
|
1193
|
+
} else if (media.mediaType === 'audio') {
|
|
1194
|
+
AudioMedia(media).init();
|
|
1195
|
+
if (media.duration > 0) {
|
|
1196
|
+
startMediaTimer(media);
|
|
1197
|
+
}
|
|
1198
|
+
} else {
|
|
1199
|
+
startMediaTimer(media);
|
|
1200
|
+
}
|
|
1201
|
+
});
|
|
1202
|
+
emitter.on('end', function (media) {
|
|
1203
|
+
if (mediaTimer) {
|
|
1204
|
+
clearInterval(mediaTimer);
|
|
1205
|
+
mediaTimeCount = 0;
|
|
1206
|
+
}
|
|
1207
|
+
media.region.playNextMedia();
|
|
1208
|
+
});
|
|
1209
|
+
mediaObject.on = function (event, callback) {
|
|
1210
|
+
return emitter.on(event, callback);
|
|
1211
|
+
};
|
|
1212
|
+
mediaObject.emitter = emitter;
|
|
1213
|
+
mediaObject.init = function () {
|
|
1214
|
+
var _self$xml, _self$xml2, _self$xml3, _self$xml4, _self$xml5;
|
|
1215
|
+
var self = mediaObject;
|
|
1216
|
+
self.id = props.mediaId;
|
|
1217
|
+
self.fileId = ((_self$xml = self.xml) === null || _self$xml === void 0 ? void 0 : _self$xml.getAttribute('fileId')) || '';
|
|
1218
|
+
self.idCounter = nextId(props.options);
|
|
1219
|
+
self.containerName = "M-".concat(self.id, "-").concat(self.idCounter);
|
|
1220
|
+
self.iframeName = "".concat(self.containerName, "-iframe");
|
|
1221
|
+
self.mediaType = ((_self$xml2 = self.xml) === null || _self$xml2 === void 0 ? void 0 : _self$xml2.getAttribute('type')) || '';
|
|
1222
|
+
self.render = ((_self$xml3 = self.xml) === null || _self$xml3 === void 0 ? void 0 : _self$xml3.getAttribute('render')) || '';
|
|
1223
|
+
self.duration = parseInt((_self$xml4 = self.xml) === null || _self$xml4 === void 0 ? void 0 : _self$xml4.getAttribute('duration')) || 0;
|
|
1224
|
+
self.options = _objectSpread2({}, props.options);
|
|
1225
|
+
var $mediaIframe = document.createElement('iframe');
|
|
1226
|
+
var mediaOptions = (_self$xml5 = self.xml) === null || _self$xml5 === void 0 ? void 0 : _self$xml5.getElementsByTagName('options');
|
|
1227
|
+
if (mediaOptions) {
|
|
1228
|
+
for (var _i = 0, _Array$from = Array.from(mediaOptions); _i < _Array$from.length; _i++) {
|
|
1229
|
+
var _options = _Array$from[_i];
|
|
1230
|
+
// Get options
|
|
1231
|
+
var _mediaOptions = _options.children;
|
|
1232
|
+
for (var _i2 = 0, _Array$from2 = Array.from(_mediaOptions); _i2 < _Array$from2.length; _i2++) {
|
|
1233
|
+
var mediaOption = _Array$from2[_i2];
|
|
1234
|
+
self.options[mediaOption.nodeName.toLowerCase()] = mediaOption.textContent;
|
|
1235
|
+
}
|
|
1236
|
+
}
|
|
1237
|
+
}
|
|
1238
|
+
// Check for options.uri and add it to media
|
|
1239
|
+
if (Boolean(self.options['uri'])) {
|
|
1240
|
+
self.uri = self.options['uri'];
|
|
1241
|
+
}
|
|
1242
|
+
// Show in fullscreen?
|
|
1243
|
+
if (self.options.showfullscreen === "1") {
|
|
1244
|
+
// Set dimensions as the layout ones
|
|
1245
|
+
self.divWidth = self.region.layout.sWidth;
|
|
1246
|
+
self.divHeight = self.region.layout.sHeight;
|
|
1247
|
+
} else {
|
|
1248
|
+
// Set dimensions as the region ones
|
|
1249
|
+
self.divWidth = self.region.sWidth;
|
|
1250
|
+
self.divHeight = self.region.sHeight;
|
|
1251
|
+
}
|
|
1252
|
+
$mediaIframe.scrolling = 'no';
|
|
1253
|
+
$mediaIframe.id = self.iframeName;
|
|
1254
|
+
$mediaIframe.width = "".concat(self.divWidth, "px");
|
|
1255
|
+
$mediaIframe.height = "".concat(self.divHeight, "px");
|
|
1256
|
+
$mediaIframe.style.cssText = "border: 0;";
|
|
1257
|
+
var $mediaId = getMediaId(self);
|
|
1258
|
+
var $media = document.getElementById($mediaId);
|
|
1259
|
+
if ($media === null) {
|
|
1260
|
+
if (self.mediaType === 'video') {
|
|
1261
|
+
$media = document.createElement('video');
|
|
1262
|
+
} else if (self.mediaType === 'audio') {
|
|
1263
|
+
$media = new Audio();
|
|
1264
|
+
} else {
|
|
1265
|
+
$media = document.createElement('div');
|
|
1266
|
+
}
|
|
1267
|
+
$media.id = $mediaId;
|
|
1268
|
+
}
|
|
1269
|
+
$media.className = 'media--item';
|
|
1270
|
+
/* Scale the Content Container */
|
|
1271
|
+
$media.style.cssText = "\n display: none;\n width: ".concat(self.divWidth, "px;\n height: ").concat(self.divHeight, "px;\n position: absolute;\n background-size: contain;\n background-repeat: no-repeat;\n background-position: center;\n ");
|
|
1272
|
+
document.getElementById("".concat(self.region.containerName));
|
|
1273
|
+
var resourceUrlParams = _objectSpread2(_objectSpread2({}, xlr.config.config), {}, {
|
|
1274
|
+
regionOptions: self.region.options,
|
|
1275
|
+
layoutId: self.region.layout.layoutId,
|
|
1276
|
+
regionId: self.region.id,
|
|
1277
|
+
mediaId: self.id,
|
|
1278
|
+
fileId: self.fileId,
|
|
1279
|
+
scaleFactor: self.region.layout.scaleFactor,
|
|
1280
|
+
uri: self.uri,
|
|
1281
|
+
isGlobalContent: self.mediaType === 'global',
|
|
1282
|
+
isImageOrVideo: self.mediaType === 'image' || self.mediaType === 'video'
|
|
1283
|
+
});
|
|
1284
|
+
if (self.mediaType === 'image' || self.mediaType === 'video') {
|
|
1285
|
+
resourceUrlParams.mediaType = self.mediaType;
|
|
1286
|
+
}
|
|
1287
|
+
var tmpUrl = '';
|
|
1288
|
+
if (xlr.config.platform === 'CMS') {
|
|
1289
|
+
tmpUrl = composeResourceUrlByPlatform(xlr.config, resourceUrlParams);
|
|
1290
|
+
} else if (xlr.config.platform === 'chromeOS') {
|
|
1291
|
+
tmpUrl = composeResourceUrl(xlr.config, resourceUrlParams);
|
|
1292
|
+
}
|
|
1293
|
+
self.url = tmpUrl;
|
|
1294
|
+
// Loop if media has loop, or if region has loop and a single media
|
|
1295
|
+
self.loop = self.options['loop'] == '1' || self.region.options['loop'] == '1' && self.region.totalMediaObjects == 1;
|
|
1296
|
+
if (self.render === 'html' || self.render === 'webpage') {
|
|
1297
|
+
$mediaIframe.src = self.url;
|
|
1298
|
+
} else {
|
|
1299
|
+
$mediaIframe.src = "".concat(self.url, "&width=").concat(self.divWidth, "&height=").concat(self.divHeight);
|
|
1300
|
+
}
|
|
1301
|
+
// Check/set iframe based widgets play status
|
|
1302
|
+
// Populate mediaIframe content without using src attribute
|
|
1303
|
+
// let iframeSrc = tmpUrl;
|
|
1304
|
+
//
|
|
1305
|
+
// if (self.render !== 'html' && self.render !== 'webpage') {
|
|
1306
|
+
// iframeSrc = `${tmpUrl}&width=${self.divWidth}&height=${self.divHeight}`;
|
|
1307
|
+
// }
|
|
1308
|
+
//
|
|
1309
|
+
// if (self.render === 'html' || self.render === 'webpage') {
|
|
1310
|
+
// if (xlr.config.platform === 'CMS') {
|
|
1311
|
+
// $mediaIframe.src = iframeSrc;
|
|
1312
|
+
// } else if (xlr.config.platform === 'chromeOS') {
|
|
1313
|
+
// (async () => {
|
|
1314
|
+
// const mediaHtml = await fetchText(iframeSrc);
|
|
1315
|
+
//
|
|
1316
|
+
// if ($mediaIframe) {
|
|
1317
|
+
// $mediaIframe.contentDocument?.open();
|
|
1318
|
+
// $mediaIframe.contentDocument?.write(mediaHtml);
|
|
1319
|
+
// $mediaIframe.contentDocument?.close();
|
|
1320
|
+
// }
|
|
1321
|
+
// })();
|
|
1322
|
+
// }
|
|
1323
|
+
// }
|
|
1324
|
+
if (self.render === 'html' || self.mediaType === 'ticker' || self.mediaType === 'webpage') {
|
|
1325
|
+
self.checkIframeStatus = true;
|
|
1326
|
+
self.iframe = $mediaIframe;
|
|
1327
|
+
} else if (self.mediaType === "image") {
|
|
1328
|
+
if (self.options['scaletype'] === 'stretch') {
|
|
1329
|
+
$media.style.cssText = $media.style.cssText.concat("background-size: 100% 100%;");
|
|
1330
|
+
} else if (self.options['scaletype'] === 'fit') {
|
|
1331
|
+
$media.style.cssText = $media.style.cssText.concat("background-size: cover;");
|
|
1332
|
+
} else {
|
|
1333
|
+
// Center scale type, do we have align or valign?
|
|
1334
|
+
var align = self.options['align'] == "" ? "center" : self.options['align'];
|
|
1335
|
+
var valign = self.options['valign'] == "" || self.options['valign'] == "middle" ? "center" : self.options['valign'];
|
|
1336
|
+
$media.style.cssText = $media.style.cssText.concat("background-position: ".concat(align, " ").concat(valign));
|
|
1337
|
+
}
|
|
1338
|
+
} else if (self.mediaType === 'video') {
|
|
1339
|
+
var $videoMedia = $media;
|
|
1340
|
+
$videoMedia.preload = 'auto';
|
|
1341
|
+
$videoMedia.textContent = 'Unsupported Video';
|
|
1342
|
+
if (Boolean(self.options['mute'])) {
|
|
1343
|
+
$videoMedia.muted = self.options.mute === '1';
|
|
1344
|
+
}
|
|
1345
|
+
if (Boolean(self.options['scaletype'])) {
|
|
1346
|
+
if (self.options.scaletype === 'stretch') {
|
|
1347
|
+
$videoMedia.style.objectFit = 'fill';
|
|
1348
|
+
}
|
|
1349
|
+
}
|
|
1350
|
+
$videoMedia.playsInline = true;
|
|
1351
|
+
if (self.loop) {
|
|
1352
|
+
$videoMedia.loop = true;
|
|
1353
|
+
}
|
|
1354
|
+
$media = $videoMedia;
|
|
1355
|
+
} else if (self.mediaType === 'audio') {
|
|
1356
|
+
var $audioMedia = $media;
|
|
1357
|
+
$audioMedia.preload = 'auto';
|
|
1358
|
+
$audioMedia.textContent = 'Unsupported Audio';
|
|
1359
|
+
$audioMedia.autoplay = true;
|
|
1360
|
+
if (self.loop) {
|
|
1361
|
+
$audioMedia.loop = true;
|
|
1362
|
+
}
|
|
1363
|
+
$media = $audioMedia;
|
|
1364
|
+
}
|
|
1365
|
+
// Duration is per item condition
|
|
1366
|
+
if (self.render === 'html' || self.mediaType === 'ticker') {
|
|
1367
|
+
/* Check if the ticker duration is based on the number of items in the feed */
|
|
1368
|
+
if (self.options['durationisperitem'] === '1') {
|
|
1369
|
+
var regex = new RegExp('<!-- NUMITEMS=(.*?) -->');
|
|
1370
|
+
_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee() {
|
|
1371
|
+
var html, res;
|
|
1372
|
+
return _regeneratorRuntime().wrap(function _callee$(_context) {
|
|
1373
|
+
while (1) switch (_context.prev = _context.next) {
|
|
1374
|
+
case 0:
|
|
1375
|
+
_context.next = 2;
|
|
1376
|
+
return fetchJSON("".concat(tmpUrl, "&width=").concat(self.divWidth, "&height=").concat(self.divHeight));
|
|
1377
|
+
case 2:
|
|
1378
|
+
html = _context.sent;
|
|
1379
|
+
console.debug({
|
|
1380
|
+
html: html
|
|
1381
|
+
});
|
|
1382
|
+
res = regex.exec(html);
|
|
1383
|
+
if (res !== null) {
|
|
1384
|
+
self.duration = parseInt(String(self.duration)) * parseInt(res[1]);
|
|
1385
|
+
}
|
|
1386
|
+
case 6:
|
|
1387
|
+
case "end":
|
|
1388
|
+
return _context.stop();
|
|
1389
|
+
}
|
|
1390
|
+
}, _callee);
|
|
1391
|
+
}))();
|
|
1392
|
+
}
|
|
1393
|
+
}
|
|
1394
|
+
// Check if the media has fade-in/out transitions
|
|
1395
|
+
if (Boolean(self.options['transin']) && Boolean(self.options['transinduration'])) {
|
|
1396
|
+
var transInDuration = Number(self.options.transinduration);
|
|
1397
|
+
var fadeInTrans = transitionElement('fadeIn', {
|
|
1398
|
+
duration: transInDuration
|
|
1399
|
+
});
|
|
1400
|
+
$media.animate(fadeInTrans.keyframes, fadeInTrans.timing);
|
|
1401
|
+
}
|
|
1402
|
+
// Add media to the region
|
|
1403
|
+
// Second media if exists, will be off-canvas
|
|
1404
|
+
// All added media will be hidden by default
|
|
1405
|
+
// It will start showing when region.nextMedia() function is called
|
|
1406
|
+
// When there's only 1 item and loop = false, don't remove the item but leave it at its last state
|
|
1407
|
+
// For image, and only 1 item, it should still have the transition for next state
|
|
1408
|
+
// Add conditions for video duration being 0 or 1 and also the loop property
|
|
1409
|
+
// For video url, we have to create a URL out of the XLF video URL
|
|
1410
|
+
/**
|
|
1411
|
+
* @DONE
|
|
1412
|
+
* Case 1: Video duration = 0, this will play the video for its entire duration
|
|
1413
|
+
* Case 2: Video duration is set > 0 and loop = false
|
|
1414
|
+
* E.g. Set duration = 100s, video duration = 62s
|
|
1415
|
+
* the video will play until 62s and will stop to its last frame until 100s
|
|
1416
|
+
* After 100s, it will expire
|
|
1417
|
+
* Case 3: Video duration is set > 0 and loop = true
|
|
1418
|
+
* E.g. Set duration = 100s, video duration = 62s, loop = true
|
|
1419
|
+
* the video will play until 62s and will loop through until the remaining 38s
|
|
1420
|
+
* to complete the 100s set duration
|
|
1421
|
+
*/
|
|
1422
|
+
// Add html node to media for
|
|
1423
|
+
self.html = $media;
|
|
1424
|
+
};
|
|
1425
|
+
mediaObject.run = function () {
|
|
1426
|
+
var self = this;
|
|
1427
|
+
var transInDuration = 1;
|
|
1428
|
+
var transInDirection = 'E';
|
|
1429
|
+
if (Boolean(self.options['transinduration'])) {
|
|
1430
|
+
transInDuration = Number(self.options.transinduration);
|
|
1431
|
+
}
|
|
1432
|
+
if (Boolean(self.options['transindirection'])) {
|
|
1433
|
+
transInDirection = self.options.transindirection;
|
|
1434
|
+
}
|
|
1435
|
+
var defaultTransInOptions = {
|
|
1436
|
+
duration: transInDuration
|
|
1437
|
+
};
|
|
1438
|
+
var transIn = transitionElement('defaultIn', {
|
|
1439
|
+
duration: defaultTransInOptions.duration
|
|
1440
|
+
});
|
|
1441
|
+
if (Boolean(self.options['transin'])) {
|
|
1442
|
+
var transInName = self.options['transin'];
|
|
1443
|
+
if (transInName === 'fly') {
|
|
1444
|
+
transInName = "".concat(transInName, "In");
|
|
1445
|
+
defaultTransInOptions.keyframes = flyTransitionKeyframes({
|
|
1446
|
+
trans: 'in',
|
|
1447
|
+
direction: transInDirection,
|
|
1448
|
+
height: self.divHeight,
|
|
1449
|
+
width: self.divWidth
|
|
1450
|
+
});
|
|
1451
|
+
}
|
|
1452
|
+
transIn = transitionElement(transInName, defaultTransInOptions);
|
|
1453
|
+
}
|
|
1454
|
+
var showCurrentMedia = /*#__PURE__*/function () {
|
|
1455
|
+
var _ref2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2() {
|
|
1456
|
+
var $mediaId, $media, isCMS;
|
|
1457
|
+
return _regeneratorRuntime().wrap(function _callee2$(_context2) {
|
|
1458
|
+
while (1) switch (_context2.prev = _context2.next) {
|
|
1459
|
+
case 0:
|
|
1460
|
+
$mediaId = getMediaId(self);
|
|
1461
|
+
$media = document.getElementById($mediaId);
|
|
1462
|
+
isCMS = xlr.config.platform === 'CMS';
|
|
1463
|
+
if (!$media) {
|
|
1464
|
+
$media = getNewMedia();
|
|
1465
|
+
}
|
|
1466
|
+
if (!$media) {
|
|
1467
|
+
_context2.next = 41;
|
|
1468
|
+
break;
|
|
1469
|
+
}
|
|
1470
|
+
$media.style.setProperty('display', 'block');
|
|
1471
|
+
if (Boolean(self.options['transin'])) {
|
|
1472
|
+
$media.animate(transIn.keyframes, transIn.timing);
|
|
1473
|
+
}
|
|
1474
|
+
if (!(self.mediaType === 'image' && self.url !== null)) {
|
|
1475
|
+
_context2.next = 22;
|
|
1476
|
+
break;
|
|
1477
|
+
}
|
|
1478
|
+
_context2.t0 = $media.style;
|
|
1479
|
+
_context2.t1 = "url(";
|
|
1480
|
+
if (isCMS) {
|
|
1481
|
+
_context2.next = 14;
|
|
1482
|
+
break;
|
|
1483
|
+
}
|
|
1484
|
+
_context2.t2 = self.url;
|
|
1485
|
+
_context2.next = 17;
|
|
1486
|
+
break;
|
|
1487
|
+
case 14:
|
|
1488
|
+
_context2.next = 16;
|
|
1489
|
+
return getDataBlob(self.url);
|
|
1490
|
+
case 16:
|
|
1491
|
+
_context2.t2 = _context2.sent;
|
|
1492
|
+
case 17:
|
|
1493
|
+
_context2.t3 = _context2.t2;
|
|
1494
|
+
_context2.t4 = _context2.t1.concat.call(_context2.t1, _context2.t3);
|
|
1495
|
+
_context2.t0.setProperty.call(_context2.t0, 'background-image', _context2.t4);
|
|
1496
|
+
_context2.next = 40;
|
|
1497
|
+
break;
|
|
1498
|
+
case 22:
|
|
1499
|
+
if (!(self.mediaType === 'video' && self.url !== null)) {
|
|
1500
|
+
_context2.next = 28;
|
|
1501
|
+
break;
|
|
1502
|
+
}
|
|
1503
|
+
_context2.next = 25;
|
|
1504
|
+
return preloadMediaBlob(self.url, self.mediaType);
|
|
1505
|
+
case 25:
|
|
1506
|
+
$media.src = _context2.sent;
|
|
1507
|
+
_context2.next = 40;
|
|
1508
|
+
break;
|
|
1509
|
+
case 28:
|
|
1510
|
+
if (!(self.mediaType === 'audio' && self.url !== null)) {
|
|
1511
|
+
_context2.next = 39;
|
|
1512
|
+
break;
|
|
1513
|
+
}
|
|
1514
|
+
if (!isCMS) {
|
|
1515
|
+
_context2.next = 35;
|
|
1516
|
+
break;
|
|
1517
|
+
}
|
|
1518
|
+
_context2.next = 32;
|
|
1519
|
+
return preloadMediaBlob(self.url, self.mediaType);
|
|
1520
|
+
case 32:
|
|
1521
|
+
_context2.t5 = _context2.sent;
|
|
1522
|
+
_context2.next = 36;
|
|
1523
|
+
break;
|
|
1524
|
+
case 35:
|
|
1525
|
+
_context2.t5 = self.url;
|
|
1526
|
+
case 36:
|
|
1527
|
+
$media.src = _context2.t5;
|
|
1528
|
+
_context2.next = 40;
|
|
1529
|
+
break;
|
|
1530
|
+
case 39:
|
|
1531
|
+
if ((self.render === 'html' || self.mediaType === 'webpage') && self.iframe && self.checkIframeStatus) {
|
|
1532
|
+
// Set state as false ( for now )
|
|
1533
|
+
self.ready = false;
|
|
1534
|
+
// Append iframe
|
|
1535
|
+
$media.innerHTML = '';
|
|
1536
|
+
$media.appendChild(self.iframe);
|
|
1537
|
+
// On iframe load, set state as ready to play full preview
|
|
1538
|
+
// (self.iframe) && self.iframe.addEventListener('load', function(){
|
|
1539
|
+
// self.ready = true;
|
|
1540
|
+
// if (self.iframe) {
|
|
1541
|
+
// const iframeStyles = self.iframe.style.cssText;
|
|
1542
|
+
// self.iframe.style.cssText = iframeStyles?.concat('visibility: visible;');
|
|
1543
|
+
// }
|
|
1544
|
+
// });
|
|
1545
|
+
}
|
|
1546
|
+
case 40:
|
|
1547
|
+
self.emitter.emit('start', self);
|
|
1548
|
+
case 41:
|
|
1549
|
+
case "end":
|
|
1550
|
+
return _context2.stop();
|
|
1551
|
+
}
|
|
1552
|
+
}, _callee2);
|
|
1553
|
+
}));
|
|
1554
|
+
return function showCurrentMedia() {
|
|
1555
|
+
return _ref2.apply(this, arguments);
|
|
1556
|
+
};
|
|
1557
|
+
}();
|
|
1558
|
+
var getNewMedia = function getNewMedia() {
|
|
1559
|
+
var $region = document.getElementById("".concat(self.region.containerName));
|
|
1560
|
+
// This function is for checking whether
|
|
1561
|
+
// the region still has to show a media item
|
|
1562
|
+
// when another region is not finished yet
|
|
1563
|
+
if (self.region.complete && !self.region.layout.allEnded) {
|
|
1564
|
+
// Add currentMedia to the region
|
|
1565
|
+
$region && $region.insertBefore(self.html, $region.lastElementChild);
|
|
1566
|
+
return self.html;
|
|
1567
|
+
}
|
|
1568
|
+
return null;
|
|
1569
|
+
};
|
|
1570
|
+
showCurrentMedia();
|
|
1571
|
+
};
|
|
1572
|
+
mediaObject.stop = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee3() {
|
|
1573
|
+
var self, $media;
|
|
1574
|
+
return _regeneratorRuntime().wrap(function _callee3$(_context3) {
|
|
1575
|
+
while (1) switch (_context3.prev = _context3.next) {
|
|
1576
|
+
case 0:
|
|
1577
|
+
self = mediaObject;
|
|
1578
|
+
$media = document.getElementById(getMediaId(self));
|
|
1579
|
+
if ($media) {
|
|
1580
|
+
$media.style.display = 'none';
|
|
1581
|
+
$media.remove();
|
|
1582
|
+
}
|
|
1583
|
+
case 3:
|
|
1584
|
+
case "end":
|
|
1585
|
+
return _context3.stop();
|
|
1586
|
+
}
|
|
1587
|
+
}, _callee3);
|
|
1588
|
+
}));
|
|
1589
|
+
mediaObject.init();
|
|
1590
|
+
return mediaObject;
|
|
1591
|
+
}
|
|
1592
|
+
|
|
1593
|
+
function Region(layout, xml, regionId, options, xlr) {
|
|
1594
|
+
var props = {
|
|
1595
|
+
layout: layout,
|
|
1596
|
+
xml: xml,
|
|
1597
|
+
regionId: regionId,
|
|
1598
|
+
options: options
|
|
1599
|
+
};
|
|
1600
|
+
var emitter = createNanoEvents();
|
|
1601
|
+
var regionObject = _objectSpread2(_objectSpread2({}, initialRegion), props);
|
|
1602
|
+
regionObject.prepareRegion = function () {
|
|
1603
|
+
var _self$xml, _self$xml2, _self$xml3, _self$xml4, _self$xml5, _self$xml6;
|
|
1604
|
+
var self = regionObject;
|
|
1605
|
+
var layout = self.layout,
|
|
1606
|
+
options = self.options;
|
|
1607
|
+
self.complete = false;
|
|
1608
|
+
self.ending = false;
|
|
1609
|
+
self.ended = false;
|
|
1610
|
+
self.id = props.regionId;
|
|
1611
|
+
self.options = _objectSpread2(_objectSpread2({}, platform), props.options);
|
|
1612
|
+
self.containerName = "R-".concat(self.id, "-").concat(nextId(self.options));
|
|
1613
|
+
self.xml = props.xml;
|
|
1614
|
+
self.mediaObjects = [];
|
|
1615
|
+
self.sWidth = self.xml && Number((_self$xml = self.xml) === null || _self$xml === void 0 ? void 0 : _self$xml.getAttribute('width')) * layout.scaleFactor;
|
|
1616
|
+
self.sHeight = self.xml && Number((_self$xml2 = self.xml) === null || _self$xml2 === void 0 ? void 0 : _self$xml2.getAttribute('height')) * layout.scaleFactor;
|
|
1617
|
+
self.offsetX = self.xml && Number((_self$xml3 = self.xml) === null || _self$xml3 === void 0 ? void 0 : _self$xml3.getAttribute('left')) * layout.scaleFactor;
|
|
1618
|
+
self.offsetY = self.xml && Number((_self$xml4 = self.xml) === null || _self$xml4 === void 0 ? void 0 : _self$xml4.getAttribute('top')) * layout.scaleFactor;
|
|
1619
|
+
self.zIndex = self.xml && Number((_self$xml5 = self.xml) === null || _self$xml5 === void 0 ? void 0 : _self$xml5.getAttribute('zindex'));
|
|
1620
|
+
var regionOptions = (_self$xml6 = self.xml) === null || _self$xml6 === void 0 ? void 0 : _self$xml6.getElementsByTagName('options');
|
|
1621
|
+
if (regionOptions) {
|
|
1622
|
+
for (var _i = 0, _Array$from = Array.from(regionOptions); _i < _Array$from.length; _i++) {
|
|
1623
|
+
var _options = _Array$from[_i];
|
|
1624
|
+
// Get options
|
|
1625
|
+
var _regionOptions = _options.children;
|
|
1626
|
+
for (var _i2 = 0, _Array$from2 = Array.from(_regionOptions); _i2 < _Array$from2.length; _i2++) {
|
|
1627
|
+
var regionOption = _Array$from2[_i2];
|
|
1628
|
+
self.options[regionOption.nodeName.toLowerCase()] = regionOption.textContent;
|
|
1629
|
+
}
|
|
1630
|
+
}
|
|
1631
|
+
}
|
|
1632
|
+
var $region = document.getElementById(self.containerName);
|
|
1633
|
+
var $layout = document.getElementById("".concat(self.layout.containerName));
|
|
1634
|
+
if ($region === null) {
|
|
1635
|
+
$region = document.createElement('div');
|
|
1636
|
+
$region.id = self.containerName;
|
|
1637
|
+
}
|
|
1638
|
+
$layout && $layout.appendChild($region);
|
|
1639
|
+
/* Scale the Layout Container */
|
|
1640
|
+
/* Add region styles */
|
|
1641
|
+
$region.style.cssText = "\n width: ".concat(self.sWidth, "px;\n height: ").concat(self.sHeight, "px;\n position: absolute;\n left: ").concat(self.offsetX, "px;\n top: ").concat(self.offsetY, "px;\n z-index: ").concat(Math.round(self.zIndex), ";\n ");
|
|
1642
|
+
$region.className = 'region--item';
|
|
1643
|
+
/* Parse region media objects */
|
|
1644
|
+
var regionMediaItems = Array.from(self.xml.getElementsByTagName('media'));
|
|
1645
|
+
self.totalMediaObjects = regionMediaItems.length;
|
|
1646
|
+
Array.from(regionMediaItems).forEach(function (mediaXml, indx) {
|
|
1647
|
+
var mediaObj = Media(self, (mediaXml === null || mediaXml === void 0 ? void 0 : mediaXml.getAttribute('id')) || '', mediaXml, options, xlr);
|
|
1648
|
+
mediaObj.index = indx;
|
|
1649
|
+
self.mediaObjects.push(mediaObj);
|
|
1650
|
+
});
|
|
1651
|
+
self.prepareMediaObjects();
|
|
1652
|
+
};
|
|
1653
|
+
regionObject.finished = function () {
|
|
1654
|
+
var self = regionObject;
|
|
1655
|
+
console.debug('Region::finished called . . . ', self.id);
|
|
1656
|
+
// Mark as complete
|
|
1657
|
+
self.complete = true;
|
|
1658
|
+
self.layout.regions[regionObject.index] = regionObject;
|
|
1659
|
+
self.layout.regionExpired();
|
|
1660
|
+
};
|
|
1661
|
+
regionObject.prepareMediaObjects = function () {
|
|
1662
|
+
var self = regionObject;
|
|
1663
|
+
var nextMediaIndex;
|
|
1664
|
+
if (self.mediaObjects.length > 0) {
|
|
1665
|
+
if (self.curMedia) {
|
|
1666
|
+
self.oldMedia = self.curMedia;
|
|
1667
|
+
} else {
|
|
1668
|
+
self.oldMedia = undefined;
|
|
1669
|
+
}
|
|
1670
|
+
if (self.currentMediaIndex >= self.mediaObjects.length) {
|
|
1671
|
+
self.currentMediaIndex = 0;
|
|
1672
|
+
}
|
|
1673
|
+
self.curMedia = self.mediaObjects[self.currentMediaIndex];
|
|
1674
|
+
nextMediaIndex = self.currentMediaIndex + 1;
|
|
1675
|
+
if (nextMediaIndex >= self.mediaObjects.length || !Boolean(self.mediaObjects[nextMediaIndex]) && self.mediaObjects.length === 1) {
|
|
1676
|
+
nextMediaIndex = 0;
|
|
1677
|
+
}
|
|
1678
|
+
if (Boolean(self.mediaObjects[nextMediaIndex])) {
|
|
1679
|
+
self.nxtMedia = self.mediaObjects[nextMediaIndex];
|
|
1680
|
+
}
|
|
1681
|
+
var $region = document.getElementById("".concat(self.containerName));
|
|
1682
|
+
// Append available media to region DOM
|
|
1683
|
+
if (self.curMedia) {
|
|
1684
|
+
$region && $region.insertBefore(self.curMedia.html, $region.lastElementChild);
|
|
1685
|
+
}
|
|
1686
|
+
if (self.nxtMedia) {
|
|
1687
|
+
$region && $region.insertBefore(self.nxtMedia.html, $region.lastElementChild);
|
|
1688
|
+
}
|
|
1689
|
+
}
|
|
1690
|
+
};
|
|
1691
|
+
regionObject.run = function () {
|
|
1692
|
+
console.debug('Called Region::run > ', regionObject.id);
|
|
1693
|
+
// Reset region states
|
|
1694
|
+
regionObject.reset();
|
|
1695
|
+
if (regionObject.curMedia) {
|
|
1696
|
+
regionObject.transitionNodes(regionObject.oldMedia, regionObject.curMedia);
|
|
1697
|
+
}
|
|
1698
|
+
};
|
|
1699
|
+
regionObject.transitionNodes = function (oldMedia, newMedia) {
|
|
1700
|
+
var self = regionObject;
|
|
1701
|
+
var transOutDuration = 1;
|
|
1702
|
+
var transOutDirection = 'E';
|
|
1703
|
+
if (newMedia) {
|
|
1704
|
+
if (oldMedia && Boolean(oldMedia.options['transoutduration'])) {
|
|
1705
|
+
transOutDuration = Number(oldMedia.options.transoutduration);
|
|
1706
|
+
}
|
|
1707
|
+
if (oldMedia && Boolean(oldMedia.options['transoutdirection'])) {
|
|
1708
|
+
transOutDirection = oldMedia.options.transoutdirection;
|
|
1709
|
+
}
|
|
1710
|
+
var defaultTransOutOptions = {
|
|
1711
|
+
duration: transOutDuration
|
|
1712
|
+
};
|
|
1713
|
+
var transOut = transitionElement('defaultOut', {
|
|
1714
|
+
duration: defaultTransOutOptions.duration
|
|
1715
|
+
});
|
|
1716
|
+
var transOutName;
|
|
1717
|
+
if (oldMedia && Boolean(oldMedia.options['transout'])) {
|
|
1718
|
+
transOutName = oldMedia.options['transout'];
|
|
1719
|
+
if (transOutName === 'fly') {
|
|
1720
|
+
transOutName = "".concat(transOutName, "Out");
|
|
1721
|
+
defaultTransOutOptions.keyframes = flyTransitionKeyframes({
|
|
1722
|
+
trans: 'out',
|
|
1723
|
+
direction: transOutDirection,
|
|
1724
|
+
height: oldMedia.divHeight,
|
|
1725
|
+
width: oldMedia.divWidth
|
|
1726
|
+
});
|
|
1727
|
+
}
|
|
1728
|
+
transOut = transitionElement(transOutName, defaultTransOutOptions);
|
|
1729
|
+
}
|
|
1730
|
+
var hideOldMedia = new Promise(function (resolve) {
|
|
1731
|
+
// Hide oldMedia
|
|
1732
|
+
if (oldMedia) {
|
|
1733
|
+
var $oldMedia = document.getElementById(getMediaId(oldMedia));
|
|
1734
|
+
if ($oldMedia) {
|
|
1735
|
+
var removeOldMedia = function removeOldMedia() {
|
|
1736
|
+
$oldMedia.style.setProperty('display', 'none');
|
|
1737
|
+
$oldMedia.remove();
|
|
1738
|
+
};
|
|
1739
|
+
var oldMediaAnimate;
|
|
1740
|
+
if (Boolean(oldMedia.options['transout'])) {
|
|
1741
|
+
oldMediaAnimate = $oldMedia.animate(transOut.keyframes, transOut.timing);
|
|
1742
|
+
}
|
|
1743
|
+
if (Boolean(oldMedia.options['transout']) && self.totalMediaObjects > 1) {
|
|
1744
|
+
if (transOutName === 'flyOut') {
|
|
1745
|
+
// Reset last item to original position and state
|
|
1746
|
+
oldMediaAnimate ? oldMediaAnimate.finished.then(function () {
|
|
1747
|
+
var _oldMediaAnimate;
|
|
1748
|
+
resolve(true);
|
|
1749
|
+
(_oldMediaAnimate = oldMediaAnimate) === null || _oldMediaAnimate === void 0 || (_oldMediaAnimate = _oldMediaAnimate.effect) === null || _oldMediaAnimate === void 0 || _oldMediaAnimate.updateTiming({
|
|
1750
|
+
fill: 'none'
|
|
1751
|
+
});
|
|
1752
|
+
removeOldMedia();
|
|
1753
|
+
}) : undefined;
|
|
1754
|
+
} else {
|
|
1755
|
+
setTimeout(removeOldMedia, transOutDuration / 2);
|
|
1756
|
+
resolve(true);
|
|
1757
|
+
}
|
|
1758
|
+
} else {
|
|
1759
|
+
removeOldMedia();
|
|
1760
|
+
// Resolve this right away
|
|
1761
|
+
// As a result, the transition between two media object
|
|
1762
|
+
// seems like a cross-over
|
|
1763
|
+
resolve(true);
|
|
1764
|
+
}
|
|
1765
|
+
}
|
|
1766
|
+
}
|
|
1767
|
+
});
|
|
1768
|
+
if (oldMedia) {
|
|
1769
|
+
hideOldMedia.then(function (isDone) {
|
|
1770
|
+
if (isDone) {
|
|
1771
|
+
newMedia.run();
|
|
1772
|
+
}
|
|
1773
|
+
});
|
|
1774
|
+
} else {
|
|
1775
|
+
newMedia.run();
|
|
1776
|
+
}
|
|
1777
|
+
}
|
|
1778
|
+
};
|
|
1779
|
+
regionObject.playNextMedia = function () {
|
|
1780
|
+
var _self$curMedia, _self$curMedia2, _self$curMedia3, _self$curMedia4;
|
|
1781
|
+
var self = regionObject;
|
|
1782
|
+
/* The current media has finished running */
|
|
1783
|
+
if (self.ended) {
|
|
1784
|
+
return;
|
|
1785
|
+
}
|
|
1786
|
+
if (self.currentMediaIndex === self.mediaObjects.length - 1) {
|
|
1787
|
+
self.finished();
|
|
1788
|
+
if (self.layout.allEnded) {
|
|
1789
|
+
return;
|
|
1790
|
+
}
|
|
1791
|
+
}
|
|
1792
|
+
// When the region has completed and when currentMedia is html
|
|
1793
|
+
// Then, preserve the currentMedia state
|
|
1794
|
+
if (self.complete && ((_self$curMedia = self.curMedia) === null || _self$curMedia === void 0 ? void 0 : _self$curMedia.render) === 'html') {
|
|
1795
|
+
return;
|
|
1796
|
+
}
|
|
1797
|
+
// When the region has completed and mediaObjects.length = 1
|
|
1798
|
+
// and curMedia.loop = false, then put the media on
|
|
1799
|
+
// its current state
|
|
1800
|
+
if (self.complete && self.mediaObjects.length === 1 && ((_self$curMedia2 = self.curMedia) === null || _self$curMedia2 === void 0 ? void 0 : _self$curMedia2.render) !== 'html' && ((_self$curMedia3 = self.curMedia) === null || _self$curMedia3 === void 0 ? void 0 : _self$curMedia3.mediaType) === 'image' && !((_self$curMedia4 = self.curMedia) !== null && _self$curMedia4 !== void 0 && _self$curMedia4.loop)) {
|
|
1801
|
+
return;
|
|
1802
|
+
}
|
|
1803
|
+
self.currentMediaIndex = self.currentMediaIndex + 1;
|
|
1804
|
+
self.prepareMediaObjects();
|
|
1805
|
+
console.debug('region::playNextMedia', self);
|
|
1806
|
+
self.transitionNodes(self.oldMedia, self.curMedia);
|
|
1807
|
+
};
|
|
1808
|
+
regionObject.end = function () {
|
|
1809
|
+
var self = regionObject;
|
|
1810
|
+
self.ending = true;
|
|
1811
|
+
/* The Layout has finished running */
|
|
1812
|
+
/* Do any region exit transition then clean up */
|
|
1813
|
+
self.layout.regions[self.index] = self;
|
|
1814
|
+
console.debug('Calling Region::end ', self);
|
|
1815
|
+
self.exitTransition();
|
|
1816
|
+
};
|
|
1817
|
+
regionObject.exitTransition = function () {
|
|
1818
|
+
var self = regionObject;
|
|
1819
|
+
/* TODO: Actually implement region exit transitions */
|
|
1820
|
+
var $region = document.getElementById("".concat(self.containerName));
|
|
1821
|
+
if ($region) {
|
|
1822
|
+
$region.style.display = 'none';
|
|
1823
|
+
}
|
|
1824
|
+
console.debug('Called Region::exitTransition ', self.id);
|
|
1825
|
+
self.exitTransitionComplete();
|
|
1826
|
+
};
|
|
1827
|
+
regionObject.exitTransitionComplete = function () {
|
|
1828
|
+
var self = regionObject;
|
|
1829
|
+
console.debug('Called Region::exitTransitionComplete ', self.id);
|
|
1830
|
+
self.ended = true;
|
|
1831
|
+
self.layout.regions[self.index] = self;
|
|
1832
|
+
self.layout.regionEnded();
|
|
1833
|
+
};
|
|
1834
|
+
regionObject.reset = function () {
|
|
1835
|
+
regionObject.ended = false;
|
|
1836
|
+
regionObject.complete = false;
|
|
1837
|
+
regionObject.ending = false;
|
|
1838
|
+
console.debug('Resetting region states', regionObject);
|
|
1839
|
+
};
|
|
1840
|
+
regionObject.on = function (event, callback) {
|
|
1841
|
+
return emitter.on(event, callback);
|
|
1842
|
+
};
|
|
1843
|
+
regionObject.emitter = emitter;
|
|
1844
|
+
regionObject.prepareRegion();
|
|
1845
|
+
return regionObject;
|
|
1846
|
+
}
|
|
1847
|
+
|
|
1848
|
+
var playAgainClickHandle = function playAgainClickHandle(ev) {
|
|
1849
|
+
ev.preventDefault();
|
|
1850
|
+
history.go(0);
|
|
1851
|
+
};
|
|
1852
|
+
function initRenderingDOM(targetContainer) {
|
|
1853
|
+
var _targetContainer = targetContainer;
|
|
1854
|
+
var previewPlayer = document.createElement('div');
|
|
1855
|
+
var previewScreen = document.createElement('div');
|
|
1856
|
+
var endPlay = document.createElement('div');
|
|
1857
|
+
var playAgainLink = document.createElement('a');
|
|
1858
|
+
// Preview player
|
|
1859
|
+
previewPlayer.className = 'player-preview';
|
|
1860
|
+
previewPlayer.id = 'player_container';
|
|
1861
|
+
// Preview screen
|
|
1862
|
+
previewScreen.className = 'screen-preview';
|
|
1863
|
+
previewScreen.id = 'screen_container';
|
|
1864
|
+
// Ended play
|
|
1865
|
+
endPlay.className = 'preview-ended';
|
|
1866
|
+
endPlay.id = 'play_ended';
|
|
1867
|
+
endPlay.style.display = 'none';
|
|
1868
|
+
// Play again link
|
|
1869
|
+
playAgainLink.id = 'play_back_preview';
|
|
1870
|
+
playAgainLink.className = 'play-back-preview';
|
|
1871
|
+
playAgainLink.style.cssText = 'text-decoration: none; color: #ffffff;';
|
|
1872
|
+
playAgainLink.innerHTML = 'Play again?';
|
|
1873
|
+
playAgainLink.removeEventListener('click', playAgainClickHandle);
|
|
1874
|
+
playAgainLink.addEventListener('click', playAgainClickHandle);
|
|
1875
|
+
if (!_targetContainer) {
|
|
1876
|
+
_targetContainer = document.body;
|
|
1877
|
+
}
|
|
1878
|
+
if (_targetContainer) {
|
|
1879
|
+
if (_targetContainer.querySelector('#player_container') === null) {
|
|
1880
|
+
_targetContainer.insertBefore(previewPlayer, _targetContainer.firstChild);
|
|
1881
|
+
if (previewPlayer.querySelector('#screen_container') === null) {
|
|
1882
|
+
previewPlayer.appendChild(previewScreen);
|
|
1883
|
+
}
|
|
1884
|
+
if (previewPlayer.querySelector('#play_ended') === null) {
|
|
1885
|
+
previewPlayer.appendChild(endPlay);
|
|
1886
|
+
if (endPlay.querySelector('a') === null) {
|
|
1887
|
+
endPlay.appendChild(playAgainLink);
|
|
1888
|
+
}
|
|
1889
|
+
}
|
|
1890
|
+
}
|
|
1891
|
+
}
|
|
1892
|
+
}
|
|
1893
|
+
function getXlf(_x) {
|
|
1894
|
+
return _getXlf.apply(this, arguments);
|
|
1895
|
+
}
|
|
1896
|
+
function _getXlf() {
|
|
1897
|
+
_getXlf = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee4(layoutOptions) {
|
|
1898
|
+
var apiHost, xlfUrl, fetchOptions, res;
|
|
1899
|
+
return _regeneratorRuntime().wrap(function _callee4$(_context4) {
|
|
1900
|
+
while (1) switch (_context4.prev = _context4.next) {
|
|
1901
|
+
case 0:
|
|
1902
|
+
apiHost = window.location.origin;
|
|
1903
|
+
xlfUrl = apiHost + layoutOptions.xlfUrl;
|
|
1904
|
+
fetchOptions = {};
|
|
1905
|
+
if (layoutOptions.platform === 'CMS') {
|
|
1906
|
+
xlfUrl = apiHost + layoutOptions.xlfUrl;
|
|
1907
|
+
fetchOptions.mode = 'no-cors';
|
|
1908
|
+
} else if (layoutOptions.platform === 'chromeOS') {
|
|
1909
|
+
xlfUrl = layoutOptions.xlfUrl;
|
|
1910
|
+
fetchOptions.mode = 'cors';
|
|
1911
|
+
fetchOptions.headers = {
|
|
1912
|
+
'Content-Type': 'text/xml'
|
|
1913
|
+
};
|
|
1914
|
+
} else if (layoutOptions.platform !== 'CMS' && layoutOptions.appHost !== null) {
|
|
1915
|
+
xlfUrl = layoutOptions.appHost + layoutOptions.xlfUrl;
|
|
1916
|
+
}
|
|
1917
|
+
_context4.next = 6;
|
|
1918
|
+
return fetch(xlfUrl);
|
|
1919
|
+
case 6:
|
|
1920
|
+
res = _context4.sent;
|
|
1921
|
+
_context4.next = 9;
|
|
1922
|
+
return res.text();
|
|
1923
|
+
case 9:
|
|
1924
|
+
return _context4.abrupt("return", _context4.sent);
|
|
1925
|
+
case 10:
|
|
1926
|
+
case "end":
|
|
1927
|
+
return _context4.stop();
|
|
1928
|
+
}
|
|
1929
|
+
}, _callee4);
|
|
1930
|
+
}));
|
|
1931
|
+
return _getXlf.apply(this, arguments);
|
|
1932
|
+
}
|
|
1933
|
+
function getLayout(params) {
|
|
1934
|
+
var _currentLayout = undefined;
|
|
1935
|
+
var _nextLayout = undefined;
|
|
1936
|
+
var _params$xlr = params.xlr,
|
|
1937
|
+
inputLayouts = _params$xlr.inputLayouts,
|
|
1938
|
+
currentLayout = _params$xlr.currentLayout,
|
|
1939
|
+
nextLayout = _params$xlr.nextLayout,
|
|
1940
|
+
currLayoutIndx = _params$xlr.currentLayoutIndex;
|
|
1941
|
+
var hasLayout = inputLayouts.length > 0;
|
|
1942
|
+
var currentLayoutIndex = currLayoutIndx;
|
|
1943
|
+
var nextLayoutIndex = currentLayoutIndex + 1;
|
|
1944
|
+
if (currentLayout === undefined && nextLayout === undefined) {
|
|
1945
|
+
var activeLayout;
|
|
1946
|
+
// Preview just got started
|
|
1947
|
+
if (hasLayout) {
|
|
1948
|
+
var nextLayoutTemp = _objectSpread2({}, initialLayout);
|
|
1949
|
+
activeLayout = inputLayouts[currentLayoutIndex];
|
|
1950
|
+
_currentLayout = _objectSpread2(_objectSpread2({}, initialLayout), activeLayout);
|
|
1951
|
+
if (inputLayouts.length > 1) {
|
|
1952
|
+
nextLayoutTemp = _objectSpread2(_objectSpread2({}, nextLayoutTemp), inputLayouts[nextLayoutIndex]);
|
|
1953
|
+
_nextLayout = nextLayoutTemp;
|
|
1954
|
+
} else {
|
|
1955
|
+
_nextLayout = _currentLayout;
|
|
1956
|
+
}
|
|
1957
|
+
_currentLayout.id = activeLayout.layoutId;
|
|
1958
|
+
if (nextLayoutTemp) {
|
|
1959
|
+
_nextLayout.id = nextLayoutTemp.layoutId;
|
|
1960
|
+
}
|
|
1961
|
+
}
|
|
1962
|
+
} else {
|
|
1963
|
+
if (hasLayout) {
|
|
1964
|
+
var _currentLayout2;
|
|
1965
|
+
_currentLayout = nextLayout;
|
|
1966
|
+
currentLayoutIndex = getIndexByLayoutId(inputLayouts, (_currentLayout2 = _currentLayout) === null || _currentLayout2 === void 0 ? void 0 : _currentLayout2.layoutId).index;
|
|
1967
|
+
nextLayoutIndex = currentLayoutIndex + 1;
|
|
1968
|
+
if (inputLayouts.length > 1 && nextLayoutIndex < inputLayouts.length) {
|
|
1969
|
+
if (Boolean(params.xlr.layouts[nextLayoutIndex])) {
|
|
1970
|
+
_nextLayout = params.xlr.layouts[nextLayoutIndex];
|
|
1971
|
+
} else {
|
|
1972
|
+
_nextLayout = _objectSpread2(_objectSpread2({}, initialLayout), inputLayouts[nextLayoutIndex]);
|
|
1973
|
+
}
|
|
1974
|
+
}
|
|
1975
|
+
// If _nextLayout is undefined, then we go back to first layout
|
|
1976
|
+
if (_nextLayout === undefined) {
|
|
1977
|
+
_nextLayout = params.xlr.layouts[0];
|
|
1978
|
+
}
|
|
1979
|
+
}
|
|
1980
|
+
}
|
|
1981
|
+
return {
|
|
1982
|
+
currentLayoutIndex: currentLayoutIndex,
|
|
1983
|
+
inputLayouts: params.xlr.inputLayouts,
|
|
1984
|
+
current: _currentLayout,
|
|
1985
|
+
next: _nextLayout
|
|
1986
|
+
};
|
|
1987
|
+
}
|
|
1988
|
+
function Layout(data, options, xlr, layout) {
|
|
1989
|
+
var props = {
|
|
1990
|
+
data: data,
|
|
1991
|
+
options: options,
|
|
1992
|
+
layout: layout || initialLayout
|
|
1993
|
+
};
|
|
1994
|
+
var emitter = createNanoEvents();
|
|
1995
|
+
emitter.on('start', function (layout) {
|
|
1996
|
+
layout.done = false;
|
|
1997
|
+
console.debug('Layout start emitted > Layout ID > ', layout.id);
|
|
1998
|
+
});
|
|
1999
|
+
emitter.on('end', /*#__PURE__*/function () {
|
|
2000
|
+
var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(layout) {
|
|
2001
|
+
var $layout;
|
|
2002
|
+
return _regeneratorRuntime().wrap(function _callee$(_context) {
|
|
2003
|
+
while (1) switch (_context.prev = _context.next) {
|
|
2004
|
+
case 0:
|
|
2005
|
+
console.debug('Ending layout with ID of > ', layout.layoutId);
|
|
2006
|
+
/* Remove layout that has ended */
|
|
2007
|
+
$layout = document.getElementById(layout.containerName);
|
|
2008
|
+
layout.done = true;
|
|
2009
|
+
console.debug({
|
|
2010
|
+
$layout: $layout
|
|
2011
|
+
});
|
|
2012
|
+
if ($layout !== null) {
|
|
2013
|
+
$layout.remove();
|
|
2014
|
+
}
|
|
2015
|
+
if (xlr.config.platform !== 'CMS') {
|
|
2016
|
+
// Transition next layout to current layout and prepare next layout if exist
|
|
2017
|
+
xlr.prepareLayouts().then(function (parent) {
|
|
2018
|
+
xlr.playSchedules(parent);
|
|
2019
|
+
});
|
|
2020
|
+
}
|
|
2021
|
+
case 6:
|
|
2022
|
+
case "end":
|
|
2023
|
+
return _context.stop();
|
|
2024
|
+
}
|
|
2025
|
+
}, _callee);
|
|
2026
|
+
}));
|
|
2027
|
+
return function (_x2) {
|
|
2028
|
+
return _ref.apply(this, arguments);
|
|
2029
|
+
};
|
|
2030
|
+
}());
|
|
2031
|
+
var layoutObject = _objectSpread2(_objectSpread2({}, props.layout), {}, {
|
|
2032
|
+
options: props.options
|
|
2033
|
+
});
|
|
2034
|
+
layoutObject.on = function (event, callback) {
|
|
2035
|
+
return emitter.on(event, callback);
|
|
2036
|
+
};
|
|
2037
|
+
layoutObject.emitter = emitter;
|
|
2038
|
+
layoutObject.run = function () {
|
|
2039
|
+
var layout = layoutObject;
|
|
2040
|
+
var $layoutContainer = document.getElementById("".concat(layout.containerName));
|
|
2041
|
+
var $splashScreen = document.getElementById("splash_".concat(layout.id));
|
|
2042
|
+
if ($layoutContainer) {
|
|
2043
|
+
$layoutContainer.style.display = 'block';
|
|
2044
|
+
}
|
|
2045
|
+
if ($splashScreen) {
|
|
2046
|
+
$splashScreen.style.display = 'none';
|
|
2047
|
+
}
|
|
2048
|
+
console.debug('Layout running > Layout ID > ', layout.id);
|
|
2049
|
+
console.debug('Layout Regions > ', layout.regions);
|
|
2050
|
+
for (var i = 0; i < layout.regions.length; i++) {
|
|
2051
|
+
// playLog(4, "debug", "Running region " + self.regions[i].id, false);
|
|
2052
|
+
layout.regions[i].run();
|
|
2053
|
+
}
|
|
2054
|
+
};
|
|
2055
|
+
layoutObject.prepareLayout = function () {
|
|
2056
|
+
layoutObject.parseXlf();
|
|
2057
|
+
};
|
|
2058
|
+
layoutObject.parseXlf = function () {
|
|
2059
|
+
var _layout$layoutNode, _layout$layoutNode2, _layout$layoutNode3, _layout$layoutNode4, _layout$layoutNode5, _layout$layoutNode6;
|
|
2060
|
+
var layout = this;
|
|
2061
|
+
var options = layout.options;
|
|
2062
|
+
layout.done = false;
|
|
2063
|
+
layout.allEnded = false;
|
|
2064
|
+
layout.allExpired = false;
|
|
2065
|
+
layout.containerName = "L" + layout.id + "-" + nextId(options);
|
|
2066
|
+
layout.regions = [];
|
|
2067
|
+
/* Create a hidden div to show the layout in */
|
|
2068
|
+
var $layout = document.getElementById(layout.containerName);
|
|
2069
|
+
if ($layout === null) {
|
|
2070
|
+
$layout = document.createElement('div');
|
|
2071
|
+
$layout.id = layout.containerName;
|
|
2072
|
+
}
|
|
2073
|
+
var $screen = document.getElementById('screen_container');
|
|
2074
|
+
$screen && $screen.appendChild($layout);
|
|
2075
|
+
if ($layout) {
|
|
2076
|
+
$layout.style.display = 'none';
|
|
2077
|
+
$layout.style.outline = 'red solid thin';
|
|
2078
|
+
}
|
|
2079
|
+
layout.layoutNode = props.data;
|
|
2080
|
+
/* Calculate the screen size */
|
|
2081
|
+
layout.sw = ($screen === null || $screen === void 0 ? void 0 : $screen.offsetWidth) || 0;
|
|
2082
|
+
layout.sh = ($screen === null || $screen === void 0 ? void 0 : $screen.offsetHeight) || 0;
|
|
2083
|
+
layout.xw = Number((_layout$layoutNode = layout.layoutNode) === null || _layout$layoutNode === void 0 || (_layout$layoutNode = _layout$layoutNode.firstElementChild) === null || _layout$layoutNode === void 0 ? void 0 : _layout$layoutNode.getAttribute('width'));
|
|
2084
|
+
layout.xh = Number((_layout$layoutNode2 = layout.layoutNode) === null || _layout$layoutNode2 === void 0 || (_layout$layoutNode2 = _layout$layoutNode2.firstElementChild) === null || _layout$layoutNode2 === void 0 ? void 0 : _layout$layoutNode2.getAttribute('height'));
|
|
2085
|
+
layout.zIndex = Number((_layout$layoutNode3 = layout.layoutNode) === null || _layout$layoutNode3 === void 0 || (_layout$layoutNode3 = _layout$layoutNode3.firstElementChild) === null || _layout$layoutNode3 === void 0 ? void 0 : _layout$layoutNode3.getAttribute('zindex')) || 0;
|
|
2086
|
+
/* Calculate Scale Factor */
|
|
2087
|
+
layout.scaleFactor = Math.min(layout.sw / layout.xw, layout.sh / layout.xh);
|
|
2088
|
+
layout.sWidth = layout.xw * layout.scaleFactor;
|
|
2089
|
+
layout.sHeight = layout.xh * layout.scaleFactor;
|
|
2090
|
+
layout.offsetX = Math.abs(layout.sw - layout.sWidth) / 2;
|
|
2091
|
+
layout.offsetY = Math.abs(layout.sh - layout.sHeight) / 2;
|
|
2092
|
+
/* Scale the Layout Container */
|
|
2093
|
+
if ($layout) {
|
|
2094
|
+
$layout.style.width = "".concat(layout.sWidth, "px");
|
|
2095
|
+
$layout.style.height = "".concat(layout.sHeight, "px");
|
|
2096
|
+
$layout.style.position = 'absolute';
|
|
2097
|
+
$layout.style.left = "".concat(layout.offsetX, "px");
|
|
2098
|
+
$layout.style.top = "".concat(layout.offsetY, "px");
|
|
2099
|
+
}
|
|
2100
|
+
if ($layout && layout.zIndex !== null) {
|
|
2101
|
+
$layout.style.zIndex = "".concat(layout.zIndex);
|
|
2102
|
+
}
|
|
2103
|
+
/* Set the layout background */
|
|
2104
|
+
layout.bgColor = ((_layout$layoutNode4 = layout.layoutNode) === null || _layout$layoutNode4 === void 0 || (_layout$layoutNode4 = _layout$layoutNode4.firstElementChild) === null || _layout$layoutNode4 === void 0 ? void 0 : _layout$layoutNode4.getAttribute('bgcolor')) || '';
|
|
2105
|
+
layout.bgImage = ((_layout$layoutNode5 = layout.layoutNode) === null || _layout$layoutNode5 === void 0 || (_layout$layoutNode5 = _layout$layoutNode5.firstElementChild) === null || _layout$layoutNode5 === void 0 ? void 0 : _layout$layoutNode5.getAttribute('background')) || '';
|
|
2106
|
+
if (!(layout.bgImage === "" || typeof layout.bgImage === 'undefined')) {
|
|
2107
|
+
/* Extract the image ID from the filename */
|
|
2108
|
+
layout.bgId = layout.bgImage.substring(0, layout.bgImage.indexOf('.'));
|
|
2109
|
+
var bgImageUrl = composeBgUrlByPlatform(xlr.config.platform, _objectSpread2(_objectSpread2({}, options), {}, {
|
|
2110
|
+
layout: layout
|
|
2111
|
+
}));
|
|
2112
|
+
if ($layout) {
|
|
2113
|
+
$layout.style.backgroundImage = "url(\"".concat(bgImageUrl, "\")");
|
|
2114
|
+
$layout.style.backgroundRepeat = 'no-repeat';
|
|
2115
|
+
$layout.style.backgroundSize = "".concat(layout.sWidth, "px ").concat(layout.sHeight, "px");
|
|
2116
|
+
$layout.style.backgroundPosition = '0px 0px';
|
|
2117
|
+
}
|
|
2118
|
+
}
|
|
2119
|
+
// Set the background color
|
|
2120
|
+
if ($layout && layout.bgColor) {
|
|
2121
|
+
$layout.style.backgroundColor = "".concat(layout.bgColor);
|
|
2122
|
+
}
|
|
2123
|
+
// Hide if layout is not the currentLayout
|
|
2124
|
+
if ($layout && xlr.currentLayoutId !== undefined && xlr.currentLayoutId !== layout.id) {
|
|
2125
|
+
$layout.style.display = 'none';
|
|
2126
|
+
}
|
|
2127
|
+
// Create regions
|
|
2128
|
+
var layoutRegions = Array.from((layout === null || layout === void 0 || (_layout$layoutNode6 = layout.layoutNode) === null || _layout$layoutNode6 === void 0 ? void 0 : _layout$layoutNode6.getElementsByTagName('region')) || []);
|
|
2129
|
+
Array.from(layoutRegions).forEach(function (regionXml, indx) {
|
|
2130
|
+
var regionObj = Region(layout, regionXml, (regionXml === null || regionXml === void 0 ? void 0 : regionXml.getAttribute('id')) || '', options, xlr);
|
|
2131
|
+
regionObj.index = indx;
|
|
2132
|
+
layout.regions.push(regionObj);
|
|
2133
|
+
});
|
|
2134
|
+
};
|
|
2135
|
+
layoutObject.regionExpired = function () {
|
|
2136
|
+
var self = layoutObject;
|
|
2137
|
+
self.allExpired = true;
|
|
2138
|
+
var _iterator = _createForOfIteratorHelper(self.regions),
|
|
2139
|
+
_step;
|
|
2140
|
+
try {
|
|
2141
|
+
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
2142
|
+
var layoutRegion = _step.value;
|
|
2143
|
+
if (!layoutRegion.complete) {
|
|
2144
|
+
self.allExpired = false;
|
|
2145
|
+
}
|
|
2146
|
+
}
|
|
2147
|
+
} catch (err) {
|
|
2148
|
+
_iterator.e(err);
|
|
2149
|
+
} finally {
|
|
2150
|
+
_iterator.f();
|
|
2151
|
+
}
|
|
2152
|
+
if (self.allExpired) {
|
|
2153
|
+
self.end();
|
|
2154
|
+
}
|
|
2155
|
+
};
|
|
2156
|
+
layoutObject.regionEnded = function () {
|
|
2157
|
+
var self = layoutObject;
|
|
2158
|
+
self.allEnded = true;
|
|
2159
|
+
for (var i = 0; i < self.regions.length; i++) {
|
|
2160
|
+
if (!self.regions[i].ended) {
|
|
2161
|
+
self.allEnded = false;
|
|
2162
|
+
}
|
|
2163
|
+
}
|
|
2164
|
+
if (self.allEnded) {
|
|
2165
|
+
self.stopAllMedia().then( /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2() {
|
|
2166
|
+
var $end, $preview;
|
|
2167
|
+
return _regeneratorRuntime().wrap(function _callee2$(_context2) {
|
|
2168
|
+
while (1) switch (_context2.prev = _context2.next) {
|
|
2169
|
+
case 0:
|
|
2170
|
+
console.debug('starting to end layout . . .');
|
|
2171
|
+
if (xlr.config.platform === 'CMS') {
|
|
2172
|
+
$end = document.getElementById('play_ended');
|
|
2173
|
+
$preview = document.getElementById('screen_container');
|
|
2174
|
+
if ($preview) {
|
|
2175
|
+
while ($preview.firstChild) {
|
|
2176
|
+
$preview.removeChild($preview.firstChild);
|
|
2177
|
+
}
|
|
2178
|
+
$preview.style.display = 'none';
|
|
2179
|
+
}
|
|
2180
|
+
if ($end) {
|
|
2181
|
+
$end.style.display = 'block';
|
|
2182
|
+
}
|
|
2183
|
+
}
|
|
2184
|
+
self.emitter.emit('end', self);
|
|
2185
|
+
case 3:
|
|
2186
|
+
case "end":
|
|
2187
|
+
return _context2.stop();
|
|
2188
|
+
}
|
|
2189
|
+
}, _callee2);
|
|
2190
|
+
})));
|
|
2191
|
+
}
|
|
2192
|
+
};
|
|
2193
|
+
layoutObject.end = function () {
|
|
2194
|
+
console.debug('Executing Layout::end and Calling Region::end ', layoutObject);
|
|
2195
|
+
/* Ask the layout to gracefully stop running now */
|
|
2196
|
+
var _iterator2 = _createForOfIteratorHelper(layoutObject.regions),
|
|
2197
|
+
_step2;
|
|
2198
|
+
try {
|
|
2199
|
+
for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
|
|
2200
|
+
var layoutRegion = _step2.value;
|
|
2201
|
+
layoutRegion.end();
|
|
2202
|
+
}
|
|
2203
|
+
} catch (err) {
|
|
2204
|
+
_iterator2.e(err);
|
|
2205
|
+
} finally {
|
|
2206
|
+
_iterator2.f();
|
|
2207
|
+
}
|
|
2208
|
+
};
|
|
2209
|
+
layoutObject.stopAllMedia = function () {
|
|
2210
|
+
console.debug('Stopping all media . . .');
|
|
2211
|
+
return new Promise( /*#__PURE__*/function () {
|
|
2212
|
+
var _ref3 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee3(resolve) {
|
|
2213
|
+
var i, region, j, media;
|
|
2214
|
+
return _regeneratorRuntime().wrap(function _callee3$(_context3) {
|
|
2215
|
+
while (1) switch (_context3.prev = _context3.next) {
|
|
2216
|
+
case 0:
|
|
2217
|
+
i = 0;
|
|
2218
|
+
case 1:
|
|
2219
|
+
if (!(i < layoutObject.regions.length)) {
|
|
2220
|
+
_context3.next = 14;
|
|
2221
|
+
break;
|
|
2222
|
+
}
|
|
2223
|
+
region = layoutObject.regions[i];
|
|
2224
|
+
j = 0;
|
|
2225
|
+
case 4:
|
|
2226
|
+
if (!(j < region.mediaObjects.length)) {
|
|
2227
|
+
_context3.next = 11;
|
|
2228
|
+
break;
|
|
2229
|
+
}
|
|
2230
|
+
media = region.mediaObjects[j];
|
|
2231
|
+
_context3.next = 8;
|
|
2232
|
+
return media.stop();
|
|
2233
|
+
case 8:
|
|
2234
|
+
j++;
|
|
2235
|
+
_context3.next = 4;
|
|
2236
|
+
break;
|
|
2237
|
+
case 11:
|
|
2238
|
+
i++;
|
|
2239
|
+
_context3.next = 1;
|
|
2240
|
+
break;
|
|
2241
|
+
case 14:
|
|
2242
|
+
resolve();
|
|
2243
|
+
case 15:
|
|
2244
|
+
case "end":
|
|
2245
|
+
return _context3.stop();
|
|
2246
|
+
}
|
|
2247
|
+
}, _callee3);
|
|
2248
|
+
}));
|
|
2249
|
+
return function (_x3) {
|
|
2250
|
+
return _ref3.apply(this, arguments);
|
|
2251
|
+
};
|
|
2252
|
+
}());
|
|
2253
|
+
};
|
|
2254
|
+
layoutObject.prepareLayout();
|
|
2255
|
+
return layoutObject;
|
|
2256
|
+
}
|
|
2257
|
+
|
|
2258
|
+
exports.ELayoutType = void 0;
|
|
2259
|
+
(function (ELayoutType) {
|
|
2260
|
+
ELayoutType[ELayoutType["CURRENT"] = 0] = "CURRENT";
|
|
2261
|
+
ELayoutType[ELayoutType["NEXT"] = 1] = "NEXT";
|
|
2262
|
+
})(exports.ELayoutType || (exports.ELayoutType = {}));
|
|
2263
|
+
var initialXlr = {
|
|
2264
|
+
inputLayouts: [],
|
|
2265
|
+
config: platform,
|
|
2266
|
+
layouts: [],
|
|
2267
|
+
currentLayoutIndex: 0,
|
|
2268
|
+
currentLayoutId: null,
|
|
2269
|
+
currentLayout: undefined,
|
|
2270
|
+
nextLayout: undefined,
|
|
2271
|
+
bootstrap: function bootstrap() {},
|
|
2272
|
+
init: function init() {
|
|
2273
|
+
return Promise.resolve({});
|
|
2274
|
+
},
|
|
2275
|
+
playSchedules: function playSchedules() {},
|
|
2276
|
+
prepareLayoutXlf: function prepareLayoutXlf(inputLayout) {
|
|
2277
|
+
return Promise.resolve({});
|
|
2278
|
+
},
|
|
2279
|
+
prepareLayouts: function prepareLayouts() {
|
|
2280
|
+
return Promise.resolve({});
|
|
2281
|
+
},
|
|
2282
|
+
updateLayouts: function updateLayouts(inputLayouts) {},
|
|
2283
|
+
updateLoop: function updateLoop(inputLayouts) {}
|
|
2284
|
+
};
|
|
2285
|
+
|
|
2286
|
+
var img$1 = "data:image/png;base64,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";
|
|
2287
|
+
|
|
2288
|
+
var img = "data:image/gif;base64,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";
|
|
2289
|
+
|
|
2290
|
+
/*
|
|
2291
|
+
* Copyright (C) 2024 Xibo Signage Ltd
|
|
2292
|
+
*
|
|
2293
|
+
* Xibo - Digital Signage - https://www.xibosignage.com
|
|
2294
|
+
*
|
|
2295
|
+
* This file is part of Xibo.
|
|
2296
|
+
*
|
|
2297
|
+
* Xibo is free software: you can redistribute it and/or modify
|
|
2298
|
+
* it under the terms of the GNU Lesser General Public License as published by
|
|
2299
|
+
* the Free Software Foundation, either version 3 of the License, or
|
|
2300
|
+
* any later version.
|
|
2301
|
+
*
|
|
2302
|
+
* Xibo is distributed in the hope that it will be useful,
|
|
2303
|
+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
2304
|
+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
2305
|
+
* GNU Lesser General Public License for more details.
|
|
2306
|
+
*
|
|
2307
|
+
* You should have received a copy of the GNU Lesser General Public License
|
|
2308
|
+
* along with Xibo. If not, see <http://www.gnu.org/licenses/>.
|
|
2309
|
+
*/
|
|
2310
|
+
function SplashScreen($parent, config) {
|
|
2311
|
+
var $previewSplash = document.createElement('div');
|
|
2312
|
+
var $previewLoader = document.createElement('div');
|
|
2313
|
+
var $previewLoaderCaption = document.createElement('div');
|
|
2314
|
+
document.createElement('div');
|
|
2315
|
+
var splashScreenObj = {
|
|
2316
|
+
init: function init() {
|
|
2317
|
+
var _this = this;
|
|
2318
|
+
$previewSplash.classList.add('preview-splash');
|
|
2319
|
+
// Don't show Xibo logo on CMS Preview
|
|
2320
|
+
if (config && config.platform !== 'CMS') {
|
|
2321
|
+
$previewSplash.style.setProperty('background-image', "url(".concat(img$1, ")"));
|
|
2322
|
+
$previewSplash.style.setProperty('background-size', '200px 120px');
|
|
2323
|
+
$previewSplash.style.setProperty('background-position', 'calc(100% - 50px) calc(100% - 30px)');
|
|
2324
|
+
}
|
|
2325
|
+
$previewSplash.constructor.prototype.hide = function () {
|
|
2326
|
+
_this.hide();
|
|
2327
|
+
};
|
|
2328
|
+
$previewLoader.classList.add('preview-loader');
|
|
2329
|
+
$previewLoaderCaption.classList.add('preview-loaderCaption');
|
|
2330
|
+
// Show loader bar and text on CMS Preview
|
|
2331
|
+
if (config && config.platform === 'CMS') {
|
|
2332
|
+
$previewLoader.style.setProperty('background-image', "url(".concat(img, ")"));
|
|
2333
|
+
$previewLoaderCaption.innerHTML = '<p>Loading Layout...</p>';
|
|
2334
|
+
}
|
|
2335
|
+
$previewSplash.insertBefore($previewLoader, $previewSplash.lastElementChild);
|
|
2336
|
+
$previewSplash.insertBefore($previewLoaderCaption, null);
|
|
2337
|
+
this.hide();
|
|
2338
|
+
},
|
|
2339
|
+
show: function show() {
|
|
2340
|
+
if ($parent) {
|
|
2341
|
+
$parent.insertBefore($previewSplash, $parent.firstElementChild);
|
|
2342
|
+
$previewSplash.style.setProperty('display', 'block');
|
|
2343
|
+
}
|
|
2344
|
+
},
|
|
2345
|
+
hide: function hide() {
|
|
2346
|
+
$previewSplash.style.setProperty('display', 'none');
|
|
2347
|
+
}
|
|
2348
|
+
};
|
|
2349
|
+
splashScreenObj.init();
|
|
2350
|
+
return splashScreenObj;
|
|
2351
|
+
}
|
|
2352
|
+
|
|
2353
|
+
function XiboLayoutRenderer(inputLayouts, options) {
|
|
2354
|
+
var props = {
|
|
2355
|
+
inputLayouts: inputLayouts,
|
|
2356
|
+
options: options
|
|
2357
|
+
};
|
|
2358
|
+
var xlrObject = _objectSpread2({}, initialXlr);
|
|
2359
|
+
xlrObject.bootstrap = function () {
|
|
2360
|
+
// Place to set configurations and initialize required props
|
|
2361
|
+
var self = this;
|
|
2362
|
+
self.inputLayouts = !Array.isArray(props.inputLayouts) ? [props.inputLayouts] : props.inputLayouts;
|
|
2363
|
+
self.config = JSON.parse(JSON.stringify(_objectSpread2(_objectSpread2({}, platform), props.options)));
|
|
2364
|
+
// Prepare rendering DOM
|
|
2365
|
+
var previewCanvas = document.querySelector('#preview_canvas');
|
|
2366
|
+
initRenderingDOM(previewCanvas);
|
|
2367
|
+
// Prepare splash screen
|
|
2368
|
+
var splashScreen = SplashScreen(document.querySelector('.player-preview'), self.config);
|
|
2369
|
+
splashScreen.show();
|
|
2370
|
+
};
|
|
2371
|
+
xlrObject.init = function () {
|
|
2372
|
+
var _this = this;
|
|
2373
|
+
return new Promise(function (resolve) {
|
|
2374
|
+
var self = _this;
|
|
2375
|
+
// Check if only have splash screen from inputLayouts
|
|
2376
|
+
if (self.inputLayouts.length === 1 && self.inputLayouts[0].layoutId === 0) {
|
|
2377
|
+
resolve(self);
|
|
2378
|
+
} else {
|
|
2379
|
+
self.prepareLayouts().then(function (xlr) {
|
|
2380
|
+
resolve(xlr);
|
|
2381
|
+
});
|
|
2382
|
+
}
|
|
2383
|
+
});
|
|
2384
|
+
};
|
|
2385
|
+
xlrObject.playSchedules = function (xlr) {
|
|
2386
|
+
// Check if there's a current layout
|
|
2387
|
+
if (xlr.currentLayout !== undefined) {
|
|
2388
|
+
var $splashScreen = document.querySelector('.preview-splash');
|
|
2389
|
+
if ($splashScreen && $splashScreen.style.display === 'block') {
|
|
2390
|
+
$splashScreen === null || $splashScreen === void 0 || $splashScreen.hide();
|
|
2391
|
+
}
|
|
2392
|
+
xlr.currentLayout.emitter.emit('start', xlr.currentLayout);
|
|
2393
|
+
xlr.currentLayout.run();
|
|
2394
|
+
}
|
|
2395
|
+
};
|
|
2396
|
+
xlrObject.updateLoop = function (inputLayouts) {
|
|
2397
|
+
this.updateLayouts(inputLayouts);
|
|
2398
|
+
};
|
|
2399
|
+
xlrObject.updateLayouts = /*#__PURE__*/function () {
|
|
2400
|
+
var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(inputLayouts) {
|
|
2401
|
+
var _this2 = this;
|
|
2402
|
+
var xlr, _this$currentLayout, _this$nextLayout, currLayoutIndex, nxtLayoutIndex, tempOldNxtLayout, newNxtLayoutIndex, tempNxtLayout, hasOldNxtLayout, oldNxtLayoutIndex, _this$nextLayout2, tempNewNxtLayout;
|
|
2403
|
+
return _regeneratorRuntime().wrap(function _callee$(_context) {
|
|
2404
|
+
while (1) switch (_context.prev = _context.next) {
|
|
2405
|
+
case 0:
|
|
2406
|
+
/**
|
|
2407
|
+
* @TODO
|
|
2408
|
+
* Case 1: If currentLayout in inputLayouts and in the same sequence,
|
|
2409
|
+
* Then, continue playing currentLayout.
|
|
2410
|
+
* Check nextLayout in inputLayouts. If in inputLayouts and same sequence, then don't change.
|
|
2411
|
+
* If not in inputLayouts, then replace and prepare nextLayout.
|
|
2412
|
+
*
|
|
2413
|
+
* Case 2: If currentLayout in inputLayouts but not in the same sequence,
|
|
2414
|
+
* Then, replace loop, prepare layouts and start currentLayout
|
|
2415
|
+
*
|
|
2416
|
+
* Case 3: If currentLayout not in inputLayouts,
|
|
2417
|
+
* Then, replace everything and start from first layout in sequence.
|
|
2418
|
+
*/
|
|
2419
|
+
this.inputLayouts = inputLayouts;
|
|
2420
|
+
/** Case 1: When currentLayout is not in inputLayouts
|
|
2421
|
+
* Then, replace everything and start from first layout
|
|
2422
|
+
*/
|
|
2423
|
+
if (!(inputLayouts.filter(function (inputLayout) {
|
|
2424
|
+
var _this2$currentLayout;
|
|
2425
|
+
return inputLayout.layoutId === ((_this2$currentLayout = _this2.currentLayout) === null || _this2$currentLayout === void 0 ? void 0 : _this2$currentLayout.layoutId);
|
|
2426
|
+
}).length === 0)) {
|
|
2427
|
+
_context.next = 11;
|
|
2428
|
+
break;
|
|
2429
|
+
}
|
|
2430
|
+
// Unset currentLayout, nextLayout and layouts
|
|
2431
|
+
this.layouts = [];
|
|
2432
|
+
this.currentLayout = undefined;
|
|
2433
|
+
this.nextLayout = undefined;
|
|
2434
|
+
_context.next = 7;
|
|
2435
|
+
return this.prepareLayouts();
|
|
2436
|
+
case 7:
|
|
2437
|
+
xlr = _context.sent;
|
|
2438
|
+
this.playSchedules(xlr);
|
|
2439
|
+
_context.next = 40;
|
|
2440
|
+
break;
|
|
2441
|
+
case 11:
|
|
2442
|
+
/** Case 2: When currentLayout is in inputLayouts, then continue playing
|
|
2443
|
+
* Also check for nextLayout if in inputLayouts and same sequence, then don't change and continue playing.
|
|
2444
|
+
* If not in inputLayouts, then replace and prepare nextLayout.
|
|
2445
|
+
*/
|
|
2446
|
+
// 2.1 We don't have to do anything for currentLayout
|
|
2447
|
+
// 2.2 Check for nextLayout
|
|
2448
|
+
// Get nextLayout index
|
|
2449
|
+
currLayoutIndex = getIndexByLayoutId(inputLayouts, (_this$currentLayout = this.currentLayout) === null || _this$currentLayout === void 0 ? void 0 : _this$currentLayout.layoutId).index;
|
|
2450
|
+
nxtLayoutIndex = getIndexByLayoutId(inputLayouts, (_this$nextLayout = this.nextLayout) === null || _this$nextLayout === void 0 ? void 0 : _this$nextLayout.layoutId).index;
|
|
2451
|
+
tempOldNxtLayout = this.layouts[nxtLayoutIndex];
|
|
2452
|
+
newNxtLayoutIndex = currLayoutIndex + 1;
|
|
2453
|
+
if (!(nxtLayoutIndex !== newNxtLayoutIndex)) {
|
|
2454
|
+
_context.next = 33;
|
|
2455
|
+
break;
|
|
2456
|
+
}
|
|
2457
|
+
// Delete old nextLayout
|
|
2458
|
+
delete this.layouts[nxtLayoutIndex];
|
|
2459
|
+
if (!Boolean(this.layouts[newNxtLayoutIndex])) {
|
|
2460
|
+
_context.next = 22;
|
|
2461
|
+
break;
|
|
2462
|
+
}
|
|
2463
|
+
this.nextLayout = this.layouts[newNxtLayoutIndex];
|
|
2464
|
+
this.layouts[newNxtLayoutIndex] = this.nextLayout;
|
|
2465
|
+
_context.next = 31;
|
|
2466
|
+
break;
|
|
2467
|
+
case 22:
|
|
2468
|
+
// Check if newNxtLayoutIndex is still within inputLayouts
|
|
2469
|
+
if (newNxtLayoutIndex + 1 > inputLayouts.length) {
|
|
2470
|
+
// Goes back to first layout in the sequence
|
|
2471
|
+
newNxtLayoutIndex = 0;
|
|
2472
|
+
}
|
|
2473
|
+
if (!Boolean(inputLayouts[newNxtLayoutIndex])) {
|
|
2474
|
+
_context.next = 29;
|
|
2475
|
+
break;
|
|
2476
|
+
}
|
|
2477
|
+
tempNxtLayout = _objectSpread2(_objectSpread2({}, initialLayout), inputLayouts[newNxtLayoutIndex]);
|
|
2478
|
+
_context.next = 27;
|
|
2479
|
+
return this.prepareLayoutXlf(tempNxtLayout);
|
|
2480
|
+
case 27:
|
|
2481
|
+
this.nextLayout = _context.sent;
|
|
2482
|
+
this.layouts[newNxtLayoutIndex] = this.nextLayout;
|
|
2483
|
+
case 29:
|
|
2484
|
+
// Move old nextLayout to its index
|
|
2485
|
+
hasOldNxtLayout = inputLayouts.filter(function (_layout) {
|
|
2486
|
+
return _layout.layoutId === (tempOldNxtLayout === null || tempOldNxtLayout === void 0 ? void 0 : tempOldNxtLayout.layoutId);
|
|
2487
|
+
});
|
|
2488
|
+
if (hasOldNxtLayout.length === 1) {
|
|
2489
|
+
oldNxtLayoutIndex = getIndexByLayoutId(inputLayouts, hasOldNxtLayout[0].layoutId).index;
|
|
2490
|
+
this.layouts[oldNxtLayoutIndex] = tempOldNxtLayout;
|
|
2491
|
+
}
|
|
2492
|
+
case 31:
|
|
2493
|
+
_context.next = 40;
|
|
2494
|
+
break;
|
|
2495
|
+
case 33:
|
|
2496
|
+
if (!(inputLayouts[nxtLayoutIndex].layoutId !== ((_this$nextLayout2 = this.nextLayout) === null || _this$nextLayout2 === void 0 ? void 0 : _this$nextLayout2.layoutId))) {
|
|
2497
|
+
_context.next = 39;
|
|
2498
|
+
break;
|
|
2499
|
+
}
|
|
2500
|
+
tempNewNxtLayout = _objectSpread2(_objectSpread2({}, initialLayout), inputLayouts[nxtLayoutIndex]);
|
|
2501
|
+
_context.next = 37;
|
|
2502
|
+
return this.prepareLayoutXlf(tempNewNxtLayout);
|
|
2503
|
+
case 37:
|
|
2504
|
+
this.nextLayout = _context.sent;
|
|
2505
|
+
this.layouts[nxtLayoutIndex] = this.nextLayout;
|
|
2506
|
+
case 39:
|
|
2507
|
+
// Remove old nextLayout if it's not in inputLayouts
|
|
2508
|
+
if (tempOldNxtLayout !== null && tempOldNxtLayout !== void 0 && tempOldNxtLayout.index && Boolean(this.layouts[tempOldNxtLayout === null || tempOldNxtLayout === void 0 ? void 0 : tempOldNxtLayout.index])) {
|
|
2509
|
+
if (inputLayouts.filter(function (_layout) {
|
|
2510
|
+
return _layout.layoutId === (tempOldNxtLayout === null || tempOldNxtLayout === void 0 ? void 0 : tempOldNxtLayout.layoutId);
|
|
2511
|
+
}).length === 0) {
|
|
2512
|
+
delete this.layouts[tempOldNxtLayout === null || tempOldNxtLayout === void 0 ? void 0 : tempOldNxtLayout.index];
|
|
2513
|
+
}
|
|
2514
|
+
}
|
|
2515
|
+
case 40:
|
|
2516
|
+
case "end":
|
|
2517
|
+
return _context.stop();
|
|
2518
|
+
}
|
|
2519
|
+
}, _callee, this);
|
|
2520
|
+
}));
|
|
2521
|
+
return function (_x) {
|
|
2522
|
+
return _ref.apply(this, arguments);
|
|
2523
|
+
};
|
|
2524
|
+
}();
|
|
2525
|
+
xlrObject.prepareLayouts = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2() {
|
|
2526
|
+
var _xlrLayouts$current;
|
|
2527
|
+
var self, xlrLayouts, layoutsXlf, layouts;
|
|
2528
|
+
return _regeneratorRuntime().wrap(function _callee2$(_context2) {
|
|
2529
|
+
while (1) switch (_context2.prev = _context2.next) {
|
|
2530
|
+
case 0:
|
|
2531
|
+
self = this; // Get layouts
|
|
2532
|
+
xlrLayouts = getLayout({
|
|
2533
|
+
xlr: self
|
|
2534
|
+
});
|
|
2535
|
+
console.debug('prepareLayouts::xlrLayouts', xlrLayouts);
|
|
2536
|
+
self.currentLayoutId = (_xlrLayouts$current = xlrLayouts.current) === null || _xlrLayouts$current === void 0 ? void 0 : _xlrLayouts$current.layoutId;
|
|
2537
|
+
layoutsXlf = function layoutsXlf() {
|
|
2538
|
+
var _xlrLayouts$current2, _xlrLayouts$next;
|
|
2539
|
+
var xlf = [];
|
|
2540
|
+
xlf.push(xlrLayouts.current);
|
|
2541
|
+
if (((_xlrLayouts$current2 = xlrLayouts.current) === null || _xlrLayouts$current2 === void 0 ? void 0 : _xlrLayouts$current2.layoutId) !== ((_xlrLayouts$next = xlrLayouts.next) === null || _xlrLayouts$next === void 0 ? void 0 : _xlrLayouts$next.layoutId)) {
|
|
2542
|
+
xlf.push(xlrLayouts.next);
|
|
2543
|
+
}
|
|
2544
|
+
return xlf.reduce(function (coll, item) {
|
|
2545
|
+
return [].concat(_toConsumableArray(coll), [self.prepareLayoutXlf(item)]);
|
|
2546
|
+
}, []);
|
|
2547
|
+
};
|
|
2548
|
+
_context2.next = 7;
|
|
2549
|
+
return Promise.all(layoutsXlf());
|
|
2550
|
+
case 7:
|
|
2551
|
+
layouts = _context2.sent;
|
|
2552
|
+
console.debug('prepareLayouts::layouts', layouts);
|
|
2553
|
+
console.debug('prepareLayouts::xlr>layouts', self.layouts);
|
|
2554
|
+
return _context2.abrupt("return", new Promise(function (resolve) {
|
|
2555
|
+
layouts.map(function (layoutItem) {
|
|
2556
|
+
if (!Boolean(self.layouts[layoutItem.index])) {
|
|
2557
|
+
self.layouts[layoutItem.index] = layoutItem;
|
|
2558
|
+
}
|
|
2559
|
+
});
|
|
2560
|
+
self.currentLayoutIndex = xlrLayouts.currentLayoutIndex;
|
|
2561
|
+
self.currentLayout = self.layouts[self.currentLayoutIndex];
|
|
2562
|
+
if (Boolean(layouts[1])) {
|
|
2563
|
+
self.nextLayout = layouts[1];
|
|
2564
|
+
} else {
|
|
2565
|
+
// Use current layout as next layout if only one layout is available
|
|
2566
|
+
self.nextLayout = self.layouts[0];
|
|
2567
|
+
}
|
|
2568
|
+
self.layouts[self.currentLayoutIndex] = self.currentLayout;
|
|
2569
|
+
resolve(self);
|
|
2570
|
+
}));
|
|
2571
|
+
case 11:
|
|
2572
|
+
case "end":
|
|
2573
|
+
return _context2.stop();
|
|
2574
|
+
}
|
|
2575
|
+
}, _callee2, this);
|
|
2576
|
+
}));
|
|
2577
|
+
xlrObject.prepareLayoutXlf = /*#__PURE__*/function () {
|
|
2578
|
+
var _ref3 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee3(inputLayout) {
|
|
2579
|
+
var _this3 = this;
|
|
2580
|
+
var self, newOptions, layoutXlf, layoutXlfNode, parser;
|
|
2581
|
+
return _regeneratorRuntime().wrap(function _callee3$(_context3) {
|
|
2582
|
+
while (1) switch (_context3.prev = _context3.next) {
|
|
2583
|
+
case 0:
|
|
2584
|
+
self = this; // Compose layout props first
|
|
2585
|
+
newOptions = Object.assign({}, platform);
|
|
2586
|
+
newOptions = _objectSpread2(_objectSpread2({}, newOptions), props.options);
|
|
2587
|
+
if (self.config.platform === 'CMS' && inputLayout && Boolean(inputLayout.layoutId)) {
|
|
2588
|
+
newOptions.xlfUrl = newOptions.xlfUrl.replace(':layoutId', String(inputLayout.layoutId));
|
|
2589
|
+
} else if (self.config.platform === 'chromeOS') {
|
|
2590
|
+
newOptions.xlfUrl = inputLayout.path;
|
|
2591
|
+
}
|
|
2592
|
+
if (!(inputLayout && inputLayout.layoutNode === null)) {
|
|
2593
|
+
_context3.next = 12;
|
|
2594
|
+
break;
|
|
2595
|
+
}
|
|
2596
|
+
_context3.next = 7;
|
|
2597
|
+
return getXlf(newOptions);
|
|
2598
|
+
case 7:
|
|
2599
|
+
layoutXlf = _context3.sent;
|
|
2600
|
+
parser = new window.DOMParser();
|
|
2601
|
+
layoutXlfNode = parser.parseFromString(layoutXlf, 'text/xml');
|
|
2602
|
+
_context3.next = 13;
|
|
2603
|
+
break;
|
|
2604
|
+
case 12:
|
|
2605
|
+
layoutXlfNode = inputLayout && inputLayout.layoutNode;
|
|
2606
|
+
case 13:
|
|
2607
|
+
return _context3.abrupt("return", new Promise(function (resolve) {
|
|
2608
|
+
var xlrLayoutObj = initialLayout;
|
|
2609
|
+
xlrLayoutObj.id = Number(inputLayout.layoutId);
|
|
2610
|
+
xlrLayoutObj.layoutId = Number(inputLayout.layoutId);
|
|
2611
|
+
xlrLayoutObj.options = newOptions;
|
|
2612
|
+
xlrLayoutObj.index = getIndexByLayoutId(_this3.inputLayouts, xlrLayoutObj.layoutId).index;
|
|
2613
|
+
resolve(Layout(layoutXlfNode, newOptions, self, xlrLayoutObj));
|
|
2614
|
+
}));
|
|
2615
|
+
case 14:
|
|
2616
|
+
case "end":
|
|
2617
|
+
return _context3.stop();
|
|
2618
|
+
}
|
|
2619
|
+
}, _callee3, this);
|
|
2620
|
+
}));
|
|
2621
|
+
return function (_x2) {
|
|
2622
|
+
return _ref3.apply(this, arguments);
|
|
2623
|
+
};
|
|
2624
|
+
}();
|
|
2625
|
+
xlrObject.bootstrap();
|
|
2626
|
+
return xlrObject;
|
|
2627
|
+
}
|
|
2628
|
+
|
|
2629
|
+
exports.default = XiboLayoutRenderer;
|
|
2630
|
+
exports.initialLayout = initialLayout;
|
|
2631
|
+
exports.initialMedia = initialMedia;
|
|
2632
|
+
exports.initialRegion = initialRegion;
|
|
2633
|
+
exports.initialXlr = initialXlr;
|
|
2634
|
+
//# sourceMappingURL=xibo-layout-renderer.cjs.js.map
|