2016-05-13 08:18:37 -04:00
|
|
|
import { Component, ElementRef, OnInit } from '@angular/core';
|
2016-09-09 16:16:51 -04:00
|
|
|
import { FormBuilder, FormGroup } from '@angular/forms';
|
2016-06-10 11:43:40 -04:00
|
|
|
import { Router } from '@angular/router';
|
2016-03-14 08:50:19 -04:00
|
|
|
|
2016-09-06 16:40:57 -04:00
|
|
|
import { FileUploader } from 'ng2-file-upload/ng2-file-upload';
|
2017-01-27 10:14:11 -05:00
|
|
|
import { NotificationsService } from 'angular2-notifications';
|
2016-05-23 03:50:26 -04:00
|
|
|
|
2016-11-20 11:18:15 -05:00
|
|
|
import { AuthService } from '../../core';
|
2017-03-22 16:15:55 -04:00
|
|
|
import {
|
|
|
|
FormReactive,
|
|
|
|
VIDEO_NAME,
|
|
|
|
VIDEO_CATEGORY,
|
2017-03-27 15:11:37 -04:00
|
|
|
VIDEO_LICENCE,
|
2017-04-07 08:57:05 -04:00
|
|
|
VIDEO_LANGUAGE,
|
2017-03-22 16:15:55 -04:00
|
|
|
VIDEO_DESCRIPTION,
|
|
|
|
VIDEO_TAGS
|
|
|
|
} from '../../shared';
|
|
|
|
import { VideoService } from '../shared';
|
2016-04-14 16:07:46 -04:00
|
|
|
|
2016-03-14 08:50:19 -04:00
|
|
|
@Component({
|
|
|
|
selector: 'my-videos-add',
|
2016-09-19 16:49:31 -04:00
|
|
|
styleUrls: [ './video-add.component.scss' ],
|
|
|
|
templateUrl: './video-add.component.html'
|
2016-03-14 08:50:19 -04:00
|
|
|
})
|
|
|
|
|
2016-09-09 16:16:51 -04:00
|
|
|
export class VideoAddComponent extends FormReactive implements OnInit {
|
|
|
|
tags: string[] = [];
|
2016-06-07 16:34:02 -04:00
|
|
|
uploader: FileUploader;
|
2017-03-22 16:15:55 -04:00
|
|
|
videoCategories = [];
|
2017-03-27 15:11:37 -04:00
|
|
|
videoLicences = [];
|
2017-04-07 08:57:05 -04:00
|
|
|
videoLanguages = [];
|
2016-09-09 16:16:51 -04:00
|
|
|
|
|
|
|
error: string = null;
|
|
|
|
form: FormGroup;
|
|
|
|
formErrors = {
|
2016-06-07 16:34:02 -04:00
|
|
|
name: '',
|
2017-03-22 16:15:55 -04:00
|
|
|
category: '',
|
2017-03-27 15:11:37 -04:00
|
|
|
licence: '',
|
2017-04-07 08:57:05 -04:00
|
|
|
language: '',
|
2016-09-09 16:16:51 -04:00
|
|
|
description: '',
|
|
|
|
currentTag: ''
|
|
|
|
};
|
|
|
|
validationMessages = {
|
|
|
|
name: VIDEO_NAME.MESSAGES,
|
2017-03-22 16:15:55 -04:00
|
|
|
category: VIDEO_CATEGORY.MESSAGES,
|
2017-03-27 15:11:37 -04:00
|
|
|
licence: VIDEO_LICENCE.MESSAGES,
|
2017-04-07 08:57:05 -04:00
|
|
|
language: VIDEO_LANGUAGE.MESSAGES,
|
2016-09-09 16:16:51 -04:00
|
|
|
description: VIDEO_DESCRIPTION.MESSAGES,
|
|
|
|
currentTag: VIDEO_TAGS.MESSAGES
|
2016-06-07 16:34:02 -04:00
|
|
|
};
|
2016-03-14 08:50:19 -04:00
|
|
|
|
2016-11-27 12:10:26 -05:00
|
|
|
// Special error messages
|
|
|
|
tagsError = '';
|
|
|
|
fileError = '';
|
|
|
|
|
2016-04-14 16:07:46 -04:00
|
|
|
constructor(
|
2016-05-27 11:52:41 -04:00
|
|
|
private authService: AuthService,
|
2016-05-27 11:49:18 -04:00
|
|
|
private elementRef: ElementRef,
|
2016-09-09 16:16:51 -04:00
|
|
|
private formBuilder: FormBuilder,
|
2017-01-27 10:14:11 -05:00
|
|
|
private router: Router,
|
2017-03-22 16:15:55 -04:00
|
|
|
private notificationsService: NotificationsService,
|
|
|
|
private videoService: VideoService
|
2016-09-09 16:16:51 -04:00
|
|
|
) {
|
|
|
|
super();
|
|
|
|
}
|
2016-03-14 08:50:19 -04:00
|
|
|
|
2016-06-07 16:34:02 -04:00
|
|
|
get filename() {
|
|
|
|
if (this.uploader.queue.length === 0) {
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
|
|
|
return this.uploader.queue[0].file.name;
|
|
|
|
}
|
|
|
|
|
2016-09-09 16:16:51 -04:00
|
|
|
buildForm() {
|
|
|
|
this.form = this.formBuilder.group({
|
|
|
|
name: [ '', VIDEO_NAME.VALIDATORS ],
|
2017-04-04 15:37:03 -04:00
|
|
|
nsfw: [ false ],
|
2017-03-22 16:15:55 -04:00
|
|
|
category: [ '', VIDEO_CATEGORY.VALIDATORS ],
|
2017-03-27 15:11:37 -04:00
|
|
|
licence: [ '', VIDEO_LICENCE.VALIDATORS ],
|
2017-04-07 08:57:05 -04:00
|
|
|
language: [ '', VIDEO_LANGUAGE.VALIDATORS ],
|
2016-09-09 16:16:51 -04:00
|
|
|
description: [ '', VIDEO_DESCRIPTION.VALIDATORS ],
|
|
|
|
currentTag: [ '', VIDEO_TAGS.VALIDATORS ]
|
|
|
|
});
|
|
|
|
|
|
|
|
this.form.valueChanges.subscribe(data => this.onValueChanged(data));
|
2016-06-07 16:34:02 -04:00
|
|
|
}
|
|
|
|
|
2016-03-14 08:50:19 -04:00
|
|
|
ngOnInit() {
|
2017-03-22 16:15:55 -04:00
|
|
|
this.videoCategories = this.videoService.videoCategories;
|
2017-03-27 15:11:37 -04:00
|
|
|
this.videoLicences = this.videoService.videoLicences;
|
2017-04-07 08:57:05 -04:00
|
|
|
this.videoLanguages = this.videoService.videoLanguages;
|
2017-03-22 16:15:55 -04:00
|
|
|
|
2016-06-07 16:34:02 -04:00
|
|
|
this.uploader = new FileUploader({
|
|
|
|
authToken: this.authService.getRequestHeaderValue(),
|
|
|
|
queueLimit: 1,
|
2016-03-14 17:16:43 -04:00
|
|
|
url: '/api/v1/videos',
|
2016-06-07 16:34:02 -04:00
|
|
|
removeAfterUpload: true
|
2016-03-14 08:50:19 -04:00
|
|
|
});
|
2016-06-07 16:34:02 -04:00
|
|
|
|
|
|
|
this.uploader.onBuildItemForm = (item, form) => {
|
2016-09-09 16:16:51 -04:00
|
|
|
const name = this.form.value['name'];
|
2017-04-04 15:37:03 -04:00
|
|
|
const nsfw = this.form.value['nsfw'];
|
2017-03-22 16:15:55 -04:00
|
|
|
const category = this.form.value['category'];
|
2017-03-27 15:11:37 -04:00
|
|
|
const licence = this.form.value['licence'];
|
2017-04-07 08:57:05 -04:00
|
|
|
const language = this.form.value['language'];
|
2016-09-09 16:16:51 -04:00
|
|
|
const description = this.form.value['description'];
|
|
|
|
|
|
|
|
form.append('name', name);
|
2017-03-22 16:15:55 -04:00
|
|
|
form.append('category', category);
|
2017-04-04 15:37:03 -04:00
|
|
|
form.append('nsfw', nsfw);
|
2017-03-27 15:11:37 -04:00
|
|
|
form.append('licence', licence);
|
2017-04-07 08:57:05 -04:00
|
|
|
|
|
|
|
// Language is optional
|
|
|
|
if (language) {
|
|
|
|
form.append('language', language);
|
|
|
|
}
|
|
|
|
|
2016-09-09 16:16:51 -04:00
|
|
|
form.append('description', description);
|
2016-06-07 16:34:02 -04:00
|
|
|
|
2016-09-09 16:16:51 -04:00
|
|
|
for (let i = 0; i < this.tags.length; i++) {
|
|
|
|
form.append(`tags[${i}]`, this.tags[i]);
|
2016-06-07 16:34:02 -04:00
|
|
|
}
|
|
|
|
};
|
2016-09-09 16:16:51 -04:00
|
|
|
|
|
|
|
this.buildForm();
|
2016-06-07 16:34:02 -04:00
|
|
|
}
|
|
|
|
|
2016-11-27 12:10:26 -05:00
|
|
|
checkForm() {
|
|
|
|
this.forceCheck();
|
|
|
|
|
|
|
|
if (this.filename === null) {
|
|
|
|
this.fileError = 'You did not add a file.';
|
|
|
|
}
|
|
|
|
|
|
|
|
return this.form.valid === true && this.tagsError === '' && this.fileError === '';
|
|
|
|
}
|
|
|
|
|
|
|
|
fileChanged() {
|
|
|
|
this.fileError = '';
|
|
|
|
}
|
|
|
|
|
2016-06-07 16:34:02 -04:00
|
|
|
onTagKeyPress(event: KeyboardEvent) {
|
|
|
|
// Enter press
|
|
|
|
if (event.keyCode === 13) {
|
2017-03-22 16:47:05 -04:00
|
|
|
this.addTagIfPossible();
|
2016-06-07 16:34:02 -04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
removeFile() {
|
|
|
|
this.uploader.clearQueue();
|
|
|
|
}
|
|
|
|
|
|
|
|
removeTag(tag: string) {
|
2016-09-09 16:16:51 -04:00
|
|
|
this.tags.splice(this.tags.indexOf(tag), 1);
|
2016-10-17 15:14:13 -04:00
|
|
|
this.form.get('currentTag').enable();
|
2016-03-14 08:50:19 -04:00
|
|
|
}
|
|
|
|
|
2016-06-07 16:34:02 -04:00
|
|
|
upload() {
|
2017-03-22 16:47:05 -04:00
|
|
|
// Maybe the user forgot to press "enter" when he filled the field
|
|
|
|
this.addTagIfPossible();
|
|
|
|
|
2016-11-27 12:10:26 -05:00
|
|
|
if (this.checkForm() === false) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2016-06-07 16:34:02 -04:00
|
|
|
const item = this.uploader.queue[0];
|
|
|
|
// TODO: wait for https://github.com/valor-software/ng2-file-upload/pull/242
|
|
|
|
item.alias = 'videofile';
|
|
|
|
|
2016-10-07 08:52:18 -04:00
|
|
|
// FIXME: remove
|
|
|
|
// Run detection change for progress bar
|
|
|
|
const interval = setInterval(() => { ; }, 250);
|
|
|
|
|
2016-06-07 16:34:02 -04:00
|
|
|
item.onSuccess = () => {
|
2016-10-07 08:52:18 -04:00
|
|
|
clearInterval(interval);
|
|
|
|
|
2016-06-07 16:34:02 -04:00
|
|
|
console.log('Video uploaded.');
|
2017-01-27 10:14:11 -05:00
|
|
|
this.notificationsService.success('Success', 'Video uploaded.');
|
|
|
|
|
2016-06-07 16:34:02 -04:00
|
|
|
|
|
|
|
// Print all the videos once it's finished
|
2016-06-10 12:14:01 -04:00
|
|
|
this.router.navigate(['/videos/list']);
|
2016-06-07 16:34:02 -04:00
|
|
|
};
|
|
|
|
|
|
|
|
item.onError = (response: string, status: number) => {
|
2016-10-07 08:52:18 -04:00
|
|
|
clearInterval(interval);
|
|
|
|
|
2016-07-20 10:24:18 -04:00
|
|
|
// 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);
|
|
|
|
}
|
2016-06-07 16:34:02 -04:00
|
|
|
};
|
|
|
|
|
|
|
|
this.uploader.uploadAll();
|
2016-03-14 08:50:19 -04:00
|
|
|
}
|
2017-03-22 16:47:05 -04:00
|
|
|
|
|
|
|
private addTagIfPossible() {
|
|
|
|
const currentTag = this.form.value['currentTag'];
|
|
|
|
if (currentTag === undefined) return;
|
|
|
|
|
|
|
|
// 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();
|
|
|
|
}
|
|
|
|
|
|
|
|
this.tagsError = '';
|
|
|
|
}
|
|
|
|
}
|
2016-03-14 08:50:19 -04:00
|
|
|
}
|