diff --git a/client/coral-admin/src/AppRouter.js b/client/coral-admin/src/AppRouter.js index 989316dd9..3bde5f931 100644 --- a/client/coral-admin/src/AppRouter.js +++ b/client/coral-admin/src/AppRouter.js @@ -1,25 +1,20 @@ import React from 'react'; import {Router, Route, IndexRedirect, browserHistory} from 'react-router'; -import Stories from 'containers/Stories/Stories'; -import Configure from 'containers/Configure/Configure'; -import LayoutContainer from 'containers/LayoutContainer'; -import InstallContainer from 'containers/Install/InstallContainer'; +import Configure from 'routes/Configure'; +import Dashboard from 'routes/Dashboard'; +import Install from 'routes/Install'; +import Stories from 'routes/Stories'; +import {CommunityLayout, Community} from 'routes/Community'; +import {ModerationLayout, Moderation} from 'routes/Moderation'; -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'; +import Layout from 'containers/Layout'; const routes = (
- - + + - @@ -27,11 +22,11 @@ const routes = ( {/* Community Routes */} - - + + - - + + @@ -39,22 +34,22 @@ const routes = ( {/* Moderation Routes */} - - + + - - + + - - + + - - + + - - + + - + diff --git a/client/coral-admin/src/actions/moderation.js b/client/coral-admin/src/actions/moderation.js index c5e6fc620..268ab36b8 100644 --- a/client/coral-admin/src/actions/moderation.js +++ b/client/coral-admin/src/actions/moderation.js @@ -5,7 +5,7 @@ export const singleView = () => ({type: actions.SINGLE_VIEW}); // Ban User Dialog export const showBanUserDialog = (user, commentId, commentStatus, showRejectedNote) => ({type: actions.SHOW_BANUSER_DIALOG, user, commentId, commentStatus, showRejectedNote}); -export const hideBanUserDialog = (showDialog) => ({type: actions.HIDE_BANUSER_DIALOG, showDialog}); +export const hideBanUserDialog = () => ({type: actions.HIDE_BANUSER_DIALOG}); // Suspend User Dialog export const showSuspendUserDialog = (userId, username, commentId, commentStatus) => diff --git a/client/coral-admin/src/components/ActionButton.js b/client/coral-admin/src/components/ActionButton.js index 3651ee939..ca2c15799 100644 --- a/client/coral-admin/src/components/ActionButton.js +++ b/client/coral-admin/src/components/ActionButton.js @@ -1,7 +1,7 @@ import React, {PropTypes} from 'react'; import styles from './ModerationList.css'; import {Button} from 'coral-ui'; -import {menuActionsMap} from '../containers/ModerationQueue/helpers/moderationQueueActionsMap'; +import {menuActionsMap} from '../routes/Moderation/helpers/moderationQueueActionsMap'; const ActionButton = ({type = '', active, ...props}) => { const typeName = type.toLowerCase(); diff --git a/client/coral-admin/src/containers/Community/Table.js b/client/coral-admin/src/containers/Community/Table.js deleted file mode 100644 index 5ee8e7f92..000000000 --- a/client/coral-admin/src/containers/Community/Table.js +++ /dev/null @@ -1,81 +0,0 @@ -import React, {Component} from 'react'; -import {connect} from 'react-redux'; -import {SelectField, Option} from 'react-mdl-selectfield'; -import styles from './Community.css'; -import I18n from 'coral-framework/modules/i18n/i18n'; -import translations from '../../translations'; -import {setRole, setCommenterStatus} from '../../actions/community'; - -const lang = new I18n(translations); - -class Table extends Component { - - constructor (props) { - super(props); - this.onRoleChange = this.onRoleChange.bind(this); - } - - onRoleChange (id, role) { - this.props.dispatch(setRole(id, role)); - } - - onCommenterStatusChange (id, status) { - this.props.dispatch(setCommenterStatus(id, status)); - } - - render () { - const {headers, commenters, onHeaderClickHandler} = this.props; - - return ( - - - - {headers.map((header, i) =>( - - ))} - - - - {commenters.map((row, i)=> ( - - - - - - - ))} - -
onHeaderClickHandler({field: header.field})}> - {header.title} -
- {row.username} - {row.profiles.map(({id}) => id)} - - {row.created_at} - - this.onCommenterStatusChange(row.id, status)}> - - - - - this.onRoleChange(row.id, role)}> - - - - - -
- ); - } -} - -export default connect((state) => ({commenters: state.community.get('accounts')}))(Table); diff --git a/client/coral-admin/src/containers/Dashboard/Dashboard.js b/client/coral-admin/src/containers/Dashboard/Dashboard.js deleted file mode 100644 index e764bf596..000000000 --- a/client/coral-admin/src/containers/Dashboard/Dashboard.js +++ /dev/null @@ -1,48 +0,0 @@ -import React from 'react'; -import styles from './Dashboard.css'; -import {compose} from 'react-apollo'; -import {connect} from 'react-redux'; -import {getMetrics} from 'coral-admin/src/graphql/queries'; -import FlagWidget from './FlagWidget'; -import ActivityWidget from './ActivityWidget'; -import CountdownTimer from 'coral-admin/src/components/CountdownTimer'; - -import {Spinner} from 'coral-ui'; - -class Dashboard extends React.Component { - - reloadData = () => { - this.props.data.refetch(); - } - - render () { - - if (this.props.data && this.props.data.loading) { - return ; - } - - const {data: {assetsByActivity, assetsByFlag}} = this.props; - - return ( -
- -
- - -
-
- ); - } -} - -const mapStateToProps = (state) => { - return { - settings: state.settings.toJS(), - moderation: state.moderation.toJS() - }; -}; - -export default compose( - connect(mapStateToProps), - getMetrics -)(Dashboard); diff --git a/client/coral-admin/src/containers/Install/InstallContainer.js b/client/coral-admin/src/containers/Install/InstallContainer.js deleted file mode 100644 index 67f266123..000000000 --- a/client/coral-admin/src/containers/Install/InstallContainer.js +++ /dev/null @@ -1,101 +0,0 @@ -import React, {Component} from 'react'; -import {connect} from 'react-redux'; -import styles from './style.css'; -import {Wizard, WizardNav} from 'coral-ui'; -import Layout from 'coral-admin/src/components/ui/Layout'; - -import { - goToStep, - nextStep, - submitUser, - checkInstall, - previousStep, - finishInstall, - submitSettings, - updateUserFormData, - updateSettingsFormData, - updatePermittedDomains -} from '../../actions/install'; - -import InitialStep from './components/Steps/InitialStep'; -import AddOrganizationName from './components/Steps/AddOrganizationName'; -import CreateYourAccount from './components/Steps/CreateYourAccount'; -import PermittedDomainsStep from './components/Steps/PermittedDomainsStep'; -import FinalStep from './components/Steps/FinalStep'; - -class InstallContainer extends Component { - componentDidMount() { - const {checkInstall} = this.props; - checkInstall(() => { - this.context.router.push('/admin'); - }); - } - - render() { - const {install} = this.props; - - return ( - -
- { - !install.alreadyInstalled ? ( -
-

Welcome to the Coral Project

- { install.step !== 0 ? : null } - - - - - - - -
- ) : ( -
Talk is already installed
- ) - } -
-
- ); - } -} - -InstallContainer.contextTypes = { - router: React.PropTypes.object -}; - -const mapStateToProps = (state) => ({ - install: state.install.toJS() -}); - -const mapDispatchToProps = (dispatch) => ({ - nextStep: () => dispatch(nextStep()), - goToStep: (step) => dispatch(goToStep(step)), - previousStep: () => dispatch(previousStep()), - finishInstall: () => dispatch(finishInstall()), - checkInstall: (next) => dispatch(checkInstall(next)), - handleDomainsChange: (value) => { - dispatch(updatePermittedDomains(value)); - }, - handleSettingsChange: (e) => { - const {name, value} = e.currentTarget; - dispatch(updateSettingsFormData(name, value)); - }, - handleUserChange: (e) => { - const {name, value} = e.currentTarget; - dispatch(updateUserFormData(name, value)); - }, - handleSettingsSubmit: (e) => { - e.preventDefault(); - dispatch(submitSettings()); - }, - handleUserSubmit: (e) => { - e.preventDefault(); - dispatch(submitUser()); - } -}); - -export default connect( - mapStateToProps, - mapDispatchToProps -)(InstallContainer); diff --git a/client/coral-admin/src/containers/LayoutContainer.js b/client/coral-admin/src/containers/Layout.js similarity index 100% rename from client/coral-admin/src/containers/LayoutContainer.js rename to client/coral-admin/src/containers/Layout.js diff --git a/client/coral-admin/src/containers/Streams/Stories.js b/client/coral-admin/src/containers/Streams/Stories.js deleted file mode 100644 index 7c7a65389..000000000 --- a/client/coral-admin/src/containers/Streams/Stories.js +++ /dev/null @@ -1,187 +0,0 @@ -import React, {Component} from 'react'; -import styles from './Stories.css'; -import {connect} from 'react-redux'; -import I18n from 'coral-framework/modules/i18n/i18n'; -import {fetchAssets, updateAssetState} from '../../actions/assets'; -import translations from '../../translations.json'; -import {Link} from 'react-router'; - -import {Pager, Icon} from 'coral-ui'; -import {DataTable, TableHeader, RadioGroup, Radio} from 'react-mdl'; -import EmptyCard from 'coral-admin/src/components/EmptyCard'; - -const limit = 25; - -class Stories extends Component { - - state = { - search: '', - sort: 'desc', - filter: 'all', - statusMenus: {}, - timer: null, - page: 0 - } - - componentDidMount () { - this.props.fetchAssets(0, limit, '', this.state.sortBy); - } - - onSettingChange = (setting) => (e) => { - let options = this.state; - this.setState({[setting]: e.target.value}); - options[setting] = e.target.value; - this.props.fetchAssets(0, limit, options.search, options.sort, options.filter); - } - - onSearchChange = (e) => { - const search = e.target.value; - this.setState((prevState) => { - prevState.search = search; - clearTimeout(prevState.timer); - const fetchAssets = this.props.fetchAssets; - prevState.timer = setTimeout(() => { - fetchAssets(0, limit, search, this.state.sort, this.state.filter); - }, 350); - return prevState; - }); - } - - renderDate = (date) => { - const d = new Date(date); - return `${d.getMonth() + 1}/${d.getDate()}/${d.getFullYear()}`; - } - - onStatusClick = (closeStream, id, statusMenuOpen) => () => { - if (statusMenuOpen) { - this.setState((prev) => { - prev.statusMenus[id] = false; - return prev; - }); - this.props.updateAssetState(id, closeStream ? Date.now() : null) - .then(() => { - const {search, sort, filter, page} = this.state; - this.props.fetchAssets(page, limit, search, sort, filter); - }); - } else { - this.setState((prev) => { - prev.statusMenus[id] = true; - return prev; - }); - } - } - - renderTitle = (title, {id}) => {title} - - renderStatus = (closedAt, {id}) => { - const closed = closedAt && new Date(closedAt).getTime() < Date.now(); - const statusMenuOpen = this.state.statusMenus[id]; - return
-
- {!statusMenuOpen && } - {closed ? lang.t('streams.closed') : lang.t('streams.open')} -
- { - statusMenuOpen && -
- {!closed ? lang.t('streams.closed') : lang.t('streams.open')} -
- } -
; - } - - onPageClick = (page) => { - this.setState({page}); - const {search, sort, filter} = this.state; - this.props.fetchAssets((page - 1) * limit, limit, search, sort, filter); - } - - render () { - const {search, sort, filter} = this.state; - const {assets} = this.props; - - const assetsIds = assets.ids.map((id) => assets.byId[id]); - - return ( -
-
-
- - -
-
{lang.t('streams.filter-streams')}
-
{lang.t('streams.stream-status')}
- - {lang.t('streams.all')} - {lang.t('streams.open')} - {lang.t('streams.closed')} - -
{lang.t('streams.sort-by')}
- - {lang.t('streams.newest')} - {lang.t('streams.oldest')} - -
- { - assetsIds.length - ?
- - {lang.t('streams.article')} - - {lang.t('streams.pubdate')} - - - {lang.t('streams.status')} - - - -
- : {lang.t('streams.empty_result')} - } -
- ); - } -} - -const mapStateToProps = ({assets}) => { - return { - assets: assets.toJS() - }; -}; - -const mapDispatchToProps = (dispatch) => { - return { - fetchAssets: (...args) => { - dispatch(fetchAssets.apply(this, args)); - }, - updateAssetState: (...args) => dispatch(updateAssetState.apply(this, args)) - }; -}; - -export default connect(mapStateToProps, mapDispatchToProps)(Stories); - -const lang = new I18n(translations); diff --git a/client/coral-admin/src/containers/Community/components/ActionButton.js b/client/coral-admin/src/routes/Community/components/ActionButton.js similarity index 82% rename from client/coral-admin/src/containers/Community/components/ActionButton.js rename to client/coral-admin/src/routes/Community/components/ActionButton.js index ad5346ac5..767c9fbd1 100644 --- a/client/coral-admin/src/containers/Community/components/ActionButton.js +++ b/client/coral-admin/src/routes/Community/components/ActionButton.js @@ -1,8 +1,8 @@ import React from 'react'; -import styles from '../Community.css'; +import styles from './Community.css'; import BanUserButton from './BanUserButton'; import {Button} from 'coral-ui'; -import {menuActionsMap} from '../../../containers/ModerationQueue/helpers/moderationQueueActionsMap'; +import {menuActionsMap} from '../../Moderation/helpers/moderationQueueActionsMap'; const ActionButton = ({type = '', user, ...props}) => { if (type === 'BAN') { diff --git a/client/coral-admin/src/containers/Community/components/BanUserButton.css b/client/coral-admin/src/routes/Community/components/BanUserButton.css similarity index 100% rename from client/coral-admin/src/containers/Community/components/BanUserButton.css rename to client/coral-admin/src/routes/Community/components/BanUserButton.css diff --git a/client/coral-admin/src/containers/Community/components/BanUserButton.js b/client/coral-admin/src/routes/Community/components/BanUserButton.js similarity index 100% rename from client/coral-admin/src/containers/Community/components/BanUserButton.js rename to client/coral-admin/src/routes/Community/components/BanUserButton.js diff --git a/client/coral-admin/src/containers/Community/components/BanUserDialog.css b/client/coral-admin/src/routes/Community/components/BanUserDialog.css similarity index 100% rename from client/coral-admin/src/containers/Community/components/BanUserDialog.css rename to client/coral-admin/src/routes/Community/components/BanUserDialog.css diff --git a/client/coral-admin/src/containers/Community/components/BanUserDialog.js b/client/coral-admin/src/routes/Community/components/BanUserDialog.js similarity index 100% rename from client/coral-admin/src/containers/Community/components/BanUserDialog.js rename to client/coral-admin/src/routes/Community/components/BanUserDialog.js diff --git a/client/coral-admin/src/containers/Community/Community.css b/client/coral-admin/src/routes/Community/components/Community.css similarity index 100% rename from client/coral-admin/src/containers/Community/Community.css rename to client/coral-admin/src/routes/Community/components/Community.css diff --git a/client/coral-admin/src/containers/Community/CommunityContainer.js b/client/coral-admin/src/routes/Community/components/Community.js similarity index 57% rename from client/coral-admin/src/containers/Community/CommunityContainer.js rename to client/coral-admin/src/routes/Community/components/Community.js index 7c0051477..8e25a8e41 100644 --- a/client/coral-admin/src/containers/Community/CommunityContainer.js +++ b/client/coral-admin/src/routes/Community/components/Community.js @@ -1,55 +1,26 @@ import React, {Component} from 'react'; -import {connect} from 'react-redux'; -import {compose} from 'react-apollo'; - -import {modUserFlaggedQuery} from 'coral-admin/src/graphql/queries'; -import {banUser, setUserStatus, rejectUsername} from 'coral-admin/src/graphql/mutations'; - -import { - fetchAccounts, - updateSorting, - newPage, - showBanUserDialog, - hideBanUserDialog, - showSuspendUserDialog, - hideSuspendUserDialog -} from '../../actions/community'; - -import CommunityMenu from './components/CommunityMenu'; -import BanUserDialog from './components/BanUserDialog'; -import SuspendUserDialog from './components/SuspendUserDialog'; +import CommunityMenu from './CommunityMenu'; +import BanUserDialog from './BanUserDialog'; +import SuspendUserDialog from './SuspendUserDialog'; import People from './People'; import FlaggedAccounts from './FlaggedAccounts'; -class CommunityContainer extends Component { +export default class Community extends Component { - constructor(props) { - super(props); + state = { + searchValue: '', + timer: null + }; - this.state = { - searchValue: '', - timer: null - }; - - this.onKeyDownHandler = this.onKeyDownHandler.bind(this); - this.onSearchChange = this.onSearchChange.bind(this); - this.onHeaderClickHandler = this.onHeaderClickHandler.bind(this); - this.onNewPageHandler = this.onNewPageHandler.bind(this); - } - - componentWillMount() { - this.props.fetchAccounts({}); - } - - onKeyDownHandler(e) { + onKeyDownHandler = (e) => { if (e.key === 'Enter') { e.preventDefault(); this.search(); } } - onSearchChange(e) { + onSearchChange = (e) => { const value = e.target.value; this.setState((prevState) => { prevState.searchValue = value; @@ -62,6 +33,16 @@ class CommunityContainer extends Component { }); } + onHeaderClickHandler = (sort) => { + this.props.updateSorting(sort); + this.search(); + } + + onNewPageHandler = (page) => { + this.props.newPage(page); + this.search({page}); + } + search(query = {}) { const {community} = this.props; @@ -71,17 +52,6 @@ class CommunityContainer extends Component { asc: community.ascPeople, ...query }); - - } - - onHeaderClickHandler(sort) { - this.props.dispatch(updateSorting(sort)); - this.search(); - } - - onNewPageHandler(page) { - this.props.dispatch(newPage(page)); - this.search({page}); } getTabContent(searchValue, props) { @@ -134,7 +104,6 @@ class CommunityContainer extends Component { render() { const {searchValue} = this.state; - const tab = this.getTabContent(searchValue, this.props); return ( @@ -148,22 +117,3 @@ class CommunityContainer extends Component { } } -const mapStateToProps = (state) => ({ - community: state.community.toJS() -}); - -const mapDispatchToProps = (dispatch) => ({ - fetchAccounts: (query) => dispatch(fetchAccounts(query)), - showBanUserDialog: (user) => dispatch(showBanUserDialog(user)), - hideBanUserDialog: () => dispatch(hideBanUserDialog(false)), - showSuspendUserDialog: (user) => dispatch(showSuspendUserDialog(user)), - hideSuspendUserDialog: () => dispatch(hideSuspendUserDialog()) -}); - -export default compose( - connect(mapStateToProps, mapDispatchToProps), - modUserFlaggedQuery, - banUser, - setUserStatus, - rejectUsername -)(CommunityContainer); diff --git a/client/coral-admin/src/containers/Community/CommunityLayout.js b/client/coral-admin/src/routes/Community/components/CommunityLayout.js similarity index 100% rename from client/coral-admin/src/containers/Community/CommunityLayout.js rename to client/coral-admin/src/routes/Community/components/CommunityLayout.js diff --git a/client/coral-admin/src/containers/Community/components/CommunityMenu.js b/client/coral-admin/src/routes/Community/components/CommunityMenu.js similarity index 100% rename from client/coral-admin/src/containers/Community/components/CommunityMenu.js rename to client/coral-admin/src/routes/Community/components/CommunityMenu.js diff --git a/client/coral-admin/src/containers/Community/FlaggedAccounts.js b/client/coral-admin/src/routes/Community/components/FlaggedAccounts.js similarity index 97% rename from client/coral-admin/src/containers/Community/FlaggedAccounts.js rename to client/coral-admin/src/routes/Community/components/FlaggedAccounts.js index 692cef70d..d55019caf 100644 --- a/client/coral-admin/src/containers/Community/FlaggedAccounts.js +++ b/client/coral-admin/src/routes/Community/components/FlaggedAccounts.js @@ -8,7 +8,7 @@ import styles from './Community.css'; import Loading from './Loading'; import EmptyCard from 'coral-admin/src/components/EmptyCard'; -import User from './components/User'; +import User from './User'; const FlaggedAccounts = ({...props}) => { const {commenters, isFetching} = props; diff --git a/client/coral-admin/src/containers/Community/Loading.js b/client/coral-admin/src/routes/Community/components/Loading.js similarity index 100% rename from client/coral-admin/src/containers/Community/Loading.js rename to client/coral-admin/src/routes/Community/components/Loading.js diff --git a/client/coral-admin/src/containers/Community/People.js b/client/coral-admin/src/routes/Community/components/People.js similarity index 94% rename from client/coral-admin/src/containers/Community/People.js rename to client/coral-admin/src/routes/Community/components/People.js index e375bac38..0e0c2b5c4 100644 --- a/client/coral-admin/src/containers/Community/People.js +++ b/client/coral-admin/src/routes/Community/components/People.js @@ -3,9 +3,9 @@ import I18n from 'coral-framework/modules/i18n/i18n'; import translations from 'coral-admin/src/translations.json'; import styles from './Community.css'; -import Table from './Table'; +import Table from '../containers/Table'; import {Pager, Icon} from 'coral-ui'; -import EmptyCard from '../../components/EmptyCard'; +import EmptyCard from '../../../components/EmptyCard'; const lang = new I18n(translations); diff --git a/client/coral-admin/src/containers/Community/components/SuspendUserDialog.css b/client/coral-admin/src/routes/Community/components/SuspendUserDialog.css similarity index 100% rename from client/coral-admin/src/containers/Community/components/SuspendUserDialog.css rename to client/coral-admin/src/routes/Community/components/SuspendUserDialog.css diff --git a/client/coral-admin/src/containers/Community/components/SuspendUserDialog.js b/client/coral-admin/src/routes/Community/components/SuspendUserDialog.js similarity index 100% rename from client/coral-admin/src/containers/Community/components/SuspendUserDialog.js rename to client/coral-admin/src/routes/Community/components/SuspendUserDialog.js diff --git a/client/coral-admin/src/routes/Community/components/Table.js b/client/coral-admin/src/routes/Community/components/Table.js new file mode 100644 index 000000000..d23c2a863 --- /dev/null +++ b/client/coral-admin/src/routes/Community/components/Table.js @@ -0,0 +1,57 @@ +import React from 'react'; +import {SelectField, Option} from 'react-mdl-selectfield'; +import styles from '../components/Community.css'; +import I18n from 'coral-framework/modules/i18n/i18n'; +import translations from '../../../translations'; + +const lang = new I18n(translations); + +export default ({headers, commenters, onHeaderClickHandler, onRoleChange, onCommenterStatusChange}) => ( + + + + {headers.map((header, i) =>( + + ))} + + + + {commenters.map((row, i)=> ( + + + + + + + ))} + +
onHeaderClickHandler({field: header.field})}> + {header.title} +
+ {row.username} + {row.profiles.map(({id}) => id)} + + {row.created_at} + + onCommenterStatusChange(row.id, status)}> + + + + + onRoleChange(row.id, role)}> + + + + + +
+); diff --git a/client/coral-admin/src/containers/Community/components/User.js b/client/coral-admin/src/routes/Community/components/User.js similarity index 98% rename from client/coral-admin/src/containers/Community/components/User.js rename to client/coral-admin/src/routes/Community/components/User.js index af4b72c0b..da38c107c 100644 --- a/client/coral-admin/src/containers/Community/components/User.js +++ b/client/coral-admin/src/routes/Community/components/User.js @@ -1,5 +1,5 @@ import React from 'react'; -import styles from '../Community.css'; +import styles from './Community.css'; import ActionButton from './ActionButton'; diff --git a/client/coral-admin/src/containers/Community/components/styles.css b/client/coral-admin/src/routes/Community/components/styles.css similarity index 100% rename from client/coral-admin/src/containers/Community/components/styles.css rename to client/coral-admin/src/routes/Community/components/styles.css diff --git a/client/coral-admin/src/routes/Community/containers/Community.js b/client/coral-admin/src/routes/Community/containers/Community.js new file mode 100644 index 000000000..9167e2cd1 --- /dev/null +++ b/client/coral-admin/src/routes/Community/containers/Community.js @@ -0,0 +1,55 @@ +import React, {Component} from 'react'; +import {connect} from 'react-redux'; +import {bindActionCreators} from 'redux'; +import {compose} from 'react-apollo'; + +import {modUserFlaggedQuery} from 'coral-admin/src/graphql/queries'; +import {banUser, setUserStatus, rejectUsername} from 'coral-admin/src/graphql/mutations'; + +import { + fetchAccounts, + updateSorting, + newPage, + showBanUserDialog, + hideBanUserDialog, + showSuspendUserDialog, + hideSuspendUserDialog +} from '../../../actions/community'; + +import Community from '../components/Community'; + +class CommunityContainer extends Component { + + componentWillMount() { + this.props.fetchAccounts({}); + } + + render() { + return ( + + ); + } +} + +const mapStateToProps = (state) => ({ + community: state.community.toJS() +}); + +const mapDispatchToProps = (dispatch) => + bindActionCreators({ + fetchAccounts, + showBanUserDialog, + hideBanUserDialog, + showSuspendUserDialog, + hideSuspendUserDialog, + updateSorting, + newPage, + }, dispatch); + +export default compose( + connect(mapStateToProps, mapDispatchToProps), + modUserFlaggedQuery, + banUser, + setUserStatus, + rejectUsername +)(CommunityContainer); diff --git a/client/coral-admin/src/routes/Community/containers/Table.js b/client/coral-admin/src/routes/Community/containers/Table.js new file mode 100644 index 000000000..499e0718a --- /dev/null +++ b/client/coral-admin/src/routes/Community/containers/Table.js @@ -0,0 +1,37 @@ +import React, {Component} from 'react'; +import {connect} from 'react-redux'; +import {bindActionCreators} from 'redux'; +import {compose} from 'react-apollo'; +import {setRole, setCommenterStatus} from '../../../actions/community'; +import Table from '../components/Table'; + +class TableContainer extends Component { + + constructor (props) { + super(props); + } + + render () { + return ; + } +} + +const mapStateToProps = (state) => ({ + commenters: state.community.get('accounts'), +}); + +const mapDispatchToProps = (dispatch) => + bindActionCreators({ + setCommenterStatus, + setRole, + }, dispatch); + +export default compose( + connect(mapStateToProps, mapDispatchToProps), +)(TableContainer); + diff --git a/client/coral-admin/src/routes/Community/index.js b/client/coral-admin/src/routes/Community/index.js new file mode 100644 index 000000000..528fe63cd --- /dev/null +++ b/client/coral-admin/src/routes/Community/index.js @@ -0,0 +1,2 @@ +export {default as Community} from './containers/Community'; +export {default as CommunityLayout} from './components/CommunityLayout'; diff --git a/client/coral-admin/src/containers/Configure/Configure.css b/client/coral-admin/src/routes/Configure/components/Configure.css similarity index 100% rename from client/coral-admin/src/containers/Configure/Configure.css rename to client/coral-admin/src/routes/Configure/components/Configure.css diff --git a/client/coral-admin/src/containers/Configure/Configure.js b/client/coral-admin/src/routes/Configure/components/Configure.js similarity index 83% rename from client/coral-admin/src/containers/Configure/Configure.js rename to client/coral-admin/src/routes/Configure/components/Configure.js index d22a19997..17063d16d 100644 --- a/client/coral-admin/src/containers/Configure/Configure.js +++ b/client/coral-admin/src/routes/Configure/components/Configure.js @@ -1,12 +1,4 @@ import React, {Component} from 'react'; -import {connect} from 'react-redux'; -import { - fetchSettings, - updateSettings, - saveSettingsToServer, - updateWordlist, - updateDomainlist -} from '../../actions/settings'; import {Button, List, Item, Card, Spinner} from 'coral-ui'; import styles from './Configure.css'; @@ -17,45 +9,38 @@ import ModerationSettings from './ModerationSettings'; import TechSettings from './TechSettings'; import {can} from 'coral-framework/services/perms'; -class Configure extends Component { - constructor (props) { - super(props); +const lang = new I18n(translations); - this.state = { - activeSection: 'stream', - changed: false, - errors: {} - }; +export default class Configure extends Component { - this.changeSection = this.changeSection.bind(this); - } - - componentWillMount = () => { - this.props.dispatch(fetchSettings()); - } + state = { + activeSection: 'stream', + changed: false, + errors: {} + }; saveSettings = () => { - this.props.dispatch(saveSettingsToServer()); + this.props.saveSettingsToServer(); this.setState({changed: false}); } - changeSection(activeSection) { + changeSection = (activeSection) => { this.setState({activeSection}); } onChangeWordlist = (listName, list) => { this.setState({changed: true}); - this.props.dispatch(updateWordlist(listName, list)); + this.props.updateWordlist(listName, list); } onChangeDomainlist = (listName, list) => { this.setState({changed: true}); - this.props.dispatch(updateDomainlist(listName, list)); + this.props.updateDomainlist(listName, list); } onSettingUpdate = (setting) => { this.setState({changed: true}); - this.props.dispatch(updateSettings(setting)); + this.props.updateSettings(setting); } // Sets an arbitrary error string and a boolean state. @@ -176,11 +161,3 @@ class Configure extends Component { ); } } - -const mapStateToProps = (state) => ({ - auth: state.auth.toJS(), - settings: state.settings.toJS() -}); -export default connect(mapStateToProps)(Configure); - -const lang = new I18n(translations); diff --git a/client/coral-admin/src/containers/Configure/Domainlist.js b/client/coral-admin/src/routes/Configure/components/Domainlist.js similarity index 94% rename from client/coral-admin/src/containers/Configure/Domainlist.js rename to client/coral-admin/src/routes/Configure/components/Domainlist.js index 0ccc4158f..4cc6e78a0 100644 --- a/client/coral-admin/src/containers/Configure/Domainlist.js +++ b/client/coral-admin/src/routes/Configure/components/Domainlist.js @@ -4,7 +4,7 @@ import styles from './Configure.css'; import TagsInput from 'react-tagsinput'; import I18n from 'coral-framework/modules/i18n/i18n'; -import translations from '../../translations.json'; +import translations from '../../../translations.json'; const lang = new I18n(translations); const Domainlist = ({domains, onChangeDomainlist}) => { diff --git a/client/coral-admin/src/containers/Configure/EmbedLink.js b/client/coral-admin/src/routes/Configure/components/EmbedLink.js similarity index 97% rename from client/coral-admin/src/containers/Configure/EmbedLink.js rename to client/coral-admin/src/routes/Configure/components/EmbedLink.js index d61c64c11..4ad3d2ff8 100644 --- a/client/coral-admin/src/containers/Configure/EmbedLink.js +++ b/client/coral-admin/src/routes/Configure/components/EmbedLink.js @@ -1,9 +1,11 @@ import React, {Component} from 'react'; import I18n from 'coral-framework/modules/i18n/i18n'; -import translations from '../../translations.json'; +import translations from '../../../translations.json'; import styles from './Configure.css'; import {Button, Card} from 'coral-ui'; +const lang = new I18n(translations); + class EmbedLink extends Component { constructor (props) { @@ -64,5 +66,3 @@ class EmbedLink extends Component { } export default EmbedLink; - -const lang = new I18n(translations); diff --git a/client/coral-admin/src/containers/Configure/ModerationSettings.js b/client/coral-admin/src/routes/Configure/components/ModerationSettings.js similarity index 98% rename from client/coral-admin/src/containers/Configure/ModerationSettings.js rename to client/coral-admin/src/routes/Configure/components/ModerationSettings.js index c7df573e8..d0c36f99d 100644 --- a/client/coral-admin/src/containers/Configure/ModerationSettings.js +++ b/client/coral-admin/src/routes/Configure/components/ModerationSettings.js @@ -4,7 +4,7 @@ import {Card} from 'coral-ui'; import {Checkbox} from 'react-mdl'; import Wordlist from './Wordlist'; import I18n from 'coral-framework/modules/i18n/i18n'; -import translations from '../../translations.json'; +import translations from '../../../translations.json'; const lang = new I18n(translations); const updateModeration = (updateSettings, mod) => () => { @@ -98,7 +98,7 @@ const ModerationSettings = ({settings, updateSettings, onChangeWordlist}) => {   {lang.t('configure.edit-comment-timeframe-text-post')}

- + ); }; diff --git a/client/coral-admin/src/containers/Configure/StreamSettings.js b/client/coral-admin/src/routes/Configure/components/StreamSettings.js similarity index 99% rename from client/coral-admin/src/containers/Configure/StreamSettings.js rename to client/coral-admin/src/routes/Configure/components/StreamSettings.js index 341c47ae9..3b674762e 100644 --- a/client/coral-admin/src/containers/Configure/StreamSettings.js +++ b/client/coral-admin/src/routes/Configure/components/StreamSettings.js @@ -1,7 +1,7 @@ import React from 'react'; import {SelectField, Option} from 'react-mdl-selectfield'; import I18n from 'coral-framework/modules/i18n/i18n'; -import translations from '../../translations.json'; +import translations from '../../../translations.json'; import styles from './Configure.css'; import {Checkbox, Textfield} from 'react-mdl'; import {Card, Icon, TextArea} from 'coral-ui'; diff --git a/client/coral-admin/src/containers/Configure/TechSettings.js b/client/coral-admin/src/routes/Configure/components/TechSettings.js similarity index 96% rename from client/coral-admin/src/containers/Configure/TechSettings.js rename to client/coral-admin/src/routes/Configure/components/TechSettings.js index 6fbc302a0..e9d0c22d2 100644 --- a/client/coral-admin/src/containers/Configure/TechSettings.js +++ b/client/coral-admin/src/routes/Configure/components/TechSettings.js @@ -4,7 +4,7 @@ import Domainlist from './Domainlist'; import EmbedLink from './EmbedLink'; import styles from './Configure.css'; import I18n from 'coral-framework/modules/i18n/i18n'; -import translations from '../../translations.json'; +import translations from '../../../translations.json'; const lang = new I18n(translations); const updateCustomCssUrl = (updateSettings) => (event) => { diff --git a/client/coral-admin/src/containers/Configure/Wordlist.js b/client/coral-admin/src/routes/Configure/components/Wordlist.js similarity index 96% rename from client/coral-admin/src/containers/Configure/Wordlist.js rename to client/coral-admin/src/routes/Configure/components/Wordlist.js index 983047acf..e01ebdc1f 100644 --- a/client/coral-admin/src/containers/Configure/Wordlist.js +++ b/client/coral-admin/src/routes/Configure/components/Wordlist.js @@ -1,6 +1,6 @@ import React from 'react'; import I18n from 'coral-framework/modules/i18n/i18n'; -import translations from '../../translations.json'; +import translations from '../../../translations.json'; import TagsInput from 'react-tagsinput'; import styles from './Configure.css'; import {Card} from 'coral-ui'; diff --git a/client/coral-admin/src/routes/Configure/containers/Configure.js b/client/coral-admin/src/routes/Configure/containers/Configure.js new file mode 100644 index 000000000..c68b39e0c --- /dev/null +++ b/client/coral-admin/src/routes/Configure/containers/Configure.js @@ -0,0 +1,42 @@ +import React, {Component} from 'react'; +import {connect} from 'react-redux'; +import {bindActionCreators} from 'redux'; +import {compose} from 'react-apollo'; +import { + fetchSettings, + updateSettings, + saveSettingsToServer, + updateWordlist, + updateDomainlist +} from '../../../actions/settings'; + +import Configure from '../components/Configure'; + +class ConfigureContainer extends Component { + componentWillMount = () => { + this.props.fetchSettings(); + } + + render () { + return ; + } +} + +const mapStateToProps = (state) => ({ + auth: state.auth.toJS(), + settings: state.settings.toJS() +}); + +const mapDispatchToProps = (dispatch) => + bindActionCreators({ + fetchSettings, + updateSettings, + saveSettingsToServer, + updateWordlist, + updateDomainlist + }, dispatch); + +export default compose( + connect(mapStateToProps, mapDispatchToProps), +)(ConfigureContainer); + diff --git a/client/coral-admin/src/routes/Configure/index.js b/client/coral-admin/src/routes/Configure/index.js new file mode 100644 index 000000000..d548be931 --- /dev/null +++ b/client/coral-admin/src/routes/Configure/index.js @@ -0,0 +1 @@ +export {default} from './containers/Configure'; diff --git a/client/coral-admin/src/containers/Dashboard/ActivityWidget.js b/client/coral-admin/src/routes/Dashboard/components/ActivityWidget.js similarity index 100% rename from client/coral-admin/src/containers/Dashboard/ActivityWidget.js rename to client/coral-admin/src/routes/Dashboard/components/ActivityWidget.js diff --git a/client/coral-admin/src/components/CountdownTimer.js b/client/coral-admin/src/routes/Dashboard/components/CountdownTimer.js similarity index 96% rename from client/coral-admin/src/components/CountdownTimer.js rename to client/coral-admin/src/routes/Dashboard/components/CountdownTimer.js index aba4d0b5a..f1008672c 100644 --- a/client/coral-admin/src/components/CountdownTimer.js +++ b/client/coral-admin/src/routes/Dashboard/components/CountdownTimer.js @@ -1,7 +1,7 @@ import React, {PropTypes} from 'react'; import I18n from 'coral-framework/modules/i18n/i18n'; import translations from 'coral-admin/src/translations'; -import styles from 'coral-admin/src/containers/Dashboard/Dashboard.css'; +import styles from './Dashboard.css'; import {Icon} from 'coral-ui'; const lang = new I18n(translations); diff --git a/client/coral-admin/src/containers/Dashboard/Dashboard.css b/client/coral-admin/src/routes/Dashboard/components/Dashboard.css similarity index 100% rename from client/coral-admin/src/containers/Dashboard/Dashboard.css rename to client/coral-admin/src/routes/Dashboard/components/Dashboard.css diff --git a/client/coral-admin/src/routes/Dashboard/components/Dashboard.js b/client/coral-admin/src/routes/Dashboard/components/Dashboard.js new file mode 100644 index 000000000..06c9fd0b9 --- /dev/null +++ b/client/coral-admin/src/routes/Dashboard/components/Dashboard.js @@ -0,0 +1,15 @@ +import React from 'react'; +import FlagWidget from './FlagWidget'; +import ActivityWidget from './ActivityWidget'; +import CountdownTimer from './CountdownTimer'; +import styles from './Dashboard.css'; + +export default ({data: {assetsByActivity, assetsByFlag}, reloadData}) => ( +
+ +
+ + +
+
+); diff --git a/client/coral-admin/src/containers/Dashboard/FlagWidget.js b/client/coral-admin/src/routes/Dashboard/components/FlagWidget.js similarity index 100% rename from client/coral-admin/src/containers/Dashboard/FlagWidget.js rename to client/coral-admin/src/routes/Dashboard/components/FlagWidget.js diff --git a/client/coral-admin/src/containers/Dashboard/LikeWidget.js b/client/coral-admin/src/routes/Dashboard/components/LikeWidget.js similarity index 100% rename from client/coral-admin/src/containers/Dashboard/LikeWidget.js rename to client/coral-admin/src/routes/Dashboard/components/LikeWidget.js diff --git a/client/coral-admin/src/containers/Dashboard/MostLikedCommentsWidget.js b/client/coral-admin/src/routes/Dashboard/components/MostLikedCommentsWidget.js similarity index 100% rename from client/coral-admin/src/containers/Dashboard/MostLikedCommentsWidget.js rename to client/coral-admin/src/routes/Dashboard/components/MostLikedCommentsWidget.js diff --git a/client/coral-admin/src/containers/Dashboard/Widget.css b/client/coral-admin/src/routes/Dashboard/components/Widget.css similarity index 100% rename from client/coral-admin/src/containers/Dashboard/Widget.css rename to client/coral-admin/src/routes/Dashboard/components/Widget.css diff --git a/client/coral-admin/src/routes/Dashboard/containers/Dashboard.js b/client/coral-admin/src/routes/Dashboard/containers/Dashboard.js new file mode 100644 index 000000000..79f0b964f --- /dev/null +++ b/client/coral-admin/src/routes/Dashboard/containers/Dashboard.js @@ -0,0 +1,33 @@ +import React from 'react'; +import {compose} from 'react-apollo'; +import {connect} from 'react-redux'; +import {getMetrics} from 'coral-admin/src/graphql/queries'; +import Dashboard from '../components/Dashboard'; + +import {Spinner} from 'coral-ui'; + +class DashboardContainer extends React.Component { + + reloadData = () => { + this.props.data.refetch(); + } + + render () { + if (this.props.data && this.props.data.loading) { + return ; + } + return ; + } +} + +const mapStateToProps = (state) => { + return { + settings: state.settings.toJS(), + moderation: state.moderation.toJS() + }; +}; + +export default compose( + connect(mapStateToProps), + getMetrics +)(DashboardContainer); diff --git a/client/coral-admin/src/routes/Dashboard/index.js b/client/coral-admin/src/routes/Dashboard/index.js new file mode 100644 index 000000000..5bbb476e2 --- /dev/null +++ b/client/coral-admin/src/routes/Dashboard/index.js @@ -0,0 +1 @@ +export {default} from './containers/Dashboard.js'; diff --git a/client/coral-admin/src/routes/Install/components/Install.js b/client/coral-admin/src/routes/Install/components/Install.js new file mode 100644 index 000000000..4885ffed7 --- /dev/null +++ b/client/coral-admin/src/routes/Install/components/Install.js @@ -0,0 +1,79 @@ +import React, {Component} from 'react'; +import styles from './style.css'; +import {Wizard, WizardNav} from 'coral-ui'; +import Layout from 'coral-admin/src/components/ui/Layout'; + +import InitialStep from './Steps/InitialStep'; +import AddOrganizationName from './Steps/AddOrganizationName'; +import CreateYourAccount from './Steps/CreateYourAccount'; +import PermittedDomainsStep from './Steps/PermittedDomainsStep'; +import FinalStep from './Steps/FinalStep'; + +export default class Install extends Component { + handleDomainsChange = (value) => { + this.props.updatePermittedDomains(value); + }; + + handleSettingsChange = ({currentTarget: {name, value}}) => { + this.props.updateSettingsFormData(name, value); + }; + + handleUserChange = ({currentTarget: {name, value}}) => { + this.props.updateUserFormData(name, value); + }; + + handleSettingsSubmit = (e) => { + e.preventDefault(); + this.props.submitSettings(); + }; + + handleUserSubmit = (e) => { + e.preventDefault(); + this.props.submitUser(); + } + + render() { + const {install} = this.props; + + return ( + +
+ { + !install.alreadyInstalled ? ( +
+

Welcome to the Coral Project

+ { install.step !== 0 ? : null } + + + + + + + +
+ ) : ( +
Talk is already installed
+ ) + } +
+
+ ); + } +} diff --git a/client/coral-admin/src/containers/Install/components/Steps/AddOrganizationName.js b/client/coral-admin/src/routes/Install/components/Steps/AddOrganizationName.js similarity index 95% rename from client/coral-admin/src/containers/Install/components/Steps/AddOrganizationName.js rename to client/coral-admin/src/routes/Install/components/Steps/AddOrganizationName.js index b25ddf143..ca4694efb 100644 --- a/client/coral-admin/src/containers/Install/components/Steps/AddOrganizationName.js +++ b/client/coral-admin/src/routes/Install/components/Steps/AddOrganizationName.js @@ -3,7 +3,7 @@ import styles from './style.css'; import {TextField, Button} from 'coral-ui'; const lang = new I18n(translations); -import translations from '../../translations.json'; +import translations from '../translations.json'; import I18n from 'coral-framework/modules/i18n/i18n'; const AddOrganizationName = (props) => { diff --git a/client/coral-admin/src/containers/Install/components/Steps/CreateYourAccount.js b/client/coral-admin/src/routes/Install/components/Steps/CreateYourAccount.js similarity index 97% rename from client/coral-admin/src/containers/Install/components/Steps/CreateYourAccount.js rename to client/coral-admin/src/routes/Install/components/Steps/CreateYourAccount.js index e46f013a8..b4ccd7d2b 100644 --- a/client/coral-admin/src/containers/Install/components/Steps/CreateYourAccount.js +++ b/client/coral-admin/src/routes/Install/components/Steps/CreateYourAccount.js @@ -3,7 +3,7 @@ import styles from './style.css'; import {TextField, Button, Spinner} from 'coral-ui'; const lang = new I18n(translations); -import translations from '../../translations.json'; +import translations from '../translations.json'; import I18n from 'coral-framework/modules/i18n/i18n'; const InitialStep = (props) => { diff --git a/client/coral-admin/src/containers/Install/components/Steps/FinalStep.js b/client/coral-admin/src/routes/Install/components/Steps/FinalStep.js similarity index 92% rename from client/coral-admin/src/containers/Install/components/Steps/FinalStep.js rename to client/coral-admin/src/routes/Install/components/Steps/FinalStep.js index 0ad918487..dd12de76e 100644 --- a/client/coral-admin/src/containers/Install/components/Steps/FinalStep.js +++ b/client/coral-admin/src/routes/Install/components/Steps/FinalStep.js @@ -4,7 +4,7 @@ import {Button} from 'coral-ui'; import {Link} from 'react-router'; const lang = new I18n(translations); -import translations from '../../translations.json'; +import translations from '../translations.json'; import I18n from 'coral-framework/modules/i18n/i18n'; const InitialStep = () => { diff --git a/client/coral-admin/src/containers/Install/components/Steps/InitialStep.js b/client/coral-admin/src/routes/Install/components/Steps/InitialStep.js similarity index 90% rename from client/coral-admin/src/containers/Install/components/Steps/InitialStep.js rename to client/coral-admin/src/routes/Install/components/Steps/InitialStep.js index 18b49ce64..8e19e1732 100644 --- a/client/coral-admin/src/containers/Install/components/Steps/InitialStep.js +++ b/client/coral-admin/src/routes/Install/components/Steps/InitialStep.js @@ -3,7 +3,7 @@ import styles from './style.css'; import {Button} from 'coral-ui'; const lang = new I18n(translations); -import translations from '../../translations.json'; +import translations from '../translations.json'; import I18n from 'coral-framework/modules/i18n/i18n'; const InitialStep = (props) => { diff --git a/client/coral-admin/src/containers/Install/components/Steps/InviteTeamMembers.js b/client/coral-admin/src/routes/Install/components/Steps/InviteTeamMembers.js similarity index 100% rename from client/coral-admin/src/containers/Install/components/Steps/InviteTeamMembers.js rename to client/coral-admin/src/routes/Install/components/Steps/InviteTeamMembers.js diff --git a/client/coral-admin/src/containers/Install/components/Steps/PermittedDomainsStep.js b/client/coral-admin/src/routes/Install/components/Steps/PermittedDomainsStep.js similarity index 95% rename from client/coral-admin/src/containers/Install/components/Steps/PermittedDomainsStep.js rename to client/coral-admin/src/routes/Install/components/Steps/PermittedDomainsStep.js index 9058db4c2..812f4bc3f 100644 --- a/client/coral-admin/src/containers/Install/components/Steps/PermittedDomainsStep.js +++ b/client/coral-admin/src/routes/Install/components/Steps/PermittedDomainsStep.js @@ -4,7 +4,7 @@ import {Button, Card} from 'coral-ui'; import TagsInput from 'react-tagsinput'; const lang = new I18n(translations); -import translations from '../../translations.json'; +import translations from '../translations.json'; import I18n from 'coral-framework/modules/i18n/i18n'; const PermittedDomainsStep = (props) => { diff --git a/client/coral-admin/src/containers/Install/components/Steps/style.css b/client/coral-admin/src/routes/Install/components/Steps/style.css similarity index 100% rename from client/coral-admin/src/containers/Install/components/Steps/style.css rename to client/coral-admin/src/routes/Install/components/Steps/style.css diff --git a/client/coral-admin/src/containers/Install/style.css b/client/coral-admin/src/routes/Install/components/style.css similarity index 100% rename from client/coral-admin/src/containers/Install/style.css rename to client/coral-admin/src/routes/Install/components/style.css diff --git a/client/coral-admin/src/containers/Install/translations.json b/client/coral-admin/src/routes/Install/components/translations.json similarity index 100% rename from client/coral-admin/src/containers/Install/translations.json rename to client/coral-admin/src/routes/Install/components/translations.json diff --git a/client/coral-admin/src/routes/Install/containers/InstallContainer.js b/client/coral-admin/src/routes/Install/containers/InstallContainer.js new file mode 100644 index 000000000..5dcb35705 --- /dev/null +++ b/client/coral-admin/src/routes/Install/containers/InstallContainer.js @@ -0,0 +1,57 @@ +import React, {Component} from 'react'; +import {connect} from 'react-redux'; +import {bindActionCreators} from 'redux'; +import {compose} from 'react-apollo'; +import Install from '../components/Install'; + +import { + goToStep, + nextStep, + submitUser, + checkInstall, + previousStep, + finishInstall, + submitSettings, + updateUserFormData, + updateSettingsFormData, + updatePermittedDomains +} from '../../../actions/install'; + +class InstallContainer extends Component { + componentDidMount() { + const {checkInstall} = this.props; + checkInstall(() => { + this.context.router.push('/admin'); + }); + } + + render() { + return ; + } +} + +InstallContainer.contextTypes = { + router: React.PropTypes.object +}; + +const mapStateToProps = (state) => ({ + install: state.install.toJS() +}); + +const mapDispatchToProps = (dispatch) => + bindActionCreators({ + goToStep, + nextStep, + submitUser, + checkInstall, + previousStep, + finishInstall, + submitSettings, + updateUserFormData, + updateSettingsFormData, + updatePermittedDomains + }, dispatch); + +export default compose( + connect(mapStateToProps, mapDispatchToProps), +)(InstallContainer); diff --git a/client/coral-admin/src/routes/Install/index.js b/client/coral-admin/src/routes/Install/index.js new file mode 100644 index 000000000..5c47e4060 --- /dev/null +++ b/client/coral-admin/src/routes/Install/index.js @@ -0,0 +1 @@ +export {default} from './containers/InstallContainer.js'; diff --git a/client/coral-admin/src/containers/ModerationQueue/components/BanUserDialog.css b/client/coral-admin/src/routes/Moderation/components/BanUserDialog.css similarity index 100% rename from client/coral-admin/src/containers/ModerationQueue/components/BanUserDialog.css rename to client/coral-admin/src/routes/Moderation/components/BanUserDialog.css diff --git a/client/coral-admin/src/containers/ModerationQueue/components/BanUserDialog.js b/client/coral-admin/src/routes/Moderation/components/BanUserDialog.js similarity index 100% rename from client/coral-admin/src/containers/ModerationQueue/components/BanUserDialog.js rename to client/coral-admin/src/routes/Moderation/components/BanUserDialog.js diff --git a/client/coral-admin/src/containers/ModerationQueue/components/Comment.css b/client/coral-admin/src/routes/Moderation/components/Comment.css similarity index 100% rename from client/coral-admin/src/containers/ModerationQueue/components/Comment.css rename to client/coral-admin/src/routes/Moderation/components/Comment.css diff --git a/client/coral-admin/src/containers/ModerationQueue/components/Comment.js b/client/coral-admin/src/routes/Moderation/components/Comment.js similarity index 100% rename from client/coral-admin/src/containers/ModerationQueue/components/Comment.js rename to client/coral-admin/src/routes/Moderation/components/Comment.js diff --git a/client/coral-admin/src/containers/ModerationQueue/components/CommentCount.css b/client/coral-admin/src/routes/Moderation/components/CommentCount.css similarity index 100% rename from client/coral-admin/src/containers/ModerationQueue/components/CommentCount.css rename to client/coral-admin/src/routes/Moderation/components/CommentCount.css diff --git a/client/coral-admin/src/containers/ModerationQueue/components/CommentCount.js b/client/coral-admin/src/routes/Moderation/components/CommentCount.js similarity index 100% rename from client/coral-admin/src/containers/ModerationQueue/components/CommentCount.js rename to client/coral-admin/src/routes/Moderation/components/CommentCount.js diff --git a/client/coral-admin/src/containers/ModerationQueue/components/CommentType.css b/client/coral-admin/src/routes/Moderation/components/CommentType.css similarity index 100% rename from client/coral-admin/src/containers/ModerationQueue/components/CommentType.css rename to client/coral-admin/src/routes/Moderation/components/CommentType.css diff --git a/client/coral-admin/src/containers/ModerationQueue/components/CommentType.js b/client/coral-admin/src/routes/Moderation/components/CommentType.js similarity index 100% rename from client/coral-admin/src/containers/ModerationQueue/components/CommentType.js rename to client/coral-admin/src/routes/Moderation/components/CommentType.js diff --git a/client/coral-admin/src/containers/ModerationQueue/components/FlagBox.css b/client/coral-admin/src/routes/Moderation/components/FlagBox.css similarity index 100% rename from client/coral-admin/src/containers/ModerationQueue/components/FlagBox.css rename to client/coral-admin/src/routes/Moderation/components/FlagBox.css diff --git a/client/coral-admin/src/containers/ModerationQueue/components/FlagBox.js b/client/coral-admin/src/routes/Moderation/components/FlagBox.js similarity index 100% rename from client/coral-admin/src/containers/ModerationQueue/components/FlagBox.js rename to client/coral-admin/src/routes/Moderation/components/FlagBox.js diff --git a/client/coral-admin/src/containers/ModerationQueue/components/LoadMore.js b/client/coral-admin/src/routes/Moderation/components/LoadMore.js similarity index 100% rename from client/coral-admin/src/containers/ModerationQueue/components/LoadMore.js rename to client/coral-admin/src/routes/Moderation/components/LoadMore.js diff --git a/client/coral-admin/src/containers/ModerationQueue/ModerationContainer.js b/client/coral-admin/src/routes/Moderation/components/Moderation.js similarity index 73% rename from client/coral-admin/src/containers/ModerationQueue/ModerationContainer.js rename to client/coral-admin/src/routes/Moderation/components/Moderation.js index 237059103..10f775cd7 100644 --- a/client/coral-admin/src/containers/ModerationQueue/ModerationContainer.js +++ b/client/coral-admin/src/routes/Moderation/components/Moderation.js @@ -1,44 +1,22 @@ import React, {Component} from 'react'; -import {connect} from 'react-redux'; -import {bindActionCreators} from 'redux'; -import {compose} from 'react-apollo'; import * as notification from 'coral-admin/src/services/notification'; import key from 'keymaster'; -import isEqual from 'lodash/isEqual'; -import styles from './components/styles.css'; +import styles from './styles.css'; import translations from 'coral-admin/src/translations'; import I18n from 'coral-framework/modules/i18n/i18n'; -import {modQueueQuery, getQueueCounts} from '../../graphql/queries'; -import {banUser, setCommentStatus, suspendUser} from '../../graphql/mutations'; - -import {fetchSettings} from 'actions/settings'; -import {updateAssets} from 'actions/assets'; -import { - toggleModal, - singleView, - showBanUserDialog, - hideBanUserDialog, - showSuspendUserDialog, - hideSuspendUserDialog, - hideShortcutsNote, - viewUserDetail, - hideUserDetail -} from 'actions/moderation'; - -import {Spinner} from 'coral-ui'; -import BanUserDialog from './components/BanUserDialog'; -import SuspendUserDialog from './components/SuspendUserDialog'; +import BanUserDialog from './BanUserDialog'; +import SuspendUserDialog from './SuspendUserDialog'; import ModerationQueue from './ModerationQueue'; -import ModerationMenu from './components/ModerationMenu'; -import ModerationHeader from './components/ModerationHeader'; -import NotFoundAsset from './components/NotFoundAsset'; -import ModerationKeysModal from '../../components/ModerationKeysModal'; +import ModerationMenu from './ModerationMenu'; +import ModerationHeader from './ModerationHeader'; +import NotFoundAsset from './NotFoundAsset'; +import ModerationKeysModal from '../../../components/ModerationKeysModal'; import UserDetail from './UserDetail'; const lang = new I18n(translations); -class ModerationContainer extends Component { +export default class Moderation extends Component { state = { selectedIndex: 0, sort: 'REVERSE_CHRONOLOGICAL' @@ -47,7 +25,6 @@ class ModerationContainer extends Component { componentWillMount() { const {toggleModal, singleView} = this.props; - this.props.fetchSettings(); key('s', () => singleView()); key('shift+/', () => toggleModal(true)); key('esc', () => toggleModal(false)); @@ -57,6 +34,10 @@ class ModerationContainer extends Component { key('t', this.moderate(true)); } + onClose = () => { + this.toggleModal(false); + } + moderate = (accept) => () => { const {acceptComment, rejectComment} = this.props; const {selectedIndex} = this.state; @@ -148,28 +129,13 @@ class ModerationContainer extends Component { } } - componentWillReceiveProps(nextProps) { - const {updateAssets} = this.props; - if(!isEqual(nextProps.data.assets, this.props.data.assets)) { - updateAssets(nextProps.data.assets); - } - } - render () { - const {data, moderation, settings, assets, onClose, viewUserDetail, hideUserDetail, ...props} = this.props; + const {data, moderation, settings, assets, viewUserDetail, hideUserDetail, ...props} = this.props; const providedAssetId = this.props.params.id; const activeTab = this.props.route.path === ':id' ? 'premod' : this.props.route.path; let asset; - if (!('premodCount' in data)) { - return
; - } - - if (data.error) { - return
Error
; - } - if (providedAssetId) { asset = assets.find((asset) => asset.id === this.props.params.id); @@ -253,7 +219,7 @@ class ModerationContainer extends Component { hideShortcutsNote={props.hideShortcutsNote} shortcutsNoteVisible={moderation.shortcutsNoteVisible} open={moderation.modalOpen} - onClose={onClose}/> + onClose={this.onClose}/> {moderation.userDetailId && ( ({ - moderation: state.moderation.toJS(), - settings: state.settings.toJS(), - auth: state.auth.toJS(), - assets: state.assets.get('assets') -}); - -const mapDispatchToProps = (dispatch) => ({ - onClose: () => dispatch(toggleModal(false)), - hideBanUserDialog: () => dispatch(hideBanUserDialog(false)), - ...bindActionCreators({ - toggleModal, - singleView, - updateAssets, - fetchSettings, - showBanUserDialog, - hideShortcutsNote, - showSuspendUserDialog, - hideSuspendUserDialog, - viewUserDetail, - hideUserDetail, - }, dispatch), -}); - -export default compose( - connect(mapStateToProps, mapDispatchToProps), - setCommentStatus, - getQueueCounts, - banUser, - suspendUser, - modQueueQuery, -)(ModerationContainer); diff --git a/client/coral-admin/src/containers/ModerationQueue/components/ModerationHeader.js b/client/coral-admin/src/routes/Moderation/components/ModerationHeader.js similarity index 100% rename from client/coral-admin/src/containers/ModerationQueue/components/ModerationHeader.js rename to client/coral-admin/src/routes/Moderation/components/ModerationHeader.js diff --git a/client/coral-admin/src/containers/ModerationQueue/ModerationLayout.js b/client/coral-admin/src/routes/Moderation/components/ModerationLayout.js similarity index 100% rename from client/coral-admin/src/containers/ModerationQueue/ModerationLayout.js rename to client/coral-admin/src/routes/Moderation/components/ModerationLayout.js diff --git a/client/coral-admin/src/containers/ModerationQueue/components/ModerationMenu.js b/client/coral-admin/src/routes/Moderation/components/ModerationMenu.js similarity index 100% rename from client/coral-admin/src/containers/ModerationQueue/components/ModerationMenu.js rename to client/coral-admin/src/routes/Moderation/components/ModerationMenu.js diff --git a/client/coral-admin/src/containers/ModerationQueue/ModerationQueue.js b/client/coral-admin/src/routes/Moderation/components/ModerationQueue.js similarity index 91% rename from client/coral-admin/src/containers/ModerationQueue/ModerationQueue.js rename to client/coral-admin/src/routes/Moderation/components/ModerationQueue.js index 043173549..f765df9f1 100644 --- a/client/coral-admin/src/containers/ModerationQueue/ModerationQueue.js +++ b/client/coral-admin/src/routes/Moderation/components/ModerationQueue.js @@ -1,12 +1,12 @@ import React, {PropTypes} from 'react'; -import Comment from './components/Comment'; -import styles from './components/styles.css'; -import EmptyCard from '../../components/EmptyCard'; -import {actionsMap} from './helpers/moderationQueueActionsMap'; +import Comment from './Comment'; +import styles from './styles.css'; +import EmptyCard from '../../../components/EmptyCard'; +import {actionsMap} from '../helpers/moderationQueueActionsMap'; import I18n from 'coral-framework/modules/i18n/i18n'; import translations from 'coral-admin/src/translations'; -import LoadMore from './components/LoadMore'; +import LoadMore from './LoadMore'; const lang = new I18n(translations); class ModerationQueue extends React.Component { diff --git a/client/coral-admin/src/containers/ModerationQueue/components/NotFoundAsset.js b/client/coral-admin/src/routes/Moderation/components/NotFoundAsset.js similarity index 100% rename from client/coral-admin/src/containers/ModerationQueue/components/NotFoundAsset.js rename to client/coral-admin/src/routes/Moderation/components/NotFoundAsset.js diff --git a/client/coral-admin/src/containers/ModerationQueue/components/SuspendUserDialog.css b/client/coral-admin/src/routes/Moderation/components/SuspendUserDialog.css similarity index 100% rename from client/coral-admin/src/containers/ModerationQueue/components/SuspendUserDialog.css rename to client/coral-admin/src/routes/Moderation/components/SuspendUserDialog.css diff --git a/client/coral-admin/src/containers/ModerationQueue/components/SuspendUserDialog.js b/client/coral-admin/src/routes/Moderation/components/SuspendUserDialog.js similarity index 100% rename from client/coral-admin/src/containers/ModerationQueue/components/SuspendUserDialog.js rename to client/coral-admin/src/routes/Moderation/components/SuspendUserDialog.js diff --git a/client/coral-admin/src/containers/ModerationQueue/UserDetail.css b/client/coral-admin/src/routes/Moderation/components/UserDetail.css similarity index 100% rename from client/coral-admin/src/containers/ModerationQueue/UserDetail.css rename to client/coral-admin/src/routes/Moderation/components/UserDetail.css diff --git a/client/coral-admin/src/containers/ModerationQueue/UserDetail.js b/client/coral-admin/src/routes/Moderation/components/UserDetail.js similarity index 88% rename from client/coral-admin/src/containers/ModerationQueue/UserDetail.js rename to client/coral-admin/src/routes/Moderation/components/UserDetail.js index d9b85a060..8da8b1a4c 100644 --- a/client/coral-admin/src/containers/ModerationQueue/UserDetail.js +++ b/client/coral-admin/src/routes/Moderation/components/UserDetail.js @@ -1,14 +1,13 @@ import React, {PropTypes} from 'react'; import {Button, Drawer} from 'coral-ui'; import styles from './UserDetail.css'; -import {compose} from 'react-apollo'; -import {getUserDetail} from 'coral-admin/src/graphql/queries'; import Slot from 'coral-framework/components/Slot'; -class UserDetail extends React.Component { +export default class UserDetail extends React.Component { static propTypes = { id: PropTypes.string.isRequired, - hideUserDetail: PropTypes.func.isRequired + hideUserDetail: PropTypes.func.isRequired, + data: PropTypes.string.isRequired, } copyPermalink = () => { @@ -69,6 +68,3 @@ class UserDetail extends React.Component { } } -export default compose( - getUserDetail -)(UserDetail); diff --git a/client/coral-admin/src/containers/ModerationQueue/components/styles.css b/client/coral-admin/src/routes/Moderation/components/styles.css similarity index 100% rename from client/coral-admin/src/containers/ModerationQueue/components/styles.css rename to client/coral-admin/src/routes/Moderation/components/styles.css diff --git a/client/coral-admin/src/routes/Moderation/containers/Moderation.js b/client/coral-admin/src/routes/Moderation/containers/Moderation.js new file mode 100644 index 000000000..722b6a0b4 --- /dev/null +++ b/client/coral-admin/src/routes/Moderation/containers/Moderation.js @@ -0,0 +1,83 @@ +import React, {Component} from 'react'; +import {connect} from 'react-redux'; +import {bindActionCreators} from 'redux'; +import {compose} from 'react-apollo'; +import isEqual from 'lodash/isEqual'; + +import {modQueueQuery, getQueueCounts} from '../../../graphql/queries'; +import {banUser, setCommentStatus, suspendUser} from '../../../graphql/mutations'; + +import {fetchSettings} from 'actions/settings'; +import {updateAssets} from 'actions/assets'; +import { + toggleModal, + singleView, + showBanUserDialog, + hideBanUserDialog, + showSuspendUserDialog, + hideSuspendUserDialog, + hideShortcutsNote, + viewUserDetail, + hideUserDetail +} from 'actions/moderation'; + +import {Spinner} from 'coral-ui'; +import Moderation from '../components/Moderation'; + +class ModerationContainer extends Component { + componentWillMount() { + this.props.fetchSettings(); + } + + componentWillReceiveProps(nextProps) { + const {updateAssets} = this.props; + if(!isEqual(nextProps.data.assets, this.props.data.assets)) { + updateAssets(nextProps.data.assets); + } + } + + render () { + const {data} = this.props; + + if (!('premodCount' in data)) { + return
; + } + + if (data.error) { + return
Error
; + } + return ; + } +} + +const mapStateToProps = (state) => ({ + moderation: state.moderation.toJS(), + settings: state.settings.toJS(), + auth: state.auth.toJS(), + assets: state.assets.get('assets') +}); + +const mapDispatchToProps = (dispatch) => ({ + ...bindActionCreators({ + toggleModal, + singleView, + updateAssets, + fetchSettings, + showBanUserDialog, + hideBanUserDialog, + hideShortcutsNote, + showSuspendUserDialog, + hideSuspendUserDialog, + viewUserDetail, + hideUserDetail, + }, dispatch), +}); + +export default compose( + connect(mapStateToProps, mapDispatchToProps), + setCommentStatus, + getQueueCounts, + banUser, + suspendUser, + modQueueQuery, +)(ModerationContainer); diff --git a/client/coral-admin/src/routes/Moderation/containers/UserDetail.js b/client/coral-admin/src/routes/Moderation/containers/UserDetail.js new file mode 100644 index 000000000..6923eb96e --- /dev/null +++ b/client/coral-admin/src/routes/Moderation/containers/UserDetail.js @@ -0,0 +1,19 @@ +import React, {PropTypes} from 'react'; +import {compose} from 'react-apollo'; +import {getUserDetail} from 'coral-admin/src/graphql/queries'; +import UserDetail from '../components/UserDetail'; + +class UserDetailContainer extends React.Component { + static propTypes = { + id: PropTypes.string.isRequired, + hideUserDetail: PropTypes.func.isRequired + } + + render () { + return ; + } +} + +export default compose( + getUserDetail +)(UserDetailContainer); diff --git a/client/coral-admin/src/containers/ModerationQueue/helpers/moderationQueueActionsMap.js b/client/coral-admin/src/routes/Moderation/helpers/moderationQueueActionsMap.js similarity index 100% rename from client/coral-admin/src/containers/ModerationQueue/helpers/moderationQueueActionsMap.js rename to client/coral-admin/src/routes/Moderation/helpers/moderationQueueActionsMap.js diff --git a/client/coral-admin/src/routes/Moderation/index.js b/client/coral-admin/src/routes/Moderation/index.js new file mode 100644 index 000000000..e6bef5ef3 --- /dev/null +++ b/client/coral-admin/src/routes/Moderation/index.js @@ -0,0 +1,2 @@ +export {default as Moderation} from './containers/Moderation'; +export {default as ModerationLayout} from './components/ModerationLayout'; diff --git a/client/coral-admin/src/containers/Stories/Stories.css b/client/coral-admin/src/routes/Stories/components/Stories.css similarity index 100% rename from client/coral-admin/src/containers/Stories/Stories.css rename to client/coral-admin/src/routes/Stories/components/Stories.css diff --git a/client/coral-admin/src/containers/Stories/Stories.js b/client/coral-admin/src/routes/Stories/components/Stories.js similarity index 91% rename from client/coral-admin/src/containers/Stories/Stories.js rename to client/coral-admin/src/routes/Stories/components/Stories.js index 62393cb04..375f9e51e 100644 --- a/client/coral-admin/src/containers/Stories/Stories.js +++ b/client/coral-admin/src/routes/Stories/components/Stories.js @@ -1,8 +1,6 @@ import React, {Component} from 'react'; import styles from './Stories.css'; -import {connect} from 'react-redux'; import I18n from 'coral-framework/modules/i18n/i18n'; -import {fetchAssets, updateAssetState} from 'coral-admin/src/actions/assets'; import translations from 'coral-admin/src/translations.json'; import {Link} from 'react-router'; @@ -11,9 +9,11 @@ import {DataTable, TableHeader, RadioGroup, Radio} from 'react-mdl'; import EmptyCard from 'coral-admin/src/components/EmptyCard'; import sortBy from 'lodash/sortBy'; +const lang = new I18n(translations); + const limit = 25; -class Stories extends Component { +export default class Stories extends Component { state = { search: '', @@ -171,22 +171,3 @@ class Stories extends Component { ); } } - -const mapStateToProps = ({assets}) => { - return { - assets: assets.toJS() - }; -}; - -const mapDispatchToProps = (dispatch) => { - return { - fetchAssets: (...args) => { - dispatch(fetchAssets.apply(this, args)); - }, - updateAssetState: (...args) => dispatch(updateAssetState.apply(this, args)) - }; -}; - -export default connect(mapStateToProps, mapDispatchToProps)(Stories); - -const lang = new I18n(translations); diff --git a/client/coral-admin/src/routes/Stories/containers/Stories.js b/client/coral-admin/src/routes/Stories/containers/Stories.js new file mode 100644 index 000000000..450efcf74 --- /dev/null +++ b/client/coral-admin/src/routes/Stories/containers/Stories.js @@ -0,0 +1,27 @@ +import React, {Component} from 'react'; +import {connect} from 'react-redux'; +import {bindActionCreators} from 'redux'; +import {compose} from 'react-apollo'; +import {fetchAssets, updateAssetState} from 'coral-admin/src/actions/assets'; +import Stories from '../components/Stories'; + +class StoriesContainer extends Component { + render () { + return ; + } +} + +const mapStateToProps = (state) => ({ + assets: state.assets.toJS() +}); + +const mapDispatchToProps = (dispatch) => + bindActionCreators({ + fetchAssets, + updateAssetState, + }, dispatch); + +export default compose( + connect(mapStateToProps, mapDispatchToProps), +)(StoriesContainer); + diff --git a/client/coral-admin/src/routes/Stories/index.js b/client/coral-admin/src/routes/Stories/index.js new file mode 100644 index 000000000..5b2999b21 --- /dev/null +++ b/client/coral-admin/src/routes/Stories/index.js @@ -0,0 +1 @@ +export {default} from './containers/Stories.js'; diff --git a/services/users.js b/services/users.js index 496db4528..b6a5e0404 100644 --- a/services/users.js +++ b/services/users.js @@ -381,12 +381,15 @@ module.exports = class UsersService { * @param {Function} done callback after the operation is complete */ static addRoleToUser(id, role) { + const roles = []; // Check to see if the user role is in the allowable set of roles. - if (USER_ROLES.indexOf(role) === -1) { + if (role && USER_ROLES.indexOf(role) === -1) { // User role is not supported! Error out here. return Promise.reject(new Error(`role ${role} is not supported`)); + } else { + roles.push(role); } return UserModel.update({id}, {$set: {roles: [role]}});