@flexem/fc-gui 3.0.0-alpha.86 → 3.0.0-alpha.88

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.
@@ -16,15 +16,12 @@ export declare class VideoElement extends ConditionalDisplayElement {
16
16
  private videoId;
17
17
  private isShow;
18
18
  private videoPlayer;
19
- private resetTimer;
20
- private refreshTimer;
21
- private isMobileType;
22
19
  constructor(element: HTMLElement, injector: Injector, permissionChecker: PermissionChecker, variableCommunicator: VariableCommunicator, variableStore: VariableStore, videoService: VideoService, guiSize: Size, svgRootClass: string, signalRAppId: string);
23
20
  dispose(): void;
24
21
  hide(): void;
25
22
  show(): void;
26
23
  private init;
24
+ private initVideo;
27
25
  private addVideoAddressToolTip;
28
26
  private setAndroidVideo;
29
- private bindFullscreenEvent;
30
27
  }
@@ -46,60 +46,64 @@ export class VideoElement extends ConditionalDisplayElement {
46
46
  return;
47
47
  }
48
48
  this.videoId = Guid.newGuid().toString('n');
49
+ this.rootElement.append('rect').attr('id', 'rect' + this.videoId).attr('fill', 'transparent')
50
+ .attr('width', this.model.size.width)
51
+ .attr('height', this.model.size.height);
49
52
  this.videoService.getVideoUrl(this.model.videoTag).then(result => {
50
- this.isMobileType = result.isMobileType;
51
- const isAndroid = !!navigator.userAgent.match(/(Android)/i);
52
- let videoUrl = result.url;
53
- const patt = /https:.+.m3u8/;
54
- if (videoUrl.indexOf('http:') !== -1) {
55
- videoUrl = videoUrl.replace('http:', 'https:');
56
- }
57
- if (!patt.test(videoUrl)) {
58
- let videoToolTip = this.localization.invalidVideoAddress;
59
- if (isNil(videoUrl) || videoUrl === '') {
60
- videoToolTip = this.localization.unconfiguredVideoAddress;
61
- }
62
- this.addVideoAddressToolTip(videoToolTip);
63
- return;
53
+ this.initVideo(result.url, result.isMobileType, this.videoId);
54
+ }).catch(() => {
55
+ throw new Error('Failure of the videoService');
56
+ });
57
+ }
58
+ initVideo(videoUrl, isMobileType, videoId) {
59
+ const patt = /https:.+.m3u8/;
60
+ if (videoUrl.indexOf('http:') !== -1) {
61
+ videoUrl = videoUrl.replace('http:', 'https:');
62
+ }
63
+ if (!patt.test(videoUrl)) {
64
+ let videoToolTip = this.localization.invalidVideoAddress;
65
+ if (isNil(videoUrl) || videoUrl === '') {
66
+ videoToolTip = this.localization.unconfiguredVideoAddress;
64
67
  }
65
- const video = this.rootElement.append('foreignObject')
66
- .attr('x', 0)
67
- .attr('y', 0)
68
- .attr('width', this.model.size.width)
69
- .attr('height', this.model.size.height)
70
- .append('xhtml:video')
71
- .attr('id', this.videoId)
72
- .attr('class', 'element-video')
73
- .attr('scareX', this.model.location.x / this.guiSize.width)
74
- .attr('scareY', this.model.location.y / this.guiSize.height)
75
- .attr('src', videoUrl)
76
- .style('width', '100%')
77
- .style('height', '100%')
78
- .style('object-fit', 'fill')
79
- .attr('playsInline', true)
80
- .attr('webkit-playsinline', true)
81
- .attr('controls', true)
82
- .attr('muted', true);
83
- if (this.isMobileMode) {
84
- if (isAndroid) {
85
- video.attr('autoplay', true);
68
+ this.addVideoAddressToolTip(videoToolTip);
69
+ return;
70
+ }
71
+ const currentRect = this.$element.find('rect#rect' + videoId).first();
72
+ if (!currentRect.length) {
73
+ return;
74
+ }
75
+ const clientRect = currentRect[0].getBoundingClientRect();
76
+ const chartWidth = clientRect.width;
77
+ const chartHeight = clientRect.height;
78
+ const left = this.model.location.x / this.guiSize.width * $('.' + this.svgRootClass).find('.svg-content').width();
79
+ const top = this.model.location.y / this.guiSize.height * $('.' + this.svgRootClass).find('.svg-content').height();
80
+ let videoHtml = `<video scareX="${this.model.location.x / this.guiSize.width}"
81
+ scareY="${this.model.location.y / this.guiSize.height}" id="${videoId}" src="${videoUrl}" style="
82
+ position: absolute;top:${top}px;left:${left}px;width:${chartWidth}px;height:${chartHeight}px;object-fit:fill;z-index:0"
83
+ playsInline webkit-playsinline `;
84
+ const isAndroid = !!navigator.userAgent.match(/(Android)/i);
85
+ if (this.isMobileMode) {
86
+ if (isAndroid) {
87
+ if (isMobileType) {
88
+ videoHtml += ' controls ';
86
89
  }
90
+ videoHtml += ' autoplay muted></video>';
87
91
  }
88
92
  else {
89
- video.attr('autoplay', true);
90
- }
91
- if (this.isShow === false) {
92
- $('#' + this.videoId).hide();
93
+ videoHtml += ' controls muted></video>';
93
94
  }
94
- this.videoPlayer = new EZUIPlayer(this.videoId);
95
- if (isAndroid) {
96
- setTimeout(() => {
97
- this.setAndroidVideo();
98
- }, 500);
99
- }
100
- }).catch(() => {
101
- throw new Error('Failure of the videoService');
102
- });
95
+ }
96
+ else {
97
+ videoHtml += ' controls autoplay muted></video>';
98
+ }
99
+ $('.' + this.svgRootClass).find('.svg-content').append(videoHtml);
100
+ if (this.isShow === false) {
101
+ $('#' + this.videoId).hide();
102
+ }
103
+ this.videoPlayer = new EZUIPlayer(videoId);
104
+ if (isAndroid && !isMobileType) {
105
+ this.setAndroidVideo(videoId);
106
+ }
103
107
  }
