From 75e2f3cf27529a19d9bd74a774213331884c866b Mon Sep 17 00:00:00 2001 From: Dan Schultz Date: Thu, 10 Jan 2019 18:15:45 -0500 Subject: [PATCH] Baseline react demonstration This commit is way too large, but there isn't a huge amount of value in breaking it up at this point... I always say that. Anyway, this contains a very basic interface to show off the talking point tracker functionality as it stands. It even includes a VERY IMPRESSIVE logo which is safe to consider 100% final. This is written in react, and leverages graphQL to load in the data itself. Issue #13 --- src/client/ApolloClient.js | 7 + src/client/components/App.js | 68 ++++++++++ src/client/components/Dashboard.js | 141 ++++++++++++++++++++ src/client/components/EntityDetail.js | 165 ++++++++++++++++++++++++ src/client/components/FrequencyBar.js | 53 ++++++++ src/client/components/FrequencyChart.js | 54 ++++++++ src/client/components/Header.js | 38 ++++++ src/client/components/SentenceViewer.js | 50 +++++++ src/client/components/TimePicker.js | 103 +++++++++++++++ src/client/helpers.js | 0 src/client/index.html | 13 ++ src/client/index.js | 20 +++ src/client/logo.png | Bin 0 -> 63349 bytes src/client/registerServiceWorker.js | 117 +++++++++++++++++ src/client/setup/config.js | 5 + src/client/setup/routes.js | 9 ++ src/client/style.css | 103 +++++++++++++++ src/server/index.js | 3 + 18 files changed, 949 insertions(+) create mode 100644 src/client/ApolloClient.js create mode 100644 src/client/components/App.js create mode 100644 src/client/components/Dashboard.js create mode 100644 src/client/components/EntityDetail.js create mode 100644 src/client/components/FrequencyBar.js create mode 100644 src/client/components/FrequencyChart.js create mode 100644 src/client/components/Header.js create mode 100644 src/client/components/SentenceViewer.js create mode 100644 src/client/components/TimePicker.js create mode 100644 src/client/helpers.js create mode 100644 src/client/index.html create mode 100644 src/client/index.js create mode 100644 src/client/logo.png create mode 100644 src/client/registerServiceWorker.js create mode 100644 src/client/setup/config.js create mode 100644 src/client/setup/routes.js create mode 100644 src/client/style.css diff --git a/src/client/ApolloClient.js b/src/client/ApolloClient.js new file mode 100644 index 0000000..d556ec5 --- /dev/null +++ b/src/client/ApolloClient.js @@ -0,0 +1,7 @@ +import ApolloClient from 'apollo-boost' + +const client = new ApolloClient({ + uri: 'http://localhost:3000/graphql', +}) + +export default client diff --git a/src/client/components/App.js b/src/client/components/App.js new file mode 100644 index 0000000..e9f83f3 --- /dev/null +++ b/src/client/components/App.js @@ -0,0 +1,68 @@ +// Imports +import React from 'react' +import { ApolloProvider } from 'react-apollo' +import { Route, BrowserRouter as Router } from 'react-router-dom' + +// App Imports +import Dashboard from './Dashboard' +import EntityDetail from './EntityDetail' +import Header from './Header' +import client from '../ApolloClient' + +// Component +class App extends React.Component { + state = {} + + setStartTime = (startTime) => { + this.setState({ startTime }) + } + + setEndTime = (endTime) => { + this.setState({ endTime }) + } + + render() { + const { startTime, endTime } = this.state + return ( + <> +
+ + +
+ ( + + ) + } + /> + ( + + ) + } + /> + + +
+ + ) + } +} + +export default App diff --git a/src/client/components/Dashboard.js b/src/client/components/Dashboard.js new file mode 100644 index 0000000..abcf599 --- /dev/null +++ b/src/client/components/Dashboard.js @@ -0,0 +1,141 @@ +import React from 'react' +import PropTypes from 'prop-types' + +import { Query } from 'react-apollo' +import gql from 'graphql-tag' + +import FrequencyChart from './FrequencyChart' +import SentenceViewer from './SentenceViewer' + +const ALL_ENTITIES_QUERY = gql` + query ALL_ENTITIES_QUERY( + $after: String, + $before: String) { + namedEntities ( + after: $after, + before: $before + ) { + entity + type + createdAt + } + } +` + +const RECENT_SENTENCES_QUERY = gql` + query RECENT_SENTENCES_QUERY($after: String!) { + sentences ( + after: $after + ) { + content + createdAt + } + } +` + +class Dashboard extends React.Component { + static propTypes = { + startTime: PropTypes.number, + endTime: PropTypes.number, + } + + static defaultProps = { + startTime: null, + endTime: null, + } + + render() { + const { startTime, endTime } = this.props + const currentDate = new Date() + return ( + <> +
+
+
+

Keyword Counts

+ + {({ data, error, loading }) => { + if (loading) { + return

Loading...

+ } + if (error) { + return ( +

+Error: + {error.message} +

+ ) + } + + const aggregatedData = data.namedEntities.reduce((accumulator, currentValue) => { + if (!(currentValue.entity in accumulator)) { + accumulator[currentValue.entity] = 0 + } + accumulator[currentValue.entity] += 1 + return accumulator + }, {}) + + const masterList = Object.keys(aggregatedData).map(key => ({ + key, + val: aggregatedData[key], + })) + + const sortedList = masterList.sort((a, b) => a.val < b.val) + + const labels = sortedList.map(x => x.key) + const values = sortedList.map(x => x.val) + + return ( + + ) + }} +
+
+
+
+
+

Recent Transcript

+ + {({ data, error, loading }) => { + if (loading) { + return

Loading...

+ } + if (error) { + return ( +

+Error: + {error.message} +

+ ) + } + return ( + + ) + }} +
+
+
+

Recent Entities

+
+
+
+ + ) + } +} + +export default Dashboard diff --git a/src/client/components/EntityDetail.js b/src/client/components/EntityDetail.js new file mode 100644 index 0000000..fdd61ee --- /dev/null +++ b/src/client/components/EntityDetail.js @@ -0,0 +1,165 @@ +import React from 'react' +import PropTypes from 'prop-types' +import qs from 'query-string' + +import { Query } from 'react-apollo' +import gql from 'graphql-tag' + +import FrequencyChart from './FrequencyChart' +import SentenceViewer from './SentenceViewer' + +const RELATED_ENTITIES_QUERY = gql` + query RELATED_ENTITIES_QUERY( + $relatedTo: String!, + $after: String, + $before: String) { + namedEntities ( + relatedTo: $relatedTo, + after: $after, + before: $before + ) { + entity + type + createdAt + } + } +` + +const RELATED_SENTENCES_QUERY = gql` + query RELATED_SENTENCES_QUERY( + $relatedTo: String!, + $after: String, + $before: String) { + sentences ( + relatedTo: $relatedTo, + after: $after, + before: $before + ) { + id + content + createdAt + } + } +` + +class EntityDetail extends React.Component { + static propTypes = { + location: PropTypes.shape({ + search: PropTypes.string, + }).isRequired, + startTime: PropTypes.number, + endTime: PropTypes.number, + } + + static defaultProps = { + startTime: null, + endTime: null, + } + + render() { + const { location, startTime, endTime } = this.props + const relatedTo = qs.parse(location.search, { ignoreQueryPrefix: true }).entity + + return ( + <> +
+
+
+

+ Content referencing + " + {relatedTo} + " +

+ + {({ data, error, loading }) => { + if (loading) { + return

Loading...

+ } + if (error) { + return ( +

+Error: + {error.message} +

+ ) + } + return ( + + ) + }} +
+
+
+
+
+

Count over time

+
+
+

Related Keywords

+ + {({ data, error, loading }) => { + if (loading) { + return

Loading...

+ } + if (error) { + return ( +

+Error: + {error.message} +

+ ) + } + + const aggregatedData = data.namedEntities.reduce((accumulator, currentValue) => { + if (!(currentValue.entity in accumulator)) { + accumulator[currentValue.entity] = 0 + } + accumulator[currentValue.entity] += 1 + return accumulator + }, {}) + + const masterList = Object.keys(aggregatedData).map(key => ({ + key, + val: aggregatedData[key], + })) + + const sortedList = masterList.sort((a, b) => a.val < b.val) + + const labels = sortedList.map(x => x.key) + const values = sortedList.map(x => x.val) + + return ( + + ) + }} +
+
+
+
+ + ) + } +} + +export default EntityDetail diff --git a/src/client/components/FrequencyBar.js b/src/client/components/FrequencyBar.js new file mode 100644 index 0000000..34f2f6e --- /dev/null +++ b/src/client/components/FrequencyBar.js @@ -0,0 +1,53 @@ +import React from 'react' +import PropTypes from 'prop-types' +import { withRouter } from 'react-router-dom' + +class FrequencyBar extends React.Component { + static propTypes = { + label: PropTypes.string.isRequired, + width: PropTypes.number.isRequired, + val: PropTypes.number.isRequired, + history: PropTypes.shape({ + push: PropTypes.func, + }).isRequired, + } + + entitySelected = () => { + const { history, label } = this.props + history.push(`/detail?entity=${label}`) + } + + render() { + const { label, width, val } = this.props + + const barStyle = { + width: `${width}%`, + textAlign: 'right', + } + const countStyle = { + position: 'relative', + right: '-2px', + paddingLeft: '100%', + } + const trStyle = { + height: '10px', + cursor: 'pointer', + } + return ( + <> + + + { label } + + +
+
{ val }
+
+ + + + ) + } +} + +export default withRouter(FrequencyBar) diff --git a/src/client/components/FrequencyChart.js b/src/client/components/FrequencyChart.js new file mode 100644 index 0000000..d7b7e96 --- /dev/null +++ b/src/client/components/FrequencyChart.js @@ -0,0 +1,54 @@ +import React from 'react' +import PropTypes from 'prop-types' + +import { scaleLinear } from 'd3-scale' +import { max } from 'd3-array' +import FrequencyBar from './FrequencyBar' + +class FrequencyChart extends React.Component { + static propTypes = { + data: PropTypes.arrayOf(PropTypes.number).isRequired, + labels: PropTypes.arrayOf(PropTypes.string).isRequired, + } + + render() { + const { data, labels } = this.props + const dataMax = max(data) + const xScale = scaleLinear() + .domain([0, dataMax]) + .range([0, 100]) + + const bars = data.map((d, i) => ( + + )) + + const divStyle = { + overflow: 'auto', + paddingRight: '50px', + } + + const tableStyle = { + width: '100%', + } + + return ( + <> +
+ + + {bars} + +
+
+ + ) + } +} + +export default FrequencyChart diff --git a/src/client/components/Header.js b/src/client/components/Header.js new file mode 100644 index 0000000..e87c871 --- /dev/null +++ b/src/client/components/Header.js @@ -0,0 +1,38 @@ +import React from 'react' +import PropTypes from 'prop-types' +import TimePicker from './TimePicker' + +import logo from '../logo.png' + +class Header extends React.Component { + static propTypes = { + setStartTime: PropTypes.func.isRequired, + setEndTime: PropTypes.func.isRequired, + } + + render() { + const { setStartTime, setEndTime } = this.props + return <> + + + } +} + +export default Header diff --git a/src/client/components/SentenceViewer.js b/src/client/components/SentenceViewer.js new file mode 100644 index 0000000..f82e49a --- /dev/null +++ b/src/client/components/SentenceViewer.js @@ -0,0 +1,50 @@ +import React from 'react' +import PropTypes from 'prop-types' + +class SentenceViewer extends React.Component { + static propTypes = { + sentences: PropTypes.arrayOf(PropTypes.object).isRequired, + } + + render() { + const { sentences } = this.props + const renderedSentences = sentences.map((d) => { + const timestamp = new Date(Number(d.createdAt)) + return ( +
+
+
+
+ {timestamp.getMonth() + 1} + {timestamp.getDate()} + {timestamp.getFullYear()} +
+
+ {timestamp.getHours()} + {timestamp.getMinutes()} + {timestamp.getSeconds()} +
+
CSPAN
+
+
+
+
{d.content}
+
+
+ ) + }) + + return ( + <> +
+ {renderedSentences} +
+ + ) + } +} + +export default SentenceViewer diff --git a/src/client/components/TimePicker.js b/src/client/components/TimePicker.js new file mode 100644 index 0000000..30501c0 --- /dev/null +++ b/src/client/components/TimePicker.js @@ -0,0 +1,103 @@ +import React from 'react' +import PropTypes from 'prop-types' +import DatePicker from 'react-datepicker' + +class TimePicker extends React.Component { + static propTypes = { + setStartTime: PropTypes.func.isRequired, + setEndTime: PropTypes.func.isRequired, + } + + state = { + timeType: 'AllTime', + startDate: new Date(), + endDate: new Date(), + } + + updateType = (event) => { + const { setStartTime, setEndTime } = this.props + const { startDate, endDate } = this.state + this.setState({ timeType: event.target.value }) + if (event.target.value === 'AllTime') { + setStartTime(null) + setEndTime(null) + } + if (event.target.value === 'After') { + setStartTime(startDate) + setEndTime(null) + } + if (event.target.value === 'Before') { + setStartTime(null) + setEndTime(endDate) + } + if (event.target.value === 'Between') { + setStartTime(startDate) + setEndTime(endDate) + } + } + + handleStartChange = (newDate) => { + const { setStartTime } = this.props + this.setState({ startDate: newDate }) + setStartTime(newDate) + } + + handleEndChange = (newDate) => { + const { setEndTime } = this.props + this.setState({ endDate: newDate }) + setEndTime(newDate) + } + + render() { + const { startDate, endDate, timeType } = this.state + return ( + <> +
+
+ +
+
+ { (timeType === 'After' + || timeType === 'Between') + && ( + + ) + } + { (timeType === 'Between' + || timeType === 'Before') + && ( + + ) + } + { timeType === 'InThePast' + && ( + + ) + } +
+
+ + ) + } +} + +export default TimePicker diff --git a/src/client/helpers.js b/src/client/helpers.js new file mode 100644 index 0000000..e69de29 diff --git a/src/client/index.html b/src/client/index.html new file mode 100644 index 0000000..28b8d09 --- /dev/null +++ b/src/client/index.html @@ -0,0 +1,13 @@ + + + + + + Talking Point Tracker + + + +
+ + + diff --git a/src/client/index.js b/src/client/index.js new file mode 100644 index 0000000..81670a5 --- /dev/null +++ b/src/client/index.js @@ -0,0 +1,20 @@ +// Imports +import React from 'react' +import ReactDOM from 'react-dom' +import { unregister } from './registerServiceWorker' + +// App Imports +import App from './components/App' + +// CSS Imports +import 'react-datepicker/dist/react-datepicker.css' +import './style.css' + +// Render App +ReactDOM.render( + , + document.getElementById('root'), +) + +// registerServiceWorker() +unregister() diff --git a/src/client/logo.png b/src/client/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..c0f95dd0ca43b3eaf77edaaee15e4d0180036efc GIT binary patch literal 63349 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 lPqrmhiRv9`vP`*P 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 SFF!$mKeCca5|v^Gf&UBg-KW9; literal 0 HcmV?d00001 diff --git a/src/client/registerServiceWorker.js b/src/client/registerServiceWorker.js new file mode 100644 index 0000000..eb803e9 --- /dev/null +++ b/src/client/registerServiceWorker.js @@ -0,0 +1,117 @@ +// In production, we register a service worker to serve assets from local cache. + +// This lets the app load faster on subsequent visits in production, and gives +// it offline capabilities. However, it also means that developers (and users) +// will only see deployed updates on the "N+1" visit to a page, since previously +// cached resources are updated in the background. + +// To learn more about the benefits of this model, read https://goo.gl/KwvDNy. +// This link also includes instructions on opting out of this behavior. + +const isLocalhost = Boolean( + window.location.hostname === 'localhost' + // [::1] is the IPv6 localhost address. + || window.location.hostname === '[::1]' + // 127.0.0.1/8 is considered localhost for IPv4. + || window.location.hostname.match( + /^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/, + ), +) + +function registerValidSW(swUrl) { + navigator.serviceWorker + .register(swUrl) + .then((registration) => { + registration.onupdatefound = () => { // eslint-disable-line no-param-reassign + const installingWorker = registration.installing + installingWorker.onstatechange = () => { + if (installingWorker.state === 'installed') { + if (navigator.serviceWorker.controller) { + // At this point, the old content will have been purged and + // the fresh content will have been added to the cache. + // It's the perfect time to display a "New content is + // available; please refresh." message in your web app. + console.log('New content is available; please refresh.') + } else { + // At this point, everything has been precached. + // It's the perfect time to display a + // "Content is cached for offline use." message. + console.log('Content is cached for offline use.') + } + } + } + } + }) + .catch((error) => { + console.error('Error during service worker registration:', error) + }) +} + +function checkValidServiceWorker(swUrl) { + // Check if the service worker can be found. If it can't reload the page. + fetch(swUrl) + .then((response) => { + // Ensure service worker exists, and that we really are getting a JS file. + if ( + response.status === 404 + || response.headers.get('content-type').indexOf('javascript') === -1 + ) { + // No service worker found. Probably a different app. Reload the page. + navigator.serviceWorker.ready.then((registration) => { + registration.unregister().then(() => { + window.location.reload() + }) + }) + } else { + // Service worker found. Proceed as normal. + registerValidSW(swUrl) + } + }) + .catch(() => { + console.log( + 'No internet connection found. App is running in offline mode.', + ) + }) +} + +export default function register() { + if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) { + // The URL constructor is available in all browsers that support SW. + const publicUrl = new URL(process.env.PUBLIC_URL, window.location) + if (publicUrl.origin !== window.location.origin) { + // Our service worker won't work if PUBLIC_URL is on a different origin + // from what our page is served on. This might happen if a CDN is used to + // serve assets; see https://github.com/facebookincubator/create-react-app/issues/2374 + return + } + + window.addEventListener('load', () => { + const swUrl = `${process.env.PUBLIC_URL}/service-worker.js` + + if (isLocalhost) { + // This is running on localhost. Lets check if a service worker still exists or not. + checkValidServiceWorker(swUrl) + + // Add some additional logging to localhost, pointing developers to the + // service worker/PWA documentation. + navigator.serviceWorker.ready.then(() => { + console.log( + 'This web app is being served cache-first by a service ' + + 'worker. To learn more, visit https://goo.gl/SC7cgQ', + ) + }) + } else { + // Is not local host. Just register service worker + registerValidSW(swUrl) + } + }) + } +} + +export function unregister() { + if ('serviceWorker' in navigator) { + navigator.serviceWorker.ready.then((registration) => { + registration.unregister() + }) + } +} diff --git a/src/client/setup/config.js b/src/client/setup/config.js new file mode 100644 index 0000000..7e4c242 --- /dev/null +++ b/src/client/setup/config.js @@ -0,0 +1,5 @@ +// Configurations + +// URL +export const APP_URL = process.env.REACT_APP_URL +export const APP_URL_API = process.env.REACT_APP_URL_API diff --git a/src/client/setup/routes.js b/src/client/setup/routes.js new file mode 100644 index 0000000..7505afd --- /dev/null +++ b/src/client/setup/routes.js @@ -0,0 +1,9 @@ +// App Imports +import { APP_URL_API } from './config' + +// APP Routes +export const routes = { + home: '/', +} + +export const routesApi = APP_URL_API diff --git a/src/client/style.css b/src/client/style.css new file mode 100644 index 0000000..1607546 --- /dev/null +++ b/src/client/style.css @@ -0,0 +1,103 @@ +@import url('https://fonts.googleapis.com/css?family=Roboto'); + +body { + background-color: #252830; + font-family: 'Roboto', sans-serif; + font-weight: 300; +} +a:hover { + text-decoration: none; +} +h1 { + font-weight: 300; + color: #fff; +} + +h2 { + font-size: 24px; + font-weight: 300; + border-bottom: 2px solid #252830; + padding-bottom: 5px; +} + +#header { + padding: 20px 5px; +} + +#header h1 { +} + +#globalTimePicker { + padding-left: 20px; +} + +#globalTimePicker select { + width: 300px; + background-color: #b59922; + border-color: #b3ae5f; + color: #fff; + margin-bottom: 5px; +} + +#globalTimePicker .react-datepicker-wrapper { + margin-right: 10px; +} +#globalTimePicker .react-datepicker-wrapper input { + width: 145px; +} + +.bar { + background: #009fb7; +} + +.elementContainer { + background: #fff; + border: 1px solid #d1d1d1; + padding: 20px; + margin: 10px; + boxShadow: 0 3px 5px 2px rgba(255, 105, 135, .3); + border-radius: 3px; +} + +.sentences .sentence { + border-bottom: 1px #ccc dashed; + padding: 20px; + margin: 0px; +} +.sentences .info { + font-size: 14px; + padding-right: 5px; + height:100%; + width: 70px; +} +.sentences .info .date { + font-size: 10px; + color: #666; +} +.sentences .info .time { + font-size: 14px; +} +.sentences .info .channel { + text-align: center; + border-radius:5px; + background: #4f6367; + font-weight: bold; + color: #fff; +} +.frequencyBar .label { + overflow: auto; + white-space: nowrap; +} + +.logo { + float: left; + height: 100px; +} + +.title { + font-size: 24px; + font-weight: bold; + text-transform: uppercase; + line-height: 50px; + color: #CC8D4D; +} diff --git a/src/server/index.js b/src/server/index.js index 2f6946b..e988160 100644 --- a/src/server/index.js +++ b/src/server/index.js @@ -3,6 +3,7 @@ import express from 'express' import dotenv from 'dotenv' import graphqlHTTP from 'express-graphql' import path from 'path' +import cors from 'cors' import schema from './schema' @@ -19,6 +20,8 @@ const server = http.createServer(app) // Serve the static / compiled content app.use('/static', express.static(path.join(__dirname, '../public'))) +// Enable cors +app.use(cors()) // GraphQL setup app.use('/graphql', graphqlHTTP({