diff options
author | Chocobozzz <me@florianbigard.com> | 2019-06-07 15:04:41 +0200 |
---|---|---|
committer | Chocobozzz <me@florianbigard.com> | 2019-06-07 15:04:41 +0200 |
commit | b91bc1d1f3591c35ab4426f6ab594b4bd9f1ef62 (patch) | |
tree | 754bb49026d4df8086030e28a8a7c16e3f0338b6 /client | |
parent | 851f5daa1eec66e1faa3c45238ec9ab91be05b00 (diff) | |
parent | 03371ad9d049bab79445a1b35da44cb1272f6c28 (diff) | |
download | PeerTube-b91bc1d1f3591c35ab4426f6ab594b4bd9f1ef62.tar.gz PeerTube-b91bc1d1f3591c35ab4426f6ab594b4bd9f1ef62.tar.zst PeerTube-b91bc1d1f3591c35ab4426f6ab594b4bd9f1ef62.zip |
Merge branch 'release/v1.3.0' into develop
Diffstat (limited to 'client')
12 files changed, 47 insertions, 53 deletions
diff --git a/client/src/app/menu/menu.component.scss b/client/src/app/menu/menu.component.scss index fa9a006af..06baa52d3 100644 --- a/client/src/app/menu/menu.component.scss +++ b/client/src/app/menu/menu.component.scss | |||
@@ -75,22 +75,22 @@ menu { | |||
75 | .logged-in-more { | 75 | .logged-in-more { |
76 | margin-right: 20px; | 76 | margin-right: 20px; |
77 | 77 | ||
78 | my-global-icon { | 78 | my-global-icon.dropdown-toggle { |
79 | @include apply-svg-color(var(--mainBackgroundColor)); | ||
80 | |||
81 | cursor: pointer; | 79 | cursor: pointer; |
82 | 80 | ||
83 | &::after { | 81 | &::after { |
84 | border: none; | 82 | border: none; |
85 | } | 83 | } |
84 | |||
85 | /deep/ { | ||
86 | @include apply-svg-color(var(--menuForegroundColor)); | ||
87 | } | ||
86 | } | 88 | } |
87 | 89 | ||
88 | .dropdown-item { | 90 | .dropdown-item { |
89 | @include dropdown-with-icon-item; | 91 | @include dropdown-with-icon-item; |
90 | 92 | ||
91 | my-global-icon { | 93 | my-global-icon { |
92 | @include apply-svg-color(var(--mainForegroundColor)); | ||
93 | |||
94 | width: 22px; | 94 | width: 22px; |
95 | height: 22px; | 95 | height: 22px; |
96 | 96 | ||
diff --git a/client/src/app/shared/buttons/action-dropdown.component.scss b/client/src/app/shared/buttons/action-dropdown.component.scss index 5073190b0..7c2b0db71 100644 --- a/client/src/app/shared/buttons/action-dropdown.component.scss +++ b/client/src/app/shared/buttons/action-dropdown.component.scss | |||
@@ -32,6 +32,10 @@ | |||
32 | 32 | ||
33 | .more-icon { | 33 | .more-icon { |
34 | width: 21px; | 34 | width: 21px; |
35 | |||
36 | /deep/ { | ||
37 | @include apply-svg-color(var(--mainForegroundColor)); | ||
38 | } | ||
35 | } | 39 | } |
36 | 40 | ||
37 | &.small { | 41 | &.small { |
diff --git a/client/src/app/shared/buttons/action-dropdown.component.ts b/client/src/app/shared/buttons/action-dropdown.component.ts index f5345831b..c9dbbfda2 100644 --- a/client/src/app/shared/buttons/action-dropdown.component.ts +++ b/client/src/app/shared/buttons/action-dropdown.component.ts | |||
@@ -41,10 +41,4 @@ export class ActionDropdownComponent<T> { | |||
41 | areActionsDisplayed (actions: DropdownAction<T>[], entry: T) { | 41 | areActionsDisplayed (actions: DropdownAction<T>[], entry: T) { |
42 | return actions.some(a => a.isDisplayed === undefined || a.isDisplayed(entry)) | 42 | return actions.some(a => a.isDisplayed === undefined || a.isDisplayed(entry)) |
43 | } | 43 | } |
44 | |||
45 | handleClick (event: Event, action: DropdownAction<T>) { | ||
46 | event.preventDefault() | ||
47 | |||
48 | // action.handler(entry) | ||
49 | } | ||
50 | } | 44 | } |
diff --git a/client/src/app/shared/forms/form-reactive.ts b/client/src/app/shared/forms/form-reactive.ts index 0d40b6f4a..6aec2937d 100644 --- a/client/src/app/shared/forms/form-reactive.ts +++ b/client/src/app/shared/forms/form-reactive.ts | |||
@@ -57,7 +57,7 @@ export abstract class FormReactive { | |||
57 | 57 | ||
58 | // Don't care if dirty on force check | 58 | // Don't care if dirty on force check |
59 | const isDirty = control.dirty || forceCheck === true | 59 | const isDirty = control.dirty || forceCheck === true |
60 | if (control && isDirty && !control.valid) { | 60 | if (control && isDirty && control.enabled && !control.valid) { |
61 | const messages = validationMessages[ field ] | 61 | const messages = validationMessages[ field ] |
62 | for (const key of Object.keys(control.errors)) { | 62 | for (const key of Object.keys(control.errors)) { |
63 | formErrors[ field ] += messages[ key ] + ' ' | 63 | formErrors[ field ] += messages[ key ] + ' ' |
diff --git a/client/src/app/shared/instance/instance-features-table.component.scss b/client/src/app/shared/instance/instance-features-table.component.scss index 90fbb5c94..f9bec038d 100644 --- a/client/src/app/shared/instance/instance-features-table.component.scss +++ b/client/src/app/shared/instance/instance-features-table.component.scss | |||
@@ -3,6 +3,7 @@ | |||
3 | 3 | ||
4 | table { | 4 | table { |
5 | font-size: 14px; | 5 | font-size: 14px; |
6 | color: var(--mainForegroundColor); | ||
6 | 7 | ||
7 | .label { | 8 | .label { |
8 | font-weight: $font-semibold; | 9 | font-weight: $font-semibold; |
@@ -16,4 +17,4 @@ table { | |||
16 | .glyphicon-remove { | 17 | .glyphicon-remove { |
17 | color: $red; | 18 | color: $red; |
18 | } | 19 | } |
19 | } \ No newline at end of file | 20 | } |
diff --git a/client/src/app/shared/user-subscription/remote-subscribe.component.ts b/client/src/app/shared/user-subscription/remote-subscribe.component.ts index ba2a45df1..63e7cd5d9 100644 --- a/client/src/app/shared/user-subscription/remote-subscribe.component.ts +++ b/client/src/app/shared/user-subscription/remote-subscribe.component.ts | |||
@@ -11,7 +11,7 @@ import { | |||
11 | styleUrls: ['./remote-subscribe.component.scss'] | 11 | styleUrls: ['./remote-subscribe.component.scss'] |
12 | }) | 12 | }) |
13 | export class RemoteSubscribeComponent extends FormReactive implements OnInit { | 13 | export class RemoteSubscribeComponent extends FormReactive implements OnInit { |
14 | @Input() account: string | 14 | @Input() uri: string |
15 | @Input() interact = false | 15 | @Input() interact = false |
16 | @Input() showHelp = false | 16 | @Input() showHelp = false |
17 | 17 | ||
@@ -42,19 +42,20 @@ export class RemoteSubscribeComponent extends FormReactive implements OnInit { | |||
42 | fetch(`https://${hostname}/.well-known/webfinger?resource=acct:${username}@${hostname}`) | 42 | fetch(`https://${hostname}/.well-known/webfinger?resource=acct:${username}@${hostname}`) |
43 | .then(response => response.json()) | 43 | .then(response => response.json()) |
44 | .then(data => new Promise((resolve, reject) => { | 44 | .then(data => new Promise((resolve, reject) => { |
45 | console.log(data) | ||
46 | |||
45 | if (data && Array.isArray(data.links)) { | 47 | if (data && Array.isArray(data.links)) { |
46 | const link: { | 48 | const link: { template: string } = data.links.find((link: any) => { |
47 | template: string | 49 | return link && typeof link.template === 'string' && link.rel === 'http://ostatus.org/schema/1.0/subscribe' |
48 | } = data.links.find((link: any) => | 50 | }) |
49 | link && typeof link.template === 'string' && link.rel === 'http://ostatus.org/schema/1.0/subscribe') | ||
50 | 51 | ||
51 | if (link && link.template.includes('{uri}')) { | 52 | if (link && link.template.includes('{uri}')) { |
52 | resolve(link.template.replace('{uri}', `acct:${this.account}`)) | 53 | resolve(link.template.replace('{uri}', encodeURIComponent(this.uri))) |
53 | } | 54 | } |
54 | } | 55 | } |
55 | reject() | 56 | reject() |
56 | })) | 57 | })) |
57 | .then(window.open) | 58 | .then(window.open) |
58 | .catch(() => window.open(`https://${hostname}/authorize_interaction?acct=${this.account}`)) | 59 | .catch(err => console.error(err)) |
59 | } | 60 | } |
60 | } | 61 | } |
diff --git a/client/src/app/shared/user-subscription/subscribe-button.component.html b/client/src/app/shared/user-subscription/subscribe-button.component.html index dbf6a34f0..d32647b42 100644 --- a/client/src/app/shared/user-subscription/subscribe-button.component.html +++ b/client/src/app/shared/user-subscription/subscribe-button.component.html | |||
@@ -41,7 +41,7 @@ | |||
41 | </button> | 41 | </button> |
42 | 42 | ||
43 | <button class="dropdown-item" i18n>Subscribe with a Mastodon account:</button> | 43 | <button class="dropdown-item" i18n>Subscribe with a Mastodon account:</button> |
44 | <my-remote-subscribe showHelp="true" account="{{ uriAccount }}"></my-remote-subscribe> | 44 | <my-remote-subscribe showHelp="true" [uri]="channelUri"></my-remote-subscribe> |
45 | 45 | ||
46 | <div class="dropdown-divider"></div> | 46 | <div class="dropdown-divider"></div> |
47 | 47 | ||
@@ -50,4 +50,4 @@ | |||
50 | 50 | ||
51 | </div> | 51 | </div> |
52 | </div> | 52 | </div> |
53 | </div> \ No newline at end of file | 53 | </div> |
diff --git a/client/src/app/shared/user-subscription/subscribe-button.component.ts b/client/src/app/shared/user-subscription/subscribe-button.component.ts index ef470ee44..25515f6ea 100644 --- a/client/src/app/shared/user-subscription/subscribe-button.component.ts +++ b/client/src/app/shared/user-subscription/subscribe-button.component.ts | |||
@@ -28,19 +28,19 @@ export class SubscribeButtonComponent implements OnInit { | |||
28 | private videoService: VideoService | 28 | private videoService: VideoService |
29 | ) { } | 29 | ) { } |
30 | 30 | ||
31 | get uri () { | 31 | get channelHandle () { |
32 | return this.videoChannel.name + '@' + this.videoChannel.host | 32 | return this.videoChannel.name + '@' + this.videoChannel.host |
33 | } | 33 | } |
34 | 34 | ||
35 | get uriAccount () { | 35 | get channelUri () { |
36 | return this.videoChannel.ownerAccount.name + '@' + this.videoChannel.host | 36 | return this.videoChannel.url |
37 | } | 37 | } |
38 | 38 | ||
39 | ngOnInit () { | 39 | ngOnInit () { |
40 | if (this.isUserLoggedIn()) { | 40 | if (this.isUserLoggedIn()) { |
41 | this.userSubscriptionService.doesSubscriptionExist(this.uri) | 41 | this.userSubscriptionService.doesSubscriptionExist(this.channelHandle) |
42 | .subscribe( | 42 | .subscribe( |
43 | res => this.subscribed = res[this.uri], | 43 | res => this.subscribed = res[this.channelHandle], |
44 | 44 | ||
45 | err => this.notifier.error(err.message) | 45 | err => this.notifier.error(err.message) |
46 | ) | 46 | ) |
@@ -56,7 +56,7 @@ export class SubscribeButtonComponent implements OnInit { | |||
56 | } | 56 | } |
57 | 57 | ||
58 | localSubscribe () { | 58 | localSubscribe () { |
59 | this.userSubscriptionService.addSubscription(this.uri) | 59 | this.userSubscriptionService.addSubscription(this.channelHandle) |
60 | .subscribe( | 60 | .subscribe( |
61 | () => { | 61 | () => { |
62 | this.subscribed = true | 62 | this.subscribed = true |
@@ -78,7 +78,7 @@ export class SubscribeButtonComponent implements OnInit { | |||
78 | } | 78 | } |
79 | 79 | ||
80 | localUnsubscribe () { | 80 | localUnsubscribe () { |
81 | this.userSubscriptionService.deleteSubscription(this.uri) | 81 | this.userSubscriptionService.deleteSubscription(this.channelHandle) |
82 | .subscribe( | 82 | .subscribe( |
83 | () => { | 83 | () => { |
84 | this.subscribed = false | 84 | this.subscribed = false |
diff --git a/client/src/app/shared/video/video-actions-dropdown.component.ts b/client/src/app/shared/video/video-actions-dropdown.component.ts index 0bbc783c1..8d4e33697 100644 --- a/client/src/app/shared/video/video-actions-dropdown.component.ts +++ b/client/src/app/shared/video/video-actions-dropdown.component.ts | |||
@@ -188,19 +188,16 @@ export class VideoActionsDropdownComponent implements OnChanges { | |||
188 | } | 188 | } |
189 | 189 | ||
190 | private buildActions () { | 190 | private buildActions () { |
191 | this.videoActions = [] | 191 | this.videoActions = [ |
192 | 192 | [ | |
193 | if (this.authService.isLoggedIn()) { | ||
194 | this.videoActions.push([ | ||
195 | { | 193 | { |
196 | label: this.i18n('Save to playlist'), | 194 | label: this.i18n('Save to playlist'), |
197 | handler: () => this.playlistDropdown.toggle(), | 195 | handler: () => this.playlistDropdown.toggle(), |
198 | isDisplayed: () => this.displayOptions.playlist, | 196 | isDisplayed: () => this.authService.isLoggedIn() && this.displayOptions.playlist, |
199 | iconName: 'playlist-add' | 197 | iconName: 'playlist-add' |
200 | } | 198 | } |
201 | ]) | 199 | ], |
202 | 200 | [ | |
203 | this.videoActions.push([ | ||
204 | { | 201 | { |
205 | label: this.i18n('Download'), | 202 | label: this.i18n('Download'), |
206 | handler: () => this.showDownloadModal(), | 203 | handler: () => this.showDownloadModal(), |
@@ -211,36 +208,35 @@ export class VideoActionsDropdownComponent implements OnChanges { | |||
211 | label: this.i18n('Update'), | 208 | label: this.i18n('Update'), |
212 | linkBuilder: ({ video }) => [ '/videos/update', video.uuid ], | 209 | linkBuilder: ({ video }) => [ '/videos/update', video.uuid ], |
213 | iconName: 'edit', | 210 | iconName: 'edit', |
214 | isDisplayed: () => this.displayOptions.update && this.isVideoUpdatable() | 211 | isDisplayed: () => this.authService.isLoggedIn() && this.displayOptions.update && this.isVideoUpdatable() |
215 | }, | 212 | }, |
216 | { | 213 | { |
217 | label: this.i18n('Blacklist'), | 214 | label: this.i18n('Blacklist'), |
218 | handler: () => this.showBlacklistModal(), | 215 | handler: () => this.showBlacklistModal(), |
219 | iconName: 'no', | 216 | iconName: 'no', |
220 | isDisplayed: () => this.displayOptions.blacklist && this.isVideoBlacklistable() | 217 | isDisplayed: () => this.authService.isLoggedIn() && this.displayOptions.blacklist && this.isVideoBlacklistable() |
221 | }, | 218 | }, |
222 | { | 219 | { |
223 | label: this.i18n('Unblacklist'), | 220 | label: this.i18n('Unblacklist'), |
224 | handler: () => this.unblacklistVideo(), | 221 | handler: () => this.unblacklistVideo(), |
225 | iconName: 'undo', | 222 | iconName: 'undo', |
226 | isDisplayed: () => this.displayOptions.blacklist && this.isVideoUnblacklistable() | 223 | isDisplayed: () => this.authService.isLoggedIn() && this.displayOptions.blacklist && this.isVideoUnblacklistable() |
227 | }, | 224 | }, |
228 | { | 225 | { |
229 | label: this.i18n('Delete'), | 226 | label: this.i18n('Delete'), |
230 | handler: () => this.removeVideo(), | 227 | handler: () => this.removeVideo(), |
231 | isDisplayed: () => this.displayOptions.delete && this.isVideoRemovable(), | 228 | isDisplayed: () => this.authService.isLoggedIn() && this.displayOptions.delete && this.isVideoRemovable(), |
232 | iconName: 'delete' | 229 | iconName: 'delete' |
233 | } | 230 | } |
234 | ]) | 231 | ], |
235 | 232 | [ | |
236 | this.videoActions.push([ | ||
237 | { | 233 | { |
238 | label: this.i18n('Report'), | 234 | label: this.i18n('Report'), |
239 | handler: () => this.showReportModal(), | 235 | handler: () => this.showReportModal(), |
240 | isDisplayed: () => this.displayOptions.report, | 236 | isDisplayed: () => this.authService.isLoggedIn() && this.displayOptions.report, |
241 | iconName: 'alert' | 237 | iconName: 'alert' |
242 | } | 238 | } |
243 | ]) | 239 | ] |
244 | } | 240 | ] |
245 | } | 241 | } |
246 | } | 242 | } |
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 a2776b73d..cea352bfb 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 | |||
@@ -193,7 +193,7 @@ export class VideoEditComponent implements OnInit, OnDestroy { | |||
193 | } | 193 | } |
194 | 194 | ||
195 | private trackPrivacyChange () { | 195 | private trackPrivacyChange () { |
196 | // We will update the "support" field depending on the channel | 196 | // We will update the schedule input and the wait transcoding checkbox validators |
197 | this.form.controls[ 'privacy' ] | 197 | this.form.controls[ 'privacy' ] |
198 | .valueChanges | 198 | .valueChanges |
199 | .pipe(map(res => parseInt(res.toString(), 10))) | 199 | .pipe(map(res => parseInt(res.toString(), 10))) |
diff --git a/client/src/app/videos/+video-watch/comment/video-comment-add.component.html b/client/src/app/videos/+video-watch/comment/video-comment-add.component.html index d8a7a78c4..916f5d0ff 100644 --- a/client/src/app/videos/+video-watch/comment/video-comment-add.component.html +++ b/client/src/app/videos/+video-watch/comment/video-comment-add.component.html | |||
@@ -41,7 +41,7 @@ | |||
41 | <span i18n> | 41 | <span i18n> |
42 | If you have an account on Mastodon or Pleroma, you can open it directly in their interface: | 42 | If you have an account on Mastodon or Pleroma, you can open it directly in their interface: |
43 | </span> | 43 | </span> |
44 | <my-remote-subscribe [interact]="true" [account]="getUrl()"></my-remote-subscribe> | 44 | <my-remote-subscribe [interact]="true" [uri]="getUri()"></my-remote-subscribe> |
45 | </div> | 45 | </div> |
46 | <div class="modal-footer inputs"> | 46 | <div class="modal-footer inputs"> |
47 | <span i18n class="action-button action-button-cancel" role="button" (click)="hideVisitorModal()"> | 47 | <span i18n class="action-button action-button-cancel" role="button" (click)="hideVisitorModal()"> |
diff --git a/client/src/app/videos/+video-watch/comment/video-comment-add.component.ts b/client/src/app/videos/+video-watch/comment/video-comment-add.component.ts index fd85c28f2..ac1d02d94 100644 --- a/client/src/app/videos/+video-watch/comment/video-comment-add.component.ts +++ b/client/src/app/videos/+video-watch/comment/video-comment-add.component.ts | |||
@@ -8,7 +8,6 @@ import { User } from '../../../shared/users' | |||
8 | import { Video } from '../../../shared/video/video.model' | 8 | import { Video } from '../../../shared/video/video.model' |
9 | import { VideoComment } from './video-comment.model' | 9 | import { VideoComment } from './video-comment.model' |
10 | import { VideoCommentService } from './video-comment.service' | 10 | import { VideoCommentService } from './video-comment.service' |
11 | import { I18n } from '@ngx-translate/i18n-polyfill' | ||
12 | import { FormValidatorService } from '@app/shared/forms/form-validators/form-validator.service' | 11 | import { FormValidatorService } from '@app/shared/forms/form-validators/form-validator.service' |
13 | import { VideoCommentValidatorsService } from '@app/shared/forms/form-validators/video-comment-validators.service' | 12 | import { VideoCommentValidatorsService } from '@app/shared/forms/form-validators/video-comment-validators.service' |
14 | import { NgbModal } from '@ng-bootstrap/ng-bootstrap' | 13 | import { NgbModal } from '@ng-bootstrap/ng-bootstrap' |
@@ -40,8 +39,7 @@ export class VideoCommentAddComponent extends FormReactive implements OnInit { | |||
40 | private videoCommentService: VideoCommentService, | 39 | private videoCommentService: VideoCommentService, |
41 | private authService: AuthService, | 40 | private authService: AuthService, |
42 | private modalService: NgbModal, | 41 | private modalService: NgbModal, |
43 | private router: Router, | 42 | private router: Router |
44 | private i18n: I18n | ||
45 | ) { | 43 | ) { |
46 | super() | 44 | super() |
47 | } | 45 | } |
@@ -124,7 +122,7 @@ export class VideoCommentAddComponent extends FormReactive implements OnInit { | |||
124 | return this.form.value['text'] | 122 | return this.form.value['text'] |
125 | } | 123 | } |
126 | 124 | ||
127 | getUrl () { | 125 | getUri () { |
128 | return window.location.href | 126 | return window.location.href |
129 | } | 127 | } |
130 | 128 | ||