Merge branch 'release/1.4.0' into develop

This commit is contained in:
Chocobozzz 2019-08-22 17:16:48 +02:00
commit 001ed2d40c
No known key found for this signature in database
GPG Key ID: 583A612D890159BE
9 changed files with 72 additions and 10 deletions

View File

@ -86,7 +86,8 @@
"options": { "options": {
"baseHref": "/", "baseHref": "/",
"deployUrl": "client/", "deployUrl": "client/",
"browserTarget": "PeerTube:build" "browserTarget": "PeerTube:build",
"proxyConfig": "proxy.config.json"
}, },
"configurations": { "configurations": {
"production": { "production": {
@ -96,7 +97,8 @@
"browserTarget": "PeerTube:build:hmr" "browserTarget": "PeerTube:build:hmr"
}, },
"e2e": { "e2e": {
"browserTarget": "PeerTube:build:e2e" "browserTarget": "PeerTube:build:e2e",
"proxyConfig": "e2e/proxy.config.json"
} }
} }
}, },

View File

@ -0,0 +1,37 @@
{
"/api": {
"target": "http://localhost:9000",
"secure": false
},
"/plugins": {
"target": "http://localhost:9000",
"secure": false
},
"/themes": {
"target": "http://localhost:9000",
"secure": false
},
"/static": {
"target": "http://localhost:9000",
"secure": false
},
"/lazy-static": {
"target": "http://localhost:9000",
"secure": false
},
"/socket.io": {
"target": "ws://localhost:9000",
"secure": false,
"ws": true
},
"/!(client)**": {
"target": "http://localhost:3333/client/index.html",
"secure": false,
"logLevel": "debug"
},
"/!(client)**/**": {
"target": "http://localhost:3333/client/index.html",
"secure": false,
"logLevel": "debug"
}
}

View File

