add most liked comments widget

This commit is contained in:
Riley Davis
2017-02-22 10:47:23 -07:00
parent 6398e2faad
commit bc48496327
12 changed files with 100 additions and 36 deletions
@@ -3,14 +3,6 @@
flex-wrap: wrap;
}
.widget {
box-sizing: border-box;
margin: 10px 5px 5px 5px;
box-shadow: 0px 0px 5px 0px rgba(0,0,0,0.2);
padding: 15px;
width: calc(50% - 10px);
}
.heading {
margin: 0;
font-size: 1.5rem;
@@ -1,20 +1,15 @@
import React from 'react';
import styles from './Dashboard.css';
import FlagWidget from '../../components/FlagWidget';
import LikeWidget from '../../components/LikeWidget';
import FlagWidget from './FlagWidget';
import LikeWidget from './LikeWidget';
import MostLikedCommentsWidget from './MostLikedCommentsWidget';
const Dashboard = () => {
return (
<div className={styles.Dashboard}>
<div className={styles.widget}>
<FlagWidget />
</div>
<div className={styles.widget}>
<h2 className={styles.heading}>Top ten comments with the most likes</h2>
</div>
<div className={styles.widget}>
<LikeWidget />
</div>
<FlagWidget />
<MostLikedCommentsWidget />
<LikeWidget />
</div>
);
};
@@ -18,7 +18,7 @@ const FlagWidget = (props) => {
const {data: {metrics: assets}} = props;
return (
<div>
<div className={styles.widget}>
<h2 className={styles.heading}>Top Ten Articles with the most flagged comments</h2>
<table className={styles.widgetTable}>
<thead className={styles.widgetHead}>
@@ -18,7 +18,7 @@ const LikeWidget = (props) => {
const {data: {metrics: assets}} = props;
return (
<div>
<div className={styles.widget}>
<h2 className={styles.heading}>Top Ten Articles with the most likes</h2>
<table className={styles.widgetTable}>
<thead className={styles.widgetHead}>
@@ -0,0 +1,35 @@
import React from 'react';
import {compose} from 'react-apollo';
import {mostLikedComments} from 'coral-admin/src/graphql/queries';
import I18n from 'coral-framework/modules/i18n/i18n';
import translations from 'coral-admin/src/translations';
import ModerationQueue from 'coral-admin/src/containers/ModerationQueue/ModerationQueue';
import {Spinner} from 'coral-ui';
import styles from './Widget.css';
const lang = new I18n(translations);
const MostLikedCommentsWidget = props => {
if (props.data.loading) {
return <Spinner />;
}
const {data: {comments}} = props;
console.log('MostLikedCommentsWidget', comments);
return (
<div className={styles.widget}>
<h2 className={styles.heading}>most liked comments</h2>
<ModerationQueue
comments={comments}
suspectWords={[]}
showBanUserDialog={() => {}}
acceptComment={() => {}}
rejectComment={() => {}} />
</div>
);
};
export default compose(mostLikedComments)(MostLikedCommentsWidget);
@@ -1,3 +1,11 @@
.widget {
box-sizing: border-box;
margin: 10px 5px 5px 5px;
box-shadow: 0px 0px 5px 0px rgba(0,0,0,0.2);
padding: 15px;
width: calc(50% - 10px);
}
.heading {
margin: 0;
font-size: 1.5rem;
@@ -66,6 +66,8 @@ class ModerationContainer extends Component {
}
}
const comments = data[activeTab];
return (
<div>
<ModerationHeader asset={asset} />
@@ -76,9 +78,8 @@ class ModerationContainer extends Component {
flaggedCount={data.flaggedCount}
/>
<ModerationQueue
data={data}
currentAsset={asset}
activeTab={activeTab}
comments={comments}
suspectWords={settings.wordlist.suspect}
showBanUserDialog={props.showBanUserDialog}
acceptComment={props.acceptComment}
@@ -3,12 +3,12 @@ import React, {PropTypes} from 'react';
import Comment from './components/Comment';
import {actionsMap} from './helpers/moderationQueueActionsMap';
const ModerationQueue = ({activeTab = 'premod', ...props}) => {
const ModerationQueue = ({comments, ...props}) => {
return (
<div id="moderationList">
<ul>
{
props.data[activeTab].map((comment, i) => {
comments.map((comment, i) => {
const status = comment.action_summaries ? 'FLAGGED' : comment.status;
return <Comment
key={i}
@@ -29,7 +29,7 @@ const ModerationQueue = ({activeTab = 'premod', ...props}) => {
};
ModerationQueue.propTypes = {
data: PropTypes.object.isRequired
comments: PropTypes.array.isRequired
};
export default ModerationQueue;
@@ -13,7 +13,7 @@ fragment metrics on Asset {
}
query Metrics ($from: Date!, $to: Date!, $sort: ACTION_TYPE!) {
metrics(from: $from, to: $to, sort: $sort) {
metrics: assetMetrics(from: $from, to: $to, sort: $sort) {
...metrics
}
}
@@ -0,0 +1,19 @@
query CommentMetrics ($from: Date!, $to: Date!, $sort: ACTION_TYPE!) {
comments: commentMetrics(from: $from, to: $to, sort: $sort) {
id
body
user {
status
username
}
asset {
id
title
}
created_at
action_summaries {
type: __typename
count
}
}
}
@@ -1,9 +1,10 @@
import {graphql} from 'react-apollo';
import METRICS from './metrics.graphql';
import ASSET_METRICS from './assetMetrics.graphql';
import COMMENT_METRICS from './commentMetrics.graphql';
import MOD_QUEUE_QUERY from './modQueueQuery.graphql';
export const mostFlags = graphql(METRICS, {
export const mostFlags = graphql(ASSET_METRICS, {
options: () => {
// currently hard-coded per Greg's advice
@@ -19,7 +20,23 @@ export const mostFlags = graphql(METRICS, {
}
});
export const mostLikes = graphql(METRICS, {
export const mostLikes = graphql(ASSET_METRICS, {
options: () => {
// currently hard-coded per Greg's advice
const fiveMinutesAgo = new Date();
fiveMinutesAgo.setMinutes(fiveMinutesAgo.getMinutes() - 5);
return {
variables: {
sort: 'LIKE',
from: fiveMinutesAgo.toISOString(),
to: new Date().toISOString()
}
};
}
});
export const mostLikedComments = graphql(COMMENT_METRICS, {
options: () => {
// currently hard-coded per Greg's advice
@@ -138,12 +138,9 @@ class SignUpContent extends React.Component {
</div>
}
<div className={styles.footer}>
<span>
{lang.t('signIn.alreadyHaveAnAccount')}
<a id="coralSignInViewTrigger" onClick={() => changeView('SIGNIN')}>
{lang.t('signIn.signIn')}
</a>
</span>
{lang.t('signIn.alreadyHaveAnAccount')} <a id="coralSignInViewTrigger" onClick={() => changeView('SIGNIN')}>
{lang.t('signIn.signIn')}
</a>
</div>
</div>
);