Skip to content

Commit 4dd3ab8

Browse files
committed
add minAuthorsPublications param
1 parent 0699b39 commit 4dd3ab8

File tree

9 files changed

+76
-18
lines changed

9 files changed

+76
-18
lines changed

client/src/api/openalex/analytic-tool.ts.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,9 @@ export async function fetchOpenAlexAggregations({ query, filters = [] }: Aggrega
6262
// }
6363
// return item;
6464
// });
65+
const total = results?.[0]?.meta?.count;
6566
return {
67+
total,
6668
publicationYear,
6769
publicationType,
6870
authorshipsCountries,

client/src/api/publications/aggregate/analytic-tool.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ function processAuthorsByLabsForStackedChart(buckets: any): StackedChartData {
8484

8585

8686
export async function aggregatePublicationsForAnalyticTool(
87-
{ query, filters = [] }: AggregationArgs
87+
{ query, filters = [], minAuthorsPublications = 5 }: AggregationArgs & { minAuthorsPublications: number }
8888
): Promise<PublicationAggregationsForAnalyticTool> {
8989
const body: any = {
9090
size: 0,
@@ -114,7 +114,7 @@ export async function aggregatePublicationsForAnalyticTool(
114114
terms: {
115115
field: "authors.fullName.keyword",
116116
size: 1000,
117-
min_doc_count: 5,
117+
min_doc_count: minAuthorsPublications,
118118
order: {
119119
_count: "desc"
120120
}
@@ -129,7 +129,7 @@ export async function aggregatePublicationsForAnalyticTool(
129129
terms: {
130130
field: "authors.id_name.keyword",
131131
size: 1000,
132-
min_doc_count: 5,
132+
min_doc_count: minAuthorsPublications,
133133
order: {
134134
_count: "desc"
135135
}
@@ -139,7 +139,7 @@ export async function aggregatePublicationsForAnalyticTool(
139139
terms: {
140140
field: "affiliations.id_name.keyword",
141141
size: 500,
142-
min_doc_count: 5,
142+
min_doc_count: minAuthorsPublications,
143143
},
144144
},
145145
byCountries: {
@@ -152,7 +152,7 @@ export async function aggregatePublicationsForAnalyticTool(
152152
terms: {
153153
field: "authors.id_name.keyword",
154154
size: 5000,
155-
min_doc_count: 5,
155+
min_doc_count: minAuthorsPublications,
156156
},
157157
aggs: {
158158
byLabs: {

client/src/pages/analytics/hooks/useUrl.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ export default function useUrl() {
8383
const [searchParams, setSearchParams] = useSearchParams();
8484
const currentQuery = searchParams.get("q") || "";
8585
const currentTab = searchParams.get("tab") || "1";
86+
const currentMinAuthors = parseInt(searchParams.get("min-authors"), 10) || 5;
8687
const currentFilters = parseSearchFiltersFromURL(searchParams.get("filters"));
8788
const filters = filtersToElasticQuery(currentFilters);
8889

@@ -211,6 +212,14 @@ export default function useUrl() {
211212
[searchParams, setSearchParams]
212213
);
213214

215+
const setMinAuthors = useCallback(
216+
(min) => {
217+
searchParams.set("min-authors", min)
218+
setSearchParams(searchParams)
219+
},
220+
[searchParams, setSearchParams]
221+
);
222+
214223
const values = useMemo(() => {
215224
return {
216225
handleTabChange,
@@ -225,6 +234,8 @@ export default function useUrl() {
225234
handleDeleteFilter,
226235
handleRangeFilterChange,
227236
handleBoolFilterChange,
237+
setMinAuthors,
238+
currentMinAuthors
228239
};
229240
}, [
230241
handleTabChange,
@@ -239,6 +250,8 @@ export default function useUrl() {
239250
handleDeleteFilter,
240251
handleRangeFilterChange,
241252
handleBoolFilterChange,
253+
setMinAuthors,
254+
currentMinAuthors
242255
]);
243256

244257
return values;

client/src/pages/analytics/openalex/index.tsx

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,24 @@
1-
import { Col, Row, Title } from "@dataesr/dsfr-plus";
1+
import { Col, Row, Text, Title } from "@dataesr/dsfr-plus";
22
import AnalyticsGraph from "../../../components/analytics-graph";
33
import getBarChartOptions from "../../../components/analytics-graph/graph-options/bar";
44
import getYearChartOptions from "../../../components/analytics-graph/graph-options/years";
55
import AnalyticsSkeleton from "../../../components/skeleton/analytics-skeleton";
66
import useOpenalexAnalyticsData from "./hooks/useOpenalexAnalyticsData.ts";
77
import CurrentFilters from "./components/current-filters.tsx";
88
import Filters from "./components/filters/index.tsx";
9+
import useUrl from "../hooks/useUrl.ts";
910

1011

1112
export default function OpenalexAnalytics() {
13+
const { currentQuery } = useUrl();
1214
const { data, isLoading, isError } = useOpenalexAnalyticsData();
1315
if (isError) return "Une erreur est survenue";
1416
if (isLoading) return <AnalyticsSkeleton />;
1517

1618

1719

1820
const {
21+
total,
1922
publicationYear,
2023
publicationType,
2124
authorshipsCountries,
@@ -86,9 +89,11 @@ export default function OpenalexAnalytics() {
8689
<>
8790
<Row gutters>
8891
<Col xs="12">
89-
<hr />
9092
<Title as="h2" look="h4">
91-
A l'international
93+
A l'international: {total} publications
94+
<Text size="xs" className="fr-text--regular fr-text-mention--grey">
95+
pour la recherche {currentQuery}
96+
</Text>
9297
</Title>
9398
<CurrentFilters />
9499
<Filters />
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import { Button, Text } from "@dataesr/dsfr-plus";
2+
import useUrl from "../../../hooks/useUrl";
3+
import { useState } from "react";
4+
5+
export default function MinAuthorsParam() {
6+
const { currentMinAuthors, setMinAuthors } = useUrl()
7+
const [minAuthorsLocal, setMinAuthorsLocal] = useState(currentMinAuthors)
8+
9+
10+
return (
11+
<>
12+
<Text className="fr-mb-0" bold size="md">
13+
Nombre de publications minimum pour un auteur
14+
</Text>
15+
<Text className="fr-mb-0 fr-text-mention--grey" size="xs">
16+
Une nombre de publications plus faible peut impacter les performances de la recherche. Réduisez si vous optenez peu d'auteurs ou aucun auteur.
17+
</Text>
18+
<Text className="fr-mb-3v fr-text-mention--grey" size="xs">
19+
Valeur conseillée : 5
20+
</Text>
21+
<div style={{ display: 'flex', alignItems: 'center', gap: '1rem' }}>
22+
<input style={{ width: '250px' }} max={100} min={1} className="fr-input" type="number" value={minAuthorsLocal} onChange={(e) => setMinAuthorsLocal(parseInt(e.target.value))} />
23+
<Button onClick={() => setMinAuthors(minAuthorsLocal)}>Valider</Button>
24+
</div>
25+
</>
26+
)
27+
}

client/src/pages/analytics/publications/components/filters/index.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import PublicationFunderFilter from "./funders";
44
import PublicationTypeFilter from "./types";
55
import PublicationYearFilter from "./years";
66
import useFilters from "../../hooks/useFilters";
7+
import MinAuthorsParam from "./authors";
78

89
export default function PublicationsFilters() {
910
const { isLoading } = useFilters()
@@ -16,6 +17,8 @@ export default function PublicationsFilters() {
1617
<hr className="fr-mt-3w" />
1718
<PublicationTypeFilter />
1819
<hr className="fr-mt-3w" />
20+
<MinAuthorsParam />
21+
<hr className="fr-mt-3w" />
1922
<PublicationFunderFilter />
2023
<hr className="fr-mt-3w" />
2124
</Container>

client/src/pages/analytics/publications/hooks/usePublicationsAnalyticsData.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,15 @@ import type { PublicationAggregationsForAnalyticTool } from "../../../../types/p
55
import useUrl from "../../hooks/useUrl";
66

77
export default function usePublicationsAnalyticsData() {
8-
const { currentQuery, filters } = useUrl();
8+
const { currentQuery, filters, currentMinAuthors } = useUrl();
99

1010
const { data, isLoading, isError } = useQuery<
1111
PublicationAggregationsForAnalyticTool,
1212
unknown,
1313
PublicationAggregationsForAnalyticTool
1414
>({
15-
queryKey: ["analytics-publications-data", currentQuery, filters],
16-
queryFn: () => aggregatePublicationsForAnalyticTool({ query: currentQuery, filters }),
15+
queryKey: ["analytics-publications-data", currentQuery, filters, currentMinAuthors],
16+
queryFn: () => aggregatePublicationsForAnalyticTool({ query: currentQuery, filters, minAuthorsPublications: currentMinAuthors }),
1717
});
1818

1919
const values = useMemo(() => {

client/src/pages/analytics/publications/index.tsx

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { Col, Row, Title } from "@dataesr/dsfr-plus";
1+
import { Col, Row, Text, Title } from "@dataesr/dsfr-plus";
22
import AnalyticsGraph from "../../../components/analytics-graph";
33
import getBarChartOptions from "../../../components/analytics-graph/graph-options/bar";
44
import getDonutOptions from "../../../components/analytics-graph/graph-options/donut";
@@ -12,8 +12,10 @@ import Network from "./components/network";
1212
import CurrentFilters from "./components/current-filters.tsx";
1313
import Filters from "./components/filters/index.tsx";
1414
import usePublicationsAnalyticsData from "./hooks/usePublicationsAnalyticsData.ts";
15+
import useUrl from "../hooks/useUrl.ts";
1516

1617
export default function PublicationsAnalytics() {
18+
const { currentMinAuthors, currentQuery } = useUrl();
1719
const { data, isLoading, isError } = usePublicationsAnalyticsData();
1820
if (isError) return "Une erreur est survenue";
1921
if (isLoading) return <AnalyticsSkeleton />;
@@ -96,18 +98,24 @@ export default function PublicationsAnalytics() {
9698
<Row gutters>
9799
<Col xs="12">
98100
<div
99-
className="fr-mb-3w"
101+
className="fr-mb-1w"
100102
style={{
101103
display: "flex",
102104
justifyContent: "space-between",
103-
alignItems: "center",
105+
alignItems: "flex-start",
106+
gap: "1rem",
104107
}}
105108
>
106109
<Title
107110
as="h2"
108111
look="h4"
109112
className="fr-mb-0"
110-
>{`${publicationsCount} publications françaises`}</Title>
113+
>
114+
{`${publicationsCount} publications françaises`}
115+
<Text size="xs" className="fr-text--regular fr-text-mention--grey">
116+
pour la recherche {currentQuery}
117+
</Text>
118+
</Title>
111119
<ResultExports />
112120
</div>
113121
<CurrentFilters />
@@ -160,14 +168,14 @@ export default function PublicationsAnalytics() {
160168
<Col xs="6">
161169
<AnalyticsGraph
162170
title="Auteurs identifiés (avec idRef)"
163-
description={`${authorsWithMoreThan5Publications} auteurs ont plus de 5 publications - après alignement sur le référentiel auteur idref`}
171+
description={`${authorsWithMoreThan5Publications} auteurs ont plus de ${currentMinAuthors} publications - après alignement sur le référentiel auteur idref`}
164172
options={authorsOptions}
165173
/>
166174
</Col>
167175
<Col xs="6">
168176
<AnalyticsGraph
169177
title="Auteurs par nom complet dans la publication"
170-
description={`${authorsFullNamesWithMoreThan5Publications} auteurs ont plus de 5 publications - sans alignement, uniquement à partir du nom/prénom`}
178+
description={`${authorsFullNamesWithMoreThan5Publications} auteurs ont plus de ${currentMinAuthors} publications - sans alignement, uniquement à partir du nom/prénom`}
171179
options={authorsFullNamesOptions}
172180
/>
173181
</Col>

client/src/pages/tools/publications-analytics/hooks/useAnalytics.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ export type AnalyticsData = {
1515
};
1616

1717
async function fetchAnalytics({ query, filters }) {
18-
const publicationsQuery = aggregatePublicationsForAnalyticTool({ query, filters });
18+
const publicationsQuery = aggregatePublicationsForAnalyticTool({ query, filters, minAuthorsPublications: 5 });
1919
const patentsQuery = aggregatePatentsForAnalyticTool({ query });
2020
const projectsQuery = aggregateProjectsForAnalyticsTool({ query });
2121
const [publications, patents, projects] = await Promise.all([publicationsQuery, patentsQuery, projectsQuery]);

0 commit comments

Comments
 (0)