From ae07dfb2cdf18d92607d36aae37bcad3fd74ca39 Mon Sep 17 00:00:00 2001 From: PepeFranco Date: Mon, 30 Oct 2017 16:56:52 -0600 Subject: [PATCH 1/8] Added check for user & comments --- graph/mutators/action.js | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/graph/mutators/action.js b/graph/mutators/action.js index 794da581a..60f939477 100644 --- a/graph/mutators/action.js +++ b/graph/mutators/action.js @@ -33,12 +33,16 @@ const createAction = async ({user = {}, pubsub, loaders: {Comments}}, {item_id, if (item_type === 'USERS' && action_type === 'FLAG') { - // Set the user as pending if it was a user flag. - await UsersService.setStatus(item_id, 'PENDING'); + // Set the user as pending if it was a user flag and user has no Admin, Staff or Moderation roles + let user = await UsersService.findById(item_id); + if(!user.roles) + await UsersService.setStatus(item_id, 'PENDING'); } if (comment) { - pubsub.publish('commentFlagged', comment); + let user = await UsersService.findById(comment.author_id); + if(!user.roles) + pubsub.publish('commentFlagged', comment); } return action; From 350e679abf88eca8d95154cd368b93abf25b521c Mon Sep 17 00:00:00 2001 From: PepeFranco Date: Mon, 30 Oct 2017 16:58:51 -0600 Subject: [PATCH 2/8] Added check for user & comments --- graph/mutators/action.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/graph/mutators/action.js b/graph/mutators/action.js index 60f939477..a5bf16051 100644 --- a/graph/mutators/action.js +++ b/graph/mutators/action.js @@ -35,14 +35,16 @@ const createAction = async ({user = {}, pubsub, loaders: {Comments}}, {item_id, // Set the user as pending if it was a user flag and user has no Admin, Staff or Moderation roles let user = await UsersService.findById(item_id); - if(!user.roles) + if(!user.roles){ await UsersService.setStatus(item_id, 'PENDING'); + } } if (comment) { let user = await UsersService.findById(comment.author_id); - if(!user.roles) + if(!user.roles){ pubsub.publish('commentFlagged', comment); + } } return action; From 05e91129f45d5e7ad4b7df17ff2f3316c2fdb119 Mon Sep 17 00:00:00 2001 From: blackcathacker Date: Mon, 30 Oct 2017 22:16:59 -0700 Subject: [PATCH 3/8] show staff instead of user badge when reported by staff --- client/coral-admin/src/components/CommentLabels.js | 11 ++++++++++- client/coral-admin/src/containers/CommentLabels.js | 1 + 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/client/coral-admin/src/components/CommentLabels.js b/client/coral-admin/src/components/CommentLabels.js index 7af7e9a7e..630f0c02d 100644 --- a/client/coral-admin/src/components/CommentLabels.js +++ b/client/coral-admin/src/components/CommentLabels.js @@ -6,10 +6,19 @@ import FlagLabel from 'coral-ui/components/FlagLabel'; import cn from 'classnames'; import styles from './CommentLabels.css'; +const staffRoles = ['ADMIN', 'STAFF', 'MODERATOR']; + function isUserFlagged(actions) { return actions.some((action) => action.__typename === 'FlagAction' && action.user); } +function getUserFlaggedType(actions) { + return actions + .filter((action) => action.__typename === 'FlagAction' && action.user) + .map((action) => action.user.roles.some((role) => staffRoles.includes(role))) + .some((staff) => staff) ? 'Staff' : 'User'; +} + function hasSuspectedWords(actions) { return actions.some((action) => action.__typename === 'FlagAction' && action.reason === 'Matched suspect word filter'); } @@ -24,7 +33,7 @@ const CommentLabels = ({comment, comment: {className, status, actions, hasParent
{hasParent && } {status === 'PREMOD' && } - {isUserFlagged(actions) && User} + {isUserFlagged(actions) && {getUserFlaggedType(actions)}} {hasSuspectedWords(actions) && Suspect} {hasHistoryFlag(actions) && History}
diff --git a/client/coral-admin/src/containers/CommentLabels.js b/client/coral-admin/src/containers/CommentLabels.js index 1942d1ad0..1d57aa526 100644 --- a/client/coral-admin/src/containers/CommentLabels.js +++ b/client/coral-admin/src/containers/CommentLabels.js @@ -25,6 +25,7 @@ export default withFragments({ } user { id + roles } } ${getSlotFragmentSpreads(slots, 'comment')} From 07e6c15c3a856092541a2e3a12951a749dee5e28 Mon Sep 17 00:00:00 2001 From: blackcathacker Date: Mon, 30 Oct 2017 23:08:33 -0700 Subject: [PATCH 4/8] add numbered shortcuts for mod queue --- .../src/components/ModerationKeysModal.js | 1 + .../Moderation/components/Moderation.js | 23 ++++++++++++++----- locales/en.yml | 1 + 3 files changed, 19 insertions(+), 6 deletions(-) diff --git a/client/coral-admin/src/components/ModerationKeysModal.js b/client/coral-admin/src/components/ModerationKeysModal.js index 45304992c..6f53bf7fa 100644 --- a/client/coral-admin/src/components/ModerationKeysModal.js +++ b/client/coral-admin/src/components/ModerationKeysModal.js @@ -12,6 +12,7 @@ const shortcuts = [ 'k': 'modqueue.prev_comment', 'ctrl+f': 'modqueue.toggle_search', 't': 'modqueue.next_queue', + '1...5': 'modqueue.jumptoqueue', 's': 'modqueue.singleview', '?': 'modqueue.thismenu' } diff --git a/client/coral-admin/src/routes/Moderation/components/Moderation.js b/client/coral-admin/src/routes/Moderation/components/Moderation.js index 64ccb1857..0d924767a 100644 --- a/client/coral-admin/src/routes/Moderation/components/Moderation.js +++ b/client/coral-admin/src/routes/Moderation/components/Moderation.js @@ -34,6 +34,8 @@ class Moderation extends Component { key('k', () => this.select(false)); key('f', () => this.moderate(false)); key('d', () => this.moderate(true)); + this.getMenuItems() + .forEach((menuItem, idx) => key(`${idx + 1}`, () => this.selectQueue(menuItem.key))); } onClose = () => { @@ -41,18 +43,25 @@ class Moderation extends Component { } nextQueue = () => { - const queueConfig = this.props.queueConfig; const activeTab = this.props.activeTab; - const assetId = this.props.data.variables.asset_id; - const menuItems = Object.keys(queueConfig).map((queue) => ({ - key: queue - })); + const menuItems = this.getMenuItems(); const activeTabIndex = menuItems.findIndex((item) => item.key === activeTab); const nextQueueIndex = (activeTabIndex === menuItems.length - 1) ? 0 : activeTabIndex + 1; - this.props.router.push(this.props.getModPath(menuItems[nextQueueIndex].key, assetId)); + this.selectQueue(menuItems[nextQueueIndex].key); + } + + selectQueue = (key) => { + const assetId = this.props.data.variables.asset_id; + this.props.router.push(this.props.getModPath(key, assetId)); + } + + getMenuItems = () => { + return Object.keys(this.props.queueConfig).map((queue) => ({ + key: queue + })); } closeSearch = () => { @@ -175,6 +184,8 @@ class Moderation extends Component { key.unbind('k'); key.unbind('f'); key.unbind('d'); + this.getMenuItems() + .forEach((menuItem, idx) => key.unbind(`${idx + 1}`)); } componentWillReceiveProps(nextProps) { diff --git a/locales/en.yml b/locales/en.yml index 76a434dfc..44ac215af 100644 --- a/locales/en.yml +++ b/locales/en.yml @@ -296,6 +296,7 @@ en: show_shortcuts: "Show Shortcuts" singleview: "Toggle single comment edit view" thismenu: "Open this menu" + jumptoqueue: "Jump to specific queue" thousand: k try_these: "Try these" view_more_shortcuts: "View more shortcuts" From 886a468993c5031b5d36aea8805dc11ef6f218bf Mon Sep 17 00:00:00 2001 From: PepeFranco Date: Tue, 31 Oct 2017 12:56:32 -0600 Subject: [PATCH 5/8] Reverting comment changes --- graph/mutators/action.js | 3 --- 1 file changed, 3 deletions(-) diff --git a/graph/mutators/action.js b/graph/mutators/action.js index a5bf16051..cc1fc0030 100644 --- a/graph/mutators/action.js +++ b/graph/mutators/action.js @@ -41,10 +41,7 @@ const createAction = async ({user = {}, pubsub, loaders: {Comments}}, {item_id, } if (comment) { - let user = await UsersService.findById(comment.author_id); - if(!user.roles){ pubsub.publish('commentFlagged', comment); - } } return action; From f70ccf641aa39283a8c614e905d48ece41239762 Mon Sep 17 00:00:00 2001 From: PepeFranco Date: Tue, 31 Oct 2017 13:29:44 -0600 Subject: [PATCH 6/8] Fixed lint issue --- graph/mutators/action.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/graph/mutators/action.js b/graph/mutators/action.js index cc1fc0030..50d62225a 100644 --- a/graph/mutators/action.js +++ b/graph/mutators/action.js @@ -41,7 +41,7 @@ const createAction = async ({user = {}, pubsub, loaders: {Comments}}, {item_id, } if (comment) { - pubsub.publish('commentFlagged', comment); + pubsub.publish('commentFlagged', comment); } return action; From 21f6caa9424185596a1fa5860981972f22991b95 Mon Sep 17 00:00:00 2001 From: blackcathacker Date: Tue, 31 Oct 2017 16:48:40 -0700 Subject: [PATCH 7/8] cleaner method chain per review --- client/coral-admin/src/components/CommentLabels.js | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/client/coral-admin/src/components/CommentLabels.js b/client/coral-admin/src/components/CommentLabels.js index 630f0c02d..bff4f575a 100644 --- a/client/coral-admin/src/components/CommentLabels.js +++ b/client/coral-admin/src/components/CommentLabels.js @@ -14,9 +14,11 @@ function isUserFlagged(actions) { function getUserFlaggedType(actions) { return actions - .filter((action) => action.__typename === 'FlagAction' && action.user) - .map((action) => action.user.roles.some((role) => staffRoles.includes(role))) - .some((staff) => staff) ? 'Staff' : 'User'; + .some((action) => + action.__typename === 'FlagAction' && + action.user && + action.user.roles.some((role) => staffRoles.includes(role)) + ) ? 'Staff' : 'User'; } function hasSuspectedWords(actions) { From 903e70d641edb1038912e22c26525a7a56b35cf1 Mon Sep 17 00:00:00 2001 From: blackcathacker Date: Tue, 31 Oct 2017 17:07:32 -0700 Subject: [PATCH 8/8] updates per review --- .../src/components/ModerationKeysModal.js | 51 ++++++++++--------- .../Moderation/components/Moderation.js | 13 ++--- locales/en.yml | 2 +- 3 files changed, 33 insertions(+), 33 deletions(-) diff --git a/client/coral-admin/src/components/ModerationKeysModal.js b/client/coral-admin/src/components/ModerationKeysModal.js index 6f53bf7fa..5f43daf09 100644 --- a/client/coral-admin/src/components/ModerationKeysModal.js +++ b/client/coral-admin/src/components/ModerationKeysModal.js @@ -4,35 +4,38 @@ import Modal from 'components/Modal'; import styles from './ModerationKeysModal.css'; import t from 'coral-framework/services/i18n'; -const shortcuts = [ - { - title: 'modqueue.navigation', - shortcuts: { - 'j': 'modqueue.next_comment', - 'k': 'modqueue.prev_comment', - 'ctrl+f': 'modqueue.toggle_search', - 't': 'modqueue.next_queue', - '1...5': 'modqueue.jumptoqueue', - 's': 'modqueue.singleview', - '?': 'modqueue.thismenu' - } - }, - { - title: 'modqueue.actions', - shortcuts: { - 'd': 'modqueue.approve', - 'f': 'modqueue.reject' - } - } -]; - export default class ModerationKeysModal extends React.Component { static propTypes = { open: PropTypes.bool.isRequired, onClose: PropTypes.func.isRequired, hideShortcutsNote: PropTypes.func.isRequired, - shortcutsNoteVisible: PropTypes.string.isRequired + shortcutsNoteVisible: PropTypes.string.isRequired, + queueCount: PropTypes.number.isRequired + } + + buildShortcuts = () => { + return [ + { + title: 'modqueue.navigation', + shortcuts: { + 'j': 'modqueue.next_comment', + 'k': 'modqueue.prev_comment', + 'ctrl+f': 'modqueue.toggle_search', + 't': 'modqueue.next_queue', + [`1...${this.props.queueCount}`]: 'modqueue.jump_to_queue', + 's': 'modqueue.singleview', + '?': 'modqueue.thismenu' + } + }, + { + title: 'modqueue.actions', + shortcuts: { + 'd': 'modqueue.approve', + 'f': 'modqueue.reject' + } + } + ]; } render () { @@ -52,7 +55,7 @@ export default class ModerationKeysModal extends React.Component {

{t('modqueue.shortcuts')}

- {shortcuts.map((shortcut, i) => ( + {this.buildShortcuts().map((shortcut, i) => ( diff --git a/client/coral-admin/src/routes/Moderation/components/Moderation.js b/client/coral-admin/src/routes/Moderation/components/Moderation.js index 0d924767a..392db36e3 100644 --- a/client/coral-admin/src/routes/Moderation/components/Moderation.js +++ b/client/coral-admin/src/routes/Moderation/components/Moderation.js @@ -35,7 +35,7 @@ class Moderation extends Component { key('f', () => this.moderate(false)); key('d', () => this.moderate(true)); this.getMenuItems() - .forEach((menuItem, idx) => key(`${idx + 1}`, () => this.selectQueue(menuItem.key))); + .forEach((menuItem, idx) => key(`${idx + 1}`, () => this.selectQueue(menuItem))); } onClose = () => { @@ -47,10 +47,10 @@ class Moderation extends Component { const menuItems = this.getMenuItems(); - const activeTabIndex = menuItems.findIndex((item) => item.key === activeTab); + const activeTabIndex = menuItems.findIndex((item) => item === activeTab); const nextQueueIndex = (activeTabIndex === menuItems.length - 1) ? 0 : activeTabIndex + 1; - this.selectQueue(menuItems[nextQueueIndex].key); + this.selectQueue(menuItems[nextQueueIndex]); } selectQueue = (key) => { @@ -58,11 +58,7 @@ class Moderation extends Component { this.props.router.push(this.props.getModPath(key, assetId)); } - getMenuItems = () => { - return Object.keys(this.props.queueConfig).map((queue) => ({ - key: queue - })); - } + getMenuItems = () => Object.keys(this.props.queueConfig); closeSearch = () => { const {toggleStorySearch} = this.props; @@ -287,6 +283,7 @@ class Moderation extends Component { shortcutsNoteVisible={moderation.shortcutsNoteVisible} open={moderation.modalOpen} onClose={this.onClose} + queueCount={this.getMenuItems().length} />