1
1
import { Box , Flex , Text , useBreakpointValue } from '@chakra-ui/react' ;
2
-
3
2
import axios from 'axios' ;
4
3
import { useRouter } from 'next/router' ;
5
- import { ReactElement , Reducer , useMemo , useReducer } from 'react' ;
4
+ import { ReactElement , Reducer , useCallback , useMemo , useReducer } from 'react' ;
6
5
import { ISliderRange } from '../types' ;
7
6
import { buildWCDict } from '../utils' ;
8
7
import { FilterSearchBar , IFilterSearchBarProps } from '../Widgets' ;
@@ -14,6 +13,7 @@ import { SimpleLink } from '@/components/SimpleLink';
14
13
import { makeSearchParams } from '@/utils/common/search' ;
15
14
import { IADSApiSearchParams } from '@/api/search/types' ;
16
15
import { useGetWordCloud } from '@/api/vis/vis' ;
16
+ import { DataDownloader } from '@/components/DataDownloader' ;
17
17
18
18
const MAX_ROWS_TO_FETCH = 100 ;
19
19
@@ -83,6 +83,14 @@ export const ConceptCloudPageContainer = ({ query }: IConceptCloudPageContainerP
83
83
{ enabled : ! ! query && ! ! query . q && query . q . length > 0 } ,
84
84
) ;
85
85
86
+ const getCSVDataContent = useCallback ( ( ) => {
87
+ let output = 'Word, Idf, Record Count, Total Occurrences\n' ;
88
+ Object . entries ( data ) . map ( ( [ key , value ] ) => {
89
+ output += `"${ key } ","${ value . idf } ","${ value . record_count } ","${ value . total_occurrences } "\n` ;
90
+ } ) ;
91
+ return output ;
92
+ } , [ data ] ) ;
93
+
86
94
// build the word list for graph
87
95
const { wordList, fill } = useMemo ( ( ) => {
88
96
if ( ! data ) {
@@ -132,7 +140,7 @@ export const ConceptCloudPageContainer = ({ query }: IConceptCloudPageContainerP
132
140
) }
133
141
{ isLoading && < LoadingMessage message = "Fetching concept cloud data" /> }
134
142
{ ! isLoading && isSuccess && data && (
135
- < Box >
143
+ < Flex direction = "column" gap = { 2 } >
136
144
< Expandable
137
145
title = "About Concept Cloud"
138
146
description = {
@@ -158,6 +166,13 @@ export const ConceptCloudPageContainer = ({ query }: IConceptCloudPageContainerP
158
166
</ Flex >
159
167
}
160
168
/>
169
+ { data && (
170
+ < DataDownloader
171
+ label = "Download CSV Data"
172
+ getFileContent = { ( ) => getCSVDataContent ( ) }
173
+ fileName = "word-cloud.csv"
174
+ />
175
+ ) }
161
176
< FilterSearchBar
162
177
tagItems = { filterTagItems }
163
178
onRemove = { ( tag ) => dispatch ( { type : 'REMOVE_FILTER' , payload : tag . id as string } ) }
@@ -176,7 +191,7 @@ export const ConceptCloudPageContainer = ({ query }: IConceptCloudPageContainerP
176
191
currentSliderValue = { state . currentSliderValue }
177
192
selectedWords = { state . filters }
178
193
/>
179
- </ Box >
194
+ </ Flex >
180
195
) }
181
196
</ Box >
182
197
) ;
0 commit comments