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