diff options
Diffstat (limited to 'client/src/app')
4 files changed, 36 insertions, 14 deletions
diff --git a/client/src/app/shared/buttons/action-dropdown.component.html b/client/src/app/shared/buttons/action-dropdown.component.html index 48230d6d8..90651f217 100644 --- a/client/src/app/shared/buttons/action-dropdown.component.html +++ b/client/src/app/shared/buttons/action-dropdown.component.html | |||
@@ -8,14 +8,20 @@ | |||
8 | </div> | 8 | </div> |
9 | 9 | ||
10 | <div ngbDropdownMenu class="dropdown-menu"> | 10 | <div ngbDropdownMenu class="dropdown-menu"> |
11 | <ng-container *ngFor="let action of actions"> | 11 | <ng-container *ngFor="let actions of getActions()"> |
12 | <ng-container *ngIf="action.isDisplayed === undefined || action.isDisplayed(entry) === true"> | ||
13 | <a *ngIf="action.linkBuilder" class="dropdown-item" [routerLink]="action.linkBuilder(entry)">{{ action.label }}</a> | ||
14 | 12 | ||
15 | <span *ngIf="!action.linkBuilder" class="custom-action dropdown-item" (click)="action.handler(entry)" role="button"> | 13 | <ng-container *ngFor="let action of actions"> |
16 | {{ action.label }} | 14 | <ng-container *ngIf="action.isDisplayed === undefined || action.isDisplayed(entry) === true"> |
17 | </span> | 15 | <a *ngIf="action.linkBuilder" class="dropdown-item" [routerLink]="action.linkBuilder(entry)">{{ action.label }}</a> |
16 | |||
17 | <span *ngIf="!action.linkBuilder" class="custom-action dropdown-item" (click)="action.handler(entry)" role="button"> | ||
18 | {{ action.label }} | ||
19 | </span> | ||
20 | </ng-container> | ||
18 | </ng-container> | 21 | </ng-container> |
22 | |||
23 | <div class="dropdown-divider"></div> | ||
24 | |||
19 | </ng-container> | 25 | </ng-container> |
20 | </div> | 26 | </div> |
21 | </div> \ No newline at end of file | 27 | </div> |
diff --git a/client/src/app/shared/buttons/action-dropdown.component.scss b/client/src/app/shared/buttons/action-dropdown.component.scss index 92c4d1d2c..a4fcceeee 100644 --- a/client/src/app/shared/buttons/action-dropdown.component.scss +++ b/client/src/app/shared/buttons/action-dropdown.component.scss | |||
@@ -1,6 +1,10 @@ | |||
1 | @import '_variables'; | 1 | @import '_variables'; |
2 | @import '_mixins'; | 2 | @import '_mixins'; |
3 | 3 | ||
4 | .dropdown-divider:last-child { | ||
5 | display: none; | ||
6 | } | ||
7 | |||
4 | .action-button { | 8 | .action-button { |
5 | @include peertube-button; | 9 | @include peertube-button; |
6 | 10 | ||
@@ -52,4 +56,4 @@ | |||
52 | width: 100%; | 56 | width: 100%; |
53 | } | 57 | } |
54 | } | 58 | } |
55 | } \ No newline at end of file | 59 | } |
diff --git a/client/src/app/shared/buttons/action-dropdown.component.ts b/client/src/app/shared/buttons/action-dropdown.component.ts index d8026ef41..275e2b51e 100644 --- a/client/src/app/shared/buttons/action-dropdown.component.ts +++ b/client/src/app/shared/buttons/action-dropdown.component.ts | |||
@@ -14,10 +14,16 @@ export type DropdownAction<T> = { | |||
14 | }) | 14 | }) |
15 | 15 | ||
16 | export class ActionDropdownComponent<T> { | 16 | export class ActionDropdownComponent<T> { |
17 | @Input() actions: DropdownAction<T>[] = [] | 17 | @Input() actions: DropdownAction<T>[] | DropdownAction<T>[][] = [] |
18 | @Input() entry: T | 18 | @Input() entry: T |
19 | @Input() placement = 'bottom-left' | 19 | @Input() placement = 'bottom-left' |
20 | @Input() buttonSize: 'normal' | 'small' = 'normal' | 20 | @Input() buttonSize: 'normal' | 'small' = 'normal' |
21 | @Input() label: string | 21 | @Input() label: string |
22 | @Input() theme: 'orange' | 'grey' = 'grey' | 22 | @Input() theme: 'orange' | 'grey' = 'grey' |
23 | |||
24 | getActions () { | ||
25 | if (this.actions.length !== 0 && Array.isArray(this.actions[0])) return this.actions | ||
26 | |||
27 | return [ this.actions ] | ||
28 | } | ||
23 | } | 29 | } |
diff --git a/client/src/app/shared/moderation/user-moderation-dropdown.component.ts b/client/src/app/shared/moderation/user-moderation-dropdown.component.ts index 460750740..47967f8e5 100644 --- a/client/src/app/shared/moderation/user-moderation-dropdown.component.ts +++ b/client/src/app/shared/moderation/user-moderation-dropdown.component.ts | |||
@@ -26,7 +26,7 @@ export class UserModerationDropdownComponent implements OnChanges { | |||
26 | @Output() userChanged = new EventEmitter() | 26 | @Output() userChanged = new EventEmitter() |
27 | @Output() userDeleted = new EventEmitter() | 27 | @Output() userDeleted = new EventEmitter() |
28 | 28 | ||
29 | userActions: DropdownAction<{ user: User, account: Account }>[] = [] | 29 | userActions: DropdownAction<{ user: User, account: Account }>[][] = [] |
30 | 30 | ||
31 | constructor ( | 31 | constructor ( |
32 | private authService: AuthService, | 32 | private authService: AuthService, |
@@ -264,7 +264,7 @@ export class UserModerationDropdownComponent implements OnChanges { | |||
264 | if (this.user && authUser.id === this.user.id) return | 264 | if (this.user && authUser.id === this.user.id) return |
265 | 265 | ||
266 | if (this.user && authUser.hasRight(UserRight.MANAGE_USERS)) { | 266 | if (this.user && authUser.hasRight(UserRight.MANAGE_USERS)) { |
267 | this.userActions = this.userActions.concat([ | 267 | this.userActions.push([ |
268 | { | 268 | { |
269 | label: this.i18n('Edit'), | 269 | label: this.i18n('Edit'), |
270 | linkBuilder: ({ user }) => this.getRouterUserEditLink(user) | 270 | linkBuilder: ({ user }) => this.getRouterUserEditLink(user) |
@@ -294,7 +294,7 @@ export class UserModerationDropdownComponent implements OnChanges { | |||
294 | // Actions on accounts/servers | 294 | // Actions on accounts/servers |
295 | if (this.account) { | 295 | if (this.account) { |
296 | // User actions | 296 | // User actions |
297 | this.userActions = this.userActions.concat([ | 297 | this.userActions.push([ |
298 | { | 298 | { |
299 | label: this.i18n('Mute this account'), | 299 | label: this.i18n('Mute this account'), |
300 | isDisplayed: ({ account }: { account: Account }) => account.mutedByUser === false, | 300 | isDisplayed: ({ account }: { account: Account }) => account.mutedByUser === false, |
@@ -317,9 +317,11 @@ export class UserModerationDropdownComponent implements OnChanges { | |||
317 | } | 317 | } |
318 | ]) | 318 | ]) |
319 | 319 | ||
320 | let instanceActions: DropdownAction<{ user: User, account: Account }>[] = [] | ||
321 | |||
320 | // Instance actions | 322 | // Instance actions |
321 | if (authUser.hasRight(UserRight.MANAGE_ACCOUNTS_BLOCKLIST)) { | 323 | if (authUser.hasRight(UserRight.MANAGE_ACCOUNTS_BLOCKLIST)) { |
322 | this.userActions = this.userActions.concat([ | 324 | instanceActions = instanceActions.concat([ |
323 | { | 325 | { |
324 | label: this.i18n('Mute this account by your instance'), | 326 | label: this.i18n('Mute this account by your instance'), |
325 | isDisplayed: ({ account }: { account: Account }) => account.mutedByInstance === false, | 327 | isDisplayed: ({ account }: { account: Account }) => account.mutedByInstance === false, |
@@ -335,7 +337,7 @@ export class UserModerationDropdownComponent implements OnChanges { | |||
335 | 337 | ||
336 | // Instance actions | 338 | // Instance actions |
337 | if (authUser.hasRight(UserRight.MANAGE_SERVERS_BLOCKLIST)) { | 339 | if (authUser.hasRight(UserRight.MANAGE_SERVERS_BLOCKLIST)) { |
338 | this.userActions = this.userActions.concat([ | 340 | instanceActions = instanceActions.concat([ |
339 | { | 341 | { |
340 | label: this.i18n('Mute the instance by your instance'), | 342 | label: this.i18n('Mute the instance by your instance'), |
341 | isDisplayed: ({ account }: { account: Account }) => !account.userId && account.mutedServerByInstance === false, | 343 | isDisplayed: ({ account }: { account: Account }) => !account.userId && account.mutedServerByInstance === false, |
@@ -348,6 +350,10 @@ export class UserModerationDropdownComponent implements OnChanges { | |||
348 | } | 350 | } |
349 | ]) | 351 | ]) |
350 | } | 352 | } |
353 | |||
354 | if (instanceActions.length !== 0) { | ||
355 | this.userActions.push(instanceActions) | ||
356 | } | ||
351 | } | 357 | } |
352 | } | 358 | } |
353 | } | 359 | } |