3
3
@inject HttpClient Http
4
4
@inject NavigationManager NavigationManager
5
5
@attribute [StreamRendering]
6
+ @inject IConfiguration Configuration
6
7
7
8
<PageTitle >Leaderboard</PageTitle >
8
9
<h4 >Leaderboards</h4 >
12
13
}
13
14
else
14
15
{
16
+ var queryDictionary = System .Web .HttpUtility .ParseQueryString (new Uri (NavigationManager .Uri ).Query );
17
+ var username = queryDictionary [" username" ] ?? " " ;
15
18
// 0, 1, 2, 3, 4, 5 = Last24Hours, Last7Days, Last30Days, Last90Days, Last365Days, AllTime
16
- <div class =" btn-group" role =" group" aria-label =" Time range selection" >
19
+ <div class =" btn-group" role =" group" aria-label =" Time range selection" style = " margin-bottom : 10 px " >
17
20
<button type =" button" class =" btn btn-secondary" onclick =" changeTimeRange(0)" >Last 24 hours </button >
18
21
<button type =" button" class =" btn btn-secondary" onclick =" changeTimeRange(1)" >Last 7 days </button >
19
22
<button type =" button" class =" btn btn-secondary" onclick =" changeTimeRange(2)" >Last 30 days </button >
20
23
<button type =" button" class =" btn btn-secondary" onclick =" changeTimeRange(3)" >Last 90 days </button >
21
24
<button type =" button" class =" btn btn-secondary" onclick =" changeTimeRange(4)" >Last 365 days </button >
22
25
<button type =" button" class =" btn btn-secondary" onclick =" changeTimeRange(5)" >All time </button >
23
26
</div >
24
- // Need 2 tables for MostSeenPlayers and MostAntagPlayers
25
- <table class =" table" >
26
- <thead >
27
- <tr >
28
- <th >Player name </th >
29
- <th >Times seen </th >
30
- </tr >
31
- </thead >
32
- <tbody >
33
- @foreach ( var player in LeaderboardData .MostSeenPlayers )
34
- {
35
- <tr >
36
- <td ><a href =" /player/@player.Value.Player.PlayerGuid" >@player.Value.Player.Username </a ></td >
37
- <td >@player.Value.Count </td >
38
- </tr >
39
- }
40
- </tbody >
41
- </table >
27
+
28
+ // Need a simple search bar to filter for own name
29
+ <div class =" search-bar" >
30
+ <div class =" d-flex ms-auto" >
31
+ <input
32
+ type =" text"
33
+ class =" form-control"
34
+ placeholder =" Enter username..."
35
+ onsubmit =" search()"
36
+ aria-label =" Search"
37
+ data-filter =" @Configuration[" ApiUrl " ]api/Data/username-completion?username=#QUERY#"
38
+ id =" search"
39
+ value =" @username"
40
+ >
41
+ <button class =" btn btn-outline-success" type =" button" onclick =" search()" >Filter </button >
42
+ </div >
43
+ </div >
44
+
45
+ <hr />
42
46
43
- <table class =" table" >
44
- <thead >
45
- <tr >
46
- <th >Player name </th >
47
- <th >Times antag </th >
48
- </tr >
49
- </thead >
50
- <tbody >
51
- @foreach ( var player in LeaderboardData .MostAntagPlayers )
47
+ @foreach ( var leaderboard in LeaderboardData .Leaderboards )
48
+ {
49
+ <h4 >@leaderboard.Name </h4 >
50
+ if (leaderboard .ExtraInfo != null )
52
51
{
53
- <tr >
54
- <td ><a href =" /player/@player.Value.Player.PlayerGuid" >@player.Value.Player.Username </a ></td >
55
- <td >@player.Value.Count </td >
56
- </tr >
52
+ < p > @leaderboard .ExtraInfo < / p >
57
53
}
58
- </tbody >
59
- </table >
60
-
61
- <table class =" table" >
62
- <thead >
63
- <tr >
64
- <th >Player name </th >
65
- <th >Times hunted by antags </th >
66
- </tr >
67
- </thead >
68
- <tbody >
69
- @foreach ( var player in LeaderboardData .MostHuntedPlayer )
70
- {
54
+ <table class =" table" >
55
+ <thead >
71
56
<tr >
72
- <td ><a href =" /player/@player.Value.Player.PlayerGuid" >@player.Value.Player.Username </a ></td >
73
- <td >@player.Value.Count </td >
57
+ <th >Position </th >
58
+ <th >Player name </th >
59
+ <th >@leaderboard.TrackedData </th >
74
60
</tr >
75
- }
76
- </tbody >
77
- </table >
61
+ </thead >
62
+ <tbody >
63
+ @foreach ( var player in leaderboard .Data )
64
+ {
65
+ if (! IsCurrentPlayer (player .Value .Player .Username ))
66
+ {
67
+ < tr >
68
+ < td > @player .Value .Position < / td >
69
+ < td >< a href = " /player/@player.Value.Player.PlayerGuid" > @player .Value .Player .Username < / a >< / td >
70
+ < td > @player .Value .Count < / td >
71
+ < / tr >
72
+ }
73
+ else
74
+ {
75
+ <tr style =" --bs-table-bg : #622c2c ;" >
76
+ <td >@player.Value.Position </td >
77
+ <td ><a href =" /player/@player.Value.Player.PlayerGuid" >@player.Value.Player.Username </a ></td >
78
+ <td >@player.Value.Count </td >
79
+ </tr >
80
+ }
81
+ }
82
+ </tbody >
83
+ </table >
84
+ }
78
85
}
79
86
80
87
<script >
81
88
function changeTimeRange (timeRange ) {
82
- // This is a hacky way to change the time range, but it works
83
- window .location .href = " /leaderboard?timeRange=" + timeRange;
89
+ var uri = new URL (window .location .href );
90
+ uri .searchParams .set (" timeRange" , timeRange);
91
+ uri .searchParams .set (" username" , document .getElementById (" search" ).value );
92
+ window .location .href = uri .toString ();
93
+ }
94
+
95
+ function search () {
96
+ var search = document .getElementById (" search" ).value ;
97
+ var uri = new URL (window .location .href );
98
+ uri .searchParams .set (" timeRange" , uri .searchParams .get (" timeRange" ) || 5 );
99
+ uri .searchParams .set (" username" ,search);
100
+ window .location .href = uri .toString ();
84
101
}
102
+
103
+ // on dom ready, fill the search bar with the query string
104
+ document .addEventListener (" DOMContentLoaded" , function () {
105
+ var uri = new URL (window .location .href );
106
+ var search = uri .searchParams .get (" search" );
107
+ if (search) {
108
+ document .getElementById (" search" ).value = search;
109
+ }
110
+ });
85
111
</script >
86
112
87
113
@code {
@@ -94,16 +120,33 @@ else
94
120
var uri = new Uri (NavigationManager .Uri );
95
121
var query = uri .Query ;
96
122
var timeRange = 5 ; // Default to AllTime
123
+ var queryDictionary = System .Web .HttpUtility .ParseQueryString (query );
97
124
if (! string .IsNullOrEmpty (query ))
98
125
{
99
- var queryDictionary = System .Web .HttpUtility .ParseQueryString (query );
100
126
if (queryDictionary .AllKeys .Contains (" timeRange" ))
101
127
{
102
128
timeRange = int .Parse (queryDictionary [" timeRange" ]);
103
129
}
104
130
}
105
-
106
- LeaderboardData = await Http .GetFromJsonAsync <LeaderboardData >(" api/Data/leaderboard?rangeOption=" + timeRange );
131
+
132
+ if (queryDictionary .AllKeys .Contains (" username" ))
133
+ {
134
+ LeaderboardData = await Http .GetFromJsonAsync <LeaderboardData >(" api/Data/leaderboard?rangeOption=" + timeRange + " &username=" + queryDictionary [" username" ]);
135
+ }
136
+ else
137
+ {
138
+ LeaderboardData = await Http .GetFromJsonAsync <LeaderboardData >(" api/Data/leaderboard?rangeOption=" + timeRange );
139
+ }
107
140
IsLoading = false ;
108
141
}
142
+
143
+ public bool IsCurrentPlayer (string username )
144
+ {
145
+ var queryDictionary = System .Web .HttpUtility .ParseQueryString (new Uri (NavigationManager .Uri ).Query );
146
+ if (queryDictionary .AllKeys .Contains (" username" ))
147
+ {
148
+ return queryDictionary [" username" ] == username ;
149
+ }
150
+ return false ;
151
+ }
109
152
}
0 commit comments