X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=client%2Fsrc%2Fapp%2Fvideos%2Fvideo-add%2Fvideo-add.component.ts;h=cd6bb99892ca2752cff29a3ed920131f4dc377ce;hb=2d7653dc8726185615bab66353c4e3fb8fbb5a5f;hp=144879a54c9d2c15704388388bfc02c6585b22e4;hpb=1cdb5c0f582502eac4d851cecc015e81cf16316b;p=github%2FChocobozzz%2FPeerTube.git diff --git a/client/src/app/videos/video-add/video-add.component.ts b/client/src/app/videos/video-add/video-add.component.ts index 144879a54..cd6bb9989 100644 --- a/client/src/app/videos/video-add/video-add.component.ts +++ b/client/src/app/videos/video-add/video-add.component.ts @@ -1,82 +1,186 @@ -/// -/// - import { Component, ElementRef, OnInit } from '@angular/core'; -import { Router } from '@angular/router-deprecated'; +import { FormBuilder, FormGroup } from '@angular/forms'; +import { Router } from '@angular/router'; -import { BytesPipe } from 'angular-pipes/src/math/bytes.pipe'; -import { PROGRESSBAR_DIRECTIVES } from 'ng2-bootstrap/components/progressbar'; +import { FileUploader } from 'ng2-file-upload/ng2-file-upload'; +import { NotificationsService } from 'angular2-notifications'; -import { AuthService, User } from '../../shared'; +import { AuthService } from '../../core'; +import { FormReactive, VIDEO_NAME, VIDEO_DESCRIPTION, VIDEO_TAGS } from '../../shared'; @Component({ selector: 'my-videos-add', - styles: [ require('./video-add.component.scss') ], - template: require('./video-add.component.html'), - directives: [ PROGRESSBAR_DIRECTIVES ], - pipes: [ BytesPipe ] + styleUrls: [ './video-add.component.scss' ], + templateUrl: './video-add.component.html' }) -export class VideoAddComponent implements OnInit { +export class VideoAddComponent extends FormReactive implements OnInit { + tags: string[] = []; + uploader: FileUploader; + error: string = null; - fileToUpload: any; - progressBar: { value: number; max: number; } = { value: 0, max: 0 }; - user: User; + form: FormGroup; + formErrors = { + name: '', + description: '', + currentTag: '' + }; + validationMessages = { + name: VIDEO_NAME.MESSAGES, + description: VIDEO_DESCRIPTION.MESSAGES, + currentTag: VIDEO_TAGS.MESSAGES + }; - private form: any; + // Special error messages + tagsError = ''; + fileError = ''; constructor( private authService: AuthService, private elementRef: ElementRef, - private router: Router - ) {} + private formBuilder: FormBuilder, + private router: Router, + private notificationsService: NotificationsService + ) { + super(); + } + + get filename() { + if (this.uploader.queue.length === 0) { + return null; + } + + return this.uploader.queue[0].file.name; + } + + buildForm() { + this.form = this.formBuilder.group({ + name: [ '', VIDEO_NAME.VALIDATORS ], + description: [ '', VIDEO_DESCRIPTION.VALIDATORS ], + currentTag: [ '', VIDEO_TAGS.VALIDATORS ] + }); + + this.form.valueChanges.subscribe(data => this.onValueChanged(data)); + } ngOnInit() { - this.user = User.load(); - jQuery(this.elementRef.nativeElement).find('#videofile').fileupload({ + this.uploader = new FileUploader({ + authToken: this.authService.getRequestHeaderValue(), + queueLimit: 1, url: '/api/v1/videos', - dataType: 'json', - singleFileUploads: true, - multipart: true, - autoUpload: false, - - add: (e, data) => { - this.form = data; - this.fileToUpload = data['files'][0]; - }, - - progressall: (e, data) => { - this.progressBar.value = data.loaded; - // The server is a little bit slow to answer (has to seed the video) - // So we add more time to the progress bar (+10%) - this.progressBar.max = data.total + (0.1 * data.total); - }, - - done: (e, data) => { - this.progressBar.value = this.progressBar.max; - console.log('Video uploaded.'); - - // Print all the videos once it's finished - this.router.navigate(['VideosList']); - }, - - fail: (e, data) => { - const xhr = data.jqXHR; - if (xhr.status === 400) { - this.error = xhr.responseText; - } else { - this.error = 'Unknow error'; + removeAfterUpload: true + }); + + this.uploader.onBuildItemForm = (item, form) => { + const name = this.form.value['name']; + const description = this.form.value['description']; + + form.append('name', name); + form.append('description', description); + + for (let i = 0; i < this.tags.length; i++) { + form.append(`tags[${i}]`, this.tags[i]); + } + }; + + this.buildForm(); + } + + checkForm() { + this.forceCheck(); + + if (this.tags.length === 0) { + this.tagsError = 'You have 0 tags'; + } + + if (this.filename === null) { + this.fileError = 'You did not add a file.'; + } + + return this.form.valid === true && this.tagsError === '' && this.fileError === ''; + } + + fileChanged() { + this.fileError = ''; + } + + onTagKeyPress(event: KeyboardEvent) { + const currentTag = this.form.value['currentTag']; + + // Enter press + if (event.keyCode === 13) { + // Check if the tag is valid and does not already exist + if ( + currentTag.length >= 2 && + this.form.controls['currentTag'].valid && + this.tags.indexOf(currentTag) === -1 + ) { + this.tags.push(currentTag); + this.form.patchValue({ currentTag: '' }); + + if (this.tags.length >= 3) { + this.form.get('currentTag').disable(); } - console.error(data); + this.tagsError = ''; } - }); + } + } + + removeFile() { + this.uploader.clearQueue(); + } + + removeTag(tag: string) { + this.tags.splice(this.tags.indexOf(tag), 1); + this.form.get('currentTag').enable(); } - uploadFile() { - this.error = null; - this.form.formData = jQuery(this.elementRef.nativeElement).find('form').serializeArray(); - this.form.headers = this.authService.getRequestHeader().toJSON(); - this.form.submit(); + upload() { + if (this.checkForm() === false) { + return; + } + + const item = this.uploader.queue[0]; + // TODO: wait for https://github.com/valor-software/ng2-file-upload/pull/242 + item.alias = 'videofile'; + + // FIXME: remove + // Run detection change for progress bar + const interval = setInterval(() => { ; }, 250); + + item.onSuccess = () => { + clearInterval(interval); + + console.log('Video uploaded.'); + this.notificationsService.success('Success', 'Video uploaded.'); + + + // Print all the videos once it's finished + this.router.navigate(['/videos/list']); + }; + + item.onError = (response: string, status: number) => { + clearInterval(interval); + + // We need to handle manually these cases beceause we use the FileUpload component + if (status === 400) { + this.error = response; + } else if (status === 401) { + this.error = 'Access token was expired, refreshing token...'; + this.authService.refreshAccessToken().subscribe( + () => { + // Update the uploader request header + this.uploader.authToken = this.authService.getRequestHeaderValue(); + this.error += ' access token refreshed. Please retry your request.'; + } + ); + } else { + this.error = 'Unknow error'; + console.error(this.error); + } + }; + + this.uploader.uploadAll(); } }