Skip to content

Commit

Permalink
Added World Cloud analytic visualization and Tag Cloud analytic.
Browse files Browse the repository at this point in the history
  • Loading branch information
ruler501 committed Jan 14, 2020
1 parent e332edd commit 8cc34de
Show file tree
Hide file tree
Showing 7 changed files with 106 additions and 47 deletions.
43 changes: 25 additions & 18 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@
"passport-local": "^1.0.0",
"pug": "^2.0.3",
"quickselect": "^2.0.0",
"react-tagcloud": "^2.0.0",
"request": "^2.88.0",
"rss": "^1.2.2",
"sanitize-html": "^1.20.1",
Expand Down
2 changes: 1 addition & 1 deletion public/js/analytics/colorCurve.js
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,7 @@ onmessage = (e) => {
['Total', curve.total, '#000000'],
].map((color) => ({
label: color[0],
data: color[1],
data: color[1].map((af) => af.toFixed(2)),
fill: false,
backgroundColor: color[2],
borderColor: color[2],
Expand Down
19 changes: 19 additions & 0 deletions public/js/analytics/tagCloud.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
onmessage = (e) => {
if (!e) return;
const cards = e.data;

var tags = {};
cards.forEach((card) =>
card.tags.forEach((tag) => {
if (tags[tag]) {
tags[tag] += card.asfan;
} else {
tags[tag] = card.asfan;
}
}),
);
const words = Object.keys(tags).map((key) => {
return { value: key, count: tags[key] };
});
postMessage({ type: 'cloud', words: words });
};
1 change: 1 addition & 0 deletions src/components/AnalyticsBarChart.js
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ const AnalyticsBarChart = ({ data, title, ...props }) => {
<Row {...props}>
<Col>
<h4 className="d-lg-block d-none">{title}</h4>
Click the labels to filter them out of the datasets.
</Col>
</Row>
<Row>
Expand Down
22 changes: 22 additions & 0 deletions src/components/AnalyticsCloud.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import { TagCloud } from 'react-tagcloud';
import { Col, Row } from 'reactstrap';

const AnalyticsCloud = ({ data, title, ...props }) => {
const colorOptions = { luminosity: 'dark' };
return (
<>
<Row>
<Col>
<h4 className="d-lg-block d-none">{title}</h4>
</Col>
</Row>
<Row>
<Col>
<TagCloud minSize={10} maxSize={80} colorOptions={colorOptions} tags={data['words']} />
</Col>
</Row>
</>
);
};

export default AnalyticsCloud;
65 changes: 37 additions & 28 deletions src/cube_analysis.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import Hash from './util/Hash';
import AddAnalyticModal from './components/AddAnalyticModal';
import AddAnalyticModalContext from './components/AddAnalyticModalContext';
import AnalyticsBarChart from './components/AnalyticsBarChart';
import AnalyticsCloud from './components/AnalyticsCloud';
import AnalyticsTable from './components/AnalyticsTable';
import DynamicFlash from './components/DynamicFlash';
import ErrorBoundary from './components/ErrorBoundary';
Expand All @@ -28,8 +29,16 @@ class CubeAnalysis extends Component {
typeBreakdown: { url: '/js/analytics/typeBreakdown.js', title: 'Type Breakdown' },
typeBreakdownAsfan: { url: '/js/analytics/typeBreakdownAsfan.js', title: 'Type Breakdown Asfans' },
curve: { url: '/js/analytics/colorCurve.js', title: 'Curve' },
tagCloud: { url: '/js/analytics/tagCloud.js', title: 'Tag Cloud' },
},
analytics_order: ['colorCount', 'cumulativeColorCount', 'typeBreakdown', 'typeBreakdownAsfan', 'curve'],
analytics_order: [
'colorCount',
'cumulativeColorCount',
'typeBreakdown',
'typeBreakdownAsfan',
'curve',
'tagCloud',
],
filter: [],
openCollapse: null,
cardsWithAsfan: null,
Expand Down Expand Up @@ -238,39 +247,39 @@ class CubeAnalysis extends Component {
if (data.type == 'table') result = <AnalyticsTable data={this.state.data} title={analytics[active].title} />;
else if (data.type == 'bar')
result = <AnalyticsBarChart data={this.state.data} title={analytics[active].title} />;
else if (data.type == 'cloud')
result = <AnalyticsCloud data={this.state.data} title={analytics[active].title} />;
}
return result;
};
var dropdownElement;
if (cube.draft_formats) {
dropdownElement = (
<Container>
<Row>
<Col>
<h5>{formatId >= 0 ? cube.draft_formats[formatId] : 'Default Draft Format'}</h5>
</Col>
<Col>
<Dropdown isOpen={formatDropdownOpen} toggle={this.toggleFormatDropdownOpen}>
<DropdownToggle caret>Change Draft Format</DropdownToggle>
<DropdownMenu>
<DropdownItem key="default" onClick={() => this.setFormat(-1)}>
Default Draft Format
</DropdownItem>
<DropdownItem header key="customformatsheader">
Custom Formats
</DropdownItem>
{cube.draft_formats
? cube.draft_formats.map((format, formatIndex) => (
<DropdownItem key={format} onClick={() => this.setFormat(formatIndex)}>
{format.title}
</DropdownItem>
))
: ''}
</DropdownMenu>
</Dropdown>
</Col>
</Row>
</Container>
<Row>
<Col>
<h5>{formatId >= 0 ? cube.draft_formats[formatId].title : 'Default Draft Format'}</h5>
</Col>
<Col>
<Dropdown isOpen={formatDropdownOpen} toggle={this.toggleFormatDropdownOpen}>
<DropdownToggle caret>Change Draft Format</DropdownToggle>
<DropdownMenu>
<DropdownItem key="default" onClick={() => this.setFormat(-1)}>
Default Draft Format
</DropdownItem>
<DropdownItem header key="customformatsheader">
Custom Formats
</DropdownItem>
{cube.draft_formats
? cube.draft_formats.map((format, formatIndex) => (
<DropdownItem key={format} onClick={() => this.setFormat(formatIndex)}>
{format.title}
</DropdownItem>
))
: ''}
</DropdownMenu>
</Dropdown>
</Col>
</Row>
);
} else {
dropdownElement = <h5>Default Draft Format</h5>;
Expand Down

0 comments on commit 8cc34de

Please sign in to comment.