aboutsummaryrefslogtreecommitdiffhomepage
path: root/client/src/app/shared
diff options
context:
space:
mode:
Diffstat (limited to 'client/src/app/shared')
-rw-r--r--client/src/app/shared/buttons/action-dropdown.component.html16
-rw-r--r--client/src/app/shared/buttons/action-dropdown.component.scss1
-rw-r--r--client/src/app/shared/buttons/action-dropdown.component.ts2
-rw-r--r--client/src/app/shared/moderation/user-moderation-dropdown.component.ts18
-rw-r--r--client/src/app/shared/user-subscription/remote-subscribe.component.html2
-rw-r--r--client/src/app/shared/user-subscription/subscribe-button.component.html2
-rw-r--r--client/src/app/shared/user-subscription/subscribe-button.component.scss9
-rw-r--r--client/src/app/shared/video/video-miniature.component.html14
8 files changed, 46 insertions, 18 deletions
diff --git a/client/src/app/shared/buttons/action-dropdown.component.html b/client/src/app/shared/buttons/action-dropdown.component.html
index 99e8b7ec1..54f5bf97c 100644
--- a/client/src/app/shared/buttons/action-dropdown.component.html
+++ b/client/src/app/shared/buttons/action-dropdown.component.html
@@ -15,17 +15,23 @@
15 <ng-container *ngFor="let action of actions"> 15 <ng-container *ngFor="let action of actions">
16 <ng-container *ngIf="action.isDisplayed === undefined || action.isDisplayed(entry) === true"> 16 <ng-container *ngIf="action.isDisplayed === undefined || action.isDisplayed(entry) === true">
17 17
18 <a *ngIf="action.linkBuilder" [ngClass]="{ 'with-icon': !!action.iconName }" class="dropdown-item" [routerLink]="action.linkBuilder(entry)"> 18 <ng-template #templateActionLabel let-action>
19 <my-global-icon *ngIf="action.iconName" [iconName]="action.iconName" [ngClass]="'icon-' + action.iconName"></my-global-icon> 19 <my-global-icon *ngIf="action.iconName" [iconName]="action.iconName" [ngClass]="'icon-' + action.iconName"></my-global-icon>
20 {{ action.label }} 20 <div class="d-flex flex-column">
21 <span i18n>{{ action.label }}</span>
22 <small class="text-muted" *ngIf="action.description">{{ action.description }}</small>
23 </div>
24 </ng-template>
25
26 <a *ngIf="action.linkBuilder" [ngClass]="{ 'with-icon': !!action.iconName }" class="dropdown-item" [routerLink]="action.linkBuilder(entry)" [title]="action.title || ''">
27 <ng-container *ngTemplateOutlet="templateActionLabel; context:{ $implicit: action }"></ng-container>
21 </a> 28 </a>
22 29
23 <span 30 <span
24 *ngIf="!action.linkBuilder" [ngClass]="{ 'with-icon': !!action.iconName }" (click)="action.handler(entry)" 31 *ngIf="!action.linkBuilder" [ngClass]="{ 'with-icon': !!action.iconName }" (click)="action.handler(entry)"
25 class="custom-action dropdown-item" role="button" 32 class="custom-action dropdown-item" role="button" [title]="action.title || ''"
26 > 33 >
27 <my-global-icon *ngIf="action.iconName" [iconName]="action.iconName" [ngClass]="'icon-' + action.iconName"></my-global-icon> 34 <ng-container *ngTemplateOutlet="templateActionLabel; context:{ $implicit: action }"></ng-container>
28 {{ action.label }}
29 </span> 35 </span>
30 36
31 </ng-container> 37 </ng-container>
diff --git a/client/src/app/shared/buttons/action-dropdown.component.scss b/client/src/app/shared/buttons/action-dropdown.component.scss
index e33aa8d24..442c90984 100644
--- a/client/src/app/shared/buttons/action-dropdown.component.scss
+++ b/client/src/app/shared/buttons/action-dropdown.component.scss
@@ -52,6 +52,7 @@
52 52
53.dropdown-menu { 53.dropdown-menu {
54 .dropdown-item { 54 .dropdown-item {
55 display: flex;
55 cursor: pointer; 56 cursor: pointer;
56 color: #000 !important; 57 color: #000 !important;
57 58
diff --git a/client/src/app/shared/buttons/action-dropdown.component.ts b/client/src/app/shared/buttons/action-dropdown.component.ts
index 5330ca220..a8b3ab16c 100644
--- a/client/src/app/shared/buttons/action-dropdown.component.ts
+++ b/client/src/app/shared/buttons/action-dropdown.component.ts
@@ -4,6 +4,8 @@ import { GlobalIconName } from '@app/shared/images/global-icon.component'
4export type DropdownAction<T> = { 4export type DropdownAction<T> = {
5 label?: string 5 label?: string
6 iconName?: GlobalIconName 6 iconName?: GlobalIconName
7 description?: string
8 title?: string
7 handler?: (a: T) => any 9 handler?: (a: T) => any
8 linkBuilder?: (a: T) => (string | number)[] 10 linkBuilder?: (a: T) => (string | number)[]
9 isDisplayed?: (a: T) => boolean 11 isDisplayed?: (a: T) => boolean
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 89f275a04..7ae5f40e3 100644
--- a/client/src/app/shared/moderation/user-moderation-dropdown.component.ts
+++ b/client/src/app/shared/moderation/user-moderation-dropdown.component.ts
@@ -243,20 +243,24 @@ export class UserModerationDropdownComponent implements OnInit, OnChanges {
243 if (this.user && authUser.hasRight(UserRight.MANAGE_USERS) && authUser.canManage(this.user)) { 243 if (this.user && authUser.hasRight(UserRight.MANAGE_USERS) && authUser.canManage(this.user)) {
244 this.userActions.push([ 244 this.userActions.push([
245 { 245 {
246 label: this.i18n('Edit user'), 246 label: this.i18n('Edit'),
247 description: this.i18n('Change quota, role, and more.'),
247 linkBuilder: ({ user }) => this.getRouterUserEditLink(user) 248 linkBuilder: ({ user }) => this.getRouterUserEditLink(user)
248 }, 249 },
249 { 250 {
250 label: this.i18n('Delete user'), 251 label: this.i18n('Delete'),
252 description: this.i18n('Videos will be deleted, comments will be tombstoned.'),
251 handler: ({ user }) => this.removeUser(user) 253 handler: ({ user }) => this.removeUser(user)
252 }, 254 },
253 { 255 {
254 label: this.i18n('Ban user'), 256 label: this.i18n('Ban'),
257 description: this.i18n('Videos will be kept as private, comments will be kept as is.'),
255 handler: ({ user }) => this.openBanUserModal(user), 258 handler: ({ user }) => this.openBanUserModal(user),
256 isDisplayed: ({ user }) => !user.blocked 259 isDisplayed: ({ user }) => !user.blocked
257 }, 260 },
258 { 261 {
259 label: this.i18n('Unban user'), 262 label: this.i18n('Unban user'),
263 description: this.i18n('Allow the user to login and create videos/comments again'),
260 handler: ({ user }) => this.unbanUser(user), 264 handler: ({ user }) => this.unbanUser(user),
261 isDisplayed: ({ user }) => user.blocked 265 isDisplayed: ({ user }) => user.blocked
262 }, 266 },
@@ -274,21 +278,25 @@ export class UserModerationDropdownComponent implements OnInit, OnChanges {
274 this.userActions.push([ 278 this.userActions.push([
275 { 279 {
276 label: this.i18n('Mute this account'), 280 label: this.i18n('Mute this account'),
281 description: this.i18n('Hide any content from that user for you.'),
277 isDisplayed: ({ account }) => account.mutedByUser === false, 282 isDisplayed: ({ account }) => account.mutedByUser === false,
278 handler: ({ account }) => this.blockAccountByUser(account) 283 handler: ({ account }) => this.blockAccountByUser(account)
279 }, 284 },
280 { 285 {
281 label: this.i18n('Unmute this account'), 286 label: this.i18n('Unmute this account'),
287 description: this.i18n('Show back content from that user for you.'),
282 isDisplayed: ({ account }) => account.mutedByUser === true, 288 isDisplayed: ({ account }) => account.mutedByUser === true,
283 handler: ({ account }) => this.unblockAccountByUser(account) 289 handler: ({ account }) => this.unblockAccountByUser(account)
284 }, 290 },
285 { 291 {
286 label: this.i18n('Mute the instance'), 292 label: this.i18n('Mute the instance'),
293 description: this.i18n('Hide any content from that instance for you.'),
287 isDisplayed: ({ account }) => !account.userId && account.mutedServerByInstance === false, 294 isDisplayed: ({ account }) => !account.userId && account.mutedServerByInstance === false,
288 handler: ({ account }) => this.blockServerByUser(account.host) 295 handler: ({ account }) => this.blockServerByUser(account.host)
289 }, 296 },
290 { 297 {
291 label: this.i18n('Unmute the instance'), 298 label: this.i18n('Unmute the instance'),
299 description: this.i18n('Show back content from that instance for you.'),
292 isDisplayed: ({ account }) => !account.userId && account.mutedServerByInstance === true, 300 isDisplayed: ({ account }) => !account.userId && account.mutedServerByInstance === true,
293 handler: ({ account }) => this.unblockServerByUser(account.host) 301 handler: ({ account }) => this.unblockServerByUser(account.host)
294 } 302 }
@@ -301,11 +309,13 @@ export class UserModerationDropdownComponent implements OnInit, OnChanges {
301 instanceActions = instanceActions.concat([ 309 instanceActions = instanceActions.concat([
302 { 310 {
303 label: this.i18n('Mute this account by your instance'), 311 label: this.i18n('Mute this account by your instance'),
312 description: this.i18n('Hide any content from that user for you, your instance and its users.'),
304 isDisplayed: ({ account }) => account.mutedByInstance === false, 313 isDisplayed: ({ account }) => account.mutedByInstance === false,
305 handler: ({ account }) => this.blockAccountByInstance(account) 314 handler: ({ account }) => this.blockAccountByInstance(account)
306 }, 315 },
307 { 316 {
308 label: this.i18n('Unmute this account by your instance'), 317 label: this.i18n('Unmute this account by your instance'),
318 description: this.i18n('Show back content from that user for you, your instance and its users.'),
309 isDisplayed: ({ account }) => account.mutedByInstance === true, 319 isDisplayed: ({ account }) => account.mutedByInstance === true,
310 handler: ({ account }) => this.unblockAccountByInstance(account) 320 handler: ({ account }) => this.unblockAccountByInstance(account)
311 } 321 }
@@ -317,11 +327,13 @@ export class UserModerationDropdownComponent implements OnInit, OnChanges {
317 instanceActions = instanceActions.concat([ 327 instanceActions = instanceActions.concat([
318 { 328 {
319 label: this.i18n('Mute the instance by your instance'), 329 label: this.i18n('Mute the instance by your instance'),
330 description: this.i18n('Hide any content from that instance for you, your instance and its users.'),
320 isDisplayed: ({ account }) => !account.userId && account.mutedServerByInstance === false, 331 isDisplayed: ({ account }) => !account.userId && account.mutedServerByInstance === false,
321 handler: ({ account }) => this.blockServerByInstance(account.host) 332 handler: ({ account }) => this.blockServerByInstance(account.host)
322 }, 333 },
323 { 334 {
324 label: this.i18n('Unmute the instance by your instance'), 335 label: this.i18n('Unmute the instance by your instance'),
336 description: this.i18n('Show back content from that instance for you, your instance and its users.'),
325 isDisplayed: ({ account }) => !account.userId && account.mutedServerByInstance === true, 337 isDisplayed: ({ account }) => !account.userId && account.mutedServerByInstance === true,
326 handler: ({ account }) => this.unblockServerByInstance(account.host) 338 handler: ({ account }) => this.unblockServerByInstance(account.host)
327 } 339 }
diff --git a/client/src/app/shared/user-subscription/remote-subscribe.component.html b/client/src/app/shared/user-subscription/remote-subscribe.component.html
index 59ee1cb04..acfec0a8e 100644
--- a/client/src/app/shared/user-subscription/remote-subscribe.component.html
+++ b/client/src/app/shared/user-subscription/remote-subscribe.component.html
@@ -1,5 +1,5 @@
1<form novalidate [formGroup]="form" (ngSubmit)="formValidated()"> 1<form novalidate [formGroup]="form" (ngSubmit)="formValidated()">
2 <div class="form-group"> 2 <div class="form-group mb-2">
3 <input type="email" 3 <input type="email"
4 formControlName="text" 4 formControlName="text"
5 class="form-control" 5 class="form-control"
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 2a4df29f7..f08c88f3c 100644
--- a/client/src/app/shared/user-subscription/subscribe-button.component.html
+++ b/client/src/app/shared/user-subscription/subscribe-button.component.html
@@ -54,7 +54,7 @@
54 <span *ngIf="isUserLoggedIn()" i18n>Subscribe with your local account</span> 54 <span *ngIf="isUserLoggedIn()" i18n>Subscribe with your local account</span>
55 </button> 55 </button>
56 56
57 <button class="dropdown-item" i18n>Subscribe with a Mastodon account:</button> 57 <button class="dropdown-item dropdown-item-neutral" i18n>Subscribe with a Mastodon account:</button>
58 <my-remote-subscribe showHelp="true" [uri]="uri"></my-remote-subscribe> 58 <my-remote-subscribe showHelp="true" [uri]="uri"></my-remote-subscribe>
59 59
60 <div class="dropdown-divider"></div> 60 <div class="dropdown-divider"></div>
diff --git a/client/src/app/shared/user-subscription/subscribe-button.component.scss b/client/src/app/shared/user-subscription/subscribe-button.component.scss
index d5b3796a1..114a12f06 100644
--- a/client/src/app/shared/user-subscription/subscribe-button.component.scss
+++ b/client/src/app/shared/user-subscription/subscribe-button.component.scss
@@ -69,6 +69,15 @@
69 button { 69 button {
70 cursor: pointer; 70 cursor: pointer;
71 } 71 }
72
73 .dropdown-item-neutral {
74 cursor: default;
75
76 &:hover,
77 &:focus {
78 background-color: inherit;
79 }
80 }
72 } 81 }
73 82
74 .dropdown-header { 83 .dropdown-header {
diff --git a/client/src/app/shared/video/video-miniature.component.html b/client/src/app/shared/video/video-miniature.component.html
index ce977b3e6..46c49c15b 100644
--- a/client/src/app/shared/video/video-miniature.component.html
+++ b/client/src/app/shared/video/video-miniature.component.html
@@ -10,14 +10,7 @@
10 tabindex="-1" 10 tabindex="-1"
11 class="video-miniature-name" 11 class="video-miniature-name"
12 [routerLink]="[ '/videos/watch', video.uuid ]" [attr.title]="video.name" [ngClass]="{ 'blur-filter': isVideoBlur }" 12 [routerLink]="[ '/videos/watch', video.uuid ]" [attr.title]="video.name" [ngClass]="{ 'blur-filter': isVideoBlur }"
13 > 13 >{{ video.name }}</a>
14 <ng-container *ngIf="displayOptions.privacyLabel">
15 <span *ngIf="isUnlistedVideo()" class="badge badge-warning" i18n>Unlisted</span>
16 <span *ngIf="isPrivateVideo()" class="badge badge-danger" i18n>Private</span>
17 </ng-container>
18
19 {{ video.name }}
20 </a>
21 14
22 <span class="video-miniature-created-at-views"> 15 <span class="video-miniature-created-at-views">
23 <my-date-toggle *ngIf="displayOptions.date" [date]="video.publishedAt"></my-date-toggle> 16 <my-date-toggle *ngIf="displayOptions.date" [date]="video.publishedAt"></my-date-toggle>
@@ -26,6 +19,11 @@
26 <ng-container *ngIf="displayOptions.date && displayOptions.views"> • </ng-container> 19 <ng-container *ngIf="displayOptions.date && displayOptions.views"> • </ng-container>
27 <ng-container i18n *ngIf="displayOptions.views">{video.views, plural, =1 {1 view} other {{{ video.views | myNumberFormatter }} views}}</ng-container> 20 <ng-container i18n *ngIf="displayOptions.views">{video.views, plural, =1 {1 view} other {{{ video.views | myNumberFormatter }} views}}</ng-container>
28 </span> 21 </span>
22
23 <ng-container *ngIf="displayOptions.privacyLabel">
24 <span *ngIf="isUnlistedVideo()" class="badge badge-warning ml-1" i18n>Unlisted</span>
25 <span *ngIf="isPrivateVideo()" class="badge badge-danger ml-1" i18n>Private</span>
26 </ng-container>
29 </span> 27 </span>
30 28
31 <a tabindex="-1" *ngIf="displayOptions.by && displayOwnerAccount()" class="video-miniature-account" [routerLink]="[ '/accounts', video.byAccount ]"> 29 <a tabindex="-1" *ngIf="displayOptions.by && displayOwnerAccount()" class="video-miniature-account" [routerLink]="[ '/accounts', video.byAccount ]">