diff --git a/client/coral-admin/src/AppRouter.js b/client/coral-admin/src/AppRouter.js index a00c17c04..b28c4582b 100644 --- a/client/coral-admin/src/AppRouter.js +++ b/client/coral-admin/src/AppRouter.js @@ -1,5 +1,5 @@ import React from 'react'; -import {Router, Route, IndexRoute, browserHistory} from 'react-router'; +import {Router, Route, IndexRoute, IndexRedirect, browserHistory} from 'react-router'; import Streams from 'containers/Streams/Streams'; import Configure from 'containers/Configure/Configure'; @@ -7,6 +7,8 @@ import LayoutContainer from 'containers/LayoutContainer'; import CommentStream from 'containers/CommentStream/CommentStream'; import InstallContainer from 'containers/Install/InstallContainer'; import CommunityContainer from 'containers/Community/CommunityContainer'; + +import ModerationLayout from 'containers/ModerationQueue/ModerationLayout'; import ModerationContainer from 'containers/ModerationQueue/ModerationContainer'; const routes = ( @@ -19,8 +21,21 @@ const routes = ( - - + {/* Moderation Routes */} + + + + + + + + + + + + + + ); diff --git a/client/coral-admin/src/actions/moderation.js b/client/coral-admin/src/actions/moderation.js index b332b9086..5116700c7 100644 --- a/client/coral-admin/src/actions/moderation.js +++ b/client/coral-admin/src/actions/moderation.js @@ -1,6 +1,5 @@ import * as actions from 'constants/moderation'; -export const setActiveTab = activeTab => ({type: actions.SET_ACTIVE_TAB, activeTab}); export const toggleModal = open => ({type: actions.TOGGLE_MODAL, open}); export const singleView = () => ({type: actions.SINGLE_VIEW}); diff --git a/client/coral-admin/src/constants/moderation.js b/client/coral-admin/src/constants/moderation.js index 10c6a7c4c..f50cbb439 100644 --- a/client/coral-admin/src/constants/moderation.js +++ b/client/coral-admin/src/constants/moderation.js @@ -1,4 +1,3 @@ -export const SET_ACTIVE_TAB = 'SET_ACTIVE_TAB'; export const TOGGLE_MODAL = 'TOGGLE_MODAL'; export const SINGLE_VIEW = 'SINGLE_VIEW'; export const SHOW_BANUSER_DIALOG = 'SHOW_BANUSER_DIALOG'; diff --git a/client/coral-admin/src/containers/Configure/CommentSettings.js b/client/coral-admin/src/containers/Configure/CommentSettings.js index 1051bb0ba..5a14cf565 100644 --- a/client/coral-admin/src/containers/Configure/CommentSettings.js +++ b/client/coral-admin/src/containers/Configure/CommentSettings.js @@ -51,6 +51,12 @@ const updateClosedMessage = (updateSettings) => (event) => { updateSettings({closedMessage}); }; +const updateCustomCssUrl = (updateSettings) => (event) => { + console.log('updateCustomCssUrl', event.target.value); + const customCssUrl = event.target.value; + updateSettings({customCssUrl}); +}; + // If we are changing the measure we need to recalculate using the old amount // Same thing if we are just changing the amount const updateClosedTimeout = (updateSettings, ts, isMeasure) => (event) => { @@ -165,7 +171,7 @@ const CommentSettings = ({fetchingSettings, title, updateSettings, settingsError - +
{lang.t('configure.close-after')}
@@ -188,6 +194,18 @@ const CommentSettings = ({fetchingSettings, title, updateSettings, settingsError
+ +
+ {lang.t('configure.custom-css-url')} +

{lang.t('configure.custom-css-url-desc')}

+
+ +
+
); }; diff --git a/client/coral-admin/src/containers/ModerationQueue/ModerationContainer.js b/client/coral-admin/src/containers/ModerationQueue/ModerationContainer.js index 5a11ef425..7755b5bb0 100644 --- a/client/coral-admin/src/containers/ModerationQueue/ModerationContainer.js +++ b/client/coral-admin/src/containers/ModerationQueue/ModerationContainer.js @@ -9,7 +9,7 @@ import {banUser, setCommentStatus} from '../../graphql/mutations'; import {fetchSettings} from 'actions/settings'; import {updateAssets} from 'actions/assets'; -import {setActiveTab, toggleModal, singleView, showBanUserDialog, hideBanUserDialog} from 'actions/moderation'; +import {toggleModal, singleView, showBanUserDialog, hideBanUserDialog} from 'actions/moderation'; import {Spinner} from 'coral-ui'; import BanUserDialog from '../../components/BanUserDialog'; @@ -19,7 +19,6 @@ import ModerationHeader from './components/ModerationHeader'; import NotFoundAsset from './components/NotFoundAsset'; class ModerationContainer extends Component { - componentWillMount() { const {toggleModal, singleView} = this.props; @@ -46,6 +45,8 @@ class ModerationContainer extends Component { render () { const {data, moderation, settings, assets, ...props} = this.props; const providedAssetId = this.props.params.id; + const activeTab = this.props.route.path === ':id' ? 'premod' : this.props.route.path; + let asset; if (data.loading) { @@ -65,20 +66,17 @@ class ModerationContainer extends Component { } } - const enablePremodTab = !!data.premod.length; return (
({ }); const mapDispatchToProps = dispatch => ({ - onTabClick: activeTab => dispatch(setActiveTab(activeTab)), toggleModal: toggle => dispatch(toggleModal(toggle)), onClose: () => dispatch(toggleModal(false)), singleView: () => dispatch(singleView()), diff --git a/client/coral-admin/src/containers/ModerationQueue/ModerationLayout.js b/client/coral-admin/src/containers/ModerationQueue/ModerationLayout.js new file mode 100644 index 000000000..0db97cda0 --- /dev/null +++ b/client/coral-admin/src/containers/ModerationQueue/ModerationLayout.js @@ -0,0 +1,9 @@ +import React from 'react'; + +const ModerationLayout = props => ( +
+ {props.children} +
+); + +export default ModerationLayout; diff --git a/client/coral-admin/src/containers/ModerationQueue/ModerationQueue.js b/client/coral-admin/src/containers/ModerationQueue/ModerationQueue.js index 052138590..5497a25d4 100644 --- a/client/coral-admin/src/containers/ModerationQueue/ModerationQueue.js +++ b/client/coral-admin/src/containers/ModerationQueue/ModerationQueue.js @@ -3,12 +3,12 @@ import React, {PropTypes} from 'react'; import Comment from './components/Comment'; import {actionsMap} from './helpers/moderationQueueActionsMap'; -const ModerationQueue = props => { +const ModerationQueue = ({activeTab = 'premod', ...props}) => { return (
    { - props.data[props.activeTab].map((comment, i) => { + props.data[activeTab].map((comment, i) => { return {

{actionSumaries && } - - {/* */} - {/* View context*/} - {/* */} ); }; diff --git a/client/coral-admin/src/containers/ModerationQueue/components/ModerationMenu.js b/client/coral-admin/src/containers/ModerationQueue/components/ModerationMenu.js index 51605c443..0694152a2 100644 --- a/client/coral-admin/src/containers/ModerationQueue/components/ModerationMenu.js +++ b/client/coral-admin/src/containers/ModerationQueue/components/ModerationMenu.js @@ -1,59 +1,43 @@ -import React, {PropTypes} from 'react'; +import React from 'react'; import styles from './styles.css'; import I18n from 'coral-framework/modules/i18n/i18n'; import translations from 'coral-admin/src/translations.json'; +import {Link} from 'react-router'; const lang = new I18n(translations); const ModerationMenu = (props) => (
- { - e.preventDefault(); - props.onTabClick('all'); - }} - className={`mdl-tabs__tab ${styles.tab} ${props.activeTab === 'all' ? styles.active : ''}`} - > - {lang.t('modqueue.all')} - { - props.enablePremodTab - ? { - e.preventDefault(); - props.onTabClick('premod'); - }} - className={`mdl-tabs__tab ${styles.tab} ${props.activeTab === 'premod' ? styles.active : ''}`}> - {lang.t('modqueue.premod')} - - : null + props.asset ? ( +
+ + {lang.t('modqueue.premod')} + + + {lang.t('modqueue.rejected')} + + + {lang.t('modqueue.flagged')} + +
+ ) : ( +
+ + {lang.t('modqueue.premod')} + + + {lang.t('modqueue.rejected')} + + + {lang.t('modqueue.flagged')} + +
+ ) } - { - e.preventDefault(); - props.onTabClick('rejected'); - }} - className={`mdl-tabs__tab ${styles.tab} ${props.activeTab === 'rejected' ? styles.active : ''}`} - > - {lang.t('modqueue.rejected')} - - { - e.preventDefault(); - props.onTabClick('flagged'); - }} - className={`mdl-tabs__tab ${styles.tab} ${props.activeTab === 'flagged' ? styles.active : ''}`} - > - {lang.t('modqueue.flagged')} -
); -ModerationMenu.propTypes = { - activeTab: PropTypes.string.isRequired, - enablePremodTab: PropTypes.bool -}; - export default ModerationMenu; diff --git a/client/coral-admin/src/graphql/queries/modQueueQuery.graphql b/client/coral-admin/src/graphql/queries/modQueueQuery.graphql index 9eba7a971..ca7f7aa07 100644 --- a/client/coral-admin/src/graphql/queries/modQueueQuery.graphql +++ b/client/coral-admin/src/graphql/queries/modQueueQuery.graphql @@ -1,12 +1,6 @@ #import "../fragments/commentView.graphql" query ModQueue ($asset_id: ID!) { - all: comments(query: { - statuses: [REJECTED, PREMOD], - asset_id: $asset_id - }) { - ...commentView - } premod: comments(query: { statuses: [PREMOD], asset_id: $asset_id diff --git a/client/coral-admin/src/reducers/moderation.js b/client/coral-admin/src/reducers/moderation.js index 3131f6096..09a0b39e7 100644 --- a/client/coral-admin/src/reducers/moderation.js +++ b/client/coral-admin/src/reducers/moderation.js @@ -2,7 +2,6 @@ import {Map} from 'immutable'; import * as actions from '../constants/moderation'; const initialState = Map({ - activeTab: 'all', singleView: false, modalOpen: false, user: Map({}), diff --git a/client/coral-admin/src/translations.json b/client/coral-admin/src/translations.json index 42028c3a2..fc507400e 100644 --- a/client/coral-admin/src/translations.json +++ b/client/coral-admin/src/translations.json @@ -48,6 +48,8 @@ "copy": "Copy to Clipboard" }, "configure": { + "custom-css-url": "Custom CSS URL", + "custom-css-url-desc": "URL of a CSS stylesheet that will override default Embed Stream styles. Can be internal or external.", "enable-pre-moderation": "Enable pre-moderation", "enable-pre-moderation-text": "Moderators must approve any comment before it is published.", "require-email-verification": "Require Email Verification", @@ -157,6 +159,8 @@ "username_flags": "" }, "configure": { + "custom-css-url": "URL CSS a medida", + "custom-css-url-desc": "URL de una hoja de estilo que va a sobrescribir los estilos por defecto de Embed Stream. Puede ser interna o externa.", "enable-pre-moderation": "Habilitar pre-moderación", "enable-pre-moderation-text": "Los moderadores deben aprobar cada comentario antes de que sea publicado.", "require-email-verification": "Necesita confirmación de correo", diff --git a/models/setting.js b/models/setting.js index adbf60d83..0987b141d 100644 --- a/models/setting.js +++ b/models/setting.js @@ -24,6 +24,10 @@ const SettingSchema = new Schema({ type: Boolean, default: false }, + customCssUrl: { + type: String, + default: '' + }, infoBoxContent: { type: String, default: '' diff --git a/routes/embed/index.js b/routes/embed/index.js index 400d2eb4b..ccc872c1f 100644 --- a/routes/embed/index.js +++ b/routes/embed/index.js @@ -1,10 +1,14 @@ const express = require('express'); const router = express.Router(); +const SettingsService = require('../../services/settings'); router.use('/:embed', (req, res, next) => { switch (req.params.embed) { case 'stream': - return res.render('embed/stream', {}); + return SettingsService.retrieve() + .then(({customCssUrl}) => { + return res.render('embed/stream', {customCssUrl}); + }); default: // will return a 404. diff --git a/views/embed/stream.ejs b/views/embed/stream.ejs index 722864338..77b392b5f 100644 --- a/views/embed/stream.ejs +++ b/views/embed/stream.ejs @@ -5,6 +5,9 @@ + <% if (locals.customCssUrl) { %> + + <% } %>