diff options
author | Chocobozzz <florian.bigard@gmail.com> | 2017-11-15 10:10:41 +0100 |
---|---|---|
committer | Chocobozzz <florian.bigard@gmail.com> | 2017-11-27 19:40:51 +0100 |
commit | 51548b31815c6f96f314ae96588a9adca150519d (patch) | |
tree | b3298447b7ac128823016fdec92d083e07d9432e /client | |
parent | 350e31d6b64e4973dfa5e9f7b46841cb09aeb1ad (diff) | |
download | PeerTube-51548b31815c6f96f314ae96588a9adca150519d.tar.gz PeerTube-51548b31815c6f96f314ae96588a9adca150519d.tar.zst PeerTube-51548b31815c6f96f314ae96588a9adca150519d.zip |
Add follow tabs
Following
Follow
Followers
Diffstat (limited to 'client')
31 files changed, 299 insertions, 222 deletions
diff --git a/client/src/app/+admin/admin-routing.module.ts b/client/src/app/+admin/admin-routing.module.ts index 88f44a811..cd8b9bdef 100644 --- a/client/src/app/+admin/admin-routing.module.ts +++ b/client/src/app/+admin/admin-routing.module.ts | |||
@@ -4,7 +4,7 @@ import { RouterModule, Routes } from '@angular/router' | |||
4 | import { MetaGuard } from '@ngx-meta/core' | 4 | import { MetaGuard } from '@ngx-meta/core' |
5 | 5 | ||
6 | import { AdminComponent } from './admin.component' | 6 | import { AdminComponent } from './admin.component' |
7 | import { FriendsRoutes } from './friends' | 7 | import { FollowsRoutes } from './follows' |
8 | import { UsersRoutes } from './users' | 8 | import { UsersRoutes } from './users' |
9 | import { VideoAbusesRoutes } from './video-abuses' | 9 | import { VideoAbusesRoutes } from './video-abuses' |
10 | import { VideoBlacklistRoutes } from './video-blacklist' | 10 | import { VideoBlacklistRoutes } from './video-blacklist' |
@@ -21,7 +21,7 @@ const adminRoutes: Routes = [ | |||
21 | redirectTo: 'users', | 21 | redirectTo: 'users', |
22 | pathMatch: 'full' | 22 | pathMatch: 'full' |
23 | }, | 23 | }, |
24 | ...FriendsRoutes, | 24 | ...FollowsRoutes, |
25 | ...UsersRoutes, | 25 | ...UsersRoutes, |
26 | ...VideoAbusesRoutes, | 26 | ...VideoAbusesRoutes, |
27 | ...VideoBlacklistRoutes | 27 | ...VideoBlacklistRoutes |
diff --git a/client/src/app/+admin/admin.module.ts b/client/src/app/+admin/admin.module.ts index 32f6c42a6..3c6b7a793 100644 --- a/client/src/app/+admin/admin.module.ts +++ b/client/src/app/+admin/admin.module.ts | |||
@@ -1,25 +1,28 @@ | |||
1 | import { NgModule } from '@angular/core' | 1 | import { NgModule } from '@angular/core' |
2 | 2 | import { TabsModule } from 'ngx-bootstrap/tabs' | |
3 | import { AdminComponent } from './admin.component' | 3 | import { SharedModule } from '../shared' |
4 | import { AdminRoutingModule } from './admin-routing.module' | 4 | import { AdminRoutingModule } from './admin-routing.module' |
5 | import { FriendsComponent, FriendAddComponent, FriendListComponent, FriendService } from './friends' | 5 | import { AdminComponent } from './admin.component' |
6 | import { UsersComponent, UserAddComponent, UserUpdateComponent, UserListComponent, UserService } from './users' | 6 | import { FollowersListComponent, FollowingAddComponent, FollowsComponent, FollowService } from './follows' |
7 | import { VideoAbusesComponent, VideoAbuseListComponent } from './video-abuses' | 7 | import { FollowingListComponent } from './follows/following-list/following-list.component' |
8 | import { UserAddComponent, UserListComponent, UsersComponent, UserService, UserUpdateComponent } from './users' | ||
9 | import { VideoAbuseListComponent, VideoAbusesComponent } from './video-abuses' | ||
8 | import { VideoBlacklistComponent, VideoBlacklistListComponent } from './video-blacklist' | 10 | import { VideoBlacklistComponent, VideoBlacklistListComponent } from './video-blacklist' |
9 | import { SharedModule } from '../shared' | ||
10 | 11 | ||
11 | @NgModule({ | 12 | @NgModule({ |
12 | imports: [ | 13 | imports: [ |
13 | AdminRoutingModule, | 14 | AdminRoutingModule, |
15 | TabsModule.forRoot(), | ||
14 | SharedModule | 16 | SharedModule |
15 | ], | 17 | ], |
16 | 18 | ||
17 | declarations: [ | 19 | declarations: [ |
18 | AdminComponent, | 20 | AdminComponent, |
19 | 21 | ||
20 | FriendsComponent, | 22 | FollowsComponent, |
21 | FriendAddComponent, | 23 | FollowingAddComponent, |
22 | FriendListComponent, | 24 | FollowersListComponent, |
25 | FollowingListComponent, | ||
23 | 26 | ||
24 | UsersComponent, | 27 | UsersComponent, |
25 | UserAddComponent, | 28 | UserAddComponent, |
@@ -38,7 +41,7 @@ import { SharedModule } from '../shared' | |||
38 | ], | 41 | ], |
39 | 42 | ||
40 | providers: [ | 43 | providers: [ |
41 | FriendService, | 44 | FollowService, |
42 | UserService | 45 | UserService |
43 | ] | 46 | ] |
44 | }) | 47 | }) |
diff --git a/client/src/app/+admin/follows/followers-list/followers-list.component.html b/client/src/app/+admin/follows/followers-list/followers-list.component.html new file mode 100644 index 000000000..24d75d2b3 --- /dev/null +++ b/client/src/app/+admin/follows/followers-list/followers-list.component.html | |||
@@ -0,0 +1,16 @@ | |||
1 | <div class="row"> | ||
2 | <div class="content-padding"> | ||
3 | <h3>Followers list</h3> | ||
4 | |||
5 | <p-dataTable | ||
6 | [value]="followers" [lazy]="true" [paginator]="true" [totalRecords]="totalRecords" [rows]="rowsPerPage" | ||
7 | sortField="createdAt" (onLazyLoad)="loadLazy($event)" | ||
8 | > | ||
9 | <p-column field="id" header="ID"></p-column> | ||
10 | <p-column field="host" header="Host"></p-column> | ||
11 | <p-column field="email" header="Email"></p-column> | ||
12 | <p-column field="score" header="Score"></p-column> | ||
13 | <p-column field="createdAt" header="Created date" [sortable]="true"></p-column> | ||
14 | </p-dataTable> | ||
15 | </div> | ||
16 | </div> | ||
diff --git a/client/src/app/+admin/friends/friend-list/friend-list.component.scss b/client/src/app/+admin/follows/followers-list/followers-list.component.scss index 0a0f621c6..0a0f621c6 100644 --- a/client/src/app/+admin/friends/friend-list/friend-list.component.scss +++ b/client/src/app/+admin/follows/followers-list/followers-list.component.scss | |||
diff --git a/client/src/app/+admin/follows/followers-list/followers-list.component.ts b/client/src/app/+admin/follows/followers-list/followers-list.component.ts new file mode 100644 index 000000000..208a0c648 --- /dev/null +++ b/client/src/app/+admin/follows/followers-list/followers-list.component.ts | |||
@@ -0,0 +1,41 @@ | |||
1 | import { Component, OnInit } from '@angular/core' | ||
2 | |||
3 | import { NotificationsService } from 'angular2-notifications' | ||
4 | import { SortMeta } from 'primeng/primeng' | ||
5 | |||
6 | import { ConfirmService } from '../../../core' | ||
7 | import { RestTable, RestPagination } from '../../../shared' | ||
8 | import { Pod } from '../../../../../../shared' | ||
9 | import { FollowService } from '../shared' | ||
10 | |||
11 | @Component({ | ||
12 | selector: 'my-followers-list', | ||
13 | templateUrl: './followers-list.component.html', | ||
14 | styleUrls: [ './followers-list.component.scss' ] | ||
15 | }) | ||
16 | export class FollowersListComponent extends RestTable { | ||
17 | followers: Pod[] = [] | ||
18 | totalRecords = 0 | ||
19 | rowsPerPage = 10 | ||
20 | sort: SortMeta = { field: 'createdAt', order: 1 } | ||
21 | pagination: RestPagination = { count: this.rowsPerPage, start: 0 } | ||
22 | |||
23 | constructor ( | ||
24 | private notificationsService: NotificationsService, | ||
25 | private followService: FollowService | ||
26 | ) { | ||
27 | super() | ||
28 | } | ||
29 | |||
30 | protected loadData () { | ||
31 | this.followService.getFollowers(this.pagination, this.sort) | ||
32 | .subscribe( | ||
33 | resultList => { | ||
34 | this.followers = resultList.data | ||
35 | this.totalRecords = resultList.total | ||
36 | }, | ||
37 | |||
38 | err => this.notificationsService.error('Error', err.message) | ||
39 | ) | ||
40 | } | ||
41 | } | ||
diff --git a/client/src/app/+admin/follows/followers-list/index.ts b/client/src/app/+admin/follows/followers-list/index.ts new file mode 100644 index 000000000..15390cfbe --- /dev/null +++ b/client/src/app/+admin/follows/followers-list/index.ts | |||
@@ -0,0 +1 @@ | |||
export * from './followers-list.component' | |||
diff --git a/client/src/app/+admin/friends/friend-add/friend-add.component.html b/client/src/app/+admin/follows/following-add/following-add.component.html index 81d8291cd..111f6a8de 100644 --- a/client/src/app/+admin/friends/friend-add/friend-add.component.html +++ b/client/src/app/+admin/follows/following-add/following-add.component.html | |||
@@ -1,11 +1,11 @@ | |||
1 | <div class="row"> | 1 | <div class="row"> |
2 | <div class="content-padding"> | 2 | <div class="content-padding"> |
3 | 3 | ||
4 | <h3>Make friends</h3> | 4 | <h3>Add following</h3> |
5 | 5 | ||
6 | <div *ngIf="error" class="alert alert-danger">{{ error }}</div> | 6 | <div *ngIf="error" class="alert alert-danger">{{ error }}</div> |
7 | 7 | ||
8 | <form (ngSubmit)="makeFriends()" [formGroup]="form"> | 8 | <form (ngSubmit)="addFollowing()" [formGroup]="form"> |
9 | <div class="form-group" *ngFor="let host of hosts; let id = index; trackBy:customTrackBy"> | 9 | <div class="form-group" *ngFor="let host of hosts; let id = index; trackBy:customTrackBy"> |
10 | <label [for]="'host-' + id">Host (so without "http://")</label> | 10 | <label [for]="'host-' + id">Host (so without "http://")</label> |
11 | 11 | ||
@@ -26,10 +26,10 @@ | |||
26 | </div> | 26 | </div> |
27 | 27 | ||
28 | <div *ngIf="canMakeFriends() === false" class="alert alert-warning"> | 28 | <div *ngIf="canMakeFriends() === false" class="alert alert-warning"> |
29 | It seems that you are not on a HTTPS pod. Your webserver need to have TLS activated in order to make friends. | 29 | It seems that you are not on a HTTPS pod. Your webserver need to have TLS activated in order to follow servers. |
30 | </div> | 30 | </div> |
31 | 31 | ||
32 | <input type="submit" value="Make friends" class="btn btn-default" [disabled]="!isFormValid()"> | 32 | <input type="submit" value="Add following" class="btn btn-default" [disabled]="!isFormValid()"> |
33 | </form> | 33 | </form> |
34 | </div> | 34 | </div> |
35 | </div> | 35 | </div> |
diff --git a/client/src/app/+admin/friends/friend-add/friend-add.component.scss b/client/src/app/+admin/follows/following-add/following-add.component.scss index 5fde51636..5fde51636 100644 --- a/client/src/app/+admin/friends/friend-add/friend-add.component.scss +++ b/client/src/app/+admin/follows/following-add/following-add.component.scss | |||
diff --git a/client/src/app/+admin/friends/friend-add/friend-add.component.ts b/client/src/app/+admin/follows/following-add/following-add.component.ts index 29ed23e0c..d95d6afa9 100644 --- a/client/src/app/+admin/friends/friend-add/friend-add.component.ts +++ b/client/src/app/+admin/follows/following-add/following-add.component.ts | |||
@@ -6,14 +6,14 @@ import { NotificationsService } from 'angular2-notifications' | |||
6 | 6 | ||
7 | import { ConfirmService } from '../../../core' | 7 | import { ConfirmService } from '../../../core' |
8 | import { validateHost } from '../../../shared' | 8 | import { validateHost } from '../../../shared' |
9 | import { FriendService } from '../shared' | 9 | import { FollowService } from '../shared' |
10 | 10 | ||
11 | @Component({ | 11 | @Component({ |
12 | selector: 'my-friend-add', | 12 | selector: 'my-following-add', |
13 | templateUrl: './friend-add.component.html', | 13 | templateUrl: './following-add.component.html', |
14 | styleUrls: [ './friend-add.component.scss' ] | 14 | styleUrls: [ './following-add.component.scss' ] |
15 | }) | 15 | }) |
16 | export class FriendAddComponent implements OnInit { | 16 | export class FollowingAddComponent implements OnInit { |
17 | form: FormGroup | 17 | form: FormGroup |
18 | hosts: string[] = [ ] | 18 | hosts: string[] = [ ] |
19 | error: string = null | 19 | error: string = null |
@@ -22,7 +22,7 @@ export class FriendAddComponent implements OnInit { | |||
22 | private router: Router, | 22 | private router: Router, |
23 | private notificationsService: NotificationsService, | 23 | private notificationsService: NotificationsService, |
24 | private confirmService: ConfirmService, | 24 | private confirmService: ConfirmService, |
25 | private friendService: FriendService | 25 | private followService: FollowService |
26 | ) {} | 26 | ) {} |
27 | 27 | ||
28 | ngOnInit () { | 28 | ngOnInit () { |
@@ -72,7 +72,7 @@ export class FriendAddComponent implements OnInit { | |||
72 | this.hosts.splice(index, 1) | 72 | this.hosts.splice(index, 1) |
73 | } | 73 | } |
74 | 74 | ||
75 | makeFriends () { | 75 | addFollowing () { |
76 | this.error = '' | 76 | this.error = '' |
77 | 77 | ||
78 | const notEmptyHosts = this.getNotEmptyHosts() | 78 | const notEmptyHosts = this.getNotEmptyHosts() |
@@ -87,13 +87,13 @@ export class FriendAddComponent implements OnInit { | |||
87 | } | 87 | } |
88 | 88 | ||
89 | const confirmMessage = 'Are you sure to make friends with:<br /> - ' + notEmptyHosts.join('<br /> - ') | 89 | const confirmMessage = 'Are you sure to make friends with:<br /> - ' + notEmptyHosts.join('<br /> - ') |
90 | this.confirmService.confirm(confirmMessage, 'Make friends').subscribe( | 90 | this.confirmService.confirm(confirmMessage, 'Follow new server(s)').subscribe( |
91 | res => { | 91 | res => { |
92 | if (res === false) return | 92 | if (res === false) return |
93 | 93 | ||
94 | this.friendService.follow(notEmptyHosts).subscribe( | 94 | this.followService.follow(notEmptyHosts).subscribe( |
95 | status => { | 95 | status => { |
96 | this.notificationsService.success('Success', 'Make friends request sent!') | 96 | this.notificationsService.success('Success', 'Follow request(s) sent!') |
97 | // Wait requests between pods | 97 | // Wait requests between pods |
98 | setTimeout(() => this.router.navigate([ '/admin/friends/list' ]), 1000) | 98 | setTimeout(() => this.router.navigate([ '/admin/friends/list' ]), 1000) |
99 | }, | 99 | }, |
diff --git a/client/src/app/+admin/follows/following-add/index.ts b/client/src/app/+admin/follows/following-add/index.ts new file mode 100644 index 000000000..1b1897ffa --- /dev/null +++ b/client/src/app/+admin/follows/following-add/index.ts | |||
@@ -0,0 +1 @@ | |||
export * from './following-add.component' | |||
diff --git a/client/src/app/+admin/follows/following-list/following-list.component.html b/client/src/app/+admin/follows/following-list/following-list.component.html new file mode 100644 index 000000000..fbcebfaa7 --- /dev/null +++ b/client/src/app/+admin/follows/following-list/following-list.component.html | |||
@@ -0,0 +1,16 @@ | |||
1 | <div class="row"> | ||
2 | <div class="content-padding"> | ||
3 | <h3>Following list</h3> | ||
4 | |||
5 | <p-dataTable | ||
6 | [value]="following" [lazy]="true" [paginator]="true" [totalRecords]="totalRecords" [rows]="rowsPerPage" | ||
7 | sortField="createdAt" (onLazyLoad)="loadLazy($event)" | ||
8 | > | ||
9 | <p-column field="id" header="ID"></p-column> | ||
10 | <p-column field="host" header="Host"></p-column> | ||
11 | <p-column field="email" header="Email"></p-column> | ||
12 | <p-column field="score" header="Score"></p-column> | ||
13 | <p-column field="createdAt" header="Created date" [sortable]="true"></p-column> | ||
14 | </p-dataTable> | ||
15 | </div> | ||
16 | </div> | ||
diff --git a/client/src/app/+admin/follows/following-list/following-list.component.ts b/client/src/app/+admin/follows/following-list/following-list.component.ts new file mode 100644 index 000000000..7d2c5084b --- /dev/null +++ b/client/src/app/+admin/follows/following-list/following-list.component.ts | |||
@@ -0,0 +1,40 @@ | |||
1 | import { Component, OnInit } from '@angular/core' | ||
2 | |||
3 | import { NotificationsService } from 'angular2-notifications' | ||
4 | import { SortMeta } from 'primeng/primeng' | ||
5 | |||
6 | import { ConfirmService } from '../../../core' | ||
7 | import { RestTable, RestPagination } from '../../../shared' | ||
8 | import { Pod } from '../../../../../../shared' | ||
9 | import { FollowService } from '../shared' | ||
10 | |||
11 | @Component({ | ||
12 | selector: 'my-followers-list', | ||
13 | templateUrl: './following-list.component.html' | ||
14 | }) | ||
15 | export class FollowingListComponent extends RestTable { | ||
16 | following: Pod[] = [] | ||
17 | totalRecords = 0 | ||
18 | rowsPerPage = 10 | ||
19 | sort: SortMeta = { field: 'createdAt', order: 1 } | ||
20 | pagination: RestPagination = { count: this.rowsPerPage, start: 0 } | ||
21 | |||
22 | constructor ( | ||
23 | private notificationsService: NotificationsService, | ||
24 | private followService: FollowService | ||
25 | ) { | ||
26 | super() | ||
27 | } | ||
28 | |||
29 | protected loadData () { | ||
30 | this.followService.getFollowing(this.pagination, this.sort) | ||
31 | .subscribe( | ||
32 | resultList => { | ||
33 | this.following = resultList.data | ||
34 | this.totalRecords = resultList.total | ||
35 | }, | ||
36 | |||
37 | err => this.notificationsService.error('Error', err.message) | ||
38 | ) | ||
39 | } | ||
40 | } | ||
diff --git a/client/src/app/+admin/follows/following-list/index.ts b/client/src/app/+admin/follows/following-list/index.ts new file mode 100644 index 000000000..a70d46a7e --- /dev/null +++ b/client/src/app/+admin/follows/following-list/index.ts | |||
@@ -0,0 +1 @@ | |||
export * from './following-list.component' | |||
diff --git a/client/src/app/+admin/follows/follows.component.html b/client/src/app/+admin/follows/follows.component.html new file mode 100644 index 000000000..b67bc9736 --- /dev/null +++ b/client/src/app/+admin/follows/follows.component.html | |||
@@ -0,0 +1,11 @@ | |||
1 | <div class="follows-menu"> | ||
2 | <tabset #followsMenuTabs> | ||
3 | <tab *ngFor="let link of links"> | ||
4 | <ng-template tabHeading> | ||
5 | <a class="tab-link" [routerLink]="link.path">{{ link.title }}</a> | ||
6 | </ng-template> | ||
7 | </tab> | ||
8 | </tabset> | ||
9 | </div> | ||
10 | |||
11 | <router-outlet></router-outlet> | ||
diff --git a/client/src/app/+admin/follows/follows.component.scss b/client/src/app/+admin/follows/follows.component.scss new file mode 100644 index 000000000..d8ab41975 --- /dev/null +++ b/client/src/app/+admin/follows/follows.component.scss | |||
@@ -0,0 +1,21 @@ | |||
1 | .follows-menu { | ||
2 | margin-top: 20px; | ||
3 | } | ||
4 | |||
5 | tabset /deep/ { | ||
6 | .nav-link { | ||
7 | padding: 0; | ||
8 | } | ||
9 | |||
10 | .tab-link { | ||
11 | display: block; | ||
12 | text-align: center; | ||
13 | height: 40px; | ||
14 | width: 120px; | ||
15 | line-height: 40px; | ||
16 | |||
17 | &:hover, &:active, &:focus { | ||
18 | text-decoration: none !important; | ||
19 | } | ||
20 | } | ||
21 | } | ||
diff --git a/client/src/app/+admin/follows/follows.component.ts b/client/src/app/+admin/follows/follows.component.ts new file mode 100644 index 000000000..97422a41b --- /dev/null +++ b/client/src/app/+admin/follows/follows.component.ts | |||
@@ -0,0 +1,43 @@ | |||
1 | import { AfterViewInit, Component, ViewChild } from '@angular/core' | ||
2 | import { TabsetComponent } from 'ngx-bootstrap/tabs' | ||
3 | |||
4 | @Component({ | ||
5 | templateUrl: './follows.component.html', | ||
6 | styleUrls: [ './follows.component.scss' ] | ||
7 | }) | ||
8 | export class FollowsComponent implements AfterViewInit { | ||
9 | @ViewChild('followsMenuTabs') followsMenuTabs: TabsetComponent | ||
10 | |||
11 | links = [ | ||
12 | { | ||
13 | path: 'following-list', | ||
14 | title: 'Following' | ||
15 | }, | ||
16 | { | ||
17 | path: 'following-add', | ||
18 | title: 'Follow' | ||
19 | }, | ||
20 | { | ||
21 | path: 'followers-list', | ||
22 | title: 'Followers' | ||
23 | } | ||
24 | ] | ||
25 | |||
26 | ngAfterViewInit () { | ||
27 | // Avoid issue with change detector | ||
28 | setTimeout(() => this.updateActiveTab()) | ||
29 | } | ||
30 | |||
31 | private updateActiveTab () { | ||
32 | const url = window.location.pathname | ||
33 | |||
34 | for (let i = 0; i < this.links.length; i++) { | ||
35 | const path = this.links[i].path | ||
36 | |||
37 | if (url.endsWith(path) === true) { | ||
38 | this.followsMenuTabs.tabs[i].active = true | ||
39 | return | ||
40 | } | ||
41 | } | ||
42 | } | ||
43 | } | ||
diff --git a/client/src/app/+admin/follows/follows.routes.ts b/client/src/app/+admin/follows/follows.routes.ts new file mode 100644 index 000000000..b7d44f75b --- /dev/null +++ b/client/src/app/+admin/follows/follows.routes.ts | |||
@@ -0,0 +1,53 @@ | |||
1 | import { Routes } from '@angular/router' | ||
2 | |||
3 | import { UserRightGuard } from '../../core' | ||
4 | import { FollowsComponent } from './follows.component' | ||
5 | import { FollowingAddComponent } from './following-add' | ||
6 | import { FollowersListComponent } from './followers-list' | ||
7 | import { UserRight } from '../../../../../shared' | ||
8 | import { FollowingListComponent } from './following-list/following-list.component' | ||
9 | |||
10 | export const FollowsRoutes: Routes = [ | ||
11 | { | ||
12 | path: 'follows', | ||
13 | component: FollowsComponent, | ||
14 | canActivate: [ UserRightGuard ], | ||
15 | data: { | ||
16 | userRight: UserRight.MANAGE_APPLICATION_FOLLOW | ||
17 | }, | ||
18 | children: [ | ||
19 | { | ||
20 | path: '', | ||
21 | redirectTo: 'following-list', | ||
22 | pathMatch: 'full' | ||
23 | }, | ||
24 | { | ||
25 | path: 'following-list', | ||
26 | component: FollowingListComponent, | ||
27 | data: { | ||
28 | meta: { | ||
29 | title: 'Following list' | ||
30 | } | ||
31 | } | ||
32 | }, | ||
33 | { | ||
34 | path: 'followers-list', | ||
35 | component: FollowersListComponent, | ||
36 | data: { | ||
37 | meta: { | ||
38 | title: 'Followers list' | ||
39 | } | ||
40 | } | ||
41 | }, | ||
42 | { | ||
43 | path: 'following-add', | ||
44 | component: FollowingAddComponent, | ||
45 | data: { | ||
46 | meta: { | ||
47 | title: 'Add follow' | ||
48 | } | ||
49 | } | ||
50 | } | ||
51 | ] | ||
52 | } | ||
53 | ] | ||
diff --git a/client/src/app/+admin/follows/index.ts b/client/src/app/+admin/follows/index.ts new file mode 100644 index 000000000..7849a06e7 --- /dev/null +++ b/client/src/app/+admin/follows/index.ts | |||
@@ -0,0 +1,6 @@ | |||
1 | export * from './following-add' | ||
2 | export * from './followers-list' | ||
3 | export * from './following-list' | ||
4 | export * from './shared' | ||
5 | export * from './follows.component' | ||
6 | export * from './follows.routes' | ||
diff --git a/client/src/app/+admin/friends/shared/friend.service.ts b/client/src/app/+admin/follows/shared/follow.service.ts index 867656a53..622c33cea 100644 --- a/client/src/app/+admin/friends/shared/friend.service.ts +++ b/client/src/app/+admin/follows/shared/follow.service.ts | |||
@@ -10,8 +10,8 @@ import { RestExtractor, RestPagination, RestService } from '../../../shared' | |||
10 | import { Pod, ResultList } from '../../../../../../shared' | 10 | import { Pod, ResultList } from '../../../../../../shared' |
11 | 11 | ||
12 | @Injectable() | 12 | @Injectable() |
13 | export class FriendService { | 13 | export class FollowService { |
14 | private static BASE_FRIEND_URL = API_URL + '/api/v1/pods/' | 14 | private static BASE_APPLICATION_URL = API_URL + '/api/v1/application' |
15 | 15 | ||
16 | constructor ( | 16 | constructor ( |
17 | private authHttp: HttpClient, | 17 | private authHttp: HttpClient, |
@@ -23,29 +23,26 @@ export class FriendService { | |||
23 | let params = new HttpParams() | 23 | let params = new HttpParams() |
24 | params = this.restService.addRestGetParams(params, pagination, sort) | 24 | params = this.restService.addRestGetParams(params, pagination, sort) |
25 | 25 | ||
26 | return this.authHttp.get<ResultList<Account>>(API_URL + '/api/v1/pods/followers', { params }) | 26 | return this.authHttp.get<ResultList<Account>>(FollowService.BASE_APPLICATION_URL + '/following', { params }) |
27 | .map(res => this.restExtractor.convertResultListDateToHuman(res)) | 27 | .map(res => this.restExtractor.convertResultListDateToHuman(res)) |
28 | .catch(res => this.restExtractor.handleError(res)) | 28 | .catch(res => this.restExtractor.handleError(res)) |
29 | } | 29 | } |
30 | 30 | ||
31 | getFollowers (pagination: RestPagination, sort: SortMeta): Observable<ResultList<Pod>> { | ||
32 | let params = new HttpParams() | ||
33 | params = this.restService.addRestGetParams(params, pagination, sort) | ||
34 | |||
35 | return this.authHttp.get<ResultList<Account>>(FollowService.BASE_APPLICATION_URL + '/followers', { params }) | ||
36 | .map(res => this.restExtractor.convertResultListDateToHuman(res)) | ||
37 | .catch(res => this.restExtractor.handleError(res)) | ||
38 | } | ||
39 | |||
31 | follow (notEmptyHosts: String[]) { | 40 | follow (notEmptyHosts: String[]) { |
32 | const body = { | 41 | const body = { |
33 | hosts: notEmptyHosts | 42 | hosts: notEmptyHosts |
34 | } | 43 | } |
35 | 44 | ||
36 | return this.authHttp.post(API_URL + '/api/v1/pods/follow', body) | 45 | return this.authHttp.post(FollowService.BASE_APPLICATION_URL + '/follow', body) |
37 | .map(this.restExtractor.extractDataBool) | ||
38 | .catch(res => this.restExtractor.handleError(res)) | ||
39 | } | ||
40 | |||
41 | quitFriends () { | ||
42 | return this.authHttp.get(FriendService.BASE_FRIEND_URL + 'quit-friends') | ||
43 | .map(this.restExtractor.extractDataBool) | ||
44 | .catch(res => this.restExtractor.handleError(res)) | ||
45 | } | ||
46 | |||
47 | removeFriend (friend: Pod) { | ||
48 | return this.authHttp.delete(FriendService.BASE_FRIEND_URL + friend.id) | ||
49 | .map(this.restExtractor.extractDataBool) | 46 | .map(this.restExtractor.extractDataBool) |
50 | .catch(res => this.restExtractor.handleError(res)) | 47 | .catch(res => this.restExtractor.handleError(res)) |
51 | } | 48 | } |
diff --git a/client/src/app/+admin/follows/shared/index.ts b/client/src/app/+admin/follows/shared/index.ts new file mode 100644 index 000000000..78d456def --- /dev/null +++ b/client/src/app/+admin/follows/shared/index.ts | |||
@@ -0,0 +1 @@ | |||
export * from './follow.service' | |||
diff --git a/client/src/app/+admin/friends/friend-add/index.ts b/client/src/app/+admin/friends/friend-add/index.ts deleted file mode 100644 index 978ab3d46..000000000 --- a/client/src/app/+admin/friends/friend-add/index.ts +++ /dev/null | |||
@@ -1 +0,0 @@ | |||
1 | export * from './friend-add.component' | ||
diff --git a/client/src/app/+admin/friends/friend-list/friend-list.component.html b/client/src/app/+admin/friends/friend-list/friend-list.component.html deleted file mode 100644 index df5a570fd..000000000 --- a/client/src/app/+admin/friends/friend-list/friend-list.component.html +++ /dev/null | |||
@@ -1,29 +0,0 @@ | |||
1 | <div class="row"> | ||
2 | <div class="content-padding"> | ||
3 | <h3>Friends list</h3> | ||
4 | |||
5 | <p-dataTable | ||
6 | [value]="friends" [lazy]="true" [paginator]="true" [totalRecords]="totalRecords" [rows]="rowsPerPage" | ||
7 | sortField="createdAt" (onLazyLoad)="loadLazy($event)" | ||
8 | > | ||
9 | <p-column field="id" header="ID"></p-column> | ||
10 | <p-column field="host" header="Host"></p-column> | ||
11 | <p-column field="email" header="Email"></p-column> | ||
12 | <p-column field="score" header="Score"></p-column> | ||
13 | <p-column field="createdAt" header="Created date" [sortable]="true"></p-column> | ||
14 | <p-column header="Delete" styleClass="action-cell"> | ||
15 | <ng-template pTemplate="body" let-pod="rowData"> | ||
16 | <span (click)="removeFriend(pod)" class="glyphicon glyphicon-remove glyphicon-black" title="Remove this pod"></span> | ||
17 | </ng-template> | ||
18 | </p-column> | ||
19 | </p-dataTable> | ||
20 | |||
21 | <a *ngIf="hasFriends()" class="btn btn-danger pull-left" (click)="quitFriends()"> | ||
22 | Quit friends | ||
23 | </a> | ||
24 | |||
25 | <a *ngIf="!hasFriends()" class="btn btn-success pull-right" [routerLink]="[ '/admin/friends/add' ]"> | ||
26 | Make friends | ||
27 | </a> | ||
28 | </div> | ||
29 | </div> | ||
diff --git a/client/src/app/+admin/friends/friend-list/friend-list.component.ts b/client/src/app/+admin/friends/friend-list/friend-list.component.ts deleted file mode 100644 index 3fa8ef19f..000000000 --- a/client/src/app/+admin/friends/friend-list/friend-list.component.ts +++ /dev/null | |||
@@ -1,87 +0,0 @@ | |||
1 | import { Component, OnInit } from '@angular/core' | ||
2 | |||
3 | import { NotificationsService } from 'angular2-notifications' | ||
4 | import { SortMeta } from 'primeng/primeng' | ||
5 | |||
6 | import { ConfirmService } from '../../../core' | ||
7 | import { RestTable, RestPagination } from '../../../shared' | ||
8 | import { Pod } from '../../../../../../shared' | ||
9 | import { FriendService } from '../shared' | ||
10 | |||
11 | @Component({ | ||
12 | selector: 'my-friend-list', | ||
13 | templateUrl: './friend-list.component.html', | ||
14 | styleUrls: ['./friend-list.component.scss'] | ||
15 | }) | ||
16 | export class FriendListComponent extends RestTable implements OnInit { | ||
17 | friends: Pod[] = [] | ||
18 | totalRecords = 0 | ||
19 | rowsPerPage = 10 | ||
20 | sort: SortMeta = { field: 'createdAt', order: 1 } | ||
21 | pagination: RestPagination = { count: this.rowsPerPage, start: 0 } | ||
22 | |||
23 | constructor ( | ||
24 | private notificationsService: NotificationsService, | ||
25 | private confirmService: ConfirmService, | ||
26 | private friendService: FriendService | ||
27 | ) { | ||
28 | super() | ||
29 | } | ||
30 | |||
31 | ngOnInit () { | ||
32 | this.loadData() | ||
33 | } | ||
34 | |||
35 | hasFriends () { | ||
36 | return this.friends.length !== 0 | ||
37 | } | ||
38 | |||
39 | quitFriends () { | ||
40 | const confirmMessage = 'Do you really want to quit your friends? All their videos will be deleted.' | ||
41 | this.confirmService.confirm(confirmMessage, 'Quit friends').subscribe( | ||
42 | res => { | ||
43 | if (res === false) return | ||
44 | |||
45 | this.friendService.quitFriends().subscribe( | ||
46 | status => { | ||
47 | this.notificationsService.success('Success', 'Friends left!') | ||
48 | this.loadData() | ||
49 | }, | ||
50 | |||
51 | err => this.notificationsService.error('Error', err.message) | ||
52 | ) | ||
53 | } | ||
54 | ) | ||
55 | } | ||
56 | |||
57 | removeFriend (friend: Pod) { | ||
58 | const confirmMessage = 'Do you really want to remove this friend ? All its videos will be deleted.' | ||
59 | |||
60 | this.confirmService.confirm(confirmMessage, 'Remove').subscribe( | ||
61 | res => { | ||
62 | if (res === false) return | ||
63 | |||
64 | this.friendService.removeFriend(friend).subscribe( | ||
65 | status => { | ||
66 | this.notificationsService.success('Success', 'Friend removed') | ||
67 | this.loadData() | ||
68 | }, | ||
69 | |||
70 | err => this.notificationsService.error('Error', err.message) | ||
71 | ) | ||
72 | } | ||
73 | ) | ||
74 | } | ||
75 | |||
76 | protected loadData () { | ||
77 | this.friendService.getFollowing(this.pagination, this.sort) | ||
78 | .subscribe( | ||
79 | resultList => { | ||
80 | this.friends = resultList.data | ||
81 | this.totalRecords = resultList.total | ||
82 | }, | ||
83 | |||
84 | err => this.notificationsService.error('Error', err.message) | ||
85 | ) | ||
86 | } | ||
87 | } | ||
diff --git a/client/src/app/+admin/friends/friend-list/index.ts b/client/src/app/+admin/friends/friend-list/index.ts deleted file mode 100644 index c9cbd2800..000000000 --- a/client/src/app/+admin/friends/friend-list/index.ts +++ /dev/null | |||
@@ -1 +0,0 @@ | |||
1 | export * from './friend-list.component' | ||
diff --git a/client/src/app/+admin/friends/friends.component.ts b/client/src/app/+admin/friends/friends.component.ts deleted file mode 100644 index 5ef0aaa03..000000000 --- a/client/src/app/+admin/friends/friends.component.ts +++ /dev/null | |||
@@ -1,7 +0,0 @@ | |||
1 | import { Component } from '@angular/core' | ||
2 | |||
3 | @Component({ | ||
4 | template: '<router-outlet></router-outlet>' | ||
5 | }) | ||
6 | export class FriendsComponent { | ||
7 | } | ||
diff --git a/client/src/app/+admin/friends/friends.routes.ts b/client/src/app/+admin/friends/friends.routes.ts deleted file mode 100644 index e2cb953b3..000000000 --- a/client/src/app/+admin/friends/friends.routes.ts +++ /dev/null | |||
@@ -1,43 +0,0 @@ | |||
1 | import { Routes } from '@angular/router' | ||
2 | |||
3 | import { UserRightGuard } from '../../core' | ||
4 | import { FriendsComponent } from './friends.component' | ||
5 | import { FriendAddComponent } from './friend-add' | ||
6 | import { FriendListComponent } from './friend-list' | ||
7 | import { UserRight } from '../../../../../shared' | ||
8 | |||
9 | export const FriendsRoutes: Routes = [ | ||
10 | { | ||
11 | path: 'friends', | ||
12 | component: FriendsComponent, | ||
13 | canActivate: [ UserRightGuard ], | ||
14 | data: { | ||
15 | userRight: UserRight.MANAGE_PEERTUBE_FOLLOW | ||
16 | }, | ||
17 | children: [ | ||
18 | { | ||
19 | path: '', | ||
20 | redirectTo: 'list', | ||
21 | pathMatch: 'full' | ||
22 | }, | ||
23 | { | ||
24 | path: 'list', | ||
25 | component: FriendListComponent, | ||
26 | data: { | ||
27 | meta: { | ||
28 | title: 'Friends list' | ||
29 | } | ||
30 | } | ||
31 | }, | ||
32 | { | ||
33 | path: 'add', | ||
34 | component: FriendAddComponent, | ||
35 | data: { | ||
36 | meta: { | ||
37 | title: 'Add friends' | ||
38 | } | ||
39 | } | ||
40 | } | ||
41 | ] | ||
42 | } | ||
43 | ] | ||
diff --git a/client/src/app/+admin/friends/index.ts b/client/src/app/+admin/friends/index.ts deleted file mode 100644 index 356dee8e9..000000000 --- a/client/src/app/+admin/friends/index.ts +++ /dev/null | |||
@@ -1,5 +0,0 @@ | |||
1 | export * from './friend-add' | ||
2 | export * from './friend-list' | ||
3 | export * from './shared' | ||
4 | export * from './friends.component' | ||
5 | export * from './friends.routes' | ||
diff --git a/client/src/app/+admin/friends/shared/index.ts b/client/src/app/+admin/friends/shared/index.ts deleted file mode 100644 index 65ab9fb46..000000000 --- a/client/src/app/+admin/friends/shared/index.ts +++ /dev/null | |||
@@ -1 +0,0 @@ | |||
1 | export * from './friend.service' | ||
diff --git a/client/src/app/core/menu/menu-admin.component.html b/client/src/app/core/menu/menu-admin.component.html index 1966a944c..99ee287c5 100644 --- a/client/src/app/core/menu/menu-admin.component.html +++ b/client/src/app/core/menu/menu-admin.component.html | |||
@@ -5,9 +5,9 @@ | |||
5 | List users | 5 | List users |
6 | </a> | 6 | </a> |
7 | 7 | ||
8 | <a *ngIf="hasFriendsRight()" routerLink="/admin/friends" routerLinkActive="active"> | 8 | <a *ngIf="hasApplicationFollowRight()" routerLink="/admin/follows" routerLinkActive="active"> |
9 | <span class="hidden-xs glyphicon glyphicon-cloud"></span> | 9 | <span class="hidden-xs glyphicon glyphicon-cloud"></span> |
10 | List friends | 10 | Manage follows |
11 | </a> | 11 | </a> |
12 | 12 | ||
13 | <a *ngIf="hasVideoAbusesRight()" routerLink="/admin/video-abuses" routerLinkActive="active"> | 13 | <a *ngIf="hasVideoAbusesRight()" routerLink="/admin/video-abuses" routerLinkActive="active"> |
diff --git a/client/src/app/core/menu/menu-admin.component.ts b/client/src/app/core/menu/menu-admin.component.ts index 92aab9a05..88a654d1f 100644 --- a/client/src/app/core/menu/menu-admin.component.ts +++ b/client/src/app/core/menu/menu-admin.component.ts | |||
@@ -15,8 +15,8 @@ export class MenuAdminComponent { | |||
15 | return this.auth.getUser().hasRight(UserRight.MANAGE_USERS) | 15 | return this.auth.getUser().hasRight(UserRight.MANAGE_USERS) |
16 | } | 16 | } |
17 | 17 | ||
18 | hasFriendsRight () { | 18 | hasApplicationFollowRight () { |
19 | return this.auth.getUser().hasRight(UserRight.MANAGE_PEERTUBE_FOLLOW) | 19 | return this.auth.getUser().hasRight(UserRight.MANAGE_APPLICATION_FOLLOW) |
20 | } | 20 | } |
21 | 21 | ||
22 | hasVideoAbusesRight () { | 22 | hasVideoAbusesRight () { |
diff --git a/client/src/app/core/menu/menu.component.ts b/client/src/app/core/menu/menu.component.ts index 71295be86..872d29819 100644 --- a/client/src/app/core/menu/menu.component.ts +++ b/client/src/app/core/menu/menu.component.ts | |||
@@ -16,7 +16,7 @@ export class MenuComponent implements OnInit { | |||
16 | 16 | ||
17 | private routesPerRight = { | 17 | private routesPerRight = { |
18 | [UserRight.MANAGE_USERS]: '/admin/users', | 18 | [UserRight.MANAGE_USERS]: '/admin/users', |
19 | [UserRight.MANAGE_PEERTUBE_FOLLOW]: '/admin/friends', | 19 | [UserRight.MANAGE_APPLICATION_FOLLOW]: '/admin/friends', |
20 | [UserRight.MANAGE_VIDEO_ABUSES]: '/admin/video-abuses', | 20 | [UserRight.MANAGE_VIDEO_ABUSES]: '/admin/video-abuses', |
21 | [UserRight.MANAGE_VIDEO_BLACKLIST]: '/admin/video-blacklist' | 21 | [UserRight.MANAGE_VIDEO_BLACKLIST]: '/admin/video-blacklist' |
22 | } | 22 | } |
@@ -58,7 +58,7 @@ export class MenuComponent implements OnInit { | |||
58 | 58 | ||
59 | const adminRights = [ | 59 | const adminRights = [ |
60 | UserRight.MANAGE_USERS, | 60 | UserRight.MANAGE_USERS, |
61 | UserRight.MANAGE_PEERTUBE_FOLLOW, | 61 | UserRight.MANAGE_APPLICATION_FOLLOW, |
62 | UserRight.MANAGE_VIDEO_ABUSES, | 62 | UserRight.MANAGE_VIDEO_ABUSES, |
63 | UserRight.MANAGE_VIDEO_BLACKLIST | 63 | UserRight.MANAGE_VIDEO_BLACKLIST |
64 | ] | 64 | ] |