Skip to content

Commit 220842e

Browse files
Merge remote-tracking branch 'origin/staging'
2 parents 0862ecd + e0bea78 commit 220842e

File tree

28 files changed

+178
-151
lines changed

28 files changed

+178
-151
lines changed

client/public/icons/sort-desc.svg

Lines changed: 1 addition & 0 deletions
Loading

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

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,10 @@ function processAuthorsByLabsForStackedChart(buckets: any): StackedChartData {
2929
const authorName = parts[1];
3030
const labs = bucket.byLabs.buckets
3131
?.filter(lab => lab.key.startsWith(idref))
32-
?.map(lab => lab.key.split('###')[3])
32+
?.map(lab => lab.key.split('###')[3]?.split('_')?.[1]?.split('|||')?.[0])
3333
const labsWithCount = bucket.byLabs.buckets
3434
?.filter(lab => lab.key.startsWith(idref))
35-
?.map(lab => [lab.key.split('###')[3], lab.doc_count])
35+
?.map(lab => [lab.key.split('###')[3]?.split('_')?.[1]?.split('|||')?.[0], lab.doc_count])
3636

3737
allAuthors.set(authorName, labs);
3838
labs?.forEach(lab => categories.add(lab));
@@ -41,8 +41,6 @@ function processAuthorsByLabsForStackedChart(buckets: any): StackedChartData {
4141
});
4242
});
4343

