diff --git a/client/src/app/+admin/admin.component.scss b/client/src/app/+admin/admin.component.scss
new file mode 100644
index 000000000..ef8965c3f
--- /dev/null
+++ b/client/src/app/+admin/admin.component.scss
@@ -0,0 +1,3 @@
+my-top-menu-dropdown {
+ flex-grow: 1;
+}
diff --git a/client/src/app/+admin/admin.component.ts b/client/src/app/+admin/admin.component.ts
index e47c7a8f4..c1c160ad1 100644
--- a/client/src/app/+admin/admin.component.ts
+++ b/client/src/app/+admin/admin.component.ts
@@ -3,12 +3,15 @@ import { AuthService } from '@app/core'
import { ListOverflowItem } from '@app/shared/shared-main'
import { I18n } from '@ngx-translate/i18n-polyfill'
import { UserRight } from '@shared/models'
+import { TopMenuDropdownParam } from '@app/shared/shared-main/misc/top-menu-dropdown.component'
@Component({
- templateUrl: './admin.component.html'
+ templateUrl: './admin.component.html',
+ styleUrls: [ './admin.component.scss' ]
})
export class AdminComponent implements OnInit {
items: ListOverflowItem[] = []
+ menuEntries: TopMenuDropdownParam[] = []
constructor (
private auth: AuthService,
@@ -16,12 +19,58 @@ export class AdminComponent implements OnInit {
) {}
ngOnInit () {
- if (this.hasUsersRight()) this.items.push({ label: this.i18n('Users'), routerLink: '/admin/users' })
- if (this.hasServerFollowRight()) this.items.push({ label: this.i18n('Follows & redundancies'), routerLink: '/admin/follows' })
- if (this.hasVideoAbusesRight() || this.hasVideoBlocklistRight()) this.items.push({ label: this.i18n('Moderation'), routerLink: '/admin/moderation' })
- if (this.hasConfigRight()) this.items.push({ label: this.i18n('Configuration'), routerLink: '/admin/config' })
- if (this.hasPluginsRight()) this.items.push({ label: this.i18n('Plugins/Themes'), routerLink: '/admin/plugins' })
- if (this.hasJobsRight() || this.hasLogsRight() || this.hasDebugRight()) this.items.push({ label: this.i18n('System'), routerLink: '/admin/system' })
+ const federationItems: TopMenuDropdownParam = {
+ label: this.i18n('Federation'),
+ children: [
+ {
+ label: this.i18n('Instances you follow'),
+ routerLink: '/admin/follows/following-list',
+ iconName: 'sign-out'
+ },
+ {
+ label: this.i18n('Instances following you'),
+ routerLink: '/admin/follows/followers-list',
+ iconName: 'sign-in'
+ },
+ {
+ label: this.i18n('Video redundancies'),
+ routerLink: '/admin/follows/video-redundancies-list',
+ iconName: 'videos'
+ }
+ ]
+ }
+
+ const moderationItems: TopMenuDropdownParam = {
+ label: this.i18n('Moderation'),
+ children: []
+ }
+ if (this.hasVideoAbusesRight()) moderationItems.children.push({
+ label: this.i18n('Video reports'),
+ routerLink: '/admin/moderation/video-abuses/list',
+ iconName: 'flag'
+ })
+ if (this.hasVideoBlocklistRight()) moderationItems.children.push({
+ label: this.i18n('Video blocks'),
+ routerLink: '/admin/moderation/video-blocks/list',
+ iconName: 'cross'
+ })
+ if (this.hasAccountsBlocklistRight()) moderationItems.children.push({
+ label: this.i18n('Muted accounts'),
+ routerLink: '/admin/moderation/blocklist/accounts',
+ iconName: 'user'
+ })
+ if (this.hasServersBlocklistRight()) moderationItems.children.push({
+ label: this.i18n('Muted servers'),
+ routerLink: '/admin/moderation/blocklist/servers',
+ iconName: 'server'
+ })
+
+ if (this.hasUsersRight()) this.menuEntries.push({ label: this.i18n('Users'), routerLink: '/admin/users' })
+ if (this.hasServerFollowRight()) this.menuEntries.push(federationItems)
+ if (this.hasVideoAbusesRight() || this.hasVideoBlocklistRight()) this.menuEntries.push(moderationItems)
+ if (this.hasConfigRight()) this.menuEntries.push({ label: this.i18n('Configuration'), routerLink: '/admin/config' })
+ if (this.hasPluginsRight()) this.menuEntries.push({ label: this.i18n('Plugins/Themes'), routerLink: '/admin/plugins' })
+ if (this.hasJobsRight() || this.hasLogsRight() || this.hasDebugRight()) this.menuEntries.push({ label: this.i18n('System'), routerLink: '/admin/system' })
}
hasUsersRight () {
@@ -40,6 +89,14 @@ export class AdminComponent implements OnInit {
return this.auth.getUser().hasRight(UserRight.MANAGE_VIDEO_BLACKLIST)
}
+ hasAccountsBlocklistRight () {
+ return this.auth.getUser().hasRight(UserRight.MANAGE_ACCOUNTS_BLOCKLIST)
+ }
+
+ hasServersBlocklistRight () {
+ return this.auth.getUser().hasRight(UserRight.MANAGE_SERVERS_BLOCKLIST)
+ }
+
hasConfigRight () {
return this.auth.getUser().hasRight(UserRight.MANAGE_CONFIGURATION)
}
diff --git a/client/src/app/+admin/follows/follows.component.html b/client/src/app/+admin/follows/follows.component.html
index 8c3129394..0680b43f9 100644
--- a/client/src/app/+admin/follows/follows.component.html
+++ b/client/src/app/+admin/follows/follows.component.html
@@ -1,13 +1 @@
-
-
diff --git a/client/src/app/+admin/moderation/moderation.component.html b/client/src/app/+admin/moderation/moderation.component.html
index 7bab63c33..90c6b6463 100644
--- a/client/src/app/+admin/moderation/moderation.component.html
+++ b/client/src/app/+admin/moderation/moderation.component.html
@@ -1,15 +1 @@
-
-
\ No newline at end of file
diff --git a/client/src/app/+admin/moderation/moderation.component.ts b/client/src/app/+admin/moderation/moderation.component.ts
index 806f9d100..b0f5eb224 100644
--- a/client/src/app/+admin/moderation/moderation.component.ts
+++ b/client/src/app/+admin/moderation/moderation.component.ts
@@ -1,6 +1,5 @@
import { Component, OnInit } from '@angular/core'
-import { AuthService, ServerService } from '@app/core'
-import { UserRight } from '@shared/models'
+import { ServerService } from '@app/core'
@Component({
templateUrl: './moderation.component.html',
@@ -10,29 +9,11 @@ export class ModerationComponent implements OnInit {
autoBlockVideosEnabled = false
constructor (
- private auth: AuthService,
private serverService: ServerService
) { }
ngOnInit (): void {
this.serverService.getConfig()
.subscribe(config => this.autoBlockVideosEnabled = config.autoBlacklist.videos.ofUsers.enabled)
-
- }
-
- hasVideoAbusesRight () {
- return this.auth.getUser().hasRight(UserRight.MANAGE_VIDEO_ABUSES)
- }
-
- hasVideoBlocklistRight () {
- return this.auth.getUser().hasRight(UserRight.MANAGE_VIDEO_BLACKLIST)
- }
-
- hasAccountsBlocklistRight () {
- return this.auth.getUser().hasRight(UserRight.MANAGE_ACCOUNTS_BLOCKLIST)
- }
-
- hasServersBlocklistRight () {
- return this.auth.getUser().hasRight(UserRight.MANAGE_SERVERS_BLOCKLIST)
}
}
diff --git a/client/src/app/+my-account/my-account.component.ts b/client/src/app/+my-account/my-account.component.ts
index 85b2795c5..abc823c62 100644
--- a/client/src/app/+my-account/my-account.component.ts
+++ b/client/src/app/+my-account/my-account.component.ts
@@ -2,7 +2,7 @@ import { Component, OnInit } from '@angular/core'
import { ServerService } from '@app/core'
import { I18n } from '@ngx-translate/i18n-polyfill'
import { ServerConfig } from '@shared/models'
-import { TopMenuDropdownParam } from './top-menu-dropdown.component'
+import { TopMenuDropdownParam } from '../shared/shared-main/misc/top-menu-dropdown.component'
@Component({
selector: 'my-my-account',
diff --git a/client/src/app/+my-account/my-account.module.ts b/client/src/app/+my-account/my-account.module.ts
index 8604b8b60..0ce243844 100644
--- a/client/src/app/+my-account/my-account.module.ts
+++ b/client/src/app/+my-account/my-account.module.ts
@@ -33,7 +33,6 @@ import { MyAccountVideoPlaylistsComponent } from './my-account-video-playlists/m
import { MyAccountVideosComponent } from './my-account-videos/my-account-videos.component'
import { VideoChangeOwnershipComponent } from './my-account-videos/video-change-ownership/video-change-ownership.component'
import { MyAccountComponent } from './my-account.component'
-import { TopMenuDropdownComponent } from './top-menu-dropdown.component'
@NgModule({
imports: [
@@ -79,8 +78,6 @@ import { TopMenuDropdownComponent } from './top-menu-dropdown.component'
MyAccountVideoPlaylistUpdateComponent,
MyAccountVideoPlaylistsComponent,
MyAccountVideoPlaylistElementsComponent,
-
- TopMenuDropdownComponent
],
exports: [
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 75ab9e8f5..7f7315f06 100644
--- a/client/src/app/shared/shared-icons/global-icon.component.ts
+++ b/client/src/app/shared/shared-icons/global-icon.component.ts
@@ -34,6 +34,7 @@ const icons = {
'delete': require('!!raw-loader?!../../../assets/images/feather/delete.svg').default,
'inbox-full': require('!!raw-loader?!../../../assets/images/feather/inbox-full.svg').default,
'sign-out': require('!!raw-loader?!../../../assets/images/feather/log-out.svg').default,
+ 'sign-in': require('!!raw-loader?!../../../assets/images/feather/log-in.svg').default,
'download': require('!!raw-loader?!../../../assets/images/feather/download.svg').default,
'ownership-change': require('!!raw-loader?!../../../assets/images/feather/share.svg').default,
'share': require('!!raw-loader?!../../../assets/images/feather/share-2.svg').default,
diff --git a/client/src/app/shared/shared-main/misc/index.ts b/client/src/app/shared/shared-main/misc/index.ts
index d3e7e4be7..e806fd2f2 100644
--- a/client/src/app/shared/shared-main/misc/index.ts
+++ b/client/src/app/shared/shared-main/misc/index.ts
@@ -1,2 +1,3 @@
export * from './help.component'
export * from './list-overflow.component'
+export * from './top-menu-dropdown.component'
diff --git a/client/src/app/+my-account/top-menu-dropdown.component.html b/client/src/app/shared/shared-main/misc/top-menu-dropdown.component.html
similarity index 100%
rename from client/src/app/+my-account/top-menu-dropdown.component.html
rename to client/src/app/shared/shared-main/misc/top-menu-dropdown.component.html
diff --git a/client/src/app/+my-account/top-menu-dropdown.component.scss b/client/src/app/shared/shared-main/misc/top-menu-dropdown.component.scss
similarity index 100%
rename from client/src/app/+my-account/top-menu-dropdown.component.scss
rename to client/src/app/shared/shared-main/misc/top-menu-dropdown.component.scss
diff --git a/client/src/app/+my-account/top-menu-dropdown.component.ts b/client/src/app/shared/shared-main/misc/top-menu-dropdown.component.ts
similarity index 100%
rename from client/src/app/+my-account/top-menu-dropdown.component.ts
rename to client/src/app/shared/shared-main/misc/top-menu-dropdown.component.ts
diff --git a/client/src/app/shared/shared-main/shared-main.module.ts b/client/src/app/shared/shared-main/shared-main.module.ts
index fd96a42a0..04e3eb0af 100644
--- a/client/src/app/shared/shared-main/shared-main.module.ts
+++ b/client/src/app/shared/shared-main/shared-main.module.ts
@@ -25,7 +25,7 @@ import { ActionDropdownComponent, ButtonComponent, DeleteButtonComponent, EditBu
import { DateToggleComponent } from './date'
import { FeedComponent } from './feeds'
import { LoaderComponent, SmallLoaderComponent } from './loaders'
-import { HelpComponent, ListOverflowComponent } from './misc'
+import { HelpComponent, ListOverflowComponent, TopMenuDropdownComponent } from './misc'
import { UserHistoryService, UserNotificationsComponent, UserNotificationService } from './users'
import { RedundancyService, VideoImportService, VideoOwnershipService, VideoService } from './video'
import { VideoCaptionService } from './video-caption'
@@ -81,10 +81,9 @@ import { AUTH_INTERCEPTOR_PROVIDER } from './auth'
HelpComponent,
ListOverflowComponent,
+ TopMenuDropdownComponent,
UserNotificationsComponent,
-
- FeedComponent
],
exports: [
@@ -131,10 +130,9 @@ import { AUTH_INTERCEPTOR_PROVIDER } from './auth'
HelpComponent,
ListOverflowComponent,
+ TopMenuDropdownComponent,
- UserNotificationsComponent,
-
- FeedComponent
+ UserNotificationsComponent
],
providers: [
diff --git a/client/src/assets/images/feather/log-in.svg b/client/src/assets/images/feather/log-in.svg
new file mode 100644
index 000000000..ba0da59a1
--- /dev/null
+++ b/client/src/assets/images/feather/log-in.svg
@@ -0,0 +1 @@
+
\ No newline at end of file