@ -3,6 +3,7 @@
.plugin { .plugin {
margin: 15px 0; margin: 15px 0;
background-color: var(--submenuColor);
} }
.first-row { .first-row {

View File

@ -8,9 +8,11 @@ import { debounceTime, filter, map, pairwise, skip } from 'rxjs/operators'
import { Hotkey, HotkeysService } from 'angular2-hotkeys' import { Hotkey, HotkeysService } from 'angular2-hotkeys'
import { I18n } from '@ngx-translate/i18n-polyfill' import { I18n } from '@ngx-translate/i18n-polyfill'
import { fromEvent } from 'rxjs' import { fromEvent } from 'rxjs'
import { ViewportScroller } from '@angular/common' import { PlatformLocation, ViewportScroller } from '@angular/common'
import { PluginService } from '@app/core/plugins/plugin.service' import { PluginService } from '@app/core/plugins/plugin.service'
import { HooksService } from '@app/core/plugins/hooks.service' import { HooksService } from '@app/core/plugins/hooks.service'
import { NgbModal } from '@ng-bootstrap/ng-bootstrap'
import { POP_STATE_MODAL_DISMISS } from '@app/shared/misc/constants'
@Component({ @Component({
selector: 'my-app', selector: 'my-app',
@ -35,7 +37,9 @@ export class AppComponent implements OnInit {
private screenService: ScreenService, private screenService: ScreenService,
private hotkeysService: HotkeysService, private hotkeysService: HotkeysService,
private themeService: ThemeService, private themeService: ThemeService,
private hooks: HooksService private hooks: HooksService,
private location: PlatformLocation,
private modalService: NgbModal
) { } ) { }
get serverVersion () { get serverVersion () {
@ -90,6 +94,8 @@ export class AppComponent implements OnInit {
fromEvent(window, 'resize') fromEvent(window, 'resize')
.pipe(debounceTime(200)) .pipe(debounceTime(200))
.subscribe(() => this.onResize()) .subscribe(() => this.onResize())
this.location.onPopState(() => this.modalService.dismissAll(POP_STATE_MODAL_DISMISS))
} }
isUserLoggedIn () { isUserLoggedIn () {
@ -110,7 +116,6 @@ export class AppComponent implements OnInit {
const eventsObs = this.router.events const eventsObs = this.router.events
const scrollEvent = eventsObs.pipe(filter((e: Event): e is Scroll => e instanceof Scroll)) const scrollEvent = eventsObs.pipe(filter((e: Event): e is Scroll => e instanceof Scroll))
const navigationEndEvent = eventsObs.pipe(filter((e: Event): e is NavigationEnd => e instanceof NavigationEnd))
scrollEvent.subscribe(e => { scrollEvent.subscribe(e => {
if (e.position) { if (e.position) {
@ -126,6 +131,8 @@ export class AppComponent implements OnInit {
} }
}) })
const navigationEndEvent = eventsObs.pipe(filter((e: Event): e is NavigationEnd => e instanceof NavigationEnd))
// When we add the a-state parameter, we don't want to alter the scroll // When we add the a-state parameter, we don't want to alter the scroll
navigationEndEvent.pipe(pairwise()) navigationEndEvent.pipe(pairwise())
.subscribe(([ e1, e2 ]) => { .subscribe(([ e1, e2 ]) => {

View File

@ -18,12 +18,16 @@ export class ConfirmService {
confirm (message: string, title = '', confirmButtonText?: string) { confirm (message: string, title = '', confirmButtonText?: string) {
this.showConfirm.next({ title, message, confirmButtonText }) this.showConfirm.next({ title, message, confirmButtonText })
return this.confirmResponse.asObservable().pipe(first()).toPromise() return this.confirmResponse.asObservable()
.pipe(first())
.toPromise()
} }
confirmWithInput (message: string, inputLabel: string, expectedInputValue: string, title = '', confirmButtonText?: string) { confirmWithInput (message: string, inputLabel: string, expectedInputValue: string, title = '', confirmButtonText?: string) {
this.showConfirm.next({ title, message, inputLabel, expectedInputValue, confirmButtonText }) this.showConfirm.next({ title, message, inputLabel, expectedInputValue, confirmButtonText })
return this.confirmResponse.asObservable().pipe(first()).toPromise() return this.confirmResponse.asObservable()
.pipe(first())
.toPromise()
} }
} }

View File

@ -3,6 +3,7 @@ import { ConfirmService } from '@app/core/confirm/confirm.service'
import { I18n } from '@ngx-translate/i18n-polyfill' import { I18n } from '@ngx-translate/i18n-polyfill'
import { NgbModal } from '@ng-bootstrap/ng-bootstrap' import { NgbModal } from '@ng-bootstrap/ng-bootstrap'
import { NgbModalRef } from '@ng-bootstrap/ng-bootstrap/modal/modal-ref' import { NgbModalRef } from '@ng-bootstrap/ng-bootstrap/modal/modal-ref'
import { POP_STATE_MODAL_DISMISS } from '@app/shared/misc/constants'
@Component({ @Component({
selector: 'my-confirm', selector: 'my-confirm',
@ -63,6 +64,11 @@ export class ConfirmComponent implements OnInit {
this.openedModal.result this.openedModal.result
.then(() => this.confirmService.confirmResponse.next(true)) .then(() => this.confirmService.confirmResponse.next(true))
.catch(() => this.confirmService.confirmResponse.next(false)) .catch((reason: string) => {
// If the reason was that the user used the back button, we don't care about the confirm dialog result
if (!reason || reason !== POP_STATE_MODAL_DISMISS) {
this.confirmService.confirmResponse.next(false)
}
})
} }
} }

View File

@ -0,0 +1 @@
export const POP_STATE_MODAL_DISMISS = 'pop state dismiss'

View File

@ -34,6 +34,7 @@ import { VideoWatchPlaylistComponent } from '@app/videos/+video-watch/video-watc
import { getStoredTheater } from '../../../assets/player/peertube-player-local-storage' import { getStoredTheater } from '../../../assets/player/peertube-player-local-storage'
import { PluginService } from '@app/core/plugins/plugin.service' import { PluginService } from '@app/core/plugins/plugin.service'
import { HooksService } from '@app/core/plugins/hooks.service' import { HooksService } from '@app/core/plugins/hooks.service'
import { PlatformLocation } from '@angular/common'
@Component({ @Component({
selector: 'my-video-watch', selector: 'my-video-watch',
@ -95,6 +96,7 @@ export class VideoWatchComponent implements OnInit, OnDestroy {
private i18n: I18n, private i18n: I18n,
private hotkeysService: HotkeysService, private hotkeysService: HotkeysService,
private hooks: HooksService, private hooks: HooksService,
private location: PlatformLocation,
@Inject(LOCALE_ID) private localeId: string @Inject(LOCALE_ID) private localeId: string
) {} ) {}
@ -374,13 +376,13 @@ export class VideoWatchComponent implements OnInit, OnDestroy {
this.i18n('This video contains mature or explicit content. Are you sure you want to watch it?'), this.i18n('This video contains mature or explicit content. Are you sure you want to watch it?'),
this.i18n('Mature or explicit content') this.i18n('Mature or explicit content')
) )
if (res === false) return this.redirectService.redirectToHomepage() if (res === false) return this.location.back()
} }
// Flush old player if needed // Flush old player if needed
this.flushPlayer() this.flushPlayer()
// Build video element, because videojs remove it on dispose // Build video element, because videojs removes it on dispose
const playerElementWrapper = this.elementRef.nativeElement.querySelector('#videojs-wrapper') const playerElementWrapper = this.elementRef.nativeElement.querySelector('#videojs-wrapper')
this.playerElement = document.createElement('video') this.playerElement = document.createElement('video')
this.playerElement.className = 'video-js vjs-peertube-skin' this.playerElement.className = 'video-js vjs-peertube-skin'

View File

@ -44,6 +44,8 @@ async function getAvatar (req: express.Request, res: express.Response) {
} }
const avatar = await AvatarModel.loadByName(filename) const avatar = await AvatarModel.loadByName(filename)
if (!avatar) return res.sendStatus(404)
if (avatar.onDisk === false) { if (avatar.onDisk === false) {
if (!avatar.fileUrl) return res.sendStatus(404) if (!avatar.fileUrl) return res.sendStatus(404)