import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core'
-import { ActivatedRoute } from '@angular/router'
-import { RedirectService, ServerService } from '@app/core'
-import { NotificationsService } from 'angular2-notifications'
-import { SearchService } from '@app/search/search.service'
+import { ValidatorFn } from '@angular/forms'
+import { VideoValidatorsService } from '@app/shared'
+import { ServerService } from '@app/core'
import { I18n } from '@ngx-translate/i18n-polyfill'
-import { MetaService } from '@ngx-meta/core'
import { AdvancedSearch } from '@app/search/advanced-search.model'
-import { VideoConstant } from '../../../../shared'
+import { ServerConfig, VideoConstant } from '../../../../shared'
@Component({
selector: 'my-search-filters',
videoLicences: VideoConstant<number>[] = []
videoLanguages: VideoConstant<string>[] = []
+ tagValidators: ValidatorFn[]
+ tagValidatorsMessages: { [ name: string ]: string }
+
publishedDateRanges: { id: string, label: string }[] = []
sorts: { id: string, label: string }[] = []
durationRanges: { id: string, label: string }[] = []
publishedDateRange: string
durationRange: string
+ originallyPublishedStartYear: string
+ originallyPublishedEndYear: string
+
+ private serverConfig: ServerConfig
+
constructor (
private i18n: I18n,
- private route: ActivatedRoute,
- private metaService: MetaService,
- private redirectService: RedirectService,
- private notificationsService: NotificationsService,
- private searchService: SearchService,
+ private videoValidatorsService: VideoValidatorsService,
private serverService: ServerService
) {
+ this.tagValidators = this.videoValidatorsService.VIDEO_TAGS.VALIDATORS
+ this.tagValidatorsMessages = this.videoValidatorsService.VIDEO_TAGS.MESSAGES
this.publishedDateRanges = [
+ {
+ id: 'any_published_date',
+ label: this.i18n('Any')
+ },
{
id: 'today',
label: this.i18n('Today')
this.durationRanges = [
{
- id: 'short',
- label: this.i18n('Short (< 4 min)')
+ id: 'any_duration',
+ label: this.i18n('Any')
},
{
- id: 'long',
- label: this.i18n('Long (> 10 min)')
+ id: 'short',
+ label: this.i18n('Short (< 4 min)')
},
{
id: 'medium',
label: this.i18n('Medium (4-10 min)')
+ },
+ {
+ id: 'long',
+ label: this.i18n('Long (> 10 min)')
}
]
}
ngOnInit () {
- this.videoCategories = this.serverService.getVideoCategories()
- this.videoLicences = this.serverService.getVideoLicences()
- this.videoLanguages = this.serverService.getVideoLanguages()
+ this.serverConfig = this.serverService.getTmpConfig()
+ this.serverService.getConfig()
+ .subscribe(config => this.serverConfig = config)
+
+ this.serverService.getVideoCategories().subscribe(categories => this.videoCategories = categories)
+ this.serverService.getVideoLicences().subscribe(licences => this.videoLicences = licences)
+ this.serverService.getVideoLanguages().subscribe(languages => this.videoLanguages = languages)
this.loadFromDurationRange()
this.loadFromPublishedRange()
+ this.loadOriginallyPublishedAtYears()
}
- formUpdated () {
+ inputUpdated () {
this.updateModelFromDurationRange()
this.updateModelFromPublishedRange()
+ this.updateModelFromOriginallyPublishedAtYears()
+ }
+ formUpdated () {
+ this.inputUpdated()
this.filtered.emit(this.advancedSearch)
}
+ reset () {
+ this.advancedSearch.reset()
+ this.durationRange = undefined
+ this.publishedDateRange = undefined
+ this.originallyPublishedStartYear = undefined
+ this.originallyPublishedEndYear = undefined
+ this.inputUpdated()
+ }
+
+ resetField (fieldName: string, value?: any) {
+ this.advancedSearch[fieldName] = value
+ }
+
+ resetLocalField (fieldName: string, value?: any) {
+ this[fieldName] = value
+ this.inputUpdated()
+ }
+
+ resetOriginalPublicationYears () {
+ this.originallyPublishedStartYear = this.originallyPublishedEndYear = undefined
+ }
+
+ isSearchTargetEnabled () {
+ return this.serverConfig.search.searchIndex.enabled && this.serverConfig.search.searchIndex.disableLocalSearch !== true
+ }
+
+ private loadOriginallyPublishedAtYears () {
+ this.originallyPublishedStartYear = this.advancedSearch.originallyPublishedStartDate
+ ? new Date(this.advancedSearch.originallyPublishedStartDate).getFullYear().toString()
+ : null
+
+ this.originallyPublishedEndYear = this.advancedSearch.originallyPublishedEndDate
+ ? new Date(this.advancedSearch.originallyPublishedEndDate).getFullYear().toString()
+ : null
+ }
+
private loadFromDurationRange () {
if (this.advancedSearch.durationMin || this.advancedSearch.durationMax) {
const fourMinutes = 60 * 4
}
}
+ private updateModelFromOriginallyPublishedAtYears () {
+ const baseDate = new Date()
+ baseDate.setHours(0, 0, 0, 0)
+ baseDate.setMonth(0, 1)
+
+ if (this.originallyPublishedStartYear) {
+ const year = parseInt(this.originallyPublishedStartYear, 10)
+ const start = new Date(baseDate)
+ start.setFullYear(year)
+
+ this.advancedSearch.originallyPublishedStartDate = start.toISOString()
+ } else {
+ this.advancedSearch.originallyPublishedStartDate = null
+ }
+
+ if (this.originallyPublishedEndYear) {
+ const year = parseInt(this.originallyPublishedEndYear, 10)
+ const end = new Date(baseDate)
+ end.setFullYear(year)
+
+ this.advancedSearch.originallyPublishedEndDate = end.toISOString()
+ } else {
+ this.advancedSearch.originallyPublishedEndDate = null
+ }
+ }
+
private updateModelFromDurationRange () {
if (!this.durationRange) return