diff options
Diffstat (limited to 'client')
15 files changed, 88 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 | |||
4 | import { AuthService, RedirectService, ServerService, ThemeService } from '@app/core' | 4 | import { AuthService, RedirectService, ServerService, ThemeService } from '@app/core' |
5 | import { is18nPath } from '../../../shared/models/i18n' | 5 | import { is18nPath } from '../../../shared/models/i18n' |
6 | import { ScreenService } from '@app/shared/misc/screen.service' | 6 | import { ScreenService } from '@app/shared/misc/screen.service' |
7 | import { debounceTime, filter, first, map, pairwise, skip, switchMap } from 'rxjs/operators' | 7 | import { debounceTime, filter, map, pairwise } from 'rxjs/operators' |
8 | import { Hotkey, HotkeysService } from 'angular2-hotkeys' | 8 | import { Hotkey, HotkeysService } from 'angular2-hotkeys' |
9 | import { I18n } from '@ngx-translate/i18n-polyfill' | 9 | import { I18n } from '@ngx-translate/i18n-polyfill' |
10 | import { fromEvent } from 'rxjs' | 10 | import { 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' | |||
4 | export type DropdownAction<T> = { | 4 | export 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 ]"> |
diff --git a/client/src/sass/primeng-custom.scss b/client/src/sass/primeng-custom.scss index 238cb8454..0d51818c3 100644 --- a/client/src/sass/primeng-custom.scss +++ b/client/src/sass/primeng-custom.scss | |||
@@ -374,6 +374,8 @@ p-tablecheckbox:hover div .ui-chkbox-box { | |||
374 | } | 374 | } |
375 | 375 | ||
376 | p-inputswitch { | 376 | p-inputswitch { |
377 | height: 26px; | ||
378 | |||
377 | .ui-inputswitch-checked .ui-inputswitch-slider { | 379 | .ui-inputswitch-checked .ui-inputswitch-slider { |
378 | background-color: var(--mainColor) !important; | 380 | background-color: var(--mainColor) !important; |
379 | } | 381 | } |