diff --git a/client/coral-admin/src/containers/Community/CommunityContainer.js b/client/coral-admin/src/containers/Community/CommunityContainer.js index 4f65303ff..ecee9336c 100644 --- a/client/coral-admin/src/containers/Community/CommunityContainer.js +++ b/client/coral-admin/src/containers/Community/CommunityContainer.js @@ -28,11 +28,12 @@ class CommunityContainer extends Component { super(props); this.state = { - searchValue: '' + searchValue: '', + timer: null }; this.onKeyDownHandler = this.onKeyDownHandler.bind(this); - this.onChangeHandler = this.onChangeHandler.bind(this); + this.onSearchChange = this.onSearchChange.bind(this); this.onHeaderClickHandler = this.onHeaderClickHandler.bind(this); this.onNewPageHandler = this.onNewPageHandler.bind(this); } @@ -48,9 +49,16 @@ class CommunityContainer extends Component { } } - onChangeHandler(e) { - this.setState({ - searchValue: e.target.value + onSearchChange(e) { + const value = e.target.value; + this.setState((prevState) => { + prevState.searchValue = value; + clearTimeout(prevState.timer); + const fetchAccounts = this.props.fetchAccounts; + prevState.timer = setTimeout(() => { + fetchAccounts({value}); + }, 350); + return prevState; }); } @@ -86,11 +94,11 @@ class CommunityContainer extends Component { isFetching={community.isFetchingPeople} commenters={community.accounts} searchValue={searchValue} + onSearchChange={this.onSearchChange} error={community.errorPeople} totalPages={community.totalPagesPeople} page={community.pagePeople} onKeyDown={this.onKeyDownHandler} - onChange={this.onChangeHandler} onHeaderClickHandler={this.onHeaderClickHandler} onNewPageHandler={this.onNewPageHandler} /> diff --git a/client/coral-admin/src/containers/Community/People.js b/client/coral-admin/src/containers/Community/People.js index b5701b5a4..0011cd704 100644 --- a/client/coral-admin/src/containers/Community/People.js +++ b/client/coral-admin/src/containers/Community/People.js @@ -5,7 +5,7 @@ import translations from 'coral-admin/src/translations.json'; import styles from './Community.css'; import Table from './Table'; import Loading from './Loading'; -import {Pager} from 'coral-ui'; +import {Pager, Icon} from 'coral-ui'; import EmptyCard from '../../components/EmptyCard'; const lang = new I18n(translations); @@ -29,28 +29,22 @@ const tableHeaders = [ } ]; -const People = ({isFetching, commenters, ...props}) => { +const People = ({isFetching, commenters, searchValue, onSearchChange, ...props}) => { const hasResults = !isFetching && !!commenters.length; return (
-
-
- -
- -
-
-
+
+ + +
{ isFetching && } diff --git a/client/coral-embed-stream/style/default.css b/client/coral-embed-stream/style/default.css index 2ef617593..41ec7a64b 100644 --- a/client/coral-embed-stream/style/default.css +++ b/client/coral-embed-stream/style/default.css @@ -80,8 +80,8 @@ hr { .coral-plugin-infobox-info { top: 0; border: 0; - background: rgb(35,118,216); - color: white; + background: #DEEDFF; + color: #2a2a2a; width: 100%; text-align: left; padding: 10px; @@ -92,6 +92,24 @@ hr { } +.coral-plugin-infobox-info em{ + font-style: italic; +} + +.coral-plugin-infobox-info strong{ + font-weight: bold; +} + +.coral-plugin-infobox-info blockquote{ + border-left: solid 2px #2a2a2a; + padding-left: 10px; +} + + +.coral-plugin-infobox-info a{ + color: #2a2a2a; +} + .commentStream .material-icons { vertical-align: middle; width: 1em; @@ -111,15 +129,15 @@ hr { margin-bottom: 0px; font-weight: bold; font-size: 14px; - display: block; overflow: hidden; - height: 50px; + min-height: 50px; + display: flex; } .coral-plugin-questionbox-icon.bubble{ position: absolute; top: 11px; - left: 15px; + left: 10px; color: #949393; font-size: 20px; z-index: 0; @@ -128,7 +146,7 @@ hr { .coral-plugin-questionbox-icon.person{ z-index: 2; top: 20px; - left: 20px; + left: 15px; position: absolute; font-size: 24px; color: white; @@ -143,12 +161,19 @@ hr { margin-left: 0px !important; margin-right: 10px; display: inline-block; - width: 15px; - height: 100%; - padding: 3px 20px; + width: 10px; + min-height: 100%; + padding: 5px 20px; vertical-align: middle; } +.coral-plugin-questionbox-content { + padding: 5px; + display: flex; + align-items: center; + justify-content: center; +} + .hidden { visibility: hidden; display: none; diff --git a/client/coral-embed/src/index.js b/client/coral-embed/src/index.js index 21c176500..722f4ca8e 100644 --- a/client/coral-embed/src/index.js +++ b/client/coral-embed/src/index.js @@ -2,6 +2,7 @@ import pym from 'pym.js'; import {stringify} from 'querystring'; +// TODO: Styles should live in a separate file const snackbarStyles = { position: 'fixed', cursor: 'default', @@ -20,7 +21,8 @@ const snackbarStyles = { opacity: 0, transform: 'translate(-50%, 20px)', bottom: 0, - boxSizing: 'border-box' + boxSizing: 'border-box', + fontFamily: 'Helvetica, \'Helvetica Neue\', Verdana, sans-serif' }; // This function should return value of window.Coral diff --git a/client/coral-framework/actions/notification.js b/client/coral-framework/actions/notification.js index cb1aee5dd..37679972d 100644 --- a/client/coral-framework/actions/notification.js +++ b/client/coral-framework/actions/notification.js @@ -1,4 +1,4 @@ -import {pym} from '../../coral-framework'; +import pym from '../services/PymConnection'; export const addNotification = (notifType, text) => { pym.sendMessage('coral-alert', `${notifType}|${text}`); diff --git a/client/coral-plugin-questionbox/QuestionBox.js b/client/coral-plugin-questionbox/QuestionBox.js index 3c2410d44..31ad45869 100644 --- a/client/coral-plugin-questionbox/QuestionBox.js +++ b/client/coral-plugin-questionbox/QuestionBox.js @@ -7,7 +7,9 @@ const QuestionBox = ({enable, content}) => chat_bubble person
- {content} +
+ {content} +
; export default QuestionBox; diff --git a/client/coral-settings/containers/ProfileContainer.js b/client/coral-settings/containers/ProfileContainer.js index 9a8117e87..331069058 100644 --- a/client/coral-settings/containers/ProfileContainer.js +++ b/client/coral-settings/containers/ProfileContainer.js @@ -8,7 +8,6 @@ import {myCommentHistory} from 'coral-framework/graphql/queries'; import {link} from 'coral-framework/services/PymConnection'; import NotLoggedIn from '../components/NotLoggedIn'; import {Spinner} from 'coral-ui'; -import ProfileHeader from '../components/ProfileHeader'; import CommentHistory from 'coral-plugin-history/CommentHistory'; import translations from '../translations'; @@ -44,7 +43,6 @@ class ProfileContainer extends Component { return (
- { // Hiding bio until moderation can get figured out diff --git a/client/coral-sign-in/components/FakeComment.js b/client/coral-sign-in/components/FakeComment.js index b5af6bf1c..f5926852c 100644 --- a/client/coral-sign-in/components/FakeComment.js +++ b/client/coral-sign-in/components/FakeComment.js @@ -28,10 +28,10 @@ class FakeComment extends React.Component { author={{'name': username}}/> -
+
- @@ -43,16 +43,16 @@ class FakeComment extends React.Component { banned={false} />
-
+
diff --git a/client/coral-sign-in/translations.json b/client/coral-sign-in/translations.json index 824888cca..7ae84b2ff 100644 --- a/client/coral-sign-in/translations.json +++ b/client/coral-sign-in/translations.json @@ -25,14 +25,14 @@ "emailInUse": "Email address already in use", "emailORusernameInUse": "Email address or Username already in use", "requiredField": "This field is required", - "passwordsDontMatch": "Passwords don\"t match.", + "passwordsDontMatch": "Passwords don't match.", "specialCharacters": "Usernames can contain letters, numbers and _ only", "checkTheForm": "Invalid Form. Please, check the fields" }, "createdisplay": { "writeyourusername": "Edit your username", "yourusername": "Your username appears on every comment you post.", - "ifyoudontchangeyourname": "If you don\"t change your username at this step, your Facebook display name will appear alongside of all your comments.", + "ifyoudontchangeyourname": "If you don't change your username at this step, your Facebook display name will appear alongside of all your comments.", "username": "Username", "continue": "Continue with the same Facebook username", "save": "Save", diff --git a/package.json b/package.json index c305fc952..3471a5a9a 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "talk", - "version": "1.4.0", - "description": "A commenting platform from The Coral Project. https://coralproject.net", + "version": "1.5.0", + "description": "A better commenting experience from Mozilla, The New York Times, and the Washington Post. https://coralproject.net", "main": "app.js", "scripts": { "postinstall": "./bin/cli plugins reconcile --skip-remote", @@ -17,7 +17,7 @@ "e2e": "NODE_ENV=test nightwatch", "poste2e": "NODE_ENV=test scripts/poste2e.sh", "embed-start": "NODE_ENV=development yarn build && ./bin/cli serve --jobs", - "heroku-postbuild": "yarn build" + "heroku-postbuild": "./bin/cli plugins reconcile && yarn build" }, "config": { "pre-git": { diff --git a/plugins.js b/plugins.js index 02cdb58e1..22293c975 100644 --- a/plugins.js +++ b/plugins.js @@ -47,8 +47,8 @@ const hookSchemas = { pre: Joi.func(), post: Joi.func() }))), - loaders: Joi.object().pattern(/\w/, Joi.object().pattern(/\w/, Joi.func())), - mutators: Joi.object().pattern(/\w/, Joi.object().pattern(/\w/, Joi.func())), + loaders: Joi.func().maxArity(1), + mutators: Joi.func().maxArity(1), resolvers: Joi.object().pattern(/\w/, Joi.object().pattern(/(?:__resolveType|\w+)/, Joi.func())), typeDefs: Joi.string() }; @@ -124,7 +124,12 @@ function itteratePlugins(plugins) { // Add each plugin folder to the allowed import path so that they can import our // internal dependancies. Object.keys(plugins).forEach((type) => itteratePlugins(plugins[type]).forEach((plugin) => { - amp.enableForDir(path.dirname(plugin.path)); + + // The plugin may be remote, and therefore not installed. We check here if the + // plugin path is available before trying to monkeypatch it's require path. + if (plugin.path) { + amp.enableForDir(path.dirname(plugin.path)); + } })); /** diff --git a/services/email/suspension.html.ejs b/services/email/suspension.html.ejs new file mode 100644 index 000000000..b36560ec5 --- /dev/null +++ b/services/email/suspension.html.ejs @@ -0,0 +1 @@ +<%= body %>