diff options
author | Chocobozzz <me@florianbigard.com> | 2022-03-01 11:11:12 +0100 |
---|---|---|
committer | Chocobozzz <me@florianbigard.com> | 2022-03-01 13:37:40 +0100 |
commit | 19e7a90045345b531a489289dc8d4e032fa15d6c (patch) | |
tree | 45778fcedfa107062c553c170806946a1735d07a /client/src | |
parent | 7bde625050cb661f51db20992f9f3912a582fcee (diff) | |
download | PeerTube-19e7a90045345b531a489289dc8d4e032fa15d6c.tar.gz PeerTube-19e7a90045345b531a489289dc8d4e032fa15d6c.tar.zst PeerTube-19e7a90045345b531a489289dc8d4e032fa15d6c.zip |
Fix playlist element scrolling
Diffstat (limited to 'client/src')
-rw-r--r-- | client/src/app/+videos/+video-watch/shared/playlist/video-watch-playlist.component.scss | 1 | ||||
-rw-r--r-- | client/src/app/+videos/+video-watch/shared/playlist/video-watch-playlist.component.ts | 10 | ||||
-rw-r--r-- | client/src/app/+videos/+video-watch/video-watch.component.html | 6 | ||||
-rw-r--r-- | client/src/app/helpers/utils/dom.ts (renamed from client/src/app/helpers/utils/ui.ts) | 26 | ||||
-rw-r--r-- | client/src/app/helpers/utils/index.ts | 2 |
5 files changed, 29 insertions, 16 deletions
diff --git a/client/src/app/+videos/+video-watch/shared/playlist/video-watch-playlist.component.scss b/client/src/app/+videos/+video-watch/shared/playlist/video-watch-playlist.component.scss index 75ed9d901..fc67ac65a 100644 --- a/client/src/app/+videos/+video-watch/shared/playlist/video-watch-playlist.component.scss +++ b/client/src/app/+videos/+video-watch/shared/playlist/video-watch-playlist.component.scss | |||
@@ -4,6 +4,7 @@ | |||
4 | @use '_miniature' as *; | 4 | @use '_miniature' as *; |
5 | 5 | ||
6 | .playlist { | 6 | .playlist { |
7 | position: relative; | ||
7 | min-width: 200px; | 8 | min-width: 200px; |
8 | max-width: 470px; | 9 | max-width: 470px; |
9 | height: 66vh; | 10 | height: 66vh; |
diff --git a/client/src/app/+videos/+video-watch/shared/playlist/video-watch-playlist.component.ts b/client/src/app/+videos/+video-watch/shared/playlist/video-watch-playlist.component.ts index b44238310..879d296a7 100644 --- a/client/src/app/+videos/+video-watch/shared/playlist/video-watch-playlist.component.ts +++ b/client/src/app/+videos/+video-watch/shared/playlist/video-watch-playlist.component.ts | |||
@@ -1,9 +1,10 @@ | |||
1 | import { Component, EventEmitter, Input, Output } from '@angular/core' | 1 | import { Component, EventEmitter, Input, Output } from '@angular/core' |
2 | import { Router } from '@angular/router' | 2 | import { Router } from '@angular/router' |
3 | import { AuthService, ComponentPagination, HooksService, Notifier, SessionStorageService, UserService } from '@app/core' | 3 | import { AuthService, ComponentPagination, HooksService, Notifier, SessionStorageService, UserService } from '@app/core' |
4 | import { isInViewport } from '@app/helpers' | ||
4 | import { VideoPlaylist, VideoPlaylistElement, VideoPlaylistService } from '@app/shared/shared-video-playlist' | 5 | import { VideoPlaylist, VideoPlaylistElement, VideoPlaylistService } from '@app/shared/shared-video-playlist' |
5 | import { peertubeSessionStorage } from '@root-helpers/peertube-web-storage' | ||
6 | import { getBoolOrDefault } from '@root-helpers/local-storage-utils' | 6 | import { getBoolOrDefault } from '@root-helpers/local-storage-utils' |
7 | import { peertubeSessionStorage } from '@root-helpers/peertube-web-storage' | ||
7 | import { VideoPlaylistPrivacy } from '@shared/models' | 8 | import { VideoPlaylistPrivacy } from '@shared/models' |
8 | 9 | ||
9 | @Component({ | 10 | @Component({ |
@@ -132,7 +133,12 @@ export class VideoWatchPlaylistComponent { | |||
132 | this.videoFound.emit(playlistElement.video.uuid) | 133 | this.videoFound.emit(playlistElement.video.uuid) |
133 | 134 | ||
134 | setTimeout(() => { | 135 | setTimeout(() => { |
135 | document.querySelector('.element-' + this.currentPlaylistPosition).scrollIntoView(false) | 136 | const element = document.querySelector<HTMLElement>('.element-' + this.currentPlaylistPosition) |
137 | const container = document.querySelector<HTMLElement>('.playlist') | ||
138 | |||
139 | if (isInViewport(element, container)) return | ||
140 | |||
141 | container.scrollTop = element.offsetTop | ||
136 | }) | 142 | }) |
137 | 143 | ||
138 | return | 144 | return |
diff --git a/client/src/app/+videos/+video-watch/video-watch.component.html b/client/src/app/+videos/+video-watch/video-watch.component.html index 830215225..4c15ae3d7 100644 --- a/client/src/app/+videos/+video-watch/video-watch.component.html +++ b/client/src/app/+videos/+video-watch/video-watch.component.html | |||
@@ -11,11 +11,7 @@ | |||
11 | <img class="placeholder-image" *ngIf="playerPlaceholderImgSrc" [src]="playerPlaceholderImgSrc" alt="Placeholder image" i18n-alt> | 11 | <img class="placeholder-image" *ngIf="playerPlaceholderImgSrc" [src]="playerPlaceholderImgSrc" alt="Placeholder image" i18n-alt> |
12 | </div> | 12 | </div> |
13 | 13 | ||
14 | <my-video-watch-playlist | 14 | <my-video-watch-playlist #videoWatchPlaylist [playlist]="playlist" (videoFound)="onPlaylistVideoFound($event)"></my-video-watch-playlist> |
15 | #videoWatchPlaylist | ||
16 | [playlist]="playlist" class="playlist" | ||
17 | (videoFound)="onPlaylistVideoFound($event)" | ||
18 | ></my-video-watch-playlist> | ||
19 | 15 | ||
20 | <my-plugin-placeholder pluginId="player-next"></my-plugin-placeholder> | 16 | <my-plugin-placeholder pluginId="player-next"></my-plugin-placeholder> |
21 | </div> | 17 | </div> |
diff --git a/client/src/app/helpers/utils/ui.ts b/client/src/app/helpers/utils/dom.ts index ac8298926..f65e4d726 100644 --- a/client/src/app/helpers/utils/ui.ts +++ b/client/src/app/helpers/utils/dom.ts | |||
@@ -6,14 +6,24 @@ function scrollToTop (behavior: 'auto' | 'smooth' = 'auto') { | |||
6 | }) | 6 | }) |
7 | } | 7 | } |
8 | 8 | ||
9 | function isInViewport (el: HTMLElement) { | 9 | function isInViewport (el: HTMLElement, container: HTMLElement = document.documentElement) { |
10 | const bounding = el.getBoundingClientRect() | 10 | const boundingEl = el.getBoundingClientRect() |
11 | return ( | 11 | const boundingContainer = container.getBoundingClientRect() |
12 | bounding.top >= 0 && | 12 | |
13 | bounding.left >= 0 && | 13 | const relativePos = { |
14 | bounding.bottom <= (window.innerHeight || document.documentElement.clientHeight) && | 14 | top: 0, |
15 | bounding.right <= (window.innerWidth || document.documentElement.clientWidth) | 15 | left: 0, |
16 | ) | 16 | bottom: 0, |
17 | right: 0 | ||
18 | } | ||
19 | |||
20 | relativePos.top = boundingEl.top - boundingContainer.top | ||
21 | relativePos.left = boundingEl.left - boundingContainer.left | ||
22 | |||
23 | return relativePos.top >= 0 && | ||
24 | relativePos.left >= 0 && | ||
25 | boundingEl.bottom <= boundingContainer.bottom && | ||
26 | boundingEl.right <= boundingContainer.right | ||
17 | } | 27 | } |
18 | 28 | ||
19 | function isXPercentInViewport (el: HTMLElement, percentVisible: number) { | 29 | function isXPercentInViewport (el: HTMLElement, percentVisible: number) { |
diff --git a/client/src/app/helpers/utils/index.ts b/client/src/app/helpers/utils/index.ts index dc09c92ab..f821985c9 100644 --- a/client/src/app/helpers/utils/index.ts +++ b/client/src/app/helpers/utils/index.ts | |||
@@ -2,6 +2,6 @@ export * from './channel' | |||
2 | export * from './date' | 2 | export * from './date' |
3 | export * from './html' | 3 | export * from './html' |
4 | export * from './object' | 4 | export * from './object' |
5 | export * from './ui' | 5 | export * from './dom' |
6 | export * from './upload' | 6 | export * from './upload' |
7 | export * from './url' | 7 | export * from './url' |