X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=client%2Fsrc%2Fapp%2F%2Bmy-library%2Fmy-videos%2Fmy-videos.component.ts;h=57b8bdf7de26518bb0671d08456dfff7e513ada6;hb=HEAD;hp=3ff0ee24874a81ff14a110887056faff3f3eb260;hpb=91a4893063402d7beabb3104f9b989b8f88b6038;p=github%2FChocobozzz%2FPeerTube.git diff --git a/client/src/app/+my-library/my-videos/my-videos.component.ts b/client/src/app/+my-library/my-videos/my-videos.component.ts index 3ff0ee248..57b8bdf7d 100644 --- a/client/src/app/+my-library/my-videos/my-videos.component.ts +++ b/client/src/app/+my-library/my-videos/my-videos.component.ts @@ -1,10 +1,11 @@ +import { uniqBy } from 'lodash-es' import { concat, Observable } from 'rxjs' import { tap, toArray } from 'rxjs/operators' import { Component, OnInit, ViewChild } from '@angular/core' import { ActivatedRoute, Router } from '@angular/router' import { AuthService, ComponentPagination, ConfirmService, Notifier, ScreenService, ServerService, User } from '@app/core' import { DisableForReuseHook } from '@app/core/routing/disable-for-reuse-hook' -import { prepareIcu, immutableAssign } from '@app/helpers' +import { immutableAssign, prepareIcu } from '@app/helpers' import { AdvancedInputFilter } from '@app/shared/shared-forms' import { DropdownAction, Video, VideoService } from '@app/shared/shared-main' import { LiveStreamInformationComponent } from '@app/shared/shared-video-live' @@ -14,7 +15,8 @@ import { VideoActionsDisplayType, VideosSelectionComponent } from '@app/shared/shared-video-miniature' -import { VideoChannel, VideoSortField } from '@shared/models' +import { VideoPlaylistService } from '@app/shared/shared-video-playlist' +import { VideoChannel, VideoExistInPlaylist, VideosExistInPlaylists, VideoSortField } from '@shared/models' import { VideoChangeOwnershipComponent } from './modals/video-change-ownership.component' @Component({ @@ -26,6 +28,7 @@ export class MyVideosComponent implements OnInit, DisableForReuseHook { @ViewChild('videoChangeOwnershipModal', { static: true }) videoChangeOwnershipModal: VideoChangeOwnershipComponent @ViewChild('liveStreamInformationModal', { static: true }) liveStreamInformationModal: LiveStreamInformationComponent + videosContainedInPlaylists: VideosExistInPlaylists = {} titlePage: string selection: SelectionType = {} pagination: ComponentPagination = { @@ -83,7 +86,8 @@ export class MyVideosComponent implements OnInit, DisableForReuseHook { protected notifier: Notifier, protected screenService: ScreenService, private confirmService: ConfirmService, - private videoService: VideoService + private videoService: VideoService, + private playlistService: VideoPlaylistService ) { this.titlePage = $localize`My videos` } @@ -101,12 +105,14 @@ export class MyVideosComponent implements OnInit, DisableForReuseHook { this.user = this.authService.getUser() this.userChannels = this.user.videoChannels - const channelFilters = this.userChannels.map(c => { - return { - value: 'channel:' + c.name, - label: c.name - } - }) + const channelFilters = [ ...this.userChannels ] + .sort((a, b) => a.displayName.localeCompare(b.displayName)) + .map(c => { + return { + value: 'channel:' + c.name, + label: c.displayName + } + }) this.inputFilters = [ { @@ -156,16 +162,26 @@ export class MyVideosComponent implements OnInit, DisableForReuseHook { sort: this.sort, userChannels: this.userChannels, search: this.search - }) - .pipe( - tap(res => this.pagination.totalItems = res.total) - ) + }).pipe( + tap(res => this.pagination.totalItems = res.total), + tap(({ data }) => this.fetchVideosContainedInPlaylists(data)) + ) + } + + private fetchVideosContainedInPlaylists (videos: Video[]) { + this.playlistService.doVideosExistInPlaylist(videos.map(v => v.id)) + .subscribe(result => { + this.videosContainedInPlaylists = Object.keys(result).reduce((acc, videoId) => ({ + ...acc, + [videoId]: uniqBy(result[+videoId], (p: VideoExistInPlaylist) => p.playlistId) + }), this.videosContainedInPlaylists) + }) } async deleteSelectedVideos () { - const toDeleteVideosIds = Object.keys(this.selection) - .filter(k => this.selection[k] === true) - .map(k => parseInt(k, 10)) + const toDeleteVideosIds = Object.entries(this.selection) + .filter(([ _k, v ]) => v === true) + .map(([ k, _v ]) => parseInt(k, 10)) const res = await this.confirmService.confirm( prepareIcu($localize`Do you really want to delete {length, plural, =1 {this video} other {{length} videos}}?`)(