From 8cd7faaa331f83903f0bbaead288661218e38bdb Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Tue, 4 Sep 2018 16:21:07 +0200 Subject: [PATCH] Better label for video privacies --- client/src/app/core/server/server.service.ts | 12 ++++---- .../app/search/search-filters.component.ts | 4 +-- client/src/app/shared/video/video.service.ts | 29 +++++++++++++++++-- .../shared/video-edit.component.ts | 8 ++--- .../video-import-torrent.component.ts | 3 ++ .../video-import-url.component.ts | 3 ++ .../video-add-components/video-send.ts | 2 +- .../video-upload.component.ts | 2 ++ .../+video-edit/video-update.component.ts | 6 ++-- 9 files changed, 52 insertions(+), 17 deletions(-) diff --git a/client/src/app/core/server/server.service.ts b/client/src/app/core/server/server.service.ts index e7152efa0..2f1ef1fc2 100644 --- a/client/src/app/core/server/server.service.ts +++ b/client/src/app/core/server/server.service.ts @@ -6,7 +6,7 @@ import { Observable, of, ReplaySubject } from 'rxjs' import { getCompleteLocale, ServerConfig } from '../../../../../shared' import { About } from '../../../../../shared/models/server/about.model' import { environment } from '../../../environments/environment' -import { VideoConstant } from '../../../../../shared/models/videos' +import { VideoConstant, VideoPrivacy } from '../../../../../shared/models/videos' import { isDefaultLocale, peertubeTranslate } from '../../../../../shared/models/i18n' import { getDevLocale, isOnDevLocale } from '@app/shared/i18n/i18n-utils' import { sortBy } from '@app/shared/misc/utils' @@ -82,10 +82,10 @@ export class ServerService { } } } - private videoCategories: Array> = [] - private videoLicences: Array> = [] + private videoCategories: Array> = [] + private videoLicences: Array> = [] private videoLanguages: Array> = [] - private videoPrivacies: Array> = [] + private videoPrivacies: Array> = [] constructor ( private http: HttpClient, @@ -147,7 +147,7 @@ export class ServerService { private loadVideoAttributeEnum ( attributeName: 'categories' | 'licences' | 'languages' | 'privacies', - hashToPopulate: VideoConstant[], + hashToPopulate: VideoConstant[], notifier: ReplaySubject, sort = false ) { @@ -164,7 +164,7 @@ export class ServerService { const label = data[ dataKey ] hashToPopulate.push({ - id: dataKey, + id: attributeName === 'languages' ? dataKey : parseInt(dataKey, 10), label: peertubeTranslate(label, translations) }) }) diff --git a/client/src/app/search/search-filters.component.ts b/client/src/app/search/search-filters.component.ts index a40648eb4..f2f001e3f 100644 --- a/client/src/app/search/search-filters.component.ts +++ b/client/src/app/search/search-filters.component.ts @@ -18,8 +18,8 @@ export class SearchFiltersComponent implements OnInit { @Output() filtered = new EventEmitter() - videoCategories: VideoConstant[] = [] - videoLicences: VideoConstant[] = [] + videoCategories: VideoConstant[] = [] + videoLicences: VideoConstant[] = [] videoLanguages: VideoConstant[] = [] publishedDateRanges: { id: string, label: string }[] = [] diff --git a/client/src/app/shared/video/video.service.ts b/client/src/app/shared/video/video.service.ts index 5c0674e58..4a78d70ea 100644 --- a/client/src/app/shared/video/video.service.ts +++ b/client/src/app/shared/video/video.service.ts @@ -4,7 +4,15 @@ import { Injectable } from '@angular/core' import { Observable } from 'rxjs' import { Video as VideoServerModel, VideoDetails as VideoDetailsServerModel } from '../../../../../shared' import { ResultList } from '../../../../../shared/models/result-list.model' -import { UserVideoRate, UserVideoRateUpdate, VideoFilter, VideoRateType, VideoUpdate } from '../../../../../shared/models/videos' +import { + UserVideoRate, + UserVideoRateUpdate, + VideoConstant, + VideoFilter, + VideoPrivacy, + VideoRateType, + VideoUpdate +} from '../../../../../shared/models/videos' import { FeedFormat } from '../../../../../shared/models/feeds/feed-format.enum' import { environment } from '../../../environments/environment' import { ComponentPagination } from '../rest/component-pagination.model' @@ -22,6 +30,7 @@ import { VideoChannelService } from '@app/shared/video-channel/video-channel.ser import { ServerService } from '@app/core' import { UserSubscriptionService } from '@app/shared/user-subscription' import { VideoChannel } from '@app/shared/video-channel/video-channel.model' +import { I18n } from '@ngx-translate/i18n-polyfill' export interface VideosProvider { getVideos ( @@ -41,7 +50,8 @@ export class VideoService implements VideosProvider { private authHttp: HttpClient, private restExtractor: RestExtractor, private restService: RestService, - private serverService: ServerService + private serverService: ServerService, + private i18n: I18n ) {} getVideoViewUrl (uuid: string) { @@ -300,6 +310,21 @@ export class VideoService implements VideosProvider { ) } + explainedPrivacyLabels (privacies: VideoConstant[]) { + const newPrivacies = privacies.slice() + + const privatePrivacy = newPrivacies.find(p => p.id === VideoPrivacy.PRIVATE) + if (privatePrivacy) privatePrivacy.label = this.i18n('Only I can see this video') + + const unlistedPrivacy = newPrivacies.find(p => p.id === VideoPrivacy.UNLISTED) + if (unlistedPrivacy) unlistedPrivacy.label = this.i18n('Only people with the private link can see this video') + + const publicPrivacy = newPrivacies.find(p => p.id === VideoPrivacy.PUBLIC) + if (publicPrivacy) publicPrivacy.label = this.i18n('Anyone can see this video') + + return privacies + } + private setVideoRate (id: number, rateType: VideoRateType) { const url = VideoService.BASE_VIDEO_URL + id + '/rate' const body: UserVideoRateUpdate = { diff --git a/client/src/app/videos/+video-edit/shared/video-edit.component.ts b/client/src/app/videos/+video-edit/shared/video-edit.component.ts index b394a13e4..eb9396d70 100644 --- a/client/src/app/videos/+video-edit/shared/video-edit.component.ts +++ b/client/src/app/videos/+video-edit/shared/video-edit.component.ts @@ -12,7 +12,7 @@ import { VideoCaptionService } from '@app/shared/video-caption' import { VideoCaptionAddModalComponent } from '@app/videos/+video-edit/shared/video-caption-add-modal.component' import { VideoCaptionEdit } from '@app/shared/video-caption/video-caption-edit.model' import { removeElementFromArray } from '@app/shared/misc/utils' -import { VideoConstant } from '../../../../../../shared' +import { VideoConstant, VideoPrivacy } from '../../../../../../shared' @Component({ selector: 'my-video-edit', @@ -23,7 +23,7 @@ export class VideoEditComponent implements OnInit, OnDestroy { @Input() form: FormGroup @Input() formErrors: { [ id: string ]: string } = {} @Input() validationMessages: FormReactiveValidationMessages = {} - @Input() videoPrivacies: { id: number, label: string }[] = [] + @Input() videoPrivacies: VideoConstant[] = [] @Input() userVideoChannels: { id: number, label: string, support: string }[] = [] @Input() schedulePublicationPossible = true @Input() videoCaptions: VideoCaptionEdit[] = [] @@ -33,8 +33,8 @@ export class VideoEditComponent implements OnInit, OnDestroy { // So that it can be accessed in the template readonly SPECIAL_SCHEDULED_PRIVACY = VideoEdit.SPECIAL_SCHEDULED_PRIVACY - videoCategories: VideoConstant[] = [] - videoLicences: VideoConstant[] = [] + videoCategories: VideoConstant[] = [] + videoLicences: VideoConstant[] = [] videoLanguages: VideoConstant[] = [] tagValidators: ValidatorFn[] diff --git a/client/src/app/videos/+video-edit/video-add-components/video-import-torrent.component.ts b/client/src/app/videos/+video-edit/video-add-components/video-import-torrent.component.ts index 9623c2bf4..0f7184ff8 100644 --- a/client/src/app/videos/+video-edit/video-add-components/video-import-torrent.component.ts +++ b/client/src/app/videos/+video-edit/video-add-components/video-import-torrent.component.ts @@ -95,6 +95,9 @@ export class VideoImportTorrentComponent extends VideoSend implements OnInit, Ca thumbnailUrl: null, previewUrl: null })) + + this.videoPrivacies = this.videoService.explainedPrivacyLabels(this.videoPrivacies) + this.hydrateFormFromVideo() }, diff --git a/client/src/app/videos/+video-edit/video-add-components/video-import-url.component.ts b/client/src/app/videos/+video-edit/video-add-components/video-import-url.component.ts index 97b402bfe..031e557ed 100644 --- a/client/src/app/videos/+video-edit/video-add-components/video-import-url.component.ts +++ b/client/src/app/videos/+video-edit/video-add-components/video-import-url.component.ts @@ -87,6 +87,9 @@ export class VideoImportUrlComponent extends VideoSend implements OnInit, CanCom thumbnailUrl: null, previewUrl: null })) + + this.videoPrivacies = this.videoService.explainedPrivacyLabels(this.videoPrivacies) + this.hydrateFormFromVideo() }, diff --git a/client/src/app/videos/+video-edit/video-add-components/video-send.ts b/client/src/app/videos/+video-edit/video-add-components/video-send.ts index efd182269..bfe588676 100644 --- a/client/src/app/videos/+video-edit/video-add-components/video-send.ts +++ b/client/src/app/videos/+video-edit/video-add-components/video-send.ts @@ -15,7 +15,7 @@ import { populateAsyncUserVideoChannels } from '@app/shared/misc/utils' export abstract class VideoSend extends FormReactive implements OnInit, CanComponentDeactivate { userVideoChannels: { id: number, label: string, support: string }[] = [] - videoPrivacies: VideoConstant[] = [] + videoPrivacies: VideoConstant[] = [] videoCaptions: VideoCaptionEdit[] = [] firstStepPrivacyId = 0 diff --git a/client/src/app/videos/+video-edit/video-add-components/video-upload.component.ts b/client/src/app/videos/+video-edit/video-add-components/video-upload.component.ts index b59fb7335..f9af1655b 100644 --- a/client/src/app/videos/+video-edit/video-add-components/video-upload.component.ts +++ b/client/src/app/videos/+video-edit/video-add-components/video-upload.component.ts @@ -182,6 +182,8 @@ export class VideoUploadComponent extends VideoSend implements OnInit, OnDestroy channelId }) + this.videoPrivacies = this.videoService.explainedPrivacyLabels(this.videoPrivacies) + this.videoUploadObservable = this.videoService.uploadVideo(formData).subscribe( event => { if (event.type === HttpEventType.UploadProgress) { diff --git a/client/src/app/videos/+video-edit/video-update.component.ts b/client/src/app/videos/+video-edit/video-update.component.ts index 0c60e3439..75b11f46c 100644 --- a/client/src/app/videos/+video-edit/video-update.component.ts +++ b/client/src/app/videos/+video-edit/video-update.component.ts @@ -24,7 +24,7 @@ export class VideoUpdateComponent extends FormReactive implements OnInit { video: VideoEdit isUpdatingVideo = false - videoPrivacies: VideoConstant[] = [] + videoPrivacies: VideoConstant[] = [] userVideoChannels: { id: number, label: string, support: string }[] = [] schedulePublicationPossible = false videoCaptions: VideoCaptionEdit[] = [] @@ -62,11 +62,13 @@ export class VideoUpdateComponent extends FormReactive implements OnInit { // We cannot set private a video that was not private if (this.video.privacy !== VideoPrivacy.PRIVATE) { - this.videoPrivacies = this.videoPrivacies.filter(p => p.id.toString() !== VideoPrivacy.PRIVATE.toString()) + this.videoPrivacies = this.videoPrivacies.filter(p => p.id !== VideoPrivacy.PRIVATE) } else { // We can schedule video publication only if it it is private this.schedulePublicationPossible = this.video.privacy === VideoPrivacy.PRIVATE } + this.videoPrivacies = this.videoService.explainedPrivacyLabels(this.videoPrivacies) + // FIXME: Angular does not detect the change inside this subscription, so use the patched setTimeout setTimeout(() => this.hydrateFormFromVideo()) }, -- 2.41.0