Spaces:
Running
Running
update
Browse files
client/src/components/LeaderboardFilters/LeaderboardFilters.jsx
CHANGED
@@ -239,9 +239,7 @@ const LeaderboardFilters = ({ allSections = [] }) => {
|
|
239 |
count={count}
|
240 |
isActive={isSelected}
|
241 |
onClick={() => {
|
242 |
-
|
243 |
-
setSelectedCategories(id);
|
244 |
-
}
|
245 |
}}
|
246 |
colors={groupColors[currentGroup]}
|
247 |
/>
|
|
|
239 |
count={count}
|
240 |
isActive={isSelected}
|
241 |
onClick={() => {
|
242 |
+
setSelectedCategories(id);
|
|
|
|
|
243 |
}}
|
244 |
colors={groupColors[currentGroup]}
|
245 |
/>
|
client/src/components/LeaderboardSection/index.jsx
CHANGED
@@ -1,4 +1,4 @@
|
|
1 |
-
import React from "react";
|
2 |
import { Box } from "@mui/material";
|
3 |
import { useLeaderboard } from "../../context/LeaderboardContext";
|
4 |
import SectionHeader from "./components/SectionHeader";
|
@@ -30,6 +30,43 @@ const LeaderboardSection = ({
|
|
30 |
const { languages, languageStats, LANGUAGE_FAMILIES, findLanguageFamily } =
|
31 |
useLanguageStats(leaderboards, filteredLeaderboards);
|
32 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
33 |
// Filtrer pour n'avoir que les leaderboards approuvés
|
34 |
const approvedLeaderboards = filteredLeaderboards.filter(
|
35 |
(leaderboard) => leaderboard.approval_status === "approved"
|
@@ -88,7 +125,7 @@ const LeaderboardSection = ({
|
|
88 |
return (
|
89 |
<Box sx={{ mb: 6 }}>
|
90 |
<SectionHeader
|
91 |
-
title={
|
92 |
count={approvedLeaderboards.length}
|
93 |
isExpanded={isExpanded}
|
94 |
onToggleExpand={toggleExpanded}
|
@@ -110,7 +147,7 @@ const LeaderboardSection = ({
|
|
110 |
{approvedLeaderboards.length === 0 ? (
|
111 |
// Afficher EmptyState uniquement si showEmptyState est true
|
112 |
showEmptyState ? (
|
113 |
-
<EmptyState title={
|
114 |
) : null
|
115 |
) : (
|
116 |
<LeaderboardGrid
|
|
|
1 |
+
import React, { useMemo } from "react";
|
2 |
import { Box } from "@mui/material";
|
3 |
import { useLeaderboard } from "../../context/LeaderboardContext";
|
4 |
import SectionHeader from "./components/SectionHeader";
|
|
|
30 |
const { languages, languageStats, LANGUAGE_FAMILIES, findLanguageFamily } =
|
31 |
useLanguageStats(leaderboards, filteredLeaderboards);
|
32 |
|
33 |
+
// Créer un titre enrichi qui inclut les filtres de langue
|
34 |
+
const enrichedTitle = useMemo(() => {
|
35 |
+
let newTitle = title;
|
36 |
+
|
37 |
+
// Ajouter les langues sélectionnées au titre si elles ne sont pas déjà incluses
|
38 |
+
if (selectedLanguage && selectedLanguage.size > 0) {
|
39 |
+
const languageNames = Array.from(selectedLanguage)
|
40 |
+
.map((lang) => lang.charAt(0).toUpperCase() + lang.slice(1))
|
41 |
+
.join(", ");
|
42 |
+
|
43 |
+
// Vérifier si le titre contient déjà "language"
|
44 |
+
if (!newTitle.toLowerCase().includes("language")) {
|
45 |
+
newTitle = `${newTitle} + Language: ${languageNames}`;
|
46 |
+
} else if (
|
47 |
+
!newTitle.toLowerCase().includes(languageNames.toLowerCase())
|
48 |
+
) {
|
49 |
+
// Si le titre contient "language" mais pas les noms spécifiques
|
50 |
+
newTitle = newTitle.replace(
|
51 |
+
/language(\s+specific)?/i,
|
52 |
+
`Language: ${languageNames}`
|
53 |
+
);
|
54 |
+
}
|
55 |
+
}
|
56 |
+
|
57 |
+
// Ajouter le terme de recherche s'il existe
|
58 |
+
if (
|
59 |
+
searchQuery &&
|
60 |
+
!newTitle
|
61 |
+
.toLowerCase()
|
62 |
+
.includes(`matching "${searchQuery.toLowerCase()}"`)
|
63 |
+
) {
|
64 |
+
newTitle = `${newTitle} matching "${searchQuery}"`;
|
65 |
+
}
|
66 |
+
|
67 |
+
return newTitle;
|
68 |
+
}, [title, selectedLanguage, searchQuery]);
|
69 |
+
|
70 |
// Filtrer pour n'avoir que les leaderboards approuvés
|
71 |
const approvedLeaderboards = filteredLeaderboards.filter(
|
72 |
(leaderboard) => leaderboard.approval_status === "approved"
|
|
|
125 |
return (
|
126 |
<Box sx={{ mb: 6 }}>
|
127 |
<SectionHeader
|
128 |
+
title={enrichedTitle}
|
129 |
count={approvedLeaderboards.length}
|
130 |
isExpanded={isExpanded}
|
131 |
onToggleExpand={toggleExpanded}
|
|
|
147 |
{approvedLeaderboards.length === 0 ? (
|
148 |
// Afficher EmptyState uniquement si showEmptyState est true
|
149 |
showEmptyState ? (
|
150 |
+
<EmptyState title={enrichedTitle} searchQuery={searchQuery} />
|
151 |
) : null
|
152 |
) : (
|
153 |
<LeaderboardGrid
|
client/src/components/common/FilterTag.jsx
CHANGED
@@ -13,18 +13,17 @@ const FilterTag = ({
|
|
13 |
isActive,
|
14 |
onClick,
|
15 |
colors = DEFAULT_COLORS,
|
|
|
16 |
}) => {
|
17 |
-
const isDisabled = count === 0;
|
18 |
-
|
19 |
return (
|
20 |
<Button
|
21 |
onClick={onClick}
|
22 |
variant={isActive ? "contained" : "outlined"}
|
23 |
size="small"
|
24 |
-
disabled={
|
25 |
sx={{
|
26 |
textTransform: "none",
|
27 |
-
cursor:
|
28 |
mb: 0.75,
|
29 |
backgroundColor: (theme) => {
|
30 |
if (isActive) {
|
@@ -38,9 +37,10 @@ const FilterTag = ({
|
|
38 |
if (isActive) {
|
39 |
return "white";
|
40 |
}
|
41 |
-
return colors.main;
|
42 |
},
|
43 |
-
borderColor: colors.main,
|
|
|
44 |
"&:hover": {
|
45 |
backgroundColor: (theme) => {
|
46 |
if (isActive) {
|
@@ -48,7 +48,8 @@ const FilterTag = ({
|
|
48 |
}
|
49 |
return colors.light;
|
50 |
},
|
51 |
-
opacity: isDisabled ? 0.
|
|
|
52 |
},
|
53 |
"& .MuiTouchRipple-root": {
|
54 |
transition: "none",
|
@@ -66,6 +67,7 @@ const FilterTag = ({
|
|
66 |
gap: 0.75,
|
67 |
color: isActive ? "white" : "inherit",
|
68 |
ml: 0.75,
|
|
|
69 |
}}
|
70 |
>
|
71 |
<Box
|
|
|
13 |
isActive,
|
14 |
onClick,
|
15 |
colors = DEFAULT_COLORS,
|
16 |
+
isDisabled = count === 0,
|
17 |
}) => {
|
|
|
|
|
18 |
return (
|
19 |
<Button
|
20 |
onClick={onClick}
|
21 |
variant={isActive ? "contained" : "outlined"}
|
22 |
size="small"
|
23 |
+
disabled={false}
|
24 |
sx={{
|
25 |
textTransform: "none",
|
26 |
+
cursor: "pointer",
|
27 |
mb: 0.75,
|
28 |
backgroundColor: (theme) => {
|
29 |
if (isActive) {
|
|
|
37 |
if (isActive) {
|
38 |
return "white";
|
39 |
}
|
40 |
+
return isDisabled ? alpha(colors.main, 0.7) : colors.main;
|
41 |
},
|
42 |
+
borderColor: isDisabled ? alpha(colors.main, 0.6) : colors.main,
|
43 |
+
opacity: isDisabled ? 0.7 : 1,
|
44 |
"&:hover": {
|
45 |
backgroundColor: (theme) => {
|
46 |
if (isActive) {
|
|
|
48 |
}
|
49 |
return colors.light;
|
50 |
},
|
51 |
+
opacity: isDisabled ? 0.8 : 0.9,
|
52 |
+
borderColor: isDisabled ? alpha(colors.main, 0.7) : colors.main,
|
53 |
},
|
54 |
"& .MuiTouchRipple-root": {
|
55 |
transition: "none",
|
|
|
67 |
gap: 0.75,
|
68 |
color: isActive ? "white" : "inherit",
|
69 |
ml: 0.75,
|
70 |
+
opacity: isDisabled ? 0.7 : 1,
|
71 |
}}
|
72 |
>
|
73 |
<Box
|