aboutsummaryrefslogtreecommitdiffhomepage
path: root/client/src/app/shared
diff options
context:
space:
mode:
authorChocobozzz <me@florianbigard.com>2023-05-24 15:27:15 +0200
committerChocobozzz <me@florianbigard.com>2023-05-24 15:27:15 +0200
commitd0fbc9fd0a29c37f3ff9b99030351e90b276fe7d (patch)
treefa29fcfd704cbc56c7bc3e3e1c15d84ea0f4dc61 /client/src/app/shared
parent25ea1d85e155382367d11036617848fe69a1e6a4 (diff)
downloadPeerTube-d0fbc9fd0a29c37f3ff9b99030351e90b276fe7d.tar.gz
PeerTube-d0fbc9fd0a29c37f3ff9b99030351e90b276fe7d.tar.zst
PeerTube-d0fbc9fd0a29c37f3ff9b99030351e90b276fe7d.zip
Fix lint
Diffstat (limited to 'client/src/app/shared')
-rw-r--r--client/src/app/shared/form-validators/video-validators.ts2
-rw-r--r--client/src/app/shared/shared-abuse-list/abuse-list-table.component.html6
-rw-r--r--client/src/app/shared/shared-actor-image-edit/actor-avatar-edit.component.html12
-rw-r--r--client/src/app/shared/shared-actor-image-edit/actor-avatar-edit.component.scss4
-rw-r--r--client/src/app/shared/shared-actor-image-edit/actor-banner-edit.component.html12
-rw-r--r--client/src/app/shared/shared-actor-image-edit/actor-banner-edit.component.scss4
-rw-r--r--client/src/app/shared/shared-actor-image/actor-avatar.component.ts14
-rw-r--r--client/src/app/shared/shared-forms/input-switch.component.html6
-rw-r--r--client/src/app/shared/shared-forms/preview-upload.component.html2
-rw-r--r--client/src/app/shared/shared-icons/global-icon.component.ts108
-rw-r--r--client/src/app/shared/shared-instance/instance-features-table.component.html2
-rw-r--r--client/src/app/shared/shared-instance/instance-features-table.component.ts8
-rw-r--r--client/src/app/shared/shared-main/angular/number-formatter.pipe.ts2
-rw-r--r--client/src/app/shared/shared-main/buttons/action-dropdown.component.html2
-rw-r--r--client/src/app/shared/shared-main/buttons/action-dropdown.component.ts2
-rw-r--r--client/src/app/shared/shared-main/buttons/button.component.ts2
-rw-r--r--client/src/app/shared/shared-main/date/date-toggle.component.html3
-rw-r--r--client/src/app/shared/shared-main/loaders/loader.component.ts4
-rw-r--r--client/src/app/shared/shared-main/users/user-notifications.component.html1
-rw-r--r--client/src/app/shared/shared-main/users/user-quota.component.html6
-rw-r--r--client/src/app/shared/shared-moderation/server-blocklist.component.html4
-rw-r--r--client/src/app/shared/shared-moderation/server-blocklist.component.scss4
-rw-r--r--client/src/app/shared/shared-tables/video-cell.component.html2
-rw-r--r--client/src/app/shared/shared-thumbnail/video-thumbnail.component.html8
-rw-r--r--client/src/app/shared/shared-video-live/live-stream-information.component.html2
-rw-r--r--client/src/app/shared/shared-video-miniature/video-download.component.html6
-rw-r--r--client/src/app/shared/shared-video-miniature/video-filters-header.component.html8
-rw-r--r--client/src/app/shared/shared-video-miniature/video-filters.model.ts2
-rw-r--r--client/src/app/shared/shared-video-miniature/videos-list.component.html4
-rw-r--r--client/src/app/shared/shared-video-miniature/videos-selection.component.html4
-rw-r--r--client/src/app/shared/shared-video-playlist/video-add-to-playlist.component.html14
-rw-r--r--client/src/app/shared/shared-video-playlist/video-add-to-playlist.component.scss6
-rw-r--r--client/src/app/shared/shared-video-playlist/video-playlist-element-miniature.component.html8
-rw-r--r--client/src/app/shared/shared-video-playlist/video-playlist-element-miniature.component.scss1
34 files changed, 142 insertions, 133 deletions
diff --git a/client/src/app/shared/form-validators/video-validators.ts b/client/src/app/shared/form-validators/video-validators.ts
index ab6f21a35..a4bda8f16 100644
--- a/client/src/app/shared/form-validators/video-validators.ts
+++ b/client/src/app/shared/form-validators/video-validators.ts
@@ -99,7 +99,7 @@ export const VIDEO_ORIGINALLY_PUBLISHED_AT_VALIDATOR: BuildFormValidator = {
99 99
100function arrayTagLengthValidator (min = 2, max = 30): ValidatorFn { 100function arrayTagLengthValidator (min = 2, max = 30): ValidatorFn {
101 return (control: AbstractControl): ValidationErrors => { 101 return (control: AbstractControl): ValidationErrors => {
102 const array = control.value as Array<string> 102 const array = control.value as string[]
103 103
104 if (array.every(e => e.length >= min && e.length <= max)) { 104 if (array.every(e => e.length >= min && e.length <= max)) {
105 return null 105 return null
diff --git a/client/src/app/shared/shared-abuse-list/abuse-list-table.component.html b/client/src/app/shared/shared-abuse-list/abuse-list-table.component.html
index ef96f8f05..2571cc952 100644
--- a/client/src/app/shared/shared-abuse-list/abuse-list-table.component.html
+++ b/client/src/app/shared/shared-abuse-list/abuse-list-table.component.html
@@ -120,12 +120,12 @@
120 <my-global-icon *ngIf="isAbuseRejected(abuse)" [title]="abuse.state.label" iconName="cross"></my-global-icon> 120 <my-global-icon *ngIf="isAbuseRejected(abuse)" [title]="abuse.state.label" iconName="cross"></my-global-icon>
121 </td> 121 </td>
122 122
123 <td class="c-hand abuse-messages" (click)="openAbuseMessagesModal(abuse)"> 123 <td class="abuse-messages">
124 <ng-container *ngIf="isLocalAbuse(abuse)"> 124 <button class="button-unstyle" *ngIf="isLocalAbuse(abuse)" (click)="openAbuseMessagesModal(abuse)">
125 {{ abuse.countMessages }} 125 {{ abuse.countMessages }}
126 126
127 <my-global-icon iconName="message-circle"></my-global-icon> 127 <my-global-icon iconName="message-circle"></my-global-icon>
128 </ng-container> 128 </button>
129 </td> 129 </td>
130 130
131 <td *ngIf="isAdminView()" class="internal-note" container="body" placement="left auto" [ngbTooltip]="abuse.moderationComment"> 131 <td *ngIf="isAdminView()" class="internal-note" container="body" placement="left auto" [ngbTooltip]="abuse.moderationComment">
diff --git a/client/src/app/shared/shared-actor-image-edit/actor-avatar-edit.component.html b/client/src/app/shared/shared-actor-image-edit/actor-avatar-edit.component.html
index a0f65a3d9..c63b5b361 100644
--- a/client/src/app/shared/shared-actor-image-edit/actor-avatar-edit.component.html
+++ b/client/src/app/shared/shared-actor-image-edit/actor-avatar-edit.component.html
@@ -2,29 +2,29 @@
2 <div class="position-relative me-3"> 2 <div class="position-relative me-3">
3 <my-actor-avatar [actor]="actor" [actorType]="getActorType()" [previewImage]="preview" size="100"></my-actor-avatar> 3 <my-actor-avatar [actor]="actor" [actorType]="getActorType()" [previewImage]="preview" size="100"></my-actor-avatar>
4 4
5 <div *ngIf="editable && !hasAvatar()" class="actor-img-edit-button" [ngbTooltip]="avatarFormat" placement="right" container="body"> 5 <div *ngIf="editable && !hasAvatar()" class="actor-img-edit-button button-focus-within" [ngbTooltip]="avatarFormat" placement="right" container="body">
6 <my-global-icon iconName="upload"></my-global-icon> 6 <my-global-icon iconName="upload"></my-global-icon>
7 <label class="visually-hidden" for="avatarfile" i18n>Upload a new avatar</label> 7 <label class="visually-hidden" for="avatarfile" i18n>Upload a new avatar</label>
8 <input #avatarfileInput type="file" name="avatarfile" id="avatarfile" [accept]="avatarExtensions" (change)="onAvatarChange(avatarfileInput)"/> 8 <input #avatarfileInput type="file" name="avatarfile" id="avatarfile" [accept]="avatarExtensions" (change)="onAvatarChange(avatarfileInput)"/>
9 </div> 9 </div>
10 10
11 <div *ngIf="editable && hasAvatar()" ngbDropdown placement="right"> 11 <div *ngIf="editable && hasAvatar()" ngbDropdown placement="right">
12 <div class="actor-img-edit-button" ngbDropdownToggle> 12 <button type="button" class="actor-img-edit-button" ngbDropdownToggle>
13 <my-global-icon iconName="edit"></my-global-icon> 13 <my-global-icon iconName="edit"></my-global-icon>
14 <label class="visually-hidden" for="avatarMenu" i18n>Change your avatar</label> 14 <label class="visually-hidden" for="avatarMenu" i18n>Change your avatar</label>
15 </div> 15 </button>
16 16
17 <div ngbDropdownMenu> 17 <div ngbDropdownMenu>
18 <div class="dropdown-item c-hand dropdown-file" [ngbTooltip]="avatarFormat"> 18 <div class="dropdown-item dropdown-file button-focus-within" [ngbTooltip]="avatarFormat">
19 <my-global-icon iconName="upload"></my-global-icon> 19 <my-global-icon iconName="upload"></my-global-icon>
20 <span for="avatarfile" i18n>Upload a new avatar</span> 20 <span for="avatarfile" i18n>Upload a new avatar</span>
21 <input #avatarfileInput type="file" name="avatarfile" id="avatarfile" [accept]="avatarExtensions" (change)="onAvatarChange(avatarfileInput)"/> 21 <input #avatarfileInput type="file" name="avatarfile" id="avatarfile" [accept]="avatarExtensions" (change)="onAvatarChange(avatarfileInput)"/>
22 </div> 22 </div>
23 23
24 <div class="dropdown-item c-hand" (click)="deleteAvatar()" (key.enter)="deleteAvatar()"> 24 <button type="button" class="dropdown-item" (click)="deleteAvatar()" (key.enter)="deleteAvatar()">
25 <my-global-icon iconName="delete"></my-global-icon> 25 <my-global-icon iconName="delete"></my-global-icon>
26 <span i18n>Remove avatar</span> 26 <span i18n>Remove avatar</span>
27 </div> 27 </button>
28 </div> 28 </div>
29 29
30 </div> 30 </div>
diff --git a/client/src/app/shared/shared-actor-image-edit/actor-avatar-edit.component.scss b/client/src/app/shared/shared-actor-image-edit/actor-avatar-edit.component.scss
index 01e2131ba..689c5873c 100644
--- a/client/src/app/shared/shared-actor-image-edit/actor-avatar-edit.component.scss
+++ b/client/src/app/shared/shared-actor-image-edit/actor-avatar-edit.component.scss
@@ -39,6 +39,10 @@
39 right: 5px; 39 right: 5px;
40} 40}
41 41
42.button-focus-within:focus-within {
43 box-shadow: #{$focus-box-shadow-form} pvar(--mainColorLightest);
44}
45
42.dropdown-item { 46.dropdown-item {
43 @include dropdown-with-icon-item; 47 @include dropdown-with-icon-item;
44} 48}
diff --git a/client/src/app/shared/shared-actor-image-edit/actor-banner-edit.component.html b/client/src/app/shared/shared-actor-image-edit/actor-banner-edit.component.html
index d6fe37094..d4ddb2deb 100644
--- a/client/src/app/shared/shared-actor-image-edit/actor-banner-edit.component.html
+++ b/client/src/app/shared/shared-actor-image-edit/actor-banner-edit.component.html
@@ -4,25 +4,25 @@
4 <img *ngIf="hasBanner()" [src]="preview || actor.bannerUrl" alt="Banner" /> 4 <img *ngIf="hasBanner()" [src]="preview || actor.bannerUrl" alt="Banner" />
5 </div> 5 </div>
6 6
7 <div *ngIf="!hasBanner()" class="actor-img-edit-button" [ngbTooltip]="bannerFormat" placement="right" container="body"> 7 <div *ngIf="!hasBanner()" class="actor-img-edit-button button-focus-within" [ngbTooltip]="bannerFormat" placement="right" container="body">
8 <ng-container *ngTemplateOutlet="uploadNewBanner"></ng-container> 8 <ng-container *ngTemplateOutlet="uploadNewBanner"></ng-container>
9 </div> 9 </div>
10 10
11 <div *ngIf="hasBanner()" ngbDropdown placement="right"> 11 <div *ngIf="hasBanner()" ngbDropdown placement="right">
12 <div class="actor-img-edit-button" ngbDropdownToggle> 12 <button type="button" class="actor-img-edit-button" ngbDropdownToggle>
13 <my-global-icon iconName="edit"></my-global-icon> 13 <my-global-icon iconName="edit"></my-global-icon>
14 <label for="bannerMenu" i18n>Change your banner</label> 14 <label for="bannerMenu" i18n>Change your banner</label>
15 </div> 15 </button>
16 16
17 <div ngbDropdownMenu> 17 <div ngbDropdownMenu>
18 <div class="dropdown-item c-hand dropdown-file" [ngbTooltip]="bannerFormat"> 18 <div class="dropdown-item dropdown-file button-focus-within" [ngbTooltip]="bannerFormat">
19 <ng-container *ngTemplateOutlet="uploadNewBanner"></ng-container> 19 <ng-container *ngTemplateOutlet="uploadNewBanner"></ng-container>
20 </div> 20 </div>
21 21
22 <div class="dropdown-item c-hand" (click)="deleteBanner()" (key.enter)="deleteBanner()"> 22 <button type="button" class="dropdown-item" (click)="deleteBanner()">
23 <my-global-icon iconName="delete"></my-global-icon> 23 <my-global-icon iconName="delete"></my-global-icon>
24 <span i18n>Remove banner</span> 24 <span i18n>Remove banner</span>
25 </div> 25 </button>
26 </div> 26 </div>
27 </div> 27 </div>
28 </div> 28 </div>
diff --git a/client/src/app/shared/shared-actor-image-edit/actor-banner-edit.component.scss b/client/src/app/shared/shared-actor-image-edit/actor-banner-edit.component.scss
index b2c64fff7..8e5a05603 100644
--- a/client/src/app/shared/shared-actor-image-edit/actor-banner-edit.component.scss
+++ b/client/src/app/shared/shared-actor-image-edit/actor-banner-edit.component.scss
@@ -34,6 +34,10 @@
34 } 34 }
35} 35}
36 36
37.button-focus-within:focus-within {
38 box-shadow: #{$focus-box-shadow-form} pvar(--mainColorLightest);
39}
40
37.dropdown-item { 41.dropdown-item {
38 @include dropdown-with-icon-item; 42 @include dropdown-with-icon-item;
39} 43}
diff --git a/client/src/app/shared/shared-actor-image/actor-avatar.component.ts b/client/src/app/shared/shared-actor-image/actor-avatar.component.ts
index 8e6ad4015..f1c1aa03f 100644
--- a/client/src/app/shared/shared-actor-image/actor-avatar.component.ts
+++ b/client/src/app/shared/shared-actor-image/actor-avatar.component.ts
@@ -145,13 +145,13 @@ export class ActorAvatarComponent implements OnInit, OnChanges {
145 // Keep consistency with CSS 145 // Keep consistency with CSS
146 const themes = { 146 const themes = {
147 '0123456789abc': 'blue', 147 '0123456789abc': 'blue',
148 def: 'green', 148 'def': 'green',
149 ghi: 'purple', 149 'ghi': 'purple',
150 jkl: 'gray', 150 'jkl': 'gray',
151 mno: 'yellow', 151 'mno': 'yellow',
152 pqr: 'orange', 152 'pqr': 'orange',
153 stvu: 'red', 153 'stvu': 'red',
154 wxyz: 'dark-blue' 154 'wxyz': 'dark-blue'
155 } 155 }
156 156
157 const theme = Object.keys(themes) 157 const theme = Object.keys(themes)
diff --git a/client/src/app/shared/shared-forms/input-switch.component.html b/client/src/app/shared/shared-forms/input-switch.component.html
index 9a466055a..4017d4aa5 100644
--- a/client/src/app/shared/shared-forms/input-switch.component.html
+++ b/client/src/app/shared/shared-forms/input-switch.component.html
@@ -1,4 +1,2 @@
1<div (click)="update()"> 1<input type="checkbox" [checked]="checked" [name]="inputName" [id]="inputName" (change)="update()" />
2 <input type="checkbox" [checked]="checked"/> 2<label [for]="inputName" class="ms-auto">Toggle</label>
3 <label class="ms-auto">Toggle</label>
4</div>
diff --git a/client/src/app/shared/shared-forms/preview-upload.component.html b/client/src/app/shared/shared-forms/preview-upload.component.html
index 11e7bdf7f..8a10a11b0 100644
--- a/client/src/app/shared/shared-forms/preview-upload.component.html
+++ b/client/src/app/shared/shared-forms/preview-upload.component.html
@@ -5,7 +5,7 @@
5 icon="edit" (fileChanged)="onFileChanged($event)" [buttonTooltip]="getReactiveFileButtonTooltip()" 5 icon="edit" (fileChanged)="onFileChanged($event)" [buttonTooltip]="getReactiveFileButtonTooltip()"
6 ></my-reactive-file> 6 ></my-reactive-file>
7 7
8 <img *ngIf="imageSrc" [ngStyle]="{ width: previewWidth, height: previewHeight }" [src]="imageSrc" class="preview" /> 8 <img *ngIf="imageSrc" [ngStyle]="{ width: previewWidth, height: previewHeight }" [src]="imageSrc" class="preview" alt="Preview" i18n-alt />
9 <div *ngIf="!imageSrc" [ngStyle]="{ width: previewWidth, height: previewHeight }" class="preview no-image"></div> 9 <div *ngIf="!imageSrc" [ngStyle]="{ width: previewWidth, height: previewHeight }" class="preview no-image"></div>
10 </div> 10 </div>
11</div> 11</div>
diff --git a/client/src/app/shared/shared-icons/global-icon.component.ts b/client/src/app/shared/shared-icons/global-icon.component.ts
index 55eb45a75..96179cbe6 100644
--- a/client/src/app/shared/shared-icons/global-icon.component.ts
+++ b/client/src/app/shared/shared-icons/global-icon.component.ts
@@ -3,81 +3,81 @@ import { HooksService } from '@app/core/plugins/hooks.service'
3 3
4const icons = { 4const icons = {
5 // misc icons 5 // misc icons
6 npm: require('!!raw-loader?!../../../assets/images/misc/npm.svg').default, 6 'npm': require('!!raw-loader?!../../../assets/images/misc/npm.svg').default,
7 markdown: require('!!raw-loader?!../../../assets/images/misc/markdown.svg').default, 7 'markdown': require('!!raw-loader?!../../../assets/images/misc/markdown.svg').default,
8 language: require('!!raw-loader?!../../../assets/images/misc/language.svg').default, 8 'language': require('!!raw-loader?!../../../assets/images/misc/language.svg').default,
9 'video-lang': require('!!raw-loader?!../../../assets/images/misc/video-lang.svg').default, 9 'video-lang': require('!!raw-loader?!../../../assets/images/misc/video-lang.svg').default,
10 support: require('!!raw-loader?!../../../assets/images/misc/support.svg').default, 10 'support': require('!!raw-loader?!../../../assets/images/misc/support.svg').default,
11 'peertube-x': require('!!raw-loader?!../../../assets/images/misc/peertube-x.svg').default, 11 'peertube-x': require('!!raw-loader?!../../../assets/images/misc/peertube-x.svg').default,
12 robot: require('!!raw-loader?!../../../assets/images/misc/miscellaneous-services.svg').default, // material ui 12 'robot': require('!!raw-loader?!../../../assets/images/misc/miscellaneous-services.svg').default, // material ui
13 videos: require('!!raw-loader?!../../../assets/images/misc/video-library.svg').default, // material ui 13 'videos': require('!!raw-loader?!../../../assets/images/misc/video-library.svg').default, // material ui
14 history: require('!!raw-loader?!../../../assets/images/misc/history.svg').default, // material ui 14 'history': require('!!raw-loader?!../../../assets/images/misc/history.svg').default, // material ui
15 subscriptions: require('!!raw-loader?!../../../assets/images/misc/subscriptions.svg').default, // material ui 15 'subscriptions': require('!!raw-loader?!../../../assets/images/misc/subscriptions.svg').default, // material ui
16 'playlist-add': require('!!raw-loader?!../../../assets/images/misc/playlist-add.svg').default, // material ui 16 'playlist-add': require('!!raw-loader?!../../../assets/images/misc/playlist-add.svg').default, // material ui
17 follower: require('!!raw-loader?!../../../assets/images/misc/account-arrow-left.svg').default, // material ui 17 'follower': require('!!raw-loader?!../../../assets/images/misc/account-arrow-left.svg').default, // material ui
18 following: require('!!raw-loader?!../../../assets/images/misc/account-arrow-right.svg').default, // material ui 18 'following': require('!!raw-loader?!../../../assets/images/misc/account-arrow-right.svg').default, // material ui
19 tip: require('!!raw-loader?!../../../assets/images/misc/tip.svg').default, // material ui 19 'tip': require('!!raw-loader?!../../../assets/images/misc/tip.svg').default, // material ui
20 flame: require('!!raw-loader?!../../../assets/images/misc/flame.svg').default, 20 'flame': require('!!raw-loader?!../../../assets/images/misc/flame.svg').default,
21 local: require('!!raw-loader?!../../../assets/images/misc/local.svg').default, 21 'local': require('!!raw-loader?!../../../assets/images/misc/local.svg').default,
22 22
23 // feather icons 23 // feather icons
24 copy: require('!!raw-loader?!../../../assets/images/feather/copy.svg').default, 24 'copy': require('!!raw-loader?!../../../assets/images/feather/copy.svg').default,
25 flag: require('!!raw-loader?!../../../assets/images/feather/flag.svg').default, 25 'flag': require('!!raw-loader?!../../../assets/images/feather/flag.svg').default,
26 playlists: require('!!raw-loader?!../../../assets/images/feather/list.svg').default, 26 'playlists': require('!!raw-loader?!../../../assets/images/feather/list.svg').default,
27 syndication: require('!!raw-loader?!../../../assets/images/feather/syndication.svg').default, 27 'syndication': require('!!raw-loader?!../../../assets/images/feather/syndication.svg').default,
28 help: require('!!raw-loader?!../../../assets/images/feather/help.svg').default, 28 'help': require('!!raw-loader?!../../../assets/images/feather/help.svg').default,
29 alert: require('!!raw-loader?!../../../assets/images/feather/alert.svg').default, 29 'alert': require('!!raw-loader?!../../../assets/images/feather/alert.svg').default,
30 globe: require('!!raw-loader?!../../../assets/images/feather/globe.svg').default, 30 'globe': require('!!raw-loader?!../../../assets/images/feather/globe.svg').default,
31 home: require('!!raw-loader?!../../../assets/images/feather/home.svg').default, 31 'home': require('!!raw-loader?!../../../assets/images/feather/home.svg').default,
32 trending: require('!!raw-loader?!../../../assets/images/feather/trending.svg').default, 32 'trending': require('!!raw-loader?!../../../assets/images/feather/trending.svg').default,
33 search: require('!!raw-loader?!../../../assets/images/feather/search.svg').default, 33 'search': require('!!raw-loader?!../../../assets/images/feather/search.svg').default,
34 upload: require('!!raw-loader?!../../../assets/images/feather/upload.svg').default, 34 'upload': require('!!raw-loader?!../../../assets/images/feather/upload.svg').default,
35 dislike: require('!!raw-loader?!../../../assets/images/feather/dislike.svg').default, 35 'dislike': require('!!raw-loader?!../../../assets/images/feather/dislike.svg').default,
36 like: require('!!raw-loader?!../../../assets/images/feather/like.svg').default, 36 'like': require('!!raw-loader?!../../../assets/images/feather/like.svg').default,
37 no: require('!!raw-loader?!../../../assets/images/feather/no.svg').default, 37 'no': require('!!raw-loader?!../../../assets/images/feather/no.svg').default,
38 'cloud-download': require('!!raw-loader?!../../../assets/images/feather/cloud-download.svg').default, 38 'cloud-download': require('!!raw-loader?!../../../assets/images/feather/cloud-download.svg').default,
39 clock: require('!!raw-loader?!../../../assets/images/feather/clock.svg').default, 39 'clock': require('!!raw-loader?!../../../assets/images/feather/clock.svg').default,
40 cog: require('!!raw-loader?!../../../assets/images/feather/cog.svg').default, 40 'cog': require('!!raw-loader?!../../../assets/images/feather/cog.svg').default,
41 delete: require('!!raw-loader?!../../../assets/images/feather/delete.svg').default, 41 'delete': require('!!raw-loader?!../../../assets/images/feather/delete.svg').default,
42 bell: require('!!raw-loader?!../../../assets/images/feather/bell.svg').default, 42 'bell': require('!!raw-loader?!../../../assets/images/feather/bell.svg').default,
43 'sign-out': require('!!raw-loader?!../../../assets/images/feather/log-out.svg').default, 43 'sign-out': require('!!raw-loader?!../../../assets/images/feather/log-out.svg').default,
44 'sign-in': require('!!raw-loader?!../../../assets/images/feather/log-in.svg').default, 44 'sign-in': require('!!raw-loader?!../../../assets/images/feather/log-in.svg').default,
45 download: require('!!raw-loader?!../../../assets/images/feather/download.svg').default, 45 'download': require('!!raw-loader?!../../../assets/images/feather/download.svg').default,
46 'ownership-change': require('!!raw-loader?!../../../assets/images/feather/share.svg').default, 46 'ownership-change': require('!!raw-loader?!../../../assets/images/feather/share.svg').default,
47 share: require('!!raw-loader?!../../../assets/images/feather/share-2.svg').default, 47 'share': require('!!raw-loader?!../../../assets/images/feather/share-2.svg').default,
48 channel: require('!!raw-loader?!../../../assets/images/feather/tv.svg').default, 48 'channel': require('!!raw-loader?!../../../assets/images/feather/tv.svg').default,
49 user: require('!!raw-loader?!../../../assets/images/feather/user.svg').default, 49 'user': require('!!raw-loader?!../../../assets/images/feather/user.svg').default,
50 'user-x': require('!!raw-loader?!../../../assets/images/feather/user-x.svg').default, 50 'user-x': require('!!raw-loader?!../../../assets/images/feather/user-x.svg').default,
51 users: require('!!raw-loader?!../../../assets/images/feather/users.svg').default, 51 'users': require('!!raw-loader?!../../../assets/images/feather/users.svg').default,
52 'user-add': require('!!raw-loader?!../../../assets/images/feather/user-plus.svg').default, 52 'user-add': require('!!raw-loader?!../../../assets/images/feather/user-plus.svg').default,
53 add: require('!!raw-loader?!../../../assets/images/feather/plus-circle.svg').default, 53 'add': require('!!raw-loader?!../../../assets/images/feather/plus-circle.svg').default,
54 'cloud-error': require('!!raw-loader?!../../../assets/images/feather/cloud-off.svg').default, 54 'cloud-error': require('!!raw-loader?!../../../assets/images/feather/cloud-off.svg').default,
55 undo: require('!!raw-loader?!../../../assets/images/feather/corner-up-left.svg').default, 55 'undo': require('!!raw-loader?!../../../assets/images/feather/corner-up-left.svg').default,
56 'circle-tick': require('!!raw-loader?!../../../assets/images/feather/check-circle.svg').default, 56 'circle-tick': require('!!raw-loader?!../../../assets/images/feather/check-circle.svg').default,
57 'more-horizontal': require('!!raw-loader?!../../../assets/images/feather/more-horizontal.svg').default, 57 'more-horizontal': require('!!raw-loader?!../../../assets/images/feather/more-horizontal.svg').default,
58 'more-vertical': require('!!raw-loader?!../../../assets/images/feather/more-vertical.svg').default, 58 'more-vertical': require('!!raw-loader?!../../../assets/images/feather/more-vertical.svg').default,
59 play: require('!!raw-loader?!../../../assets/images/feather/play.svg').default, 59 'play': require('!!raw-loader?!../../../assets/images/feather/play.svg').default,
60 p2p: require('!!raw-loader?!../../../assets/images/feather/airplay.svg').default, 60 'p2p': require('!!raw-loader?!../../../assets/images/feather/airplay.svg').default,
61 fullscreen: require('!!raw-loader?!../../../assets/images/feather/maximize.svg').default, 61 'fullscreen': require('!!raw-loader?!../../../assets/images/feather/maximize.svg').default,
62 'exit-fullscreen': require('!!raw-loader?!../../../assets/images/feather/minimize.svg').default, 62 'exit-fullscreen': require('!!raw-loader?!../../../assets/images/feather/minimize.svg').default,
63 film: require('!!raw-loader?!../../../assets/images/feather/film.svg').default, 63 'film': require('!!raw-loader?!../../../assets/images/feather/film.svg').default,
64 edit: require('!!raw-loader?!../../../assets/images/feather/edit-2.svg').default, 64 'edit': require('!!raw-loader?!../../../assets/images/feather/edit-2.svg').default,
65 'external-link': require('!!raw-loader?!../../../assets/images/feather/external-link.svg').default, 65 'external-link': require('!!raw-loader?!../../../assets/images/feather/external-link.svg').default,
66 'eye-open': require('!!raw-loader?!../../../assets/images/feather/eye.svg').default, 66 'eye-open': require('!!raw-loader?!../../../assets/images/feather/eye.svg').default,
67 'eye-close': require('!!raw-loader?!../../../assets/images/feather/eye-off.svg').default, 67 'eye-close': require('!!raw-loader?!../../../assets/images/feather/eye-off.svg').default,
68 refresh: require('!!raw-loader?!../../../assets/images/feather/refresh-cw.svg').default, 68 'refresh': require('!!raw-loader?!../../../assets/images/feather/refresh-cw.svg').default,
69 command: require('!!raw-loader?!../../../assets/images/feather/command.svg').default, 69 'command': require('!!raw-loader?!../../../assets/images/feather/command.svg').default,
70 go: require('!!raw-loader?!../../../assets/images/feather/arrow-up-right.svg').default, 70 'go': require('!!raw-loader?!../../../assets/images/feather/arrow-up-right.svg').default,
71 cross: require('!!raw-loader?!../../../assets/images/feather/x.svg').default, 71 'cross': require('!!raw-loader?!../../../assets/images/feather/x.svg').default,
72 tick: require('!!raw-loader?!../../../assets/images/feather/check.svg').default, 72 'tick': require('!!raw-loader?!../../../assets/images/feather/check.svg').default,
73 columns: require('!!raw-loader?!../../../assets/images/feather/columns.svg').default, 73 'columns': require('!!raw-loader?!../../../assets/images/feather/columns.svg').default,
74 live: require('!!raw-loader?!../../../assets/images/feather/live.svg').default, 74 'live': require('!!raw-loader?!../../../assets/images/feather/live.svg').default,
75 repeat: require('!!raw-loader?!../../../assets/images/feather/repeat.svg').default, 75 'repeat': require('!!raw-loader?!../../../assets/images/feather/repeat.svg').default,
76 'chevrons-up': require('!!raw-loader?!../../../assets/images/feather/chevrons-up.svg').default, 76 'chevrons-up': require('!!raw-loader?!../../../assets/images/feather/chevrons-up.svg').default,
77 'message-circle': require('!!raw-loader?!../../../assets/images/feather/message-circle.svg').default, 77 'message-circle': require('!!raw-loader?!../../../assets/images/feather/message-circle.svg').default,
78 codesandbox: require('!!raw-loader?!../../../assets/images/feather/codesandbox.svg').default, 78 'codesandbox': require('!!raw-loader?!../../../assets/images/feather/codesandbox.svg').default,
79 award: require('!!raw-loader?!../../../assets/images/feather/award.svg').default, 79 'award': require('!!raw-loader?!../../../assets/images/feather/award.svg').default,
80 stats: require('!!raw-loader?!../../../assets/images/feather/stats.svg').default 80 'stats': require('!!raw-loader?!../../../assets/images/feather/stats.svg').default
81} 81}
82 82
83export type GlobalIconName = keyof typeof icons 83export type GlobalIconName = keyof typeof icons
diff --git a/client/src/app/shared/shared-instance/instance-features-table.component.html b/client/src/app/shared/shared-instance/instance-features-table.component.html
index 205f2bc97..37f53b7c6 100644
--- a/client/src/app/shared/shared-instance/instance-features-table.component.html
+++ b/client/src/app/shared/shared-instance/instance-features-table.component.html
@@ -11,7 +11,7 @@
11 <tr> 11 <tr>
12 <th i18n class="label" scope="row"> 12 <th i18n class="label" scope="row">
13 <div>Default NSFW/sensitive videos policy</div> 13 <div>Default NSFW/sensitive videos policy</div>
14 <div class="c-hand more-info" (click)="openQuickSettingsHighlight()">can be redefined by the users</div> 14 <span class="fs-7 fw-normal fst-italic">can be redefined by the users</span>
15 </th> 15 </th>
16 16
17 <td class="value">{{ buildNSFWLabel() }}</td> 17 <td class="value">{{ buildNSFWLabel() }}</td>
diff --git a/client/src/app/shared/shared-instance/instance-features-table.component.ts b/client/src/app/shared/shared-instance/instance-features-table.component.ts
index c3df7c594..2e63f6c17 100644
--- a/client/src/app/shared/shared-instance/instance-features-table.component.ts
+++ b/client/src/app/shared/shared-instance/instance-features-table.component.ts
@@ -2,7 +2,6 @@ import { Component, OnInit } from '@angular/core'
2import { ServerService } from '@app/core' 2import { ServerService } from '@app/core'
3import { prepareIcu } from '@app/helpers' 3import { prepareIcu } from '@app/helpers'
4import { ServerConfig } from '@shared/models' 4import { ServerConfig } from '@shared/models'
5import { PeertubeModalService } from '../shared-main/peertube-modal/peertube-modal.service'
6 5
7@Component({ 6@Component({
8 selector: 'my-instance-features-table', 7 selector: 'my-instance-features-table',
@@ -14,8 +13,7 @@ export class InstanceFeaturesTableComponent implements OnInit {
14 serverConfig: ServerConfig 13 serverConfig: ServerConfig
15 14
16 constructor ( 15 constructor (
17 private serverService: ServerService, 16 private serverService: ServerService
18 private modalService: PeertubeModalService
19 ) { } 17 ) { }
20 18
21 get initialUserVideoQuota () { 19 get initialUserVideoQuota () {
@@ -69,10 +67,6 @@ export class InstanceFeaturesTableComponent implements OnInit {
69 return this.serverService.getServerVersionAndCommit() 67 return this.serverService.getServerVersionAndCommit()
70 } 68 }
71 69
72 openQuickSettingsHighlight () {
73 this.modalService.openQuickSettingsSubject.next()
74 }
75
76 private getApproximateTime (seconds: number) { 70 private getApproximateTime (seconds: number) {
77 const hours = Math.floor(seconds / 3600) 71 const hours = Math.floor(seconds / 3600)
78 72
diff --git a/client/src/app/shared/shared-main/angular/number-formatter.pipe.ts b/client/src/app/shared/shared-main/angular/number-formatter.pipe.ts
index e0cb475fc..00cfbc692 100644
--- a/client/src/app/shared/shared-main/angular/number-formatter.pipe.ts
+++ b/client/src/app/shared/shared-main/angular/number-formatter.pipe.ts
@@ -17,7 +17,7 @@ export class NumberFormatterPipe implements PipeTransform {
17 return +f 17 return +f
18 } 18 }
19 19
20 private dictionary: Array<{ max: number, type: string }> = [ 20 private dictionary: { max: number, type: string }[] = [
21 { max: 1000, type: '' }, 21 { max: 1000, type: '' },
22 { max: 1000000, type: 'K' }, 22 { max: 1000000, type: 'K' },
23 { max: 1000000000, type: 'M' } 23 { max: 1000000000, type: 'M' }
diff --git a/client/src/app/shared/shared-main/buttons/action-dropdown.component.html b/client/src/app/shared/shared-main/buttons/action-dropdown.component.html
index bbfab7b37..d4aa9f380 100644
--- a/client/src/app/shared/shared-main/buttons/action-dropdown.component.html
+++ b/client/src/app/shared/shared-main/buttons/action-dropdown.component.html
@@ -40,7 +40,7 @@
40 40
41 <h6 41 <h6
42 *ngIf="!action.linkBuilder && action.isHeader && areActionsDisplayed(actions, entry)" [ngClass]="{ 'with-icon': !!action.iconName }" 42 *ngIf="!action.linkBuilder && action.isHeader && areActionsDisplayed(actions, entry)" [ngClass]="{ 'with-icon': !!action.iconName }"
43 class="dropdown-header" [title]="action.title || ''" (click)="action.handler(entry)" (keyup.enter)="action.handler(entry)" 43 class="dropdown-header" [title]="action.title || ''"
44 > 44 >
45 <ng-container *ngTemplateOutlet="templateActionLabel; context:{ $implicit: action }"></ng-container> 45 <ng-container *ngTemplateOutlet="templateActionLabel; context:{ $implicit: action }"></ng-container>
46 </h6> 46 </h6>
diff --git a/client/src/app/shared/shared-main/buttons/action-dropdown.component.ts b/client/src/app/shared/shared-main/buttons/action-dropdown.component.ts
index e39fbd66d..7d24ff4ae 100644
--- a/client/src/app/shared/shared-main/buttons/action-dropdown.component.ts
+++ b/client/src/app/shared/shared-main/buttons/action-dropdown.component.ts
@@ -55,7 +55,7 @@ export class ActionDropdownComponent<T> {
55 return {} 55 return {}
56 } 56 }
57 57
58 areActionsDisplayed (actions: Array<DropdownAction<T> | DropdownAction<T>[]>, entry: T): boolean { 58 areActionsDisplayed (actions: (DropdownAction<T> | DropdownAction<T>[])[], entry: T): boolean {
59 return actions.some(a => { 59 return actions.some(a => {
60 if (Array.isArray(a)) return this.areActionsDisplayed(a, entry) 60 if (Array.isArray(a)) return this.areActionsDisplayed(a, entry)
61 61
diff --git a/client/src/app/shared/shared-main/buttons/button.component.ts b/client/src/app/shared/shared-main/buttons/button.component.ts
index 63a59cbe1..e3a830891 100644
--- a/client/src/app/shared/shared-main/buttons/button.component.ts
+++ b/client/src/app/shared/shared-main/buttons/button.component.ts
@@ -31,7 +31,7 @@ export class ButtonComponent implements OnInit, OnChanges {
31 private buildClasses () { 31 private buildClasses () {
32 this.classes = { 32 this.classes = {
33 [this.className]: true, 33 [this.className]: true,
34 disabled: this.disabled, 34 'disabled': this.disabled,
35 'icon-only': !this.label, 35 'icon-only': !this.label,
36 'has-icon': !!this.icon, 36 'has-icon': !!this.icon,
37 'responsive-label': this.responsiveLabel 37 'responsive-label': this.responsiveLabel
diff --git a/client/src/app/shared/shared-main/date/date-toggle.component.html b/client/src/app/shared/shared-main/date/date-toggle.component.html
index 14b6e7d7a..5277ae0e8 100644
--- a/client/src/app/shared/shared-main/date/date-toggle.component.html
+++ b/client/src/app/shared/shared-main/date/date-toggle.component.html
@@ -1,7 +1,10 @@
1<span 1<span
2 class="date-toggle" 2 class="date-toggle"
3 [title]="getTitle()" 3 [title]="getTitle()"
4 role="button"
5 tabindex="0"
4 (click)="toggle()" 6 (click)="toggle()"
7 (keyup.enter)="toggle()"
5> 8>
6 {{ getContent() }} 9 {{ getContent() }}
7</span> 10</span>
diff --git a/client/src/app/shared/shared-main/loaders/loader.component.ts b/client/src/app/shared/shared-main/loaders/loader.component.ts
index bd038f8b5..be9e130e7 100644
--- a/client/src/app/shared/shared-main/loaders/loader.component.ts
+++ b/client/src/app/shared/shared-main/loaders/loader.component.ts
@@ -10,8 +10,8 @@ export class LoaderComponent {
10 10
11 private readonly sizes = { 11 private readonly sizes = {
12 sm: { 12 sm: {
13 width: '1rem', 13 'width': '1rem',
14 height: '1rem', 14 'height': '1rem',
15 'border-width': '0.15rem' 15 'border-width': '0.15rem'
16 }, 16 },
17 xl: { 17 xl: {
diff --git a/client/src/app/shared/shared-main/users/user-notifications.component.html b/client/src/app/shared/shared-main/users/user-notifications.component.html
index a51e08292..351e4dc3f 100644
--- a/client/src/app/shared/shared-main/users/user-notifications.component.html
+++ b/client/src/app/shared/shared-main/users/user-notifications.component.html
@@ -1,6 +1,7 @@
1<div *ngIf="componentPagination.totalItems === 0" class="no-notification" i18n>You don't have notifications.</div> 1<div *ngIf="componentPagination.totalItems === 0" class="no-notification" i18n>You don't have notifications.</div>
2 2
3<div class="notifications" myInfiniteScroller (nearOfBottom)="onNearOfBottom()" [dataObservable]="onDataSubject.asObservable()"> 3<div class="notifications" myInfiniteScroller (nearOfBottom)="onNearOfBottom()" [dataObservable]="onDataSubject.asObservable()">
4 <!-- eslint-disable-next-line @angular-eslint/template/click-events-have-key-events,@angular-eslint/template/interactive-supports-focus -->
4 <div *ngFor="let notification of notifications" class="notification" [ngClass]="{ unread: !notification.read }" (click)="markAsRead(notification)"> 5 <div *ngFor="let notification of notifications" class="notification" [ngClass]="{ unread: !notification.read }" (click)="markAsRead(notification)">
5 6
6 <ng-container [ngSwitch]="notification.type"> 7 <ng-container [ngSwitch]="notification.type">
diff --git a/client/src/app/shared/shared-main/users/user-quota.component.html b/client/src/app/shared/shared-main/users/user-quota.component.html
index 0e0d38c2a..ac9085bb3 100644
--- a/client/src/app/shared/shared-main/users/user-quota.component.html
+++ b/client/src/app/shared/shared-main/users/user-quota.component.html
@@ -1,6 +1,7 @@
1<div class="user-quota mb-3"> 1<div class="user-quota mb-3">
2 <div> 2 <div>
3 <label class="user-quota-title" tabindex="0" i18n>Total video quota</label> 3 <div class="mb-2 fw-bold" i18n>Total video quota</div>
4
4 <div class="progress" tabindex="0" [ngbTooltip]="titleVideoQuota()"> 5 <div class="progress" tabindex="0" [ngbTooltip]="titleVideoQuota()">
5 <div class="progress-bar" tabindex="0" role="progressbar" [style]="{ width: userVideoQuotaPercentage + '%' }" 6 <div class="progress-bar" tabindex="0" role="progressbar" [style]="{ width: userVideoQuotaPercentage + '%' }"
6 [attr.aria-valuenow]="userVideoQuotaUsed" aria-valuemin="0" [attr.aria-valuemax]="user.videoQuota"></div> 7 [attr.aria-valuenow]="userVideoQuotaUsed" aria-valuemin="0" [attr.aria-valuemax]="user.videoQuota"></div>
@@ -10,7 +11,8 @@
10 </div> 11 </div>
11 12
12 <div *ngIf="hasDailyQuota()" class="mt-3"> 13 <div *ngIf="hasDailyQuota()" class="mt-3">
13 <label class="user-quota-title" tabindex="0" i18n>Daily video quota</label> 14 <div class="mb-2 fw-bold" i18n>Daily video quota</div>
15
14 <div class="progress" tabindex="0" [ngbTooltip]="titleVideoQuotaDaily()"> 16 <div class="progress" tabindex="0" [ngbTooltip]="titleVideoQuotaDaily()">
15 <div class="progress-bar" role="progressbar" [style]="{ width: userVideoQuotaDailyPercentage + '%' }" 17 <div class="progress-bar" role="progressbar" [style]="{ width: userVideoQuotaDailyPercentage + '%' }"
16 [attr.aria-valuenow]="userVideoQuotaUsedDaily" aria-valuemin="0" [attr.aria-valuemax]="user.videoQuotaDaily"></div> 18 [attr.aria-valuenow]="userVideoQuotaUsedDaily" aria-valuemin="0" [attr.aria-valuemax]="user.videoQuotaDaily"></div>
diff --git a/client/src/app/shared/shared-moderation/server-blocklist.component.html b/client/src/app/shared/shared-moderation/server-blocklist.component.html
index e07703cf4..1a13e0207 100644
--- a/client/src/app/shared/shared-moderation/server-blocklist.component.html
+++ b/client/src/app/shared/shared-moderation/server-blocklist.component.html
@@ -14,10 +14,10 @@
14 <ng-template pTemplate="caption"> 14 <ng-template pTemplate="caption">
15 <div class="caption"> 15 <div class="caption">
16 <div class="left-buttons"> 16 <div class="left-buttons">
17 <a class="block-button" (click)="addServersToBlock()" (key.enter)="addServersToBlock()"> 17 <button class="peertube-create-button" (click)="addServersToBlock()" (key.enter)="addServersToBlock()">
18 <my-global-icon iconName="add" aria-hidden="true"></my-global-icon> 18 <my-global-icon iconName="add" aria-hidden="true"></my-global-icon>
19 <ng-container i18n>Mute domain</ng-container> 19 <ng-container i18n>Mute domain</ng-container>
20 </a> 20 </button>
21 </div> 21 </div>
22 22
23 <div class="ms-auto"> 23 <div class="ms-auto">
diff --git a/client/src/app/shared/shared-moderation/server-blocklist.component.scss b/client/src/app/shared/shared-moderation/server-blocklist.component.scss
index 1a6b0435f..10b9a40a1 100644
--- a/client/src/app/shared/shared-moderation/server-blocklist.component.scss
+++ b/client/src/app/shared/shared-moderation/server-blocklist.component.scss
@@ -20,7 +20,3 @@ a {
20 @include peertube-button; 20 @include peertube-button;
21 @include grey-button; 21 @include grey-button;
22} 22}
23
24.block-button {
25 @include create-button;
26}
diff --git a/client/src/app/shared/shared-tables/video-cell.component.html b/client/src/app/shared/shared-tables/video-cell.component.html
index ea432b70e..38e7dea17 100644
--- a/client/src/app/shared/shared-tables/video-cell.component.html
+++ b/client/src/app/shared/shared-tables/video-cell.component.html
@@ -1,7 +1,7 @@
1<a [href]="getVideoUrl()" class="table-video-link" [title]="video.name" target="_blank" rel="noopener noreferrer"> 1<a [href]="getVideoUrl()" class="table-video-link" [title]="video.name" target="_blank" rel="noopener noreferrer">
2 <div class="table-video"> 2 <div class="table-video">
3 <div class="table-video-image"> 3 <div class="table-video-image">
4 <img [src]="video.thumbnailPath"> 4 <img [src]="video.thumbnailPath" alt="">
5 5
6 <ng-content select="[image]"></ng-content> 6 <ng-content select="[image]"></ng-content>
7 </div> 7 </div>
diff --git a/client/src/app/shared/shared-thumbnail/video-thumbnail.component.html b/client/src/app/shared/shared-thumbnail/video-thumbnail.component.html
index 57fcdd899..6c9a8b91c 100644
--- a/client/src/app/shared/shared-thumbnail/video-thumbnail.component.html
+++ b/client/src/app/shared/shared-thumbnail/video-thumbnail.component.html
@@ -11,15 +11,15 @@
11 11
12 <div *ngIf="displayWatchLaterPlaylist" class="video-thumbnail-actions-overlay"> 12 <div *ngIf="displayWatchLaterPlaylist" class="video-thumbnail-actions-overlay">
13 <ng-container *ngIf="inWatchLaterPlaylist !== true"> 13 <ng-container *ngIf="inWatchLaterPlaylist !== true">
14 <div class="video-thumbnail-watch-later-overlay" placement="left" [ngbTooltip]="addToWatchLaterText" container="body" (click)="onWatchLaterClick($event)"> 14 <button class="video-thumbnail-watch-later-overlay button-unstyle" placement="left" [ngbTooltip]="addToWatchLaterText" container="body" (click)="onWatchLaterClick($event)">
15 <my-global-icon iconName="clock" [attr.aria-label]="addToWatchLaterText" role="button"></my-global-icon> 15 <my-global-icon iconName="clock" [attr.aria-label]="addToWatchLaterText" role="button"></my-global-icon>
16 </div> 16 </button>
17 </ng-container> 17 </ng-container>
18 18
19 <ng-container *ngIf="inWatchLaterPlaylist === true"> 19 <ng-container *ngIf="inWatchLaterPlaylist === true">
20 <div class="video-thumbnail-watch-later-overlay" placement="left" [ngbTooltip]="addedToWatchLaterText" container="body" (click)="onWatchLaterClick($event)"> 20 <button class="video-thumbnail-watch-later-overlay button-unstyle" placement="left" [ngbTooltip]="addedToWatchLaterText" container="body" (click)="onWatchLaterClick($event)">
21 <my-global-icon iconName="tick" [attr.aria-label]="addedToWatchLaterText" role="button"></my-global-icon> 21 <my-global-icon iconName="tick" [attr.aria-label]="addedToWatchLaterText" role="button"></my-global-icon>
22 </div> 22 </button>
23 </ng-container> 23 </ng-container>
24 </div> 24 </div>
25 25
diff --git a/client/src/app/shared/shared-video-live/live-stream-information.component.html b/client/src/app/shared/shared-video-live/live-stream-information.component.html
index 8e61bdbb3..e385b429c 100644
--- a/client/src/app/shared/shared-video-live/live-stream-information.component.html
+++ b/client/src/app/shared/shared-video-live/live-stream-information.component.html
@@ -33,7 +33,7 @@
33 </div> 33 </div>
34 34
35 <div class="journal" *ngIf="latestLiveSessions.length !== 0"> 35 <div class="journal" *ngIf="latestLiveSessions.length !== 0">
36 <label i18n>Latest live sessions</label> 36 <div class="mb-2 fw-bold" i18n>Latest live sessions</div>
37 37
38 <div class="journal-session" *ngFor="let session of latestLiveSessions"> 38 <div class="journal-session" *ngFor="let session of latestLiveSessions">
39 <span i18n class="pt-badge badge-success" *ngIf="!getErrorLabel(session)">Success</span> 39 <span i18n class="pt-badge badge-success" *ngIf="!getErrorLabel(session)">Success</span>
diff --git a/client/src/app/shared/shared-video-miniature/video-download.component.html b/client/src/app/shared/shared-video-miniature/video-download.component.html
index 3d8ce22de..a3676e159 100644
--- a/client/src/app/shared/shared-video-miniature/video-download.component.html
+++ b/client/src/app/shared/shared-video-miniature/video-download.component.html
@@ -111,9 +111,9 @@
111 </div> 111 </div>
112 </div> 112 </div>
113 113
114 <div 114 <button
115 (click)="isAdvancedCustomizationCollapsed = !isAdvancedCustomizationCollapsed" 115 (click)="isAdvancedCustomizationCollapsed = !isAdvancedCustomizationCollapsed"
116 role="button" class="advanced-filters-button" 116 class="advanced-filters-button button-unstyle"
117 [attr.aria-expanded]="!isAdvancedCustomizationCollapsed" aria-controls="collapseBasic" 117 [attr.aria-expanded]="!isAdvancedCustomizationCollapsed" aria-controls="collapseBasic"
118 > 118 >
119 <ng-container *ngIf="isAdvancedCustomizationCollapsed"> 119 <ng-container *ngIf="isAdvancedCustomizationCollapsed">
@@ -131,7 +131,7 @@
131 Simple 131 Simple
132 </ng-container> 132 </ng-container>
133 </ng-container> 133 </ng-container>
134 </div> 134 </button>
135 </ng-container> 135 </ng-container>
136 </div> 136 </div>
137 137
diff --git a/client/src/app/shared/shared-video-miniature/video-filters-header.component.html b/client/src/app/shared/shared-video-miniature/video-filters-header.component.html
index 48bb0d812..3d39c6fdc 100644
--- a/client/src/app/shared/shared-video-miniature/video-filters-header.component.html
+++ b/client/src/app/shared/shared-video-miniature/video-filters-header.component.html
@@ -2,7 +2,7 @@
2 <div class="label-description muted" i18n> 2 <div class="label-description muted" i18n>
3 Update 3 Update
4 <a routerLink="/my-account/settings" [fragment]="fragment"> 4 <a routerLink="/my-account/settings" [fragment]="fragment">
5 <span (click)="onAccountSettingsClick($event)">your settings</span> 5 <button class="button-unstyle" (click)="onAccountSettingsClick($event)">your settings</button>
6 </a 6 </a
7 ></div> 7 ></div>
8</ng-template> 8</ng-template>
@@ -23,9 +23,9 @@
23 <my-global-icon iconName="chevrons-up"></my-global-icon> 23 <my-global-icon iconName="chevrons-up"></my-global-icon>
24 </button> 24 </button>
25 25
26 <div 26 <button
27 *ngFor="let activeFilter of filters.getActiveFilters()" (click)="resetFilter(activeFilter.key, activeFilter.canRemove)" 27 *ngFor="let activeFilter of filters.getActiveFilters()" (click)="resetFilter(activeFilter.key, activeFilter.canRemove)"
28 class="active-filter pastille" [ngClass]="{ 'can-remove': activeFilter.canRemove }" [title]="getFilterTitle(activeFilter.canRemove)" 28 class="active-filter pastille button-unstyle" [ngClass]="{ 'can-remove': activeFilter.canRemove }" [title]="getFilterTitle(activeFilter.canRemove)"
29 > 29 >
30 <span> 30 <span>
31 {{ activeFilter.label }} 31 {{ activeFilter.label }}
@@ -34,7 +34,7 @@
34 </span> 34 </span>
35 35
36 <my-global-icon *ngIf="activeFilter.canRemove" iconName="cross"></my-global-icon> 36 <my-global-icon *ngIf="activeFilter.canRemove" iconName="cross"></my-global-icon>
37 </div> 37 </button>
38 </div> 38 </div>
39 39
40 <ng-select 40 <ng-select
diff --git a/client/src/app/shared/shared-video-miniature/video-filters.model.ts b/client/src/app/shared/shared-video-miniature/video-filters.model.ts
index 4069ab4b5..6b4b72c75 100644
--- a/client/src/app/shared/shared-video-miniature/video-filters.model.ts
+++ b/client/src/app/shared/shared-video-miniature/video-filters.model.ts
@@ -37,7 +37,7 @@ export class VideoFilters {
37 private activeFilters: { key: string, canRemove: boolean, label: string, value?: string }[] = [] 37 private activeFilters: { key: string, canRemove: boolean, label: string, value?: string }[] = []
38 private defaultNSFWPolicy: NSFWPolicyType 38 private defaultNSFWPolicy: NSFWPolicyType
39 39
40 private onChangeCallbacks: Array<() => void> = [] 40 private onChangeCallbacks: (() => void)[] = []
41 private oldFormObjectString: string 41 private oldFormObjectString: string
42 42
43 private readonly hiddenFields: string[] = [] 43 private readonly hiddenFields: string[] = []
diff --git a/client/src/app/shared/shared-video-miniature/videos-list.component.html b/client/src/app/shared/shared-video-miniature/videos-list.component.html
index 8c8bf80d9..909c86d3d 100644
--- a/client/src/app/shared/shared-video-miniature/videos-list.component.html
+++ b/client/src/app/shared/shared-video-miniature/videos-list.component.html
@@ -16,9 +16,9 @@
16 <ng-container *ngTemplateOutlet="actionContent; context:{ $implicit: action }"></ng-container> 16 <ng-container *ngTemplateOutlet="actionContent; context:{ $implicit: action }"></ng-container>
17 </a> 17 </a>
18 18
19 <a *ngIf="!action.routerLink && !action.href && action.click" class="ms-2" (click)="action.click($event)" (key.enter)="action.click($event)"> 19 <button *ngIf="!action.routerLink && !action.href && action.click" class="ms-2 button-unstyle" (click)="action.click($event)" (key.enter)="action.click($event)">
20 <ng-container *ngTemplateOutlet="actionContent; context:{ $implicit: action }"></ng-container> 20 <ng-container *ngTemplateOutlet="actionContent; context:{ $implicit: action }"></ng-container>
21 </a> 21 </button>
22 22
23 <a *ngIf="!action.routerLink && action.href && action.click" class="ms-2" (click)="action.click($event)" (key.enter)="action.click($event)" [href]="action.href"> 23 <a *ngIf="!action.routerLink && action.href && action.click" class="ms-2" (click)="action.click($event)" (key.enter)="action.click($event)" [href]="action.href">
24 <ng-container *ngTemplateOutlet="actionContent; context:{ $implicit: action }"></ng-container> 24 <ng-container *ngTemplateOutlet="actionContent; context:{ $implicit: action }"></ng-container>
diff --git a/client/src/app/shared/shared-video-miniature/videos-selection.component.html b/client/src/app/shared/shared-video-miniature/videos-selection.component.html
index 6c6db4b96..8931158a9 100644
--- a/client/src/app/shared/shared-video-miniature/videos-selection.component.html
+++ b/client/src/app/shared/shared-video-miniature/videos-selection.component.html
@@ -20,9 +20,9 @@
20 <!-- Display only once --> 20 <!-- Display only once -->
21 <div class="action-selection-mode" *ngIf="isInSelectionMode() === true && i === 0"> 21 <div class="action-selection-mode" *ngIf="isInSelectionMode() === true && i === 0">
22 <div class="action-selection-mode-child"> 22 <div class="action-selection-mode-child">
23 <span i18n class="action-button action-button-cancel-selection" (click)="abortSelectionMode()"> 23 <button i18n class="action-button action-button-cancel-selection" (click)="abortSelectionMode()">
24 Cancel 24 Cancel
25 </span> 25 </button>
26 26
27 <ng-container *ngTemplateOutlet="globalButtonsTemplate"></ng-container> 27 <ng-container *ngTemplateOutlet="globalButtonsTemplate"></ng-container>
28 </div> 28 </div>
diff --git a/client/src/app/shared/shared-video-playlist/video-add-to-playlist.component.html b/client/src/app/shared/shared-video-playlist/video-add-to-playlist.component.html
index 6d787796a..f2f69236c 100644
--- a/client/src/app/shared/shared-video-playlist/video-add-to-playlist.component.html
+++ b/client/src/app/shared/shared-video-playlist/video-add-to-playlist.component.html
@@ -14,20 +14,20 @@
14 *ngFor="let playlist of videoPlaylists" 14 *ngFor="let playlist of videoPlaylists"
15 class="playlist dropdown-item" [ngClass]="{ 'has-optional-row': playlist.optionalRowDisplayed }" 15 class="playlist dropdown-item" [ngClass]="{ 'has-optional-row': playlist.optionalRowDisplayed }"
16 > 16 >
17 <div class="primary-row" (click)="toggleMainPlaylist($event, playlist)"> 17 <button class="primary-row button-unstyle" (click)="toggleMainPlaylist($event, playlist)">
18 <my-peertube-checkbox 18 <my-peertube-checkbox
19 [disabled]="isPresentMultipleTimes(playlist) || playlist.optionalRowDisplayed" [inputName]="getPrimaryInputName(playlist)" 19 [disabled]="isPresentMultipleTimes(playlist) || playlist.optionalRowDisplayed" [inputName]="getPrimaryInputName(playlist)"
20 [ngModel]="isPrimaryCheckboxChecked(playlist)" [onPushWorkaround]="true" 20 [ngModel]="isPrimaryCheckboxChecked(playlist)" [onPushWorkaround]="true"
21 ></my-peertube-checkbox> 21 ></my-peertube-checkbox>
22 22
23 <label class="display-name"> 23 <label [for]="getPrimaryInputName(playlist)" class="display-name">
24 {{ playlist.displayName }} 24 {{ playlist.displayName }}
25 </label> 25 </label>
26 26
27 <div class="optional-row-icon" *ngIf="isPrimaryCheckboxChecked(playlist)" (click)="$event.stopPropagation(); toggleOptionalRow(playlist)"> 27 <button class="optional-row-icon button-unstyle" *ngIf="isPrimaryCheckboxChecked(playlist)" (click)="$event.stopPropagation(); toggleOptionalRow(playlist)">
28 <my-global-icon iconName="add" aria-hidden="true"></my-global-icon> 28 <my-global-icon iconName="add" aria-hidden="true"></my-global-icon>
29 </div> 29 </button>
30 </div> 30 </button>
31 31
32 <div class="optional-rows" *ngIf="playlist.optionalRowDisplayed"> 32 <div class="optional-rows" *ngIf="playlist.optionalRowDisplayed">
33 <div class="header-label" i18n>Start at</div> 33 <div class="header-label" i18n>Start at</div>
@@ -58,11 +58,11 @@
58 </div> 58 </div>
59 </div> 59 </div>
60 60
61 <div class="new-playlist-button dropdown-item" (click)="openCreateBlock($event)" [hidden]="isNewPlaylistBlockOpened"> 61 <button class="new-playlist-button dropdown-item" (click)="openCreateBlock($event)" [hidden]="isNewPlaylistBlockOpened">
62 <my-global-icon iconName="add" aria-hidden="true"></my-global-icon> 62 <my-global-icon iconName="add" aria-hidden="true"></my-global-icon>
63 63
64 <span i18n>Create a private playlist</span> 64 <span i18n>Create a private playlist</span>
65 </div> 65 </button>
66 66
67 <form class="new-playlist-block dropdown-item" *ngIf="isNewPlaylistBlockOpened" (ngSubmit)="createPlaylist()" [formGroup]="form"> 67 <form class="new-playlist-block dropdown-item" *ngIf="isNewPlaylistBlockOpened" (ngSubmit)="createPlaylist()" [formGroup]="form">
68 <div class="form-group"> 68 <div class="form-group">
diff --git a/client/src/app/shared/shared-video-playlist/video-add-to-playlist.component.scss b/client/src/app/shared/shared-video-playlist/video-add-to-playlist.component.scss
index de2f1032b..d1aa95266 100644
--- a/client/src/app/shared/shared-video-playlist/video-add-to-playlist.component.scss
+++ b/client/src/app/shared/shared-video-playlist/video-add-to-playlist.component.scss
@@ -67,6 +67,8 @@
67 } 67 }
68 68
69 .optional-row-icon { 69 .optional-row-icon {
70 @include margin-left(5px);
71
70 display: flex; 72 display: flex;
71 align-items: center; 73 align-items: center;
72 font-size: 14px; 74 font-size: 14px;
@@ -79,6 +81,10 @@
79 width: 19px; 81 width: 19px;
80 height: 19px; 82 height: 19px;
81 } 83 }
84
85 &:hover {
86 opacity: 0.8;
87 }
82 } 88 }
83} 89}
84 90
diff --git a/client/src/app/shared/shared-video-playlist/video-playlist-element-miniature.component.html b/client/src/app/shared/shared-video-playlist/video-playlist-element-miniature.component.html
index 40c58166d..75afa0709 100644
--- a/client/src/app/shared/shared-video-playlist/video-playlist-element-miniature.component.html
+++ b/client/src/app/shared/shared-video-playlist/video-playlist-element-miniature.component.html
@@ -59,10 +59,10 @@
59 59
60 <div ngbDropdownMenu> 60 <div ngbDropdownMenu>
61 <ng-container *ngIf="playlistElement.video"> 61 <ng-container *ngIf="playlistElement.video">
62 <div class="dropdown-item" (click)="toggleDisplayTimestampsOptions($event, playlistElement)"> 62 <button ngbDropdownItem (click)="toggleDisplayTimestampsOptions($event, playlistElement)">
63 <my-global-icon iconName="edit" aria-hidden="true"></my-global-icon> 63 <my-global-icon iconName="edit" aria-hidden="true"></my-global-icon>
64 <ng-container i18n>Edit starts/stops at</ng-container> 64 <ng-container i18n>Edit starts/stops at</ng-container>
65 </div> 65 </button>
66 66
67 <div class="timestamp-options" *ngIf="displayTimestampOptions"> 67 <div class="timestamp-options" *ngIf="displayTimestampOptions">
68 <div> 68 <div>
@@ -97,10 +97,10 @@
97 </div> 97 </div>
98 </ng-container> 98 </ng-container>
99 99
100 <span class="dropdown-item" (click)="removeFromPlaylist(playlistElement)"> 100 <button ngbDropdownItem (click)="removeFromPlaylist(playlistElement)">
101 <my-global-icon iconName="delete" aria-hidden="true"></my-global-icon> 101 <my-global-icon iconName="delete" aria-hidden="true"></my-global-icon>
102 <ng-container i18n>Delete from {{ playlist?.displayName }}</ng-container> 102 <ng-container i18n>Delete from {{ playlist?.displayName }}</ng-container>
103 </span> 103 </button>
104 </div> 104 </div>
105 </div> 105 </div>
106</div> 106</div>
diff --git a/client/src/app/shared/shared-video-playlist/video-playlist-element-miniature.component.scss b/client/src/app/shared/shared-video-playlist/video-playlist-element-miniature.component.scss
index 0f085231c..cd9d0ce53 100644
--- a/client/src/app/shared/shared-video-playlist/video-playlist-element-miniature.component.scss
+++ b/client/src/app/shared/shared-video-playlist/video-playlist-element-miniature.component.scss
@@ -156,6 +156,7 @@ my-video-thumbnail,
156 @include padding-left(35px); 156 @include padding-left(35px);
157 157
158 padding-top: 0; 158 padding-top: 0;
159 margin-top: 5px;
159 margin-bottom: 15px; 160 margin-bottom: 15px;
160 161
161 > div { 162 > div {