{children}
diff --git a/client/coral-admin/src/components/ui/Logo.css b/client/coral-admin/src/components/ui/Logo.css
index e764af627..f89bf3d5d 100644
--- a/client/coral-admin/src/components/ui/Logo.css
+++ b/client/coral-admin/src/components/ui/Logo.css
@@ -1,7 +1,9 @@
.logo h1 {
color: #272727;
font-size: 20px;
- padding: 0 30px;
+ margin: 0;
+ line-height: 60px;
+ padding: 0 20px;
}
.logo span {
@@ -13,6 +15,7 @@
.logo {
background: #E5E5E5;
+ height: 100%;
}
diff --git a/client/coral-admin/src/containers/CommentStream.css b/client/coral-admin/src/containers/CommentStream/CommentStream.css
similarity index 100%
rename from client/coral-admin/src/containers/CommentStream.css
rename to client/coral-admin/src/containers/CommentStream/CommentStream.css
diff --git a/client/coral-admin/src/containers/CommentStream.js b/client/coral-admin/src/containers/CommentStream/CommentStream.js
similarity index 98%
rename from client/coral-admin/src/containers/CommentStream.js
rename to client/coral-admin/src/containers/CommentStream/CommentStream.js
index da4d03a22..b1e002549 100644
--- a/client/coral-admin/src/containers/CommentStream.js
+++ b/client/coral-admin/src/containers/CommentStream/CommentStream.js
@@ -31,7 +31,7 @@ class CommentStream extends React.Component {
// The only action for now is flagging
onClickAction (action, id) {
- if (action === 'flagged') {
+ if (action === 'flag') {
this.props.dispatch(flagComment(id));
clearTimeout(this._snackTimeout);
this.setState({snackbar: true, snackbarMsg: 'Thank you for reporting this comment. Our moderation team has been notified and will review it shortly.'});
diff --git a/client/coral-admin/src/containers/Configure.css b/client/coral-admin/src/containers/Configure/Configure.css
similarity index 100%
rename from client/coral-admin/src/containers/Configure.css
rename to client/coral-admin/src/containers/Configure/Configure.css
diff --git a/client/coral-admin/src/containers/Configure.js b/client/coral-admin/src/containers/Configure/Configure.js
similarity index 96%
rename from client/coral-admin/src/containers/Configure.js
rename to client/coral-admin/src/containers/Configure/Configure.js
index 2058c66c8..a9e2f3ef2 100644
--- a/client/coral-admin/src/containers/Configure.js
+++ b/client/coral-admin/src/containers/Configure/Configure.js
@@ -1,7 +1,6 @@
-
import React from 'react';
import {connect} from 'react-redux';
-import {fetchSettings, updateSettings, saveSettingsToServer} from '../actions/settings';
+import {fetchSettings, updateSettings, saveSettingsToServer} from '../../actions/settings';
import {
List,
ListItem,
@@ -14,7 +13,7 @@ import {
} from 'react-mdl';
import styles from './Configure.css';
import I18n from 'coral-framework/modules/i18n/i18n';
-import translations from '../translations.json';
+import translations from '../../translations.json';
class Configure extends React.Component {
constructor (props) {
@@ -23,9 +22,13 @@ class Configure extends React.Component {
this.state = {activeSection: 'comments', copied: false};
this.copyToClipBoard = this.copyToClipBoard.bind(this);
+
+ // Update settings
this.updateModeration = this.updateModeration.bind(this);
+ // InfoBox has two settings. Enable or not and the content of it if it is enable.
this.updateInfoBoxEnable = this.updateInfoBoxEnable.bind(this);
this.updateInfoBoxContent = this.updateInfoBoxContent.bind(this);
+
this.saveSettings = this.saveSettings.bind(this);
}
diff --git a/client/coral-admin/src/containers/LayoutContainer.js b/client/coral-admin/src/containers/LayoutContainer.js
index 5f3cb0cff..f263c33f5 100644
--- a/client/coral-admin/src/containers/LayoutContainer.js
+++ b/client/coral-admin/src/containers/LayoutContainer.js
@@ -1,37 +1,31 @@
import React, {Component} from 'react';
import {connect} from 'react-redux';
import {Layout} from '../components/ui/Layout';
-import {checkLogin} from '../actions/auth';
-import {NotFound} from '../components/NotFound';
+import {checkLogin, logout} from '../actions/auth';
+import {FullLoading} from '../components/FullLoading';
import {PermissionRequired} from '../components/PermissionRequired';
class LayoutContainer extends Component {
componentWillMount () {
- this.props.checkLogin();
+ const {checkLogin} = this.props;
+ checkLogin();
}
render () {
- const {isAdmin, loggedIn} = this.props.auth;
-
- if (!loggedIn) {
- return
;
- }
-
- if (!isAdmin && loggedIn) {
- return
;
- }
-
- return
;
+ const {isAdmin, loggedIn, loadingUser} = this.props.auth;
+ if (loadingUser) { return
; }
+ if (!isAdmin) { return
; }
+ if (isAdmin && loggedIn) { return
; }
+ return
;
}
}
-LayoutContainer.propTypes = {};
-
const mapStateToProps = state => ({
auth: state.auth.toJS()
});
const mapDispatchToProps = dispatch => ({
checkLogin: () => dispatch(checkLogin()),
+ handleLogout: () => dispatch(logout())
});
export default connect(
diff --git a/client/coral-admin/src/containers/ModerationQueue.css b/client/coral-admin/src/containers/ModerationQueue/ModerationQueue.css
similarity index 100%
rename from client/coral-admin/src/containers/ModerationQueue.css
rename to client/coral-admin/src/containers/ModerationQueue/ModerationQueue.css
diff --git a/client/coral-admin/src/containers/ModerationQueue.js b/client/coral-admin/src/containers/ModerationQueue/ModerationQueue.js
similarity index 95%
rename from client/coral-admin/src/containers/ModerationQueue.js
rename to client/coral-admin/src/containers/ModerationQueue/ModerationQueue.js
index 88150012a..a4d82fddc 100644
--- a/client/coral-admin/src/containers/ModerationQueue.js
+++ b/client/coral-admin/src/containers/ModerationQueue/ModerationQueue.js
@@ -1,16 +1,22 @@
import React from 'react';
import {connect} from 'react-redux';
+import key from 'keymaster';
+
import ModerationKeysModal from 'components/ModerationKeysModal';
import CommentList from 'components/CommentList';
+
import {updateStatus} from 'actions/comments';
import styles from './ModerationQueue.css';
-import key from 'keymaster';
+
import I18n from 'coral-framework/modules/i18n/i18n';
-import translations from '../translations.json';
+import translations from '../../translations.json';
/*
* Renders the moderation queue as a tabbed layout with 3 moderation
- * queues filtered by status (Untouched, Rejected and Approved)
+ * queues :
+ * * pending: filtered by status Untouched
+ * * rejected: filtered by status Rejected
+ * * flagged: with a flagged action on them
*/
class ModerationQueue extends React.Component {
diff --git a/client/coral-admin/src/reducers/auth.js b/client/coral-admin/src/reducers/auth.js
index 59dccac5e..f897c1bae 100644
--- a/client/coral-admin/src/reducers/auth.js
+++ b/client/coral-admin/src/reducers/auth.js
@@ -9,19 +9,25 @@ const initialState = Map({
export default function auth (state = initialState, action) {
switch (action.type) {
+ case actions.CHECK_LOGIN_REQUEST:
+ return state
+ .set('loadingUser', true);
case actions.CHECK_LOGIN_FAILURE:
return state
.set('loggedIn', false)
+ .set('loadingUser', false)
.set('user', null);
case actions.CHECK_LOGIN_SUCCESS:
return state
.set('loggedIn', true)
+ .set('loadingUser', false)
.set('isAdmin', action.isAdmin)
.set('user', action.user);
case actions.LOGOUT_SUCCESS:
return state
.set('loggedIn', false)
- .set('user', null);
+ .set('user', null)
+ .set('isAdmin', false);
default :
return state;
}
diff --git a/client/coral-admin/src/services/talk-adapter.js b/client/coral-admin/src/services/talk-adapter.js
index 86878723e..eeb799452 100644
--- a/client/coral-admin/src/services/talk-adapter.js
+++ b/client/coral-admin/src/services/talk-adapter.js
@@ -1,3 +1,4 @@
+import {base, handleResp, getInit} from '../helpers/response';
/**
* The adapter is a redux middleware that interecepts the actions that need
@@ -7,9 +8,6 @@
* for the coral but also for wordpress comments, disqus and many more.
*/
-// Default headers for json payloads.
-const jsonHeader = new Headers({'Content-Type': 'application/json'});
-
// Intercept redux actions and act over the ones we are interested
export default store => next => action => {
@@ -35,11 +33,11 @@ export default store => next => action => {
const fetchModerationQueueComments = store =>
Promise.all([
- fetch('/api/v1/queue/comments/pending'),
- fetch('/api/v1/comments?status=rejected'),
- fetch('/api/v1/comments?action=flag')
+ fetch(`${base}/queue/comments/pending`, getInit('GET')),
+ fetch(`${base}/comments?status=rejected`, getInit('GET')),
+ fetch(`${base}/comments?action_type=flag`, getInit('GET'))
])
-.then(res => Promise.all(res.map(r => r.json())))
+.then(res => Promise.all(res.map(handleResp)))
.then(res => {
res[2] = res[2].map(comment => { comment.flagged = true; return comment; });
return res.reduce((prev, curr) => prev.concat(curr), []);
@@ -51,26 +49,22 @@ Promise.all([
// Update a comment. Now to update a comment we need to send back the whole object
const updateComment = (store, comment) => {
- fetch(`/api/v1/comments/${comment.get('id')}/status`, {
- method: 'PUT',
- headers: jsonHeader,
- body: JSON.stringify({status: comment.get('status')})
- })
- .then(res => res.json())
+ fetch(`${base}/comments/${comment.get('id')}/status`, getInit('PUT', {status: comment.get('status')}))
+ .then(handleResp)
.then(res => store.dispatch({type: 'COMMENT_UPDATE_SUCCESS', res}))
.catch(error => store.dispatch({type: 'COMMENT_UPDATE_FAILED', error}));
};
// Create a new comment
-const createComment = (store, name, comment) =>
-fetch('/api/v1/comments', {
- method: 'POST',
- body: JSON.stringify({
+const createComment = (store, name, comment) => {
+ const body = {
status: 'Untouched',
body: comment,
name: name,
createdAt: Date.now()
- })
-}).then(res => res.json())
-.then(res => store.dispatch({type: 'COMMENT_CREATE_SUCCESS', comment: res}))
-.catch(error => store.dispatch({type: 'COMMENT_CREATE_FAILED', error}));
+ };
+ return fetch(`${base}/comments`, getInit('POST', body))
+ .then(handleResp)
+ .then(res => store.dispatch({type: 'COMMENT_CREATE_SUCCESS', comment: res}))
+ .catch(error => store.dispatch({type: 'COMMENT_CREATE_FAILED', error}));
+};
diff --git a/client/coral-embed-stream/src/CommentStream.js b/client/coral-embed-stream/src/CommentStream.js
index 9887b46ac..40d249088 100644
--- a/client/coral-embed-stream/src/CommentStream.js
+++ b/client/coral-embed-stream/src/CommentStream.js
@@ -61,8 +61,12 @@ class CommentStream extends Component {
// Set up messaging between embedded Iframe an parent component
// Using recommended Pym init code which violates .eslint standards
const pym = new Pym.Child({polling: 100});
- const path = /https?\:\/\/([^?]+)/.exec(pym.parentUrl);
- this.props.getStream(path && path[1] || window.location);
+
+ if (/https?\:\/\/([^?]+)/.test(pym.parentUrl)) {
+ this.props.getStream(pym.parentUrl);
+ } else {
+ this.props.getStream(window.location);
+ }
}
render () {
@@ -121,7 +125,8 @@ class CommentStream extends Component {
;
})
}
diff --git a/client/coral-framework/actions/auth.js b/client/coral-framework/actions/auth.js
index 7313bb30f..1058edbbb 100644
--- a/client/coral-framework/actions/auth.js
+++ b/client/coral-framework/actions/auth.js
@@ -127,7 +127,13 @@ const checkLoginFailure = error => ({type: actions.CHECK_LOGIN_FAILURE, error});
export const checkLogin = () => dispatch => {
dispatch(checkLoginRequest());
fetch(`${base}/auth`, getInit('GET'))
- .then(handleResp)
+ .then((res) => {
+ if (res.status !== 200) {
+ throw new Error('not logged in');
+ }
+
+ return res.json();
+ })
.then(user => dispatch(checkLoginSuccess(user)))
.catch(error => dispatch(checkLoginFailure(error)));
};
diff --git a/client/coral-framework/actions/items.js b/client/coral-framework/actions/items.js
index 5ca358811..fc32c8d18 100644
--- a/client/coral-framework/actions/items.js
+++ b/client/coral-framework/actions/items.js
@@ -119,22 +119,20 @@ export function getStream (assetUrl) {
.then((json) => {
/* Add items to the store */
- const itemTypes = Object.keys(json);
- for (let i = 0; i < itemTypes.length; i++ ) {
- if (itemTypes[i] === 'actions') {
- for (let j = 0; j < json[itemTypes[i]].length; j++ ) {
- let action = json[itemTypes[i]][j];
+ Object.keys(json).forEach(type => {
+ if (type === 'actions') {
+ json[type].forEach(action => {
action.id = `${action.action_type}_${action.item_id}`;
dispatch(addItem(action, 'actions'));
- }
- } else if (itemTypes[i] === 'settings') {
- return dispatch({type: UPDATE_SETTINGS, config: fromJS(json[itemTypes[i]])});
+ });
+ } else if (type === 'settings') {
+ dispatch({type: UPDATE_SETTINGS, config: fromJS(json[type])});
} else {
- for (let j = 0; j < json[itemTypes[i]].length; j++ ) {
- dispatch(addItem(json[itemTypes[i]][j], itemTypes[i]));
- }
+ json[type].forEach(item => {
+ dispatch(addItem(item, type));
+ });
}
- }
+ });
const assetId = json.assets[0].id;
@@ -157,15 +155,14 @@ export function getStream (assetUrl) {
dispatch(updateItem(assetId, 'comments', rels.rootComments, 'assets'));
- const childKeys = Object.keys(rels.childComments);
- for (let i = 0; i < childKeys.length; i++ ) {
- dispatch(updateItem(childKeys[i], 'children', rels.childComments[childKeys[i]].reverse(), 'comments'));
- }
+ Object.keys(rels.childComments).forEach(key => {
+ dispatch(updateItem(key, 'children', rels.childComments[key].reverse(), 'comments'));
+ });
/* Hydrate actions on comments */
- for (let i = 0; i < json.actions.length; i++ ) {
- dispatch(updateItem(json.actions[i].item_id, json.actions[i].action_type, json.actions[i].id, 'comments'));
- }
+ json.actions.forEach(action => {
+ dispatch(updateItem(action.item_id, action.action_type, action.id, 'comments'));
+ });
return (json);
});
diff --git a/client/coral-plugin-commentbox/CommentBox.js b/client/coral-plugin-commentbox/CommentBox.js
index 76f7e43be..79641d856 100644
--- a/client/coral-plugin-commentbox/CommentBox.js
+++ b/client/coral-plugin-commentbox/CommentBox.js
@@ -22,7 +22,7 @@ class CommentBox extends Component {
}
postComment = () => {
- const {postItem, updateItem, id, parent_id, addNotification, appendItemArray, premod, author} = this.props;
+ const {postItem, updateItem, id, parent_id, child_id, addNotification, appendItemArray, premod, author} = this.props;
let comment = {
body: this.state.body,
asset_id: id,
@@ -38,7 +38,7 @@ class CommentBox extends Component {
related = 'comments';
parent_type = 'assets';
}
- updateItem(parent_id, 'showReply', false, 'comments');
+ updateItem(child_id || parent_id, 'showReply', false, 'comments');
postItem(comment, 'comments')
.then((comment_id) => {
if (premod === 'pre') {
diff --git a/client/coral-plugin-replies/ReplyButton.js b/client/coral-plugin-replies/ReplyButton.js
index 4fbfd5f60..8e39af663 100644
--- a/client/coral-plugin-replies/ReplyButton.js
+++ b/client/coral-plugin-replies/ReplyButton.js
@@ -6,7 +6,7 @@ const name = 'coral-plugin-replies';
const ReplyButton = (props) =>