mirror of
https://github.com/pds-nest/nest.git
synced 2024-11-22 13:04:19 +00:00
🚧 Begin building the PageRepository
This commit is contained in:
parent
379bc02285
commit
52d08cd798
5 changed files with 122 additions and 31 deletions
|
@ -8,7 +8,7 @@ export default function BoxRepositoryTweets({ tweets, ...props }) {
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<BoxFullScrollable header={"Tweets"} {...props}>
|
<BoxFullScrollable header={"Tweets"} {...props}>
|
||||||
{tweets.map(tweet => <SummaryTweet tweet={tweet}/>)}
|
{tweets.map(tweet => <SummaryTweet key={tweet.snowflake} tweet={tweet}/>)}
|
||||||
</BoxFullScrollable>
|
</BoxFullScrollable>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
15
nest_frontend/components/interactive/PickerFilter.js
Normal file
15
nest_frontend/components/interactive/PickerFilter.js
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
import React from "react"
|
||||||
|
import ButtonIconOnly from "../base/ButtonIconOnly"
|
||||||
|
import { faAt, faChartBar, faClock, faCloud, faHashtag, faMap, faMapPin } from "@fortawesome/free-solid-svg-icons"
|
||||||
|
|
||||||
|
|
||||||
|
export default function PickerFilter({ currentTab, setTab, ...props }) {
|
||||||
|
return (
|
||||||
|
<div {...props}>
|
||||||
|
<ButtonIconOnly onClick={() => setTab("hashtag")} disabled={currentTab === "hashtag"} color={"Grey"} icon={faHashtag}/>
|
||||||
|
<ButtonIconOnly onClick={() => setTab("user")} disabled={currentTab === "user"} color={"Grey"} icon={faAt}/>
|
||||||
|
<ButtonIconOnly onClick={() => setTab("location")} disabled={currentTab === "location"} color={"Grey"} icon={faMapPin}/>
|
||||||
|
<ButtonIconOnly onClick={() => setTab("time")} disabled={currentTab === "time"} color={"Grey"} icon={faClock}/>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
14
nest_frontend/components/interactive/PickerVisualization.js
Normal file
14
nest_frontend/components/interactive/PickerVisualization.js
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
import React from "react"
|
||||||
|
import ButtonIconOnly from "../base/ButtonIconOnly"
|
||||||
|
import { faAt, faChartBar, faClock, faCloud, faHashtag, faMap, faMapPin } from "@fortawesome/free-solid-svg-icons"
|
||||||
|
|
||||||
|
|
||||||
|
export default function PickerVisualization({ currentTab, setTab, ...props }) {
|
||||||
|
return (
|
||||||
|
<div {...props}>
|
||||||
|
<ButtonIconOnly onClick={() => setTab("wordcloud")} disabled={currentTab === "wordcloud"} color={"Grey"} icon={faCloud}/>
|
||||||
|
<ButtonIconOnly onClick={() => setTab("histogram")} disabled={currentTab === "histogram"} color={"Grey"} icon={faChartBar}/>
|
||||||
|
<ButtonIconOnly onClick={() => setTab("map")} disabled={currentTab === "map"} color={"Grey"} icon={faMap}/>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
|
@ -1,11 +1,20 @@
|
||||||
import React from "react"
|
import React, { useMemo, useState } from "react"
|
||||||
import Style from "./PageRepository.module.css"
|
import Style from "./PageRepository.module.css"
|
||||||
import classNames from "classnames"
|
import classNames from "classnames"
|
||||||
import BoxRepositoryTweets from "../components/interactive/BoxRepositoryTweets"
|
import BoxRepositoryTweets from "../components/interactive/BoxRepositoryTweets"
|
||||||
import BoxWordcloud from "../components/interactive/BoxWordcloud"
|
import BoxWordcloud from "../components/interactive/BoxWordcloud"
|
||||||
|
import ButtonIconOnly from "../components/base/ButtonIconOnly"
|
||||||
|
import { faAt, faChartBar, faClock, faCloud, faHashtag, faMap, faMapPin } from "@fortawesome/free-solid-svg-icons"
|
||||||
|
import BoxFull from "../components/base/BoxFull"
|
||||||
|
import BoxHeader from "../components/base/BoxHeader"
|
||||||
|
import PickerVisualization from "../components/interactive/PickerVisualization"
|
||||||
|
import PickerFilter from "../components/interactive/PickerFilter"
|
||||||
|
|
||||||
|
|
||||||
export default function PageRepository({ className, ...props }) {
|
export default function PageRepository({ className, ...props }) {
|
||||||
|
const [visualizationTab, setVisualizationTab] = useState("wordcloud")
|
||||||
|
const [addFilterTab, setAddFilterTab] = useState("hashtag")
|
||||||
|
|
||||||
const tweets = [
|
const tweets = [
|
||||||
{
|
{
|
||||||
"conditions": [],
|
"conditions": [],
|
||||||
|
@ -18,34 +27,66 @@ export default function PageRepository({ className, ...props }) {
|
||||||
},
|
},
|
||||||
]
|
]
|
||||||
|
|
||||||
let preprocessedWords = {}
|
const words = useMemo(
|
||||||
for(const tweet of tweets) {
|
() => {
|
||||||
if(!tweet.content) {
|
let preprocessedWords = {}
|
||||||
continue
|
for(const tweet of tweets) {
|
||||||
}
|
if(!tweet.content) {
|
||||||
for(const word of tweet.content.toLowerCase().split(/\s+/)) {
|
continue
|
||||||
if(!preprocessedWords.hasOwnProperty(word)) {
|
}
|
||||||
preprocessedWords[word] = 0
|
for(const word of tweet.content.toLowerCase().split(/\s+/)) {
|
||||||
|
if(!preprocessedWords.hasOwnProperty(word)) {
|
||||||
|
preprocessedWords[word] = 0
|
||||||
|
}
|
||||||
|
preprocessedWords[word] += 1
|
||||||
|
}
|
||||||
}
|
}
|
||||||
preprocessedWords[word] += 1
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
let processedWords = []
|
let processedWords = []
|
||||||
for(const word in preprocessedWords) {
|
for(const word in preprocessedWords) {
|
||||||
if(!preprocessedWords.hasOwnProperty(word)) {
|
if(!preprocessedWords.hasOwnProperty(word)) {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
processedWords.push({
|
processedWords.push({
|
||||||
text: word,
|
text: word,
|
||||||
value: preprocessedWords[word]
|
value: preprocessedWords[word]
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
return processedWords
|
||||||
|
},
|
||||||
|
[tweets]
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className={classNames(Style.PageRepository, className)} {...props}>
|
<div className={classNames(Style.PageRepository, className)} {...props}>
|
||||||
<BoxRepositoryTweets className={Style.Tweets} tweets={tweets}/>
|
<BoxHeader className={Style.Header}>
|
||||||
<BoxWordcloud className={Style.Wordcloud} words={processedWords}/>
|
Repository Senza Nome
|
||||||
|
</BoxHeader>
|
||||||
|
|
||||||
|
<BoxRepositoryTweets
|
||||||
|
className={Style.Tweets}
|
||||||
|
tweets={tweets}
|
||||||
|
/>
|
||||||
|
|
||||||
|
<PickerVisualization
|
||||||
|
className={Style.VisualizationPicker}
|
||||||
|
currentTab={visualizationTab}
|
||||||
|
setTab={setVisualizationTab}
|
||||||
|
/>
|
||||||
|
{visualizationTab === "wordcloud" ?
|
||||||
|
<BoxWordcloud
|
||||||
|
className={Style.Wordcloud}
|
||||||
|
words={words}
|
||||||
|
/>
|
||||||
|
: null}
|
||||||
|
|
||||||
|
<PickerFilter
|
||||||
|
className={Style.FilterPicker}
|
||||||
|
currentTab={addFilterTab}
|
||||||
|
setTab={setAddFilterTab}
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,24 +2,45 @@
|
||||||
display: grid;
|
display: grid;
|
||||||
|
|
||||||
grid-template-areas:
|
grid-template-areas:
|
||||||
"a b"
|
"h h"
|
||||||
"c d"
|
"a b"
|
||||||
"e f"
|
"a c"
|
||||||
"g h"
|
"d e"
|
||||||
|
"d f"
|
||||||
;
|
;
|
||||||
|
|
||||||
grid-gap: 10px;
|
grid-gap: 10px;
|
||||||
grid-template-columns: 1fr 1fr;
|
grid-template-columns: 1fr 1fr;
|
||||||
grid-template-rows: 1fr auto 1fr auto;
|
grid-template-rows: auto auto 1fr auto auto;
|
||||||
|
|
||||||
width: 100%;
|
width: 100%;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.Header {
|
||||||
|
grid-area: h;
|
||||||
|
}
|
||||||
|
|
||||||
.Tweets {
|
.Tweets {
|
||||||
grid-area: a;
|
grid-area: a;
|
||||||
}
|
}
|
||||||
|
|
||||||
.Wordcloud {
|
.Wordcloud {
|
||||||
|
grid-area: c;
|
||||||
|
}
|
||||||
|
|
||||||
|
.Filters {
|
||||||
|
grid-area: d;
|
||||||
|
}
|
||||||
|
|
||||||
|
.AddFilter {
|
||||||
|
grid-area: f;
|
||||||
|
}
|
||||||
|
|
||||||
|
.FilterPicker {
|
||||||
|
grid-area: e;
|
||||||
|
}
|
||||||
|
|
||||||
|
.VisualizationPicker {
|
||||||
grid-area: b;
|
grid-area: b;
|
||||||
}
|
}
|
Loading…
Reference in a new issue