@flexem/fc-gui 3.0.0-alpha.89 → 3.0.0-alpha.90
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/CHANGELOG.md +7 -0
- package/bundles/@flexem/fc-gui.umd.js +238 -478
- package/bundles/@flexem/fc-gui.umd.js.map +1 -1
- package/bundles/@flexem/fc-gui.umd.min.js +4 -4
- package/bundles/@flexem/fc-gui.umd.min.js.map +1 -1
- package/elements/video/video-element.d.ts +4 -0
- package/elements/video/video-element.js +69 -20
- package/elements/video/video-element.metadata.json +1 -1
- package/elements/view-operation/view-operation.element.js +1 -1
- package/package.json +1 -1
|
@@ -16,6 +16,9 @@ export declare class VideoElement extends ConditionalDisplayElement {
|
|
|
16
16
|
private videoId;
|
|
17
17
|
private isShow;
|
|
18
18
|
private videoPlayer;
|
|
19
|
+
private refreshTimer;
|
|
20
|
+
private isFullscreen;
|
|
21
|
+
private videoUrl;
|
|
19
22
|
constructor(element: HTMLElement, injector: Injector, permissionChecker: PermissionChecker, variableCommunicator: VariableCommunicator, variableStore: VariableStore, videoService: VideoService, guiSize: Size, svgRootClass: string, signalRAppId: string);
|
|
20
23
|
dispose(): void;
|
|
21
24
|
hide(): void;
|
|
@@ -24,4 +27,5 @@ export declare class VideoElement extends ConditionalDisplayElement {
|
|
|
24
27
|
private initVideo;
|
|
25
28
|
private addVideoAddressToolTip;
|
|
26
29
|
private setAndroidVideo;
|
|
30
|
+
private setIosVideo;
|
|
27
31
|
}
|
|
@@ -11,6 +11,7 @@ export class VideoElement extends ConditionalDisplayElement {
|
|
|
11
11
|
this.guiSize = guiSize;
|
|
12
12
|
this.svgRootClass = svgRootClass;
|
|
13
13
|
this.videoId = '';
|
|
14
|
+
this.isFullscreen = false;
|
|
14
15
|
this.isMobileMode = DisplayMode.Mobile === injector.get(GlobalSettings).displayMode;
|
|
15
16
|
this.localization = injector.get(LOCALIZATION);
|
|
16
17
|
this.init();
|
|
@@ -50,12 +51,13 @@ export class VideoElement extends ConditionalDisplayElement {
|
|
|
50
51
|
.attr('width', this.model.size.width)
|
|
51
52
|
.attr('height', this.model.size.height);
|
|
52
53
|
this.videoService.getVideoUrl(this.model.videoTag).then(result => {
|
|
53
|
-
this.
|
|
54
|
+
this.videoUrl = result.url;
|
|
55
|
+
this.initVideo(result.url, this.videoId);
|
|
54
56
|
}).catch(() => {
|
|
55
57
|
throw new Error('Failure of the videoService');
|
|
56
58
|
});
|
|
57
59
|
}
|
|
58
|
-
initVideo(videoUrl,
|
|
60
|
+
initVideo(videoUrl, videoId) {
|
|
59
61
|
const patt = /https:.+.m3u8/;
|
|
60
62
|
if (videoUrl.indexOf('http:') !== -1) {
|
|
61
63
|
videoUrl = videoUrl.replace('http:', 'https:');
|
|
@@ -68,6 +70,8 @@ export class VideoElement extends ConditionalDisplayElement {
|
|
|
68
70
|
this.addVideoAddressToolTip(videoToolTip);
|
|
69
71
|
return;
|
|
70
72
|
}
|
|
73
|
+
const isAndroid = !!navigator.userAgent.match(/(Android)/i);
|
|
74
|
+
const isIos = !!navigator.userAgent.match(/(Mac)/i);
|
|
71
75
|
const currentRect = this.$element.find('rect#rect' + videoId).first();
|
|
72
76
|
if (!currentRect.length) {
|
|
73
77
|
return;
|
|
@@ -77,16 +81,18 @@ export class VideoElement extends ConditionalDisplayElement {
|
|
|
77
81
|
const chartHeight = clientRect.height;
|
|
78
82
|
const left = this.model.location.x / this.guiSize.width * $('.' + this.svgRootClass).find('.svg-content').width();
|
|
79
83
|
const top = this.model.location.y / this.guiSize.height * $('.' + this.svgRootClass).find('.svg-content').height();
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
84
|
+
const scareX = this.model.location.x / this.guiSize.width;
|
|
85
|
+
const scareY = this.model.location.y / this.guiSize.height;
|
|
86
|
+
if (isIos) {
|
|
87
|
+
videoUrl = videoUrl + '#t=1';
|
|
88
|
+
}
|
|
89
|
+
const preload = isIos ? ' preload=\'metadata\'' : '';
|
|
90
|
+
let videoHtml = `<video scareX="${scareX}"
|
|
91
|
+
scareY="${scareY}" id="${videoId}" ${preload} src="${videoUrl}" width="${chartWidth}" height="${chartHeight}"
|
|
92
|
+
style="position: absolute;top:${top}px;left:${left}px;object-fit:fill;z-index:0;"
|
|
93
|
+
playsInline webkit-playsinline `;
|
|
85
94
|
if (this.isMobileMode) {
|
|
86
95
|
if (isAndroid) {
|
|
87
|
-
if (isMobileType) {
|
|
88
|
-
videoHtml += ' controls ';
|
|
89
|
-
}
|
|
90
96
|
videoHtml += ' autoplay muted></video>';
|
|
91
97
|
}
|
|
92
98
|
else {
|
|
@@ -100,10 +106,20 @@ export class VideoElement extends ConditionalDisplayElement {
|
|
|
100
106
|
if (this.isShow === false) {
|
|
101
107
|
$('#' + this.videoId).hide();
|
|
102
108
|
}
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
109
|
+
setTimeout(() => {
|
|
110
|
+
if (isAndroid) {
|
|
111
|
+
this.setAndroidVideo(videoId);
|
|
112
|
+
}
|
|
113
|
+
else if (isIos) {
|
|
114
|
+
this.setIosVideo(this.videoUrl, videoId);
|
|
115
|
+
}
|
|
116
|
+
this.videoPlayer = new EZUIPlayer(videoId);
|
|
117
|
+
}, 1000);
|
|
118
|
+
const style = document.createElement('style');
|
|
119
|
+
style.innerHTML = `#${videoId}::-webkit-media-controls-enclosure {
|
|
120
|
+
display: none;
|
|
121
|
+
}`;
|
|
122
|
+
document.head.append();
|
|
107
123
|
}
|
|
108
124
|
addVideoAddressToolTip(videoToolTip) {
|
|
109
125
|
const size = this.model.size;
|
|
@@ -126,35 +142,68 @@ export class VideoElement extends ConditionalDisplayElement {
|
|
|
126
142
|
this.$element.append(textElement.Element);
|
|
127
143
|
}
|
|
128
144
|
setAndroidVideo(videoId) {
|
|
129
|
-
let isFullscreen = false;
|
|
130
145
|
const videoElement = $('#' + videoId);
|
|
131
146
|
let preHeight = videoElement.height();
|
|
132
147
|
let preWidth = videoElement.width();
|
|
133
148
|
let preTop = videoElement.css('top');
|
|
134
149
|
let preLeft = videoElement.css('left');
|
|
150
|
+
const { StatusBar } = window;
|
|
135
151
|
videoElement.on('click', () => {
|
|
136
|
-
if (!isFullscreen) {
|
|
152
|
+
if (!this.isFullscreen) {
|
|
153
|
+
if (StatusBar) {
|
|
154
|
+
StatusBar.hide();
|
|
155
|
+
}
|
|
137
156
|
preHeight = videoElement.height();
|
|
138
157
|
preWidth = videoElement.width();
|
|
139
158
|
preTop = videoElement.css('top');
|
|
140
159
|
preLeft = videoElement.css('left');
|
|
141
|
-
const width = document.
|
|
142
|
-
const height =
|
|
160
|
+
const width = document.documentElement.clientWidth;
|
|
161
|
+
const height = document.documentElement.clientHeight;
|
|
162
|
+
videoElement.css('object-fit', 'contain');
|
|
163
|
+
videoElement.css('background', '#000000');
|
|
143
164
|
videoElement.css('width', width + 'px');
|
|
144
165
|
videoElement.css('height', height + 'px');
|
|
145
166
|
videoElement.css('left', '0px');
|
|
146
167
|
videoElement.css('top', '0px');
|
|
147
168
|
videoElement.css('z-index', '99');
|
|
148
|
-
|
|
169
|
+
videoElement.css('position', 'fixed');
|
|
170
|
+
this.isFullscreen = true;
|
|
171
|
+
try {
|
|
172
|
+
screen.orientation.lock(screen.orientation.type);
|
|
173
|
+
}
|
|
174
|
+
catch (error) {
|
|
175
|
+
console.error(error);
|
|
176
|
+
}
|
|
149
177
|
}
|
|
150
178
|
else {
|
|
179
|
+
videoElement.css('object-fit', 'fill');
|
|
151
180
|
videoElement.css('width', preWidth + 'px');
|
|
152
181
|
videoElement.css('height', preHeight + 'px');
|
|
153
182
|
videoElement.css('left', preLeft);
|
|
154
183
|
videoElement.css('top', preTop);
|
|
155
184
|
videoElement.css('z-index', '0');
|
|
156
|
-
|
|
185
|
+
videoElement.css('position', 'absolute');
|
|
186
|
+
this.isFullscreen = false;
|
|
187
|
+
try {
|
|
188
|
+
if (screen.orientation.type.includes('portrait')) {
|
|
189
|
+
StatusBar.show();
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
catch (error) {
|
|
193
|
+
console.error(error);
|
|
194
|
+
}
|
|
157
195
|
}
|
|
158
196
|
});
|
|
159
197
|
}
|
|
198
|
+
setIosVideo(videoUrl, videoId) {
|
|
199
|
+
const video = $('#' + this.videoId);
|
|
200
|
+
video.on('webkitendfullscreen', () => {
|
|
201
|
+
video.remove();
|
|
202
|
+
clearTimeout(this.refreshTimer);
|
|
203
|
+
this.refreshTimer = null;
|
|
204
|
+
this.refreshTimer = setTimeout(() => {
|
|
205
|
+
this.initVideo(videoUrl, videoId);
|
|
206
|
+
}, 500);
|
|
207
|
+
});
|
|
208
|
+
}
|
|
160
209
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
[{"__symbolic":"module","version":4,"metadata":{"VideoElement":{"__symbolic":"class","extends":{"__symbolic":"reference","module":"../base/conditional-display-element","name":"ConditionalDisplayElement","line":15,"character":34},"members":{"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"error","message":"Could not resolve type","line":
|
|
1
|
+
[{"__symbolic":"module","version":4,"metadata":{"VideoElement":{"__symbolic":"class","extends":{"__symbolic":"reference","module":"../base/conditional-display-element","name":"ConditionalDisplayElement","line":15,"character":34},"members":{"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"error","message":"Could not resolve type","line":27,"character":25,"context":{"typeName":"HTMLElement"}},{"__symbolic":"reference","module":"@angular/core","name":"Injector","line":28,"character":18},{"__symbolic":"reference","module":"../../service","name":"PermissionChecker","line":29,"character":27},{"__symbolic":"reference","module":"../../communication","name":"VariableCommunicator","line":30,"character":30},{"__symbolic":"reference","module":"../../config","name":"VariableStore","line":31,"character":23},{"__symbolic":"reference","module":"../../service","name":"VideoService","line":32,"character":39},{"__symbolic":"reference","module":"../../model","name":"Size","line":33,"character":34},{"__symbolic":"reference","name":"string"},{"__symbolic":"reference","name":"string"}]}],"dispose":[{"__symbolic":"method"}],"hide":[{"__symbolic":"method"}],"show":[{"__symbolic":"method"}],"init":[{"__symbolic":"method"}],"initVideo":[{"__symbolic":"method"}],"addVideoAddressToolTip":[{"__symbolic":"method"}],"setAndroidVideo":[{"__symbolic":"method"}],"setIosVideo":[{"__symbolic":"method"}]}}}}]
|
|
@@ -180,7 +180,7 @@ export class ViewOperationElement extends ConditionalEnableElement {
|
|
|
180
180
|
}
|
|
181
181
|
closeView() {
|
|
182
182
|
this.popupViewService.closeView();
|
|
183
|
-
if ($(`#${this.hostContainerId} svg`).length ===
|
|
183
|
+
if ($(`#${this.hostContainerId} > svg > svg`).length === 0) {
|
|
184
184
|
$(`#${this.hostContainerId} .video-hidden`)
|
|
185
185
|
.removeClass('video-hidden')
|
|
186
186
|
.css('visibility', 'visible');
|