aboutsummaryrefslogtreecommitdiffhomepage
path: root/client/src/app
diff options
context:
space:
mode:
authorRigel Kent <sendmemail@rigelk.eu>2020-01-15 19:25:51 +0100
committerChocobozzz <chocobozzz@cpy.re>2020-01-21 11:59:41 +0100
commit9b82d49da868536701d80ef1071df0e7cd301b7a (patch)
treed34997edf0157d390f44d367f6fd795e0d681760 /client/src/app
parentc78d3db71baa397971a83b110c0159169646eae4 (diff)
downloadPeerTube-9b82d49da868536701d80ef1071df0e7cd301b7a.tar.gz
PeerTube-9b82d49da868536701d80ef1071df0e7cd301b7a.tar.zst
PeerTube-9b82d49da868536701d80ef1071df0e7cd301b7a.zip
Add action dropdown descriptions
Diffstat (limited to 'client/src/app')
-rw-r--r--client/src/app/+accounts/accounts.component.html2
-rw-r--r--client/src/app/+admin/config/edit-custom-config/edit-custom-config.component.html12
-rw-r--r--client/src/app/+admin/users/user-list/user-list.component.html4
-rw-r--r--client/src/app/+admin/users/user-list/user-list.component.ts52
-rw-r--r--client/src/app/+my-account/my-account-history/my-account-history.component.html2
-rw-r--r--client/src/app/app.component.ts2
-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
14 files changed, 86 insertions, 52 deletions
diff --git a/client/src/app/+accounts/accounts.component.html b/client/src/app/+accounts/accounts.component.html
index 367258a06..9596d34af 100644
--- a/client/src/app/+accounts/accounts.component.html
+++ b/client/src/app/+accounts/accounts.component.html
@@ -23,7 +23,7 @@
23 <span *ngIf="account.mutedServerByInstance" class="badge badge-danger" i18n>Instance muted by your instance</span> 23 <span *ngIf="account.mutedServerByInstance" class="badge badge-danger" i18n>Instance muted by your instance</span>
24 24
25 <my-user-moderation-dropdown 25 <my-user-moderation-dropdown
26 buttonSize="small" [account]="account" [user]="user" placement="bottom-right auto" 26 buttonSize="small" [account]="account" [user]="user" placement="bottom-left auto"
27 (userChanged)="onUserChanged()" (userDeleted)="onUserDeleted()" 27 (userChanged)="onUserChanged()" (userDeleted)="onUserDeleted()"
28 ></my-user-moderation-dropdown> 28 ></my-user-moderation-dropdown>
29 </div> 29 </div>
diff --git a/client/src/app/+admin/config/edit-custom-config/edit-custom-config.component.html b/client/src/app/+admin/config/edit-custom-config/edit-custom-config.component.html
index e5340234b..915d60090 100644
--- a/client/src/app/+admin/config/edit-custom-config/edit-custom-config.component.html
+++ b/client/src/app/+admin/config/edit-custom-config/edit-custom-config.component.html
@@ -118,7 +118,7 @@
118 118
119 <div class="form-group"> 119 <div class="form-group">
120 <label i18n for="instanceModerationInformation">Moderation information</label><my-help helpType="markdownText"></my-help> 120 <label i18n for="instanceModerationInformation">Moderation information</label><my-help helpType="markdownText"></my-help>
121 <div class="label-small-info">Who moderates the instance? What is the policy regarding NSFW videos? Political videos? etc</div> 121 <div i18n class="label-small-info">Who moderates the instance? What is the policy regarding NSFW videos? Political videos? etc</div>
122 122
123 <my-markdown-textarea 123 <my-markdown-textarea
124 name="instanceModerationInformation" formControlName="moderationInformation" textareaWidth="500px" [previewColumn]="true" 124 name="instanceModerationInformation" formControlName="moderationInformation" textareaWidth="500px" [previewColumn]="true"
@@ -131,7 +131,7 @@
131 131
132 <div class="form-group"> 132 <div class="form-group">
133 <label i18n for="instanceAdministrator">Who is behind the instance?</label> 133 <label i18n for="instanceAdministrator">Who is behind the instance?</label>
134 <div class="label-small-info">A single person? A non-profit? A company?</div> 134 <div i18n class="label-small-info">A single person? A non-profit? A company?</div>
135 135
136 <my-markdown-textarea 136 <my-markdown-textarea
137 name="instanceAdministrator" formControlName="administrator" textareaWidth="500px" textareaHeight="75px" [previewColumn]="true" 137 name="instanceAdministrator" formControlName="administrator" textareaWidth="500px" textareaHeight="75px" [previewColumn]="true"
@@ -143,7 +143,7 @@
143 143
144 <div class="form-group"> 144 <div class="form-group">
145 <label i18n for="instanceCreationReason">Why did you create this instance?</label> 145 <label i18n for="instanceCreationReason">Why did you create this instance?</label>
146 <div class="label-small-info">To share your personal videos? To open registrations and allow people to upload what they want?</div> 146 <div i18n class="label-small-info">To share your personal videos? To open registrations and allow people to upload what they want?</div>
147 147
148 <textarea 148 <textarea
149 id="instanceCreationReason" formControlName="creationReason" class="small" 149 id="instanceCreationReason" formControlName="creationReason" class="small"
@@ -154,7 +154,7 @@
154 154
155 <div class="form-group"> 155 <div class="form-group">
156 <label i18n for="instanceMaintenanceLifetime">How long do you plan to maintain this instance?</label> 156 <label i18n for="instanceMaintenanceLifetime">How long do you plan to maintain this instance?</label>
157 <div class="label-small-info">It's important to know for users who want to register on your instance</div> 157 <div i18n class="label-small-info">It's important to know for users who want to register on your instance</div>
158 158
159 <textarea 159 <textarea
160 id="instanceMaintenanceLifetime" formControlName="maintenanceLifetime" class="small" 160 id="instanceMaintenanceLifetime" formControlName="maintenanceLifetime" class="small"
@@ -165,7 +165,7 @@
165 165
166 <div class="form-group"> 166 <div class="form-group">
167 <label i18n for="instanceBusinessModel">How will you finance the PeerTube server?</label> 167 <label i18n for="instanceBusinessModel">How will you finance the PeerTube server?</label>
168 <div class="label-small-info">With your own funds? With users donations? Advertising?</div> 168 <div i18n class="label-small-info">With your own funds? With users donations? Advertising?</div>
169 169
170 <textarea 170 <textarea
171 id="instanceBusinessModel" formControlName="businessModel" class="small" 171 id="instanceBusinessModel" formControlName="businessModel" class="small"
@@ -178,7 +178,7 @@
178 178
179 <div class="form-group"> 179 <div class="form-group">
180 <label i18n for="instanceHardwareInformation">What server/hardware does the instance run on?</label> 180 <label i18n for="instanceHardwareInformation">What server/hardware does the instance run on?</label>
181 <div class="label-small-info">2vCore 2GB RAM/or directly the link to the server you rent etc</div> 181 <div i18n class="label-small-info">2vCore 2GB RAM/or directly the link to the server you rent etc</div>
182 182
183 <my-markdown-textarea 183 <my-markdown-textarea
184 name="instanceHardwareInformation" formControlName="hardwareInformation" textareaWidth="500px" textareaHeight="75px" [previewColumn]="true" 184 name="instanceHardwareInformation" formControlName="hardwareInformation" textareaWidth="500px" textareaHeight="75px" [previewColumn]="true"
diff --git a/client/src/app/+admin/users/user-list/user-list.component.html b/client/src/app/+admin/users/user-list/user-list.component.html
index 885335313..ca05bac19 100644
--- a/client/src/app/+admin/users/user-list/user-list.component.html
+++ b/client/src/app/+admin/users/user-list/user-list.component.html
@@ -66,7 +66,7 @@
66 </a> 66 </a>
67 </td> 67 </td>
68 68
69 <td *ngIf="!requiresEmailVerification || user.blocked; else emailWithVerificationStatus">{{ user.email }}</td> 69 <td *ngIf="!requiresEmailVerification || user.blocked; else emailWithVerificationStatus" [title]="user.email">{{ user.email }}</td>
70 70
71 <ng-template #emailWithVerificationStatus> 71 <ng-template #emailWithVerificationStatus>
72 <td *ngIf="user.emailVerified === false; else emailVerifiedNotFalse" i18n-title title="User's email must be verified to login"> 72 <td *ngIf="user.emailVerified === false; else emailVerifiedNotFalse" i18n-title title="User's email must be verified to login">
@@ -81,7 +81,7 @@
81 81
82 <td>{{ user.videoQuotaUsed }} / {{ user.videoQuota }}</td> 82 <td>{{ user.videoQuotaUsed }} / {{ user.videoQuota }}</td>
83 <td>{{ user.roleLabel }}</td> 83 <td>{{ user.roleLabel }}</td>
84 <td>{{ user.createdAt }}</td> 84 <td [title]="user.createdAt">{{ user.createdAt }}</td>
85 <td class="action-cell"> 85 <td class="action-cell">
86 <my-user-moderation-dropdown *ngIf="!isInSelectionMode()" [user]="user" (userChanged)="onUserChanged()" (userDeleted)="onUserChanged()"> 86 <my-user-moderation-dropdown *ngIf="!isInSelectionMode()" [user]="user" (userChanged)="onUserChanged()" (userDeleted)="onUserChanged()">
87 </my-user-moderation-dropdown> 87 </my-user-moderation-dropdown>
diff --git a/client/src/app/+admin/users/user-list/user-list.component.ts b/client/src/app/+admin/users/user-list/user-list.component.ts
index 1083ba291..a596251f6 100644
--- a/client/src/app/+admin/users/user-list/user-list.component.ts
+++ b/client/src/app/+admin/users/user-list/user-list.component.ts
@@ -23,7 +23,7 @@ export class UserListComponent extends RestTable implements OnInit {
23 pagination: RestPagination = { count: this.rowsPerPage, start: 0 } 23 pagination: RestPagination = { count: this.rowsPerPage, start: 0 }
24 24
25 selectedUsers: User[] = [] 25 selectedUsers: User[] = []
26 bulkUserActions: DropdownAction<User[]>[] = [] 26 bulkUserActions: DropdownAction<User[]>[][] = []
27 27
28 private serverConfig: ServerConfig 28 private serverConfig: ServerConfig
29 29
@@ -54,29 +54,35 @@ export class UserListComponent extends RestTable implements OnInit {
54 this.initialize() 54 this.initialize()
55 55
56 this.bulkUserActions = [ 56 this.bulkUserActions = [
57 { 57 [
58 label: this.i18n('Delete'), 58 {
59 handler: users => this.removeUsers(users), 59 label: this.i18n('Delete'),
60 isDisplayed: users => users.every(u => this.authUser.canManage(u)) 60 description: this.i18n('Videos will be deleted, comments will be tombstoned.'),
61 }, 61 handler: users => this.removeUsers(users),
62 { 62 isDisplayed: users => users.every(u => this.authUser.canManage(u))
63 label: this.i18n('Ban'), 63 },
64 handler: users => this.openBanUserModal(users), 64 {
65 isDisplayed: users => users.every(u => this.authUser.canManage(u) && u.blocked === false) 65 label: this.i18n('Ban'),
66 }, 66 description: this.i18n('Videos will be kept as private, comments will be kept as is.'),
67 { 67 handler: users => this.openBanUserModal(users),
68 label: this.i18n('Unban'), 68 isDisplayed: users => users.every(u => this.authUser.canManage(u) && u.blocked === false)
69 handler: users => this.unbanUsers(users), 69 },
70 isDisplayed: users => users.every(u => this.authUser.canManage(u) && u.blocked === true) 70 {
71 }, 71 label: this.i18n('Unban'),
72 { 72 handler: users => this.unbanUsers(users),
73 label: this.i18n('Set Email as Verified'), 73 isDisplayed: users => users.every(u => this.authUser.canManage(u) && u.blocked === true)
74 handler: users => this.setEmailsAsVerified(users),
75 isDisplayed: users => {
76 return this.requiresEmailVerification &&
77 users.every(u => this.authUser.canManage(u) && !u.blocked && u.emailVerified === false)
78 } 74 }
79 } 75 ],
76 [
77 {
78 label: this.i18n('Set Email as Verified'),
79 handler: users => this.setEmailsAsVerified(users),
80 isDisplayed: users => {
81 return this.requiresEmailVerification &&
82 users.every(u => this.authUser.canManage(u) && !u.blocked && u.emailVerified === false)
83 }
84 }
85 ]
80 ] 86 ]
81 } 87 }
82 88
diff --git a/client/src/app/+my-account/my-account-history/my-account-history.component.html b/client/src/app/+my-account/my-account-history/my-account-history.component.html
index 86f583b61..4c361cec3 100644
--- a/client/src/app/+my-account/my-account-history/my-account-history.component.html
+++ b/client/src/app/+my-account/my-account-history/my-account-history.component.html
@@ -1,7 +1,7 @@
1<div class="top-buttons"> 1<div class="top-buttons">
2 <div class="history-switch"> 2 <div class="history-switch">
3 <p-inputSwitch [(ngModel)]="videosHistoryEnabled" (ngModelChange)="onVideosHistoryChange()"></p-inputSwitch> 3 <p-inputSwitch [(ngModel)]="videosHistoryEnabled" (ngModelChange)="onVideosHistoryChange()"></p-inputSwitch>
4 <label i18n>Enable video history</label> 4 <label i18n>Video history</label>
5 </div> 5 </div>
6 6
7 <button class="delete-history" (click)="deleteHistory()" i18n> 7 <button class="delete-history" (click)="deleteHistory()" i18n>
diff --git a/client/src/app/app.component.ts b/client/src/app/app.component.ts
index 082d3301d..03eb83cb8 100644
--- a/client/src/app/app.component.ts
+++ b/client/src/app/app.component.ts
@@ -4,7 +4,7 @@ import { Event, GuardsCheckStart, NavigationEnd, Router, Scroll } from '@angular
4import { AuthService, RedirectService, ServerService, ThemeService } from '@app/core' 4import { AuthService, RedirectService, ServerService, ThemeService } from '@app/core'
5import { is18nPath } from '../../../shared/models/i18n' 5import { is18nPath } from '../../../shared/models/i18n'
6import { ScreenService } from '@app/shared/misc/screen.service' 6import { ScreenService } from '@app/shared/misc/screen.service'
7import { debounceTime, filter, first, map, pairwise, skip, switchMap } from 'rxjs/operators' 7import { debounceTime, filter, map, pairwise } from 'rxjs/operators'
8import { Hotkey, HotkeysService } from 'angular2-hotkeys' 8import { Hotkey, HotkeysService } from 'angular2-hotkeys'
9import { I18n } from '@ngx-translate/i18n-polyfill' 9import { I18n } from '@ngx-translate/i18n-polyfill'
10import { fromEvent } from 'rxjs' 10import { fromEvent } from 'rxjs'
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 ]">