mirror of https://github.com/Chocobozzz/PeerTube
Move video form inside a component
parent
59aa1e5e75
commit
ff249f499c
|
@ -1,5 +1,11 @@
|
||||||
import { Validators } from '@angular/forms'
|
import { Validators } from '@angular/forms'
|
||||||
|
|
||||||
|
export type ValidatorMessage = {
|
||||||
|
[ id: string ]: {
|
||||||
|
[ error: string ]: string
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
export const VIDEO_NAME = {
|
export const VIDEO_NAME = {
|
||||||
VALIDATORS: [ Validators.required, Validators.minLength(3), Validators.maxLength(120) ],
|
VALIDATORS: [ Validators.required, Validators.minLength(3), Validators.maxLength(120) ],
|
||||||
MESSAGES: {
|
MESSAGES: {
|
||||||
|
|
|
@ -0,0 +1,85 @@
|
||||||
|
<div [formGroup]="form">
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="name">Name</label>
|
||||||
|
<input
|
||||||
|
type="text" class="form-control" id="name"
|
||||||
|
formControlName="name"
|
||||||
|
>
|
||||||
|
<div *ngIf="formErrors.name" class="alert alert-danger">
|
||||||
|
{{ formErrors.name }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="privacy">Privacy</label>
|
||||||
|
<select class="form-control" id="privacy" formControlName="privacy">
|
||||||
|
<option></option>
|
||||||
|
<option *ngFor="let privacy of videoPrivacies" [value]="privacy.id">{{ privacy.label }}</option>
|
||||||
|
</select>
|
||||||
|
|
||||||
|
<div *ngIf="formErrors.privacy" class="alert alert-danger">
|
||||||
|
{{ formErrors.privacy }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-group">
|
||||||
|
<input
|
||||||
|
type="checkbox" id="nsfw"
|
||||||
|
formControlName="nsfw"
|
||||||
|
>
|
||||||
|
<label for="nsfw">This video contains mature or explicit content</label>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="category">Category</label>
|
||||||
|
<select class="form-control" id="category" formControlName="category">
|
||||||
|
<option></option>
|
||||||
|
<option *ngFor="let category of videoCategories" [value]="category.id">{{ category.label }}</option>
|
||||||
|
</select>
|
||||||
|
|
||||||
|
<div *ngIf="formErrors.category" class="alert alert-danger">
|
||||||
|
{{ formErrors.category }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="licence">Licence</label>
|
||||||
|
<select class="form-control" id="licence" formControlName="licence">
|
||||||
|
<option></option>
|
||||||
|
<option *ngFor="let licence of videoLicences" [value]="licence.id">{{ licence.label }}</option>
|
||||||
|
</select>
|
||||||
|
|
||||||
|
<div *ngIf="formErrors.licence" class="alert alert-danger">
|
||||||
|
{{ formErrors.licence }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="language">Language</label>
|
||||||
|
<select class="form-control" id="language" formControlName="language">
|
||||||
|
<option></option>
|
||||||
|
<option *ngFor="let language of videoLanguages" [value]="language.id">{{ language.label }}</option>
|
||||||
|
</select>
|
||||||
|
|
||||||
|
<div *ngIf="formErrors.language" class="alert alert-danger">
|
||||||
|
{{ formErrors.language }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-group">
|
||||||
|
<label class="label-tags">Tags</label> <span class="little-information">(press enter to add the tag)</span>
|
||||||
|
<tag-input
|
||||||
|
[ngModel]="tags" [validators]="tagValidators" [errorMessages]="tagValidatorsMessages"
|
||||||
|
formControlName="tags" maxItems="5" modelAsStrings="true"
|
||||||
|
></tag-input>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="description">Description</label>
|
||||||
|
<my-video-description formControlName="description"></my-video-description>
|
||||||
|
|
||||||
|
<div *ngIf="formErrors.description" class="alert alert-danger">
|
||||||
|
{{ formErrors.description }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
|
@ -0,0 +1,83 @@
|
||||||
|
import { Component, Input, OnInit } from '@angular/core'
|
||||||
|
import { FormBuilder, FormControl, FormGroup } from '@angular/forms'
|
||||||
|
import { ActivatedRoute, Router } from '@angular/router'
|
||||||
|
import { NotificationsService } from 'angular2-notifications'
|
||||||
|
import { ServerService } from 'app/core'
|
||||||
|
import { VideoEdit } from 'app/shared/video/video-edit.model'
|
||||||
|
import 'rxjs/add/observable/forkJoin'
|
||||||
|
import { VideoPrivacy } from '../../../../../shared/models/videos/video-privacy.enum'
|
||||||
|
import {
|
||||||
|
ValidatorMessage,
|
||||||
|
VIDEO_CATEGORY,
|
||||||
|
VIDEO_DESCRIPTION,
|
||||||
|
VIDEO_LANGUAGE,
|
||||||
|
VIDEO_LICENCE,
|
||||||
|
VIDEO_NAME,
|
||||||
|
VIDEO_PRIVACY,
|
||||||
|
VIDEO_TAGS
|
||||||
|
} from '../../../shared/forms/form-validators'
|
||||||
|
|
||||||
|
@Component({
|
||||||
|
selector: 'my-video-edit',
|
||||||
|
styleUrls: [ './video-edit.component.scss' ],
|
||||||
|
templateUrl: './video-edit.component.html'
|
||||||
|
})
|
||||||
|
|
||||||
|
export class VideoEditComponent implements OnInit {
|
||||||
|
@Input() form: FormGroup
|
||||||
|
@Input() formErrors: { [ id: string ]: string } = {}
|
||||||
|
@Input() validationMessages: ValidatorMessage = {}
|
||||||
|
@Input() videoPrivacies = []
|
||||||
|
|
||||||
|
tags: string[] = []
|
||||||
|
videoCategories = []
|
||||||
|
videoLicences = []
|
||||||
|
videoLanguages = []
|
||||||
|
video: VideoEdit
|
||||||
|
|
||||||
|
tagValidators = VIDEO_TAGS.VALIDATORS
|
||||||
|
tagValidatorsMessages = VIDEO_TAGS.MESSAGES
|
||||||
|
|
||||||
|
error: string = null
|
||||||
|
|
||||||
|
constructor (
|
||||||
|
private formBuilder: FormBuilder,
|
||||||
|
private route: ActivatedRoute,
|
||||||
|
private router: Router,
|
||||||
|
private notificationsService: NotificationsService,
|
||||||
|
private serverService: ServerService
|
||||||
|
) { }
|
||||||
|
|
||||||
|
updateForm () {
|
||||||
|
this.formErrors['name'] = ''
|
||||||
|
this.formErrors['privacy'] = ''
|
||||||
|
this.formErrors['category'] = ''
|
||||||
|
this.formErrors['licence'] = ''
|
||||||
|
this.formErrors['language'] = ''
|
||||||
|
this.formErrors['description'] = ''
|
||||||
|
|
||||||
|
this.validationMessages['name'] = VIDEO_NAME.MESSAGES
|
||||||
|
this.validationMessages['privacy'] = VIDEO_PRIVACY.MESSAGES
|
||||||
|
this.validationMessages['category'] = VIDEO_CATEGORY.MESSAGES
|
||||||
|
this.validationMessages['licence'] = VIDEO_LICENCE.MESSAGES
|
||||||
|
this.validationMessages['language'] = VIDEO_LANGUAGE.MESSAGES
|
||||||
|
this.validationMessages['description'] = VIDEO_DESCRIPTION.MESSAGES
|
||||||
|
|
||||||
|
this.form.addControl('name', new FormControl('', VIDEO_NAME.VALIDATORS))
|
||||||
|
this.form.addControl('privacy', new FormControl('', VIDEO_PRIVACY.VALIDATORS))
|
||||||
|
this.form.addControl('nsfw', new FormControl(false))
|
||||||
|
this.form.addControl('category', new FormControl('', VIDEO_CATEGORY.VALIDATORS))
|
||||||
|
this.form.addControl('licence', new FormControl('', VIDEO_LICENCE.VALIDATORS))
|
||||||
|
this.form.addControl('language', new FormControl('', VIDEO_LANGUAGE.VALIDATORS))
|
||||||
|
this.form.addControl('description', new FormControl('', VIDEO_DESCRIPTION.VALIDATORS))
|
||||||
|
this.form.addControl('tags', new FormControl(''))
|
||||||
|
}
|
||||||
|
|
||||||
|
ngOnInit () {
|
||||||
|
this.updateForm()
|
||||||
|
|
||||||
|
this.videoCategories = this.serverService.getVideoCategories()
|
||||||
|
this.videoLicences = this.serverService.getVideoLicences()
|
||||||
|
this.videoLanguages = this.serverService.getVideoLanguages()
|
||||||
|
}
|
||||||
|
}
|
|
@ -5,6 +5,7 @@ import { TabsModule } from 'ngx-bootstrap/tabs'
|
||||||
|
|
||||||
import { MarkdownService, VideoDescriptionComponent } from '../../shared'
|
import { MarkdownService, VideoDescriptionComponent } from '../../shared'
|
||||||
import { SharedModule } from '../../../shared'
|
import { SharedModule } from '../../../shared'
|
||||||
|
import { VideoEditComponent } from './video-edit.component'
|
||||||
|
|
||||||
@NgModule({
|
@NgModule({
|
||||||
imports: [
|
imports: [
|
||||||
|
@ -15,14 +16,16 @@ import { SharedModule } from '../../../shared'
|
||||||
],
|
],
|
||||||
|
|
||||||
declarations: [
|
declarations: [
|
||||||
VideoDescriptionComponent
|
VideoDescriptionComponent,
|
||||||
|
VideoEditComponent
|
||||||
],
|
],
|
||||||
|
|
||||||
exports: [
|
exports: [
|
||||||
TagInputModule,
|
TagInputModule,
|
||||||
TabsModule,
|
TabsModule,
|
||||||
|
|
||||||
VideoDescriptionComponent
|
VideoDescriptionComponent,
|
||||||
|
VideoEditComponent
|
||||||
],
|
],
|
||||||
|
|
||||||
providers: [
|
providers: [
|
||||||
|
|
|
@ -3,92 +3,12 @@
|
||||||
|
|
||||||
<h3>Update {{ video?.name }}</h3>
|
<h3>Update {{ video?.name }}</h3>
|
||||||
|
|
||||||
<div *ngIf="error" class="alert alert-danger">{{ error }}</div>
|
|
||||||
|
|
||||||
<form novalidate [formGroup]="form">
|
<form novalidate [formGroup]="form">
|
||||||
<div class="form-group">
|
|
||||||
<label for="name">Name</label>
|
|
||||||
<input
|
|
||||||
type="text" class="form-control" id="name"
|
|
||||||
formControlName="name"
|
|
||||||
>
|
|
||||||
<div *ngIf="formErrors.name" class="alert alert-danger">
|
|
||||||
{{ formErrors.name }}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="form-group">
|
<my-video-edit
|
||||||
<label for="privacy">Privacy</label>
|
[form]="form" [formErrors]="formErrors"
|
||||||
<select class="form-control" id="privacy" formControlName="privacy">
|
[validationMessages]="validationMessages" [videoPrivacies]="videoPrivacies"
|
||||||
<option></option>
|
></my-video-edit>
|
||||||
<option *ngFor="let privacy of videoPrivacies" [value]="privacy.id">{{ privacy.label }}</option>
|
|
||||||
</select>
|
|
||||||
|
|
||||||
<div *ngIf="formErrors.privacy" class="alert alert-danger">
|
|
||||||
{{ formErrors.privacy }}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="form-group">
|
|
||||||
<input
|
|
||||||
type="checkbox" id="nsfw"
|
|
||||||
formControlName="nsfw"
|
|
||||||
>
|
|
||||||
<label for="nsfw">This video contains mature or explicit content</label>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="form-group">
|
|
||||||
<label for="category">Category</label>
|
|
||||||
<select class="form-control" id="category" formControlName="category">
|
|
||||||
<option></option>
|
|
||||||
<option *ngFor="let category of videoCategories" [value]="category.id">{{ category.label }}</option>
|
|
||||||
</select>
|
|
||||||
|
|
||||||
<div *ngIf="formErrors.category" class="alert alert-danger">
|
|
||||||
{{ formErrors.category }}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="form-group">
|
|
||||||
<label for="licence">Licence</label>
|
|
||||||
<select class="form-control" id="licence" formControlName="licence">
|
|
||||||
<option></option>
|
|
||||||
<option *ngFor="let licence of videoLicences" [value]="licence.id">{{ licence.label }}</option>
|
|
||||||
</select>
|
|
||||||
|
|
||||||
<div *ngIf="formErrors.licence" class="alert alert-danger">
|
|
||||||
{{ formErrors.licence }}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="form-group">
|
|
||||||
<label for="language">Language</label>
|
|
||||||
<select class="form-control" id="language" formControlName="language">
|
|
||||||
<option></option>
|
|
||||||
<option *ngFor="let language of videoLanguages" [value]="language.id">{{ language.label }}</option>
|
|
||||||
</select>
|
|
||||||
|
|
||||||
<div *ngIf="formErrors.language" class="alert alert-danger">
|
|
||||||
{{ formErrors.language }}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="form-group">
|
|
||||||
<label class="label-tags">Tags</label> <span class="little-information">(press enter to add the tag)</span>
|
|
||||||
<tag-input
|
|
||||||
[ngModel]="tags" [validators]="tagValidators" [errorMessages]="tagValidatorsMessages"
|
|
||||||
formControlName="tags" maxItems="5" modelAsStrings="true"
|
|
||||||
></tag-input>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="form-group">
|
|
||||||
<label for="description">Description</label>
|
|
||||||
<my-video-description formControlName="description"></my-video-description>
|
|
||||||
|
|
||||||
<div *ngIf="formErrors.description" class="alert alert-danger">
|
|
||||||
{{ formErrors.description }}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<input
|
<input
|
||||||
|
|
|
@ -15,6 +15,7 @@ import {
|
||||||
VIDEO_PRIVACY,
|
VIDEO_PRIVACY,
|
||||||
VIDEO_TAGS
|
VIDEO_TAGS
|
||||||
} from '../../shared'
|
} from '../../shared'
|
||||||
|
import { ValidatorMessage } from '../../shared/forms/form-validators'
|
||||||
import { VideoService } from '../../shared/video/video.service'
|
import { VideoService } from '../../shared/video/video.service'
|
||||||
import { VideoEdit } from '../../shared/video/video-edit.model'
|
import { VideoEdit } from '../../shared/video/video-edit.model'
|
||||||
|
|
||||||
|
@ -25,34 +26,13 @@ import { VideoEdit } from '../../shared/video/video-edit.model'
|
||||||
})
|
})
|
||||||
|
|
||||||
export class VideoUpdateComponent extends FormReactive implements OnInit {
|
export class VideoUpdateComponent extends FormReactive implements OnInit {
|
||||||
tags: string[] = []
|
|
||||||
videoCategories = []
|
|
||||||
videoLicences = []
|
|
||||||
videoLanguages = []
|
|
||||||
videoPrivacies = []
|
|
||||||
video: VideoEdit
|
video: VideoEdit
|
||||||
|
|
||||||
tagValidators = VIDEO_TAGS.VALIDATORS
|
|
||||||
tagValidatorsMessages = VIDEO_TAGS.MESSAGES
|
|
||||||
|
|
||||||
error: string = null
|
error: string = null
|
||||||
form: FormGroup
|
form: FormGroup
|
||||||
formErrors = {
|
formErrors: { [ id: string ]: string } = {}
|
||||||
name: '',
|
validationMessages: ValidatorMessage = {}
|
||||||
privacy: '',
|
videoPrivacies = []
|
||||||
category: '',
|
|
||||||
licence: '',
|
|
||||||
language: '',
|
|
||||||
description: ''
|
|
||||||
}
|
|
||||||
validationMessages = {
|
|
||||||
name: VIDEO_NAME.MESSAGES,
|
|
||||||
privacy: VIDEO_PRIVACY.MESSAGES,
|
|
||||||
category: VIDEO_CATEGORY.MESSAGES,
|
|
||||||
licence: VIDEO_LICENCE.MESSAGES,
|
|
||||||
language: VIDEO_LANGUAGE.MESSAGES,
|
|
||||||
description: VIDEO_DESCRIPTION.MESSAGES
|
|
||||||
}
|
|
||||||
|
|
||||||
fileError = ''
|
fileError = ''
|
||||||
|
|
||||||
|
@ -68,30 +48,16 @@ export class VideoUpdateComponent extends FormReactive implements OnInit {
|
||||||
}
|
}
|
||||||
|
|
||||||
buildForm () {
|
buildForm () {
|
||||||
this.form = this.formBuilder.group({
|
this.form = this.formBuilder.group({})
|
||||||
name: [ '', VIDEO_NAME.VALIDATORS ],
|
|
||||||
privacy: [ '', VIDEO_PRIVACY.VALIDATORS ],
|
|
||||||
nsfw: [ false ],
|
|
||||||
category: [ '', VIDEO_CATEGORY.VALIDATORS ],
|
|
||||||
licence: [ '', VIDEO_LICENCE.VALIDATORS ],
|
|
||||||
language: [ '', VIDEO_LANGUAGE.VALIDATORS ],
|
|
||||||
description: [ '', VIDEO_DESCRIPTION.VALIDATORS ],
|
|
||||||
tags: [ '' ]
|
|
||||||
})
|
|
||||||
|
|
||||||
this.form.valueChanges.subscribe(data => this.onValueChanged(data))
|
this.form.valueChanges.subscribe(data => this.onValueChanged(data))
|
||||||
}
|
}
|
||||||
|
|
||||||
ngOnInit () {
|
ngOnInit () {
|
||||||
this.buildForm()
|
this.buildForm()
|
||||||
|
|
||||||
this.videoCategories = this.serverService.getVideoCategories()
|
|
||||||
this.videoLicences = this.serverService.getVideoLicences()
|
|
||||||
this.videoLanguages = this.serverService.getVideoLanguages()
|
|
||||||
this.videoPrivacies = this.serverService.getVideoPrivacies()
|
this.videoPrivacies = this.serverService.getVideoPrivacies()
|
||||||
|
|
||||||
const uuid: string = this.route.snapshot.params['uuid']
|
const uuid: string = this.route.snapshot.params['uuid']
|
||||||
|
|
||||||
this.videoService.getVideo(uuid)
|
this.videoService.getVideo(uuid)
|
||||||
.switchMap(video => {
|
.switchMap(video => {
|
||||||
return this.videoService
|
return this.videoService
|
||||||
|
@ -103,7 +69,7 @@ export class VideoUpdateComponent extends FormReactive implements OnInit {
|
||||||
video => {
|
video => {
|
||||||
this.video = new VideoEdit(video)
|
this.video = new VideoEdit(video)
|
||||||
|
|
||||||
// We cannot set private a video that was not private anymore
|
// We cannot set private a video that was not private
|
||||||
if (video.privacy !== VideoPrivacy.PRIVATE) {
|
if (video.privacy !== VideoPrivacy.PRIVATE) {
|
||||||
const newVideoPrivacies = []
|
const newVideoPrivacies = []
|
||||||
for (const p of this.videoPrivacies) {
|
for (const p of this.videoPrivacies) {
|
||||||
|
|
|
@ -11,12 +11,12 @@ import '../../../assets/player/peertube-videojs-plugin'
|
||||||
import { AuthService, ConfirmService } from '../../core'
|
import { AuthService, ConfirmService } from '../../core'
|
||||||
import { VideoBlacklistService } from '../../shared'
|
import { VideoBlacklistService } from '../../shared'
|
||||||
import { Account } from '../../shared/account/account.model'
|
import { Account } from '../../shared/account/account.model'
|
||||||
|
import { VideoDetails } from '../../shared/video/video-details.model'
|
||||||
import { Video } from '../../shared/video/video.model'
|
import { Video } from '../../shared/video/video.model'
|
||||||
import { MarkdownService } from '../shared'
|
import { MarkdownService } from '../shared'
|
||||||
import { VideoDownloadComponent } from './video-download.component'
|
import { VideoDownloadComponent } from './video-download.component'
|
||||||
import { VideoReportComponent } from './video-report.component'
|
import { VideoReportComponent } from './video-report.component'
|
||||||
import { VideoShareComponent } from './video-share.component'
|
import { VideoShareComponent } from './video-share.component'
|
||||||
import { VideoDetails } from '../../shared/video/video-details.model'
|
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'my-video-watch',
|
selector: 'my-video-watch',
|
||||||
|
@ -199,14 +199,6 @@ export class VideoWatchComponent implements OnInit, OnDestroy {
|
||||||
return this.authService.isLoggedIn()
|
return this.authService.isLoggedIn()
|
||||||
}
|
}
|
||||||
|
|
||||||
canUserUpdateVideo () {
|
|
||||||
return this.video.isUpdatableBy(this.authService.getUser())
|
|
||||||
}
|
|
||||||
|
|
||||||
isVideoRemovable () {
|
|
||||||
return this.video.isRemovableBy(this.authService.getUser())
|
|
||||||
}
|
|
||||||
|
|
||||||
isVideoBlacklistable () {
|
isVideoBlacklistable () {
|
||||||
return this.video.isBlackistableBy(this.authService.getUser())
|
return this.video.isBlackistableBy(this.authService.getUser())
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue