diff --git a/client/src/app/+my-account/my-account-video-playlists/my-account-video-playlist-edit.component.html b/client/src/app/+my-account/my-account-video-playlists/my-account-video-playlist-edit.component.html index e61509efd..56060359a 100644 --- a/client/src/app/+my-account/my-account-video-playlists/my-account-video-playlist-edit.component.html +++ b/client/src/app/+my-account/my-account-video-playlists/my-account-video-playlist-edit.component.html @@ -68,13 +68,10 @@
-
- -
+ +
{{ formErrors['videoChannelId'] }} diff --git a/client/src/app/+my-account/my-account-video-playlists/my-account-video-playlist-edit.ts b/client/src/app/+my-account/my-account-video-playlists/my-account-video-playlist-edit.ts index 7ae8de75e..94a0f6168 100644 --- a/client/src/app/+my-account/my-account-video-playlists/my-account-video-playlist-edit.ts +++ b/client/src/app/+my-account/my-account-video-playlists/my-account-video-playlist-edit.ts @@ -1,11 +1,12 @@ import { FormReactive } from '@app/shared/shared-forms' +import { SelectChannelItem } from '@app/shared/shared-forms/select-channel.component' import { VideoConstant, VideoPlaylistPrivacy } from '@shared/models' import { VideoPlaylist } from '@shared/models/videos/playlist/video-playlist.model' export abstract class MyAccountVideoPlaylistEdit extends FormReactive { // Declare it here to avoid errors in create template videoPlaylistToUpdate: VideoPlaylist - userVideoChannels: { id: number, label: string }[] = [] + userVideoChannels: SelectChannelItem[] = [] videoPlaylistPrivacies: VideoConstant[] = [] abstract isCreation (): boolean diff --git a/client/src/app/+search/search-filters.component.html b/client/src/app/+search/search-filters.component.html index b36b1d2ae..1d1e7b868 100644 --- a/client/src/app/+search/search-filters.component.html +++ b/client/src/app/+search/search-filters.component.html @@ -144,7 +144,7 @@ - +
@@ -152,7 +152,7 @@ - +
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 4cd3838de..48c5508f4 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 @@ -1,16 +1,17 @@ +import { forkJoin } from 'rxjs' import { map } from 'rxjs/operators' import { Component, Input, NgZone, OnDestroy, OnInit, ViewChild } from '@angular/core' import { FormArray, FormControl, FormGroup, ValidatorFn, Validators } from '@angular/forms' import { ServerService } from '@app/core' import { removeElementFromArray } from '@app/helpers' import { FormReactiveValidationMessages, FormValidatorService, VideoValidatorsService } from '@app/shared/shared-forms' +import { SelectChannelItem } from '@app/shared/shared-forms/select-channel.component' +import { InstanceService } from '@app/shared/shared-instance' import { VideoCaptionEdit, VideoEdit, VideoService } from '@app/shared/shared-main' +import { I18n } from '@ngx-translate/i18n-polyfill' import { ServerConfig, VideoConstant, VideoPrivacy } from '@shared/models' import { I18nPrimengCalendarService } from './i18n-primeng-calendar.service' import { VideoCaptionAddModalComponent } from './video-caption-add-modal.component' -import { I18n } from '@ngx-translate/i18n-polyfill' -import { forkJoin } from 'rxjs' -import { InstanceService } from '@app/shared/shared-instance' type VideoLanguages = VideoConstant & { group?: string } @@ -23,7 +24,7 @@ export class VideoEditComponent implements OnInit, OnDestroy { @Input() form: FormGroup @Input() formErrors: { [ id: string ]: string } = {} @Input() validationMessages: FormReactiveValidationMessages = {} - @Input() userVideoChannels: { id: number, label: string, support: string }[] = [] + @Input() userVideoChannels: SelectChannelItem[] = [] @Input() schedulePublicationPossible = true @Input() videoCaptions: (VideoCaptionEdit & { captionPath?: string })[] = [] @Input() waitTranscodingEnabled = true 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 86f2b376f..c55e5f923 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 @@ -3,6 +3,7 @@ import { Directive, EventEmitter, OnInit } from '@angular/core' import { AuthService, CanComponentDeactivateResult, Notifier, ServerService } from '@app/core' import { populateAsyncUserVideoChannels } from '@app/helpers' import { FormReactive } from '@app/shared/shared-forms' +import { SelectChannelItem } from '@app/shared/shared-forms/select-channel.component' import { VideoCaptionEdit, VideoCaptionService, VideoEdit, VideoService } from '@app/shared/shared-main' import { LoadingBarService } from '@ngx-loading-bar/core' import { ServerConfig, VideoConstant, VideoPrivacy } from '@shared/models' @@ -10,7 +11,7 @@ import { ServerConfig, VideoConstant, VideoPrivacy } from '@shared/models' @Directive() // tslint:disable-next-line: directive-class-suffix export abstract class VideoSend extends FormReactive implements OnInit { - userVideoChannels: { id: number, label: string, support: string, avatarPath?: string }[] = [] + userVideoChannels: SelectChannelItem[] = [] videoPrivacies: VideoConstant[] = [] videoCaptions: VideoCaptionEdit[] = [] 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 de4f65df3..263c71f3b 100644 --- a/client/src/app/+videos/+video-edit/video-update.component.ts +++ b/client/src/app/+videos/+video-edit/video-update.component.ts @@ -3,6 +3,7 @@ import { Component, HostListener, OnInit } from '@angular/core' import { ActivatedRoute, Router } from '@angular/router' import { Notifier } from '@app/core' import { FormReactive, FormValidatorService } from '@app/shared/shared-forms' +import { SelectChannelItem } from '@app/shared/shared-forms/select-channel.component' import { VideoCaptionEdit, VideoCaptionService, VideoDetails, VideoEdit, VideoService } from '@app/shared/shared-main' import { LoadingBarService } from '@ngx-loading-bar/core' import { I18n } from '@ngx-translate/i18n-polyfill' @@ -17,7 +18,7 @@ export class VideoUpdateComponent extends FormReactive implements OnInit { video: VideoEdit isUpdatingVideo = false - userVideoChannels: { id: number, label: string, support: string, avatar?: string }[] = [] + userVideoChannels: SelectChannelItem[] = [] schedulePublicationPossible = false videoCaptions: VideoCaptionEdit[] = [] waitTranscodingEnabled = true diff --git a/client/src/app/core/rest/rest.service.ts b/client/src/app/core/rest/rest.service.ts index 9e32c6d58..4f1fc8848 100644 --- a/client/src/app/core/rest/rest.service.ts +++ b/client/src/app/core/rest/rest.service.ts @@ -49,7 +49,7 @@ export class RestService { const value = object[name] if (value === undefined || value === null) continue - if (Array.isArray(value) && value.length !== 0) { + if (Array.isArray(value)) { for (const v of value) params = params.append(name, v) } else { params = params.append(name, value) diff --git a/client/src/app/helpers/utils.ts b/client/src/app/helpers/utils.ts index aa37fdd46..b925e6d98 100644 --- a/client/src/app/helpers/utils.ts +++ b/client/src/app/helpers/utils.ts @@ -1,6 +1,7 @@ import { DatePipe } from '@angular/common' import { environment } from '../../environments/environment' import { AuthService } from '../core/auth' +import { SelectChannelItem } from '@app/shared/shared-forms/select-channel.component' // Thanks: https://stackoverflow.com/questions/901115/how-can-i-get-query-string-values-in-javascript function getParameterByName (name: string, url: string) { @@ -18,7 +19,7 @@ function getParameterByName (name: string, url: string) { function populateAsyncUserVideoChannels ( authService: AuthService, - channel: { id: number, label: string, support?: string, avatarPath?: string, recent?: boolean }[] + channel: SelectChannelItem[] ) { return new Promise(res => { authService.userInformationLoaded diff --git a/client/src/app/shared/shared-forms/select-channel.component.ts b/client/src/app/shared/shared-forms/select-channel.component.ts index de98c8c0a..ef4192095 100644 --- a/client/src/app/shared/shared-forms/select-channel.component.ts +++ b/client/src/app/shared/shared-forms/select-channel.component.ts @@ -1,7 +1,14 @@ -import { Component, Input, forwardRef, ViewChild } from '@angular/core' -import { NG_VALUE_ACCESSOR, ControlValueAccessor } from '@angular/forms' +import { Component, forwardRef, Input } from '@angular/core' +import { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms' import { Actor } from '../shared-main' +export type SelectChannelItem = { + id: number + label: string + support: string + avatarPath?: string +} + @Component({ selector: 'my-select-channel', styleUrls: [ './select-shared.component.scss' ], @@ -15,7 +22,7 @@ import { Actor } from '../shared-main' ] }) export class SelectChannelComponent implements ControlValueAccessor { - @Input() items: { id: number, label: string, support: string, avatarPath?: string }[] = [] + @Input() items: SelectChannelItem[] = [] selectedId: number diff --git a/client/src/app/shared/shared-forms/select-tags.component.html b/client/src/app/shared/shared-forms/select-tags.component.html index 0609c9d20..e1cd50882 100644 --- a/client/src/app/shared/shared-forms/select-tags.component.html +++ b/client/src/app/shared/shared-forms/select-tags.component.html @@ -1,6 +1,6 @@ { /* empty */ } writeValue (items: string[]) { - this._items = items - this.propagateChange(this._items) + this.selectedItems = items + this.propagateChange(this.selectedItems) } registerOnChange (fn: (_: any) => void) { @@ -33,6 +33,8 @@ export class SelectTagsComponent implements ControlValueAccessor { } onModelChange () { - this.propagateChange(this._items) + console.log(this.selectedItems) + + this.propagateChange(this.selectedItems) } } diff --git a/client/src/app/shared/shared-search/advanced-search.model.ts b/client/src/app/shared/shared-search/advanced-search.model.ts index 516854a8c..30badc8fa 100644 --- a/client/src/app/shared/shared-search/advanced-search.model.ts +++ b/client/src/app/shared/shared-search/advanced-search.model.ts @@ -15,8 +15,8 @@ export class AdvancedSearch { languageOneOf: string - tagsOneOf: string - tagsAllOf: string + tagsOneOf: string[] + tagsAllOf: string[] durationMin: number // seconds durationMax: number // seconds @@ -37,8 +37,10 @@ export class AdvancedSearch { categoryOneOf?: string licenceOneOf?: string languageOneOf?: string - tagsOneOf?: string - tagsAllOf?: string + + tagsOneOf?: any + tagsAllOf?: any + durationMin?: string durationMax?: string sort?: string @@ -55,8 +57,8 @@ export class AdvancedSearch { this.categoryOneOf = options.categoryOneOf || undefined this.licenceOneOf = options.licenceOneOf || undefined this.languageOneOf = options.languageOneOf || undefined - this.tagsOneOf = options.tagsOneOf || undefined - this.tagsAllOf = options.tagsAllOf || undefined + this.tagsOneOf = this.intoArray(options.tagsOneOf) + this.tagsAllOf = this.intoArray(options.tagsAllOf) this.durationMin = parseInt(options.durationMin, 10) this.durationMax = parseInt(options.durationMax, 10) @@ -69,13 +71,11 @@ export class AdvancedSearch { } containsValues () { - const exceptions = new Set([ 'sort', 'searchTarget' ]) - const obj = this.toUrlObject() for (const k of Object.keys(obj)) { if (this.silentFilters.has(k)) continue - if (obj[k] !== undefined && obj[k] !== '') return true + if (this.isValidValue(obj[k])) return true } return false @@ -127,8 +127,8 @@ export class AdvancedSearch { categoryOneOf: this.intoArray(this.categoryOneOf), licenceOneOf: this.intoArray(this.licenceOneOf), languageOneOf: this.intoArray(this.languageOneOf), - tagsOneOf: this.intoArray(this.tagsOneOf), - tagsAllOf: this.intoArray(this.tagsAllOf), + tagsOneOf: this.tagsOneOf, + tagsAllOf: this.tagsAllOf, durationMin: this.durationMin, durationMax: this.durationMax, sort: this.sort, @@ -143,12 +143,20 @@ export class AdvancedSearch { for (const k of Object.keys(obj)) { if (this.silentFilters.has(k)) continue - if (obj[k] !== undefined && obj[k] !== '') acc++ + if (this.isValidValue(obj[k])) acc++ } return acc } + private isValidValue (val: any) { + if (val === undefined) return false + if (val === '') return false + if (Array.isArray(val) && val.length === 0) return false + + return true + } + private intoArray (value: any) { if (!value) return undefined if (Array.isArray(value)) return value