1 import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core';
2 import { ActivatedRoute, Router } from '@angular/router';
3 import { BehaviorSubject } from 'rxjs/BehaviorSubject';
5 import { NotificationsService } from 'angular2-notifications';
12 import { AuthService, AuthUser } from '../../core';
13 import { RestPagination, Search, SearchField } from '../../shared';
14 import { SearchService } from '../../shared';
17 selector: 'my-videos-list',
18 styleUrls: [ './video-list.component.scss' ],
19 templateUrl: './video-list.component.html'
22 export class VideoListComponent implements OnInit, OnDestroy {
23 loading: BehaviorSubject<boolean> = new BehaviorSubject(false);
24 pagination: RestPagination = {
30 user: AuthUser = null;
33 private search: Search;
34 private subActivatedRoute: any;
35 private subSearch: any;
38 private notificationsService: NotificationsService,
39 private authService: AuthService,
40 private changeDetector: ChangeDetectorRef,
41 private router: Router,
42 private route: ActivatedRoute,
43 private videoService: VideoService,
44 private searchService: SearchService
48 if (this.authService.isLoggedIn()) {
49 this.user = AuthUser.load();
52 // Subscribe to route changes
53 this.subActivatedRoute = this.route.params.subscribe(routeParams => {
54 this.loadRouteParams(routeParams);
56 // Update the search service component
57 this.searchService.updateSearch.next(this.search);
61 // Subscribe to search changes
62 this.subSearch = this.searchService.searchUpdated.subscribe(search => {
65 this.pagination.currentPage = 1;
67 this.navigateToNewParams();
72 this.subActivatedRoute.unsubscribe();
73 this.subSearch.unsubscribe();
77 this.loading.next(true);
80 this.changeDetector.detectChanges();
82 let observable = null;
84 if (this.search.value) {
85 observable = this.videoService.searchVideos(this.search, this.pagination, this.sort);
87 observable = this.videoService.getVideos(this.pagination, this.sort);
91 ({ videos, totalVideos }) => {
93 this.pagination.totalItems = totalVideos;
95 this.loading.next(false);
97 error => this.notificationsService.error('Error', error.text)
102 return !this.loading.getValue() && this.videos.length === 0;
105 onPageChanged(event: any) {
106 // Be sure the current page is set
107 this.pagination.currentPage = event.page;
109 this.navigateToNewParams();
112 onRemoved(video: Video) {
113 this.notificationsService.success('Success', `Video ${video.name} deleted.`);
117 onSort(sort: SortField) {
120 this.navigateToNewParams();
123 private buildRouteParams() {
124 // There is always a sort and a current page
125 const params: any = {
127 page: this.pagination.currentPage
130 // Maybe there is a search
131 if (this.search.value) {
132 params.field = this.search.field;
133 params.search = this.search.value;
139 private loadRouteParams(routeParams) {
140 if (routeParams['search'] !== undefined) {
142 value: routeParams['search'],
143 field: <SearchField>routeParams['field']
152 this.sort = <SortField>routeParams['sort'] || '-createdAt';
154 if (routeParams['page'] !== undefined) {
155 this.pagination.currentPage = parseInt(routeParams['page']);
157 this.pagination.currentPage = 1;
160 this.changeDetector.detectChanges();
163 private navigateToNewParams() {
164 const routeParams = this.buildRouteParams();
165 this.router.navigate(['/videos/list', routeParams]);