From b9c816285d19580caed5bab06701cc582fe36f98 Mon Sep 17 00:00:00 2001 From: gaba Date: Thu, 23 Mar 2017 14:48:15 -0700 Subject: [PATCH 1/6] Fix params for moduserflaggedquery. --- .../containers/Community/FlaggedAccounts.js | 27 +++++++++---------- .../coral-admin/src/graphql/queries/index.js | 10 ++++++- .../queries/modUserFlaggedQuery.graphql | 4 +-- 3 files changed, 24 insertions(+), 17 deletions(-) diff --git a/client/coral-admin/src/containers/Community/FlaggedAccounts.js b/client/coral-admin/src/containers/Community/FlaggedAccounts.js index 1a6d349c8..692cef70d 100644 --- a/client/coral-admin/src/containers/Community/FlaggedAccounts.js +++ b/client/coral-admin/src/containers/Community/FlaggedAccounts.js @@ -7,13 +7,15 @@ const lang = new I18n(translations); import styles from './Community.css'; import Loading from './Loading'; -import EmptyCard from '../../components/EmptyCard'; +import EmptyCard from 'coral-admin/src/components/EmptyCard'; import User from './components/User'; const FlaggedAccounts = ({...props}) => { const {commenters, isFetching} = props; const hasResults = !isFetching && commenters && !!commenters.length; +// if (commenter.status === 'PENDING' && commenter.actions.length > 0) { + return (
@@ -21,19 +23,16 @@ const FlaggedAccounts = ({...props}) => { { hasResults ? commenters.map((commenter, index) => { - if (commenter.status === 'PENDING' && commenter.actions.length > 0) { - return ; - } - return null; + return ; }) : {lang.t('community.no-flagged-accounts')} } diff --git a/client/coral-admin/src/graphql/queries/index.js b/client/coral-admin/src/graphql/queries/index.js index 291ea6bc5..f0e8e5b70 100644 --- a/client/coral-admin/src/graphql/queries/index.js +++ b/client/coral-admin/src/graphql/queries/index.js @@ -67,7 +67,15 @@ export const loadMore = (fetchMore) => ({limit, cursor, sort, tab, asset_id}) => }); }; -export const modUserFlaggedQuery = graphql(MOD_USER_FLAGGED_QUERY); +export const modUserFlaggedQuery = graphql(MOD_USER_FLAGGED_QUERY, { + options: ({params: {action_type = 'FLAG'}}) => { + return { + variables: { + action_type: action_type + } + }; + } +}); export const modQueueResort = (id, fetchMore) => (sort) => { return fetchMore({ diff --git a/client/coral-admin/src/graphql/queries/modUserFlaggedQuery.graphql b/client/coral-admin/src/graphql/queries/modUserFlaggedQuery.graphql index 98f2191eb..c99d94583 100644 --- a/client/coral-admin/src/graphql/queries/modUserFlaggedQuery.graphql +++ b/client/coral-admin/src/graphql/queries/modUserFlaggedQuery.graphql @@ -1,5 +1,5 @@ -query Users ($n: ACTION_TYPE) { - users (query:{action_type: $n}){ +query Users ($action_type: ACTION_TYPE) { + users (query:{action_type: $action_type}){ id username status From 84f1d3ece26354b38da156783a6464a92bacd7cd Mon Sep 17 00:00:00 2001 From: gaba Date: Thu, 23 Mar 2017 16:02:25 -0700 Subject: [PATCH 2/6] Use findONeAndUpdate and the moderation queue for account flags should only give back pending accounts. --- client/coral-admin/src/constants/comments.js | 2 + .../Community/components/SuspendUserDialog.js | 2 +- graph/resolvers/root_query.js | 2 +- services/users.js | 42 +++++++++---------- 4 files changed, 23 insertions(+), 25 deletions(-) diff --git a/client/coral-admin/src/constants/comments.js b/client/coral-admin/src/constants/comments.js index 603a3ce00..98f2e039d 100644 --- a/client/coral-admin/src/constants/comments.js +++ b/client/coral-admin/src/constants/comments.js @@ -1,5 +1,7 @@ export const SHOW_BANUSER_DIALOG = 'SHOW_BANUSER_DIALOG'; export const HIDE_BANUSER_DIALOG = 'HIDE_BANUSER_DIALOG'; +export const SHOW_SUSPENDUSER_DIALOG = 'SHOW_SUSPENDUSER_DIALOG'; +export const HIDE_SUSPENDUSER_DIALOG = 'HIDE_SUSPENDUSER_DIALOG'; export const COMMENTS_MODERATION_QUEUE_FETCH_REQUEST = 'COMMENTS_MODERATION_QUEUE_FETCH_REQUEST'; export const COMMENTS_MODERATION_QUEUE_FETCH_SUCCESS = 'COMMENTS_MODERATION_QUEUE_FETCH_SUCCESS'; export const COMMENT_CREATE_SUCCESS = 'COMMENT_CREATE_SUCCESS'; diff --git a/client/coral-admin/src/containers/Community/components/SuspendUserDialog.js b/client/coral-admin/src/containers/Community/components/SuspendUserDialog.js index 44f38f796..20e221c48 100644 --- a/client/coral-admin/src/containers/Community/components/SuspendUserDialog.js +++ b/client/coral-admin/src/containers/Community/components/SuspendUserDialog.js @@ -49,7 +49,7 @@ class SuspendUserDialog extends Component { const {suspendUser, user} = this.props; const {stage} = this.state; - const cancel = this.props.onClose; + const cancel = this.props.handleClose; const next = () => this.setState({stage: stage + 1}); const suspend = () => { suspendUser({userId: user.user.id, message: this.state.email}) diff --git a/graph/resolvers/root_query.js b/graph/resolvers/root_query.js index ce11fcae9..6f4151ff6 100644 --- a/graph/resolvers/root_query.js +++ b/graph/resolvers/root_query.js @@ -103,7 +103,7 @@ const RootQuery = { .then((ids) => { // Perform the query using the available resolver. - return Users.getByQuery({ids, limit, cursor, sort}); + return Users.getByQuery({ids, limit, cursor, sort}).find({status: 'PENDING'}); }); } diff --git a/services/users.js b/services/users.js index 4e1196252..6c309977f 100644 --- a/services/users.js +++ b/services/users.js @@ -456,7 +456,7 @@ module.exports = class UsersService { * @param {Function} done callback after the operation is complete */ static suspendUser(id, message) { - return UserModel.update({ + return UserModel.findOneAndUpdate({ id }, { $set: { @@ -464,31 +464,27 @@ module.exports = class UsersService { canEditName: true } }) - .then(() => { - return UsersService.findById(id) - .then((user) => { - if (message) { - let localProfile = user.profiles.find((profile) => profile.provider === 'local'); + .then((user) => { + if (message) { + let localProfile = user.profiles.find((profile) => profile.provider === 'local'); - if (localProfile) { - const options = - { - template: 'suspension', // needed to know which template to render! - locals: { // specifies the template locals. - body: message - }, - subject: 'Email Suspension', - to: localProfile.id // This only works if the user has registered via e-mail. - // We may want a standard way to access a user's e-mail address in the future - }; + if (localProfile) { + const options = + { + template: 'suspension', // needed to know which template to render! + locals: { // specifies the template locals. + body: message + }, + subject: 'Email Suspension', + to: localProfile.id // This only works if the user has registered via e-mail. + // We may want a standard way to access a user's e-mail address in the future + }; - return MailerService.sendSimple(options); - } else { - return Promise.reject(errors.ErrMissingEmail); - } + return MailerService.sendSimple(options); + } else { + return Promise.reject(errors.ErrMissingEmail); } - }); - + } }); } From 323749915aca08937c00ea84c49f05efbe03e332 Mon Sep 17 00:00:00 2001 From: gaba Date: Fri, 24 Mar 2017 08:59:43 -0700 Subject: [PATCH 3/6] CSS alignments --- client/coral-admin/src/containers/Community/Community.css | 2 +- .../coral-admin/src/containers/Community/components/User.js | 4 ++-- client/coral-admin/src/translations.json | 2 ++ 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/client/coral-admin/src/containers/Community/Community.css b/client/coral-admin/src/containers/Community/Community.css index 958e41ccb..4a78f7991 100644 --- a/client/coral-admin/src/containers/Community/Community.css +++ b/client/coral-admin/src/containers/Community/Community.css @@ -301,7 +301,6 @@ } } - .actionButton { transform: scale(.8); margin: 0; @@ -323,4 +322,5 @@ .flaggedReasons { padding-top: 15px; + margin-left: 24px; } diff --git a/client/coral-admin/src/containers/Community/components/User.js b/client/coral-admin/src/containers/Community/components/User.js index 71598e352..20b599a7a 100644 --- a/client/coral-admin/src/containers/Community/components/User.js +++ b/client/coral-admin/src/containers/Community/components/User.js @@ -35,7 +35,7 @@ const User = props => {
- flagFlags({ user.actions.length }): + flag{lang.t('community.flags')}({ user.actions.length }): { user.action_summaries.map( (action, i ) => { return @@ -67,8 +67,8 @@ const User = props => { } )} +
-
{modActionButtons.map((action, i) => diff --git a/client/coral-admin/src/translations.json b/client/coral-admin/src/translations.json index f59499e50..390a268a1 100644 --- a/client/coral-admin/src/translations.json +++ b/client/coral-admin/src/translations.json @@ -18,6 +18,7 @@ "banned": "Banned", "banned-user": "Banned User", "loading": "Loading results", + "flags": "Flags", "flaggedaccounts": "Flagged Usernames", "people": "People", "no-flagged-accounts": "The Account Flags queue is currently empty.", @@ -177,6 +178,7 @@ "banned": "Suspendido", "banned-user": "Usuario Suspendido", "loading": "Cargando resultados", + "flags": "Reporte", "flaggedaccounts": "Nombres de Usuario Reportados", "people": "Gente", "no-flagged-accounts": "No hay ninguna cuenta reportada.", From 9eaed90318d7de64a916f2a70bda189a56085c6e Mon Sep 17 00:00:00 2001 From: gaba Date: Fri, 24 Mar 2017 11:15:42 -0700 Subject: [PATCH 4/6] Revert "Revert "Story 138187767 - Moderate Flag User Names"" This reverts commit 903aa23f193b3d74b95c4205966bccead4111bed. --- .gitignore | 2 + client/coral-admin/src/AppRouter.js | 15 + client/coral-admin/src/actions/community.js | 29 +- client/coral-admin/src/components/Modal.js | 1 - .../src/components/SuspendUserModal.js | 106 ------ client/coral-admin/src/components/User.js | 50 --- client/coral-admin/src/constants/comments.js | 1 - client/coral-admin/src/constants/community.js | 10 + client/coral-admin/src/constants/users.js | 1 - .../src/containers/Community/Community.css | 230 ++++++++++++ .../Community/CommunityContainer.js | 117 ++++-- .../containers/Community/CommunityLayout.js | 9 + .../containers/Community/FlaggedAccounts.js | 45 +++ .../Community/{Community.js => People.js} | 6 +- .../src/containers/Community/Table.js | 2 +- .../Community/components/ActionButton.js | 24 ++ .../Community/components/BanUserDialog.css | 164 +++++++++ .../Community/components/BanUserDialog.js | 54 +++ .../Community/components/CommunityMenu.js | 31 ++ .../components/SuspendUserDialog.css} | 0 .../Community/components/SuspendUserDialog.js | 115 ++++++ .../containers/Community/components/User.js | 90 +++++ .../Community/components/styles.css | 339 ++++++++++++++++++ .../ModerationQueue/components/Comment.js | 20 +- .../src/graphql/mutations/index.js | 32 +- .../src/graphql/mutations/suspendUser.graphql | 7 + .../coral-admin/src/graphql/queries/index.js | 3 + .../queries/modUserFlaggedQuery.graphql | 26 ++ client/coral-admin/src/reducers/community.js | 72 ++-- client/coral-admin/src/translations.json | 51 ++- client/coral-plugin-flags/FlagComment.js | 4 +- graph/loaders/users.js | 41 +++ graph/mutators/user.js | 30 +- graph/resolvers/flag_action.js | 12 +- graph/resolvers/root_mutation.js | 3 + graph/resolvers/root_query.js | 22 ++ graph/typeDefs.graphql | 31 ++ models/user.js | 5 +- services/email/suspension.ejs | 1 + services/email/suspension.txt.ejs | 1 + services/users.js | 46 +++ test/graph/mutations/addCommentTag.js | 2 +- 42 files changed, 1604 insertions(+), 246 deletions(-) delete mode 100644 client/coral-admin/src/components/SuspendUserModal.js delete mode 100644 client/coral-admin/src/components/User.js create mode 100644 client/coral-admin/src/containers/Community/CommunityLayout.js create mode 100644 client/coral-admin/src/containers/Community/FlaggedAccounts.js rename client/coral-admin/src/containers/Community/{Community.js => People.js} (94%) create mode 100644 client/coral-admin/src/containers/Community/components/ActionButton.js create mode 100644 client/coral-admin/src/containers/Community/components/BanUserDialog.css create mode 100644 client/coral-admin/src/containers/Community/components/BanUserDialog.js create mode 100644 client/coral-admin/src/containers/Community/components/CommunityMenu.js rename client/coral-admin/src/{components/SuspendUserModal.css => containers/Community/components/SuspendUserDialog.css} (100%) create mode 100644 client/coral-admin/src/containers/Community/components/SuspendUserDialog.js create mode 100644 client/coral-admin/src/containers/Community/components/User.js create mode 100644 client/coral-admin/src/containers/Community/components/styles.css create mode 100644 client/coral-admin/src/graphql/mutations/suspendUser.graphql create mode 100644 client/coral-admin/src/graphql/queries/modUserFlaggedQuery.graphql create mode 100644 services/email/suspension.ejs create mode 100644 services/email/suspension.txt.ejs diff --git a/.gitignore b/.gitignore index 8775ac487..d91635c94 100644 --- a/.gitignore +++ b/.gitignore @@ -12,6 +12,8 @@ dump.rdb *.cfg .idea/ coverage/ +.tags +.tags1 # remove plugin folders plugins diff --git a/client/coral-admin/src/AppRouter.js b/client/coral-admin/src/AppRouter.js index a2990677f..2bd59b79d 100644 --- a/client/coral-admin/src/AppRouter.js +++ b/client/coral-admin/src/AppRouter.js @@ -5,10 +5,13 @@ import Stories from 'containers/Stories/Stories'; import Configure from 'containers/Configure/Configure'; import LayoutContainer from 'containers/LayoutContainer'; import InstallContainer from 'containers/Install/InstallContainer'; + +import CommunityLayout from 'containers/Community/CommunityLayout'; import CommunityContainer from 'containers/Community/CommunityContainer'; import ModerationLayout from 'containers/ModerationQueue/ModerationLayout'; import ModerationContainer from 'containers/ModerationQueue/ModerationContainer'; + import Dashboard from 'containers/Dashboard/Dashboard'; const routes = ( @@ -21,6 +24,18 @@ const routes = ( + {/* Community Routes */} + + + + + + + + + + + {/* Moderation Routes */} diff --git a/client/coral-admin/src/actions/community.js b/client/coral-admin/src/actions/community.js index c2d738460..0f53ea3da 100644 --- a/client/coral-admin/src/actions/community.js +++ b/client/coral-admin/src/actions/community.js @@ -7,28 +7,33 @@ import { SORT_UPDATE, COMMENTERS_NEW_PAGE, SET_ROLE, - SET_COMMENTER_STATUS + SET_COMMENTER_STATUS, + SHOW_BANUSER_DIALOG, + HIDE_BANUSER_DIALOG, + SHOW_SUSPENDUSER_DIALOG, + HIDE_SUSPENDUSER_DIALOG } from '../constants/community'; import coralApi from '../../../coral-framework/helpers/response'; -export const fetchCommenters = (query = {}) => dispatch => { - dispatch(requestFetchCommenters()); +export const fetchAccounts = (query = {}) => dispatch => { + + dispatch(requestFetchAccounts()); coralApi(`/users?${qs.stringify(query)}`) - .then(({result, page, count, limit, totalPages}) => + .then(({result, page, count, limit, totalPages}) =>{ dispatch({ type: FETCH_COMMENTERS_SUCCESS, - commenters: result, + accounts: result, page, count, limit, totalPages - }) - ) + }); + }) .catch(error => dispatch({type: FETCH_COMMENTERS_FAILURE, error})); }; -const requestFetchCommenters = () => ({ +const requestFetchAccounts = () => ({ type: FETCH_COMMENTERS_REQUEST }); @@ -55,3 +60,11 @@ export const setCommenterStatus = (id, status) => (dispatch) => { return dispatch({type: SET_COMMENTER_STATUS, id, status}); }); }; + +// Ban User Dialog +export const showBanUserDialog = (user) => ({type: SHOW_BANUSER_DIALOG, user}); +export const hideBanUserDialog = () => ({type: HIDE_BANUSER_DIALOG}); + +// Suspend User Dialog +export const showSuspendUserDialog = (user) => ({type: SHOW_SUSPENDUSER_DIALOG, user}); +export const hideSuspendUserDialog = () => ({type: HIDE_SUSPENDUSER_DIALOG}); diff --git a/client/coral-admin/src/components/Modal.js b/client/coral-admin/src/components/Modal.js index 99c27c3a1..b667258c2 100644 --- a/client/coral-admin/src/components/Modal.js +++ b/client/coral-admin/src/components/Modal.js @@ -1,4 +1,3 @@ - import React from 'react'; import {Button, Icon} from 'react-mdl'; import styles from './Modal.css'; diff --git a/client/coral-admin/src/components/SuspendUserModal.js b/client/coral-admin/src/components/SuspendUserModal.js deleted file mode 100644 index 5afb8ffee..000000000 --- a/client/coral-admin/src/components/SuspendUserModal.js +++ /dev/null @@ -1,106 +0,0 @@ -import I18n from 'coral-framework/modules/i18n/i18n'; -import translations from '../translations.json'; -import React, {Component, PropTypes} from 'react'; -import Modal from 'components/Modal'; -import styles from './SuspendUserModal.css'; -import {Button} from 'coral-ui'; - -const stages = [ - { - title: 'suspenduser.title_0', - description: 'suspenduser.description_0', - options: { - 'j': 'suspenduser.no_cancel', - 'k': 'suspenduser.yes_suspend' - } - }, - { - title: 'suspenduser.title_1', - description: 'suspenduser.description_1', - options: { - 'j': 'bandialog.cancel', - 'k': 'suspenduser.send' - } - } -]; - -class SuspendUserModal extends Component { - - state = {email: '', stage: 0} - - static propTypes = { - stage: PropTypes.number, - actionType: PropTypes.string, - onClose: PropTypes.func.isRequired, - suspendUser: PropTypes.func.isRequired - } - - componentDidMount() { - const about = lang.t('suspenduser.username'); - this.setState({email: lang.t('suspenduser.email', about)}); - } - - /* - * When an admin clicks to suspend a user a dialog is shown, this function - * handles the possible actions for that dialog. - */ - onActionClick = (stage, menuOption) => () => { - const {suspendUser, action} = this.props; - const {stage, email} = this.state; - const cancel = this.props.onClose; - const next = () => this.setState({stage: stage + 1}); - const suspend = () => suspendUser(action.item_id, lang.t('suspenduser.email_subject'), email) - .then(this.props.onClose); - const suspendModalActions = [ - [ cancel, next ], - [ cancel, suspend ] - ]; - return suspendModalActions[stage][menuOption](); - } - - onEmailChange = (e) => this.setState({email: e.target.value}) - - render () { - const {action, onClose} = this.props; - - if (!action) { - return null; - } - - const {stage} = this.state; - const actionType = action.actionType; - const about = actionType === 'flag_bio' ? lang.t('suspenduser.bio') : lang.t('suspenduser.username'); - return -
{lang.t(stages[stage].title, about)}
-
-
- {lang.t(stages[stage].description, about)} -
- { - stage === 1 && -
-
{lang.t('suspenduser.write_message')}
-
-