Sort video captions
authorChocobozzz <me@florianbigard.com>
Wed, 25 Jul 2018 13:11:25 +0000 (15:11 +0200)
committerChocobozzz <me@florianbigard.com>
Wed, 25 Jul 2018 13:11:25 +0000 (15:11 +0200)
client/src/app/core/server/server.service.ts
client/src/app/shared/misc/utils.ts
client/src/app/shared/video-caption/video-caption.service.ts
client/src/app/videos/+video-edit/shared/video-edit.component.ts
client/src/assets/player/peertube-videojs-plugin.ts

index 87280e16fd27d928ceb8f878982df6333167132f..7b11c068ee1ad0ea52e54c7b351f9b67aec8b28f 100644 (file)
@@ -2,13 +2,14 @@ import { map, share, switchMap, tap } from 'rxjs/operators'
 import { HttpClient } from '@angular/common/http'
 import { Inject, Injectable, LOCALE_ID } from '@angular/core'
 import { peertubeLocalStorage } from '@app/shared/misc/peertube-local-storage'
-import { Observable, ReplaySubject, of } from 'rxjs'
+import { Observable, of, ReplaySubject } from 'rxjs'
 import { getCompleteLocale, ServerConfig } from '../../../../../shared'
 import { About } from '../../../../../shared/models/server/about.model'
 import { environment } from '../../../environments/environment'
-import { VideoConstant, VideoPrivacy } from '../../../../../shared/models/videos'
+import { VideoConstant } from '../../../../../shared/models/videos'
 import { isDefaultLocale } from '../../../../../shared/models/i18n'
 import { getDevLocale, isOnDevLocale, peertubeTranslate } from '@app/shared/i18n/i18n-utils'
+import { sortBy } from '@app/shared/misc/utils'
 
 @Injectable()
 export class ServerService {
@@ -156,13 +157,7 @@ export class ServerService {
                   })
                 })
 
-          if (sort === true) {
-            hashToPopulate.sort((a, b) => {
-              if (a.label < b.label) return -1
-              if (a.label === b.label) return 0
-              return 1
-            })
-          }
+          if (sort === true) sortBy(hashToPopulate, 'label')
 
           notifier.next(true)
         })
index 8381745f5fd4ad8394ea49949e64b269ab9d42d9..018271efe9b7e014e3f55e4d56f0f7a479b91b47 100644 (file)
@@ -101,7 +101,19 @@ function removeElementFromArray <T> (arr: T[], elem: T) {
   if (index !== -1) arr.splice(index, 1)
 }
 
+function sortBy (obj: any[], key1: string, key2?: string) {
+  return obj.sort((a, b) => {
+    const elem1 = key2 ? a[key1][key2] : a[key1]
+    const elem2 = key2 ? b[key1][key2] : b[key1]
+
+    if (elem1 < elem2) return -1
+    if (elem1 === elem2) return 0
+    return 1
+  })
+}
+
 export {
+  sortBy,
   objectToUrlEncoded,
   getParameterByName,
   populateAsyncUserVideoChannels,
index e835981dd2d912c3d66f5a52c5dfc8ce0586fdaf..0ff094d1fe0cc61ff960d0d4d42eb0243498a533 100644 (file)
@@ -6,7 +6,7 @@ import { ResultList } from '../../../../../shared'
 import { RestExtractor, RestService } from '../rest'
 import { VideoCaption } from '../../../../../shared/models/videos/video-caption.model'
 import { VideoService } from '@app/shared/video/video.service'
-import { objectToFormData } from '@app/shared/misc/utils'
+import { objectToFormData, sortBy } from '@app/shared/misc/utils'
 import { VideoCaptionEdit } from '@app/shared/video-caption/video-caption-edit.model'
 
 @Injectable()
@@ -19,6 +19,11 @@ export class VideoCaptionService {
 
   listCaptions (videoId: number | string): Observable<ResultList<VideoCaption>> {
     return this.authHttp.get<ResultList<VideoCaption>>(VideoService.BASE_VIDEO_URL + videoId + '/captions')
+               .pipe(map(res => {
+                 sortBy(res.data, 'language', 'label')
+
+                 return res
+               }))
                .pipe(catchError(res => this.restExtractor.handleError(res)))
   }
 
index b8aef99ddb94ef2c9ea5c558fb9540c25096fa1d..b394a13e4932c5fa8125dde7c13e72a826fcbe4f 100644 (file)
@@ -142,12 +142,13 @@ export class VideoEditComponent implements OnInit, OnDestroy {
     // Replace existing caption?
     if (existingCaption) {
       Object.assign(existingCaption, caption, { action: 'CREATE' as 'CREATE' })
-      return
+    } else {
+      this.videoCaptions.push(
+        Object.assign(caption, { action: 'CREATE' as 'CREATE' })
+      )
     }
 
-    this.videoCaptions.push(
-      Object.assign(caption, { action: 'CREATE' as 'CREATE' })
-    )
+    this.sortVideoCaptions()
   }
 
   async deleteCaption (caption: VideoCaptionEdit) {
@@ -170,6 +171,15 @@ export class VideoEditComponent implements OnInit, OnDestroy {
     this.videoCaptionAddModal.show()
   }
 
+  private sortVideoCaptions () {
+    this.videoCaptions.sort((v1, v2) => {
+      if (v1.language.label < v2.language.label) return -1
+      if (v1.language.label === v2.language.label) return 0
+
+      return 1
+    })
+  }
+
   private trackPrivacyChange () {
     // We will update the "support" field depending on the channel
     this.form.controls[ 'privacy' ]
index b02f4373a0df47ab6fbf299393c64646a4123b5f..4b0677faba6dc43f9a85e8e22277371bf919c7a5 100644 (file)
@@ -590,7 +590,7 @@ class PeerTubePlugin extends Plugin {
       this.player.options_.inactivityTimeout = 0
     }
     const enableInactivity = () => {
-      // this.player.options_.inactivityTimeout = saveInactivityTimeout
+      this.player.options_.inactivityTimeout = saveInactivityTimeout
     }
 
     const settingsDialog = this.player.children_.find(c => c.name_ === 'SettingsDialog')