admin display
This commit is contained in:
@@ -365,6 +365,9 @@ onMounted(() => {
|
||||
<span v-if="entry.username === userInfo.username" class="badge badge-primary badge-sm ml-1">
|
||||
You
|
||||
</span>
|
||||
<span v-if="entry.is_staff" class="badge badge-warning badge-sm ml-1">
|
||||
admin
|
||||
</span>
|
||||
</td>
|
||||
<td class="text-right text-sm font-bold text-primary">{{ entry.total_score.toLocaleString() }}
|
||||
</td>
|
||||
|
||||
@@ -5,6 +5,7 @@ import RankBadge from "./RankBadge.vue";
|
||||
interface User {
|
||||
id: number;
|
||||
username: string;
|
||||
is_staff: boolean,
|
||||
first_name?: string;
|
||||
last_name?: string;
|
||||
}
|
||||
@@ -84,7 +85,7 @@ const getOverallRanking = () => {
|
||||
const count = responses.length;
|
||||
|
||||
return {
|
||||
username: user.username,
|
||||
user: user,
|
||||
totalPoints,
|
||||
puzzlesSolved: count,
|
||||
};
|
||||
@@ -98,9 +99,9 @@ const getPuzzleRanking = (puzzleId: number) => {
|
||||
|
||||
const ranking = resultsData.value.ranking_by_puzzle[puzzleId] || [];
|
||||
return ranking.map((response) => {
|
||||
const user = resultsData.value!.users.find((u) => u.id === response.user_id);
|
||||
const user = resultsData.value!.users.find((u) => u.id === response.user_id) as User;
|
||||
return {
|
||||
username: user?.username || "Unknown",
|
||||
user: user,
|
||||
cost: response.final_cost,
|
||||
cycles: response.final_cycles,
|
||||
area: response.final_area,
|
||||
@@ -146,7 +147,7 @@ const loadUserData = async () => {
|
||||
|
||||
// Calculate user's rank and stats
|
||||
const ranking = getOverallRanking();
|
||||
const userRankIndex = ranking.findIndex((u) => u.username === user.username);
|
||||
const userRankIndex = ranking.findIndex((u) => u.user.id === user.id);
|
||||
|
||||
if (userRankIndex !== -1) {
|
||||
userInfo.value.rank = userRankIndex + 1;
|
||||
@@ -235,7 +236,7 @@ onMounted(() => {
|
||||
|
||||
<div v-else class="space-y-6">
|
||||
<!-- Tabs -->
|
||||
<div class="tabs tabs-boxed">
|
||||
<div class="tabs tabs-border">
|
||||
<button @click="selectedTab = 'overall'" :class="[
|
||||
'tab',
|
||||
selectedTab === 'overall' ? 'tab-active' : '',
|
||||
@@ -269,13 +270,18 @@ onMounted(() => {
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr v-for="(user, index) in getOverallRanking()" :key="user.username">
|
||||
<tr v-for="(ranking, index) in getOverallRanking()" :key="ranking.user.username">
|
||||
<td class="font-bold">
|
||||
<RankBadge :rank="index + 1" />
|
||||
</td>
|
||||
<td class="font-medium">{{ user.username }}</td>
|
||||
<td class="text-right">{{ user.puzzlesSolved }}</td>
|
||||
<td class="text-right font-bold">{{ user.totalPoints }}</td>
|
||||
<td class="font-medium">
|
||||
{{ ranking.user.username }}
|
||||
<span v-if="ranking.user.is_staff" class="badge badge-warning">
|
||||
admin
|
||||
</span>
|
||||
</td>
|
||||
<td class="text-right">{{ ranking.puzzlesSolved }}</td>
|
||||
<td class="text-right font-bold">{{ ranking.totalPoints }}</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
@@ -309,17 +315,17 @@ onMounted(() => {
|
||||
<div class="grid grid-cols-3 gap-4">
|
||||
<div class="text-center">
|
||||
<span class="text-2xl font-bold text-primary"><small>x</small>{{ puzzle.points_factor.cost
|
||||
}}</span>
|
||||
}}</span>
|
||||
<p class="text-xs text-base-content/70">Cost</p>
|
||||
</div>
|
||||
<div class="text-center">
|
||||
<span class="text-2xl font-bold text-primary"><small>x</small>{{ puzzle.points_factor.cycles
|
||||
}}</span>
|
||||
}}</span>
|
||||
<p class="text-xs text-base-content/70">Cycles</p>
|
||||
</div>
|
||||
<div class="text-center">
|
||||
<span class="text-2xl font-bold text-primary"><small>x</small>{{ puzzle.points_factor.area
|
||||
}}</span>
|
||||
}}</span>
|
||||
<p class="text-xs text-base-content/70">Area</p>
|
||||
</div>
|
||||
</div>
|
||||
@@ -333,7 +339,12 @@ onMounted(() => {
|
||||
<div class="text-xs text-base-content/70 font-bold">
|
||||
{{ index === 0 ? '🏆 1st Place' : index === 1 ? '🥈 2nd Place' : '🥉 3rd Place' }}
|
||||
</div>
|
||||
<h4 class="font-bold text-lg">{{ response.username }}</h4>
|
||||
<h4 class="font-bold text-lg">
|
||||
{{ response.user.username }}
|
||||
<span v-if="response.user.is_staff" class="badge badge-warning">
|
||||
admin
|
||||
</span>
|
||||
</h4>
|
||||
<div class="divider my-2"></div>
|
||||
<div class="space-y-2 text-sm">
|
||||
<div class="flex justify-between">
|
||||
@@ -402,7 +413,7 @@ onMounted(() => {
|
||||
<span v-else-if="index === 2" class="badge">🥉</span>
|
||||
<span v-else>#{{ index + 1 }}</span>
|
||||
</td>
|
||||
<td class="font-medium">{{ response.username }}</td>
|
||||
<td class="font-medium">{{ response.user.username }}</td>
|
||||
<td class="text-center">
|
||||
<span v-if="response.cost" class="badge badge-sm">{{ response.cost }}</span>
|
||||
<span v-else class="text-base-content/40">—</span>
|
||||
|
||||
Reference in New Issue
Block a user