diff options
Diffstat (limited to 'client/src/app/shared/buttons')
3 files changed, 55 insertions, 16 deletions
diff --git a/client/src/app/shared/buttons/action-dropdown.component.html b/client/src/app/shared/buttons/action-dropdown.component.html index 6999474d6..cc244dc76 100644 --- a/client/src/app/shared/buttons/action-dropdown.component.html +++ b/client/src/app/shared/buttons/action-dropdown.component.html | |||
@@ -1,9 +1,11 @@ | |||
1 | <div class="dropdown-root" ngbDropdown [placement]="placement"> | 1 | <div class="dropdown-root" ngbDropdown [placement]="placement"> |
2 | <div | 2 | <div |
3 | class="action-button" [ngClass]="{ small: buttonSize === 'small', grey: theme === 'grey', orange: theme === 'orange' }" | 3 | class="action-button" [ngClass]="{ small: buttonSize === 'small', grey: theme === 'grey', orange: theme === 'orange', 'button-styled': buttonStyled }" |
4 | ngbDropdownToggle role="button" | 4 | ngbDropdownToggle role="button" |
5 | > | 5 | > |
6 | <my-global-icon *ngIf="!label" class="more-icon" iconName="more-horizontal"></my-global-icon> | 6 | <my-global-icon *ngIf="!label && buttonDirection === 'horizontal'" class="more-icon" iconName="more-horizontal"></my-global-icon> |
7 | <my-global-icon *ngIf="!label && buttonDirection === 'vertical'" class="more-icon" iconName="more-vertical"></my-global-icon> | ||
8 | |||
7 | <span *ngIf="label" class="dropdown-toggle">{{ label }}</span> | 9 | <span *ngIf="label" class="dropdown-toggle">{{ label }}</span> |
8 | </div> | 10 | </div> |
9 | 11 | ||
@@ -12,15 +14,24 @@ | |||
12 | 14 | ||
13 | <ng-container *ngFor="let action of actions"> | 15 | <ng-container *ngFor="let action of actions"> |
14 | <ng-container *ngIf="action.isDisplayed === undefined || action.isDisplayed(entry) === true"> | 16 | <ng-container *ngIf="action.isDisplayed === undefined || action.isDisplayed(entry) === true"> |
15 | <a *ngIf="action.linkBuilder" class="dropdown-item" [routerLink]="action.linkBuilder(entry)">{{ action.label }}</a> | ||
16 | 17 | ||
17 | <span *ngIf="!action.linkBuilder" class="custom-action dropdown-item" (click)="action.handler(entry)" role="button"> | 18 | <a *ngIf="action.linkBuilder" [ngClass]="{ 'with-icon': !!action.iconName }" class="dropdown-item" [routerLink]="action.linkBuilder(entry)"> |
19 | <my-global-icon *ngIf="action.iconName" [iconName]="action.iconName" [ngClass]="'icon-' + action.iconName"></my-global-icon> | ||
20 | {{ action.label }} | ||
21 | </a> | ||
22 | |||
23 | <span | ||
24 | *ngIf="!action.linkBuilder" [ngClass]="{ 'with-icon': !!action.iconName }" (click)="action.handler(entry)" | ||
25 | class="custom-action dropdown-item" role="button" | ||
26 | > | ||
27 | <my-global-icon *ngIf="action.iconName" [iconName]="action.iconName" [ngClass]="'icon-' + action.iconName"></my-global-icon> | ||
18 | {{ action.label }} | 28 | {{ action.label }} |
19 | </span> | 29 | </span> |
30 | |||
20 | </ng-container> | 31 | </ng-container> |
21 | </ng-container> | 32 | </ng-container> |
22 | 33 | ||
23 | <div class="dropdown-divider"></div> | 34 | <div *ngIf="areActionsDisplayed(actions, entry)" class="dropdown-divider"></div> |
24 | 35 | ||
25 | </ng-container> | 36 | </ng-container> |
26 | </div> | 37 | </div> |
diff --git a/client/src/app/shared/buttons/action-dropdown.component.scss b/client/src/app/shared/buttons/action-dropdown.component.scss index 985b2ca88..5073190b0 100644 --- a/client/src/app/shared/buttons/action-dropdown.component.scss +++ b/client/src/app/shared/buttons/action-dropdown.component.scss | |||
@@ -8,12 +8,19 @@ | |||
8 | .action-button { | 8 | .action-button { |
9 | @include peertube-button; | 9 | @include peertube-button; |
10 | 10 | ||
11 | &.grey { | 11 | &.button-styled { |
12 | @include grey-button; | 12 | |
13 | } | 13 | &.grey { |
14 | @include grey-button; | ||
15 | } | ||
16 | |||
17 | &.orange { | ||
18 | @include orange-button; | ||
19 | } | ||
14 | 20 | ||
15 | &.orange { | 21 | &:hover, &:active, &:focus { |
16 | @include orange-button; | 22 | background-color: $grey-background-color; |
23 | } | ||
17 | } | 24 | } |
18 | 25 | ||
19 | display: inline-block; | 26 | display: inline-block; |
@@ -23,10 +30,6 @@ | |||
23 | display: none; | 30 | display: none; |
24 | } | 31 | } |
25 | 32 | ||
26 | &:hover, &:active, &:focus { | ||
27 | background-color: $grey-background-color; | ||
28 | } | ||
29 | |||
30 | .more-icon { | 33 | .more-icon { |
31 | width: 21px; | 34 | width: 21px; |
32 | } | 35 | } |
@@ -48,6 +51,10 @@ | |||
48 | cursor: pointer; | 51 | cursor: pointer; |
49 | color: #000 !important; | 52 | color: #000 !important; |
50 | 53 | ||
54 | &.with-icon { | ||
55 | @include dropdown-with-icon-item; | ||
56 | } | ||
57 | |||
51 | a, span { | 58 | a, span { |
52 | display: block; | 59 | display: block; |
53 | width: 100%; | 60 | width: 100%; |
diff --git a/client/src/app/shared/buttons/action-dropdown.component.ts b/client/src/app/shared/buttons/action-dropdown.component.ts index 275e2b51e..f5345831b 100644 --- a/client/src/app/shared/buttons/action-dropdown.component.ts +++ b/client/src/app/shared/buttons/action-dropdown.component.ts | |||
@@ -1,12 +1,18 @@ | |||
1 | import { Component, Input } from '@angular/core' | 1 | import { Component, Input } from '@angular/core' |
2 | import { GlobalIconName } from '@app/shared/images/global-icon.component' | ||
2 | 3 | ||
3 | export type DropdownAction<T> = { | 4 | export type DropdownAction<T> = { |
4 | label?: string | 5 | label?: string |
6 | iconName?: GlobalIconName | ||
5 | handler?: (a: T) => any | 7 | handler?: (a: T) => any |
6 | linkBuilder?: (a: T) => (string | number)[] | 8 | linkBuilder?: (a: T) => (string | number)[] |
7 | isDisplayed?: (a: T) => boolean | 9 | isDisplayed?: (a: T) => boolean |
8 | } | 10 | } |
9 | 11 | ||
12 | export type DropdownButtonSize = 'normal' | 'small' | ||
13 | export type DropdownTheme = 'orange' | 'grey' | ||
14 | export type DropdownDirection = 'horizontal' | 'vertical' | ||
15 | |||
10 | @Component({ | 16 | @Component({ |
11 | selector: 'my-action-dropdown', | 17 | selector: 'my-action-dropdown', |
12 | styleUrls: [ './action-dropdown.component.scss' ], | 18 | styleUrls: [ './action-dropdown.component.scss' ], |
@@ -16,14 +22,29 @@ export type DropdownAction<T> = { | |||
16 | export class ActionDropdownComponent<T> { | 22 | export class ActionDropdownComponent<T> { |
17 | @Input() actions: DropdownAction<T>[] | DropdownAction<T>[][] = [] | 23 | @Input() actions: DropdownAction<T>[] | DropdownAction<T>[][] = [] |
18 | @Input() entry: T | 24 | @Input() entry: T |
25 | |||
19 | @Input() placement = 'bottom-left' | 26 | @Input() placement = 'bottom-left' |
20 | @Input() buttonSize: 'normal' | 'small' = 'normal' | 27 | |
28 | @Input() buttonSize: DropdownButtonSize = 'normal' | ||
29 | @Input() buttonDirection: DropdownDirection = 'horizontal' | ||
30 | @Input() buttonStyled = true | ||
31 | |||
21 | @Input() label: string | 32 | @Input() label: string |
22 | @Input() theme: 'orange' | 'grey' = 'grey' | 33 | @Input() theme: DropdownTheme = 'grey' |
23 | 34 | ||
24 | getActions () { | 35 | getActions () { |
25 | if (this.actions.length !== 0 && Array.isArray(this.actions[0])) return this.actions | 36 | if (this.actions.length !== 0 && Array.isArray(this.actions[0])) return this.actions |
26 | 37 | ||
27 | return [ this.actions ] | 38 | return [ this.actions ] |
28 | } | 39 | } |
40 | |||
41 | areActionsDisplayed (actions: DropdownAction<T>[], entry: T) { | ||
42 | return actions.some(a => a.isDisplayed === undefined || a.isDisplayed(entry)) | ||
43 | } | ||
44 | |||
45 | handleClick (event: Event, action: DropdownAction<T>) { | ||
46 | event.preventDefault() | ||
47 | |||
48 | // action.handler(entry) | ||
49 | } | ||
29 | } | 50 | } |