diff -r 000000000000 -r 5f4fcbc80b37 clientjs/packages/dashboard-components/src/pages/charts.jsx --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clientjs/packages/dashboard-components/src/pages/charts.jsx Fri Sep 14 17:57:34 2018 +0200 @@ -0,0 +1,116 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import { connect } from 'react-redux'; + +import _ from 'lodash'; +import { FormattedMessage } from 'react-intl'; +import { categoryColors } from '../utils'; + +import RowChart from '../ui/RowChart'; + + +/** + * TODO: As a first implementation we have chosen to delagate the barchart DOM drawing to D3. + * This may not be the optimum solution. This may have to be rewrittten to use + * React for elementt creation and D3 as the visualisation kernel. This + */ +const ChartsPage = ({ chartsCounts }) => ( +
+
+

+
+ + + { (chartsCounts.actions.data.length > 0) && ( +
+

+
+ )} + { (chartsCounts.actions.data.length > 0) && } + + { (chartsCounts.categories.data.length > 0) && ( +
+

+
+ )} + { (chartsCounts.categories.data.length > 0) && } + +
+); + +ChartsPage.propTypes = { + chartsCounts: PropTypes.object.isRequired, + metacategories: PropTypes.arrayOf(PropTypes.object).isRequired, + topics: PropTypes.arrayOf(PropTypes.string).isRequired, +}; + +export default connect( + (state, props) => { + const { topics, metacategories } = props; + const annotations = state.annotations.items; + const topicsList = topics.map(t => t.toLowerCase()); + let tagsCount = _.reduce( + metacategories, + (res, m) => { + res[`cat:${m.tag}`] = { + id: m.id, + count: 0, + tag: m.tag, + color: categoryColors[m.id], + }; + return res; + }, + {}, + ); + tagsCount = _.reduce( + annotations, + (res, annot) => { + annot.tags.forEach((tg) => { + const t = tg.toLowerCase(); + if (t.startsWith('cat:')) { + const s = t.substr(4); + if (!(t in res)) { + res[t] = { + id: s, + count: 0, + tag: s, + color: (categoryColors[s] || 'gray'), + }; + } + res[t].count += 1; + } else if (t.startsWith('need:')) { + const s = t.substr(5); + if (!(t in res)) { + res[t] = { + id: s, + count: 0, + tag: s, + color: 'gray', + }; + } + res[t].count += 1; + } else if (topicsList.includes(t)) { + if (!(t in res)) { + res[t] = { + id: t, + count: 0, + tag: t, + color: 'gray', + }; + } + res[t].count += 1; + } + }); + return res; + }, + tagsCount, + ); + return { + chartsCounts: { + metacategories: { data: _.reduce(tagsCount, (res, v, k) => (k.startsWith('cat:') ? [...res, v] : res), []), tagPrefix: 'cat:' }, + actions: { data: _.reduce(tagsCount, (res, v, k) => (k.startsWith('need:') ? [...res, v] : res), []), tagPrefix: 'need:' }, + categories: { data: _.reduce(tagsCount, (res, v, k) => (topicsList.includes(k.toLowerCase()) ? [...res, v] : res), []), tagPrefix: '' }, + }, + }; + }, +)(ChartsPage);