X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=client%2Fsrc%2Fapp%2Fvideos%2Fvideo-list%2Fvideo-list.component.ts;h=4714ce01eb690c77cd50d9c4536569fb1d15d6f2;hb=db7af09bd8e9de57cdda88c2e32387551235b3a4;hp=b1ce5584526843dec4ada62c04edcaace8281dce;hpb=4a6995be18b15de1834a39c8921a0e4109671bb6;p=github%2FChocobozzz%2FPeerTube.git diff --git a/client/src/app/videos/video-list/video-list.component.ts b/client/src/app/videos/video-list/video-list.component.ts index b1ce55845..4714ce01e 100644 --- a/client/src/app/videos/video-list/video-list.component.ts +++ b/client/src/app/videos/video-list/video-list.component.ts @@ -1,105 +1,157 @@ -import { Component, OnInit } from '@angular/core'; -import { Router, ROUTER_DIRECTIVES, RouteParams } from '@angular/router-deprecated'; +import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core' +import { ActivatedRoute, Router } from '@angular/router' +import { Subscription } from 'rxjs/Subscription' +import { BehaviorSubject } from 'rxjs/BehaviorSubject' -import { PAGINATION_DIRECTIVES } from 'ng2-bootstrap/components/pagination'; +import { NotificationsService } from 'angular2-notifications' import { - LoaderComponent, - Pagination, SortField, Video, - VideoService -} from '../shared'; -import { AuthService, Search, SearchField, User } from '../../shared'; -import { VideoMiniatureComponent } from './video-miniature.component'; -import { VideoSortComponent } from './video-sort.component'; + VideoService, + VideoPagination +} from '../shared' +import { AuthService, AuthUser } from '../../core' +import { Search, SearchField, SearchService } from '../../shared' @Component({ selector: 'my-videos-list', - styles: [ require('./video-list.component.scss') ], - template: require('./video-list.component.html'), - directives: [ LoaderComponent, PAGINATION_DIRECTIVES, ROUTER_DIRECTIVES, VideoMiniatureComponent, VideoSortComponent ] + styleUrls: [ './video-list.component.scss' ], + templateUrl: './video-list.component.html' }) - -export class VideoListComponent implements OnInit { - loading = false; - pagination: Pagination = { +export class VideoListComponent implements OnInit, OnDestroy { + loading: BehaviorSubject = new BehaviorSubject(false) + pagination: VideoPagination = { currentPage: 1, - itemsPerPage: 9, - total: 0 - }; - sort: SortField; - user: User = null; - videos: Video[] = []; + itemsPerPage: 25, + totalItems: null + } + sort: SortField + user: AuthUser = null + videos: Video[] = [] - private search: Search; + private search: Search + private subActivatedRoute: Subscription + private subSearch: Subscription - constructor( + constructor ( + private notificationsService: NotificationsService, private authService: AuthService, + private changeDetector: ChangeDetectorRef, private router: Router, - private routeParams: RouteParams, - private videoService: VideoService - ) { - this.search = { - value: this.routeParams.get('search'), - field: this.routeParams.get('field') - }; - - this.sort = this.routeParams.get('sort') || '-createdDate'; - } + private route: ActivatedRoute, + private videoService: VideoService, + private searchService: SearchService + ) {} - ngOnInit() { + ngOnInit () { if (this.authService.isLoggedIn()) { - this.user = User.load(); + this.user = AuthUser.load() } - this.getVideos(); + // Subscribe to route changes + this.subActivatedRoute = this.route.params.subscribe(routeParams => { + this.loadRouteParams(routeParams) + + // Update the search service component + this.searchService.updateSearch.next(this.search) + this.getVideos() + }) + + // Subscribe to search changes + this.subSearch = this.searchService.searchUpdated.subscribe(search => { + this.search = search + // Reset pagination + this.pagination.currentPage = 1 + + this.navigateToNewParams() + }) } - getVideos() { - this.loading = true; - this.videos = []; + ngOnDestroy () { + this.subActivatedRoute.unsubscribe() + this.subSearch.unsubscribe() + } - let observable = null; + getVideos () { + this.loading.next(true) + this.videos = [] - if (this.search.value !== null) { - observable = this.videoService.searchVideos(this.search, this.pagination, this.sort); + let observable = null + if (this.search.value) { + observable = this.videoService.searchVideos(this.search, this.pagination, this.sort) } else { - observable = this.videoService.getVideos(this.pagination, this.sort); + observable = this.videoService.getVideos(this.pagination, this.sort) } observable.subscribe( ({ videos, totalVideos }) => { - this.videos = videos; - this.pagination.total = totalVideos; + this.videos = videos + this.pagination.totalItems = totalVideos - this.loading = false; + this.loading.next(false) }, - error => alert(error) - ); + error => this.notificationsService.error('Error', error.text) + ) } - noVideo() { - return !this.loading && this.videos.length === 0; + isThereNoVideo () { + return !this.loading.getValue() && this.videos.length === 0 } - onRemoved(video: Video) { - this.videos.splice(this.videos.indexOf(video), 1); + onPageChanged (event: { page: number }) { + // Be sure the current page is set + this.pagination.currentPage = event.page + + this.navigateToNewParams() } - onSort(sort: SortField) { - this.sort = sort; + onSort (sort: SortField) { + this.sort = sort + + this.navigateToNewParams() + } - const params: any = { - sort: this.sort - }; + private buildRouteParams () { + // There is always a sort and a current page + const params = { + sort: this.sort, + page: this.pagination.currentPage + } + // Maybe there is a search if (this.search.value) { - params.field = this.search.field; - params.search = this.search.value; + params['field'] = this.search.field + params['search'] = this.search.value + } + + return params + } + + private loadRouteParams (routeParams: { [ key: string ]: any }) { + if (routeParams['search'] !== undefined) { + this.search = { + value: routeParams['search'], + field: routeParams['field'] as SearchField + } + } else { + this.search = { + value: '', + field: 'name' + } } - this.router.navigate(['VideosList', params]); - this.getVideos(); + this.sort = routeParams['sort'] as SortField || '-createdAt' + + if (routeParams['page'] !== undefined) { + this.pagination.currentPage = parseInt(routeParams['page'], 10) + } else { + this.pagination.currentPage = 1 + } + } + + private navigateToNewParams () { + const routeParams = this.buildRouteParams() + this.router.navigate([ '/videos/list', routeParams ]) } }