Add trivial sort for the client
This commit is contained in:
parent
8140a704bb
commit
cf20596c10
|
@ -68,7 +68,6 @@ export class AppComponent {
|
||||||
}
|
}
|
||||||
|
|
||||||
onSearch(search: Search) {
|
onSearch(search: Search) {
|
||||||
console.log(search);
|
|
||||||
if (search.value !== '') {
|
if (search.value !== '') {
|
||||||
this._router.navigate(['VideosList', { search: search.value, field: search.field }]);
|
this._router.navigate(['VideosList', { search: search.value, field: search.field }]);
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -0,0 +1,3 @@
|
||||||
|
export type SortField = "name" | "-name"
|
||||||
|
| "duration" | "-duration"
|
||||||
|
| "createdDate" | "-createdDate";
|
|
@ -0,0 +1,5 @@
|
||||||
|
<select [(ngModel)]="currentSort" (ngModelChange)="onSortChange()">
|
||||||
|
<option *ngFor="let choice of choiceKeys" [value]="choice">
|
||||||
|
{{ getStringChoice(choice) }}
|
||||||
|
</option>
|
||||||
|
</select>
|
|
@ -0,0 +1,36 @@
|
||||||
|
import { Component, Input, Output, EventEmitter } from '@angular/core';
|
||||||
|
|
||||||
|
import { SortField } from './sort';
|
||||||
|
|
||||||
|
@Component({
|
||||||
|
selector: 'my-video-sort',
|
||||||
|
// styleUrls: [ 'app/angular/videos/components/list/video-sort.component.css' ],
|
||||||
|
templateUrl: 'app/angular/videos/components/list/video-sort.component.html'
|
||||||
|
})
|
||||||
|
|
||||||
|
export class VideoSortComponent {
|
||||||
|
@Output() sort = new EventEmitter<any>();
|
||||||
|
|
||||||
|
@Input() currentSort: SortField;
|
||||||
|
|
||||||
|
sortChoices = {
|
||||||
|
'name': 'Name - Asc',
|
||||||
|
'-name': "Name - Desc",
|
||||||
|
'duration': "Duration - Asc",
|
||||||
|
'-duration': "Duration - Desc",
|
||||||
|
'createdDate': "Created Date - Asc",
|
||||||
|
'-createdDate': "Created Date - Desc"
|
||||||
|
}
|
||||||
|
|
||||||
|
get choiceKeys() {
|
||||||
|
return Object.keys(this.sortChoices);
|
||||||
|
}
|
||||||
|
|
||||||
|
getStringChoice(choiceKey: SortField): string {
|
||||||
|
return this.sortChoices[choiceKey];
|
||||||
|
}
|
||||||
|
|
||||||
|
onSortChange() {
|
||||||
|
this.sort.emit(this.currentSort);
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,3 +1,8 @@
|
||||||
|
<div class="videos-info">
|
||||||
|
<span class="videos-total-results"> {{ pagination.total }}</span>
|
||||||
|
<my-video-sort [currentSort]="sort" (sort)="onSort($event)"></my-video-sort>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div class="videos-miniatures">
|
<div class="videos-miniatures">
|
||||||
<div *ngIf="videos.length === 0">There is no video.</div>
|
<div *ngIf="videos.length === 0">There is no video.</div>
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
import { Component, OnInit } from '@angular/core';
|
import { Component, OnInit } from '@angular/core';
|
||||||
import { ROUTER_DIRECTIVES, RouteParams } from '@angular/router-deprecated';
|
import { ROUTER_DIRECTIVES, RouteParams, Router } from '@angular/router-deprecated';
|
||||||
|
|
||||||
import { PAGINATION_DIRECTIVES } from 'ng2-bootstrap/components/pagination';
|
import { PAGINATION_DIRECTIVES } from 'ng2-bootstrap/components/pagination';
|
||||||
|
|
||||||
|
@ -10,12 +10,14 @@ import { VideosService } from '../../videos.service';
|
||||||
import { Video } from '../../video';
|
import { Video } from '../../video';
|
||||||
import { VideoMiniatureComponent } from './video-miniature.component';
|
import { VideoMiniatureComponent } from './video-miniature.component';
|
||||||
import { Search, SearchField } from '../../../app/search';
|
import { Search, SearchField } from '../../../app/search';
|
||||||
|
import { VideoSortComponent } from './video-sort.component';
|
||||||
|
import { SortField } from './sort';
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'my-videos-list',
|
selector: 'my-videos-list',
|
||||||
styleUrls: [ 'app/angular/videos/components/list/videos-list.component.css' ],
|
styleUrls: [ 'app/angular/videos/components/list/videos-list.component.css' ],
|
||||||
templateUrl: 'app/angular/videos/components/list/videos-list.component.html',
|
templateUrl: 'app/angular/videos/components/list/videos-list.component.html',
|
||||||
directives: [ ROUTER_DIRECTIVES, PAGINATION_DIRECTIVES, VideoMiniatureComponent ]
|
directives: [ ROUTER_DIRECTIVES, PAGINATION_DIRECTIVES, VideoMiniatureComponent, VideoSortComponent ]
|
||||||
})
|
})
|
||||||
|
|
||||||
export class VideosListComponent implements OnInit {
|
export class VideosListComponent implements OnInit {
|
||||||
|
@ -26,18 +28,22 @@ export class VideosListComponent implements OnInit {
|
||||||
itemsPerPage: 9,
|
itemsPerPage: 9,
|
||||||
total: 0
|
total: 0
|
||||||
}
|
}
|
||||||
|
sort: SortField;
|
||||||
|
|
||||||
private search: Search;
|
private search: Search;
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
private _authService: AuthService,
|
private _authService: AuthService,
|
||||||
private _videosService: VideosService,
|
private _videosService: VideosService,
|
||||||
private _routeParams: RouteParams
|
private _routeParams: RouteParams,
|
||||||
|
private _router: Router
|
||||||
) {
|
) {
|
||||||
this.search = {
|
this.search = {
|
||||||
value: this._routeParams.get('search'),
|
value: this._routeParams.get('search'),
|
||||||
field: <SearchField>this._routeParams.get('field')
|
field: <SearchField>this._routeParams.get('field')
|
||||||
}
|
}
|
||||||
|
|
||||||
|
this.sort = <SortField>this._routeParams.get('sort') || '-createdDate';
|
||||||
}
|
}
|
||||||
|
|
||||||
ngOnInit() {
|
ngOnInit() {
|
||||||
|
@ -52,9 +58,9 @@ export class VideosListComponent implements OnInit {
|
||||||
let observable = null;
|
let observable = null;
|
||||||
|
|
||||||
if (this.search.value !== null) {
|
if (this.search.value !== null) {
|
||||||
observable = this._videosService.searchVideos(this.search, this.pagination);
|
observable = this._videosService.searchVideos(this.search, this.pagination, this.sort);
|
||||||
} else {
|
} else {
|
||||||
observable = this._videosService.getVideos(this.pagination);
|
observable = this._videosService.getVideos(this.pagination, this.sort);
|
||||||
}
|
}
|
||||||
|
|
||||||
observable.subscribe(
|
observable.subscribe(
|
||||||
|
@ -70,4 +76,9 @@ export class VideosListComponent implements OnInit {
|
||||||
this.videos.splice(this.videos.indexOf(video), 1);
|
this.videos.splice(this.videos.indexOf(video), 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
onSort(sort: SortField) {
|
||||||
|
this.sort = sort;
|
||||||
|
this._router.navigate(['VideosList', { sort: this.sort }]);
|
||||||
|
this.getVideos();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,6 +6,7 @@ import { Pagination } from './pagination';
|
||||||
import { Video } from './video';
|
import { Video } from './video';
|
||||||
import { AuthService } from '../users/services/auth.service';
|
import { AuthService } from '../users/services/auth.service';
|
||||||
import { Search } from '../app/search';
|
import { Search } from '../app/search';
|
||||||
|
import { SortField } from './components/list/sort';
|
||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
export class VideosService {
|
export class VideosService {
|
||||||
|
@ -13,8 +14,11 @@ export class VideosService {
|
||||||
|
|
||||||
constructor (private http: Http, private _authService: AuthService) {}
|
constructor (private http: Http, private _authService: AuthService) {}
|
||||||
|
|
||||||
getVideos(pagination: Pagination) {
|
getVideos(pagination: Pagination, sort: SortField) {
|
||||||
const params = this.createPaginationParams(pagination);
|
const params = this.createPaginationParams(pagination);
|
||||||
|
|
||||||
|
if (sort) params.set('sort', sort)
|
||||||
|
|
||||||
return this.http.get(this._baseVideoUrl, { search: params })
|
return this.http.get(this._baseVideoUrl, { search: params })
|
||||||
.map(res => res.json())
|
.map(res => res.json())
|
||||||
.map(this.extractVideos)
|
.map(this.extractVideos)
|
||||||
|
@ -34,9 +38,12 @@ export class VideosService {
|
||||||
.catch(this.handleError);
|
.catch(this.handleError);
|
||||||
}
|
}
|
||||||
|
|
||||||
searchVideos(search: Search, pagination: Pagination) {
|
searchVideos(search: Search, pagination: Pagination, sort: SortField) {
|
||||||
const params = this.createPaginationParams(pagination);
|
const params = this.createPaginationParams(pagination);
|
||||||
|
|
||||||
if (search.field) params.set('field', search.field);
|
if (search.field) params.set('field', search.field);
|
||||||
|
if (sort) params.set('sort', sort)
|
||||||
|
|
||||||
return this.http.get(this._baseVideoUrl + 'search/' + encodeURIComponent(search.value), { search: params })
|
return this.http.get(this._baseVideoUrl + 'search/' + encodeURIComponent(search.value), { search: params })
|
||||||
.map(res => res.json())
|
.map(res => res.json())
|
||||||
.map(this.extractVideos)
|
.map(this.extractVideos)
|
||||||
|
|
|
@ -22,6 +22,8 @@
|
||||||
|
|
||||||
<script src="/app/node_modules/webtorrent/webtorrent.min.js"></script>
|
<script src="/app/node_modules/webtorrent/webtorrent.min.js"></script>
|
||||||
|
|
||||||
|
<script src="/app/node_modules/ng2-bootstrap/bundles/ng2-bootstrap.min.js"></script>
|
||||||
|
|
||||||
<!-- 2. Configure SystemJS -->
|
<!-- 2. Configure SystemJS -->
|
||||||
<script src="/app/systemjs.config.js"></script>
|
<script src="/app/systemjs.config.js"></script>
|
||||||
<script>
|
<script>
|
||||||
|
|
|
@ -31,7 +31,9 @@
|
||||||
"angular/users/models/user.ts",
|
"angular/users/models/user.ts",
|
||||||
"angular/users/services/auth.service.ts",
|
"angular/users/services/auth.service.ts",
|
||||||
"angular/videos/components/add/videos-add.component.ts",
|
"angular/videos/components/add/videos-add.component.ts",
|
||||||
|
"angular/videos/components/list/sort.ts",
|
||||||
"angular/videos/components/list/video-miniature.component.ts",
|
"angular/videos/components/list/video-miniature.component.ts",
|
||||||
|
"angular/videos/components/list/video-sort.component.ts",
|
||||||
"angular/videos/components/list/videos-list.component.ts",
|
"angular/videos/components/list/videos-list.component.ts",
|
||||||
"angular/videos/components/watch/videos-watch.component.ts",
|
"angular/videos/components/watch/videos-watch.component.ts",
|
||||||
"angular/videos/pagination.ts",
|
"angular/videos/pagination.ts",
|
||||||
|
|
Loading…
Reference in New Issue