Skip to content

Commit 0a9eea8

Browse files
[Resources] Sort by optional date reviewed (#25793)
* [Resources] Sort by optional date reviewed * Update src/components/ResourcesBySelector.tsx Co-authored-by: Pedro Sousa <[email protected]> * Tweak --------- Co-authored-by: Pedro Sousa <[email protected]>
1 parent cd01d50 commit 0a9eea8

File tree

1 file changed

+66
-55
lines changed

1 file changed

+66
-55
lines changed

src/components/ResourcesBySelector.tsx

Lines changed: 66 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -72,83 +72,94 @@ export default function ResourcesBySelector({
7272

7373
// Keep facets organized by filterable field for left sidebar
7474

75-
const visibleResources = resources.filter((resource) => {
76-
// Handle top filter (ReactSelect)
77-
if (filterPlacement === "top" && selectedFilter && filters) {
78-
const filterableValues: string[] = [];
79-
for (const filter of filters) {
80-
if (filter === "products" && resource.data.productTitles) {
81-
// Use resolved product titles for products filter
82-
filterableValues.push(...resource.data.productTitles);
83-
} else {
84-
const val = resource.data[filter as keyof typeof resource.data];
85-
if (val) {
86-
if (Array.isArray(val) && val.every((v) => typeof v === "string")) {
87-
filterableValues.push(...val);
88-
} else if (
89-
Array.isArray(val) &&
90-
val.every((v) => typeof v === "object")
91-
) {
92-
filterableValues.push(...val.map((v) => v.id));
93-
} else if (typeof val === "string") {
94-
filterableValues.push(val);
95-
}
96-
}
97-
}
98-
}
99-
if (!filterableValues.includes(selectedFilter)) return false;
100-
}
101-
102-
// Handle left sidebar filters
103-
if (filterPlacement === "left" && filters) {
104-
// Check each filterable field separately
105-
for (const [filterField, selectedValues] of Object.entries(
106-
leftFilters.selectedValues,
107-
)) {
108-
if (selectedValues.length > 0) {
109-
const resourceValues: string[] = [];
110-
if (filterField === "products" && resource.data.productTitles) {
75+
const visibleResources = resources
76+
.filter((resource) => {
77+
// Handle top filter (ReactSelect)
78+
if (filterPlacement === "top" && selectedFilter && filters) {
79+
const filterableValues: string[] = [];
80+
for (const filter of filters) {
81+
if (filter === "products" && resource.data.productTitles) {
11182
// Use resolved product titles for products filter
112-
resourceValues.push(...resource.data.productTitles);
83+
filterableValues.push(...resource.data.productTitles);
11384
} else {
114-
const val =
115-
resource.data[filterField as keyof typeof resource.data];
85+
const val = resource.data[filter as keyof typeof resource.data];
11686
if (val) {
11787
if (
11888
Array.isArray(val) &&
11989
val.every((v) => typeof v === "string")
12090
) {
121-
resourceValues.push(...val);
91+
filterableValues.push(...val);
12292
} else if (
12393
Array.isArray(val) &&
12494
val.every((v) => typeof v === "object")
12595
) {
126-
resourceValues.push(...val.map((v) => v.id));
96+
filterableValues.push(...val.map((v) => v.id));
12797
} else if (typeof val === "string") {
128-
resourceValues.push(val);
98+
filterableValues.push(val);
12999
}
130100
}
131101
}
132-
if (!resourceValues.some((v) => selectedValues.includes(v))) {
133-
return false;
134-
}
135102
}
103+
if (!filterableValues.includes(selectedFilter)) return false;
136104
}
137105

138-
// Search filter
139-
if (leftFilters.search) {
140-
const searchTerm = leftFilters.search.toLowerCase();
141-
const title = resource.data.title?.toLowerCase() || "";
142-
const description = resource.data.description?.toLowerCase() || "";
106+
// Handle left sidebar filters
107+
if (filterPlacement === "left" && filters) {
108+
// Check each filterable field separately
109+
for (const [filterField, selectedValues] of Object.entries(
110+
leftFilters.selectedValues,
111+
)) {
112+
if (selectedValues.length > 0) {
113+
const resourceValues: string[] = [];
114+
if (filterField === "products" && resource.data.productTitles) {
115+
// Use resolved product titles for products filter
116+
resourceValues.push(...resource.data.productTitles);
117+
} else {
118+
const val =
119+
resource.data[filterField as keyof typeof resource.data];
120+
if (val) {
121+
if (
122+
Array.isArray(val) &&
123+
val.every((v) => typeof v === "string")
124+
) {
125+
resourceValues.push(...val);
126+
} else if (
127+
Array.isArray(val) &&
128+
val.every((v) => typeof v === "object")
129+
) {
130+
resourceValues.push(...val.map((v) => v.id));
131+
} else if (typeof val === "string") {
132+
resourceValues.push(val);
133+
}
134+
}
135+
}
136+
if (!resourceValues.some((v) => selectedValues.includes(v))) {
137+
return false;
138+
}
139+
}
140+
}
141+
142+
// Search filter
143+
if (leftFilters.search) {
144+
const searchTerm = leftFilters.search.toLowerCase();
145+
const title = resource.data.title?.toLowerCase() || "";
146+
const description = resource.data.description?.toLowerCase() || "";
143147

144-
if (!title.includes(searchTerm) && !description.includes(searchTerm)) {
145-
return false;
148+
if (
149+
!title.includes(searchTerm) &&
150+
!description.includes(searchTerm)
151+
) {
152+
return false;
153+
}
146154
}
147155
}
148-
}
149156

150-
return true;
151-
});
157+
return true;
158+
})
159+
.sort(
160+
(a, b) =>
161+
Number(b?.data?.reviewed ?? 600) - Number(a?.data?.reviewed ?? 600),
162+
);
152163

153164
useEffect(() => {
154165
const params = new URLSearchParams(window.location.search);

0 commit comments

Comments
 (0)