104
108
  addVideoAddressToolTip(videoToolTip) {
105
109
  const size = this.model.size;
@@ -121,50 +125,35 @@ export class VideoElement extends ConditionalDisplayElement {
121
125
  const textElement = new TextElementModal(videoToolTip, font, size.width, size.height);
122
126
  this.$element.append(textElement.Element);
123
127
  }
124
- setAndroidVideo() {
125
- const { StatusBar } = window;
126
- this.bindFullscreenEvent();
127
- window.addEventListener('orientationchange', () => {
128
- StatusBar.show();
129
- this.hide();
130
- clearTimeout(this.refreshTimer);
131
- this.refreshTimer = null;
132
- this.refreshTimer = setTimeout(() => {
133
- this.init();
134
- this.show();
135
- }, 1000);
136
- });
137
- }
138
- bindFullscreenEvent() {
139
- const that = this;
140
- const { StatusBar } = window;
141
- $('#' + this.videoId).bind('webkitfullscreenchange', () => {
142
- if (document.webkitIsFullScreen) {
143
- $('#' + that.videoId).css({
144
- 'object-fit': 'contain',
145
- 'z-index': 99
146
- });
147
- StatusBar.hide();
128
+ setAndroidVideo(videoId) {
129
+ let isFullscreen = false;
130
+ const videoElement = $('#' + videoId);
131
+ let preHeight = videoElement.height();
132
+ let preWidth = videoElement.width();
133
+ let preTop = videoElement.css('top');
134
+ let preLeft = videoElement.css('left');
135
+ videoElement.on('click', () => {
136
+ if (!isFullscreen) {
137
+ preHeight = videoElement.height();
138
+ preWidth = videoElement.width();
139
+ preTop = videoElement.css('top');
140
+ preLeft = videoElement.css('left');
141
+ const width = document.body.clientWidth;
142
+ const height = width * 9 / 16;
143
+ videoElement.css('width', width + 'px');
144
+ videoElement.css('height', height + 'px');
145
+ videoElement.css('left', '0px');
146
+ videoElement.css('top', '0px');
147
+ videoElement.css('z-index', '99');
148
+ isFullscreen = true;
148
149
  }
149
150
  else {
150
- StatusBar.show();
151
- if (that.isMobileType) {
152
- $('#' + this.videoId).css('object-fit', document.webkitIsFullScreen ? 'contain' : 'fill');
153
- }
154
- else {
155
- clearTimeout(this.resetTimer);
156
- this.resetTimer = null;
157
- $('#' + this.videoId).css('display', 'none');
158
- this.resetTimer = setTimeout(() => {
159
- $('#' + this.videoId).css({
160
- 'width': '100%',
161
- 'height': '100%',
162
- 'display': 'block',
163
- 'z-index': 0,
164
- 'object-fit': document.webkitIsFullScreen ? 'contain' : 'fill'
165
- });
166
- }, 1000);
167
- }
151
+ videoElement.css('width', preWidth + 'px');
152
+ videoElement.css('height', preHeight + 'px');
153
+ videoElement.css('left', preLeft);
154
+ videoElement.css('top', preTop);
155
+ videoElement.css('z-index', '0');
156
+ isFullscreen = false;
168
157
  }
169
158
  });
170
159
  }
@@ -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":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"}],"addVideoAddressToolTip":[{"__symbolic":"method"}],"setAndroidVideo":[{"__symbolic":"method"}],"bindFullscreenEvent":[{"__symbolic":"method"}]}}}}]
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":23,"character":25,"context":{"typeName":"HTMLElement"}},{"__symbolic":"reference","module":"@angular/core","name":"Injector","line":24,"character":18},{"__symbolic":"reference","module":"../../service","name":"PermissionChecker","line":25,"character":27},{"__symbolic":"reference","module":"../../communication","name":"VariableCommunicator","line":26,"character":30},{"__symbolic":"reference","module":"../../config","name":"VariableStore","line":27,"character":23},{"__symbolic":"reference","module":"../../service","name":"VideoService","line":28,"character":39},{"__symbolic":"reference","module":"../../model","name":"Size","line":29,"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"}]}}}}]
@@ -170,6 +170,9 @@ export class ViewOperationElement extends ConditionalEnableElement {
170
170
  const viewIndex = this.model.viewIndex;
171
171
  if (null != viewIndex) {
172
172
  this.popupViewService.popView(viewIndex, this.hostContainerId, this.el).subscribe(() => this.recordViewOperation(), error => this.logger.error(`ToggleView(${viewIndex}) failed. ${error}`));
173
+ $(`#${this.hostContainerId} video`)
174
+ .addClass('video-hidden')
175
+ .css('visibility', 'hidden');
173
176
  }
174
177
  else {
175
178
  this.logger.error('[GUI]Toggle View:invalid view index');
@@ -177,6 +180,9 @@ export class ViewOperationElement extends ConditionalEnableElement {
177
180
  }
178
181
  closeView() {
179
182
  this.popupViewService.closeView();
183
+ $(`#${this.hostContainerId} .video-hidden`)
184
+ .removeClass('video-hidden')
185
+ .css('visibility', 'visible');
180
186
  this.recordViewOperation();
181
187
  }
182
188
  moveView(movementX, movementY) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "main": "bundles/fc-gui.umd.js",
3
- "version": "3.0.0-alpha.86",
3
+ "version": "3.0.0-alpha.88",
4
4
  "module": "public_api.js",
5
5
  "typings": "public_api.d.ts",
6
6
  "license": "UNLICENSED",