Notification preferences
</a>
- <button (click)="markAllAsRead()" i18n>
- <my-global-icon iconName="circle-tick"></my-global-icon>
- Mark all as read
+ <button class="btn" [disabled]="!getUnreadNotifications()" (click)="markAllAsRead()">
+ <my-global-icon *ngIf="getUnreadNotifications()" iconName="inbox-full"></my-global-icon>
+ <span i18n *ngIf="getUnreadNotifications()">Mark all as read</span>
+
+ <my-global-icon *ngIf="!getUnreadNotifications()" iconName="circle-tick"></my-global-icon>
+ <span i18n *ngIf="!getUnreadNotifications()">All read</span>
</button>
</div>
markAllAsRead () {
this.userNotification.markAllAsRead()
}
+
+ getUnreadNotifications () {
+ return this.userNotification.notifications.filter(n => n.read === false).length
+ }
}
<div class="notifications-header">
<div i18n>Notifications</div>
- <a
- i18n-title title="Update your notification preferences" class="glyphicon glyphicon-cog"
- routerLink="/my-account/settings" fragment="notifications"
- ></a>
+ <div>
+ <button
+ *ngIf="unreadNotifications"
+ i18n-title title="Mark all as read" class="glyphicon glyphicon-inbox mr-2"
+ (click)="markAllAsRead()"
+ ></button>
+ <a
+ i18n-title title="Update your notification preferences" class="glyphicon glyphicon-cog"
+ routerLink="/my-account/settings" fragment="notifications"
+ ></a>
+ </div>
</div>
<div *ngIf="!loaded" class="loader">
(notificationsLoaded)="onNotificationLoaded()"
></my-user-notifications>
- <a *ngIf="loaded" class="all-notifications" routerLink="/my-account/notifications" i18n>See all your notifications</a>
+ <a *ngIf="loaded" class="all-notifications" routerLink="/my-account/notifications">
+ <my-global-icon class="mr-1" iconName="inbox-full"></my-global-icon>
+ <span i18n>See all your notifications</span>
+ </a>
</div>
</ng-template>
::ng-deep {
.popover-notifications.popover {
max-width: none;
+ left: 7px !important;
.popover-body {
padding: 0;
font-size: 14px;
font-family: $main-fonts;
- overflow-y: scroll;
width: 400px;
box-shadow: 0 6px 14px rgba(0, 0, 0, 0.30);
.content {
max-height: 150px;
transition: max-height 0.15s ease-out;
+ display: flex;
+ height: 500px;
+ flex-direction: column;
&.loaded {
max-height: 500px;
}
+
+ & > my-user-notifications:nth-child(2) {
+ overflow-y: auto;
+ }
}
.notifications-header {
a {
@include disable-default-a-behaviour;
+ }
+
+ button {
+ @include peertube-button;
+
+ padding: 0;
+ background: transparent;
+ }
+ a, button {
color: rgba(20, 20, 20, 0.5);
- &:hover {
+ &:hover:not(:disabled) {
color: rgba(20, 20, 20, 0.8);
}
}
font-weight: $font-semibold;
color: $fg-color;
padding: 7px 0;
+ margin-top: auto;
+ text-decoration: none;
}
}
}
@media screen and (max-width: $mobile-view) {
::ng-deep {
- .popover-notifications.popover .popover-body {
- width: 400px;
+ .popover-notifications.popover {
+ left: unset !important;
+
+ .arrow {
+ left: calc(2em + 7px);
+ }
+
+ .popover-body {
+ width: 100vw;
+ }
}
}
}
this.loaded = true
}
+ markAllAsRead () {
+ this.userNotificationService.markAllAsRead()
+ }
+
private async subscribeToNotifications () {
const obs = await this.userNotificationSocket.getMyNotificationsSocket()
'validate': require('!!raw-loader?!../../../assets/images/global/validate.svg'),
'tick': require('!!raw-loader?!../../../assets/images/global/tick.svg'),
'repeat': require('!!raw-loader?!../../../assets/images/global/repeat.svg'),
+ 'inbox-full': require('!!raw-loader?!../../../assets/images/global/inbox-full.svg'),
'dislike': require('!!raw-loader?!../../../assets/images/video/dislike.svg'),
'support': require('!!raw-loader?!../../../assets/images/video/support.svg'),
'like': require('!!raw-loader?!../../../assets/images/video/like.svg'),
::ng-deep .other-videos {
padding-left: 15px;
+ min-width: $video-miniature-width;
.title-page {
margin: 0 !important;
this.zone.runOutsideAngular(async () => {
this.player = await PeertubePlayerManager.initialize(playerMode, playerOptions, player => this.player = player)
this.player.focus()
- this.player.bezels()
this.player.on('customError', ({ err }: { err: any }) => this.handleError(err))
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <defs></defs>
+ <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+ <g id="Artboard-4" transform="translate(-356.000000, -1046.000000)">
+ <g id="Extras" transform="translate(48.000000, 1046.000000)">
+ <g id="inbox-full" transform="translate(308.000000, 0.000000)">
+ <path d="M7.41604369,14 L3,14 L2,14 L2,15 L2,20.009222 C2,21.1033032 2.89446021,22 3.99339768,22 L20.0066023,22 C21.1067838,22 22,21.1092551 22,20.009222 L22,15 L22,14 L21,14 L16.5839563,14 L15.9295922,14 L15.6676034,14.5996284 C15.0357833,16.0457106 13.6054999,17 12,17 C10.3945001,17 8.96421673,16.0457106 8.33239655,14.5996284 L8.07040776,14 L7.41604369,14 Z" id="Front" stroke="#333333" stroke-width="2" stroke-linejoin="round"></path>
+ <path d="M2,15.5000001 L2,13.0001355 L5.63085938,3.9134128 C5.83473011,3.40319837 6.44341249,2.98958785 7.00723108,2.98958785 L17.0497215,2.98958785 C17.6059998,2.98958785 18.223735,3.40698372 18.4260932,3.91341276 L22.0569525,13.000135 L22,15" id="Back" stroke="#333333" stroke-width="2" stroke-linejoin="round"></path>
+ <path d="M6,9 L18,9 L18,10 L6,10 L6,9 Z M5,11 L19,11 L19,12 L5,12 L5,11 Z M7,7 L17,7 L17,8 L7,8 L7,7 Z M8,5 L16,5 L16,6 L8,6 L8,5 Z" id="Combined-Shape" fill="#333333"></path>
+ </g>
+ </g>
+ </g>
+ </g>
+</svg>
\ No newline at end of file
self.addContextMenu(mode, player, options.common.embedUrl)
+ player.bezels()
+
return res(player)
})
})