diff options
author | Julien Maulny <julien.maulny@protonmail.com> | 2019-10-02 22:37:01 +0200 |
---|---|---|
committer | Chocobozzz <chocobozzz@cpy.re> | 2019-10-18 15:13:30 +0200 |
commit | 3d05209c9a9f1e229f8c704ee5fe06a5c97c9840 (patch) | |
tree | 3c78276817d8c14f05bcfcdba6d65db0a3c52f22 /client/src/app/shared/instance | |
parent | 235b055dc566f35aa07480ad055a7fbb40e028ac (diff) | |
download | PeerTube-3d05209c9a9f1e229f8c704ee5fe06a5c97c9840.tar.gz PeerTube-3d05209c9a9f1e229f8c704ee5fe06a5c97c9840.tar.zst PeerTube-3d05209c9a9f1e229f8c704ee5fe06a5c97c9840.zip |
Add statistics section in about page
Diffstat (limited to 'client/src/app/shared/instance')
3 files changed, 173 insertions, 0 deletions
diff --git a/client/src/app/shared/instance/instance-statistics.component.html b/client/src/app/shared/instance/instance-statistics.component.html new file mode 100644 index 000000000..181c57b57 --- /dev/null +++ b/client/src/app/shared/instance/instance-statistics.component.html | |||
@@ -0,0 +1,101 @@ | |||
1 | <p i18n *ngIf="null === serverStats">Loading instance statistics...</p> | ||
2 | |||
3 | <section *ngIf="null !== serverStats"> | ||
4 | <h5 i18n>Local</h5> | ||
5 | |||
6 | <div class="row"> | ||
7 | <div class="col-6 col-lg-4 col-xl-3"> | ||
8 | <div class="card stat"> | ||
9 | <div class="card-body"> | ||
10 | <p class="stat-value">{{ serverStats.totalUsers }}</p> | ||
11 | <p class="stat-label" i18n>users</p> | ||
12 | </div> | ||
13 | <i class="glyphicon glyphicon-user icon-bottom"></i> | ||
14 | </div> | ||
15 | </div> | ||
16 | |||
17 | <div class="col-6 col-lg-4 col-xl-3"> | ||
18 | <div class="card stat"> | ||
19 | <div class="card-body"> | ||
20 | <p class="stat-value">{{ serverStats.totalLocalVideos }}</p> | ||
21 | <p class="stat-label" i18n>videos</p> | ||
22 | </div> | ||
23 | <i class="glyphicon glyphicon-facetime-video"></i> | ||
24 | </div> | ||
25 | </div> | ||
26 | |||
27 | <div class="col-6 col-lg-4 col-xl-3"> | ||
28 | <div class="card stat"> | ||
29 | <div class="card-body"> | ||
30 | <p class="stat-value">{{ serverStats.totalLocalVideoViews }}</p> | ||
31 | <p class="stat-label" i18n>videos views</p> | ||
32 | </div> | ||
33 | <i class="glyphicon glyphicon-eye-open"></i> | ||
34 | </div> | ||
35 | </div> | ||
36 | |||
37 | <div class="col-6 col-lg-4 col-xl-3"> | ||
38 | <div class="card stat"> | ||
39 | <div class="card-body"> | ||
40 | <p class="stat-value">{{ serverStats.totalLocalVideoComments }}</p> | ||
41 | <p class="stat-label" i18n>videos comments</p> | ||
42 | </div> | ||
43 | <i class="glyphicon glyphicon-comment"></i> | ||
44 | </div> | ||
45 | </div> | ||
46 | |||
47 | <div class="col-6 col-lg-4 col-xl-3"> | ||
48 | <div class="card stat"> | ||
49 | <div class="card-body"> | ||
50 | <p class="stat-value">{{ serverStats.totalLocalVideoFilesSize | bytes:1 }}</p> | ||
51 | <p class="stat-label" i18n>of hosted video</p> | ||
52 | </div> | ||
53 | <i class="glyphicon glyphicon-hdd"></i> | ||
54 | </div> | ||
55 | </div> | ||
56 | </div> | ||
57 | |||
58 | <h5 i18n>Federation</h5> | ||
59 | |||
60 | <div class="row"> | ||
61 | <div class="col-6 col-lg-4 col-xl-3"> | ||
62 | <div class="card stat"> | ||
63 | <div class="card-body"> | ||
64 | <p class="stat-value">{{ serverStats.totalVideos }}</p> | ||
65 | <p class="stat-label" i18n>videos</p> | ||
66 | </div> | ||
67 | <i class="glyphicon glyphicon-facetime-video"></i> | ||
68 | </div> | ||
69 | </div> | ||
70 | |||
71 | <div class="col-6 col-lg-4 col-xl-3"> | ||
72 | <div class="card stat"> | ||
73 | <div class="card-body"> | ||
74 | <p class="stat-value">{{ serverStats.totalVideoComments }}</p> | ||
75 | <p class="stat-label" i18n>videos comments</p> | ||
76 | </div> | ||
77 | <i class="glyphicon glyphicon-comment"></i> | ||
78 | </div> | ||
79 | </div> | ||
80 | |||
81 | <div class="col-6 col-lg-4 col-xl-3"> | ||
82 | <div class="card stat"> | ||
83 | <div class="card-body"> | ||
84 | <p class="stat-value">{{ serverStats.totalInstanceFollowers }}</p> | ||
85 | <p class="stat-label" i18n>followers</p> | ||
86 | </div> | ||
87 | <i class="glyphicon glyphicon-retweet"></i> | ||
88 | </div> | ||
89 | </div> | ||
90 | |||
91 | <div class="col-6 col-lg-4 col-xl-3"> | ||
92 | <div class="card stat"> | ||
93 | <div class="card-body"> | ||
94 | <p class="stat-value">{{ serverStats.totalInstanceFollowing }}</p> | ||
95 | <p class="stat-label" i18n>following</p> | ||
96 | </div> | ||
97 | <i class="glyphicon glyphicon-retweet"></i> | ||
98 | </div> | ||
99 | </div> | ||
100 | </div> | ||
101 | </section> | ||
diff --git a/client/src/app/shared/instance/instance-statistics.component.scss b/client/src/app/shared/instance/instance-statistics.component.scss new file mode 100644 index 000000000..63f8911f6 --- /dev/null +++ b/client/src/app/shared/instance/instance-statistics.component.scss | |||
@@ -0,0 +1,35 @@ | |||
1 | .stat { | ||
2 | text-align: center; | ||
3 | margin-bottom: 1em; | ||
4 | overflow: hidden; | ||
5 | |||
6 | .stat-value { | ||
7 | font-size: 2.25em; | ||
8 | line-height: 1em; | ||
9 | margin: 0; | ||
10 | } | ||
11 | |||
12 | .stat-label { | ||
13 | font-size: 1.15em; | ||
14 | margin: 0; | ||
15 | } | ||
16 | |||
17 | .glyphicon { | ||
18 | opacity: 0.12; | ||
19 | position: absolute; | ||
20 | left: 16px; | ||
21 | top: -24px; | ||
22 | |||
23 | &.icon-bottom { | ||
24 | top: 4px; | ||
25 | } | ||
26 | |||
27 | &::before { | ||
28 | font-size: 8em; | ||
29 | } | ||
30 | } | ||
31 | |||
32 | .card-body { | ||
33 | z-index: 2; | ||
34 | } | ||
35 | } | ||
diff --git a/client/src/app/shared/instance/instance-statistics.component.ts b/client/src/app/shared/instance/instance-statistics.component.ts new file mode 100644 index 000000000..8ec728f05 --- /dev/null +++ b/client/src/app/shared/instance/instance-statistics.component.ts | |||
@@ -0,0 +1,37 @@ | |||
1 | import { map } from 'rxjs/operators' | ||
2 | import { HttpClient } from '@angular/common/http' | ||
3 | import { Component, OnInit } from '@angular/core' | ||
4 | import { I18n } from '@ngx-translate/i18n-polyfill' | ||
5 | import { ServerStats } from '@shared/models/server' | ||
6 | import { environment } from '../../../environments/environment' | ||
7 | |||
8 | @Component({ | ||
9 | selector: 'my-instance-statistics', | ||
10 | templateUrl: './instance-statistics.component.html', | ||
11 | styleUrls: [ './instance-statistics.component.scss' ] | ||
12 | }) | ||
13 | export class InstanceStatisticsComponent implements OnInit { | ||
14 | private static BASE_STATS_URL = environment.apiUrl + '/api/v1/server/stats' | ||
15 | |||
16 | serverStats: ServerStats = null | ||
17 | |||
18 | constructor ( | ||
19 | private http: HttpClient, | ||
20 | private i18n: I18n | ||
21 | ) { | ||
22 | } | ||
23 | |||
24 | ngOnInit () { | ||
25 | this.getStats() | ||
26 | .subscribe( | ||
27 | res => { | ||
28 | this.serverStats = res | ||
29 | } | ||
30 | ) | ||
31 | } | ||
32 | |||
33 | getStats () { | ||
34 | return this.http | ||
35 | .get<ServerStats>(InstanceStatisticsComponent.BASE_STATS_URL) | ||
36 | } | ||
37 | } | ||