44-
console.log(categoriesCounts.get('IRIG'))
45-
4644
const categoryTotals = new Map<string, number>();
4745
[...categories].forEach(lab => {
4846
const singleCount = [...allAuthors].filter(([, authorLabs]) => authorLabs.includes(lab) && authorLabs.length === 1).length;
@@ -264,11 +262,11 @@ export async function aggregatePublicationsForAnalyticTool(
264262
.filter(el => el) || [];
265263
const byLabsMap = data?.byLabs?.buckets
266264
?.filter((element) => element.key.split('###')?.[0].match(/^[0-9]{9}[A-Z]{1}$/))
267-
?.filter((element) => element.key.split('###')?.[2])
265+
?.filter((element) => element.key.split('###')?.[3])
268266
.map((element) => {
269267
return {
270-
lat: Number(element.key.split('###')?.[2].split('|')?.[0]),
271-
lon: Number(element.key.split('###')?.[2].split('|')?.[1]),
268+
lat: Number(element.key.split('###')?.[3].split('|')?.[0]),
269+
lon: Number(element.key.split('###')?.[3].split('|')?.[1]),
272270
name: element.key.split('###')?.[1]?.split('_')?.[1]?.split('|||')?.[0],
273271
z: element.doc_count,
274272
}

client/src/api/trends/trends.ts

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -50,21 +50,31 @@ function computeTrends(
5050
const filteredItems = sortedItems.filter(({ label }: { label: string }) => label.toLowerCase().includes(includes))
5151

5252
// Compute top items
53-
const topCount = filteredItems.slice(minItems, maxItems)
54-
const topSlope = filteredItems
53+
const countDesc = filteredItems.slice(minItems, maxItems)
54+
const trendDesc = filteredItems
5555
.slice()
5656
.sort((a, b) => (normalized ? b.norm_slope - a.norm_slope : b.slope - a.slope))
5757
.slice(minItems, maxItems)
58-
const botSlope = filteredItems
58+
const trendAsc = filteredItems
5959
.slice()
6060
.sort((a, b) => (normalized ? a.norm_slope - b.norm_slope : a.slope - b.slope))
6161
.slice(minItems, maxItems)
62+
const variationDesc = filteredItems
63+
.slice()
64+
.sort((a, b) => b.variation - a.variation)
65+
.slice(minItems, maxItems)
66+
const variationAsc = filteredItems
67+
.slice()
68+
.sort((a, b) => a.variation - b.variation)
69+
.slice(minItems, maxItems)
6270

6371
const trends = {
6472
ranking: {
65-
"count-top": topCount,
66-
"trend-top": topSlope,
67-
"trend-bot": botSlope,
73+
"count-desc": countDesc,
74+
"variation-desc": variationDesc,
75+
"variation-asc": variationAsc,
76+
"trend-desc": trendDesc,
77+
"trend-asc": trendAsc,
6878
},
6979
searchTotal: sortedItems.length,
7080
searchPages: Math.ceil(sortedItems.length / ITEMS_PER_PAGE),

client/src/pages/tools/publications-analytics/components/analytics.tsx

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ export default function Analytics() {
7171
<Row gutters>
7272
<Col xs="12">
7373
<div className="fr-mb-3w" style={{ display: "flex", justifyContent: "space-between", alignItems: "center" }}>
74-
<Title as="h2" look="h4" className="fr-mb-0">{`${publicationsCount} publications`}</Title>
74+
<Title as="h2" look="h4" className="fr-mb-0">{`${publicationsCount} publications françaises`}</Title>
7575
<ResultExports />
7676
</div>
7777
<hr />
@@ -99,8 +99,8 @@ export default function Analytics() {
9999
</Col>
100100
<Col xs="4">
101101
<AnalyticsGraph
102-
title="Pays"
103-
description="Top 15 des pays représentés dans les publications"
102+
title="Collaboration internationale de la France"
103+
description="Top 15 des pays qui collaborent avec la France"
104104
options={countriesOptions}
105105
/>
106106
</Col>
@@ -119,15 +119,15 @@ export default function Analytics() {
119119
</Col>
120120
<Col xs="6">
121121
<AnalyticsGraph
122-
title="Auteurs identifiés avec idRef"
123-
description={`${authorsWithMoreThan5Publications} auteurs ont plus de 5 publications`}
122+
title="Auteurs identifiés (avec idRef)"
123+
description={`${authorsWithMoreThan5Publications} auteurs ont plus de 5 publications - après alignement sur le référentiel auteur idref`}
124124
options={authorsOptions}
125125
/>
126126
</Col>
127127
<Col xs="6">
128128
<AnalyticsGraph
129129
title="Auteurs par nom complet dans la publication"
130-
description={`${authorsFullNamesWithMoreThan5Publications} auteurs ont plus de 5 publications`}
130+
description={`${authorsFullNamesWithMoreThan5Publications} auteurs ont plus de 5 publications - sans alignement, uniquement à partir du nom/prénom`}
131131
options={authorsFullNamesOptions}
132132
/>
133133
</Col>

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

Lines changed: 0 additions & 46 deletions
This file was deleted.

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

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,6 @@ export default function useNetworks(currentModel: "authors" | "structures") {
3434
}),
3535
})
3636

37-
console.log(currentModel, data)
38-
39-
4037
const values = useMemo(() => {
4138
return {
4239
currentQuery,

client/src/pages/trends/components/options-bar/index.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import TrendsSelectSourceButton from "../select-source/button"
55
import TrendsFiltersButton from "../filters/button"
66
import TrendsParametersButton from "../parameters/button"
77
import useIntegration from "../../hooks/useIntegration"
8+
import TrendsSelectSortButton from "../select-sort/button"
89

910
export default function TrendsOptionsBar() {
1011
const { integrationOptions } = useIntegration()
@@ -20,6 +21,7 @@ export default function TrendsOptionsBar() {
2021
<TrendsSelectSourceButton />
2122
</Container>
2223
<Container fluid style={{ display: "flex", flexWrap: "wrap" }}>
24+
<TrendsSelectSortButton />
2325
<TrendsFiltersButton />
2426
<TrendsParametersButton />
2527
</Container>

client/src/pages/trends/components/options-bar/modals.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,15 @@ import TrendsSearchBarModal from "../search-bar/modal"
44
import TrendsSelectSourceModal from "../select-source/modal"
55
import TrendsSelectModelModal from "../select-model/modal"
66
import TrendsFiltersModal from "../filters/modal"
7+
import TrendsSelectSortModal from "../select-sort/modal"
78

89
export default function TrendsOptionsModals() {
910
return (
1011
<Container fluid>
1112
<TrendsSearchBarModal />
1213
<TrendsSelectModelModal />
1314
<TrendsSelectSourceModal />
15+
<TrendsSelectSortModal />
1416
<TrendsFiltersModal />
1517
<TrendsParametersModal />
1618
</Container>

client/src/pages/trends/components/parameters/modal.tsx

Lines changed: 2 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,13 @@ import { Button, Container } from "@dataesr/dsfr-plus"
22
import Modal from "../../../../components/modal"
33
import ToggleNormalize from "./toggle-normalize"
44
import { useIntl } from "react-intl"
5-
import useTrends from "../../hooks/useTrends"
65
import useOptions from "../../hooks/useOptions"
76

87
export default function TrendsParametersModal() {
98
const intl = useIntl()
10-
const { isFetching } = useTrends()
119
const { setNormalized } = useOptions()
1210

13-
const resetParameters = () => setNormalized(true)
11+
const resetParameters = () => setNormalized(false)
1412

1513
const id = "trends-options-parameters-modal"
1614

@@ -25,16 +23,7 @@ export default function TrendsParametersModal() {
2523
{intl.formatMessage({ id: "trends.parameters.modal.reset" })}
2624
</Button>
2725
</div>
28-
<Button
29-
disabled={isFetching}
30-
onClick={() => {
31-
const element = document.getElementById(id)
32-
// @ts-expect-error dsfr does not have types
33-
window.dsfr(element).modal.conceal()
34-
}}
35-
>
36-
{intl.formatMessage({ id: "trends.parameters.modal.display" })}
37-
</Button>
26+
<Button aria-controls={id}>{intl.formatMessage({ id: "trends.parameters.modal.display" })}</Button>
3827
</div>
3928
</Modal>
4029
)

client/src/pages/trends/components/ranking/header/index.tsx

Lines changed: 23 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,51 +1,42 @@
1+
import cn from "classnames"
12
import { useIntl } from "react-intl"
23
import useTrends from "../../../hooks/useTrends"
3-
import { useTrendsContext } from "../../../context"
44
import useOptions from "../../../hooks/useOptions"
5-
import { trendsRankingSortFromId, trendsRankingSortFromLabel } from "../../../config/sorting"
6-
7-
function SortIcon({ sort, currentSort, sortIcon }: { sort: string; currentSort: string; sortIcon: string }) {
8-
if (sort !== currentSort) return null
9-
return <span className={`fr-icon-${sortIcon}`} aria-hidden="true" />
10-
}
5+
import { useTrendsContext } from "../../../context"
6+
import { useState } from "react"
7+
import { TextInput } from "@dataesr/dsfr-plus"
118

129
export default function TrendsTableHeader() {
1310
const intl = useIntl()
11+
const [openSearch, setOpenSearch] = useState(false)
12+
const { includes, setIncludes } = useTrendsContext()
1413
const { trendsYears } = useTrends()
15-
const { sort, setSort, setFocus } = useTrendsContext()
16-
const { currentModel, handlePageChange } = useOptions()
17-
const currentSort = trendsRankingSortFromId(sort)
14+
const { currentModel } = useOptions()
1815

19-
const handleSortChange = (sortLabel: string) => {
20-
const headerSort = trendsRankingSortFromLabel(sortLabel)
21-
// set next sort
22-
sortLabel === currentSort.label ? currentSort?.nextSort && setSort(currentSort.nextSort) : setSort(headerSort.id) // change sorting
23-
handlePageChange(1) // reset page
24-
setFocus("") // reset focus
16+
const handleOpenSearchChange = () => {
17+
if (openSearch === true) setIncludes("") // reset includes if closing
18+
setOpenSearch(!openSearch)
2519
}
2620

27-
const sortIcon = currentSort.order === "top" ? "arrow-up-line" : "arrow-down-line"
28-
2921
return (
3022
<thead>
3123
<tr>
32-
<th>Rank</th>
33-
<th onClick={() => console.log("domains")}>{intl.formatMessage({ id: `trends.ranking.header.domains` })}</th>
34-
<th className="sort-button" onClick={() => handleSortChange("count")}>
35-
{intl.formatMessage({ id: `trends.ranking.header.count` }, { max: trendsYears.max })}
36-
<SortIcon sort="count" currentSort={currentSort.label} sortIcon={sortIcon} />
24+
<th className={cn("action", openSearch ? "open" : "")} onClick={handleOpenSearchChange}>
25+
{<span className="fr-icon-search-line" />}
26+
</th>
27+
<th>
28+
{openSearch ? (
29+
<TextInput value={includes} placeholder="Search topics" onChange={(event) => setIncludes(event.target.value)} />
30+
) : (
31+
intl.formatMessage({ id: `trends.ranking.header.domains` })
32+
)}
3733
</th>
38-
<th
39-
className="sort-button"
40-
onClick={() => handleSortChange("variation")}
41-
title={`The variation between the volume in ${trendsYears.max} and the previous years average volume`}
42-
>
43-
Growth
44-
<SortIcon sort="variation" currentSort={currentSort.label} sortIcon={sortIcon} />
34+
<th>{intl.formatMessage({ id: `trends.ranking.header.count` }, { max: trendsYears.max })}</th>
35+
<th title={`The variation between the volume in ${trendsYears.max} and the previous years average volume`}>
36+
{intl.formatMessage({ id: `trends.ranking.header.variation` })}
4537
</th>
46-
<th className="sort-button" onClick={() => handleSortChange("trend")}>
38+
<th>
4739
{intl.formatMessage({ id: `trends.ranking.header.trend` }, { count: trendsYears.max - trendsYears.min + 1 })}
48-
<SortIcon sort="trend" currentSort={currentSort.label} sortIcon={sortIcon} />
4940
</th>
5041
{currentModel === "entity-fishing" && <th>Description</th>}
5142
{currentModel !== "entity-fishing" && currentModel !== "open-alex-domains" && <th>Category</th>}

0 commit comments

Comments
 (0)