From 87ada30eff70bd580ae6fdb6885a682b22563a35 Mon Sep 17 00:00:00 2001 From: Belen Curcio Date: Fri, 19 May 2017 17:32:16 -0300 Subject: [PATCH 01/78] =?UTF-8?q?=C3=81dding=20Stream=20Slot?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/components/Embed.js | 11 +-- .../src/components/Stream.js | 94 +++++++++---------- 2 files changed, 51 insertions(+), 54 deletions(-) diff --git a/client/coral-embed-stream/src/components/Embed.js b/client/coral-embed-stream/src/components/Embed.js index 0d26cf740..2e050e836 100644 --- a/client/coral-embed-stream/src/components/Embed.js +++ b/client/coral-embed-stream/src/components/Embed.js @@ -1,13 +1,12 @@ import React from 'react'; -import I18n from 'coral-framework/modules/i18n/i18n'; -import translations from 'coral-framework/translations'; const lang = new I18n(translations); - -import {TabBar, Tab, TabContent, Button} from 'coral-ui'; - import Stream from '../containers/Stream'; -import Count from 'coral-plugin-comment-count/CommentCount'; +import Slot from 'coral-framework/components/Slot'; +import I18n from 'coral-framework/modules/i18n/i18n'; import UserBox from 'coral-sign-in/components/UserBox'; +import translations from 'coral-framework/translations'; +import {TabBar, Tab, TabContent, Button} from 'coral-ui'; +import Count from 'coral-plugin-comment-count/CommentCount'; import ProfileContainer from 'coral-settings/containers/ProfileContainer'; import RestrictedContent from 'coral-framework/components/RestrictedContent'; import ConfigureStreamContainer from 'coral-configure/containers/ConfigureStreamContainer'; diff --git a/client/coral-embed-stream/src/components/Stream.js b/client/coral-embed-stream/src/components/Stream.js index 90fa0aca8..e0c541341 100644 --- a/client/coral-embed-stream/src/components/Stream.js +++ b/client/coral-embed-stream/src/components/Stream.js @@ -4,6 +4,7 @@ import {Button} from 'coral-ui'; import LoadMore from './LoadMore'; import NewCount from './NewCount'; import Comment from '../containers/Comment'; +import Slot from 'coral-framework/components/Slot'; import InfoBox from 'coral-plugin-infobox/InfoBox'; import {ModerationLink} from 'coral-plugin-moderation'; import CommentBox from 'coral-plugin-commentbox/CommentBox'; @@ -15,7 +16,7 @@ import ChangeUsernameContainer from 'coral-sign-in/containers/ChangeUsernameContainer'; class Stream extends React.Component { - setActiveReplyBox = (reactKey) => { + setActiveReplyBox = reactKey => { if (!this.props.auth.user) { this.props.showSignInDialog(); } else { @@ -58,11 +59,20 @@ class Stream extends React.Component { const firstCommentDate = asset.comments[0] ? asset.comments[0].created_at : new Date(Date.now() - 1000 * 60 * 60 * 24 * 7).toISOString(); - const commentIsIgnored = (comment) => { - return me && me.ignoredUsers && me.ignoredUsers.find((u) => u.id === comment.user.id); + const commentIsIgnored = comment => { + return ( + me && + me.ignoredUsers && + me.ignoredUsers.find(u => u.id === comment.user.id) + ); }; return (
+ + + {open ?
:

{asset.settings.closedMessage}

} - {!loggedIn && - } {loggedIn && user && } {loggedIn && } - {/* the highlightedComment is isolated after the user followed a permalink */} {highlightedComment ?
- {comments.map( - (comment) => { - return (commentIsIgnored(comment) - ? - : - ); - } - )} + {comments.map(comment => { + return commentIsIgnored(comment) + ? + : ; + })}
Date: Fri, 19 May 2017 17:32:54 -0300 Subject: [PATCH 02/78] Adding coral-plugin-auth --- .gitignore | 1 + plugins/coral-plugin-auth/client/.babelrc | 14 +++++++++++ .../coral-plugin-auth/client/.eslintrc.json | 23 +++++++++++++++++++ .../client/components/SignInButton.js | 22 ++++++++++++++++++ plugins/coral-plugin-auth/client/index.js | 7 ++++++ .../client/translations.json | 10 ++++++++ plugins/coral-plugin-auth/index.js | 1 + 7 files changed, 78 insertions(+) create mode 100644 plugins/coral-plugin-auth/client/.babelrc create mode 100644 plugins/coral-plugin-auth/client/.eslintrc.json create mode 100644 plugins/coral-plugin-auth/client/components/SignInButton.js create mode 100644 plugins/coral-plugin-auth/client/index.js create mode 100644 plugins/coral-plugin-auth/client/translations.json create mode 100644 plugins/coral-plugin-auth/index.js diff --git a/.gitignore b/.gitignore index f0c3b2a4b..11e738d57 100644 --- a/.gitignore +++ b/.gitignore @@ -17,6 +17,7 @@ coverage/ plugins.json plugins/* !plugins/coral-plugin-facebook-auth +!plugins/coral-plugin-auth !plugins/coral-plugin-respect !plugins/coral-plugin-offtopic !plugins/coral-plugin-like diff --git a/plugins/coral-plugin-auth/client/.babelrc b/plugins/coral-plugin-auth/client/.babelrc new file mode 100644 index 000000000..60be246eb --- /dev/null +++ b/plugins/coral-plugin-auth/client/.babelrc @@ -0,0 +1,14 @@ +{ + "presets": [ + "es2015" + ], + "plugins": [ + "add-module-exports", + "transform-class-properties", + "transform-decorators-legacy", + "transform-object-assign", + "transform-object-rest-spread", + "transform-async-to-generator", + "transform-react-jsx" + ] +} \ No newline at end of file diff --git a/plugins/coral-plugin-auth/client/.eslintrc.json b/plugins/coral-plugin-auth/client/.eslintrc.json new file mode 100644 index 000000000..9fe56bd14 --- /dev/null +++ b/plugins/coral-plugin-auth/client/.eslintrc.json @@ -0,0 +1,23 @@ +{ + "env": { + "browser": true, + "es6": true, + "mocha": true + }, + "parserOptions": { + "sourceType": "module", + "ecmaFeatures": { + "experimentalObjectRestSpread": true, + "jsx": true + } + }, + "parser": "babel-eslint", + "plugins": [ + "react" + ], + "rules": { + "react/jsx-uses-react": "error", + "react/jsx-uses-vars": "error", + "no-console": ["warn", { "allow": ["warn", "error"] }] + } +} diff --git a/plugins/coral-plugin-auth/client/components/SignInButton.js b/plugins/coral-plugin-auth/client/components/SignInButton.js new file mode 100644 index 000000000..fb58eeb9b --- /dev/null +++ b/plugins/coral-plugin-auth/client/components/SignInButton.js @@ -0,0 +1,22 @@ +import React from 'react'; +import {Button} from 'coral-ui'; +import {connect} from 'react-redux'; +import {bindActionCreators} from 'redux'; +import {showSignInDialog} from 'coral-framework/actions/auth'; + +class SignInButton extends React.Component { + render() { + return ( + + ); + } +} + +const mapStateToProps = ({auth}) => ({auth}); + +const mapDispatchToProps = dispatch => + bindActionCreators({showSignInDialog}, dispatch); + +export default connect(mapStateToProps, mapDispatchToProps)(SignInButton); diff --git a/plugins/coral-plugin-auth/client/index.js b/plugins/coral-plugin-auth/client/index.js new file mode 100644 index 000000000..ff601992b --- /dev/null +++ b/plugins/coral-plugin-auth/client/index.js @@ -0,0 +1,7 @@ +import SignInButton from './components/SignInButton'; + +export default { + slots: { + stream: [SignInButton] + } +}; \ No newline at end of file diff --git a/plugins/coral-plugin-auth/client/translations.json b/plugins/coral-plugin-auth/client/translations.json new file mode 100644 index 000000000..93d73d3a2 --- /dev/null +++ b/plugins/coral-plugin-auth/client/translations.json @@ -0,0 +1,10 @@ +{ + "en": { + "like": "Like", + "liked": "Liked" + }, + "es": { + "like": "Me Gusta", + "liked": "Me Gustó" + } +} diff --git a/plugins/coral-plugin-auth/index.js b/plugins/coral-plugin-auth/index.js new file mode 100644 index 000000000..a09954537 --- /dev/null +++ b/plugins/coral-plugin-auth/index.js @@ -0,0 +1 @@ +module.exports = {}; \ No newline at end of file From 3af49de0cefc45c43d1226ff2654b87cd0bb6d5f Mon Sep 17 00:00:00 2001 From: Belen Curcio Date: Fri, 19 May 2017 18:04:54 -0300 Subject: [PATCH 03/78] New login slots and auth plugins --- client/coral-embed-stream/src/AppRouter.js | 6 +- .../containers/LoginContainer.js | 6 + .../containers/SignInContainer.js | 223 +----------------- .../client/components/SignInContainer.js | 210 +++++++++++++++++ plugins/coral-plugin-auth/client/index.js | 4 +- 5 files changed, 226 insertions(+), 223 deletions(-) create mode 100644 client/coral-sign-in/containers/LoginContainer.js create mode 100644 plugins/coral-plugin-auth/client/components/SignInContainer.js diff --git a/client/coral-embed-stream/src/AppRouter.js b/client/coral-embed-stream/src/AppRouter.js index e2553889c..6ee63caab 100644 --- a/client/coral-embed-stream/src/AppRouter.js +++ b/client/coral-embed-stream/src/AppRouter.js @@ -2,12 +2,12 @@ import React from 'react'; import {Router, Route, browserHistory} from 'react-router'; import Embed from './containers/Embed'; -import SignInContainer from 'coral-sign-in/containers/SignInContainer'; +import {LoginContainer} from 'coral-sign-in/containers/LoginContainer'; const routes = (
- - + +
); diff --git a/client/coral-sign-in/containers/LoginContainer.js b/client/coral-sign-in/containers/LoginContainer.js new file mode 100644 index 000000000..fa20de4ed --- /dev/null +++ b/client/coral-sign-in/containers/LoginContainer.js @@ -0,0 +1,6 @@ +import React from 'react'; +import Slot from 'coral-framework/components/Slot'; + +export const LoginContainer = () => ( + +) \ No newline at end of file diff --git a/client/coral-sign-in/containers/SignInContainer.js b/client/coral-sign-in/containers/SignInContainer.js index de1d2086e..b473626db 100644 --- a/client/coral-sign-in/containers/SignInContainer.js +++ b/client/coral-sign-in/containers/SignInContainer.js @@ -1,220 +1,5 @@ -import React, {Component, PropTypes} from 'react'; -import {connect} from 'react-redux'; -import SignDialog from '../components/SignDialog'; -import validate from 'coral-framework/helpers/validate'; -import errorMsj from 'coral-framework/helpers/error'; -import I18n from 'coral-framework/modules/i18n/i18n'; -import translations from '../translations'; -import {pym} from 'coral-framework'; -const lang = new I18n(translations); +import React from 'react'; -import { - changeView, - fetchSignUp, - fetchSignIn, - hideSignInDialog, - fetchSignInFacebook, - fetchSignUpFacebook, - fetchForgotPassword, - requestConfirmEmail, - facebookCallback, - invalidForm, - validForm, - checkLogin -} from 'coral-framework/actions/auth'; - -class SignInContainer extends Component { - initialState = { - formData: { - email: '', - username: '', - password: '', - confirmPassword: '' - }, - emailToBeResent: '', - errors: {}, - showErrors: false - }; - - constructor(props) { - super(props); - this.state = this.initialState; - this.addError = this.addError.bind(this); - this.handleAuth = this.handleAuth.bind(this); - this.handleSignUp = this.handleSignUp.bind(this); - this.handleSignIn = this.handleSignIn.bind(this); - this.handleChange = this.handleChange.bind(this); - this.handleChangeEmail = this.handleChangeEmail.bind(this); - this.handleResendVerification = this.handleResendVerification.bind(this); - } - - static propTypes = { - requireEmailConfirmation: PropTypes.bool.isRequired - }; - - componentWillMount() { - this.props.checkLogin(); - } - - componentDidMount() { - window.addEventListener('storage', this.handleAuth); - - const {formData} = this.state; - const errors = Object.keys(formData).reduce((map, prop) => { - map[prop] = lang.t('signIn.requiredField'); - return map; - }, {}); - this.setState({errors}); - } - - componentWillUnmount() { - window.removeEventListener('storage', this.handleAuth); - } - - handleAuth(e) { - - // Listening to FB changes - // FB localStorage key is 'auth' - const authCallback = this.props.facebookCallback; - - if (e.key === 'auth') { - const {err, data} = JSON.parse(e.newValue); - authCallback(err, data); - } - } - - handleChange(e) { - const {name, value} = e.target; - this.setState( - (state) => ({ - ...state, - formData: { - ...state.formData, - [name]: value - } - }), - () => { - this.validation(name, value); - } - ); - } - - handleChangeEmail(e) { - const {value} = e.target; - this.setState({emailToBeResent: value}); - } - - handleResendVerification(e) { - e.preventDefault(); - this.props - .requestConfirmEmail( - this.state.emailToBeResent, - pym.parentUrl || location.href - ) - .then(() => { - setTimeout(() => { - - // allow success UI to be shown for a second, and then close the modal - this.props.handleClose(); - }, 2500); - }); - } - - addError(name, error) { - return this.setState((state) => ({ - errors: { - ...state.errors, - [name]: error - } - })); - } - - validation(name, value) { - const {addError} = this; - const {formData} = this.state; - - if (!value.length) { - addError(name, lang.t('signIn.requiredField')); - } else if ( - name === 'confirmPassword' && - formData.confirmPassword !== formData.password - ) { - addError('confirmPassword', lang.t('signIn.passwordsDontMatch')); - } else if (!validate[name](value)) { - addError(name, errorMsj[name]); - } else { - const {[name]: prop, ...errors} = this.state.errors; // eslint-disable-line - // Removes Error - this.setState((state) => ({...state, errors})); - } - } - - isCompleted() { - const {formData} = this.state; - return !Object.keys(formData).filter((prop) => !formData[prop].length).length; - } - - displayErrors(show = true) { - this.setState({showErrors: show}); - } - - handleSignUp(e) { - e.preventDefault(); - const {errors} = this.state; - const {fetchSignUp, validForm, invalidForm} = this.props; - this.displayErrors(); - if (this.isCompleted() && !Object.keys(errors).length) { - fetchSignUp(this.state.formData, pym.parentUrl || location.href); - validForm(); - } else { - invalidForm(lang.t('signIn.checkTheForm')); - } - } - - handleSignIn(e) { - e.preventDefault(); - this.props.fetchSignIn(this.state.formData); - } - - render() { - const {auth, requireEmailConfirmation} = this.props; - const {emailVerificationLoading, emailVerificationSuccess} = auth; - - return ( -
- -
- ); - } -} - -const mapStateToProps = (state) => ({ - auth: state.auth.toJS() -}); - -const mapDispatchToProps = (dispatch) => ({ - checkLogin: () => dispatch(checkLogin()), - facebookCallback: (err, data) => dispatch(facebookCallback(err, data)), - fetchSignUp: (formData, url) => dispatch(fetchSignUp(formData, url)), - fetchSignIn: (formData) => dispatch(fetchSignIn(formData)), - fetchSignInFacebook: () => dispatch(fetchSignInFacebook()), - fetchSignUpFacebook: () => dispatch(fetchSignUpFacebook()), - fetchForgotPassword: (formData) => dispatch(fetchForgotPassword(formData)), - requestConfirmEmail: (email, url) => - dispatch(requestConfirmEmail(email, url)), - changeView: (view) => dispatch(changeView(view)), - handleClose: () => dispatch(hideSignInDialog()), - invalidForm: (error) => dispatch(invalidForm(error)), - validForm: () => dispatch(validForm()) -}); - -export default connect(mapStateToProps, mapDispatchToProps)(SignInContainer); +export const SignInContainer = () => ( + +) \ No newline at end of file diff --git a/plugins/coral-plugin-auth/client/components/SignInContainer.js b/plugins/coral-plugin-auth/client/components/SignInContainer.js new file mode 100644 index 000000000..06a747556 --- /dev/null +++ b/plugins/coral-plugin-auth/client/components/SignInContainer.js @@ -0,0 +1,210 @@ +import React, {Component, PropTypes} from 'react'; +import {connect} from 'react-redux'; +import validate from 'coral-framework/helpers/validate'; +import errorMsj from 'coral-framework/helpers/error'; +import I18n from 'coral-framework/modules/i18n/i18n'; +import translations from '../translations'; +import {pym} from 'coral-framework'; +const lang = new I18n(translations); + +import { + changeView, + fetchSignUp, + fetchSignIn, + hideSignInDialog, + fetchSignInFacebook, + fetchSignUpFacebook, + fetchForgotPassword, + requestConfirmEmail, + facebookCallback, + invalidForm, + validForm, + checkLogin +} from 'coral-framework/actions/auth'; + +class SignInContainer extends Component { + initialState = { + formData: { + email: '', + username: '', + password: '', + confirmPassword: '' + }, + emailToBeResent: '', + errors: {}, + showErrors: false + }; + + constructor(props) { + super(props); + this.state = this.initialState; + this.addError = this.addError.bind(this); + this.handleAuth = this.handleAuth.bind(this); + this.handleSignUp = this.handleSignUp.bind(this); + this.handleSignIn = this.handleSignIn.bind(this); + this.handleChange = this.handleChange.bind(this); + this.handleChangeEmail = this.handleChangeEmail.bind(this); + this.handleResendVerification = this.handleResendVerification.bind(this); + } + + static propTypes = { + requireEmailConfirmation: PropTypes.bool.isRequired + }; + + componentWillMount() { + this.props.checkLogin(); + } + + componentDidMount() { + window.addEventListener('storage', this.handleAuth); + + const {formData} = this.state; + const errors = Object.keys(formData).reduce((map, prop) => { + map[prop] = lang.t('signIn.requiredField'); + return map; + }, {}); + this.setState({errors}); + } + + componentWillUnmount() { + window.removeEventListener('storage', this.handleAuth); + } + + handleAuth(e) { + + // Listening to FB changes + // FB localStorage key is 'auth' + const authCallback = this.props.facebookCallback; + + if (e.key === 'auth') { + const {err, data} = JSON.parse(e.newValue); + authCallback(err, data); + } + } + + handleChange(e) { + const {name, value} = e.target; + this.setState( + (state) => ({ + ...state, + formData: { + ...state.formData, + [name]: value + } + }), + () => { + this.validation(name, value); + } + ); + } + + handleChangeEmail(e) { + const {value} = e.target; + this.setState({emailToBeResent: value}); + } + + handleResendVerification(e) { + e.preventDefault(); + this.props + .requestConfirmEmail( + this.state.emailToBeResent, + pym.parentUrl || location.href + ) + .then(() => { + setTimeout(() => { + + // allow success UI to be shown for a second, and then close the modal + this.props.handleClose(); + }, 2500); + }); + } + + addError(name, error) { + return this.setState((state) => ({ + errors: { + ...state.errors, + [name]: error + } + })); + } + + validation(name, value) { + const {addError} = this; + const {formData} = this.state; + + if (!value.length) { + addError(name, lang.t('signIn.requiredField')); + } else if ( + name === 'confirmPassword' && + formData.confirmPassword !== formData.password + ) { + addError('confirmPassword', lang.t('signIn.passwordsDontMatch')); + } else if (!validate[name](value)) { + addError(name, errorMsj[name]); + } else { + const {[name]: prop, ...errors} = this.state.errors; // eslint-disable-line + // Removes Error + this.setState((state) => ({...state, errors})); + } + } + + isCompleted() { + const {formData} = this.state; + return !Object.keys(formData).filter((prop) => !formData[prop].length).length; + } + + displayErrors(show = true) { + this.setState({showErrors: show}); + } + + handleSignUp(e) { + e.preventDefault(); + const {errors} = this.state; + const {fetchSignUp, validForm, invalidForm} = this.props; + this.displayErrors(); + if (this.isCompleted() && !Object.keys(errors).length) { + fetchSignUp(this.state.formData, pym.parentUrl || location.href); + validForm(); + } else { + invalidForm(lang.t('signIn.checkTheForm')); + } + } + + handleSignIn(e) { + e.preventDefault(); + this.props.fetchSignIn(this.state.formData); + } + + render() { + const {auth, requireEmailConfirmation} = this.props; + const {emailVerificationLoading, emailVerificationSuccess} = auth; + + return ( +
+ This is my login +
+ ); + } +} + +const mapStateToProps = (state) => ({ + auth: state.auth.toJS() +}); + +const mapDispatchToProps = (dispatch) => ({ + checkLogin: () => dispatch(checkLogin()), + facebookCallback: (err, data) => dispatch(facebookCallback(err, data)), + fetchSignUp: (formData, url) => dispatch(fetchSignUp(formData, url)), + fetchSignIn: (formData) => dispatch(fetchSignIn(formData)), + fetchSignInFacebook: () => dispatch(fetchSignInFacebook()), + fetchSignUpFacebook: () => dispatch(fetchSignUpFacebook()), + fetchForgotPassword: (formData) => dispatch(fetchForgotPassword(formData)), + requestConfirmEmail: (email, url) => + dispatch(requestConfirmEmail(email, url)), + changeView: (view) => dispatch(changeView(view)), + handleClose: () => dispatch(hideSignInDialog()), + invalidForm: (error) => dispatch(invalidForm(error)), + validForm: () => dispatch(validForm()) +}); + +export default connect(mapStateToProps, mapDispatchToProps)(SignInContainer); diff --git a/plugins/coral-plugin-auth/client/index.js b/plugins/coral-plugin-auth/client/index.js index ff601992b..8d2eecc3c 100644 --- a/plugins/coral-plugin-auth/client/index.js +++ b/plugins/coral-plugin-auth/client/index.js @@ -1,7 +1,9 @@ import SignInButton from './components/SignInButton'; +import SignInContainer from './components/SignInContainer'; export default { slots: { - stream: [SignInButton] + stream: [SignInButton], + login: [SignInContainer] } }; \ No newline at end of file From dbfd2aff7cdc2a8987f7740586d1d689ba4f6e48 Mon Sep 17 00:00:00 2001 From: Belen Curcio Date: Fri, 19 May 2017 19:29:50 -0300 Subject: [PATCH 04/78] SignInButton --- .../src/components/Embed.js | 1 - .../src/components/Stream.js | 10 ++++----- .../containers/LoginContainer.js | 2 +- .../containers/SignInContainer.js | 2 +- .../client/components/SignInButton.js | 22 ++++++++++--------- 5 files changed, 18 insertions(+), 19 deletions(-) diff --git a/client/coral-embed-stream/src/components/Embed.js b/client/coral-embed-stream/src/components/Embed.js index 2e050e836..3a898295f 100644 --- a/client/coral-embed-stream/src/components/Embed.js +++ b/client/coral-embed-stream/src/components/Embed.js @@ -1,7 +1,6 @@ import React from 'react'; const lang = new I18n(translations); import Stream from '../containers/Stream'; -import Slot from 'coral-framework/components/Slot'; import I18n from 'coral-framework/modules/i18n/i18n'; import UserBox from 'coral-sign-in/components/UserBox'; import translations from 'coral-framework/translations'; diff --git a/client/coral-embed-stream/src/components/Stream.js b/client/coral-embed-stream/src/components/Stream.js index e0c541341..60747e1a2 100644 --- a/client/coral-embed-stream/src/components/Stream.js +++ b/client/coral-embed-stream/src/components/Stream.js @@ -1,6 +1,4 @@ import React, {PropTypes} from 'react'; - -import {Button} from 'coral-ui'; import LoadMore from './LoadMore'; import NewCount from './NewCount'; import Comment from '../containers/Comment'; @@ -16,7 +14,7 @@ import ChangeUsernameContainer from 'coral-sign-in/containers/ChangeUsernameContainer'; class Stream extends React.Component { - setActiveReplyBox = reactKey => { + setActiveReplyBox = (reactKey) => { if (!this.props.auth.user) { this.props.showSignInDialog(); } else { @@ -59,11 +57,11 @@ class Stream extends React.Component { const firstCommentDate = asset.comments[0] ? asset.comments[0].created_at : new Date(Date.now() - 1000 * 60 * 60 * 24 * 7).toISOString(); - const commentIsIgnored = comment => { + const commentIsIgnored = (comment) => { return ( me && me.ignoredUsers && - me.ignoredUsers.find(u => u.id === comment.user.id) + me.ignoredUsers.find((u) => u.id === comment.user.id) ); }; return ( @@ -151,7 +149,7 @@ class Stream extends React.Component { setCommentCountCache={this.props.setCommentCountCache} />
- {comments.map(comment => { + {comments.map((comment) => { return commentIsIgnored(comment) ? : ( -) \ No newline at end of file +); diff --git a/client/coral-sign-in/containers/SignInContainer.js b/client/coral-sign-in/containers/SignInContainer.js index b473626db..4e883c765 100644 --- a/client/coral-sign-in/containers/SignInContainer.js +++ b/client/coral-sign-in/containers/SignInContainer.js @@ -2,4 +2,4 @@ import React from 'react'; export const SignInContainer = () => ( -) \ No newline at end of file +); diff --git a/plugins/coral-plugin-auth/client/components/SignInButton.js b/plugins/coral-plugin-auth/client/components/SignInButton.js index fb58eeb9b..b5a88431f 100644 --- a/plugins/coral-plugin-auth/client/components/SignInButton.js +++ b/plugins/coral-plugin-auth/client/components/SignInButton.js @@ -4,17 +4,19 @@ import {connect} from 'react-redux'; import {bindActionCreators} from 'redux'; import {showSignInDialog} from 'coral-framework/actions/auth'; -class SignInButton extends React.Component { - render() { - return ( - - ); - } -} +const SignInButton = ({loggedIn, showSignInDialog}) => ( +
+ { + !loggedIn ? ( + + ) : null + } +
+); -const mapStateToProps = ({auth}) => ({auth}); +const mapStateToProps = ({auth}) => ({loggedIn: auth.loggedIn}); const mapDispatchToProps = dispatch => bindActionCreators({showSignInDialog}, dispatch); From 801a6f8a534f23b59968d8e64c152ccb3db9dad3 Mon Sep 17 00:00:00 2001 From: Belen Curcio Date: Fri, 19 May 2017 20:00:33 -0300 Subject: [PATCH 05/78] External plugin auth fully working, now refactor --- .../src/components/Embed.js | 10 +- .../src/components/Stream.js | 5 - client/coral-sign-in/components/UserBox.js | 15 --- .../containers/SignInContainer.js | 5 - .../components}/ChangeUsernameContainer.js | 51 ++++----- .../components/CreateUsernameDialog.js | 0 .../client}/components/FakeComment.js | 0 .../client}/components/ForgotContent.js | 0 .../client}/components/SignDialog.js | 0 .../client/components/SignInButton.js | 4 +- .../client/components/SignInContainer.js | 12 ++- .../client}/components/SignInContent.js | 0 .../client}/components/SignUpContent.js | 0 .../client/components/UserBox.js | 34 ++++++ .../client}/components/styles.css | 0 plugins/coral-plugin-auth/client/index.js | 4 +- .../client/translations.json | 100 +++++++++++++++++- 17 files changed, 177 insertions(+), 63 deletions(-) delete mode 100644 client/coral-sign-in/components/UserBox.js delete mode 100644 client/coral-sign-in/containers/SignInContainer.js rename {client/coral-sign-in/containers => plugins/coral-plugin-auth/client/components}/ChangeUsernameContainer.js (73%) rename {client/coral-sign-in => plugins/coral-plugin-auth/client}/components/CreateUsernameDialog.js (100%) rename {client/coral-sign-in => plugins/coral-plugin-auth/client}/components/FakeComment.js (100%) rename {client/coral-sign-in => plugins/coral-plugin-auth/client}/components/ForgotContent.js (100%) rename {client/coral-sign-in => plugins/coral-plugin-auth/client}/components/SignDialog.js (100%) rename {client/coral-sign-in => plugins/coral-plugin-auth/client}/components/SignInContent.js (100%) rename {client/coral-sign-in => plugins/coral-plugin-auth/client}/components/SignUpContent.js (100%) create mode 100644 plugins/coral-plugin-auth/client/components/UserBox.js rename {client/coral-sign-in => plugins/coral-plugin-auth/client}/components/styles.css (100%) diff --git a/client/coral-embed-stream/src/components/Embed.js b/client/coral-embed-stream/src/components/Embed.js index 3a898295f..e6ae3f367 100644 --- a/client/coral-embed-stream/src/components/Embed.js +++ b/client/coral-embed-stream/src/components/Embed.js @@ -1,8 +1,8 @@ import React from 'react'; const lang = new I18n(translations); import Stream from '../containers/Stream'; +import Slot from 'coral-framework/components/Slot'; import I18n from 'coral-framework/modules/i18n/i18n'; -import UserBox from 'coral-sign-in/components/UserBox'; import translations from 'coral-framework/translations'; import {TabBar, Tab, TabContent, Button} from 'coral-ui'; import Count from 'coral-plugin-comment-count/CommentCount'; @@ -34,12 +34,10 @@ export default class Embed extends React.Component { handleShowProfile = () => this.props.setActiveTab('profile'); render () { - const {activeTab, logout, viewAllComments, commentId} = this.props; + const {activeTab, viewAllComments, commentId} = this.props; const {asset: {totalCommentCount}} = this.props.root; const {loggedIn, isAdmin, user} = this.props.auth; - const userBox = ; - return (
@@ -48,6 +46,7 @@ export default class Embed extends React.Component { {lang.t('myProfile')} Configure Stream + { commentId &&
:

{asset.settings.closedMessage}

} - {loggedIn && - user && - } {loggedIn && } {highlightedComment diff --git a/client/coral-sign-in/components/UserBox.js b/client/coral-sign-in/components/UserBox.js deleted file mode 100644 index a44c3d4fb..000000000 --- a/client/coral-sign-in/components/UserBox.js +++ /dev/null @@ -1,15 +0,0 @@ -import React from 'react'; -import styles from './styles.css'; -import I18n from 'coral-framework/modules/i18n/i18n'; -import translations from '../translations'; -const lang = new I18n(translations); - -const UserBox = ({className, user, onLogout, onShowProfile}) => ( -
- {lang.t('signIn.loggedInAs')} - {user.username}. {lang.t('signIn.notYou')} - {lang.t('signIn.logout')} -
-); - -export default UserBox; diff --git a/client/coral-sign-in/containers/SignInContainer.js b/client/coral-sign-in/containers/SignInContainer.js deleted file mode 100644 index 4e883c765..000000000 --- a/client/coral-sign-in/containers/SignInContainer.js +++ /dev/null @@ -1,5 +0,0 @@ -import React from 'react'; - -export const SignInContainer = () => ( - -); diff --git a/client/coral-sign-in/containers/ChangeUsernameContainer.js b/plugins/coral-plugin-auth/client/components/ChangeUsernameContainer.js similarity index 73% rename from client/coral-sign-in/containers/ChangeUsernameContainer.js rename to plugins/coral-plugin-auth/client/components/ChangeUsernameContainer.js index 12a9a75b8..4f0ad9895 100644 --- a/client/coral-sign-in/containers/ChangeUsernameContainer.js +++ b/plugins/coral-plugin-auth/client/components/ChangeUsernameContainer.js @@ -4,7 +4,7 @@ import {connect} from 'react-redux'; import validate from 'coral-framework/helpers/validate'; import errorMsj from 'coral-framework/helpers/error'; -import CreateUsernameDialog from '../components/CreateUsernameDialog'; +import CreateUsernameDialog from './CreateUsernameDialog'; import I18n from 'coral-framework/modules/i18n/i18n'; import translations from '../translations'; @@ -16,12 +16,12 @@ import { invalidForm, validForm, createUsername -} from '../../coral-framework/actions/auth'; +} from 'coral-framework/actions/auth'; class ChangeUsernameContainer extends Component { initialState = { formData: { - username: '', + username: '' }, errors: {}, showErrors: false @@ -39,19 +39,22 @@ class ChangeUsernameContainer extends Component { handleChange(e) { const {name, value} = e.target; - this.setState((state) => ({ - ...state, - formData: { - ...state.formData, - [name]: value + this.setState( + state => ({ + ...state, + formData: { + ...state.formData, + [name]: value + } + }), + () => { + this.validation(name, value); } - }), () => { - this.validation(name, value); - }); + ); } addError(name, error) { - return this.setState((state) => ({ + return this.setState(state => ({ errors: { ...state.errors, [name]: error @@ -67,15 +70,15 @@ class ChangeUsernameContainer extends Component { } else if (!validate[name](value)) { addError(name, errorMsj[name]); } else { - const { [name]: prop, ...errors } = this.state.errors; // eslint-disable-line + const {[name]: prop, ...errors} = this.state.errors; // eslint-disable-line // Removes Error - this.setState((state) => ({...state, errors})); + this.setState(state => ({...state, errors})); } } isCompleted() { const {formData} = this.state; - return !Object.keys(formData).filter((prop) => !formData[prop].length).length; + return !Object.keys(formData).filter(prop => !formData[prop].length).length; } displayErrors(show = true) { @@ -117,19 +120,17 @@ class ChangeUsernameContainer extends Component { } } -const mapStateToProps = (state) => ({ - auth: state.auth.toJS() -}); +const mapStateToProps = ({auth, user}) => ({auth, user}); -const mapDispatchToProps = (dispatch) => ({ - createUsername: (userid, formData) => dispatch(createUsername(userid, formData)), +const mapDispatchToProps = dispatch => ({ + createUsername: (userid, formData) => + dispatch(createUsername(userid, formData)), showCreateUsernameDialog: () => dispatch(showCreateUsernameDialog()), hideCreateUsernameDialog: () => dispatch(hideCreateUsernameDialog()), - invalidForm: (error) => dispatch(invalidForm(error)), + invalidForm: error => dispatch(invalidForm(error)), validForm: () => dispatch(validForm()) }); -export default connect( - mapStateToProps, - mapDispatchToProps -)(ChangeUsernameContainer); +export default connect(mapStateToProps, mapDispatchToProps)( + ChangeUsernameContainer +); diff --git a/client/coral-sign-in/components/CreateUsernameDialog.js b/plugins/coral-plugin-auth/client/components/CreateUsernameDialog.js similarity index 100% rename from client/coral-sign-in/components/CreateUsernameDialog.js rename to plugins/coral-plugin-auth/client/components/CreateUsernameDialog.js diff --git a/client/coral-sign-in/components/FakeComment.js b/plugins/coral-plugin-auth/client/components/FakeComment.js similarity index 100% rename from client/coral-sign-in/components/FakeComment.js rename to plugins/coral-plugin-auth/client/components/FakeComment.js diff --git a/client/coral-sign-in/components/ForgotContent.js b/plugins/coral-plugin-auth/client/components/ForgotContent.js similarity index 100% rename from client/coral-sign-in/components/ForgotContent.js rename to plugins/coral-plugin-auth/client/components/ForgotContent.js diff --git a/client/coral-sign-in/components/SignDialog.js b/plugins/coral-plugin-auth/client/components/SignDialog.js similarity index 100% rename from client/coral-sign-in/components/SignDialog.js rename to plugins/coral-plugin-auth/client/components/SignDialog.js diff --git a/plugins/coral-plugin-auth/client/components/SignInButton.js b/plugins/coral-plugin-auth/client/components/SignInButton.js index b5a88431f..b4497bc92 100644 --- a/plugins/coral-plugin-auth/client/components/SignInButton.js +++ b/plugins/coral-plugin-auth/client/components/SignInButton.js @@ -16,7 +16,9 @@ const SignInButton = ({loggedIn, showSignInDialog}) => (
); -const mapStateToProps = ({auth}) => ({loggedIn: auth.loggedIn}); +const mapStateToProps = ({auth}) => ({ + loggedIn: auth.toJS().loggedIn +}); const mapDispatchToProps = dispatch => bindActionCreators({showSignInDialog}, dispatch); diff --git a/plugins/coral-plugin-auth/client/components/SignInContainer.js b/plugins/coral-plugin-auth/client/components/SignInContainer.js index 06a747556..73094920e 100644 --- a/plugins/coral-plugin-auth/client/components/SignInContainer.js +++ b/plugins/coral-plugin-auth/client/components/SignInContainer.js @@ -1,5 +1,6 @@ import React, {Component, PropTypes} from 'react'; import {connect} from 'react-redux'; +import SignDialog from './SignDialog'; import validate from 'coral-framework/helpers/validate'; import errorMsj from 'coral-framework/helpers/error'; import I18n from 'coral-framework/modules/i18n/i18n'; @@ -181,7 +182,16 @@ class SignInContainer extends Component { return (
- This is my login +
); } diff --git a/client/coral-sign-in/components/SignInContent.js b/plugins/coral-plugin-auth/client/components/SignInContent.js similarity index 100% rename from client/coral-sign-in/components/SignInContent.js rename to plugins/coral-plugin-auth/client/components/SignInContent.js diff --git a/client/coral-sign-in/components/SignUpContent.js b/plugins/coral-plugin-auth/client/components/SignUpContent.js similarity index 100% rename from client/coral-sign-in/components/SignUpContent.js rename to plugins/coral-plugin-auth/client/components/SignUpContent.js diff --git a/plugins/coral-plugin-auth/client/components/UserBox.js b/plugins/coral-plugin-auth/client/components/UserBox.js new file mode 100644 index 000000000..a4a0e1c99 --- /dev/null +++ b/plugins/coral-plugin-auth/client/components/UserBox.js @@ -0,0 +1,34 @@ +import React from 'react'; +import styles from './styles.css'; +import {connect} from 'react-redux'; +import {bindActionCreators} from 'redux'; +import translations from '../translations'; +import I18n from 'coral-framework/modules/i18n/i18n'; +import {showSignInDialog, logout} from 'coral-framework/actions/auth'; +const lang = new I18n(translations); + +const UserBox = ({loggedIn, user, logout, onShowProfile}) => ( +
+ { + loggedIn ? ( +
+ {lang.t('signIn.loggedInAs')} + {user.username}. {lang.t('signIn.notYou')} + logout()}> + {lang.t('signIn.logout')} + +
+ ) : null + } +
+); + +const mapStateToProps = ({auth, user}) => ({ + loggedIn: auth.toJS().loggedIn, + user: user.toJS() +}); + +const mapDispatchToProps = dispatch => + bindActionCreators({logout}, dispatch); + +export default connect(mapStateToProps, mapDispatchToProps)(UserBox); diff --git a/client/coral-sign-in/components/styles.css b/plugins/coral-plugin-auth/client/components/styles.css similarity index 100% rename from client/coral-sign-in/components/styles.css rename to plugins/coral-plugin-auth/client/components/styles.css diff --git a/plugins/coral-plugin-auth/client/index.js b/plugins/coral-plugin-auth/client/index.js index 8d2eecc3c..3bf9e58f0 100644 --- a/plugins/coral-plugin-auth/client/index.js +++ b/plugins/coral-plugin-auth/client/index.js @@ -1,9 +1,11 @@ import SignInButton from './components/SignInButton'; import SignInContainer from './components/SignInContainer'; +import UserBox from './components/UserBox'; +import ChangeUserNameContainer from './components/ChangeUserNameContainer'; export default { slots: { - stream: [SignInButton], + stream: [UserBox, SignInButton, ChangeUserNameContainer], login: [SignInContainer] } }; \ No newline at end of file diff --git a/plugins/coral-plugin-auth/client/translations.json b/plugins/coral-plugin-auth/client/translations.json index 93d73d3a2..7ae84b2ff 100644 --- a/plugins/coral-plugin-auth/client/translations.json +++ b/plugins/coral-plugin-auth/client/translations.json @@ -1,10 +1,102 @@ { "en": { - "like": "Like", - "liked": "Liked" + "signIn": { + "emailVerifyCTA": "Please verify your email address.", + "requestNewVerifyEmail": "Request another email:", + "verifyEmail": "Thank you for creating an account! We sent an email to the address you provided to verify your account.", + "verifyEmail2": "You must verify your account before engaging with the community.", + "notYou": "Not you?", + "loggedInAs": "Logged in as", + "facebookSignIn": "Sign in with Facebook", + "facebookSignUp": "Sign up with Facebook", + "logout": "Logout", + "signIn": "Sign in to join the conversation", + "or": "Or", + "email": "E-mail Address", + "password": "Password", + "forgotYourPass": "Forgot your password?", + "needAnAccount": "Need an account?", + "register": "Register", + "signUp": "Sign Up", + "confirmPassword": "Confirm Password", + "username": "Username", + "alreadyHaveAnAccount": "Already have an account?", + "recoverPassword": "Recover password", + "emailInUse": "Email address already in use", + "emailORusernameInUse": "Email address or Username already in use", + "requiredField": "This field is required", + "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.", + "username": "Username", + "continue": "Continue with the same Facebook username", + "save": "Save", + "fakecommentdate": "1 minute ago", + "fakecommentbody": "This is an example comment. Readers can share their thoughts and opinions with newsrooms in the comments section.", + "requiredField": "Required field", + "errorCreate": "Error when changing username", + "checkTheForm": "Invalid Form. Please, check the fields", + "specialCharacters": "Usernames can contain letters, numbers and _ only" + }, + "permalink": { + "permalink": "Link" + }, + "report": "Report", + "like": "Like" }, "es": { - "like": "Me Gusta", - "liked": "Me Gustó" + "signIn": { + "emailVerifyCTA": "Por favor verifique su e-mail.", + "requestNewVerifyEmail": "Enviar otro correo:", + "verifyEmail": "¡Gracias por crear una cuenta! Le enviamos un correo a la dirección que dio para verificar su cuenta.", + "verifyEmail2": "Debe verificarla antes de poder involucrarse en la comunidad.", + "notYou": "¿No eres tu?", + "loggedInAs": "Entraste como", + "facebookSignIn": "Entrar con Facebook", + "facebookSignUp": "Regístrate con Facebook", + "logout": "Salir", + "signIn": "Entrar para Unirte a la Conversación", + "or": "o", + "email": "E-mail", + "password": "Contraseña", + "forgotYourPass": "¿Has olvidado tu contraseña?", + "needAnAccount": "¿Necesitas una cuenta?", + "register": "Regístrate", + "signUp": "Registro", + "confirmPassword": "Confirmar Contraseña", + "username": "Nombre", + "alreadyHaveAnAccount": "¿Ya tienes una cuenta?", + "recoverPassword": "Recuperar contraseña", + "emailInUse": "Este e-mail se encuentra en uso", + "emailORusernameInUse": "Este e-mail ó nombre de usuario se encuentran en uso", + "requiredField": "Este campo es requerido", + "passwordsDontMatch": "Las contraseñas no coinciden", + "specialCharacters": "Los nombres pueden contener letras, números y _", + "checkTheForm": "Formulario Inválido. Por favor, completa los campos" + }, + "createdisplay": { + "writeyourusername": "Edita tu nombre", + "yourusername": "Tu nombre aparece en cada comentario que publiques.", + "ifyoudontchangeyourname": "Si no modificas tu nombre de usuario en este paso, tu nombre de Facebook aparecera al lado de cada comentario que publiques.", + "username": "Nombre", + "continue": "Continuar con nombre de Facebook", + "save": "Guardar", + "fakecommentdate": "hace un minuto", + "fakecommentbody": "Este es un comentario de ejemplo. Las lectoras pueden compartir sus ideas y opiniones con los periodistas en la sección de comentarios.", + "requiredField": "Campo necesario", + "errorCreate": "Hubo un error al cambiar el nombre de usuario", + "checkTheForm": "Formulario Inválido. Por favor, verifica los campos", + "specialCharacters": "Sólo pueden contener letras, números y _" + }, + "permalink": { + "permalink": "Enlace" + }, + "report": "Marcar", + "like": "Me gusta" } } From 1aacb565d4d90b8b1a6562266ba0185e987ec20c Mon Sep 17 00:00:00 2001 From: Belen Curcio Date: Fri, 19 May 2017 20:10:49 -0300 Subject: [PATCH 06/78] linting --- client/coral-embed-stream/src/components/Embed.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/coral-embed-stream/src/components/Embed.js b/client/coral-embed-stream/src/components/Embed.js index e6ae3f367..2c22cc8a0 100644 --- a/client/coral-embed-stream/src/components/Embed.js +++ b/client/coral-embed-stream/src/components/Embed.js @@ -36,7 +36,7 @@ export default class Embed extends React.Component { render () { const {activeTab, viewAllComments, commentId} = this.props; const {asset: {totalCommentCount}} = this.props.root; - const {loggedIn, isAdmin, user} = this.props.auth; + const {loggedIn, isAdmin} = this.props.auth; return (
From f364a1e0a12015843f35a4884f5bc1822459b6e9 Mon Sep 17 00:00:00 2001 From: Belen Curcio Date: Mon, 22 May 2017 08:23:58 -0300 Subject: [PATCH 07/78] Refactor --- .../client/components/SignInContainer.js | 140 +++++++++--------- .../client/components/SignInContent.js | 47 +++--- .../client/components/SignUpContent.js | 91 ++++++------ plugins/coral-plugin-auth/client/index.js | 2 +- 4 files changed, 139 insertions(+), 141 deletions(-) diff --git a/plugins/coral-plugin-auth/client/components/SignInContainer.js b/plugins/coral-plugin-auth/client/components/SignInContainer.js index 73094920e..5a8ffa11a 100644 --- a/plugins/coral-plugin-auth/client/components/SignInContainer.js +++ b/plugins/coral-plugin-auth/client/components/SignInContainer.js @@ -1,11 +1,13 @@ -import React, {Component, PropTypes} from 'react'; +import React from 'react'; import {connect} from 'react-redux'; -import SignDialog from './SignDialog'; -import validate from 'coral-framework/helpers/validate'; -import errorMsj from 'coral-framework/helpers/error'; -import I18n from 'coral-framework/modules/i18n/i18n'; -import translations from '../translations'; import {pym} from 'coral-framework'; +import SignDialog from './SignDialog'; +import {bindActionCreators} from 'redux'; +import translations from '../translations'; +import I18n from 'coral-framework/modules/i18n/i18n'; +import errorMsj from 'coral-framework/helpers/error'; +import validate from 'coral-framework/helpers/validate'; + const lang = new I18n(translations); import { @@ -23,34 +25,22 @@ import { checkLogin } from 'coral-framework/actions/auth'; -class SignInContainer extends Component { - initialState = { - formData: { - email: '', - username: '', - password: '', - confirmPassword: '' - }, - emailToBeResent: '', - errors: {}, - showErrors: false - }; - +class SignInContainer extends React.Component { constructor(props) { super(props); - this.state = this.initialState; - this.addError = this.addError.bind(this); - this.handleAuth = this.handleAuth.bind(this); - this.handleSignUp = this.handleSignUp.bind(this); - this.handleSignIn = this.handleSignIn.bind(this); - this.handleChange = this.handleChange.bind(this); - this.handleChangeEmail = this.handleChangeEmail.bind(this); - this.handleResendVerification = this.handleResendVerification.bind(this); - } - static propTypes = { - requireEmailConfirmation: PropTypes.bool.isRequired - }; + this.state = { + formData: { + email: '', + username: '', + password: '', + confirmPassword: '' + }, + emailToBeResent: '', + errors: {}, + showErrors: false + }; + } componentWillMount() { this.props.checkLogin(); @@ -71,8 +61,7 @@ class SignInContainer extends Component { window.removeEventListener('storage', this.handleAuth); } - handleAuth(e) { - + handleAuth = e => { // Listening to FB changes // FB localStorage key is 'auth' const authCallback = this.props.facebookCallback; @@ -81,12 +70,12 @@ class SignInContainer extends Component { const {err, data} = JSON.parse(e.newValue); authCallback(err, data); } - } + }; - handleChange(e) { + handleChange = e => { const {name, value} = e.target; this.setState( - (state) => ({ + state => ({ ...state, formData: { ...state.formData, @@ -97,14 +86,14 @@ class SignInContainer extends Component { this.validation(name, value); } ); - } + }; - handleChangeEmail(e) { + handleChangeEmail = e => { const {value} = e.target; this.setState({emailToBeResent: value}); - } + }; - handleResendVerification(e) { + handleResendVerification = e => { e.preventDefault(); this.props .requestConfirmEmail( @@ -113,23 +102,22 @@ class SignInContainer extends Component { ) .then(() => { setTimeout(() => { - // allow success UI to be shown for a second, and then close the modal - this.props.handleClose(); + this.props.hideSignInDialog(); }, 2500); }); - } + }; - addError(name, error) { - return this.setState((state) => ({ + addError = (name, error) => { + return this.setState(state => ({ errors: { ...state.errors, [name]: error } })); - } + }; - validation(name, value) { + validation = (name, value) => { const {addError} = this; const {formData} = this.state; @@ -145,20 +133,20 @@ class SignInContainer extends Component { } else { const {[name]: prop, ...errors} = this.state.errors; // eslint-disable-line // Removes Error - this.setState((state) => ({...state, errors})); + this.setState(state => ({...state, errors})); } - } + }; - isCompleted() { + isCompleted = () => { const {formData} = this.state; - return !Object.keys(formData).filter((prop) => !formData[prop].length).length; - } + return !Object.keys(formData).filter(prop => !formData[prop].length).length; + }; - displayErrors(show = true) { + displayErrors = (show = true) => { this.setState({showErrors: show}); - } + }; - handleSignUp(e) { + handleSignUp = e => { e.preventDefault(); const {errors} = this.state; const {fetchSignUp, validForm, invalidForm} = this.props; @@ -169,12 +157,12 @@ class SignInContainer extends Component { } else { invalidForm(lang.t('signIn.checkTheForm')); } - } + }; - handleSignIn(e) { + handleSignIn = e => { e.preventDefault(); this.props.fetchSignIn(this.state.formData); - } + }; render() { const {auth, requireEmailConfirmation} = this.props; @@ -197,24 +185,28 @@ class SignInContainer extends Component { } } -const mapStateToProps = (state) => ({ +const mapStateToProps = state => ({ auth: state.auth.toJS() }); -const mapDispatchToProps = (dispatch) => ({ - checkLogin: () => dispatch(checkLogin()), - facebookCallback: (err, data) => dispatch(facebookCallback(err, data)), - fetchSignUp: (formData, url) => dispatch(fetchSignUp(formData, url)), - fetchSignIn: (formData) => dispatch(fetchSignIn(formData)), - fetchSignInFacebook: () => dispatch(fetchSignInFacebook()), - fetchSignUpFacebook: () => dispatch(fetchSignUpFacebook()), - fetchForgotPassword: (formData) => dispatch(fetchForgotPassword(formData)), - requestConfirmEmail: (email, url) => - dispatch(requestConfirmEmail(email, url)), - changeView: (view) => dispatch(changeView(view)), - handleClose: () => dispatch(hideSignInDialog()), - invalidForm: (error) => dispatch(invalidForm(error)), - validForm: () => dispatch(validForm()) -}); +const mapDispatchToProps = dispatch => + bindActionCreators( + { + checkLogin, + facebookCallback, + fetchSignUp, + fetchSignUp, + fetchSignIn, + fetchSignInFacebook, + fetchSignUpFacebook, + fetchForgotPassword, + requestConfirmEmail, + changeView, + hideSignInDialog, + invalidForm, + validForm + }, + dispatch + ); export default connect(mapStateToProps, mapDispatchToProps)(SignInContainer); diff --git a/plugins/coral-plugin-auth/client/components/SignInContent.js b/plugins/coral-plugin-auth/client/components/SignInContent.js index 7460efb97..6f0027084 100644 --- a/plugins/coral-plugin-auth/client/components/SignInContent.js +++ b/plugins/coral-plugin-auth/client/components/SignInContent.js @@ -18,17 +18,17 @@ const SignInContent = ({ auth, fetchSignInFacebook }) => { - return (

- {auth.emailVerificationFailure ? lang.t('signIn.emailVerifyCTA') : lang.t('signIn.signIn')} + {auth.emailVerificationFailure + ? lang.t('signIn.emailVerifyCTA') + : lang.t('signIn.signIn')}

- { auth.error && {auth.error} } - { - auth.emailVerificationFailure + {auth.error && {auth.error}} + {auth.emailVerificationFailure ?

{lang.t('signIn.requestNewVerifyEmail')}

- + onChange={handleChangeEmail} + /> + {emailVerificationLoading && } {emailVerificationSuccess && } @@ -70,23 +73,29 @@ const SignInContent = ({ onChange={handleChange} />
- { - !auth.isLoading ? - - : - - } + {!auth.isLoading + ? + : }
-
- } +
}
- changeView('FORGOT')}>{lang.t('signIn.forgotYourPass')} + + changeView('FORGOT')}> + {lang.t('signIn.forgotYourPass')} + + {lang.t('signIn.needAnAccount')} - changeView('SIGNUP')} id='coralRegister'> + changeView('SIGNUP')} id="coralRegister"> {lang.t('signIn.register')} diff --git a/plugins/coral-plugin-auth/client/components/SignUpContent.js b/plugins/coral-plugin-auth/client/components/SignUpContent.js index 921f045be..5f2dd36ea 100644 --- a/plugins/coral-plugin-auth/client/components/SignUpContent.js +++ b/plugins/coral-plugin-auth/client/components/SignUpContent.js @@ -1,39 +1,21 @@ -import React, {PropTypes} from 'react'; -import {Button, TextField, Spinner, Success, Alert} from 'coral-ui'; import styles from './styles.css'; -import I18n from 'coral-framework/modules/i18n/i18n'; +import React, {PropTypes} from 'react'; import translations from '../translations'; +import I18n from 'coral-framework/modules/i18n/i18n'; +import {Button, TextField, Spinner, Success, Alert} from 'coral-ui'; + const lang = new I18n(translations); class SignUpContent extends React.Component { + constructor() { + super(); - constructor (props) { - super(props); - this.successfulSignup = false; + this.state = { + successfulSignup: false + }; } - static propTypes = { - emailVerificationEnabled: PropTypes.bool.isRequired, - fetchSignUpFacebook: PropTypes.func.isRequired, - changeView: PropTypes.func.isRequired, - handleSignUp: PropTypes.func.isRequired, - showErrors: PropTypes.bool, - errors: PropTypes.shape({ - email: PropTypes.string, - username: PropTypes.string, - password: PropTypes.string, - confirmPassword: PropTypes.string, - }), - formData: PropTypes.shape({ - email: PropTypes.string, - username: PropTypes.string, - password: PropTypes.string, - confirmPassword: PropTypes.string - }) - } - - render () { - + render() { const { handleChange, formData, @@ -43,17 +25,20 @@ class SignUpContent extends React.Component { showErrors, changeView, handleSignUp, - fetchSignUpFacebook} = this.props; + fetchSignUpFacebook + } = this.props; const beforeSignup = !auth.isLoading && !auth.successSignUp; const successfulSignup = !auth.isLoading && auth.successSignUp; // the first time we render a successfulSignup, trigger a timer - if ((this.successfulSignup ^ successfulSignup) && !emailVerificationEnabled) { + if (this.successfulSignup ^ successfulSignup && !emailVerificationEnabled) { setTimeout(() => { changeView('SIGNIN'); }, 1000); - this.successfulSignup = true; + this.setState({ + successfulSignup: true + }); } return ( @@ -64,8 +49,8 @@ class SignUpContent extends React.Component {
- { auth.error && {auth.error} } - { beforeSignup && + {auth.error && {auth.error}} + {beforeSignup &&
- { auth.isLoading && } + {auth.isLoading && }
-
- } - { - successfulSignup && +
} + {successfulSignup &&
- { - emailVerificationEnabled && -

{lang.t('signIn.verifyEmail')}

{lang.t('signIn.verifyEmail2')}

- } -
- } + {emailVerificationEnabled && +

+ {lang.t('signIn.verifyEmail')} +
+
+ {lang.t('signIn.verifyEmail2')} +

} +
}
- {lang.t('signIn.alreadyHaveAnAccount')} changeView('SIGNIN')}> + {lang.t('signIn.alreadyHaveAnAccount')} changeView('SIGNIN')} + > {lang.t('signIn.signIn')}
diff --git a/plugins/coral-plugin-auth/client/index.js b/plugins/coral-plugin-auth/client/index.js index 3bf9e58f0..867849cac 100644 --- a/plugins/coral-plugin-auth/client/index.js +++ b/plugins/coral-plugin-auth/client/index.js @@ -1,6 +1,6 @@ +import UserBox from './components/UserBox'; import SignInButton from './components/SignInButton'; import SignInContainer from './components/SignInContainer'; -import UserBox from './components/UserBox'; import ChangeUserNameContainer from './components/ChangeUserNameContainer'; export default { From 9d00a27f1de3b5c0a170c885c9adb5b19bba47a6 Mon Sep 17 00:00:00 2001 From: Belen Curcio Date: Mon, 22 May 2017 08:40:45 -0300 Subject: [PATCH 08/78] Auth as a plugin --- ...UsernameContainer.js => ChangeUsername.js} | 82 ++++++------ .../client/components/CreateUsernameDialog.js | 49 ++++--- .../client/components/FakeComment.js | 124 +++++++++--------- .../client/components/ForgotContent.js | 62 +++++---- .../client/components/SignDialog.js | 9 +- .../client/components/SignInButton.js | 8 +- .../client/components/SignInContainer.js | 22 ++-- plugins/coral-plugin-auth/client/index.js | 2 +- 8 files changed, 190 insertions(+), 168 deletions(-) rename plugins/coral-plugin-auth/client/components/{ChangeUsernameContainer.js => ChangeUsername.js} (69%) diff --git a/plugins/coral-plugin-auth/client/components/ChangeUsernameContainer.js b/plugins/coral-plugin-auth/client/components/ChangeUsername.js similarity index 69% rename from plugins/coral-plugin-auth/client/components/ChangeUsernameContainer.js rename to plugins/coral-plugin-auth/client/components/ChangeUsername.js index 4f0ad9895..9b0cbb1a6 100644 --- a/plugins/coral-plugin-auth/client/components/ChangeUsernameContainer.js +++ b/plugins/coral-plugin-auth/client/components/ChangeUsername.js @@ -1,13 +1,12 @@ -import React, {Component} from 'react'; +import React from 'react'; import {connect} from 'react-redux'; - -import validate from 'coral-framework/helpers/validate'; +import {bindActionCreators} from 'redux'; +import translations from '../translations'; +import I18n from 'coral-framework/modules/i18n/i18n'; import errorMsj from 'coral-framework/helpers/error'; - +import validate from 'coral-framework/helpers/validate'; import CreateUsernameDialog from './CreateUsernameDialog'; -import I18n from 'coral-framework/modules/i18n/i18n'; -import translations from '../translations'; const lang = new I18n(translations); import { @@ -18,26 +17,20 @@ import { createUsername } from 'coral-framework/actions/auth'; -class ChangeUsernameContainer extends Component { - initialState = { - formData: { - username: '' - }, - errors: {}, - showErrors: false - }; - +class ChangeUsernameContainer extends React.Component { constructor(props) { super(props); - this.initialState.formData.username = props.user.username; - this.state = this.initialState; - this.handleChange = this.handleChange.bind(this); - this.handleSubmitUsername = this.handleSubmitUsername.bind(this); - this.handleClose = this.handleClose.bind(this); - this.addError = this.addError.bind(this); + + this.state = { + formData: { + username: props.user.username + }, + errors: {}, + showErrors: false + }; } - handleChange(e) { + handleChange = e => { const {name, value} = e.target; this.setState( state => ({ @@ -51,18 +44,18 @@ class ChangeUsernameContainer extends Component { this.validation(name, value); } ); - } + }; - addError(name, error) { + addError = (name, error) => { return this.setState(state => ({ errors: { ...state.errors, [name]: error } })); - } + }; - validation(name, value) { + validation = (name, value) => { const {addError} = this; if (!value.length) { @@ -74,18 +67,18 @@ class ChangeUsernameContainer extends Component { // Removes Error this.setState(state => ({...state, errors})); } - } + }; - isCompleted() { + isCompleted = () => { const {formData} = this.state; return !Object.keys(formData).filter(prop => !formData[prop].length).length; - } + }; - displayErrors(show = true) { + displayErrors = (show = true) => { this.setState({showErrors: show}); - } + }; - handleSubmitUsername(e) { + handleSubmitUsername = e => { e.preventDefault(); const {errors} = this.state; const {validForm, invalidForm} = this.props; @@ -96,11 +89,11 @@ class ChangeUsernameContainer extends Component { } else { invalidForm(lang.t('createdisplay.checkTheForm')); } - } + }; - handleClose() { + handleClose = () => { this.props.hideCreateUsernameDialog(); - } + }; render() { const {loggedIn, auth} = this.props; @@ -122,14 +115,17 @@ class ChangeUsernameContainer extends Component { const mapStateToProps = ({auth, user}) => ({auth, user}); -const mapDispatchToProps = dispatch => ({ - createUsername: (userid, formData) => - dispatch(createUsername(userid, formData)), - showCreateUsernameDialog: () => dispatch(showCreateUsernameDialog()), - hideCreateUsernameDialog: () => dispatch(hideCreateUsernameDialog()), - invalidForm: error => dispatch(invalidForm(error)), - validForm: () => dispatch(validForm()) -}); +const mapDispatchToProps = dispatch => + bindActionCreators( + { + createUsername, + showCreateUsernameDialog, + hideCreateUsernameDialog, + invalidForm, + validForm + }, + dispatch + ); export default connect(mapStateToProps, mapDispatchToProps)( ChangeUsernameContainer diff --git a/plugins/coral-plugin-auth/client/components/CreateUsernameDialog.js b/plugins/coral-plugin-auth/client/components/CreateUsernameDialog.js index b94b47c42..c352552ae 100644 --- a/plugins/coral-plugin-auth/client/components/CreateUsernameDialog.js +++ b/plugins/coral-plugin-auth/client/components/CreateUsernameDialog.js @@ -1,21 +1,26 @@ import React from 'react'; -import TextField from 'coral-ui/components/TextField'; -import Button from 'coral-ui/components/Button'; -import {Dialog, Alert} from 'coral-ui'; -import FakeComment from './FakeComment'; - import styles from './styles.css'; - -import I18n from 'coral-framework/modules/i18n/i18n'; +import {Dialog, Alert, TextField} from 'coral-ui'; +import {FakeComment} from './FakeComment'; import translations from '../translations'; +import Button from 'coral-ui/components/Button'; +import I18n from 'coral-framework/modules/i18n/i18n'; + const lang = new I18n(translations); -const CreateUsernameDialog = ({open, handleClose, formData, handleSubmitUsername, handleChange, ...props}) => { - return ( +const CreateUsernameDialog = ({ + open, + handleClose, + formData, + handleSubmitUsername, + handleChange, + ...props +}) => ( + open={open} + > ×
@@ -24,17 +29,24 @@ const CreateUsernameDialog = ({open, handleClose, formData, handleSubmitUsername
-

{lang.t('createdisplay.yourusername')}

+

+ {lang.t('createdisplay.yourusername')} +

-

{lang.t('createdisplay.ifyoudontchangeyourname')}

- { props.auth.error && {props.auth.error} } +

+ {lang.t('createdisplay.ifyoudontchangeyourname')} +

+ {props.auth.error && {props.auth.error}}
- { props.errors.username && {lang.t('createdisplay.specialCharacters')} } + {props.errors.username && + + {' '}{lang.t('createdisplay.specialCharacters')}{' '} + }
- +
-
+
- ); -}; +); export default CreateUsernameDialog; diff --git a/plugins/coral-plugin-auth/client/components/FakeComment.js b/plugins/coral-plugin-auth/client/components/FakeComment.js index 37630383d..01cc6863e 100644 --- a/plugins/coral-plugin-auth/client/components/FakeComment.js +++ b/plugins/coral-plugin-auth/client/components/FakeComment.js @@ -1,66 +1,72 @@ import React from 'react'; -import styles from 'coral-embed-stream/src/components/Comment.css'; - +import translations from '../translations'; +import {ReplyButton} from 'coral-plugin-replies'; +import PubDate from 'coral-plugin-pubdate/PubDate'; +import I18n from 'coral-framework/modules/i18n/i18n'; import AuthorName from 'coral-plugin-author-name/AuthorName'; import Content from 'coral-plugin-commentcontent/CommentContent'; -import PubDate from 'coral-plugin-pubdate/PubDate'; -import {ReplyButton} from 'coral-plugin-replies'; - -import I18n from 'coral-framework/modules/i18n/i18n'; -import translations from '../translations'; +import styles from 'coral-embed-stream/src/components/Comment.css'; const lang = new I18n(translations); -class FakeComment extends React.Component { - constructor (props) { - super(props); - } - - render () { - const {username, created_at, body} = this.props; - - return ( -
-
- - - -
-
- -
- {}} - parentCommentId={'commentID'} - currentUserId={{}} - banned={false} - /> -
-
-
- -
-
- -
-
+export const FakeComment = ({username, created_at, body}) => ( +
+
+ + + +
+
+
- ); - } -} - -export default FakeComment; + {}} + parentCommentId={'commentID'} + currentUserId={{}} + banned={false} + /> +
+
+
+ +
+
+ +
+
+
+); \ No newline at end of file diff --git a/plugins/coral-plugin-auth/client/components/ForgotContent.js b/plugins/coral-plugin-auth/client/components/ForgotContent.js index 76246fa00..2099330bc 100644 --- a/plugins/coral-plugin-auth/client/components/ForgotContent.js +++ b/plugins/coral-plugin-auth/client/components/ForgotContent.js @@ -1,22 +1,18 @@ import React from 'react'; import styles from './styles.css'; +import translations from '../translations'; import Button from 'coral-ui/components/Button'; import I18n from 'coral-framework/modules/i18n/i18n'; -import translations from '../translations'; + const lang = new I18n(translations); class ForgotContent extends React.Component { - constructor (props) { - super(props); - this.handleSubmit = this.handleSubmit.bind(this); - } - - handleSubmit (e) { + handleSubmit = e => { e.preventDefault(); this.props.fetchForgotPassword(this.emailInput.value); - } + }; - render () { + render() { const {changeView, auth} = this.props; const {passwordRequestSuccess, passwordRequestFailure} = auth; @@ -29,29 +25,47 @@ class ForgotContent extends React.Component {
this.emailInput = input} + ref={input => (this.emailInput = input)} type="text" style={{fontSize: 16}} id="email" - name="email" /> + name="email" + />
- - { - passwordRequestSuccess - ?

{passwordRequestSuccess}

- : null - } - { - passwordRequestFailure - ?

{passwordRequestFailure}

- : null - } + {passwordRequestSuccess + ?

+ {passwordRequestSuccess} +

+ : null} + {passwordRequestFailure + ?

+ {passwordRequestFailure} +

+ : null}
- {lang.t('signIn.needAnAccount')} changeView('SIGNUP')}>{lang.t('signIn.register')} - {lang.t('signIn.alreadyHaveAnAccount')} changeView('SIGNIN')}>{lang.t('signIn.signIn')} + + {lang.t('signIn.needAnAccount')} + {' '} + changeView('SIGNUP')}> + {lang.t('signIn.register')} + + + + {lang.t('signIn.alreadyHaveAnAccount')} + {' '} + changeView('SIGNIN')}> + {lang.t('signIn.signIn')} + +
); diff --git a/plugins/coral-plugin-auth/client/components/SignDialog.js b/plugins/coral-plugin-auth/client/components/SignDialog.js index ff2464f7c..7f05889a0 100644 --- a/plugins/coral-plugin-auth/client/components/SignDialog.js +++ b/plugins/coral-plugin-auth/client/components/SignDialog.js @@ -6,12 +6,9 @@ import SignInContent from './SignInContent'; import SignUpContent from './SignUpContent'; import ForgotContent from './ForgotContent'; -const SignDialog = ({open, view, handleClose, ...props}) => ( - - × +const SignDialog = ({open, view, hideSignInDialog, ...props}) => ( + + × {view === 'SIGNIN' && } {view === 'SIGNUP' && } {view === 'FORGOT' && } diff --git a/plugins/coral-plugin-auth/client/components/SignInButton.js b/plugins/coral-plugin-auth/client/components/SignInButton.js index b4497bc92..b54cbfedd 100644 --- a/plugins/coral-plugin-auth/client/components/SignInButton.js +++ b/plugins/coral-plugin-auth/client/components/SignInButton.js @@ -6,13 +6,11 @@ import {showSignInDialog} from 'coral-framework/actions/auth'; const SignInButton = ({loggedIn, showSignInDialog}) => (
- { - !loggedIn ? ( - - ) : null - } + : null}
); diff --git a/plugins/coral-plugin-auth/client/components/SignInContainer.js b/plugins/coral-plugin-auth/client/components/SignInContainer.js index 5a8ffa11a..cbff000ee 100644 --- a/plugins/coral-plugin-auth/client/components/SignInContainer.js +++ b/plugins/coral-plugin-auth/client/components/SignInContainer.js @@ -169,18 +169,16 @@ class SignInContainer extends React.Component { const {emailVerificationLoading, emailVerificationSuccess} = auth; return ( -
- -
+ ); } } diff --git a/plugins/coral-plugin-auth/client/index.js b/plugins/coral-plugin-auth/client/index.js index 867849cac..41fa3adbe 100644 --- a/plugins/coral-plugin-auth/client/index.js +++ b/plugins/coral-plugin-auth/client/index.js @@ -1,7 +1,7 @@ import UserBox from './components/UserBox'; import SignInButton from './components/SignInButton'; import SignInContainer from './components/SignInContainer'; -import ChangeUserNameContainer from './components/ChangeUserNameContainer'; +import ChangeUserNameContainer from './components/ChangeUsername'; export default { slots: { From 9936b6ec47c6e1ec4c3e9a8fb95c8263ff3a12a0 Mon Sep 17 00:00:00 2001 From: Belen Curcio Date: Mon, 22 May 2017 08:59:34 -0300 Subject: [PATCH 09/78] Prettier --- .../src/components/Stream.js | 141 +++++++++--------- 1 file changed, 74 insertions(+), 67 deletions(-) diff --git a/client/coral-embed-stream/src/components/Stream.js b/client/coral-embed-stream/src/components/Stream.js index a82d7e639..bdf00c46c 100644 --- a/client/coral-embed-stream/src/components/Stream.js +++ b/client/coral-embed-stream/src/components/Stream.js @@ -19,7 +19,7 @@ import ChangeUsernameContainer const lang = new I18n(translations); class Stream extends React.Component { - setActiveReplyBox = (reactKey) => { + setActiveReplyBox = reactKey => { if (!this.props.auth.user) { this.props.showSignInDialog(); } else { @@ -53,7 +53,10 @@ class Stream extends React.Component { : comment; const banned = user && user.status === 'BANNED'; - const temporarilySuspended = user && user.suspension.until && new Date(user.suspension.until) > new Date(); + const temporarilySuspended = + user && + user.suspension.until && + new Date(user.suspension.until) > new Date(); const hasOlderComments = !!(asset && asset.lastComment && @@ -63,8 +66,12 @@ class Stream extends React.Component { const firstCommentDate = asset.comments[0] ? asset.comments[0].created_at : new Date(Date.now() - 1000 * 60 * 60 * 24 * 7).toISOString(); - const commentIsIgnored = (comment) => { - return me && me.ignoredUsers && me.ignoredUsers.find((u) => u.id === comment.user.id); + const commentIsIgnored = comment => { + return ( + me && + me.ignoredUsers && + me.ignoredUsers.find(u => u.id === comment.user.id) + ); }; return (
@@ -81,38 +88,37 @@ class Stream extends React.Component { content={asset.settings.questionBoxContent} enable={asset.settings.questionBoxEnable} /> - {!banned && temporarilySuspended && + {!banned && + temporarilySuspended && - { - lang.t('temporarilySuspended', - this.props.root.settings.organizationName, - lang.timeago(user.suspension.until), - ) - } - - } + {lang.t( + 'temporarilySuspended', + this.props.root.settings.organizationName, + lang.timeago(user.suspension.until) + )} + } {banned && - } - {loggedIn && !banned && !temporarilySuspended && + />} + {loggedIn && + !banned && + !temporarilySuspended && - } + addNotification={this.props.addNotification} + postComment={this.props.postComment} + appendItemArray={this.props.appendItemArray} + updateItem={this.props.updateItem} + setCommentCountCache={this.props.setCommentCountCache} + commentCountCache={commentCountCache} + assetId={asset.id} + premod={asset.settings.moderation} + isReply={false} + authorId={user.id} + charCountEnable={asset.settings.charCountEnable} + maxCharCount={asset.settings.charCount} + />}
:

{asset.settings.closedMessage}

} {!loggedIn && @@ -126,7 +132,11 @@ class Stream extends React.Component { {loggedIn && user && } - {loggedIn && } + {loggedIn && + } {/* the highlightedComment is isolated after the user followed a permalink */} {highlightedComment @@ -164,41 +174,38 @@ class Stream extends React.Component { setCommentCountCache={this.props.setCommentCountCache} />
- {comments.map( - (comment) => { - return (commentIsIgnored(comment) - ? - : - ); - } - )} + {comments.map(comment => { + return commentIsIgnored(comment) + ? + : ; + })}
Date: Mon, 22 May 2017 09:03:10 -0300 Subject: [PATCH 10/78] linting --- client/coral-embed-stream/src/components/Stream.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/client/coral-embed-stream/src/components/Stream.js b/client/coral-embed-stream/src/components/Stream.js index bdf00c46c..ab551e33e 100644 --- a/client/coral-embed-stream/src/components/Stream.js +++ b/client/coral-embed-stream/src/components/Stream.js @@ -19,7 +19,7 @@ import ChangeUsernameContainer const lang = new I18n(translations); class Stream extends React.Component { - setActiveReplyBox = reactKey => { + setActiveReplyBox = (reactKey) => { if (!this.props.auth.user) { this.props.showSignInDialog(); } else { @@ -66,11 +66,11 @@ class Stream extends React.Component { const firstCommentDate = asset.comments[0] ? asset.comments[0].created_at : new Date(Date.now() - 1000 * 60 * 60 * 24 * 7).toISOString(); - const commentIsIgnored = comment => { + const commentIsIgnored = (comment) => { return ( me && me.ignoredUsers && - me.ignoredUsers.find(u => u.id === comment.user.id) + me.ignoredUsers.find((u) => u.id === comment.user.id) ); }; return ( @@ -174,7 +174,7 @@ class Stream extends React.Component { setCommentCountCache={this.props.setCommentCountCache} />
- {comments.map(comment => { + {comments.map((comment) => { return commentIsIgnored(comment) ? : Date: Mon, 22 May 2017 09:39:04 -0300 Subject: [PATCH 11/78] Merge Conflicts --- .../coral-embed-stream/src/components/Stream.js | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/client/coral-embed-stream/src/components/Stream.js b/client/coral-embed-stream/src/components/Stream.js index ab551e33e..53f716954 100644 --- a/client/coral-embed-stream/src/components/Stream.js +++ b/client/coral-embed-stream/src/components/Stream.js @@ -13,8 +13,6 @@ import translations from 'coral-framework/translations'; import CommentBox from 'coral-plugin-commentbox/CommentBox'; import QuestionBox from 'coral-plugin-questionbox/QuestionBox'; import IgnoredCommentTombstone from './IgnoredCommentTombstone'; -import ChangeUsernameContainer - from 'coral-sign-in/containers/ChangeUsernameContainer'; const lang = new I18n(translations); @@ -75,9 +73,7 @@ class Stream extends React.Component { }; return (
- - {open ?
}
:

{asset.settings.closedMessage}

} - {!loggedIn && - } - {loggedIn && - user && - } {loggedIn && Date: Mon, 22 May 2017 19:47:37 +0700 Subject: [PATCH 12/78] Handle response errors in the graphql framework --- client/coral-framework/hocs/withMutation.js | 45 +++++++++++++++++++-- client/coral-framework/hocs/withQuery.js | 18 ++++++--- client/coral-framework/utils/index.js | 11 +++++ 3 files changed, 66 insertions(+), 8 deletions(-) diff --git a/client/coral-framework/hocs/withMutation.js b/client/coral-framework/hocs/withMutation.js index 044bcdfad..940d781aa 100644 --- a/client/coral-framework/hocs/withMutation.js +++ b/client/coral-framework/hocs/withMutation.js @@ -6,7 +6,27 @@ import flatten from 'lodash/flatten'; import isEmpty from 'lodash/isEmpty'; import {getMutationOptions, resolveFragments} from 'coral-framework/services/graphqlRegistry'; import {store} from 'coral-framework/services/store'; -import {getDefinitionName} from '../utils'; +import {getDefinitionName, getResponseErrors} from '../utils'; +import I18n from 'coral-framework/modules/i18n/i18n'; +import translations from 'coral-framework/translations.json'; +const lang = new I18n(translations); + +class ResponseErrors extends Error { + constructor(errors) { + super(`Response Errors ${JSON.stringify(errors)}`); + this.errors = errors.map((e) => new ResponseError(e)); + } +} + +class ResponseError { + constructor(error) { + Object.assign(this, error); + } + + translate(...args) { + return lang.t(`error.${this.translation_key}`, ...args); + } +} /** * Exports a HOC with the same signature as `graphql`, that will @@ -41,6 +61,11 @@ export default (document, config) => (WrappedComponent) => { .filter((i) => i); const update = (proxy, result) => { + if (getResponseErrors(result)) { + + // Do not run updates when we have mutation errors. + return; + } updateCallbacks.forEach((cb) => cb(proxy, result)); }; @@ -53,7 +78,14 @@ export default (document, config) => (WrappedComponent) => { .reduce((res, map) => { Object.keys(map).forEach((key) => { if (!(key in res)) { - res[key] = map[key]; + res[key] = (prev, result) => { + if (getResponseErrors(result.mutationResult)) { + + // Do not run updates when we have mutation errors. + return prev; + } + return map[key](prev, result); + }; } else { const existing = res[key]; res[key] = (prev, result) => { @@ -75,7 +107,14 @@ export default (document, config) => (WrappedComponent) => { if (isEmpty(wrappedConfig.optimisticResponse)) { delete wrappedConfig.optimisticResponse; } - return data.mutate(wrappedConfig); + return data.mutate(wrappedConfig) + .then((res) => { + const errors = getResponseErrors(res); + if (errors) { + throw new ResponseErrors(errors); + } + return Promise.resolve(res); + }); }; return config.props({...data, mutate}); }; diff --git a/client/coral-framework/hocs/withQuery.js b/client/coral-framework/hocs/withQuery.js index 036f9c149..84182f7dd 100644 --- a/client/coral-framework/hocs/withQuery.js +++ b/client/coral-framework/hocs/withQuery.js @@ -1,7 +1,14 @@ import * as React from 'react'; import {graphql} from 'react-apollo'; import {getQueryOptions, resolveFragments} from 'coral-framework/services/graphqlRegistry'; -import {getDefinitionName, separateDataAndRoot} from '../utils'; +import {getDefinitionName, separateDataAndRoot, getResponseErrors} from '../utils'; + +const withSkipOnErrors = (reducer) => (prev, action, ...rest) => { + if (action.type === 'APOLLO_MUTATION_RESULT' && getResponseErrors(action.result)) { + return prev; + } + return reducer(prev, action, ...rest); +}; /** * Exports a HOC with the same signature as `graphql`, that will @@ -23,10 +30,11 @@ export default (document, config) => (WrappedComponent) => { .concat(...configs.map((cfg) => cfg.reducer)) .filter((i) => i); - const reducer = reducerCallbacks.reduce( - (a, b) => (prev, ...rest) => - b(a(prev, ...rest), ...rest), - ); + const reducer = withSkipOnErrors( + reducerCallbacks.reduce( + (a, b) => (prev, ...rest) => + b(a(prev, ...rest), ...rest), + )); return { ...base, diff --git a/client/coral-framework/utils/index.js b/client/coral-framework/utils/index.js index 8fb9cbf81..c8e68517a 100644 --- a/client/coral-framework/utils/index.js +++ b/client/coral-framework/utils/index.js @@ -100,3 +100,14 @@ export function mergeDocuments(documents) { const literals = [main, ...substitutions.map(() => '\n')]; return gql.apply(null, [literals, ...substitutions]); } + +export function getResponseErrors(mutationResult) { + const result = []; + Object.keys(mutationResult.data).forEach((response) => { + const errors = mutationResult.data[response].errors; + if (errors && errors.length) { + result.push(...errors); + } + }); + return result.length ? result : false; +} From 947ea66a777cee9478f5e2ea75029f65708d62b6 Mon Sep 17 00:00:00 2001 From: Chi Vinh Le Date: Mon, 22 May 2017 20:25:24 +0700 Subject: [PATCH 13/78] Remove obsolete errors checking --- .../coral-embed-stream/src/graphql/index.js | 43 +++++++------------ 1 file changed, 15 insertions(+), 28 deletions(-) diff --git a/client/coral-embed-stream/src/graphql/index.js b/client/coral-embed-stream/src/graphql/index.js index ccf6195f6..548834a94 100644 --- a/client/coral-embed-stream/src/graphql/index.js +++ b/client/coral-embed-stream/src/graphql/index.js @@ -124,36 +124,28 @@ const extension = { mutations: { IgnoreUser: ({variables}) => ({ updateQueries: { - EmbedQuery: (previousData, {mutationResult}) => { + EmbedQuery: (previousData) => { const ignoredUserId = variables.id; - const response = mutationResult.data.ignoreUser; - if (ignoredUserId && !response.errors) { - const updated = update(previousData, {me: {ignoredUsers: {$push: [{ - id: ignoredUserId, - __typename: 'User', - }]}}}); - return updated; - } - return previousData; + const updated = update(previousData, {me: {ignoredUsers: {$push: [{ + id: ignoredUserId, + __typename: 'User', + }]}}}); + return updated; } } }), StopIgnoringUser: ({variables}) => ({ updateQueries: { - EmbedStreamProfileQuery: (previousData, {mutationResult}) => { + EmbedStreamProfileQuery: (previousData) => { const noLongerIgnoredUserId = variables.id; - const response = mutationResult.data.stopIgnoringUser; - if (noLongerIgnoredUserId && !response.errors) { - // remove noLongerIgnoredUserId from ignoredUsers - const updated = update(previousData, {me: {ignoredUsers: { - $apply: (ignoredUsers) => { - return ignoredUsers.filter((u) => u.id !== noLongerIgnoredUserId); - } - }}}); - return updated; - } - return previousData; + // remove noLongerIgnoredUserId from ignoredUsers + const updated = update(previousData, {me: {ignoredUsers: { + $apply: (ignoredUsers) => { + return ignoredUsers.filter((u) => u.id !== noLongerIgnoredUserId); + } + }}}); + return updated; } } }), @@ -221,12 +213,7 @@ const extension = { variables: {id, edit}, }) => ({ updateQueries: { - EmbedQuery: (previousData, {mutationResult: {data: {editComment: {comment, errors}}}}) => { - - // @TODO (kiwi) revisit after streamlining error handling - if (errors && errors.length) { - return previousData; - } + EmbedQuery: (previousData, {mutationResult: {data: {editComment: {comment}}}}) => { const {status} = comment; const updateCommentWithEdit = (comment, edit) => { const {body} = edit; From a1a78334ea67a5e15f4cae7241b80da62bcb046e Mon Sep 17 00:00:00 2001 From: David Erwin Date: Tue, 23 May 2017 13:58:02 -0400 Subject: [PATCH 14/78] First pass docs restructure --- README.md | 5 +- docs/{ => diagrams}/architecture.png | Bin docs/{ => diagrams}/architecture.xml | 0 docs/{ => diagrams}/data-model.png | Bin docs/{ => diagrams}/data-model.xml | 0 docs/{ => diagrams}/moderation-flow-post.png | Bin docs/{ => diagrams}/moderation-flow-pre.png | Bin docs/{ => diagrams}/moderation-flow.xml | 0 docs/plugins/CLIENT.md | 272 +++++++++++++ docs/plugins/EXPERIMENTAL.md | 102 +++++ docs/plugins/README.md | 163 ++++++++ docs/plugins/SERVER.md | 382 +++++++++++++++++++ 12 files changed, 923 insertions(+), 1 deletion(-) rename docs/{ => diagrams}/architecture.png (100%) rename docs/{ => diagrams}/architecture.xml (100%) rename docs/{ => diagrams}/data-model.png (100%) rename docs/{ => diagrams}/data-model.xml (100%) rename docs/{ => diagrams}/moderation-flow-post.png (100%) rename docs/{ => diagrams}/moderation-flow-pre.png (100%) rename docs/{ => diagrams}/moderation-flow.xml (100%) create mode 100644 docs/plugins/CLIENT.md create mode 100644 docs/plugins/EXPERIMENTAL.md create mode 100644 docs/plugins/README.md create mode 100644 docs/plugins/SERVER.md diff --git a/README.md b/README.md index 718847d9e..49256d24d 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,6 @@ To set up a development environment or build from source, see [INSTALL.md](https To launch a Talk server of your own from your browser without any need to muck about in a terminal or think about engineering concepts, stay tuned. We will launch [our installer](https://github.com/coralproject/talk-install) shortly! - ### Configuration The Talk application looks for the following configuration values either as environment variables: @@ -45,6 +44,10 @@ sign and verify tokens via a `HS256` algorithm. Refer to the wiki page on [Configuration Loading](https://github.com/coralproject/talk/wiki/Configuration-Loading) for alternative methods of loading configuration during development. +## Plugins + +Talk ships with a plugin architecture that allows developers to significantly extend the platform. For more information, see our [plugin documentation](docs/PLUGINS.md). + ## Supported Browsers ### Web diff --git a/docs/architecture.png b/docs/diagrams/architecture.png similarity index 100% rename from docs/architecture.png rename to docs/diagrams/architecture.png diff --git a/docs/architecture.xml b/docs/diagrams/architecture.xml similarity index 100% rename from docs/architecture.xml rename to docs/diagrams/architecture.xml diff --git a/docs/data-model.png b/docs/diagrams/data-model.png similarity index 100% rename from docs/data-model.png rename to docs/diagrams/data-model.png diff --git a/docs/data-model.xml b/docs/diagrams/data-model.xml similarity index 100% rename from docs/data-model.xml rename to docs/diagrams/data-model.xml diff --git a/docs/moderation-flow-post.png b/docs/diagrams/moderation-flow-post.png similarity index 100% rename from docs/moderation-flow-post.png rename to docs/diagrams/moderation-flow-post.png diff --git a/docs/moderation-flow-pre.png b/docs/diagrams/moderation-flow-pre.png similarity index 100% rename from docs/moderation-flow-pre.png rename to docs/diagrams/moderation-flow-pre.png diff --git a/docs/moderation-flow.xml b/docs/diagrams/moderation-flow.xml similarity index 100% rename from docs/moderation-flow.xml rename to docs/diagrams/moderation-flow.xml diff --git a/docs/plugins/CLIENT.md b/docs/plugins/CLIENT.md new file mode 100644 index 000000000..3842fef77 --- /dev/null +++ b/docs/plugins/CLIENT.md @@ -0,0 +1,272 @@ +# Plugins +We can build plugins to extend the client side functionality of Talk. + +The ultimate goal of our client side plugin architecture is to allow developers +to build on existing concepts without needing to understand core code while +providing complete power and flexibility of javascript, css and html. + +* [Plugin Architecture](#plugin-architecture) +* Using our building block components +* [Reactions](#reactions) +* [Styling](#styling-plugins) + +Advanced users will quickly realize that our plugins have complete access to core code. If you would like to write advanced plugins that reach outside of our published API as described in this document, please see [our notes on experimental plugins](/plugins/EXPERIMENTAL.md). + +Under the hood our plugins are powered by *React*, *Redux* and *GraphQL*. We can also build them with simple vanilla javascript. + +## Plugin Architecture + +The plugins live in the `/plugins` folder. Each plugin must have an `index.js` file and two folders `client` and `server`. + +### The Client Folder +The frontend of our plugin lives inside the `client` folder. The `client` folder must have an `index.js` file that exports the configuration of our plugin. + +``` +my-plugin/ + ├── client/ + │ └── index.js <-- index for client side functionality + ├── server/ + └── index.js <-- base plugin index +``` + +For now our base plugin `index.js` file should look like this: + +```js +export default { + // We will add more here later. +}; +``` + +### Creating a Component + +We can add our components (or any other javascript code) within the `client` folder. + +``` +my-plugin/ + ├── client/ + │ ├── MyComponent.js + │ └── index.js + ├── server/ + └── index.js +``` + +Our component could look like this: + +```js +import React, {Component} from 'react'; + +class MyButton extends Component { + render() { + return ; + } +} + +export default MyButton; +``` + +Here we create a component that renders a `button`. Now that we created our component we need to specify where it should get injected within Talk! + +To tell Talk where that Component should get injected we need to specify which *Slots* to insert it into. + +```js +import React from 'react'; +export default = () => ; +``` + +### Slots +In Talk we have defined specific *Slots* where we can inject components. + +Here is how we specify our slots config in `my-plugin/index.js` + +```js +import MyButton from './MyButton'; + +export default { + slots: { + commentDetail: [MyButton] + } +}; +``` + +Here I’m specifying that the MyComponent Component will take place within the `commentDetail` in Talk. + +`commentDetail` it’s a specific slot in the CommentStream. It means that it will be embedded inside de comment detail. + +Slots properties take an`Array` so we can add as many components as we want. + +## Building Blocks (TBD) + +`Note: the concepts in this section are still to be implemented. Code samples are for discussion and may change.` + +In order to allow you to build more complex plugins, we have wrapped some of our functionality in higher order components that expose a simple api. + +## Reactions + +Reactions provide users the ability to 'like', 'respect', etc... comments. + +Note: some server side work will need to accompany this client side component. See the like and respect plugins as examples. + +### Building Reactions + +#### Our `client/index.js` : + +```js +import LoveButton from './LoveButton'; + +export default { + slots: { + commentReactions: [LoveButton] + } +}; + +``` +In this example we add our reaction component to the `commentReaction` Slot + +#### Our Reaction component: + +```js +import React from 'react'; +import {withReaction} from 'coral-plugin-api'; + +class LoveButton extends React.Component { + handleClick = () => { + const { + postReaction, + deleteReaction, + alreadyReacted + } = this.props; + + if (alreadyReacted()) { + deleteReaction(); + } else { + postReaction(); + } + }; + + render() { + const {count} = this.props; + return ( + + ); + } +} + +export default withReaction('love')(LoveButton); +``` + + +This feature introduces `withReaction` HOC. `withReaction` takes, as argument, a reaction string and it allows our component to receive specific props for handling reactions. + + * `postReaction` - Posts the reaction + + * `deleteReaction` - Removes the reaction + + * `alreadyReacted` - A function that returns a boolean. + + * `count` - The reaction count + + +For full reference: Please, check `coral-plugin-love`: [LoveButton.js](https://github.com/coralproject/talk/blob/master/plugins/coral-plugin-love/client/LoveButton.js) + +### Comment Stream + +Comment streams may be created with filtering and ordering in place: + +* filter by user +* filter by tag +* sort by date ascending / descending + +### Comment Commit hooks + +// docs for the pre/post comment submit commit hooks + +### Mod Queues + +Moderation queues can be added via configuration objects passed in through plugins. + +Basic mod queues will resemble the current moderation queues but can be generated from different lists of comments. + +* filter by user tag +* filter by comment tag +* filter by comment status +* Custom queries (paired with back end plugins that provide queries to get the data) + +#### Advanced mod queues + +Advanced mod queues can be created giving plugin authors the power to create the cards that appear in the queue, create actions and custom buttons, etc... + +### Custom Configuration + +Plugins may rely on configuration options that admins/moderators can set in the Configuration section. + +Basic settings can be added via json configuration in a plugin. + +* Setting headline +* Setting description +* Setting input type +* Default value +* Variable name + +#### Advanced Custom Configuration (low prioritiy) + +Users can inject configuration interfaces that they create into the configuration allowing for more advanced configuration. + + +## Styling Plugins +Talk uses CSS Modules. This basically means that you can also add your CSS Module to your plugin without colliding with the rest of Talk! + +##### My Component +```js +import styles from './style.css'; + +class MyCoralButton extends Component { + render() { + return ; + } +} +```` + +Our `style.css` should could look like this. +```css + +.button { + background: coral; + border-radius: 3px; +} +``` + +## Plugin Hooks +The plugins injected in the CommentBox such as `commentInputDetailArea` will inherit through props tools for handling hooks. + +### Available hook types: +`preSubmit` : To perform actions before submitting the comment. +`postSubmit` : To perform actions after submitting the comment. + +### Register Hooks +`registerHook` is a function that takes: the hook type, a hook function and returns the hook data. + +#### Usage: +```js + this.addCommentTagHook = this.props.registerHook('postSubmit', (data) => { + const {comment} = data.createComment; + this.props.addCommentTag({ + id: comment.id, + tag: 'OFF_TOPIC' + }); + }); +``` + +### Unregister Hooks + +`unregisterHook` will remove the hook. + +```js + this.props.unregisterHook(this.addCommentTagHook); +``` + +### The server folder and the index file +Read more about the `/server` and how to extend Talk here. +[talk/PLUGINS.md at master · coralproject/talk · GitHub](https://github.com/coralproject/talk/blob/master/PLUGINS.md) diff --git a/docs/plugins/EXPERIMENTAL.md b/docs/plugins/EXPERIMENTAL.md new file mode 100644 index 000000000..895be5900 --- /dev/null +++ b/docs/plugins/EXPERIMENTAL.md @@ -0,0 +1,102 @@ +# Experimental plugins + +Talk plugins are, in essence, small programs that hook into the core application in a variety of ways. Ultimately, this code can do anything that javascript is capable of. In addition, plugins can import any core code to hook into talk at any level. + +If you want to write plugins that integrate with core code beyond the api described in [PLUGINS.md](PLUGINS.md), please keep the following things in mind: + +* core code may change and break your plugin +* you may introduce inefficiencies with your plugin that could hurt performance/crash Talk +* you may cause bugs in other areas of Talk + +If you'd like to build a supported plugin but don't have the hooks you need, please file an issue on this repo and we can discuss deepening the supported plugin api! + +With that said, here's some of the prime experimental integration points: + +## Reducers and Actions : Redux + +Talk is powered by Redux and our plugins can too! Our plugins can have their own reducers and actions. + +```js +import MyButton from './MyButton'; +import reducer from './reducer'; + +export default { + slots: { + commentDetail: [MyButton], + }, + reducer +}; +``` + +## Import Actions from Talk +We can easily trigger `Talk` actions in our plugin Components. + +```js +import React, {Component} from 'react'; +import {connect} from 'react-redux'; +import {bindActionCreators} from 'redux'; +import {addTag, removeTag} from 'coral-plugin-commentbox/actions'; + +class MyButton extends Component { + render() { + return ; + } +} + +const mapStateToProps = ({commentBox}) => ({commentBox}); + +const mapDispatchToProps = dispatch => + bindActionCreators({addTag, removeTag}, dispatch); + +export default connect(mapStateToProps, mapDispatchToProps)(OffTopicCheckbox); +``` + +## ESlint and Babel +In talk we use `eslint:recommended` and Babel with the latest ECMAScript Features. But you can use your own! +While building your plugin you need to specify a `.eslintrc.json` file and a`.babelrc` file. + +#### `.eslintrc.json` +```json +{ + "env": { + "browser": true, + "es6": true, + "mocha": true + }, + "parserOptions": { + "sourceType": "module", + "ecmaFeatures": { + "experimentalObjectRestSpread": true, + "jsx": true + } + }, + "parser": "babel-eslint", + "plugins": [ + "react" + ], + "rules": { + "react/jsx-uses-react": "error", + "react/jsx-uses-vars": "error", + "no-console": ["warn", { "allow": ["warn", "error"] }] + } +} +```` + + +#### `. babelrc ` +```json +{ + "presets": [ + "es2015" + ], + "plugins": [ + "add-module-exports", + "transform-class-properties", + "transform-decorators-legacy", + "transform-object-assign", + "transform-object-rest-spread", + "transform-async-to-generator", + "transform-react-jsx" + ] +} +```` diff --git a/docs/plugins/README.md b/docs/plugins/README.md new file mode 100644 index 000000000..ff869b3b0 --- /dev/null +++ b/docs/plugins/README.md @@ -0,0 +1,163 @@ +# Plugins + +The talk platform ships with a plugin architecture featuring that allows +developers to: + +* extend or replace server side graph, rest and auth functionality +* inject functionality into front end embeds and the admin application +* create new front end build targets for embedding +* build plugins from local folders or published via npm/yarn +* deploy plugins throughout the application lifecycle + +## Basic Concepts + +All plugin code lives in the `/plugin` directory. + +Each plugin is provided in a single folder named after the plugin. + +### Naming a Plugin + +Each plugin has a name which must be globally unique. Plugins with name +collisions will not be able to be run together in an instance of Talk. + +If you are creating a plugin for the open source community, we recommend the +following naming convention: + +``` +coral-talk-plugin-[name] +``` + +If you are creating a variant of a plugin for an organization, we recommend +adding the organization's name: + +``` +coral-talk-plugin-[name]-[organization] +``` + +## Plugin Registration + +In order for a Plugin to be active it must be _registered_. + +The parsing order for the plugin registration is as follows: + +- `TALK_PLUGINS_JSON` environment variable +- `plugins.json` file +- `plugins.default.json` file + +If you need to "disable all plugins", you can simply provide `{}` as the +contents of `process.env.TALK_PLUGINS_JSON` or the `plugins.json`. + +### Local Plugins + +The format for plugins.json looks like this: + +```json +{ + "server": [ + "coral-plugin-respect", + "coral-plugin-facebook-auth" + ], + "client": [ + "coral-plugin-respect" + ] +} +``` + +The `server` array specifies which plugins will be loaded when the server +starts. The `client` array specifies which plugins will be built into the +front end bundles. + +Where we have a `server` key with an array of plugins that match the folder +name in the `plugins/` folder. For example, the above config would +require a plugin from `plugins/coral-plugin-respect` and +`plugins/coral-plugin-facebook-auth`. + +### Published Plugins + +If the package is external (available on NPM) you can specify the string for +the version by using an object instead, for example: + +```json +{ + "server": [ + {"people": "^1.2.0"} + ] +} +``` + +### Resolving Plugins + +External plugins can be _resolved_ by running: + +```bash +./bin/cli plugins reconcile +``` + +This achieves two things: + +1. It will traverse into local plugin folders and install their dependencies. + _Note that if the plugin is already installed and available in the node_modules folder, it will not be + fetched again unless there is a version mismatch._ This will result in the + project `package.json` and `yarn.lock` files to be modified, this is normal as + this ensures that repeated deployments (with the same config) will have the + same config, these changes should not be committed to source control. +2. It will seek out dependencies that are listed in the object notation and try + to install them from npm. + +## Plugin Dependencies + +You may also include additional external dependencies in your local packages by +specifying a `package.json` at your plugin root which will result in a +`node_modules` folder being generated at the plugin root with your specific +dependencies. + +## Deployment Solutions + +Plugins can be deployed with a production instance of Talk. + +### Source + +Source deployments can just modify the `plugins.json` file and include any +local plugins into the `plugins/` directory. After including the config, you +need to reconcile the plugins and build the static assets: + +```bash +# get plugin dependancies and remote plugins +./bin/cli plugins reconcile + +# build staic assets (including enabled client side plugins) +yarn build +``` + +Then the application can be started as is. + +If you are working on a plugin, our changes to the plugins will be picked up +naturally by our development scripts: + +```bash +# Watch for changes to client files and rebuild +yarn build-watch +``` + +```bash +# Watch for changes to server files and restart +yarn dev-start +``` + + +### Docker + +If you deploy using Docker, you can extend from the `*-onbuild` image, an +example `Dockerfile` for your project could be: + +```Dockerfile +FROM coralproject/talk:latest-onbuild +``` + +Where the directory for your instance would contain a `plugins.json` file +describing the plugin requirements and a `plugins` directory containing any +other local plugins that should be included. + +Onbuild triggers will execute when the image is building with your custom +configuration and will ensure that the image is ready to use by building all +assets inside the image as well. diff --git a/docs/plugins/SERVER.md b/docs/plugins/SERVER.md new file mode 100644 index 000000000..cb39096be --- /dev/null +++ b/docs/plugins/SERVER.md @@ -0,0 +1,382 @@ +# Server Plugins + +### The Client Folder +The frontend of our plugin lives inside the `client` folder. The `client` folder must have an `index.js` file that exports the configuration of our plugin. + +``` +my-plugin/ + ├── client/ + │ └── ... <-- client side plugin files + ├── server/ + │ └── index.js <-- index for server side functionality + └── index.js <-- base plugin index +``` + +## Specification + +Each plugin should export a single object with all hooks available on it. + +_**Note: You will have access to the whole core and other plugin's typeDefs, +context, loaders, mutators, resolvers, hooks. This is intentional, as it +encourages composing plugins to merge functionality, like a Slack plugin which +provides a Slack notify context function as well as having the loader for +comments.**_ + +The following are the hooks available: + +### GraphQL hooks + +#### Field: `typeDefs` + +```graphql +enum COLOUR { + RED + BLUE +} + +type Person { + name: String! + colour: COLOUR! +} + +type RootMutation { + createPerson(name: String!): Person +} + +type RootQuery { + people: [Person!] +} + +type Subscription { + leader: Person +} +``` + +Thanks to [gql-merge](https://www.npmjs.com/package/gql-merge) the contents of +`typeDefs` should be a string that will be _merged_ with the existing type +definitions. `enum`'s will be appended to, types will be appended, and new types +will be added. + +#### Field: `context` + +```js +{ + Slack: (context) => ({ + notify: (message) => { + // return a promise after we're done sending notifications. + } + }) +} +``` + +Any property provided here will be added to the context parameter available +inside all resolvers, loaders, mutators, and of course, other context based +plugins. + +The top level item must accept a context for the request which it should use to +configure the context plugin before it would be mounted at `context.plugins`. +This plugin above would mount at: `context.plugins.Slack`, or, if you're using +[object destructuring](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment), `{plugins: {Slack}}`. + +#### Field: `loaders` + +```js +(context) => ({ + People: { + load: () => db.people.find({user: context.user}) + } +}) +``` + +Loaders should be provided as a function which returns a map which is used in +the resolvers function. These must return a promise or a value. + +#### Field: `mutators` + +```js +(context) => ({ + People: { + create: (name) => { + return db.people.insert({user: context.user, name}); + } + } +}) +``` + +Mutators should be provided as a function which returns a map which is used in +the resolvers function. These must return a promise or a value. + +#### Field: `resolvers` + +```js +{ + Person: { + name(obj, args, context) { + return obj.name; + }, + colour(obj, args, context) { + // Bill likes the colour red, everyone else likes blue. + return obj.name === 'bill' ? 'RED' : 'BLUE'; + } + }, + RootQuery: { + people(obj, args, {loaders: {People}}) { + return People.load(); + } + }, + RootMutation: { + createPerson(obj, {name}, {mutators: {People}}) { + return People.create(name); + } + } +} +``` + +Should return a resolver map as described in the +[Apollo Docs](http://dev.apollodata.com/tools/graphql-tools/resolvers.html#Resolver-map). + +This will merge with the existing resolvers in core and from previous plugins. + +#### Field: `hooks` + +```js +{ + RootMutation: { + createPerson: { + post: async (obj, args, {plugins: {Slack}}, info, person) { + if (!person) { + return person; + } + + await Slack.notify(`A new person just was created with name ${person.name}`); + + return person; + } + } + } +} +``` + +Hooks here are pretty special, for each resolver field, you can specify a +pre/post hook that will execute pre and post field resolution. + +If your post function accepts four parameters, then it can modify the field +result. It is *required* that the function resolves a promise (or returns) with +the modified value or simply the original if you didn't modify it. + +#### Field: `setupFunctions` + +```js +setupFunctions: { + leader: (options, args) => ({ + leader: { + filter: (person) => person.place === 1 + }, + }), +} +``` + +Setup functions allow you to create filters that control which pubsub.publish() events +send data to the client. If the type in question contains args, clients may subscribe using those arguments to further filter their subscription. + +For more information, see the [Apollo Docs](https://github.com/apollographql/graphql-subscriptions). + +### Routes + +#### Field: `router` + +```js +(router) => { + router.get('/api/v1/people', (req, res) => { + res.json({people: [{name: 'Bob'}]}); + }); +} +``` + +The Router hook allows you to create a function that accepts the base express +router where you can mount any amount of middleware/routes to do any form of +action needed by external applications. + +### Authorization middleware + +The following example creates the requisite callback route and passport +strategy needed to enable Facebook Authorization: + +```js +const authorization = require('middleware/authorization'); + +module.exports = { + router(router) { + router.get('/api/v1/people', authorization.needed('ADMIN'), (req, res) => { + res.json({people: [{name: 'SECRET PEOPLE'}]}); + }); + } +} +``` + +#### Field: `passport` + +```js +const FacebookStrategy = require('passport-facebook').Strategy; +const UsersService = require('services/users'); +const {ValidateUserLogin, HandleAuthPopupCallback} = require('services/passport'); + +module.exports = { + passport(passport) { + passport.use(new FacebookStrategy({ + clientID: process.env.TALK_FACEBOOK_APP_ID, + clientSecret: process.env.TALK_FACEBOOK_APP_SECRET, + callbackURL: `${process.env.TALK_ROOT_URL}/api/v1/auth/facebook/callback`, + passReqToCallback: true, + profileFields: ['id', 'displayName', 'picture.type(large)'] + }, async (req, accessToken, refreshToken, profile, done) => { + + let user; + try { + user = await UsersService.findOrCreateExternalUser(profile); + } catch (err) { + return done(err); + } + + return ValidateUserLogin(profile, user, done); + })); + }, + router(router) { + + // Note that we have to import the passport instance here, it is + // instantiated after all the strategies have been mounted. + const {passport} = require('services/passport'); + + /** + * Facebook auth endpoint, this will redirect the user immediatly to facebook + * for authorization. + */ + router.get('/facebook', passport.authenticate('facebook', {display: 'popup', authType: 'rerequest', scope: ['public_profile']})); + + /** + * Facebook callback endpoint, this will send the user a html page designed to + * send back the user credentials upon sucesfull login. + */ + router.get('/facebook/callback', (req, res, next) => { + + // Perform the facebook login flow and pass the data back through the opener. + passport.authenticate('facebook', HandleAuthPopupCallback(req, res, next))(req, res, next); + }); + } +}; +``` + +## Full Example + +Contents of `plugins.json`: + +```json +{ + "server": [ + "people" + ] +} +``` + +Located in `plugins/people/index.js`: + +```js +module.exports = { + typeDefs: ` + enum COLOUR { + RED + BLUE + } + + type Person { + name: String! + colour: COLOUR! + } + + type RootMutation { + createPerson(name: String!): Person + } + + type RootQuery { + people: [Person!] + } + + type Subscription { + leader: Person + } + `, + context: { + Slack: () => ({ + notify: (message) => { + // return a promise after we're done sending notifications. + } + }) + }, + loaders: ({user}) => ({ + People: { + load: () => db.people.find({user}) + } + }), + mutators: ({user}) => ({ + People: { + create: (name) => { + return db.people.insert({user, name}); + } + } + }), + resolvers: { + Person: { + name(obj, args, context) { + return obj.name; + }, + colour(obj, args, context) { + // Bill likes the colour red, everyone else likes blue. + return obj.name === 'bill' ? 'RED' : 'BLUE'; + } + }, + RootQuery: { + people(obj, args, {loaders: {People}}) { + return People.load(); + } + }, + RootMutation: { + createPerson(obj, {name}, {mutators: {People}}) { + return People.create(name); + } + } + }, + hooks: { + RootMutation: { + createPerson: { + post: async (obj, args, {plugins: {Slack}}, info, person) => { + if (!person) { + return person; + } + + await Slack.notify(`A new person just was created with name ${person.name}`); + + return person; + } + } + } + }, + setupFunctions: { + leader: (options, args) => ({ + leader: { + filter: (person) => person.place === 1 + } + } + } +}; + +``` + +## API + +You can access any API available inside the talk directory in a plugin by simply +importing the file relative to the talk project root. An example would be if you +wanted to import the `MetadataService`, you would simply write: + +```javascript +const MetadataService = require('services/metadata'); +``` From 8ab7047cfa44665792893855b2263ee4bde7d023 Mon Sep 17 00:00:00 2001 From: Chi Vinh Le Date: Wed, 24 May 2017 17:09:21 +0700 Subject: [PATCH 15/78] Refactor admin --- client/coral-admin/src/AppRouter.js | 53 +++-- client/coral-admin/src/actions/moderation.js | 2 +- .../src/components/ActionButton.js | 2 +- .../src/containers/Community/Table.js | 81 -------- .../src/containers/Dashboard/Dashboard.js | 48 ----- .../containers/Install/InstallContainer.js | 101 ---------- .../{LayoutContainer.js => Layout.js} | 0 .../src/containers/Streams/Stories.js | 187 ------------------ .../Community/components/ActionButton.js | 4 +- .../Community/components/BanUserButton.css | 0 .../Community/components/BanUserButton.js | 0 .../Community/components/BanUserDialog.css | 0 .../Community/components/BanUserDialog.js | 0 .../Community/components}/Community.css | 0 .../Community/components/Community.js} | 90 ++------- .../Community/components}/CommunityLayout.js | 0 .../Community/components/CommunityMenu.js | 0 .../Community/components}/FlaggedAccounts.js | 2 +- .../Community/components}/Loading.js | 0 .../Community/components}/People.js | 4 +- .../components/SuspendUserDialog.css | 0 .../Community/components/SuspendUserDialog.js | 0 .../src/routes/Community/components/Table.js | 57 ++++++ .../Community/components/User.js | 2 +- .../Community/components/styles.css | 0 .../routes/Community/containers/Community.js | 55 ++++++ .../src/routes/Community/containers/Table.js | 37 ++++ .../coral-admin/src/routes/Community/index.js | 2 + .../Configure/components}/Configure.css | 0 .../Configure/components}/Configure.js | 47 ++--- .../Configure/components}/Domainlist.js | 2 +- .../Configure/components}/EmbedLink.js | 6 +- .../components}/ModerationSettings.js | 4 +- .../Configure/components}/StreamSettings.js | 2 +- .../Configure/components}/TechSettings.js | 2 +- .../Configure/components}/Wordlist.js | 2 +- .../routes/Configure/containers/Configure.js | 42 ++++ .../coral-admin/src/routes/Configure/index.js | 1 + .../Dashboard/components}/ActivityWidget.js | 0 .../Dashboard}/components/CountdownTimer.js | 2 +- .../Dashboard/components}/Dashboard.css | 0 .../routes/Dashboard/components/Dashboard.js | 15 ++ .../Dashboard/components}/FlagWidget.js | 0 .../Dashboard/components}/LikeWidget.js | 0 .../components}/MostLikedCommentsWidget.js | 0 .../Dashboard/components}/Widget.css | 0 .../routes/Dashboard/containers/Dashboard.js | 33 ++++ .../coral-admin/src/routes/Dashboard/index.js | 1 + .../src/routes/Install/components/Install.js | 79 ++++++++ .../components/Steps/AddOrganizationName.js | 2 +- .../components/Steps/CreateYourAccount.js | 2 +- .../Install/components/Steps/FinalStep.js | 2 +- .../Install/components/Steps/InitialStep.js | 2 +- .../components/Steps/InviteTeamMembers.js | 0 .../components/Steps/PermittedDomainsStep.js | 2 +- .../Install/components/Steps/style.css | 0 .../Install/components}/style.css | 0 .../Install/components}/translations.json | 0 .../Install/containers/InstallContainer.js | 57 ++++++ .../coral-admin/src/routes/Install/index.js | 1 + .../Moderation}/components/BanUserDialog.css | 0 .../Moderation}/components/BanUserDialog.js | 0 .../Moderation}/components/Comment.css | 0 .../Moderation}/components/Comment.js | 0 .../Moderation}/components/CommentCount.css | 0 .../Moderation}/components/CommentCount.js | 0 .../Moderation}/components/CommentType.css | 0 .../Moderation}/components/CommentType.js | 0 .../Moderation}/components/FlagBox.css | 0 .../Moderation}/components/FlagBox.js | 0 .../Moderation}/components/LoadMore.js | 0 .../Moderation/components/Moderation.js} | 94 ++------- .../components/ModerationHeader.js | 0 .../components}/ModerationLayout.js | 0 .../Moderation}/components/ModerationMenu.js | 0 .../Moderation/components}/ModerationQueue.js | 10 +- .../Moderation}/components/NotFoundAsset.js | 0 .../components/SuspendUserDialog.css | 0 .../components/SuspendUserDialog.js | 0 .../Moderation/components}/UserDetail.css | 0 .../Moderation/components}/UserDetail.js | 10 +- .../Moderation}/components/styles.css | 0 .../Moderation/containers/Moderation.js | 83 ++++++++ .../Moderation/containers/UserDetail.js | 19 ++ .../helpers/moderationQueueActionsMap.js | 0 .../src/routes/Moderation/index.js | 2 + .../Stories/components}/Stories.css | 0 .../Stories/components}/Stories.js | 25 +-- .../src/routes/Stories/containers/Stories.js | 27 +++ .../coral-admin/src/routes/Stories/index.js | 1 + services/users.js | 5 +- 91 files changed, 620 insertions(+), 689 deletions(-) delete mode 100644 client/coral-admin/src/containers/Community/Table.js delete mode 100644 client/coral-admin/src/containers/Dashboard/Dashboard.js delete mode 100644 client/coral-admin/src/containers/Install/InstallContainer.js rename client/coral-admin/src/containers/{LayoutContainer.js => Layout.js} (100%) delete mode 100644 client/coral-admin/src/containers/Streams/Stories.js rename client/coral-admin/src/{containers => routes}/Community/components/ActionButton.js (82%) rename client/coral-admin/src/{containers => routes}/Community/components/BanUserButton.css (100%) rename client/coral-admin/src/{containers => routes}/Community/components/BanUserButton.js (100%) rename client/coral-admin/src/{containers => routes}/Community/components/BanUserDialog.css (100%) rename client/coral-admin/src/{containers => routes}/Community/components/BanUserDialog.js (100%) rename client/coral-admin/src/{containers/Community => routes/Community/components}/Community.css (100%) rename client/coral-admin/src/{containers/Community/CommunityContainer.js => routes/Community/components/Community.js} (57%) rename client/coral-admin/src/{containers/Community => routes/Community/components}/CommunityLayout.js (100%) rename client/coral-admin/src/{containers => routes}/Community/components/CommunityMenu.js (100%) rename client/coral-admin/src/{containers/Community => routes/Community/components}/FlaggedAccounts.js (97%) rename client/coral-admin/src/{containers/Community => routes/Community/components}/Loading.js (100%) rename client/coral-admin/src/{containers/Community => routes/Community/components}/People.js (94%) rename client/coral-admin/src/{containers => routes}/Community/components/SuspendUserDialog.css (100%) rename client/coral-admin/src/{containers => routes}/Community/components/SuspendUserDialog.js (100%) create mode 100644 client/coral-admin/src/routes/Community/components/Table.js rename client/coral-admin/src/{containers => routes}/Community/components/User.js (98%) rename client/coral-admin/src/{containers => routes}/Community/components/styles.css (100%) create mode 100644 client/coral-admin/src/routes/Community/containers/Community.js create mode 100644 client/coral-admin/src/routes/Community/containers/Table.js create mode 100644 client/coral-admin/src/routes/Community/index.js rename client/coral-admin/src/{containers/Configure => routes/Configure/components}/Configure.css (100%) rename client/coral-admin/src/{containers/Configure => routes/Configure/components}/Configure.js (83%) rename client/coral-admin/src/{containers/Configure => routes/Configure/components}/Domainlist.js (94%) rename client/coral-admin/src/{containers/Configure => routes/Configure/components}/EmbedLink.js (97%) rename client/coral-admin/src/{containers/Configure => routes/Configure/components}/ModerationSettings.js (98%) rename client/coral-admin/src/{containers/Configure => routes/Configure/components}/StreamSettings.js (99%) rename client/coral-admin/src/{containers/Configure => routes/Configure/components}/TechSettings.js (96%) rename client/coral-admin/src/{containers/Configure => routes/Configure/components}/Wordlist.js (96%) create mode 100644 client/coral-admin/src/routes/Configure/containers/Configure.js create mode 100644 client/coral-admin/src/routes/Configure/index.js rename client/coral-admin/src/{containers/Dashboard => routes/Dashboard/components}/ActivityWidget.js (100%) rename client/coral-admin/src/{ => routes/Dashboard}/components/CountdownTimer.js (96%) rename client/coral-admin/src/{containers/Dashboard => routes/Dashboard/components}/Dashboard.css (100%) create mode 100644 client/coral-admin/src/routes/Dashboard/components/Dashboard.js rename client/coral-admin/src/{containers/Dashboard => routes/Dashboard/components}/FlagWidget.js (100%) rename client/coral-admin/src/{containers/Dashboard => routes/Dashboard/components}/LikeWidget.js (100%) rename client/coral-admin/src/{containers/Dashboard => routes/Dashboard/components}/MostLikedCommentsWidget.js (100%) rename client/coral-admin/src/{containers/Dashboard => routes/Dashboard/components}/Widget.css (100%) create mode 100644 client/coral-admin/src/routes/Dashboard/containers/Dashboard.js create mode 100644 client/coral-admin/src/routes/Dashboard/index.js create mode 100644 client/coral-admin/src/routes/Install/components/Install.js rename client/coral-admin/src/{containers => routes}/Install/components/Steps/AddOrganizationName.js (95%) rename client/coral-admin/src/{containers => routes}/Install/components/Steps/CreateYourAccount.js (97%) rename client/coral-admin/src/{containers => routes}/Install/components/Steps/FinalStep.js (92%) rename client/coral-admin/src/{containers => routes}/Install/components/Steps/InitialStep.js (90%) rename client/coral-admin/src/{containers => routes}/Install/components/Steps/InviteTeamMembers.js (100%) rename client/coral-admin/src/{containers => routes}/Install/components/Steps/PermittedDomainsStep.js (95%) rename client/coral-admin/src/{containers => routes}/Install/components/Steps/style.css (100%) rename client/coral-admin/src/{containers/Install => routes/Install/components}/style.css (100%) rename client/coral-admin/src/{containers/Install => routes/Install/components}/translations.json (100%) create mode 100644 client/coral-admin/src/routes/Install/containers/InstallContainer.js create mode 100644 client/coral-admin/src/routes/Install/index.js rename client/coral-admin/src/{containers/ModerationQueue => routes/Moderation}/components/BanUserDialog.css (100%) rename client/coral-admin/src/{containers/ModerationQueue => routes/Moderation}/components/BanUserDialog.js (100%) rename client/coral-admin/src/{containers/ModerationQueue => routes/Moderation}/components/Comment.css (100%) rename client/coral-admin/src/{containers/ModerationQueue => routes/Moderation}/components/Comment.js (100%) rename client/coral-admin/src/{containers/ModerationQueue => routes/Moderation}/components/CommentCount.css (100%) rename client/coral-admin/src/{containers/ModerationQueue => routes/Moderation}/components/CommentCount.js (100%) rename client/coral-admin/src/{containers/ModerationQueue => routes/Moderation}/components/CommentType.css (100%) rename client/coral-admin/src/{containers/ModerationQueue => routes/Moderation}/components/CommentType.js (100%) rename client/coral-admin/src/{containers/ModerationQueue => routes/Moderation}/components/FlagBox.css (100%) rename client/coral-admin/src/{containers/ModerationQueue => routes/Moderation}/components/FlagBox.js (100%) rename client/coral-admin/src/{containers/ModerationQueue => routes/Moderation}/components/LoadMore.js (100%) rename client/coral-admin/src/{containers/ModerationQueue/ModerationContainer.js => routes/Moderation/components/Moderation.js} (73%) rename client/coral-admin/src/{containers/ModerationQueue => routes/Moderation}/components/ModerationHeader.js (100%) rename client/coral-admin/src/{containers/ModerationQueue => routes/Moderation/components}/ModerationLayout.js (100%) rename client/coral-admin/src/{containers/ModerationQueue => routes/Moderation}/components/ModerationMenu.js (100%) rename client/coral-admin/src/{containers/ModerationQueue => routes/Moderation/components}/ModerationQueue.js (91%) rename client/coral-admin/src/{containers/ModerationQueue => routes/Moderation}/components/NotFoundAsset.js (100%) rename client/coral-admin/src/{containers/ModerationQueue => routes/Moderation}/components/SuspendUserDialog.css (100%) rename client/coral-admin/src/{containers/ModerationQueue => routes/Moderation}/components/SuspendUserDialog.js (100%) rename client/coral-admin/src/{containers/ModerationQueue => routes/Moderation/components}/UserDetail.css (100%) rename client/coral-admin/src/{containers/ModerationQueue => routes/Moderation/components}/UserDetail.js (88%) rename client/coral-admin/src/{containers/ModerationQueue => routes/Moderation}/components/styles.css (100%) create mode 100644 client/coral-admin/src/routes/Moderation/containers/Moderation.js create mode 100644 client/coral-admin/src/routes/Moderation/containers/UserDetail.js rename client/coral-admin/src/{containers/ModerationQueue => routes/Moderation}/helpers/moderationQueueActionsMap.js (100%) create mode 100644 client/coral-admin/src/routes/Moderation/index.js rename client/coral-admin/src/{containers/Stories => routes/Stories/components}/Stories.css (100%) rename client/coral-admin/src/{containers/Stories => routes/Stories/components}/Stories.js (91%) create mode 100644 client/coral-admin/src/routes/Stories/containers/Stories.js create mode 100644 client/coral-admin/src/routes/Stories/index.js 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]}}); From 3cde313ab4d53aa7ab5592501e9e534632f150e9 Mon Sep 17 00:00:00 2001 From: Chi Vinh Le Date: Wed, 24 May 2017 17:38:19 +0700 Subject: [PATCH 16/78] Pass correct props to install step --- client/coral-admin/src/routes/Install/components/Install.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/coral-admin/src/routes/Install/components/Install.js b/client/coral-admin/src/routes/Install/components/Install.js index 4885ffed7..f7069d67c 100644 --- a/client/coral-admin/src/routes/Install/components/Install.js +++ b/client/coral-admin/src/routes/Install/components/Install.js @@ -63,7 +63,7 @@ export default class Install extends Component { From c35ce979f5d17d6154d7f134c12834d0f48af047 Mon Sep 17 00:00:00 2001 From: Chi Vinh Le Date: Wed, 24 May 2017 19:04:05 +0700 Subject: [PATCH 17/78] Move query logic to containers --- client/coral-admin/src/actions/moderation.js | 6 + .../coral-admin/src/constants/moderation.js | 1 + client/coral-admin/src/graphql/fragments.js | 0 .../fragments/assetMetricsView.graphql | 12 - .../src/graphql/fragments/commentView.graphql | 31 --- .../src/graphql/queries/assetsQuery.graphql | 6 - .../graphql/queries/getQueueCounts.graphql | 22 -- .../coral-admin/src/graphql/queries/index.js | 116 ---------- .../src/graphql/queries/loadMore.graphql | 13 -- .../src/graphql/queries/metricsQuery.graphql | 10 - .../src/graphql/queries/modQueueQuery.graphql | 68 ------ .../queries/modUserFlaggedQuery.graphql | 26 --- .../src/graphql/queries/userDetail.graphql | 13 -- client/coral-admin/src/reducers/moderation.js | 3 + .../routes/Community/containers/Community.js | 42 +++- .../routes/Dashboard/containers/Dashboard.js | 37 ++- .../{InstallContainer.js => Install.js} | 0 .../coral-admin/src/routes/Install/index.js | 2 +- .../Moderation/components/Moderation.js | 14 +- .../Moderation/components/UserDetail.js | 2 +- .../Moderation/containers/Moderation.js | 215 +++++++++++++++++- .../Moderation/containers/UserDetail.js | 27 ++- 22 files changed, 322 insertions(+), 344 deletions(-) create mode 100644 client/coral-admin/src/graphql/fragments.js delete mode 100644 client/coral-admin/src/graphql/fragments/assetMetricsView.graphql delete mode 100644 client/coral-admin/src/graphql/fragments/commentView.graphql delete mode 100644 client/coral-admin/src/graphql/queries/assetsQuery.graphql delete mode 100644 client/coral-admin/src/graphql/queries/getQueueCounts.graphql delete mode 100644 client/coral-admin/src/graphql/queries/index.js delete mode 100644 client/coral-admin/src/graphql/queries/loadMore.graphql delete mode 100644 client/coral-admin/src/graphql/queries/metricsQuery.graphql delete mode 100644 client/coral-admin/src/graphql/queries/modQueueQuery.graphql delete mode 100644 client/coral-admin/src/graphql/queries/modUserFlaggedQuery.graphql delete mode 100644 client/coral-admin/src/graphql/queries/userDetail.graphql rename client/coral-admin/src/routes/Install/containers/{InstallContainer.js => Install.js} (100%) diff --git a/client/coral-admin/src/actions/moderation.js b/client/coral-admin/src/actions/moderation.js index 268ab36b8..4b0b0538a 100644 --- a/client/coral-admin/src/actions/moderation.js +++ b/client/coral-admin/src/actions/moderation.js @@ -27,3 +27,9 @@ export const hideShortcutsNote = () => { export const viewUserDetail = (userId) => ({type: actions.VIEW_USER_DETAIL, userId}); export const hideUserDetail = () => ({type: actions.HIDE_USER_DETAIL}); + +export const setSortOrder = (order) => ({ + type: actions.SET_SORT_ORDER, + order +}); + diff --git a/client/coral-admin/src/constants/moderation.js b/client/coral-admin/src/constants/moderation.js index b960d95a2..3586b1a75 100644 --- a/client/coral-admin/src/constants/moderation.js +++ b/client/coral-admin/src/constants/moderation.js @@ -7,3 +7,4 @@ export const SHOW_SUSPEND_USER_DIALOG = 'SHOW_SUSPEND_USER_DIALOG'; export const HIDE_SUSPEND_USER_DIALOG = 'HIDE_SUSPEND_USER_DIALOG'; export const VIEW_USER_DETAIL = 'VIEW_USER_DETAIL'; export const HIDE_USER_DETAIL = 'HIDE_USER_DETAIL'; +export const SET_SORT_ORDER = 'MODERATION_SET_SORT_ORDER'; diff --git a/client/coral-admin/src/graphql/fragments.js b/client/coral-admin/src/graphql/fragments.js new file mode 100644 index 000000000..e69de29bb diff --git a/client/coral-admin/src/graphql/fragments/assetMetricsView.graphql b/client/coral-admin/src/graphql/fragments/assetMetricsView.graphql deleted file mode 100644 index 726194143..000000000 --- a/client/coral-admin/src/graphql/fragments/assetMetricsView.graphql +++ /dev/null @@ -1,12 +0,0 @@ -fragment metrics on Asset { - id - title - url - author - created_at - commentCount - action_summaries { - actionCount - actionableItemCount - } -} diff --git a/client/coral-admin/src/graphql/fragments/commentView.graphql b/client/coral-admin/src/graphql/fragments/commentView.graphql deleted file mode 100644 index 1f3b8b1d3..000000000 --- a/client/coral-admin/src/graphql/fragments/commentView.graphql +++ /dev/null @@ -1,31 +0,0 @@ -fragment commentView on Comment { - id - body - created_at - status - user { - id - name: username - status - } - asset { - id - title - url - } - action_summaries { - count - ... on FlagActionSummary { - reason - } - } - actions { - ... on FlagAction { - reason - message - user { - username - } - } - } -} diff --git a/client/coral-admin/src/graphql/queries/assetsQuery.graphql b/client/coral-admin/src/graphql/queries/assetsQuery.graphql deleted file mode 100644 index 37950692d..000000000 --- a/client/coral-admin/src/graphql/queries/assetsQuery.graphql +++ /dev/null @@ -1,6 +0,0 @@ -query Assets { - assets { - id - title - } -} diff --git a/client/coral-admin/src/graphql/queries/getQueueCounts.graphql b/client/coral-admin/src/graphql/queries/getQueueCounts.graphql deleted file mode 100644 index 4a7c00d87..000000000 --- a/client/coral-admin/src/graphql/queries/getQueueCounts.graphql +++ /dev/null @@ -1,22 +0,0 @@ -query Counts ($asset_id: ID) { - allCount: commentCount(query: { - asset_id: $asset_id - }) - acceptedCount: commentCount(query: { - statuses: [ACCEPTED], - asset_id: $asset_id - }) - premodCount: commentCount(query: { - statuses: [PREMOD], - asset_id: $asset_id - }) - rejectedCount: commentCount(query: { - statuses: [REJECTED], - asset_id: $asset_id - }) - flaggedCount: commentCount(query: { - action_type: FLAG, - asset_id: $asset_id, - statuses: [NONE, PREMOD] - }) -} diff --git a/client/coral-admin/src/graphql/queries/index.js b/client/coral-admin/src/graphql/queries/index.js deleted file mode 100644 index ae94d70c3..000000000 --- a/client/coral-admin/src/graphql/queries/index.js +++ /dev/null @@ -1,116 +0,0 @@ -import {graphql} from 'react-apollo'; - -import MOD_QUEUE_QUERY from './modQueueQuery.graphql'; -import MOD_QUEUE_LOAD_MORE from './loadMore.graphql'; -import MOD_USER_FLAGGED_QUERY from './modUserFlaggedQuery.graphql'; -import METRICS from './metricsQuery.graphql'; -import USER_DETAIL from './userDetail.graphql'; -import GET_QUEUE_COUNTS from './getQueueCounts.graphql'; - -export const modQueueQuery = graphql(MOD_QUEUE_QUERY, { - options: ({params: {id = null}}) => { - return { - variables: { - asset_id: id, - sort: 'REVERSE_CHRONOLOGICAL' - } - }; - }, - props: ({ownProps: {params: {id = null}}, data}) => ({ - data, - modQueueResort: modQueueResort(id, data.fetchMore), - loadMore: loadMore(data.fetchMore) - }) -}); - -export const getMetrics = graphql(METRICS, { - options: ({settings: {dashboardWindowStart, dashboardWindowEnd}}) => { - - return { - variables: { - from: dashboardWindowStart, - to: dashboardWindowEnd - } - }; - } -}); - -export const loadMore = (fetchMore) => ({limit = 10, cursor, sort, tab, asset_id}) => { - let variables = { - limit, - cursor, - sort, - asset_id - }; - switch(tab) { - case 'all': - variables.statuses = null; - break; - case 'accepted': - variables.statuses = ['ACCEPTED']; - break; - case 'premod': - variables.statuses = ['PREMOD']; - break; - case 'flagged': - variables.statuses = ['NONE', 'PREMOD']; - variables.action_type = 'FLAG'; - break; - case 'rejected': - variables.statuses = ['REJECTED']; - break; - } - return fetchMore({ - query: MOD_QUEUE_LOAD_MORE, - variables, - updateQuery: (oldData, {fetchMoreResult:{comments}}) => { - return { - ...oldData, - [tab]: [ - ...oldData[tab], - ...comments - ] - }; - } - }); -}; - -export const modUserFlaggedQuery = graphql(MOD_USER_FLAGGED_QUERY, { - options: ({params: {action_type = 'FLAG'}}) => { - return { - variables: { - action_type: action_type - } - }; - } -}); - -export const modQueueResort = (id, fetchMore) => (sort) => { - return fetchMore({ - query: MOD_QUEUE_QUERY, - variables: { - asset_id: id, - sort - }, - updateQuery: (oldData, {fetchMoreResult:{data}}) => data - }); -}; - -export const getUserDetail = graphql(USER_DETAIL, { - options: ({id}) => { - return { - variables: {author_id: id} - }; - } -}); - -export const getQueueCounts = graphql(GET_QUEUE_COUNTS, { - options: ({params: {id = null}}) => { - return { - pollInterval: 5000, - variables: { - asset_id: id - } - }; - } -}); diff --git a/client/coral-admin/src/graphql/queries/loadMore.graphql b/client/coral-admin/src/graphql/queries/loadMore.graphql deleted file mode 100644 index a42c7b2bf..000000000 --- a/client/coral-admin/src/graphql/queries/loadMore.graphql +++ /dev/null @@ -1,13 +0,0 @@ -#import "../fragments/commentView.graphql" - -query LoadMoreModQueue($limit: Int = 10, $cursor: Date, $sort: SORT_ORDER, $asset_id: ID, $statuses:[COMMENT_STATUS!], $action_type: ACTION_TYPE) { - comments(query: {limit: $limit, cursor: $cursor, asset_id: $asset_id, statuses: $statuses, sort: $sort, action_type: $action_type}) { - ...commentView - action_summaries { - count - ... on FlagActionSummary { - reason - } - } - } -} diff --git a/client/coral-admin/src/graphql/queries/metricsQuery.graphql b/client/coral-admin/src/graphql/queries/metricsQuery.graphql deleted file mode 100644 index 17fac3034..000000000 --- a/client/coral-admin/src/graphql/queries/metricsQuery.graphql +++ /dev/null @@ -1,10 +0,0 @@ -#import "../fragments/assetMetricsView.graphql" - -query Metrics ($from: Date!, $to: Date!) { - assetsByFlag: assetMetrics(from: $from, to: $to, sort: FLAG) { - ...metrics - } - assetsByActivity: assetMetrics(from: $from, to: $to, sort: ACTIVITY) { - ...metrics - } -} diff --git a/client/coral-admin/src/graphql/queries/modQueueQuery.graphql b/client/coral-admin/src/graphql/queries/modQueueQuery.graphql deleted file mode 100644 index 6bfcf81ec..000000000 --- a/client/coral-admin/src/graphql/queries/modQueueQuery.graphql +++ /dev/null @@ -1,68 +0,0 @@ -#import "../fragments/commentView.graphql" - -query ModQueue ($asset_id: ID, $sort: SORT_ORDER) { - all: comments(query: { - statuses: [NONE, PREMOD, ACCEPTED, REJECTED], - asset_id: $asset_id, - sort: $sort - }) { - ...commentView - } - accepted: comments(query: { - statuses: [ACCEPTED], - asset_id: $asset_id, - sort: $sort - }) { - ...commentView - } - premod: comments(query: { - statuses: [PREMOD], - asset_id: $asset_id, - sort: $sort - }) { - ...commentView - } - flagged: comments(query: { - action_type: FLAG, - asset_id: $asset_id, - statuses: [NONE, PREMOD], - sort: $sort - }) { - ...commentView - } - rejected: comments(query: { - statuses: [REJECTED], - asset_id: $asset_id, - sort: $sort - }) { - ...commentView - } - assets: assets { - id - title - url - } - allCount: commentCount(query: { - asset_id: $asset_id - }) - acceptedCount: commentCount(query: { - statuses: [ACCEPTED], - asset_id: $asset_id - }) - premodCount: commentCount(query: { - statuses: [PREMOD], - asset_id: $asset_id - }) - rejectedCount: commentCount(query: { - statuses: [REJECTED], - asset_id: $asset_id - }) - flaggedCount: commentCount(query: { - action_type: FLAG, - asset_id: $asset_id, - statuses: [NONE, PREMOD] - }) - settings { - organizationName - } -} diff --git a/client/coral-admin/src/graphql/queries/modUserFlaggedQuery.graphql b/client/coral-admin/src/graphql/queries/modUserFlaggedQuery.graphql deleted file mode 100644 index c99d94583..000000000 --- a/client/coral-admin/src/graphql/queries/modUserFlaggedQuery.graphql +++ /dev/null @@ -1,26 +0,0 @@ -query Users ($action_type: ACTION_TYPE) { - users (query:{action_type: $action_type}){ - id - username - status - roles - actions{ - id - created_at - ... on FlagAction { - reason - message - user { - id - username - } - } - } - action_summaries { - count - ... on FlagActionSummary { - reason - } - } - } -} diff --git a/client/coral-admin/src/graphql/queries/userDetail.graphql b/client/coral-admin/src/graphql/queries/userDetail.graphql deleted file mode 100644 index c375b80ff..000000000 --- a/client/coral-admin/src/graphql/queries/userDetail.graphql +++ /dev/null @@ -1,13 +0,0 @@ -query UserDetail ($author_id: ID!) { - user(id: $author_id) { - id - username - created_at - profiles { - id - provider - } - } - totalComments: commentCount(query: {author_id: $author_id}) - rejectedComments: commentCount(query: {author_id: $author_id, statuses: [REJECTED]}) -} diff --git a/client/coral-admin/src/reducers/moderation.js b/client/coral-admin/src/reducers/moderation.js index 4bcd82d47..10cbe0eca 100644 --- a/client/coral-admin/src/reducers/moderation.js +++ b/client/coral-admin/src/reducers/moderation.js @@ -10,6 +10,7 @@ const initialState = fromJS({ userDetailId: null, banDialog: false, shortcutsNoteVisible: window.localStorage.getItem('coral:shortcutsNote') || 'show', + sortOrder: 'REVERSE_CHRONOLOGICAL', suspendUserDialog: { show: false, userId: null, @@ -64,6 +65,8 @@ export default function moderation (state = initialState, action) { return state.set('userDetailId', action.userId); case actions.HIDE_USER_DETAIL: return state.set('userDetailId', null); + case actions.SET_SORT_ORDER: + return state.set('sortOrder', action.order); default : return state; } diff --git a/client/coral-admin/src/routes/Community/containers/Community.js b/client/coral-admin/src/routes/Community/containers/Community.js index 9167e2cd1..582b929ce 100644 --- a/client/coral-admin/src/routes/Community/containers/Community.js +++ b/client/coral-admin/src/routes/Community/containers/Community.js @@ -1,9 +1,8 @@ import React, {Component} from 'react'; import {connect} from 'react-redux'; import {bindActionCreators} from 'redux'; -import {compose} from 'react-apollo'; +import {compose, graphql, gql} from 'react-apollo'; -import {modUserFlaggedQuery} from 'coral-admin/src/graphql/queries'; import {banUser, setUserStatus, rejectUsername} from 'coral-admin/src/graphql/mutations'; import { @@ -31,6 +30,43 @@ class CommunityContainer extends Component { } } +export const withQuery = graphql(gql` + query Users($action_type: ACTION_TYPE) { + users(query:{action_type: $action_type}){ + id + username + status + roles + actions{ + id + created_at + ... on FlagAction { + reason + message + user { + id + username + } + } + } + action_summaries { + count + ... on FlagActionSummary { + reason + } + } + } + } +`, { + options: ({params: {action_type = 'FLAG'}}) => { + return { + variables: { + action_type: action_type + } + }; + } +}); + const mapStateToProps = (state) => ({ community: state.community.toJS() }); @@ -48,7 +84,7 @@ const mapDispatchToProps = (dispatch) => export default compose( connect(mapStateToProps, mapDispatchToProps), - modUserFlaggedQuery, + withQuery, banUser, setUserStatus, rejectUsername diff --git a/client/coral-admin/src/routes/Dashboard/containers/Dashboard.js b/client/coral-admin/src/routes/Dashboard/containers/Dashboard.js index 79f0b964f..17b15064a 100644 --- a/client/coral-admin/src/routes/Dashboard/containers/Dashboard.js +++ b/client/coral-admin/src/routes/Dashboard/containers/Dashboard.js @@ -1,8 +1,7 @@ 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 {compose, graphql, gql} from 'react-apollo'; import {Spinner} from 'coral-ui'; @@ -20,6 +19,38 @@ class DashboardContainer extends React.Component { } } +export const withQuery = graphql(gql` + query Metrics($from: Date!, $to: Date!) { + assetsByFlag: assetMetrics(from: $from, to: $to, sort: FLAG) { + ...metrics + } + assetsByActivity: assetMetrics(from: $from, to: $to, sort: ACTIVITY) { + ...metrics + } + } + fragment metrics on Asset { + id + title + url + author + created_at + commentCount + action_summaries { + actionCount + actionableItemCount + } + } +`, { + options: ({settings: {dashboardWindowStart, dashboardWindowEnd}}) => { + return { + variables: { + from: dashboardWindowStart, + to: dashboardWindowEnd + } + }; + } +}); + const mapStateToProps = (state) => { return { settings: state.settings.toJS(), @@ -29,5 +60,5 @@ const mapStateToProps = (state) => { export default compose( connect(mapStateToProps), - getMetrics + withQuery, )(DashboardContainer); diff --git a/client/coral-admin/src/routes/Install/containers/InstallContainer.js b/client/coral-admin/src/routes/Install/containers/Install.js similarity index 100% rename from client/coral-admin/src/routes/Install/containers/InstallContainer.js rename to client/coral-admin/src/routes/Install/containers/Install.js diff --git a/client/coral-admin/src/routes/Install/index.js b/client/coral-admin/src/routes/Install/index.js index 5c47e4060..94c7bf93f 100644 --- a/client/coral-admin/src/routes/Install/index.js +++ b/client/coral-admin/src/routes/Install/index.js @@ -1 +1 @@ -export {default} from './containers/InstallContainer.js'; +export {default} from './containers/Install.js'; diff --git a/client/coral-admin/src/routes/Moderation/components/Moderation.js b/client/coral-admin/src/routes/Moderation/components/Moderation.js index 10f775cd7..b3c5d68af 100644 --- a/client/coral-admin/src/routes/Moderation/components/Moderation.js +++ b/client/coral-admin/src/routes/Moderation/components/Moderation.js @@ -12,14 +12,13 @@ import ModerationMenu from './ModerationMenu'; import ModerationHeader from './ModerationHeader'; import NotFoundAsset from './NotFoundAsset'; import ModerationKeysModal from '../../../components/ModerationKeysModal'; -import UserDetail from './UserDetail'; +import UserDetail from '../containers/UserDetail'; const lang = new I18n(translations); export default class Moderation extends Component { state = { selectedIndex: 0, - sort: 'REVERSE_CHRONOLOGICAL' } componentWillMount() { @@ -76,11 +75,6 @@ export default class Moderation extends Component { } } - selectSort = (sort) => { - this.setState({sort}); - this.props.modQueueResort(sort); - } - suspendUser = async (args) => { this.props.hideSuspendUserDialog(); try { @@ -174,8 +168,8 @@ export default class Moderation extends Component { premodCount={data.premodCount} rejectedCount={data.rejectedCount} flaggedCount={data.flaggedCount} - selectSort={this.selectSort} - sort={this.state.sort} + selectSort={this.props.setSortOrder} + sort={this.props.moderation.sortOrder} /> { diff --git a/client/coral-admin/src/routes/Moderation/containers/Moderation.js b/client/coral-admin/src/routes/Moderation/containers/Moderation.js index 722b6a0b4..6c707a534 100644 --- a/client/coral-admin/src/routes/Moderation/containers/Moderation.js +++ b/client/coral-admin/src/routes/Moderation/containers/Moderation.js @@ -1,10 +1,9 @@ import React, {Component} from 'react'; import {connect} from 'react-redux'; import {bindActionCreators} from 'redux'; -import {compose} from 'react-apollo'; +import {compose, graphql, gql} 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'; @@ -18,7 +17,8 @@ import { hideSuspendUserDialog, hideShortcutsNote, viewUserDetail, - hideUserDetail + hideUserDetail, + setSortOrder, } from 'actions/moderation'; import {Spinner} from 'coral-ui'; @@ -36,6 +36,46 @@ class ModerationContainer extends Component { } } + loadMore = ({limit = 10, cursor, sort, tab, asset_id}) => { + let variables = { + limit, + cursor, + sort, + asset_id + }; + switch(tab) { + case 'all': + variables.statuses = null; + break; + case 'accepted': + variables.statuses = ['ACCEPTED']; + break; + case 'premod': + variables.statuses = ['PREMOD']; + break; + case 'flagged': + variables.statuses = ['NONE', 'PREMOD']; + variables.action_type = 'FLAG'; + break; + case 'rejected': + variables.statuses = ['REJECTED']; + break; + } + return this.props.data.fetchMore({ + query: LOAD_MORE_QUERY, + variables, + updateQuery: (oldData, {fetchMoreResult:{comments}}) => { + return { + ...oldData, + [tab]: [ + ...oldData[tab], + ...comments + ] + }; + } + }); + }; + render () { const {data} = this.props; @@ -46,10 +86,172 @@ class ModerationContainer extends Component { if (data.error) { return
Error
; } - return ; + return ; } } +const commentView = gql` + fragment commentView on Comment { + id + body + created_at + status + user { + id + name: username + status + } + asset { + id + title + url + } + action_summaries { + count + ... on FlagActionSummary { + reason + } + } + actions { + ... on FlagAction { + reason + message + user { + username + } + } + } + } +`; + +const LOAD_MORE_QUERY = gql` + query LoadMoreModQueue($limit: Int = 10, $cursor: Date, $sort: SORT_ORDER, $asset_id: ID, $statuses:[COMMENT_STATUS!], $action_type: ACTION_TYPE) { + comments(query: {limit: $limit, cursor: $cursor, asset_id: $asset_id, statuses: $statuses, sort: $sort, action_type: $action_type}) { + ...commentView + action_summaries { + count + ... on FlagActionSummary { + reason + } + } + } + } + ${commentView} +`; + +const withQuery = graphql(gql` + query ModQueue($asset_id: ID, $sort: SORT_ORDER) { + all: comments(query: { + statuses: [NONE, PREMOD, ACCEPTED, REJECTED], + asset_id: $asset_id, + sort: $sort + }) { + ...commentView + } + accepted: comments(query: { + statuses: [ACCEPTED], + asset_id: $asset_id, + sort: $sort + }) { + ...commentView + } + premod: comments(query: { + statuses: [PREMOD], + asset_id: $asset_id, + sort: $sort + }) { + ...commentView + } + flagged: comments(query: { + action_type: FLAG, + asset_id: $asset_id, + statuses: [NONE, PREMOD], + sort: $sort + }) { + ...commentView + } + rejected: comments(query: { + statuses: [REJECTED], + asset_id: $asset_id, + sort: $sort + }) { + ...commentView + } + assets: assets { + id + title + url + } + allCount: commentCount(query: { + asset_id: $asset_id + }) + acceptedCount: commentCount(query: { + statuses: [ACCEPTED], + asset_id: $asset_id + }) + premodCount: commentCount(query: { + statuses: [PREMOD], + asset_id: $asset_id + }) + rejectedCount: commentCount(query: { + statuses: [REJECTED], + asset_id: $asset_id + }) + flaggedCount: commentCount(query: { + action_type: FLAG, + asset_id: $asset_id, + statuses: [NONE, PREMOD] + }) + settings { + organizationName + } + } + ${commentView} +`, { + options: ({params: {id = null}, moderation: {sortOrder}}) => { + return { + variables: { + asset_id: id, + sort: sortOrder, + } + }; + }, +}); + +const withQueueCountPolling = graphql(gql` + query Counts($asset_id: ID) { + allCount: commentCount(query: { + asset_id: $asset_id + }) + acceptedCount: commentCount(query: { + statuses: [ACCEPTED], + asset_id: $asset_id + }) + premodCount: commentCount(query: { + statuses: [PREMOD], + asset_id: $asset_id + }) + rejectedCount: commentCount(query: { + statuses: [REJECTED], + asset_id: $asset_id + }) + flaggedCount: commentCount(query: { + action_type: FLAG, + asset_id: $asset_id, + statuses: [NONE, PREMOD] + }) + } +`, { + options: ({params: {id = null}}) => { + return { + pollInterval: 5000, + variables: { + asset_id: id + } + }; + } +}); + const mapStateToProps = (state) => ({ moderation: state.moderation.toJS(), settings: state.settings.toJS(), @@ -70,14 +272,15 @@ const mapDispatchToProps = (dispatch) => ({ hideSuspendUserDialog, viewUserDetail, hideUserDetail, + setSortOrder, }, dispatch), }); export default compose( connect(mapStateToProps, mapDispatchToProps), setCommentStatus, - getQueueCounts, banUser, suspendUser, - modQueueQuery, + withQueueCountPolling, + withQuery, )(ModerationContainer); diff --git a/client/coral-admin/src/routes/Moderation/containers/UserDetail.js b/client/coral-admin/src/routes/Moderation/containers/UserDetail.js index 6923eb96e..f9dc3eb0b 100644 --- a/client/coral-admin/src/routes/Moderation/containers/UserDetail.js +++ b/client/coral-admin/src/routes/Moderation/containers/UserDetail.js @@ -1,6 +1,5 @@ import React, {PropTypes} from 'react'; -import {compose} from 'react-apollo'; -import {getUserDetail} from 'coral-admin/src/graphql/queries'; +import {compose, graphql, gql} from 'react-apollo'; import UserDetail from '../components/UserDetail'; class UserDetailContainer extends React.Component { @@ -14,6 +13,28 @@ class UserDetailContainer extends React.Component { } } +export const withQuery = graphql(gql` + query UserDetail($author_id: ID!) { + user(id: $author_id) { + id + username + created_at + profiles { + id + provider + } + } + totalComments: commentCount(query: {author_id: $author_id}) + rejectedComments: commentCount(query: {author_id: $author_id, statuses: [REJECTED]}) + } +`, { + options: ({id}) => { + return { + variables: {author_id: id} + }; + } +}); + export default compose( - getUserDetail + withQuery, )(UserDetailContainer); From 02313580757481c499014e835577b0a2a3123138 Mon Sep 17 00:00:00 2001 From: Chi Vinh Le Date: Wed, 24 May 2017 21:00:05 +0700 Subject: [PATCH 18/78] Correctly set roles --- services/users.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/services/users.js b/services/users.js index b6a5e0404..9b4304e1e 100644 --- a/services/users.js +++ b/services/users.js @@ -388,11 +388,11 @@ module.exports = class UsersService { // User role is not supported! Error out here. return Promise.reject(new Error(`role ${role} is not supported`)); - } else { + } else if(role) { roles.push(role); } - return UserModel.update({id}, {$set: {roles: [role]}}); + return UserModel.update({id}, {$set: {roles}}); } /** From a9b4de1f5c618be0157913aaa3fa914b922cefbd Mon Sep 17 00:00:00 2001 From: Chi Vinh Le Date: Wed, 24 May 2017 21:00:17 +0700 Subject: [PATCH 19/78] Wrap queries with hocs --- client/coral-admin/src/graphql/fragments.js | 0 client/coral-admin/src/graphql/index.js | 23 ++++++++++++++ client/coral-admin/src/index.js | 1 + .../routes/Community/components/Community.js | 7 ++--- .../Community/components/FlaggedAccounts.js | 6 ++-- .../routes/Community/components/Loading.js | 7 ----- .../routes/Community/containers/Community.js | 15 ++++++++-- .../routes/Dashboard/components/Dashboard.js | 2 +- .../routes/Dashboard/containers/Dashboard.js | 17 ++++++----- .../Moderation/components/Moderation.js | 30 +++++++++---------- .../Moderation/components/UserDetail.js | 10 ++----- .../Moderation/containers/Moderation.js | 24 ++++++++------- .../Moderation/containers/UserDetail.js | 11 +++++-- client/coral-framework/utils/index.js | 3 +- 14 files changed, 91 insertions(+), 65 deletions(-) delete mode 100644 client/coral-admin/src/graphql/fragments.js create mode 100644 client/coral-admin/src/graphql/index.js delete mode 100644 client/coral-admin/src/routes/Community/components/Loading.js diff --git a/client/coral-admin/src/graphql/fragments.js b/client/coral-admin/src/graphql/fragments.js deleted file mode 100644 index e69de29bb..000000000 diff --git a/client/coral-admin/src/graphql/index.js b/client/coral-admin/src/graphql/index.js new file mode 100644 index 000000000..b3dcae2f0 --- /dev/null +++ b/client/coral-admin/src/graphql/index.js @@ -0,0 +1,23 @@ +import {gql} from 'react-apollo'; +import {add} from 'coral-framework/services/graphqlRegistry'; + +const extension = { + fragments: { + Metrics: gql` + fragment CoralAdmin_Metrics on Asset { + id + title + url + author + created_at + commentCount + action_summaries { + actionCount + actionableItemCount + } + } + `, + }, +}; + +add(extension); diff --git a/client/coral-admin/src/index.js b/client/coral-admin/src/index.js index 9a532856e..f54208518 100644 --- a/client/coral-admin/src/index.js +++ b/client/coral-admin/src/index.js @@ -8,6 +8,7 @@ import store from './services/store'; import App from './components/App'; import 'react-mdl/extra/material.js'; +import './graphql'; render( diff --git a/client/coral-admin/src/routes/Community/components/Community.js b/client/coral-admin/src/routes/Community/components/Community.js index 8e25a8e41..38a75004f 100644 --- a/client/coral-admin/src/routes/Community/components/Community.js +++ b/client/coral-admin/src/routes/Community/components/Community.js @@ -55,8 +55,9 @@ export default class Community extends Component { } getTabContent(searchValue, props) { - const {community, data} = props; + const {community, root: {users}} = props; const activeTab = props.route.path === ':id' ? 'flagged' : props.route.path; + console.log(props); if (activeTab === 'people') { return ( @@ -78,9 +79,7 @@ export default class Community extends Component { return (
{ - const {commenters, isFetching} = props; - const hasResults = !isFetching && commenters && !!commenters.length; + const {commenters} = props; + const hasResults = commenters && !!commenters.length; // if (commenter.status === 'PENDING' && commenter.actions.length > 0) { return (
- { isFetching && } { hasResults ? commenters.map((commenter, index) => { diff --git a/client/coral-admin/src/routes/Community/components/Loading.js b/client/coral-admin/src/routes/Community/components/Loading.js deleted file mode 100644 index beda271eb..000000000 --- a/client/coral-admin/src/routes/Community/components/Loading.js +++ /dev/null @@ -1,7 +0,0 @@ -import React from 'react'; - -const Loading = () => ( -

Loading results

-); - -export default Loading; diff --git a/client/coral-admin/src/routes/Community/containers/Community.js b/client/coral-admin/src/routes/Community/containers/Community.js index 582b929ce..9ad808716 100644 --- a/client/coral-admin/src/routes/Community/containers/Community.js +++ b/client/coral-admin/src/routes/Community/containers/Community.js @@ -1,7 +1,9 @@ import React, {Component} from 'react'; import {connect} from 'react-redux'; import {bindActionCreators} from 'redux'; -import {compose, graphql, gql} from 'react-apollo'; +import {compose, gql} from 'react-apollo'; +import withQuery from 'coral-framework/hocs/withQuery'; +import {Spinner} from 'coral-ui'; import {banUser, setUserStatus, rejectUsername} from 'coral-admin/src/graphql/mutations'; @@ -24,13 +26,20 @@ class CommunityContainer extends Component { } render() { + if (this.props.data.error) { + return
{this.props.data.error.message}
; + } + + if (!('users' in this.props.root)) { + return
; + } return ( ); } } -export const withQuery = graphql(gql` +export const withCommunityQuery = withQuery(gql` query Users($action_type: ACTION_TYPE) { users(query:{action_type: $action_type}){ id @@ -84,7 +93,7 @@ const mapDispatchToProps = (dispatch) => export default compose( connect(mapStateToProps, mapDispatchToProps), - withQuery, + withCommunityQuery, banUser, setUserStatus, rejectUsername diff --git a/client/coral-admin/src/routes/Dashboard/components/Dashboard.js b/client/coral-admin/src/routes/Dashboard/components/Dashboard.js index 06c9fd0b9..ba224a3b9 100644 --- a/client/coral-admin/src/routes/Dashboard/components/Dashboard.js +++ b/client/coral-admin/src/routes/Dashboard/components/Dashboard.js @@ -4,7 +4,7 @@ import ActivityWidget from './ActivityWidget'; import CountdownTimer from './CountdownTimer'; import styles from './Dashboard.css'; -export default ({data: {assetsByActivity, assetsByFlag}, reloadData}) => ( +export default ({root: {assetsByActivity, assetsByFlag}, reloadData}) => (
diff --git a/client/coral-admin/src/routes/Dashboard/containers/Dashboard.js b/client/coral-admin/src/routes/Dashboard/containers/Dashboard.js index 17b15064a..4f412efef 100644 --- a/client/coral-admin/src/routes/Dashboard/containers/Dashboard.js +++ b/client/coral-admin/src/routes/Dashboard/containers/Dashboard.js @@ -1,7 +1,8 @@ import React from 'react'; import {connect} from 'react-redux'; import Dashboard from '../components/Dashboard'; -import {compose, graphql, gql} from 'react-apollo'; +import {compose, gql} from 'react-apollo'; +import withQuery from 'coral-framework/hocs/withQuery'; import {Spinner} from 'coral-ui'; @@ -12,23 +13,23 @@ class DashboardContainer extends React.Component { } render () { - if (this.props.data && this.props.data.loading) { + if (this.props.data.loading) { return ; } return ; } } -export const withQuery = graphql(gql` - query Metrics($from: Date!, $to: Date!) { +export const witDashboardQuery = withQuery(gql` + query CoralAdmin_Metrics($from: Date!, $to: Date!) { assetsByFlag: assetMetrics(from: $from, to: $to, sort: FLAG) { - ...metrics + ...CoralAdmin_Metrics } assetsByActivity: assetMetrics(from: $from, to: $to, sort: ACTIVITY) { - ...metrics + ...CoralAdmin_Metrics } } - fragment metrics on Asset { + fragment CoralAdmin_Metrics on Asset { id title url @@ -60,5 +61,5 @@ const mapStateToProps = (state) => { export default compose( connect(mapStateToProps), - withQuery, + witDashboardQuery, )(DashboardContainer); diff --git a/client/coral-admin/src/routes/Moderation/components/Moderation.js b/client/coral-admin/src/routes/Moderation/components/Moderation.js index b3c5d68af..f9fd0166e 100644 --- a/client/coral-admin/src/routes/Moderation/components/Moderation.js +++ b/client/coral-admin/src/routes/Moderation/components/Moderation.js @@ -52,9 +52,9 @@ export default class Moderation extends Component { } getComments = () => { - const {data, route} = this.props; + const {root, route} = this.props; const activeTab = route.path === ':id' ? 'premod' : route.path; - return data[activeTab]; + return root[activeTab]; } select = (next) => () => { @@ -124,7 +124,7 @@ export default class Moderation extends Component { } render () { - const {data, moderation, settings, assets, viewUserDetail, hideUserDetail, ...props} = this.props; + const {root, 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; @@ -138,23 +138,23 @@ export default class Moderation extends Component { } } - const comments = data[activeTab]; + const comments = root[activeTab]; let activeTabCount; switch(activeTab) { case 'all': - activeTabCount = data.allCount; + activeTabCount = root.allCount; break; case 'accepted': - activeTabCount = data.acceptedCount; + activeTabCount = root.acceptedCount; break; case 'premod': - activeTabCount = data.premodCount; + activeTabCount = root.premodCount; break; case 'flagged': - activeTabCount = data.flaggedCount; + activeTabCount = root.flaggedCount; break; case 'rejected': - activeTabCount = data.rejectedCount; + activeTabCount = root.rejectedCount; break; } @@ -163,11 +163,11 @@ export default class Moderation extends Component { @@ -205,7 +205,7 @@ export default class Moderation extends Component { open={moderation.suspendUserDialog.show} username={moderation.suspendUserDialog.username} userId={moderation.suspendUserDialog.userId} - organizationName={data.settings.organizationName} + organizationName={root.settings.organizationName} onCancel={props.hideSuspendUserDialog} onPerform={this.suspendUser} /> diff --git a/client/coral-admin/src/routes/Moderation/components/UserDetail.js b/client/coral-admin/src/routes/Moderation/components/UserDetail.js index f651eb91b..49fd506e0 100644 --- a/client/coral-admin/src/routes/Moderation/components/UserDetail.js +++ b/client/coral-admin/src/routes/Moderation/components/UserDetail.js @@ -7,7 +7,7 @@ export default class UserDetail extends React.Component { static propTypes = { id: PropTypes.string.isRequired, hideUserDetail: PropTypes.func.isRequired, - data: PropTypes.object.isRequired, + root: PropTypes.object.isRequired, } copyPermalink = () => { @@ -21,13 +21,7 @@ export default class UserDetail extends React.Component { } render () { - const {data, hideUserDetail} = this.props; - - if (!('user' in data)) { - return null; - } - - const {user, totalComments, rejectedComments} = data; + const {root: {user, totalComments, rejectedComments}, hideUserDetail} = this.props; const localProfile = user.profiles.find((p) => p.provider === 'local'); let profile; if (localProfile) { diff --git a/client/coral-admin/src/routes/Moderation/containers/Moderation.js b/client/coral-admin/src/routes/Moderation/containers/Moderation.js index 6c707a534..4d831c841 100644 --- a/client/coral-admin/src/routes/Moderation/containers/Moderation.js +++ b/client/coral-admin/src/routes/Moderation/containers/Moderation.js @@ -1,8 +1,9 @@ import React, {Component} from 'react'; import {connect} from 'react-redux'; import {bindActionCreators} from 'redux'; -import {compose, graphql, gql} from 'react-apollo'; +import {compose, gql} from 'react-apollo'; import isEqual from 'lodash/isEqual'; +import withQuery from 'coral-framework/hocs/withQuery'; import {banUser, setCommentStatus, suspendUser} from '../../../graphql/mutations'; @@ -31,8 +32,8 @@ class ModerationContainer extends Component { componentWillReceiveProps(nextProps) { const {updateAssets} = this.props; - if(!isEqual(nextProps.data.assets, this.props.data.assets)) { - updateAssets(nextProps.data.assets); + if(!isEqual(nextProps.root.assets, this.props.root.assets)) { + updateAssets(nextProps.root.assets); } } @@ -77,15 +78,16 @@ class ModerationContainer extends Component { }; render () { - const {data} = this.props; - - if (!('premodCount' in data)) { - return
; - } + const {root, data} = this.props; if (data.error) { return
Error
; } + + if (!('premodCount' in root)) { + return
; + } + return ; } } @@ -139,7 +141,7 @@ const LOAD_MORE_QUERY = gql` ${commentView} `; -const withQuery = graphql(gql` +const withModQueueQuery = withQuery(gql` query ModQueue($asset_id: ID, $sort: SORT_ORDER) { all: comments(query: { statuses: [NONE, PREMOD, ACCEPTED, REJECTED], @@ -218,7 +220,7 @@ const withQuery = graphql(gql` }, }); -const withQueueCountPolling = graphql(gql` +const withQueueCountPolling = withQuery(gql` query Counts($asset_id: ID) { allCount: commentCount(query: { asset_id: $asset_id @@ -282,5 +284,5 @@ export default compose( banUser, suspendUser, withQueueCountPolling, - withQuery, + withModQueueQuery, )(ModerationContainer); diff --git a/client/coral-admin/src/routes/Moderation/containers/UserDetail.js b/client/coral-admin/src/routes/Moderation/containers/UserDetail.js index f9dc3eb0b..d1f43716c 100644 --- a/client/coral-admin/src/routes/Moderation/containers/UserDetail.js +++ b/client/coral-admin/src/routes/Moderation/containers/UserDetail.js @@ -1,6 +1,7 @@ import React, {PropTypes} from 'react'; -import {compose, graphql, gql} from 'react-apollo'; +import {compose, gql} from 'react-apollo'; import UserDetail from '../components/UserDetail'; +import withQuery from 'coral-framework/hocs/withQuery'; class UserDetailContainer extends React.Component { static propTypes = { @@ -9,11 +10,15 @@ class UserDetailContainer extends React.Component { } render () { + if (!('user' in this.props.root)) { + return null; + } + return ; } } -export const withQuery = graphql(gql` +export const withUserDetailQuery = withQuery(gql` query UserDetail($author_id: ID!) { user(id: $author_id) { id @@ -36,5 +41,5 @@ export const withQuery = graphql(gql` }); export default compose( - withQuery, + withUserDetailQuery, )(UserDetailContainer); diff --git a/client/coral-framework/utils/index.js b/client/coral-framework/utils/index.js index 8fb9cbf81..6700dd08b 100644 --- a/client/coral-framework/utils/index.js +++ b/client/coral-framework/utils/index.js @@ -55,11 +55,12 @@ export function separateDataAndRoot( subscribeToMore, updateQuery, variables, + error, ...root, }) { return { data: {fetchMore, loading, networkStatus, refetch, startPolling, - stopPolling, subscribeToMore, updateQuery, variables}, + stopPolling, subscribeToMore, updateQuery, variables, error}, root, }; } From 5e2fa72466bfe44c7b1dbffdbfff97a22b104605 Mon Sep 17 00:00:00 2001 From: Chi Vinh Le Date: Wed, 24 May 2017 22:05:41 +0700 Subject: [PATCH 20/78] Support extendable queries --- .../routes/Moderation/components/Comment.js | 32 +++++++++-- .../Moderation/components/Moderation.js | 2 + .../Moderation/components/ModerationQueue.js | 4 +- .../Moderation/components/UserDetail.js | 7 ++- .../routes/Moderation/containers/Comment.js | 56 +++++++++++++++++++ .../Moderation/containers/Moderation.js | 52 ++++------------- .../Moderation/containers/UserDetail.js | 9 +++ 7 files changed, 112 insertions(+), 50 deletions(-) create mode 100644 client/coral-admin/src/routes/Moderation/containers/Comment.js diff --git a/client/coral-admin/src/routes/Moderation/components/Comment.js b/client/coral-admin/src/routes/Moderation/components/Comment.js index 6246dd5b9..c2b6b39f4 100644 --- a/client/coral-admin/src/routes/Moderation/components/Comment.js +++ b/client/coral-admin/src/routes/Moderation/components/Comment.js @@ -42,8 +42,8 @@ const Comment = ({ } // since words are checked against word boundaries on the backend, - // this should be the behavior on the front end as well. - // currently the highlighter plugin does not support this out of the box. + // should be the behavior on the front end as well. + // currently the highlighter plugin does not support out of the box. const searchWords = [...suspectWords, ...bannedWords] .filter((w) => { return new RegExp(`(^|\\s)${w}(\\s|$)`).test(comment.body); @@ -88,7 +88,12 @@ const Comment = ({ {lang.t('comment.banned_user')} : null} - +
Story: {comment.asset.title} @@ -110,7 +115,12 @@ const Comment = ({ {lang.t('comment.view_context')}

- +
{links ? @@ -141,12 +151,22 @@ const Comment = ({ ); })}
- +
- +
{flagActions && flagActions.length ? { const status = comment.action_summaries ? 'FLAGGED' : comment.status; return {user.username} {profile && this.profile = ref} value={profile} />} - +

Member since {new Date(user.created_at).toLocaleString()}


diff --git a/client/coral-admin/src/routes/Moderation/containers/Comment.js b/client/coral-admin/src/routes/Moderation/containers/Comment.js new file mode 100644 index 000000000..d85b90253 --- /dev/null +++ b/client/coral-admin/src/routes/Moderation/containers/Comment.js @@ -0,0 +1,56 @@ +import {gql} from 'react-apollo'; +import Comment from '../components/Comment'; +import {getSlotsFragments} from 'coral-framework/helpers/plugins'; +import withFragments from 'coral-framework/hocs/withFragments'; + +const pluginFragments = getSlotsFragments([ + 'adminCommentInfoBar', + 'adminCommentContent', + 'adminSideActions', + 'adminCommentDetailArea', +]); + +export default withFragments({ + root: gql` + fragment Comment_root on RootQuery { + __typename + ${pluginFragments.spreads('root')} + } + ${pluginFragments.definitions('root')} + `, + comment: gql` + fragment Comment_comment on Comment { + id + body + created_at + status + user { + id + name: username + status + } + asset { + id + title + url + } + action_summaries { + count + ... on FlagActionSummary { + reason + } + } + actions { + ... on FlagAction { + reason + message + user { + username + } + } + } + ${pluginFragments.spreads('comment')} + } + ${pluginFragments.definitions('comment')} + ` +})(Comment); diff --git a/client/coral-admin/src/routes/Moderation/containers/Moderation.js b/client/coral-admin/src/routes/Moderation/containers/Moderation.js index 4d831c841..e0e8f7694 100644 --- a/client/coral-admin/src/routes/Moderation/containers/Moderation.js +++ b/client/coral-admin/src/routes/Moderation/containers/Moderation.js @@ -4,6 +4,7 @@ import {bindActionCreators} from 'redux'; import {compose, gql} from 'react-apollo'; import isEqual from 'lodash/isEqual'; import withQuery from 'coral-framework/hocs/withQuery'; +import {getDefinitionName} from 'coral-framework/utils'; import {banUser, setCommentStatus, suspendUser} from '../../../graphql/mutations'; @@ -24,6 +25,7 @@ import { import {Spinner} from 'coral-ui'; import Moderation from '../components/Moderation'; +import Comment from './Comment'; class ModerationContainer extends Component { componentWillMount() { @@ -92,44 +94,10 @@ class ModerationContainer extends Component { } } -const commentView = gql` - fragment commentView on Comment { - id - body - created_at - status - user { - id - name: username - status - } - asset { - id - title - url - } - action_summaries { - count - ... on FlagActionSummary { - reason - } - } - actions { - ... on FlagAction { - reason - message - user { - username - } - } - } - } -`; - const LOAD_MORE_QUERY = gql` query LoadMoreModQueue($limit: Int = 10, $cursor: Date, $sort: SORT_ORDER, $asset_id: ID, $statuses:[COMMENT_STATUS!], $action_type: ACTION_TYPE) { comments(query: {limit: $limit, cursor: $cursor, asset_id: $asset_id, statuses: $statuses, sort: $sort, action_type: $action_type}) { - ...commentView + ...${getDefinitionName(Comment.fragments.comment)} action_summaries { count ... on FlagActionSummary { @@ -138,7 +106,7 @@ const LOAD_MORE_QUERY = gql` } } } - ${commentView} + ${Comment.fragments.comment} `; const withModQueueQuery = withQuery(gql` @@ -148,21 +116,21 @@ const withModQueueQuery = withQuery(gql` asset_id: $asset_id, sort: $sort }) { - ...commentView + ...${getDefinitionName(Comment.fragments.comment)} } accepted: comments(query: { statuses: [ACCEPTED], asset_id: $asset_id, sort: $sort }) { - ...commentView + ...${getDefinitionName(Comment.fragments.comment)} } premod: comments(query: { statuses: [PREMOD], asset_id: $asset_id, sort: $sort }) { - ...commentView + ...${getDefinitionName(Comment.fragments.comment)} } flagged: comments(query: { action_type: FLAG, @@ -170,14 +138,14 @@ const withModQueueQuery = withQuery(gql` statuses: [NONE, PREMOD], sort: $sort }) { - ...commentView + ...${getDefinitionName(Comment.fragments.comment)} } rejected: comments(query: { statuses: [REJECTED], asset_id: $asset_id, sort: $sort }) { - ...commentView + ...${getDefinitionName(Comment.fragments.comment)} } assets: assets { id @@ -208,7 +176,7 @@ const withModQueueQuery = withQuery(gql` organizationName } } - ${commentView} + ${Comment.fragments.comment} `, { options: ({params: {id = null}, moderation: {sortOrder}}) => { return { diff --git a/client/coral-admin/src/routes/Moderation/containers/UserDetail.js b/client/coral-admin/src/routes/Moderation/containers/UserDetail.js index d1f43716c..acc129074 100644 --- a/client/coral-admin/src/routes/Moderation/containers/UserDetail.js +++ b/client/coral-admin/src/routes/Moderation/containers/UserDetail.js @@ -2,6 +2,11 @@ import React, {PropTypes} from 'react'; import {compose, gql} from 'react-apollo'; import UserDetail from '../components/UserDetail'; import withQuery from 'coral-framework/hocs/withQuery'; +import {getSlotsFragments} from 'coral-framework/helpers/plugins'; + +const pluginFragments = getSlotsFragments([ + 'userProfile', +]); class UserDetailContainer extends React.Component { static propTypes = { @@ -28,10 +33,14 @@ export const withUserDetailQuery = withQuery(gql` id provider } + ${pluginFragments.spreads('user')} } totalComments: commentCount(query: {author_id: $author_id}) rejectedComments: commentCount(query: {author_id: $author_id, statuses: [REJECTED]}) + ${pluginFragments.spreads('root')} } + ${pluginFragments.definitions('user')} + ${pluginFragments.definitions('root')} `, { options: ({id}) => { return { From a3755b75051439fa988f6036a309c6d3cc8e2252 Mon Sep 17 00:00:00 2001 From: Chi Vinh Le Date: Wed, 24 May 2017 22:24:01 +0700 Subject: [PATCH 21/78] Use unique names --- client/coral-admin/src/graphql/mutations/index.js | 10 +++++----- .../src/routes/Community/containers/Community.js | 2 +- .../src/routes/Dashboard/containers/Dashboard.js | 8 ++++---- .../src/routes/Moderation/containers/Comment.js | 4 ++-- .../src/routes/Moderation/containers/Moderation.js | 6 +++--- .../src/routes/Moderation/containers/UserDetail.js | 2 +- 6 files changed, 16 insertions(+), 16 deletions(-) diff --git a/client/coral-admin/src/graphql/mutations/index.js b/client/coral-admin/src/graphql/mutations/index.js index 3aef68ebc..5c530d159 100644 --- a/client/coral-admin/src/graphql/mutations/index.js +++ b/client/coral-admin/src/graphql/mutations/index.js @@ -12,7 +12,7 @@ export const banUser = graphql(SET_USER_STATUS, { userId, status: 'BANNED' }, - refetchQueries: ['Users'] + refetchQueries: ['Admin_Community'] }); }}), }); @@ -25,7 +25,7 @@ export const setUserStatus = graphql(SET_USER_STATUS, { userId, status: 'APPROVED' }, - refetchQueries: ['Users'] + refetchQueries: ['Admin_Community'] }); } }) @@ -50,7 +50,7 @@ export const rejectUsername = graphql(REJECT_USERNAME, { variables: { input, }, - refetchQueries: ['Users'] + refetchQueries: ['Admin_Community'] }); } }) @@ -66,7 +66,7 @@ export const setCommentStatus = graphql(SET_COMMENT_STATUS, { status: 'ACCEPTED' }, updateQueries: { - ModQueue: (oldData) => { + Admin_Moderation: (oldData) => { const comment = views.reduce((comment, view) => { return comment ? comment : oldData[view].find((c) => c.id === commentId); }, null); @@ -111,7 +111,7 @@ export const setCommentStatus = graphql(SET_COMMENT_STATUS, { status: 'REJECTED' }, updateQueries: { - ModQueue: (oldData) => { + Admin_Moderation: (oldData) => { const comment = views.reduce((comment, view) => { return comment ? comment : oldData[view].find((c) => c.id === commentId); }, null); diff --git a/client/coral-admin/src/routes/Community/containers/Community.js b/client/coral-admin/src/routes/Community/containers/Community.js index 9ad808716..f9468c0aa 100644 --- a/client/coral-admin/src/routes/Community/containers/Community.js +++ b/client/coral-admin/src/routes/Community/containers/Community.js @@ -40,7 +40,7 @@ class CommunityContainer extends Component { } export const withCommunityQuery = withQuery(gql` - query Users($action_type: ACTION_TYPE) { + query Admin_Community($action_type: ACTION_TYPE) { users(query:{action_type: $action_type}){ id username diff --git a/client/coral-admin/src/routes/Dashboard/containers/Dashboard.js b/client/coral-admin/src/routes/Dashboard/containers/Dashboard.js index 4f412efef..60925e09e 100644 --- a/client/coral-admin/src/routes/Dashboard/containers/Dashboard.js +++ b/client/coral-admin/src/routes/Dashboard/containers/Dashboard.js @@ -21,15 +21,15 @@ class DashboardContainer extends React.Component { } export const witDashboardQuery = withQuery(gql` - query CoralAdmin_Metrics($from: Date!, $to: Date!) { + query Admin_Dashboard($from: Date!, $to: Date!) { assetsByFlag: assetMetrics(from: $from, to: $to, sort: FLAG) { - ...CoralAdmin_Metrics + ...Admin_Metrics } assetsByActivity: assetMetrics(from: $from, to: $to, sort: ACTIVITY) { - ...CoralAdmin_Metrics + ...Admin_Metrics } } - fragment CoralAdmin_Metrics on Asset { + fragment Admin_Metrics on Asset { id title url diff --git a/client/coral-admin/src/routes/Moderation/containers/Comment.js b/client/coral-admin/src/routes/Moderation/containers/Comment.js index d85b90253..a0a209865 100644 --- a/client/coral-admin/src/routes/Moderation/containers/Comment.js +++ b/client/coral-admin/src/routes/Moderation/containers/Comment.js @@ -12,14 +12,14 @@ const pluginFragments = getSlotsFragments([ export default withFragments({ root: gql` - fragment Comment_root on RootQuery { + fragment Admin_Moderation_Comment_root on RootQuery { __typename ${pluginFragments.spreads('root')} } ${pluginFragments.definitions('root')} `, comment: gql` - fragment Comment_comment on Comment { + fragment Admin_Moderation_Comment_comment on Comment { id body created_at diff --git a/client/coral-admin/src/routes/Moderation/containers/Moderation.js b/client/coral-admin/src/routes/Moderation/containers/Moderation.js index e0e8f7694..ff0223ff1 100644 --- a/client/coral-admin/src/routes/Moderation/containers/Moderation.js +++ b/client/coral-admin/src/routes/Moderation/containers/Moderation.js @@ -95,7 +95,7 @@ class ModerationContainer extends Component { } const LOAD_MORE_QUERY = gql` - query LoadMoreModQueue($limit: Int = 10, $cursor: Date, $sort: SORT_ORDER, $asset_id: ID, $statuses:[COMMENT_STATUS!], $action_type: ACTION_TYPE) { + query Admin_Moderation_LoadMore($limit: Int = 10, $cursor: Date, $sort: SORT_ORDER, $asset_id: ID, $statuses:[COMMENT_STATUS!], $action_type: ACTION_TYPE) { comments(query: {limit: $limit, cursor: $cursor, asset_id: $asset_id, statuses: $statuses, sort: $sort, action_type: $action_type}) { ...${getDefinitionName(Comment.fragments.comment)} action_summaries { @@ -110,7 +110,7 @@ const LOAD_MORE_QUERY = gql` `; const withModQueueQuery = withQuery(gql` - query ModQueue($asset_id: ID, $sort: SORT_ORDER) { + query Admin_Moderation($asset_id: ID, $sort: SORT_ORDER) { all: comments(query: { statuses: [NONE, PREMOD, ACCEPTED, REJECTED], asset_id: $asset_id, @@ -189,7 +189,7 @@ const withModQueueQuery = withQuery(gql` }); const withQueueCountPolling = withQuery(gql` - query Counts($asset_id: ID) { + query Admin_Moderation_CountPoll($asset_id: ID) { allCount: commentCount(query: { asset_id: $asset_id }) diff --git a/client/coral-admin/src/routes/Moderation/containers/UserDetail.js b/client/coral-admin/src/routes/Moderation/containers/UserDetail.js index acc129074..24b17e928 100644 --- a/client/coral-admin/src/routes/Moderation/containers/UserDetail.js +++ b/client/coral-admin/src/routes/Moderation/containers/UserDetail.js @@ -24,7 +24,7 @@ class UserDetailContainer extends React.Component { } export const withUserDetailQuery = withQuery(gql` - query UserDetail($author_id: ID!) { + query Admin_UserDetail($author_id: ID!) { user(id: $author_id) { id username From d9ee215d666ada486b69fd7e214da28fc9fd6a34 Mon Sep 17 00:00:00 2001 From: Chi Vinh Le Date: Wed, 24 May 2017 23:22:03 +0700 Subject: [PATCH 22/78] Remove obsolete fragment --- client/coral-admin/src/graphql/index.js | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/client/coral-admin/src/graphql/index.js b/client/coral-admin/src/graphql/index.js index b3dcae2f0..4cc602fc9 100644 --- a/client/coral-admin/src/graphql/index.js +++ b/client/coral-admin/src/graphql/index.js @@ -1,23 +1,6 @@ -import {gql} from 'react-apollo'; import {add} from 'coral-framework/services/graphqlRegistry'; const extension = { - fragments: { - Metrics: gql` - fragment CoralAdmin_Metrics on Asset { - id - title - url - author - created_at - commentCount - action_summaries { - actionCount - actionableItemCount - } - } - `, - }, }; add(extension); From 48a8e394ef50e484a3036c7570466f727fa8ffb4 Mon Sep 17 00:00:00 2001 From: Chi Vinh Le Date: Thu, 25 May 2017 01:18:33 +0700 Subject: [PATCH 23/78] Use framework for mutations --- client/coral-admin/src/graphql/index.js | 94 +++++++++++ .../src/graphql/mutations/index.js | 153 ------------------ .../graphql/mutations/rejectUsername.graphql | 7 - .../mutations/setCommentStatus.graphql | 7 - .../graphql/mutations/setUserStatus.graphql | 7 - .../src/graphql/mutations/suspendUser.graphql | 7 - .../routes/Community/components/Community.js | 1 - .../routes/Community/containers/Community.js | 17 +- .../Moderation/containers/Moderation.js | 28 +++- client/coral-framework/graphql/mutations.js | 78 +++++++++ 10 files changed, 207 insertions(+), 192 deletions(-) delete mode 100644 client/coral-admin/src/graphql/mutations/index.js delete mode 100644 client/coral-admin/src/graphql/mutations/rejectUsername.graphql delete mode 100644 client/coral-admin/src/graphql/mutations/setCommentStatus.graphql delete mode 100644 client/coral-admin/src/graphql/mutations/setUserStatus.graphql delete mode 100644 client/coral-admin/src/graphql/mutations/suspendUser.graphql diff --git a/client/coral-admin/src/graphql/index.js b/client/coral-admin/src/graphql/index.js index 4cc602fc9..8d369ebd7 100644 --- a/client/coral-admin/src/graphql/index.js +++ b/client/coral-admin/src/graphql/index.js @@ -1,6 +1,100 @@ import {add} from 'coral-framework/services/graphqlRegistry'; +import {gql} from 'react-apollo'; + +const queues = ['all', 'premod', 'flagged', 'accepted', 'rejected']; const extension = { + fragments: { + SetUserStatusResponse: gql` + fragment Admin_SetUserStatusResponse on SetUserStatusResponse { + errors { + translation_key + } + } + `, + SuspendUserResponse: gql` + fragment Admin_SuspendUserResponse on SuspendUserResponse { + errors { + translation_key + } + } + `, + RejectUsernameResponse: gql` + fragment Admin_RejectUsernameResponse on RejectUsernameResponse { + errors { + translation_key + } + } + `, + SetCommentStatusResponse: gql` + fragment Admin_SetCommentStatusResponse on SetCommentStatusResponse { + errors { + translation_key + } + } + `, + }, + mutations: { + SetUserStatus: () => ({ + refetchQueries: ['Admin_Community'], + }), + RejectUsername: () => ({ + refetchQueries: ['Admin_Community'], + }), + SetCommentStatus: ({variables: {commentId, status}}) => ({ + updateQueries: { + Admin_Moderation: (oldData) => { + const comment = queues.reduce((comment, queue) => { + return comment ? comment : oldData[queue].find((c) => c.id === commentId); + }, null); + + let accepted = oldData.accepted; + let acceptedCount = oldData.acceptedCount; + let rejected = oldData.rejected; + let rejectedCount = oldData.rejectedCount; + + if (status !== comment.status) { + if (status === 'ACCEPTED') { + comment.status = 'ACCEPTED'; + acceptedCount++; + accepted = [comment, ...accepted]; + } + else if (status === 'REJECTED') { + comment.status = 'REJECTED'; + rejectedCount++; + rejected = [comment, ...rejected]; + } + } + + const premod = oldData.premod.filter((c) => c.id !== commentId); + const flagged = oldData.flagged.filter((c) => c.id !== commentId); + const premodCount = premod.length < oldData.premod.length ? oldData.premodCount - 1 : oldData.premodCount; + const flaggedCount = flagged.length < oldData.flagged.length ? oldData.flaggedCount - 1 : oldData.flaggedCount; + + if (status === 'REJECTED') { + accepted = oldData.accepted.filter((c) => c.id !== commentId); + acceptedCount = accepted.length < oldData.accepted.length ? oldData.acceptedCount - 1 : oldData.acceptedCount; + } + else if (status === 'ACCEPTED') { + rejected = oldData.rejected.filter((c) => c.id !== commentId); + rejectedCount = rejected.length < oldData.rejected.length ? oldData.rejectedCount - 1 : oldData.rejectedCount; + } + + return { + ...oldData, + premodCount: Math.max(0, premodCount), + flaggedCount: Math.max(0, flaggedCount), + acceptedCount: Math.max(0, acceptedCount), + rejectedCount: Math.max(0, rejectedCount), + premod, + flagged, + accepted, + rejected, + }; + } + } + }), + }, }; add(extension); diff --git a/client/coral-admin/src/graphql/mutations/index.js b/client/coral-admin/src/graphql/mutations/index.js deleted file mode 100644 index 5c530d159..000000000 --- a/client/coral-admin/src/graphql/mutations/index.js +++ /dev/null @@ -1,153 +0,0 @@ -import {graphql} from 'react-apollo'; -import SET_USER_STATUS from './setUserStatus.graphql'; -import SET_COMMENT_STATUS from './setCommentStatus.graphql'; -import SUSPEND_USER from './suspendUser.graphql'; -import REJECT_USERNAME from './rejectUsername.graphql'; - -export const banUser = graphql(SET_USER_STATUS, { - props: ({mutate}) => ({ - banUser: ({userId}) => { - return mutate({ - variables: { - userId, - status: 'BANNED' - }, - refetchQueries: ['Admin_Community'] - }); - }}), -}); - -export const setUserStatus = graphql(SET_USER_STATUS, { - props: ({mutate}) => ({ - approveUser: ({userId}) => { - return mutate({ - variables: { - userId, - status: 'APPROVED' - }, - refetchQueries: ['Admin_Community'] - }); - } - }) -}); - -export const suspendUser = graphql(SUSPEND_USER, { - props: ({mutate}) => ({ - suspendUser: (input) => { - return mutate({ - variables: { - input, - }, - }); - } - }) -}); - -export const rejectUsername = graphql(REJECT_USERNAME, { - props: ({mutate}) => ({ - rejectUsername: (input) => { - return mutate({ - variables: { - input, - }, - refetchQueries: ['Admin_Community'] - }); - } - }) -}); - -const views = ['all', 'premod', 'flagged', 'accepted', 'rejected']; -export const setCommentStatus = graphql(SET_COMMENT_STATUS, { - props: ({mutate}) => ({ - acceptComment: ({commentId}) => { - return mutate({ - variables: { - commentId, - status: 'ACCEPTED' - }, - updateQueries: { - Admin_Moderation: (oldData) => { - const comment = views.reduce((comment, view) => { - return comment ? comment : oldData[view].find((c) => c.id === commentId); - }, null); - let accepted; - let acceptedCount = oldData.acceptedCount; - - // if the comment was already in the Approved queue, don't re-add it - if (comment.status === 'ACCEPTED') { - accepted = [...oldData.accepted]; - } else { - comment.status = 'ACCEPTED'; - acceptedCount++; - accepted = [comment, ...oldData.accepted]; - } - - const premod = oldData.premod.filter((c) => c.id !== commentId); - const flagged = oldData.flagged.filter((c) => c.id !== commentId); - const rejected = oldData.rejected.filter((c) => c.id !== commentId); - const premodCount = premod.length < oldData.premod.length ? oldData.premodCount - 1 : oldData.premodCount; - const flaggedCount = flagged.length < oldData.flagged.length ? oldData.flaggedCount - 1 : oldData.flaggedCount; - const rejectedCount = rejected.length < oldData.rejected.length ? oldData.rejectedCount - 1 : oldData.rejectedCount; - - return { - ...oldData, - premodCount: Math.max(0, premodCount), - flaggedCount: Math.max(0, flaggedCount), - acceptedCount: Math.max(0, acceptedCount), - rejectedCount: Math.max(0, rejectedCount), - premod, - flagged, - accepted, - rejected, - }; - } - } - }); - }, - rejectComment: ({commentId}) => { - return mutate({ - variables: { - commentId, - status: 'REJECTED' - }, - updateQueries: { - Admin_Moderation: (oldData) => { - const comment = views.reduce((comment, view) => { - return comment ? comment : oldData[view].find((c) => c.id === commentId); - }, null); - let rejected; - let rejectedCount = oldData.rejectedCount; - - // if the item was already in the Rejected queue, don't put it in again - if (comment.status === 'REJECTED') { - rejected = oldData.rejected; - } else { - comment.status = 'REJECTED'; - rejectedCount++; - rejected = [comment, ...oldData.rejected]; - } - - const premod = oldData.premod.filter((c) => c.id !== commentId); - const flagged = oldData.flagged.filter((c) => c.id !== commentId); - const accepted = oldData.accepted.filter((c) => c.id !== commentId); - const premodCount = premod.length < oldData.premod.length ? oldData.premodCount - 1 : oldData.premodCount; - const flaggedCount = flagged.length < oldData.flagged.length ? oldData.flaggedCount - 1 : oldData.flaggedCount; - const acceptedCount = accepted.length < oldData.accepted.length ? oldData.acceptedCount - 1 : oldData.acceptedCount; - - return { - ...oldData, - premodCount: Math.max(0, premodCount), - flaggedCount: Math.max(0, flaggedCount), - acceptedCount: Math.max(0, acceptedCount), - rejectedCount: Math.max(0, rejectedCount), - premod, - flagged, - accepted, - rejected - }; - } - } - }); - } - }) -}); diff --git a/client/coral-admin/src/graphql/mutations/rejectUsername.graphql b/client/coral-admin/src/graphql/mutations/rejectUsername.graphql deleted file mode 100644 index c07887649..000000000 --- a/client/coral-admin/src/graphql/mutations/rejectUsername.graphql +++ /dev/null @@ -1,7 +0,0 @@ -mutation rejectUsername($input: RejectUsernameInput!) { - rejectUsername(input: $input) { - errors { - translation_key - } - } -} diff --git a/client/coral-admin/src/graphql/mutations/setCommentStatus.graphql b/client/coral-admin/src/graphql/mutations/setCommentStatus.graphql deleted file mode 100644 index 7ff6173a8..000000000 --- a/client/coral-admin/src/graphql/mutations/setCommentStatus.graphql +++ /dev/null @@ -1,7 +0,0 @@ -mutation setCommentStatus($commentId: ID!, $status: COMMENT_STATUS!){ - setCommentStatus(id: $commentId, status: $status) { - errors { - translation_key - } - } -} diff --git a/client/coral-admin/src/graphql/mutations/setUserStatus.graphql b/client/coral-admin/src/graphql/mutations/setUserStatus.graphql deleted file mode 100644 index 32fcf7e20..000000000 --- a/client/coral-admin/src/graphql/mutations/setUserStatus.graphql +++ /dev/null @@ -1,7 +0,0 @@ -mutation setUserStatus($userId: ID!, $status: USER_STATUS!) { - setUserStatus(id: $userId, status: $status) { - errors { - translation_key - } - } -} diff --git a/client/coral-admin/src/graphql/mutations/suspendUser.graphql b/client/coral-admin/src/graphql/mutations/suspendUser.graphql deleted file mode 100644 index f6ab2426f..000000000 --- a/client/coral-admin/src/graphql/mutations/suspendUser.graphql +++ /dev/null @@ -1,7 +0,0 @@ -mutation suspendUser($input: SuspendUserInput!) { - suspendUser(input: $input) { - errors { - translation_key - } - } -} diff --git a/client/coral-admin/src/routes/Community/components/Community.js b/client/coral-admin/src/routes/Community/components/Community.js index 38a75004f..f6544b0ac 100644 --- a/client/coral-admin/src/routes/Community/components/Community.js +++ b/client/coral-admin/src/routes/Community/components/Community.js @@ -57,7 +57,6 @@ export default class Community extends Component { getTabContent(searchValue, props) { const {community, root: {users}} = props; const activeTab = props.route.path === ':id' ? 'flagged' : props.route.path; - console.log(props); if (activeTab === 'people') { return ( diff --git a/client/coral-admin/src/routes/Community/containers/Community.js b/client/coral-admin/src/routes/Community/containers/Community.js index f9468c0aa..e97553cab 100644 --- a/client/coral-admin/src/routes/Community/containers/Community.js +++ b/client/coral-admin/src/routes/Community/containers/Community.js @@ -5,7 +5,7 @@ import {compose, gql} from 'react-apollo'; import withQuery from 'coral-framework/hocs/withQuery'; import {Spinner} from 'coral-ui'; -import {banUser, setUserStatus, rejectUsername} from 'coral-admin/src/graphql/mutations'; +import {withSetUserStatus, withRejectUsername} from 'coral-framework/graphql/mutations'; import { fetchAccounts, @@ -25,6 +25,14 @@ class CommunityContainer extends Component { this.props.fetchAccounts({}); } + approveUser = ({userId}) => { + return this.props.setUserStatus({userId, status: 'APPROVED'}); + } + + banUser = ({userId}) => { + return this.props.setUserStatus({userId, status: 'BANNED'}); + } + render() { if (this.props.data.error) { return

{this.props.data.error.message}
; @@ -34,7 +42,7 @@ class CommunityContainer extends Component { return
; } return ( - + ); } } @@ -94,7 +102,6 @@ const mapDispatchToProps = (dispatch) => export default compose( connect(mapStateToProps, mapDispatchToProps), withCommunityQuery, - banUser, - setUserStatus, - rejectUsername + withSetUserStatus, + withRejectUsername, )(CommunityContainer); diff --git a/client/coral-admin/src/routes/Moderation/containers/Moderation.js b/client/coral-admin/src/routes/Moderation/containers/Moderation.js index ff0223ff1..4cea54a54 100644 --- a/client/coral-admin/src/routes/Moderation/containers/Moderation.js +++ b/client/coral-admin/src/routes/Moderation/containers/Moderation.js @@ -6,7 +6,7 @@ import isEqual from 'lodash/isEqual'; import withQuery from 'coral-framework/hocs/withQuery'; import {getDefinitionName} from 'coral-framework/utils'; -import {banUser, setCommentStatus, suspendUser} from '../../../graphql/mutations'; +import {withSetUserStatus, withSuspendUser, withSetCommentStatus} from 'coral-framework/graphql/mutations'; import {fetchSettings} from 'actions/settings'; import {updateAssets} from 'actions/assets'; @@ -39,6 +39,18 @@ class ModerationContainer extends Component { } } + banUser = ({userId}) => { + return this.props.setUserStatus({userId, status: 'BANNED'}); + } + + acceptComment = ({commentId}) => { + return this.props.setCommentStatus({commentId, status: 'ACCEPTED'}); + } + + rejectComment = ({commentId}) => { + return this.props.setCommentStatus({commentId, status: 'REJECTED'}); + } + loadMore = ({limit = 10, cursor, sort, tab, asset_id}) => { let variables = { limit, @@ -90,7 +102,13 @@ class ModerationContainer extends Component { return
; } - return ; + return ; } } @@ -248,9 +266,9 @@ const mapDispatchToProps = (dispatch) => ({ export default compose( connect(mapStateToProps, mapDispatchToProps), - setCommentStatus, - banUser, - suspendUser, + withSetCommentStatus, + withSetUserStatus, + withSuspendUser, withQueueCountPolling, withModQueueQuery, )(ModerationContainer); diff --git a/client/coral-framework/graphql/mutations.js b/client/coral-framework/graphql/mutations.js index 0744df35b..d9c3cfe45 100644 --- a/client/coral-framework/graphql/mutations.js +++ b/client/coral-framework/graphql/mutations.js @@ -1,6 +1,84 @@ import {gql} from 'react-apollo'; import withMutation from '../hocs/withMutation'; +export const withSetCommentStatus = withMutation( + gql` + mutation SetCommentStatus($commentId: ID!, $status: COMMENT_STATUS!){ + setCommentStatus(id: $commentId, status: $status) { + ...SetCommentStatusResponse + } + } + `, { + props: ({mutate}) => ({ + setCommentStatus: ({commentId, status}) => { + return mutate({ + variables: { + commentId, + status, + }, + }); + } + }) + }); + +export const withSuspendUser = withMutation( + gql` + mutation SuspendUser($input: SuspendUserInput!) { + suspendUser(input: $input) { + ...SuspendUserResponse + } + } + `, { + props: ({mutate}) => ({ + suspendUser: (input) => { + return mutate({ + variables: { + input, + }, + }); + } + }) + }); + +export const withRejectUsername = withMutation( + gql` + mutation RejectUsername($input: RejectUsernameInput!) { + rejectUsername(input: $input) { + ...RejectUsernameResponse + } + } + `, { + props: ({mutate}) => ({ + rejectUsername: (input) => { + return mutate({ + variables: { + input, + }, + }); + } + }) + }); + +export const withSetUserStatus = withMutation( + gql` + mutation SetUserStatus($userId: ID!, $status: USER_STATUS!) { + setUserStatus(id: $userId, status: $status) { + ...SetUserStatusResponse + } + } + `, { + props: ({mutate}) => ({ + setUserStatus: ({userId, status}) => { + return mutate({ + variables: { + userId, + status + }, + }); + } + }), + }); + export const withPostComment = withMutation( gql` mutation PostComment($comment: CreateCommentInput!) { From bd21719ea50dddcd8da60602cd6023a5f5e899d7 Mon Sep 17 00:00:00 2001 From: Belen Curcio Date: Wed, 24 May 2017 17:20:23 -0300 Subject: [PATCH 24/78] Handling non safari browsers --- client/coral-admin/src/actions/auth.js | 42 +++++++++++++++------- client/coral-framework/actions/auth.js | 24 ++++++++----- client/coral-framework/helpers/response.js | 27 ++++++++------ package.json | 1 + yarn.lock | 4 +++ 5 files changed, 67 insertions(+), 31 deletions(-) diff --git a/client/coral-admin/src/actions/auth.js b/client/coral-admin/src/actions/auth.js index 29971e294..00ab46910 100644 --- a/client/coral-admin/src/actions/auth.js +++ b/client/coral-admin/src/actions/auth.js @@ -1,28 +1,44 @@ +import browser from 'detect-browser'; import * as actions from '../constants/auth'; -import * as Storage from 'coral-framework/helpers/storage'; import coralApi from 'coral-framework/helpers/response'; +import * as Storage from 'coral-framework/helpers/storage'; import {handleAuthToken} from 'coral-framework/actions/auth'; //============================================================================== // SIGN IN //============================================================================== -export const handleLogin = (email, password, recaptchaResponse) => (dispatch) => { +export const handleLogin = (email, password, recaptchaResponse) => dispatch => { dispatch({type: actions.LOGIN_REQUEST}); - const params = {method: 'POST', body: {email, password}}; + + const params = { + method: 'POST', + body: { + email, + password + } + }; + if (recaptchaResponse) { - params.headers = {'X-Recaptcha-Response': recaptchaResponse}; + params.headers = { + 'X-Recaptcha-Response': recaptchaResponse + }; } + return coralApi('/auth/local', params) .then(({user, token}) => { + if (!user) { - Storage.removeItem('token'); + if (!browser || browser.name !== 'safari') { + Storage.removeItem('token'); + } return dispatch(checkLoginFailure('not logged in')); } + dispatch(handleAuthToken(token)); dispatch(checkLoginSuccess(user)); }) - .catch((error) => { + .catch(error => { if (error.translation_key === 'LOGIN_MAXIMUM_EXCEEDED') { dispatch({ type: actions.LOGIN_MAXIMUM_EXCEEDED, @@ -50,11 +66,11 @@ const forgotPassowordFailure = () => ({ type: actions.FETCH_FORGOT_PASSWORD_FAILURE }); -export const requestPasswordReset = (email) => (dispatch) => { +export const requestPasswordReset = email => dispatch => { dispatch(forgotPassowordRequest(email)); return coralApi('/account/password/reset', {method: 'POST', body: {email}}) .then(() => dispatch(forgotPassowordSuccess())) - .catch((error) => dispatch(forgotPassowordFailure(error))); + .catch(error => dispatch(forgotPassowordFailure(error))); }; //============================================================================== @@ -71,23 +87,25 @@ const checkLoginSuccess = (user, isAdmin) => ({ isAdmin }); -const checkLoginFailure = (error) => ({ +const checkLoginFailure = error => ({ type: actions.CHECK_LOGIN_FAILURE, error }); -export const checkLogin = () => (dispatch) => { +export const checkLogin = () => dispatch => { dispatch(checkLoginRequest()); return coralApi('/auth') .then(({user}) => { if (!user) { - Storage.removeItem('token'); + if (!browser || browser.name !== 'safari') { + Storage.removeItem('token'); + } return dispatch(checkLoginFailure('not logged in')); } dispatch(checkLoginSuccess(user)); }) - .catch((error) => { + .catch(error => { console.error(error); dispatch(checkLoginFailure(`${error.translation_key}`)); }); diff --git a/client/coral-framework/actions/auth.js b/client/coral-framework/actions/auth.js index 6b71fa9dd..071235ce3 100644 --- a/client/coral-framework/actions/auth.js +++ b/client/coral-framework/actions/auth.js @@ -1,14 +1,14 @@ -import {pym} from 'coral-framework'; -import * as Storage from '../helpers/storage'; -import * as actions from '../constants/auth'; -import coralApi, {base} from '../helpers/response'; import jwtDecode from 'jwt-decode'; +import {pym} from 'coral-framework'; +import browser from 'detect-browser'; +import * as actions from '../constants/auth'; +import * as Storage from '../helpers/storage'; +import coralApi, {base} from '../helpers/response'; const lang = new I18n(translations); import translations from './../translations'; import I18n from '../../coral-framework/modules/i18n/i18n'; -// Dialog Actions export const showSignInDialog = () => (dispatch) => { const signInPopUp = window.open( '/embed/stream/login', @@ -112,8 +112,10 @@ const signInFailure = (error) => ({ //============================================================================== export const handleAuthToken = (token) => (dispatch) => { - Storage.setItem('exp', jwtDecode(token).exp); - Storage.setItem('token', token); + if (!browser || browser.name !== 'safari') { + Storage.setItem('exp', jwtDecode(token).exp); + Storage.setItem('token', token); + } dispatch({type: 'HANDLE_AUTH_TOKEN'}); }; @@ -269,7 +271,9 @@ export const fetchForgotPassword = (email) => (dispatch) => { export const logout = () => (dispatch) => { return coralApi('/auth', {method: 'DELETE'}).then(() => { - Storage.removeItem('token'); + if (!browser || browser.name !== 'safari') { + Storage.removeItem('token'); + } dispatch({type: actions.LOGOUT}); }); }; @@ -292,7 +296,9 @@ export const checkLogin = () => (dispatch) => { coralApi('/auth') .then((result) => { if (!result.user) { - Storage.removeItem('token'); + if (!browser || browser.name !== 'safari') { + Storage.removeItem('token'); + } throw new Error('Not logged in'); } diff --git a/client/coral-framework/helpers/response.js b/client/coral-framework/helpers/response.js index 794a73e30..bad2e52f7 100644 --- a/client/coral-framework/helpers/response.js +++ b/client/coral-framework/helpers/response.js @@ -1,22 +1,29 @@ -import * as Storage from './storage'; +import browser from 'detect-browser'; const buildOptions = (inputOptions = {}) => { const defaultOptions = { method: 'GET', headers: { Accept: 'application/json', - Authorization: `Bearer ${Storage.getItem('token')}`, 'Content-Type': 'application/json' }, credentials: 'same-origin' }; - let options = Object.assign({}, defaultOptions, inputOptions); - options.headers = Object.assign( - {}, - defaultOptions.headers, - inputOptions.headers - ); + let options = { + defaultOptions, + ...inputOptions + }; + + if (!browser || browser.name !== 'safari') { + let authorization = localStorage.getItem('token'); + + if (authorization) { + options.headers = { + Authorization: `Bearer ${authorization}` + }; + } + } if (options.method.toLowerCase() !== 'get') { options.body = JSON.stringify(options.body); @@ -25,9 +32,9 @@ const buildOptions = (inputOptions = {}) => { return options; }; -const handleResp = (res) => { +const handleResp = res => { if (res.status > 399) { - return res.json().then((err) => { + return res.json().then(err => { let message = err.message || res.status; const error = new Error(); diff --git a/package.json b/package.json index 84d0fdf52..cbf514cf5 100644 --- a/package.json +++ b/package.json @@ -62,6 +62,7 @@ "csurf": "^1.9.0", "dataloader": "^1.3.0", "debug": "^2.6.3", + "detect-browser": "^1.7.0", "dotenv": "^4.0.0", "ejs": "^2.5.6", "env-rewrite": "^1.0.2", diff --git a/yarn.lock b/yarn.lock index 728687248..3fd71e907 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2390,6 +2390,10 @@ destroy@~1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" +detect-browser@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/detect-browser/-/detect-browser-1.7.0.tgz#11758cd6aa07d76c25784036d19154ae0392c3b3" + detect-indent@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" From 69b19d2c91098bfbb867f7bcffb0035d5c81a40c Mon Sep 17 00:00:00 2001 From: David Erwin Date: Wed, 24 May 2017 16:48:00 -0400 Subject: [PATCH 25/78] Jekyll Initial Commit --- {docs => docs-tmp}/diagrams/architecture.png | Bin {docs => docs-tmp}/diagrams/architecture.xml | 0 {docs => docs-tmp}/diagrams/data-model.png | Bin {docs => docs-tmp}/diagrams/data-model.xml | 0 .../diagrams/moderation-flow-post.png | Bin .../diagrams/moderation-flow-pre.png | Bin .../diagrams/moderation-flow.xml | 0 {docs => docs-tmp}/frontend/DEBUG.md | 0 {docs => docs-tmp}/frontend/HOOKS.md | 0 {docs => docs-tmp}/frontend/IMMUTABLEJS.md | 0 .../frontend/PLUGINS-experimental.md | 0 {docs => docs-tmp}/frontend/PLUGINS.md | 0 {docs => docs-tmp}/frontend/README.md | 0 {docs => docs-tmp}/frontend/REDUX.md | 0 {docs => docs-tmp}/frontend/TEST.md | 0 {docs => docs-tmp}/plugins/CLIENT.md | 0 {docs => docs-tmp}/plugins/EXPERIMENTAL.md | 0 {docs => docs-tmp}/plugins/README.md | 0 {docs => docs-tmp}/plugins/SERVER.md | 0 {docs => docs-tmp}/swagger.yaml | 0 docs/.gitignore | 6 + docs/.vscode/settings.json | 6 + docs/404.md | 6 + docs/Dockerfile | 26 + docs/Gemfile | 4 + docs/Gemfile.lock | 199 + docs/_config.yml | 102 + docs/_data/alerts.yml | 15 + docs/_data/definitions.yml | 0 docs/_data/sidebars/talk_sidebar.yml | 42 + docs/_data/tags.yml | 4 + docs/_data/terms.yml | 0 docs/_data/topnav.yml | 15 + docs/_includes/archive.html | 15 + docs/_includes/callout.html | 1 + docs/_includes/custom/sidebarconfigs.html | 1 + docs/_includes/disqus.html | 16 + docs/_includes/feedback.html | 13 + docs/_includes/footer.html | 9 + docs/_includes/google_analytics.html | 6 + docs/_includes/head.html | 36 + docs/_includes/head_print.html | 33 + docs/_includes/image.html | 1 + docs/_includes/important.html | 1 + docs/_includes/initialize_shuffle.html | 130 + docs/_includes/inline_image.html | 1 + docs/_includes/links.html | 44 + docs/_includes/note.html | 1 + docs/_includes/sidebar.html | 55 + docs/_includes/taglogic.html | 32 + docs/_includes/tip.html | 1 + docs/_includes/toc.html | 21 + docs/_includes/topnav.html | 50 + docs/_includes/warning.html | 1 + docs/_layouts/default.html | 106 + docs/_layouts/default_print.html | 25 + docs/_layouts/page.html | 66 + docs/_layouts/page_print.html | 15 + docs/_layouts/post.html | 39 + docs/configuration.md | 32 + docs/css/bootstrap.min.css | 5 + docs/css/customstyles.css | 1179 ++++ docs/css/font-awesome.min.css | 4 + docs/css/fonts/FontAwesome.otf | Bin 0 -> 93888 bytes docs/css/fonts/fontawesome-webfont.eot | Bin 0 -> 60767 bytes docs/css/fonts/fontawesome-webfont.svg | 565 ++ docs/css/fonts/fontawesome-webfont.ttf | Bin 0 -> 122092 bytes docs/css/fonts/fontawesome-webfont.woff | Bin 0 -> 71508 bytes docs/css/fonts/fontawesome-webfont.woff2 | Bin 0 -> 56780 bytes docs/css/lavish-bootstrap.css | 5898 +++++++++++++++++ docs/css/modern-business.css | 93 + docs/css/printstyles.css | 160 + docs/css/syntax.css | 60 + docs/css/theme-blue.css | 103 + docs/css/theme-green.css | 99 + docs/feed.xml | 32 + docs/fonts/FontAwesome.otf | Bin 0 -> 85908 bytes docs/fonts/fontawesome-webfont.eot | Bin 0 -> 56006 bytes docs/fonts/fontawesome-webfont.svg | 520 ++ docs/fonts/fontawesome-webfont.ttf | Bin 0 -> 112160 bytes docs/fonts/fontawesome-webfont.woff | Bin 0 -> 65452 bytes docs/fonts/glyphicons-halflings-regular.eot | Bin 0 -> 20127 bytes docs/fonts/glyphicons-halflings-regular.svg | 288 + docs/fonts/glyphicons-halflings-regular.ttf | Bin 0 -> 45404 bytes docs/fonts/glyphicons-halflings-regular.woff | Bin 0 -> 23424 bytes docs/fonts/glyphicons-halflings-regular.woff2 | Bin 0 -> 18028 bytes docs/images/communicorn.jpg | Bin 0 -> 119335 bytes docs/images/company_logo.png | Bin 0 -> 13330 bytes docs/images/favicon.ico | Bin 0 -> 177352 bytes docs/index.md | 66 + docs/install-docker.md | 147 + docs/install-setup.md | 38 + docs/install-source.md | 80 + docs/js/customscripts.js | 55 + docs/js/jekyll-search.js | 1 + docs/js/jquery.ba-throttle-debounce.min.js | 9 + docs/js/jquery.localScroll.min.js | 7 + docs/js/jquery.navgoco.min.js | 8 + docs/js/jquery.scrollTo.min.js | 7 + docs/js/jquery.shuffle.min.js | 1588 +++++ docs/js/mydoc_scroll.html | 240 + docs/js/toc.js | 82 + docs/licenses/LICENSE | 21 + docs/licenses/LICENSE-BSD-NAVGOCO.txt | 27 + docs/pages/plugins/client.md | 278 + docs/plugins-client.md | 327 + docs/plugins-experimental.md | 63 + docs/plugins-server.md | 390 ++ docs/sitemap.xml | 24 + docs/update.sh | 4 + 110 files changed, 13644 insertions(+) rename {docs => docs-tmp}/diagrams/architecture.png (100%) rename {docs => docs-tmp}/diagrams/architecture.xml (100%) rename {docs => docs-tmp}/diagrams/data-model.png (100%) rename {docs => docs-tmp}/diagrams/data-model.xml (100%) rename {docs => docs-tmp}/diagrams/moderation-flow-post.png (100%) rename {docs => docs-tmp}/diagrams/moderation-flow-pre.png (100%) rename {docs => docs-tmp}/diagrams/moderation-flow.xml (100%) rename {docs => docs-tmp}/frontend/DEBUG.md (100%) rename {docs => docs-tmp}/frontend/HOOKS.md (100%) rename {docs => docs-tmp}/frontend/IMMUTABLEJS.md (100%) rename {docs => docs-tmp}/frontend/PLUGINS-experimental.md (100%) rename {docs => docs-tmp}/frontend/PLUGINS.md (100%) rename {docs => docs-tmp}/frontend/README.md (100%) rename {docs => docs-tmp}/frontend/REDUX.md (100%) rename {docs => docs-tmp}/frontend/TEST.md (100%) rename {docs => docs-tmp}/plugins/CLIENT.md (100%) rename {docs => docs-tmp}/plugins/EXPERIMENTAL.md (100%) rename {docs => docs-tmp}/plugins/README.md (100%) rename {docs => docs-tmp}/plugins/SERVER.md (100%) rename {docs => docs-tmp}/swagger.yaml (100%) create mode 100644 docs/.gitignore create mode 100644 docs/.vscode/settings.json create mode 100644 docs/404.md create mode 100644 docs/Dockerfile create mode 100644 docs/Gemfile create mode 100644 docs/Gemfile.lock create mode 100644 docs/_config.yml create mode 100644 docs/_data/alerts.yml create mode 100644 docs/_data/definitions.yml create mode 100644 docs/_data/sidebars/talk_sidebar.yml create mode 100644 docs/_data/tags.yml create mode 100644 docs/_data/terms.yml create mode 100644 docs/_data/topnav.yml create mode 100644 docs/_includes/archive.html create mode 100644 docs/_includes/callout.html create mode 100644 docs/_includes/custom/sidebarconfigs.html create mode 100644 docs/_includes/disqus.html create mode 100644 docs/_includes/feedback.html create mode 100755 docs/_includes/footer.html create mode 100644 docs/_includes/google_analytics.html create mode 100644 docs/_includes/head.html create mode 100644 docs/_includes/head_print.html create mode 100644 docs/_includes/image.html create mode 100644 docs/_includes/important.html create mode 100644 docs/_includes/initialize_shuffle.html create mode 100644 docs/_includes/inline_image.html create mode 100644 docs/_includes/links.html create mode 100644 docs/_includes/note.html create mode 100644 docs/_includes/sidebar.html create mode 100644 docs/_includes/taglogic.html create mode 100644 docs/_includes/tip.html create mode 100644 docs/_includes/toc.html create mode 100644 docs/_includes/topnav.html create mode 100644 docs/_includes/warning.html create mode 100644 docs/_layouts/default.html create mode 100644 docs/_layouts/default_print.html create mode 100644 docs/_layouts/page.html create mode 100644 docs/_layouts/page_print.html create mode 100644 docs/_layouts/post.html create mode 100644 docs/configuration.md create mode 100755 docs/css/bootstrap.min.css create mode 100644 docs/css/customstyles.css create mode 100644 docs/css/font-awesome.min.css create mode 100644 docs/css/fonts/FontAwesome.otf create mode 100644 docs/css/fonts/fontawesome-webfont.eot create mode 100644 docs/css/fonts/fontawesome-webfont.svg create mode 100644 docs/css/fonts/fontawesome-webfont.ttf create mode 100644 docs/css/fonts/fontawesome-webfont.woff create mode 100644 docs/css/fonts/fontawesome-webfont.woff2 create mode 100644 docs/css/lavish-bootstrap.css create mode 100755 docs/css/modern-business.css create mode 100644 docs/css/printstyles.css create mode 100644 docs/css/syntax.css create mode 100644 docs/css/theme-blue.css create mode 100644 docs/css/theme-green.css create mode 100644 docs/feed.xml create mode 100644 docs/fonts/FontAwesome.otf create mode 100644 docs/fonts/fontawesome-webfont.eot create mode 100644 docs/fonts/fontawesome-webfont.svg create mode 100644 docs/fonts/fontawesome-webfont.ttf create mode 100644 docs/fonts/fontawesome-webfont.woff create mode 100644 docs/fonts/glyphicons-halflings-regular.eot create mode 100644 docs/fonts/glyphicons-halflings-regular.svg create mode 100644 docs/fonts/glyphicons-halflings-regular.ttf create mode 100644 docs/fonts/glyphicons-halflings-regular.woff create mode 100644 docs/fonts/glyphicons-halflings-regular.woff2 create mode 100644 docs/images/communicorn.jpg create mode 100644 docs/images/company_logo.png create mode 100644 docs/images/favicon.ico create mode 100644 docs/index.md create mode 100644 docs/install-docker.md create mode 100644 docs/install-setup.md create mode 100644 docs/install-source.md create mode 100644 docs/js/customscripts.js create mode 100644 docs/js/jekyll-search.js create mode 100644 docs/js/jquery.ba-throttle-debounce.min.js create mode 100644 docs/js/jquery.localScroll.min.js create mode 100755 docs/js/jquery.navgoco.min.js create mode 100644 docs/js/jquery.scrollTo.min.js create mode 100644 docs/js/jquery.shuffle.min.js create mode 100644 docs/js/mydoc_scroll.html create mode 100644 docs/js/toc.js create mode 100644 docs/licenses/LICENSE create mode 100644 docs/licenses/LICENSE-BSD-NAVGOCO.txt create mode 100644 docs/pages/plugins/client.md create mode 100644 docs/plugins-client.md create mode 100644 docs/plugins-experimental.md create mode 100644 docs/plugins-server.md create mode 100644 docs/sitemap.xml create mode 100755 docs/update.sh diff --git a/docs/diagrams/architecture.png b/docs-tmp/diagrams/architecture.png similarity index 100% rename from docs/diagrams/architecture.png rename to docs-tmp/diagrams/architecture.png diff --git a/docs/diagrams/architecture.xml b/docs-tmp/diagrams/architecture.xml similarity index 100% rename from docs/diagrams/architecture.xml rename to docs-tmp/diagrams/architecture.xml diff --git a/docs/diagrams/data-model.png b/docs-tmp/diagrams/data-model.png similarity index 100% rename from docs/diagrams/data-model.png rename to docs-tmp/diagrams/data-model.png diff --git a/docs/diagrams/data-model.xml b/docs-tmp/diagrams/data-model.xml similarity index 100% rename from docs/diagrams/data-model.xml rename to docs-tmp/diagrams/data-model.xml diff --git a/docs/diagrams/moderation-flow-post.png b/docs-tmp/diagrams/moderation-flow-post.png similarity index 100% rename from docs/diagrams/moderation-flow-post.png rename to docs-tmp/diagrams/moderation-flow-post.png diff --git a/docs/diagrams/moderation-flow-pre.png b/docs-tmp/diagrams/moderation-flow-pre.png similarity index 100% rename from docs/diagrams/moderation-flow-pre.png rename to docs-tmp/diagrams/moderation-flow-pre.png diff --git a/docs/diagrams/moderation-flow.xml b/docs-tmp/diagrams/moderation-flow.xml similarity index 100% rename from docs/diagrams/moderation-flow.xml rename to docs-tmp/diagrams/moderation-flow.xml diff --git a/docs/frontend/DEBUG.md b/docs-tmp/frontend/DEBUG.md similarity index 100% rename from docs/frontend/DEBUG.md rename to docs-tmp/frontend/DEBUG.md diff --git a/docs/frontend/HOOKS.md b/docs-tmp/frontend/HOOKS.md similarity index 100% rename from docs/frontend/HOOKS.md rename to docs-tmp/frontend/HOOKS.md diff --git a/docs/frontend/IMMUTABLEJS.md b/docs-tmp/frontend/IMMUTABLEJS.md similarity index 100% rename from docs/frontend/IMMUTABLEJS.md rename to docs-tmp/frontend/IMMUTABLEJS.md diff --git a/docs/frontend/PLUGINS-experimental.md b/docs-tmp/frontend/PLUGINS-experimental.md similarity index 100% rename from docs/frontend/PLUGINS-experimental.md rename to docs-tmp/frontend/PLUGINS-experimental.md diff --git a/docs/frontend/PLUGINS.md b/docs-tmp/frontend/PLUGINS.md similarity index 100% rename from docs/frontend/PLUGINS.md rename to docs-tmp/frontend/PLUGINS.md diff --git a/docs/frontend/README.md b/docs-tmp/frontend/README.md similarity index 100% rename from docs/frontend/README.md rename to docs-tmp/frontend/README.md diff --git a/docs/frontend/REDUX.md b/docs-tmp/frontend/REDUX.md similarity index 100% rename from docs/frontend/REDUX.md rename to docs-tmp/frontend/REDUX.md diff --git a/docs/frontend/TEST.md b/docs-tmp/frontend/TEST.md similarity index 100% rename from docs/frontend/TEST.md rename to docs-tmp/frontend/TEST.md diff --git a/docs/plugins/CLIENT.md b/docs-tmp/plugins/CLIENT.md similarity index 100% rename from docs/plugins/CLIENT.md rename to docs-tmp/plugins/CLIENT.md diff --git a/docs/plugins/EXPERIMENTAL.md b/docs-tmp/plugins/EXPERIMENTAL.md similarity index 100% rename from docs/plugins/EXPERIMENTAL.md rename to docs-tmp/plugins/EXPERIMENTAL.md diff --git a/docs/plugins/README.md b/docs-tmp/plugins/README.md similarity index 100% rename from docs/plugins/README.md rename to docs-tmp/plugins/README.md diff --git a/docs/plugins/SERVER.md b/docs-tmp/plugins/SERVER.md similarity index 100% rename from docs/plugins/SERVER.md rename to docs-tmp/plugins/SERVER.md diff --git a/docs/swagger.yaml b/docs-tmp/swagger.yaml similarity index 100% rename from docs/swagger.yaml rename to docs-tmp/swagger.yaml diff --git a/docs/.gitignore b/docs/.gitignore new file mode 100644 index 000000000..b33f7679f --- /dev/null +++ b/docs/.gitignore @@ -0,0 +1,6 @@ +_site/ +.sass-cache/ +.jekyll-metadata +_pdf +.idea/ +.DS_Store diff --git a/docs/.vscode/settings.json b/docs/.vscode/settings.json new file mode 100644 index 000000000..5af001d55 --- /dev/null +++ b/docs/.vscode/settings.json @@ -0,0 +1,6 @@ +// Place your settings in this file to overwrite default and user settings. +{ + "files.associations": { + "*.html": "liquid" + } +} diff --git a/docs/404.md b/docs/404.md new file mode 100644 index 000000000..a7b58c002 --- /dev/null +++ b/docs/404.md @@ -0,0 +1,6 @@ +--- +title: "Page Not Found" +search: exclude +--- + +Sorry, but the page you were trying to view does not exist. Try searching for it or looking at the URL to see if it looks correct. diff --git a/docs/Dockerfile b/docs/Dockerfile new file mode 100644 index 000000000..b1fa52c47 --- /dev/null +++ b/docs/Dockerfile @@ -0,0 +1,26 @@ +FROM ruby:2.1 +MAINTAINER mrafayaleem@gmail.com + +RUN apt-get clean \ + && mv /var/lib/apt/lists /var/lib/apt/lists.broke \ + && mkdir -p /var/lib/apt/lists/partial + +RUN apt-get update + +RUN apt-get install -y \ + node \ + python-pygments \ + && apt-get clean \ + && rm -rf /var/lib/apt/lists/ + +WORKDIR /tmp +ADD Gemfile /tmp/ +ADD Gemfile.lock /tmp/ +RUN bundle install + +VOLUME /src +EXPOSE 4000 + +WORKDIR /src +ENTRYPOINT ["jekyll"] + diff --git a/docs/Gemfile b/docs/Gemfile new file mode 100644 index 000000000..d2e1a4527 --- /dev/null +++ b/docs/Gemfile @@ -0,0 +1,4 @@ +source "https://rubygems.org" + +gem 'github-pages', group: :jekyll_plugins +gem 'wdm', '>= 0.1.0' if Gem.win_platform? diff --git a/docs/Gemfile.lock b/docs/Gemfile.lock new file mode 100644 index 000000000..04ce5e261 --- /dev/null +++ b/docs/Gemfile.lock @@ -0,0 +1,199 @@ +GEM + remote: https://rubygems.org/ + specs: + activesupport (4.2.8) + i18n (~> 0.7) + minitest (~> 5.1) + thread_safe (~> 0.3, >= 0.3.4) + tzinfo (~> 1.1) + addressable (2.5.1) + public_suffix (~> 2.0, >= 2.0.2) + coffee-script (2.4.1) + coffee-script-source + execjs + coffee-script-source (1.12.2) + colorator (1.1.0) + ethon (0.10.1) + ffi (>= 1.3.0) + execjs (2.7.0) + faraday (0.12.1) + multipart-post (>= 1.2, < 3) + ffi (1.9.18) + forwardable-extended (2.6.0) + gemoji (3.0.0) + github-pages (138) + activesupport (= 4.2.8) + github-pages-health-check (= 1.3.3) + jekyll (= 3.4.3) + jekyll-avatar (= 0.4.2) + jekyll-coffeescript (= 1.0.1) + jekyll-default-layout (= 0.1.4) + jekyll-feed (= 0.9.2) + jekyll-gist (= 1.4.0) + jekyll-github-metadata (= 2.3.1) + jekyll-mentions (= 1.2.0) + jekyll-optional-front-matter (= 0.1.2) + jekyll-paginate (= 1.1.0) + jekyll-readme-index (= 0.1.0) + jekyll-redirect-from (= 0.12.1) + jekyll-relative-links (= 0.4.0) + jekyll-sass-converter (= 1.5.0) + jekyll-seo-tag (= 2.2.3) + jekyll-sitemap (= 1.0.0) + jekyll-swiss (= 0.4.0) + jekyll-theme-architect (= 0.0.4) + jekyll-theme-cayman (= 0.0.4) + jekyll-theme-dinky (= 0.0.4) + jekyll-theme-hacker (= 0.0.4) + jekyll-theme-leap-day (= 0.0.4) + jekyll-theme-merlot (= 0.0.4) + jekyll-theme-midnight (= 0.0.4) + jekyll-theme-minimal (= 0.0.4) + jekyll-theme-modernist (= 0.0.4) + jekyll-theme-primer (= 0.1.8) + jekyll-theme-slate (= 0.0.4) + jekyll-theme-tactile (= 0.0.4) + jekyll-theme-time-machine (= 0.0.4) + jekyll-titles-from-headings (= 0.1.5) + jemoji (= 0.8.0) + kramdown (= 1.13.2) + liquid (= 3.0.6) + listen (= 3.0.6) + mercenary (~> 0.3) + minima (= 2.1.1) + rouge (= 1.11.1) + terminal-table (~> 1.4) + github-pages-health-check (1.3.3) + addressable (~> 2.3) + net-dns (~> 0.8) + octokit (~> 4.0) + public_suffix (~> 2.0) + typhoeus (~> 0.7) + html-pipeline (2.6.0) + activesupport (>= 2) + nokogiri (>= 1.4) + i18n (0.8.1) + jekyll (3.4.3) + addressable (~> 2.4) + colorator (~> 1.0) + jekyll-sass-converter (~> 1.0) + jekyll-watch (~> 1.1) + kramdown (~> 1.3) + liquid (~> 3.0) + mercenary (~> 0.3.3) + pathutil (~> 0.9) + rouge (~> 1.7) + safe_yaml (~> 1.0) + jekyll-avatar (0.4.2) + jekyll (~> 3.0) + jekyll-coffeescript (1.0.1) + coffee-script (~> 2.2) + jekyll-default-layout (0.1.4) + jekyll (~> 3.0) + jekyll-feed (0.9.2) + jekyll (~> 3.3) + jekyll-gist (1.4.0) + octokit (~> 4.2) + jekyll-github-metadata (2.3.1) + jekyll (~> 3.1) + octokit (~> 4.0, != 4.4.0) + jekyll-mentions (1.2.0) + activesupport (~> 4.0) + html-pipeline (~> 2.3) + jekyll (~> 3.0) + jekyll-optional-front-matter (0.1.2) + jekyll (~> 3.0) + jekyll-paginate (1.1.0) + jekyll-readme-index (0.1.0) + jekyll (~> 3.0) + jekyll-redirect-from (0.12.1) + jekyll (~> 3.3) + jekyll-relative-links (0.4.0) + jekyll (~> 3.3) + jekyll-sass-converter (1.5.0) + sass (~> 3.4) + jekyll-seo-tag (2.2.3) + jekyll (~> 3.3) + jekyll-sitemap (1.0.0) + jekyll (~> 3.3) + jekyll-swiss (0.4.0) + jekyll-theme-architect (0.0.4) + jekyll (~> 3.3) + jekyll-theme-cayman (0.0.4) + jekyll (~> 3.3) + jekyll-theme-dinky (0.0.4) + jekyll (~> 3.3) + jekyll-theme-hacker (0.0.4) + jekyll (~> 3.3) + jekyll-theme-leap-day (0.0.4) + jekyll (~> 3.3) + jekyll-theme-merlot (0.0.4) + jekyll (~> 3.3) + jekyll-theme-midnight (0.0.4) + jekyll (~> 3.3) + jekyll-theme-minimal (0.0.4) + jekyll (~> 3.3) + jekyll-theme-modernist (0.0.4) + jekyll (~> 3.3) + jekyll-theme-primer (0.1.8) + jekyll (~> 3.3) + jekyll-theme-slate (0.0.4) + jekyll (~> 3.3) + jekyll-theme-tactile (0.0.4) + jekyll (~> 3.3) + jekyll-theme-time-machine (0.0.4) + jekyll (~> 3.3) + jekyll-titles-from-headings (0.1.5) + jekyll (~> 3.3) + jekyll-watch (1.5.0) + listen (~> 3.0, < 3.1) + jemoji (0.8.0) + activesupport (~> 4.0) + gemoji (~> 3.0) + html-pipeline (~> 2.2) + jekyll (>= 3.0) + kramdown (1.13.2) + liquid (3.0.6) + listen (3.0.6) + rb-fsevent (>= 0.9.3) + rb-inotify (>= 0.9.7) + mercenary (0.3.6) + mini_portile2 (2.1.0) + minima (2.1.1) + jekyll (~> 3.3) + minitest (5.10.2) + multipart-post (2.0.0) + net-dns (0.8.0) + nokogiri (1.6.8.1) + mini_portile2 (~> 2.1.0) + octokit (4.7.0) + sawyer (~> 0.8.0, >= 0.5.3) + pathutil (0.14.0) + forwardable-extended (~> 2.6) + public_suffix (2.0.5) + rb-fsevent (0.9.8) + rb-inotify (0.9.8) + ffi (>= 0.5.0) + rouge (1.11.1) + safe_yaml (1.0.4) + sass (3.4.24) + sawyer (0.8.1) + addressable (>= 2.3.5, < 2.6) + faraday (~> 0.8, < 1.0) + terminal-table (1.8.0) + unicode-display_width (~> 1.1, >= 1.1.1) + thread_safe (0.3.6) + typhoeus (0.8.0) + ethon (>= 0.8.0) + tzinfo (1.2.3) + thread_safe (~> 0.1) + unicode-display_width (1.2.1) + +PLATFORMS + ruby + +DEPENDENCIES + github-pages + +BUNDLED WITH + 1.15.0 diff --git a/docs/_config.yml b/docs/_config.yml new file mode 100644 index 000000000..96ae10d52 --- /dev/null +++ b/docs/_config.yml @@ -0,0 +1,102 @@ +repository: coralproject/talk + +output: web +# this property is useful for conditional filtering of content that is separate from the PDF. + +topnav_title: Coral Talk Documentation +# this appears on the top navigation bar next to the home button + +site_title: Coral Talk Documentation +# this appears in the html browser tab for the site title (seen mostly by search engines, not users) + +company_name: The Coral Project +# this appears in the footer + +github_editme_path: +# if you're using Github, provide the basepath to the branch you've created for reviews, following the sample here. if not, leave this value blank. + +disqus_shortname: +# if you're using disqus for comments, add the shortname here. if not, leave this value blank. + +host: 127.0.0.1 +# the preview server used. Leave as is. + +port: 4000 +# the port where the preview is rendered. You can leave this as is unless you have other Jekyll builds using this same port that might cause conflicts. in that case, use another port such as 4006. + +exclude: + - .idea/ + - .gitignore +# these are the files and directories that jekyll will exclude from the build + +feedback_subject_line: + +feedback_email: +# used as a contact email for the Feedback link in the top navigation bar + + feedback_disable: true +# if you uncomment the previous line, the Feedback link gets removed + +# feedback_text: "Need help?" +# if you uncomment the previous line, it changes the Feedback text + +# feedback_link: "http://helpy.io/" +# if you uncomment the previous line, it changes where the feedback link points to + +highlighter: rouge +# library used for syntax highlighting + +markdown: kramdown +kramdown: + input: GFM + auto_ids: true + hard_wrap: false + syntax_highlighter: rouge + +# filter used to process markdown. note that kramdown differs from github-flavored markdown in some subtle ways + +collections: + tooltips: + output: false +# collections are declared here. this renders the content in _tooltips and processes it, but doesn't output it as actual files in the output unless you change output to true + +defaults: + - + scope: + path: "" + type: "pages" + values: + layout: "page" + comments: true + search: true + sidebar: talk_sidebar + - + scope: + path: "" + type: "tooltips" + values: + layout: "page" + comments: true + search: true + tooltip: true + + - + scope: + path: "" + type: "posts" + values: + layout: "post" + comments: true + search: true + sidebar: home_sidebar + +# these are defaults used for the frontmatter for these file types + +sidebars: +- talk_sidebar + +description: "Documentation and guides for Coral Talk." +# the description is used in the feed.xml file + +# needed for sitemap.xml file only +url: https://coralproject.github.io/talk/ diff --git a/docs/_data/alerts.yml b/docs/_data/alerts.yml new file mode 100644 index 000000000..157e1622b --- /dev/null +++ b/docs/_data/alerts.yml @@ -0,0 +1,15 @@ +tip: '
+ + {% assign thisTag = page.tagName %} + {% for page in site.pages %} + {% for tag in page.tags %} + {% if tag == thisTag %} + + + + + + {% endif %} + {% endfor %} + {% endfor %} + + {% assign thisTag = page.tagName %} + {% for post in site.posts %} + {% for tag in post.tags %} + {% if tag == thisTag %} + + + + + + {% endif %} + {% endfor %} + {% endfor %} + + +
TitleTypeExcerpt
{{page.title}}Page{% if page.summary %} {{ page.summary | strip_html | strip_newlines | truncate: 160 }} {% else %} {{ page.content | truncatewords: 50 | strip_html }} {% endif %}
{{post.title}}Post{% if post.summary %} {{ post.summary | strip_html | strip_newlines | truncate: 160 }} {% else %} {{ post.content | truncatewords: 50 | strip_html }} {% endif %}
+ diff --git a/docs/_includes/tip.html b/docs/_includes/tip.html new file mode 100644 index 000000000..faf48afd8 --- /dev/null +++ b/docs/_includes/tip.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/_includes/toc.html b/docs/_includes/toc.html new file mode 100644 index 000000000..067141a6a --- /dev/null +++ b/docs/_includes/toc.html @@ -0,0 +1,21 @@ + + + + +
diff --git a/docs/_includes/topnav.html b/docs/_includes/topnav.html new file mode 100644 index 000000000..256e63458 --- /dev/null +++ b/docs/_includes/topnav.html @@ -0,0 +1,50 @@ + + diff --git a/docs/_includes/warning.html b/docs/_includes/warning.html new file mode 100644 index 000000000..e08268c93 --- /dev/null +++ b/docs/_includes/warning.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/_layouts/default.html b/docs/_layouts/default.html new file mode 100644 index 000000000..0acc2f1db --- /dev/null +++ b/docs/_layouts/default.html @@ -0,0 +1,106 @@ + + + + {% include head.html %} + + + + {% if page.datatable == true %} + + + + + + {% endif %} + + + +{% include topnav.html %} + +
+
 
+ +
+ {% assign content_col_size = "col-md-12" %} + {% unless page.hide_sidebar %} + +
+ {% include sidebar.html %} +
+ {% assign content_col_size = "col-md-9" %} + {% endunless %} + + +
+ {{content}} +
+ +
+ +
+ + +{% if site.google_analytics %} +{% include google_analytics.html %} +{% endif %} + diff --git a/docs/_layouts/default_print.html b/docs/_layouts/default_print.html new file mode 100644 index 000000000..4bf619b47 --- /dev/null +++ b/docs/_layouts/default_print.html @@ -0,0 +1,25 @@ + + + + + {% include head_print.html %} + + + + + + + +
+ +
+ + {{content}} +
+ +
+ + + + + diff --git a/docs/_layouts/page.html b/docs/_layouts/page.html new file mode 100644 index 000000000..7b324738d --- /dev/null +++ b/docs/_layouts/page.html @@ -0,0 +1,66 @@ +--- +layout: default +--- + +
+

{{ page.title }}

+
+ +{% if page.simple_map == true %} + + + +{% include custom/{{page.map_name}}.html %} + +{% elsif page.complex_map == true %} + + + +{% include custom/{{page.map_name}}.html %} + +{% endif %} + +
+ + {% if page.summary %} +
{{page.summary}}
+ {% endif %} + + {% unless page.toc == false %} + {% include toc.html %} + {% endunless %} + + + {% if site.github_editme_path %} + + Edit me + + {% endif %} + + {{content}} + +
+ {% if page.tags != null %} + Tags: + {% assign projectTags = site.data.tags.allowed-tags %} + {% for tag in page.tags %} + {% if projectTags contains tag %} + {{page.tagName}}{{tag}} + {% endif %} + {% endfor %} + {% endif %} +
+ +
+ +{{site.data.alerts.hr_shaded}} + +{% include footer.html %} diff --git a/docs/_layouts/page_print.html b/docs/_layouts/page_print.html new file mode 100644 index 000000000..9e04604a9 --- /dev/null +++ b/docs/_layouts/page_print.html @@ -0,0 +1,15 @@ +--- +layout: default_print +comments: true +--- +
+

{{ page.title }}

+
+ +
+ + {% if page.summary %} +
{{page.summary}}
+ {% endif %} + {{ content }} +
diff --git a/docs/_layouts/post.html b/docs/_layouts/post.html new file mode 100644 index 000000000..0e01ce6d1 --- /dev/null +++ b/docs/_layouts/post.html @@ -0,0 +1,39 @@ +--- +layout: default +--- +
+ +
+

{{ page.title }}

+ + + +
+ +
+ + {% if page.summary %} +
{{page.summary}}
+ {% endif %} + + {{ content }} +
+ + + +
+ +{% include disqus.html %} + +{{site.data.alerts.hr_shaded}} + +{% include footer.html %} diff --git a/docs/configuration.md b/docs/configuration.md new file mode 100644 index 000000000..8323ca724 --- /dev/null +++ b/docs/configuration.md @@ -0,0 +1,32 @@ +--- +title: Configuration +keywords: homepage +sidebar: talk_sidebar +permalink: configuration.html +summary: +--- + +The Talk application looks for the following configuration values either as environment variables: + +- `TALK_MONGO_URL` (*required*) - the database connection string for the MongoDB database. +- `TALK_REDIS_URL` (*required*) - the database connection string for the Redis database. +- `TALK_ROOT_URL` (*required*) - root url of the installed application externally +available in the format: `://` without the path. +- `TALK_JWT_SECRET` (*required*) - a long and cryptographical secure random string which will be used to +sign and verify tokens via a `HS256` algorithm. +- `TALK_JWT_EXPIRY` (_optional_) - the expiry duration (`exp`) for the tokens issued for logged in sessions (Default `1 day`) +- `TALK_JWT_ISSUER` (_optional_) - the issuer (`iss`) claim for login JWT tokens (Default `process.env.TALK_ROOT_URL`) +- `TALK_JWT_AUDIENCE` (_optional_) - the audience (`aud`) claim for login JWT tokens (Default `talk`) +- `TALK_SMTP_EMAIL` (*required for email*) - the address to send emails from using the + SMTP provider. +- `TALK_SMTP_USERNAME` (*required for email*) - username of the SMTP provider you are using. +- `TALK_SMTP_PASSWORD` (*required for email*) - password for the SMTP provider you are using. +- `TALK_SMTP_HOST` (*required for email*) - SMTP host url with format `smtp.domain.com`. +- `TALK_SMTP_PORT` (*required for email*) - SMTP port. +- `TALK_INSTALL_LOCK` (_optional for dynamic setup_) - Defaults to `FALSE`. When `TRUE`, disables the dynamic setup endpoint. +- `TALK_RECAPTCHA_SECRET` (*required for reCAPTCHA support*) - server secret used for enabling reCAPTCHA powered logins. If not provided it will instead default to providing only a time based lockout. +- `TALK_RECAPTCHA_PUBLIC` (*required for reCAPTCHA support*) - client secret used for enabling reCAPTCHA powered logins. If not provided it will instead default to providing only a time based lockout. +- `TALK_PLUGINS_JSON` (_optional_) - used to specify the plugin config via the environment + +Refer to the wiki page on [Configuration Loading](https://github.com/coralproject/talk/wiki/Configuration-Loading) for +alternative methods of loading configuration during development. diff --git a/docs/css/bootstrap.min.css b/docs/css/bootstrap.min.css new file mode 100755 index 000000000..7b4112f07 --- /dev/null +++ b/docs/css/bootstrap.min.css @@ -0,0 +1,5 @@ +/*! + * Bootstrap v3.3.2 (http://getbootstrap.com) + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + *//*! normalize.css v3.0.2 | MIT License | git.io/normalize */html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0;font-size:2em}mark{color:#000;background:#ff0}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{height:0;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{margin:0;font:inherit;color:inherit}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}input{line-height:normal}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid silver}legend{padding:0;border:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-spacing:0;border-collapse:collapse}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,:after,:before{/*color:#000!important;*/text-shadow:none!important;/*background:0 0!important*/;-webkit-box-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}select{background:#fff!important}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #ddd!important}}@font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff2) format('woff2'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-eur:before,.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-cd:before{content:"\e201"}.glyphicon-save-file:before{content:"\e202"}.glyphicon-open-file:before{content:"\e203"}.glyphicon-level-up:before{content:"\e204"}.glyphicon-copy:before{content:"\e205"}.glyphicon-paste:before{content:"\e206"}.glyphicon-alert:before{content:"\e209"}.glyphicon-equalizer:before{content:"\e210"}.glyphicon-king:before{content:"\e211"}.glyphicon-queen:before{content:"\e212"}.glyphicon-pawn:before{content:"\e213"}.glyphicon-bishop:before{content:"\e214"}.glyphicon-knight:before{content:"\e215"}.glyphicon-baby-formula:before{content:"\e216"}.glyphicon-tent:before{content:"\26fa"}.glyphicon-blackboard:before{content:"\e218"}.glyphicon-bed:before{content:"\e219"}.glyphicon-apple:before{content:"\f8ff"}.glyphicon-erase:before{content:"\e221"}.glyphicon-hourglass:before{content:"\231b"}.glyphicon-lamp:before{content:"\e223"}.glyphicon-duplicate:before{content:"\e224"}.glyphicon-piggy-bank:before{content:"\e225"}.glyphicon-scissors:before{content:"\e226"}.glyphicon-bitcoin:before{content:"\e227"}.glyphicon-yen:before{content:"\00a5"}.glyphicon-ruble:before{content:"\20bd"}.glyphicon-scale:before{content:"\e230"}.glyphicon-ice-lolly:before{content:"\e231"}.glyphicon-ice-lolly-tasted:before{content:"\e232"}.glyphicon-education:before{content:"\e233"}.glyphicon-option-horizontal:before{content:"\e234"}.glyphicon-option-vertical:before{content:"\e235"}.glyphicon-menu-hamburger:before{content:"\e236"}.glyphicon-modal-window:before{content:"\e237"}.glyphicon-oil:before{content:"\e238"}.glyphicon-grain:before{content:"\e239"}.glyphicon-sunglasses:before{content:"\e240"}.glyphicon-text-size:before{content:"\e241"}.glyphicon-text-color:before{content:"\e242"}.glyphicon-text-background:before{content:"\e243"}.glyphicon-object-align-top:before{content:"\e244"}.glyphicon-object-align-bottom:before{content:"\e245"}.glyphicon-object-align-horizontal:before{content:"\e246"}.glyphicon-object-align-left:before{content:"\e247"}.glyphicon-object-align-vertical:before{content:"\e248"}.glyphicon-object-align-right:before{content:"\e249"}.glyphicon-triangle-right:before{content:"\e250"}.glyphicon-triangle-left:before{content:"\e251"}.glyphicon-triangle-bottom:before{content:"\e252"}.glyphicon-triangle-top:before{content:"\e253"}.glyphicon-console:before{content:"\e254"}.glyphicon-superscript:before{content:"\e255"}.glyphicon-subscript:before{content:"\e256"}.glyphicon-menu-left:before{content:"\e257"}.glyphicon-menu-right:before{content:"\e258"}.glyphicon-menu-down:before{content:"\e259"}.glyphicon-menu-up:before{content:"\e260"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}:after,:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:focus,a:hover{color:#23527c;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.carousel-inner>.item>a>img,.carousel-inner>.item>img,.img-responsive,.thumbnail a>img,.thumbnail>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{display:inline-block;max-width:100%;height:auto;padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-weight:400;line-height:1;color:#777}.h1,.h2,.h3,h1,h2,h3{margin-top:20px;margin-bottom:10px}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{font-size:65%}.h4,.h5,.h6,h4,h5,h6{margin-top:10px;margin-bottom:10px}.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-size:75%}.h1,h1{font-size:36px}.h2,h2{font-size:30px}.h3,h3{font-size:24px}.h4,h4{font-size:18px}.h5,h5{font-size:14px}.h6,h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}.small,small{font-size:85%}.mark,mark{padding:.2em;background-color:#fcf8e3}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}a.text-primary:hover{color:#286090}.text-success{color:#3c763d}a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:hover{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ol,ul{margin-top:0;margin-bottom:10px}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;margin-left:-5px;list-style:none}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-top:0;margin-bottom:20px}dd,dt{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[data-original-title],abbr[title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child{margin-bottom:0}blockquote .small,blockquote footer,blockquote small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote .small:before,blockquote footer:before,blockquote small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;text-align:right;border-right:5px solid #eee;border-left:0}.blockquote-reverse .small:before,.blockquote-reverse footer:before,.blockquote-reverse small:before,blockquote.pull-right .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before{content:''}.blockquote-reverse .small:after,.blockquote-reverse footer:after,.blockquote-reverse small:after,blockquote.pull-right .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after{content:'\00A0 \2014'}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;font-weight:700;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{margin-right:-15px;margin-left:-15px}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #ddd}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}table col[class*=col-]{position:static;display:table-column;float:none}table td[class*=col-],table th[class*=col-]{position:static;display:table-cell;float:none}.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#f5f5f5}.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{background-color:#e8e8e8}.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{background-color:#dff0d8}.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#d0e9c6}.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#d9edf7}.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#c4e3f3}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fcf8e3}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#faf2cc}.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#f2dede}.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#ebcccc}.table-responsive{min-height:.01%;overflow-x:auto}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=checkbox],input[type=radio]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=file]:focus,input[type=checkbox]:focus,input[type=radio]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{cursor:not-allowed;background-color:#eee;opacity:1}textarea.form-control{height:auto}input[type=search]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type=date],input[type=time],input[type=datetime-local],input[type=month]{line-height:34px}.input-group-sm input[type=date],.input-group-sm input[type=time],.input-group-sm input[type=datetime-local],.input-group-sm input[type=month],input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:30px}.input-group-lg input[type=date],.input-group-lg input[type=time],.input-group-lg input[type=datetime-local],.input-group-lg input[type=month],input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:46px}}.form-group{margin-bottom:15px}.checkbox,.radio{position:relative;display:block;margin-top:10px;margin-bottom:10px}.checkbox label,.radio label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{position:absolute;margin-top:4px \9;margin-left:-20px}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox].disabled,input[type=checkbox][disabled],input[type=radio].disabled,input[type=radio][disabled]{cursor:not-allowed}.checkbox-inline.disabled,.radio-inline.disabled,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio-inline{cursor:not-allowed}.checkbox.disabled label,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .radio label{cursor:not-allowed}.form-control-static{padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-right:0;padding-left:0}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}select[multiple].input-sm,textarea.input-sm{height:auto}.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.form-group-sm .form-control{height:30px;line-height:30px}select[multiple].form-group-sm .form-control,textarea.form-group-sm .form-control{height:auto}.form-group-sm .form-control-static{height:30px;padding:5px 10px;font-size:12px;line-height:1.5}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-lg{height:46px;line-height:46px}select[multiple].input-lg,textarea.input-lg{height:auto}.form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.form-group-lg .form-control{height:46px;line-height:46px}select[multiple].form-group-lg .form-control,textarea.form-group-lg .form-control{height:auto}.form-group-lg .form-control-static{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .help-block,.has-success .radio,.has-success .radio-inline,.has-success.checkbox label,.has-success.checkbox-inline label,.has-success.radio label,.has-success.radio-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.has-success .form-control-feedback{color:#3c763d}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline,.has-warning.checkbox label,.has-warning.checkbox-inline label,.has-warning.radio label,.has-warning.radio-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .help-block,.has-error .radio,.has-error .radio-inline,.has-error.checkbox label,.has-error.checkbox-inline label,.has-error.radio label,.has-error.radio-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-error .form-control-feedback{color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox label,.form-inline .radio label{padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .checkbox,.form-horizontal .radio{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.form-horizontal .control-label{padding-top:7px;margin-bottom:0;text-align:right}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:14.33px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px}}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:400;line-height:1.42857143;text-align:center;white-space:nowrap;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-image:none;border:1px solid transparent;border-radius:4px}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.focus,.btn:focus,.btn:hover{color:#333;text-decoration:none}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{pointer-events:none;cursor:not-allowed;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none;opacity:.65}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default.active,.btn-default.focus,.btn-default:active,.btn-default:focus,.btn-default:hover,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.btn-default.disabled.active,.btn-default.disabled.focus,.btn-default.disabled:active,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled],.btn-default[disabled].active,.btn-default[disabled].focus,.btn-default[disabled]:active,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default,fieldset[disabled] .btn-default.active,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:active,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary.active,.btn-primary.focus,.btn-primary:active,.btn-primary:focus,.btn-primary:hover,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary.disabled.active,.btn-primary.disabled.focus,.btn-primary.disabled:active,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled],.btn-primary[disabled].active,.btn-primary[disabled].focus,.btn-primary[disabled]:active,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-primary.active,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:active,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success.active,.btn-success.focus,.btn-success:active,.btn-success:focus,.btn-success:hover,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success.disabled.active,.btn-success.disabled.focus,.btn-success.disabled:active,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled],.btn-success[disabled].active,.btn-success[disabled].focus,.btn-success[disabled]:active,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success,fieldset[disabled] .btn-success.active,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:active,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info.active,.btn-info.focus,.btn-info:active,.btn-info:focus,.btn-info:hover,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info.disabled.active,.btn-info.disabled.focus,.btn-info.disabled:active,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled],.btn-info[disabled].active,.btn-info[disabled].focus,.btn-info[disabled]:active,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info,fieldset[disabled] .btn-info.active,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:active,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning.active,.btn-warning.focus,.btn-warning:active,.btn-warning:focus,.btn-warning:hover,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning.disabled.active,.btn-warning.disabled.focus,.btn-warning.disabled:active,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled],.btn-warning[disabled].active,.btn-warning[disabled].focus,.btn-warning[disabled]:active,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning,fieldset[disabled] .btn-warning.active,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:active,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger.active,.btn-danger.focus,.btn-danger:active,.btn-danger:focus,.btn-danger:hover,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger.disabled.active,.btn-danger.disabled.focus,.btn-danger.disabled:active,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled],.btn-danger[disabled].active,.btn-danger[disabled].focus,.btn-danger[disabled]:active,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger,fieldset[disabled] .btn-danger.active,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:active,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{font-weight:400;color:#337ab7;border-radius:0}.btn-link,.btn-link.active,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#777;text-decoration:none}.btn-group-lg>.btn,.btn-lg{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-group-sm>.btn,.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-xs>.btn,.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none;visibility:hidden}.collapse.in{display:block;visibility:visible}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease;-webkit-transition-duration:.35s;-o-transition-duration:.35s;transition-duration:.35s;-webkit-transition-property:height,visibility;-o-transition-property:height,visibility;transition-property:height,visibility}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px solid;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown,.dropup{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;text-align:left;list-style:none;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;background-color:#337ab7;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#777}.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{right:0;left:auto}.dropdown-menu-left{right:auto;left:0}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{content:"";border-top:0;border-bottom:4px solid}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{right:auto;left:0}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;float:left}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0;border-bottom-left-radius:4px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn,textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn,textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{margin-left:-1px}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#777;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#eee;border-color:#337ab7}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#337ab7}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none;visibility:hidden}.tab-content>.active{display:block;visibility:visible}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{padding-right:15px;padding-left:15px;overflow-x:visible;-webkit-overflow-scrolling:touch;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1)}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important;visibility:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse{padding-right:0;padding-left:0}}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:200px}}.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-bottom,.navbar-fixed-top{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;height:50px;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:focus,.navbar-nav .open .dropdown-menu>li>a:hover{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{padding:10px 15px;margin-top:8px;margin-right:-15px;margin-bottom:8px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1)}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .form-control,.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .checkbox,.navbar-form .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .checkbox label,.navbar-form .radio label{padding-left:0}.navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-left-radius:0;border-top-right-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left:15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:focus,.navbar-default .navbar-brand:hover{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:focus,.navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus,.navbar-default .navbar-nav>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:focus,.navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:focus,.navbar-default .navbar-toggle:hover{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:focus,.navbar-default .navbar-nav>.open>a:hover{color:#555;background-color:#e7e7e7}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:focus,.navbar-default .btn-link:hover{color:#333}.navbar-default .btn-link[disabled]:focus,.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:focus,fieldset[disabled] .navbar-default .btn-link:hover{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#9d9d9d}.navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a:focus,.navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:focus,.navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:focus,.navbar-inverse .navbar-toggle:hover{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:focus,.navbar-inverse .navbar-nav>.open>a:hover{color:#fff;background-color:#080808}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#9d9d9d}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#9d9d9d}.navbar-inverse .btn-link:focus,.navbar-inverse .btn-link:hover{color:#fff}.navbar-inverse .btn-link[disabled]:focus,.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:focus,fieldset[disabled] .navbar-inverse .btn-link:hover{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#777}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.42857143;color:#337ab7;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{color:#23527c;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{z-index:2;color:#fff;cursor:default;background-color:#337ab7;border-color:#337ab7}.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{color:#777;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-top-left-radius:6px;border-bottom-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-top-left-radius:3px;border-bottom-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:focus,.pager li>a:hover{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:focus,.pager .disabled>a:hover,.pager .disabled>span{color:#777;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:focus,a.label:hover{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:focus,.label-default[href]:hover{background-color:#5e5e5e}.label-primary{background-color:#337ab7}.label-primary[href]:focus,.label-primary[href]:hover{background-color:#286090}.label-success{background-color:#5cb85c}.label-success[href]:focus,.label-success[href]:hover{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:focus,.label-info[href]:hover{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:focus,.label-warning[href]:hover{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:focus,.label-danger[href]:hover{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-xs .badge{top:0;padding:1px 5px}a.badge:focus,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#337ab7;background-color:#fff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding:30px 15px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron .h1,.jumbotron h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron,.container-fluid .jumbotron{border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding:48px 0}.container .jumbotron,.container-fluid .jumbotron{padding-right:60px;padding-left:60px}.jumbotron .h1,.jumbotron h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail a>img,.thumbnail>img{margin-right:auto;margin-left:auto}a.thumbnail.active,a.thumbnail:focus,a.thumbnail:hover{border-color:#337ab7}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#337ab7;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-bar-striped,.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress-bar.active,.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{overflow:hidden;zoom:1}.media-body{width:10000px}.media-object{display:block}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-body,.media-left,.media-right{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}a.list-group-item{color:#555}a.list-group-item .list-group-item-heading{color:#333}a.list-group-item:focus,a.list-group-item:hover{color:#555;text-decoration:none;background-color:#f5f5f5}.list-group-item.disabled,.list-group-item.disabled:focus,.list-group-item.disabled:hover{color:#777;cursor:not-allowed;background-color:#eee}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7}.list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:focus .list-group-item-text,.list-group-item.active:hover .list-group-item-text{color:#c7ddef}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:focus,a.list-group-item-success:hover{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:focus,a.list-group-item-success.active:hover{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:focus,a.list-group-item-info:hover{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:focus,a.list-group-item-info.active:hover{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:focus,a.list-group-item-warning:hover{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:focus,a.list-group-item-warning.active:hover{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:focus,a.list-group-item-danger:hover{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>.small,.panel-title>.small>a,.panel-title>a,.panel-title>small,.panel-title>small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-left-radius:3px;border-top-right-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.panel-collapse>.table,.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.panel-collapse>.table caption,.panel>.table caption,.panel>.table-responsive>.table caption{padding-right:15px;padding-left:15px}.panel>.table-responsive:first-child>.table:first-child,.panel>.table:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table:first-child>thead:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table-responsive:last-child>.table:last-child,.panel>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child td,.panel>.table>tbody:first-child>tr:first-child th{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{margin-bottom:0;border:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.list-group,.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#337ab7}.panel-primary>.panel-heading{color:#fff;background-color:#337ab7;border-color:#337ab7}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#337ab7}.panel-primary>.panel-heading .badge{color:#337ab7;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#337ab7}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20);opacity:.2}.close:focus,.close:hover{color:#000;text-decoration:none;cursor:pointer;filter:alpha(opacity=50);opacity:.5}button.close{-webkit-appearance:none;padding:0;cursor:pointer;background:0 0;border:0}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;display:none;overflow:hidden;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out;-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);-o-transform:translate(0,-25%);transform:translate(0,-25%)}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5)}.modal-backdrop{position:absolute;top:0;right:0;left:0;background-color:#000}.modal-backdrop.fade{filter:alpha(opacity=0);opacity:0}.modal-backdrop.in{filter:alpha(opacity=50);opacity:.5}.modal-header{min-height:16.43px;padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:12px;font-weight:400;line-height:1.4;visibility:visible;filter:alpha(opacity=0);opacity:0}.tooltip.in{filter:alpha(opacity=90);opacity:.9}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{right:5px;bottom:0;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;font-weight:400;line-height:1.42857143;text-align:left;white-space:normal;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2)}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{content:"";border-width:10px}.popover.top>.arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}.popover.top>.arrow:after{bottom:1px;margin-left:-10px;content:" ";border-top-color:#fff;border-bottom-width:0}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0}.popover.right>.arrow:after{bottom:-10px;left:1px;content:" ";border-right-color:#fff;border-left-width:0}.popover.bottom>.arrow{top:-11px;left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25)}.popover.bottom>.arrow:after{top:1px;margin-left:-10px;content:" ";border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{right:1px;bottom:-10px;content:" ";border-right-width:0;border-left-color:#fff}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>a>img,.carousel-inner>.item>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000;perspective:1000}.carousel-inner>.item.active.right,.carousel-inner>.item.next{left:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.carousel-inner>.item.active.left,.carousel-inner>.item.prev{left:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.carousel-inner>.item.active,.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right{left:0;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6);filter:alpha(opacity=50);opacity:.5}.carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,.0001)));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);background-repeat:repeat-x}.carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.0001)),to(rgba(0,0,0,.5)));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);background-repeat:repeat-x}.carousel-control:focus,.carousel-control:hover{color:#fff;text-decoration:none;filter:alpha(opacity=90);outline:0;opacity:.9}.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{position:absolute;top:50%;z-index:5;display:inline-block}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{left:50%;margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{right:50%;margin-right:-10px}.carousel-control .icon-next,.carousel-control .icon-prev{width:20px;height:20px;margin-top:-10px;font-family:serif;line-height:1}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000 \9;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{width:30px;height:30px;margin-top:-15px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-15px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-15px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.btn-group-vertical>.btn-group:after,.btn-group-vertical>.btn-group:before,.btn-toolbar:after,.btn-toolbar:before,.clearfix:after,.clearfix:before,.container-fluid:after,.container-fluid:before,.container:after,.container:before,.dl-horizontal dd:after,.dl-horizontal dd:before,.form-horizontal .form-group:after,.form-horizontal .form-group:before,.modal-footer:after,.modal-footer:before,.nav:after,.nav:before,.navbar-collapse:after,.navbar-collapse:before,.navbar-header:after,.navbar-header:before,.navbar:after,.navbar:before,.pager:after,.pager:before,.panel-body:after,.panel-body:before,.row:after,.row:before{display:table;content:" "}.btn-group-vertical>.btn-group:after,.btn-toolbar:after,.clearfix:after,.container-fluid:after,.container:after,.dl-horizontal dd:after,.form-horizontal .form-group:after,.modal-footer:after,.nav:after,.navbar-collapse:after,.navbar-header:after,.navbar:after,.pager:after,.panel-body:after,.row:after{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important;visibility:hidden!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-lg,.visible-md,.visible-sm,.visible-xs{display:none!important}.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table}tr.visible-xs{display:table-row!important}td.visible-xs,th.visible-xs{display:table-cell!important}}@media (max-width:767px){.visible-xs-block{display:block!important}}@media (max-width:767px){.visible-xs-inline{display:inline!important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table}tr.visible-sm{display:table-row!important}td.visible-sm,th.visible-sm{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table}tr.visible-md{display:table-row!important}td.visible-md,th.visible-md{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table}tr.visible-lg{display:table-row!important}td.visible-lg,th.visible-lg{display:table-cell!important}}@media (min-width:1200px){.visible-lg-block{display:block!important}}@media (min-width:1200px){.visible-lg-inline{display:inline!important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-lg{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table}tr.visible-print{display:table-row!important}td.visible-print,th.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}}@media print{.hidden-print{display:none!important}} \ No newline at end of file diff --git a/docs/css/customstyles.css b/docs/css/customstyles.css new file mode 100644 index 000000000..452b23bf1 --- /dev/null +++ b/docs/css/customstyles.css @@ -0,0 +1,1179 @@ +body { + font-size:15px; +} + +.bs-callout { + padding: 20px; + margin: 20px 0; + border: 1px solid #eee; + border-left-width: 5px; + border-radius: 3px; +} +.bs-callout h4 { + margin-top: 0; + margin-bottom: 5px; +} +.bs-callout p:last-child { + margin-bottom: 0; +} +.bs-callout code { + border-radius: 3px; +} +.bs-callout+.bs-callout { + margin-top: -5px; +} +.bs-callout-default { + border-left-color: #777; +} +.bs-callout-default h4 { + color: #777; +} +.bs-callout-primary { + border-left-color: #428bca; +} +.bs-callout-primary h4 { + color: #428bca; +} +.bs-callout-success { + border-left-color: #5cb85c; +} +.bs-callout-success h4 { + color: #5cb85c; +} +.bs-callout-danger { + border-left-color: #d9534f; +} +.bs-callout-danger h4 { + color: #d9534f; +} +.bs-callout-warning { + border-left-color: #f0ad4e; +} +.bs-callout-warning h4 { + color: #f0ad4e; +} +.bs-callout-info { + border-left-color: #5bc0de; +} +.bs-callout-info h4 { + color: #5bc0de; +} + + +.gi-2x{font-size: 2em;} +.gi-3x{font-size: 3em;} +.gi-4x{font-size: 4em;} +.gi-5x{font-size: 5em;} + + + + + +.breadcrumb > .active {color: #777 !important;} + +/* make room for the nav bar */ +h1[id], +h2[id], +h3[id], +h4[id], +h5[id], +h6[id], +dt[id]{ +padding-top: 60px; +margin-top: -40px +} + +body h1 {margin-top:40px;} + +.post-content img { + margin: 12px 0px 3px 0px; + width: auto; + height: auto; + max-width: 100%; + max-height: 100%; +} + +.post-content ol li, .post-content ul li { + margin: 10px 0px; +} + +.pageSummary { + font-size:13px; + display:block; + margin-bottom:15px; + padding-left:20px; +} + +.post-summary { + margin-bottom:12px; +} + +.bs-example{ + margin: 20px; +} + +.breadcrumb li { + color: gray; +} + +table { + background-color: transparent; +} +caption { + padding-top: 8px; + padding-bottom: 8px; + color: #777; + text-align: left; +} +th { + text-align: left; +} +table { + max-width: 90%; + margin-bottom: 20px; + border: 1px solid #dedede; +} + +table > thead > tr > th, +table > tbody > tr > th, +table > tfoot > tr > th, +table > thead > tr > td, +table > tbody > tr > td, +table > tfoot > tr > td { + padding: 8px; + line-height: 1.42857143; + vertical-align: top; + border-top: 1px solid #ddd; +} +table > thead > tr > th { + vertical-align: bottom; + border-bottom: 2px solid #ddd; + text-transform: none; + background-color: #777; + color: white; + text-align: left; +} +table > caption + thead > tr:first-child > th, +table > colgroup + thead > tr:first-child > th, +table > thead:first-child > tr:first-child > th, +table > caption + thead > tr:first-child > td, +table > colgroup + thead > tr:first-child > td, +table > thead:first-child > tr:first-child > td { + border-top: 0; +} + +table > tbody > tr:nth-of-type(odd) { + background-color: #f9f9f9; +} + +table col[class*="col-"] { + position: static; + display: table-column; + float: none; +} +table td[class*="col-"], +table th[class*="col-"] { + position: static; + display: table-cell; + float: none; +} + + +table td:first-child { + width: 150px; + /*font-weight:bold;*/ +} + +table.boldFirstColumn td:first-child { + font-weight: bold; +} + +table tr td { + hyphens: auto; +} + + +p.external a { + text-align:right; + font-size:12px; + color: #0088cc; + display:inline; +} + +#definition-box-container div a.active { + font-weight: bold; +} +p.post-meta {font-size: 80%; color: #777;} + +.entry-date{font-size:14px;font-size:0.875rem;line-height:1.71429;margin-bottom:0;text-transform:uppercase;} + +/* search area */ +#search-demo-container ul#results-container { + list-style: none; + font-size: 12px; + background-color: white; + position: absolute; + top: 40px; /* if you change anything about the nav, you'll prob. need to reset the top and left values here.*/ + left: 20px; + z-index: -1; + width:223px; + border-left: 1px solid #dedede; + box-shadow: 2px 3px 2px #dedede; +} + + +ul#results-container a { + background-color: transparent; +} + +ul#results-container a:hover { + color: black; +} + + +#search-demo-container a:hover { + color: black; +} +#search-input { + padding: .5em; + margin-left:20px; + width:20em; + font-size: 0.8em; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + float: right; + margin-top:10px; +} +/* end search */ + +.filter-options { + margin-bottom: 20px; +} +.filter-options button { + margin: 3px; +} + +div#toc ul li { + margin: 8px 0px 8px 22px; + font-size: 90%; + list-style: square; +} +div#toc ul { + background-color: whitesmoke; + padding: 5px; + border-radius: 5px; + max-width: 300px; + color: gray; +} + +div#toc ul li ul { + padding-left:8px; + +} + +div#toc ul li ul li::before { + content: "– "; +} + +div#toc >ul::before { + content: "Table of Contents"; + font-weight: 500; + color: #555; + text-align:center; + margin-left:auto; + margin-right:auto; + width:70px; + padding-top:20px; + padding-bottom:20px; + padding-left:10px; +} + +li.dropdownActive a { + font-weight: bold; +} + + +.post-content a.fa-rss { + color: orange; +} + + +.navbar-inverse .navbar-nav > li > a { + background-color: transparent; + margin-top:10px; +} + +.post-content .rssfeedLink { + color: #248EC2; +} + +footer { + font-size: smaller; +} + +/* FAQ page */ +#accordion .panel-heading { + font-size: 12px; +} + +a.accordion-toggle, a.accordion-collapsed { + font-size: 14px; + text-decoration: none; +} + +/* navgoco sidebar styles (customized) */ +.nav, .nav ul, .nav li { + list-style: none; +} + +.nav ul { + padding: 0; + /*margin: 0 0 0 18px;*/ + margin:0px; +} + +.nav { + /* padding: 4px;*/ + padding:0px; + margin: 0px; +} + +.nav > li { + margin: 1px 0; +} + +.nav > li li { + margin: 2px 0; +} + +.nav a { + color: #333; + display: block; + outline: none; + /*-webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px;*/ + text-decoration: none; +} + +.nav li > a > span { + float: right; + font-size: 19px; + font-weight: bolder; +} + + +.nav li > a > span:after { + content: '\25be'; +} +.nav li.active > a > span:after { + content: '\25b4'; +} + +.nav a:hover, .nav li.active > a { + background-color: #8D8D8D; + color: #f5f5f5; +} + +.nav > li.active > a { +background-color: #347DBE; +} + +.nav li a { + font-size: 12px; + line-height: 18px; + padding: 2px 10px; + background-color: #f1f1f1; +} + +.nav > li > a { + font-size: 14px; + line-height: 20px; + padding: 4px 10px; +} + +ul#mysidebar { + border-radius:0px; +} + +.nav ul li ul li a { + padding-left:40px; +} + +.nav li.thirdlevel > a { + color: #248EC2; + font-weight:bold; + padding-left:20px; + background-color: whitesmoke !important; +} + + +.nav ul li a { + background-color: #FAFAFA; +} + +.nav li a { + padding-right:10px; +} + +.nav li a:hover { + background-color: #8D8D8D; +} + +.nav ul li a { + border-top:1px solid whitesmoke; + padding-left:10px; +} +/* end sidebar */ + +.navbar-inverse .navbar-nav > .active > a, .navbar-inverse .navbar-nav > .active > a:hover, .navbar-inverse .navbar-nav > .active > a:focus { + border-radius:5px; +} + +.navbar-inverse .navbar-nav>.open>a, .navbar-inverse .navbar-nav>.open>a:focus, .navbar-inverse .navbar-nav>.open>a:hover { + border-radius: 5px; +} + +span.projectTitle { + font-family: Helvetica; + font-weight: bold; +} + +.footer { + text-align: right; +} + +.footerMeta { + background-color: whitesmoke; + padding: 10px; + max-width: 250px; + border-radius: 5px; + margin-top: 50px; + font-style:italic; + font-size:12px; +} + +img.screenshotSmall { + max-width: 300px; +} + + +dl dt p { + margin-left:20px; +} + + +dl dd { + margin-top:10px; + margin-bottom:10px; +} + +dl.dl-horizontal dd { + padding-top: 20px; +} + +figcaption { + + padding-bottom:12px; + padding-top:6px; + max-width: 90%; + margin-bottom:20px; + font-style: italic; + color: gray; + +} + +.testing { + color: orange; +} + +.preference { + color: red; +} + + +table.dataTable thead { + background-color: #444; +} +table td { + hyphens: auto; +} + +section table tr.success { + background-color: #dff0d8 !important; +} + +table tr.info { + background-color: #d9edf7 !important; +} + +section table tr.warning, table tr.testing, table tr.testing > td.sorting_1 { + background-color: #fcf8e3 !important; +} +section table tr.danger, table tr.preference, table tr.preference > td.sorting_1 { + background-color: #f2dede !important; +} + +.orange { + color: orange; +} + +table.profile thead tr th { + background-color: #248ec2; +} + +table.request thead tr th { + background-color: #ED1951; +} + +.audienceLabel { + margin: 10px; + float: right; + border:1px solid #dedede; + padding:7px; +} + +.prefaceAudienceLabel { + color: gray; + text-align: center; + margin:5px; +} +span.myLabel { + padding-left:10px; + padding-right:10px; +} + +button.cursorNorm { + cursor: default; +} + +a.dropdown-toggle, .navbar-inverse .navbar-nav > li > a { + margin-left: 10px; +} + +hr.faded { + border: 0; + height: 1px; + background-image: -webkit-linear-gradient(left, rgba(0,0,0,0), rgba(0,0,0,0.75), rgba(0,0,0,0)); + background-image: -moz-linear-gradient(left, rgba(0,0,0,0), rgba(0,0,0,0.75), rgba(0,0,0,0)); + background-image: -ms-linear-gradient(left, rgba(0,0,0,0), rgba(0,0,0,0.75), rgba(0,0,0,0)); + background-image: -o-linear-gradient(left, rgba(0,0,0,0), rgba(0,0,0,0.75), rgba(0,0,0,0)); +} + +hr.shaded { + height: 12px; + border: 0; + box-shadow: inset 0 6px 6px -6px rgba(0,0,0,0.5); + margin-top: 70px; + background: white; + width: 100%; + margin-bottom: 10px; +} + +.fa-6x{font-size:900%;} +.fa-7x{font-size:1100%;} +.fa-8x{font-size:1300%;} +.fa-9x{font-size:1500%;} +.fa-10x{font-size:1700%;} + +i.border { + padding: 10px 20px; + background-color: whitesmoke; +} + +a[data-toggle] { + color: #248EC2; +} + +.summary { + font-size:120%; + color: #808080; + margin:20px 0px 20px 0px; + border-left: 5px solid #ED1951; + padding-left: 10px; + +} + +.summary:before { + content: "Summary: "; + font-weight: bold; +} + + +a.fa.fa-envelope-o.mailto { + font-weight: 600; +} + +h3 {color: #ED1951; font-weight:normal; font-size:130%;} +h4 {color: #808080; font-weight:normal; font-size:120%; font-style:italic;} + +.alert, .callout { + overflow: hidden; +} + +.nav-tabs > li.active > a, .nav-tabs > li.active > a:hover, .nav-tabs > li.active > a:focus { + background-color: #248ec2; + color: white; +} + +ol li ol li {list-style-type: lower-alpha;} +ol li ul li {list-style-type: disc;} + +li img {clear:both; } + +div#toc ul li ul li { + list-style-type: none; + margin: 5px 0px 0px 0px; +} + +.tab-content { + padding: 15px; + background-color: #FAFAFA; +} + +span.tagTitle {font-weight: 500;} + +li.activeSeries { + font-weight: bold; +} + +.seriesContext .dropdown-menu li.active { + font-weight: bold; + margin-left: 43px; + font-size:18px; +} + +.alert-warning { + color: #444; +} + +div.alert code, h2 code { + background-color: transparent !important; +} +/* without this, the links in these notes aren't visible.*/ +.alert a { + text-decoration: underline; +} + +div.tags {padding: 10px 5px;} + +.tabLabel { + font-weight: normal; +} + +hr { + background: #999; + margin: 30px 0px; + width: 90%; + margin-left: auto; + margin-right: auto; +} + +button.cursorNorm { + cursor: pointer; +} + +h2 { + font-size:24px; + line-height:29px; +} +span.otherProgrammingLanguages { + font-style: normal; +} + +a[data-toggle="tooltip"] { + color: #649345; + font-style: italic; + cursor: default; +} + +.seriesNext, .seriesContext { + margin-top: 15px; + margin-bottom: 15px; +} + +.seriescontext ol li { + list-style-type: upper-roman; +} + +ol.series li { + list-style-type: decimal; + margin-left: 40px; + padding-left: 0px; +} + +.siteTagline { + font-size: 200%; + font-weight: bold; + color: silver; + font-family: monospace; + text-align: center; + line-height: 10px; + margin: 20px 0px; + display: block; +} + +.versionTagline { + text-align: center; + margin-bottom: 20px; + font-family: courier; + color: silver; + color: #444; + display:block; +} + +/* not sure if using this ...*/ +.navbar-inverse .navbar-collapse, .navbar-inverse .navbar-form { + border-color: #248ec2 !important; +} + +#mysidebar .nav ul { + background-color: #FAFAFA; +} +.nav ul.series li { + list-style: decimal; + font-size:12px; +} + +.nav ul.series li a:hover { + background-color: gray; +} +.nav ul.series { + padding-left: 30px; +} + +.nav ul.series { + background-color: #FAFAFA; +} + +/* +a.dropdown-toggle.otherProgLangs { + color: #f7e68f !important; +} +*/ + +span.muted {color: #666;} + +table code {background-color: transparent;} + +.highlight .err { + color: #a61717; + background-color: transparent !important; +} + +table p { + margin-top: 12px; + margin-bottom: 12px; +} + +pre, table code { + white-space: pre-wrap; /* css-3 */ + white-space: -moz-pre-wrap; /* Mozilla, since 1999 */ + white-space: -pre-wrap; /* Opera 4-6 */ + white-space: -o-pre-wrap; /* Opera 7 */ + word-wrap: break-word; /* Internet Explorer 5.5+ */ +} + +pre { + margin: 25px 0px; +} + +#json-box-container pre { + margin: 0px; +} + +.video-js { + margin: 30px 0px; +} + +video { + display: block; + margin: 30px 0px; + border: 1px solid #c0c0c0; +} + + +p.required, p.dataType {display: block; color: #c0c0c0; font-size: 80%; margin-left:4px;} + +dd {margin-left:20px;} + +.post-content img.inline { + margin:0px; + margin-bottom:6px; +} +.panel-heading { + font-weight: bold; +} + +.note code, .alert code, .warning code, div#toc code, h2 code, h3 code, h4 code { + color: inherit; + padding: 0px; +} + +.alert { + margin-bottom:10px; + margin-top:10px; +} + +a.accordion-toggle { + font-style: normal; +} + +span.red { + color: red; + font-family: Monaco, Menlo, Consolas, "Courier New", monospace; +} + +h3.codeExplanation { + font-size:18px; + font-style:normal; + color: black; + line-height: 24px; +} + +span.soft { + color: #c0c0c0; +} + +.githubEditButton { + margin-bottom:7px; +} + +.endpoint { + padding: 15px; + background-color: #f0f0f0; + font-family: courier; + font-size: 110%; + margin: 20px 0px; + color: #444; +} + +.parameter { + font-family: courier; + color: red !important; +} + +.formBoundary { + border: 1px solid gray; + padding: 15px; + margin: 15px 0px; + background-color: whitesmoke; +} + +@media (max-width: 767px) { + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a { + color: #444; + } +} + +@media (max-width: 990px) { + #mysidebar { + position: relative; + } +} + +@media (min-width: 1000px) { + + ul#mysidebar { + width: 225px; + } +} + +@media (max-width: 900px) { + + ul#mysidebar { + max-width: 100%; + } +} + +.col-md-9 img { + max-width: 100%; + max-height: 100%; +} + + +.post-content img { + margin: 12px 0px 3px 0px; + width: auto; + height: auto; + max-width: 100%; + max-height: 100%; +} +.col-md-9 img { + max-width: 100%; + max-height: 100%; +} + + +.post-content img { + margin: 12px 0px 3px 0px; + width: auto; + height: auto; + max-width: 100%; + max-height: 100%; +} + +.videoThumbs img { + float: left; + margin:15px 15px 15px 0px; + box-shadow: 2px 2px 1px #f0f0f0; + border: 1px solid #dedede; +} + + +@media only screen and (min-width: 900px), only screen and (min-device-width: 900px) { + .col-md-9 img { + max-width: 700px; + max-height: 700px; + } +} + +*:hover > .anchorjs-link { + transition: color .25s linear; + text-decoration: none; +} + +.kbCaption { + color: white; + background-color: #444; + padding:10px; +} + +/* this part adds an icon after external links, using FontAwesome*/ +a[href^="http://"]:after, a[href^="https://"]:after { + content: "\f08e"; + font-family: FontAwesome; + font-weight: normal; + font-style: normal; + display: inline-block; + text-decoration: none; + padding-left: 3px; +} + +/* Strip the outbound icon when this class is present */ +a[href].noCrossRef::after, +a.no_icon:after + { + content:"" !important; + padding-left: 0; +} + +.btn-default { + margin-bottom: 10px; +} + +/* algolia search */ + +.search { + text-align: left; +} +.search input { + font-size: 20px; + width: 300px; +} +.results { + margin: auto; + text-align: left; +} +.results ul { + list-style-type: none; + padding: 0; +} + +/* algolia */ + +div.results { + position: absolute; + background-color: white; + width: 100%; +} + +.post-meta { + font-size: 14px; + color: #828282; +} + +.post-link { + font-size: 22px; +} + +.post-list p { + margin: 10px 0px; +} + +time { + margin-right: 10px; +} + +p.post-meta time { + margin-right: 0px; +} + +span.label.label-default { + background-color: gray; +} + +span.label.label-primary { + background-color: #f0ad4e; +} +.col-lg-12 .nav li a {background-color: white} + + +.nav li.active > a.subfoldersTitle { + background-color: whitesmoke; + font-weight: bold; + color: black; + } + +a code { + color: #248EC2; +} + +code + a > code { + margin-left: -7px; +} + +table th code { + color: white; +} + +ol li ul li ol li { + list-style: decimal; +} + +ol li ul li ol li ul li{ + list-style: disc; +} + +.post-content table th { + vertical-align: top; +} + +table thead th code.highlighter-rouge { + background-color: transparent; +} + + +.box { + padding: 10px; + border: 1px solid #888; + box-shadow: 2px 2px 4px #dedede; + width: 100px; + height: 80px; + background-color: #f5f5f5; + font-family: Arial; + font-size: 12px; + hyphens: auto; + float: left; + font-size: 12px; +} + +.box:hover { + background-color: #f0f0f0; +} + +#userMap { + overflow-x: auto; + overflow-y: auto; + padding: 20px; + min-width: 770px; +} + +#userMap .active { + background-color: #d6f5d6; + border:1px solid #555; + font-weight: bold; +} + +h2.userMapTitle { + font-family: Arial; +} + +#userMap a:hover { + text-decoration: none; + } + +div.arrow { + max-width: 50px; + margin-left: 15px; + margin-right: 15px; + font-size: 20px; +} + +div.content { + max-width: 110px +} + +#userMap div.arrow, #userMap div.content { + float: left; +} + +.clearfix { + clear: both; +} + + +#userMap div.arrow { + position: relative; + top: 30px; +} + +.box1 { + margin-left:0px; +} + +button.btn.btn-default.btn-lg.modalButton1 { + margin-left: -20px; +} + +div.box.box1 { + margin-left: -20px; +} + +#userMap .btn-lg { + width: 100px; + height: 80px; + +} + +#userMap .complexArrow { + font-size: 22px; + margin: 0px 10px; +} + + +#userMap .btn-lg .active { + background-color: #d6f5d6; +} + +#userMap .btn-lg { + white-space: pre-wrap; /* css-3 */ + white-space: -moz-pre-wrap; /* Mozilla, since 1999 */ + white-space: -pre-wrap; /* Opera 4-6 */ + white-space: -o-pre-wrap; /* Opera 7 */ + word-wrap: break-word; /* Internet Explorer 5.5+ */ + font-size: 14px; + } + +/* + * Let's target IE to respect aspect ratios and sizes for img tags containing SVG files + * + * [1] IE9 + * [2] IE10+ + */ +/* 1 */ +.ie9 img[src$=".svg"] { + width: 100%; +} +/* 2 */ +@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) { + img[src$=".svg"] { + width: 100%; + } +} + +h4.panel-title { + padding-top: 0px; + margin-top: 0px; +} diff --git a/docs/css/font-awesome.min.css b/docs/css/font-awesome.min.css new file mode 100644 index 000000000..08e68ec0c --- /dev/null +++ b/docs/css/font-awesome.min.css @@ -0,0 +1,4 @@ +/*! + * Font Awesome 4.2.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */@font-face{font-family:'FontAwesome';src:url('fonts/fontawesome-webfont.eot?v=4.2.0');src:url('fonts/fontawesome-webfont.eot?#iefix&v=4.2.0') format('embedded-opentype'),url('fonts/fontawesome-webfont.woff?v=4.2.0') format('woff'),url('fonts/fontawesome-webfont.ttf?v=4.2.0') format('truetype'),url('fonts/fontawesome-webfont.svg?v=4.2.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1);-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"} \ No newline at end of file diff --git a/docs/css/fonts/FontAwesome.otf b/docs/css/fonts/FontAwesome.otf new file mode 100644 index 0000000000000000000000000000000000000000..f7936cc1e789eea5438d576d6b12de20191da09d GIT binary patch literal 93888 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 z -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 E0UHWiZ2$lO literal 0 HcmV?d00001 diff --git a/docs/css/fonts/fontawesome-webfont.eot b/docs/css/fonts/fontawesome-webfont.eot new file mode 100644 index 0000000000000000000000000000000000000000..33b2bb80055cc480e797de704925acaba4ba7d7d GIT binary patch literal 60767 zcmZ^KRZt~7(B;J)F79w~9o+Te?(XjH&fxCu?l25GxVsF4ySuv$FtFcl?ZaQSwVg^% z=TxUFPpR~&#OMkD@VNv4ApdL7fd6R_fFuaOf1JGX|78ES{~!H-3{trm=l{C@18@M6 z04IPWz#Sk0@B&x>-2R(6{D%MlDnRu=v;uel>;WbK*Z&wwfaZUU>whse|7Q&dzyV+a zu>aRt03ZO{eexJqtnMct)u@3*s3?X{FA#mos?(EHiB~!|8@P zHSlRJs7(;#_>C{=bF-qE5ypoWCp8a4ibb~`lhZnsG|vfL7aUvoGS2-d*~C|XaoBvh z)O~O54lz6Cpp#=U3+W8~m1Jh8i50Z0*3oy3VuiZ5`2+1iW8vld^?2b-5vInw2r)>+ zBk>4J@ryU{&4p#$YBDZMdxcBDJsA;7G>@f)+)zgBLlWL5hewQPFC~yxlnbk9*X( zX6Nyk%u$KnC?+U9G(y2iD+SyylAV&6#ewy1sMOvYn8_8i!Kynzg}H0 z4auYFzNM=OCc=Iv&ODQ{g6!7A7$%nE6ugJnWBI<~x@AL14_)b-BR2^5j5xS%Z>r!+poCp`hi4>|d z9sS!BL~)07L%H$A45}!FIeVD8mA>Iv+YDVss|8qla@15boMWkFNfWfDcu~V;BRW}Q zHbxiK4@ii6{-TFM8V8~H(`(W90xoPe(J*~^m@1@uv-sR;GZ;fq0&I9AMxQ?Vj%|y) znW!EhuS6QM8RtXJPl!X8!v_!0WPYQz2Kb3pN!J}xCaK2iqm;({?@bivA!C@15rM+7 z&G)j>oszdf@qGAJ>EM)Noqiu=aHZvQ`s%TAQzCI z^t-&7(S%JstVz3stdszdF*a}FnFVMn+jW8TWR%lwK!uh-pLG@1-6E)abeJaJKBS-) zo)b#7F_1DGpAWCn8AB+pkf45{br3o&6pprbhCJ7vMUq;vFqGXt!r|5P&xe}~Ab8v` z{flS%lJlHITsGT`+OO>I@)EiKE2yK$&O{)(z?Sm+<7CQ~JEy!94B#r=rfZL)7-<#T zdZRO4^2)@5yT?)5!`*JS2U~bZ0<`U{OtdT!}rzCDXUY|PH<6d~oBIdw@k*ys* zCd-VfTJkXJm!Zl#%AcV}BvG^-S>jkKVz1S*!!X9UyyjtV*o|Te8+`#P&68*9&;eh> zV61v>QV;fMXYCAaE~+B4q7E=E3TUEs;p78YVYUDE(*1*Q|etMpC*bEv$T^WtPR)u&3=mnqXpc1Z>uUM%F_cf?AUM%{Un{jTEyS{Tuyf>|lssBMH8r z(lKw^ft~6)I_&ZCDnm8bs{JBH+MlTj1WC!4P(GR0_%ISZ)JIF_`Q;hPK37yom=XN4 zaH=;q{au8;lPsuw1q8EJ)iOd`zX(pJ_IHkw72{x^g<`7Ob}ZUfcsjYQG@R$rq)kZv zpqwOru@H+~VJ)V2?V_+5^~E2XfJqi$dPYc z!u6};1!o7$;YRm~I8N9)8EVGJ8seK2T&Zo0`gwfpFh_7HQ1*(<%h7W%^Jc2Vr$&`v zLcMdy#71nJVjuBXLQV1?z45kUb3p*RDk$a*;$ZZ`U%oYltOpF3a(Xp<^+`YwE#TC#TLVlES?7)-kVN6kxX~Q{^V~e;AGN-I zsVK!c&bzlPgMWREEQrJ5g$^2RkIh+uUk2dW%W%`X#tn-GewEs`E=hzpO~m;weWc#F zfKaIO!K7Gix2T6*jgEq;FbY+P3W);*e;{1~&F}@Vmm?0w!zHwl)l=Gd)KHj)o}^y| zn&V3(`0{7>$K>N#7qT;YtclZ86!!>NoNqXV?Wgu6)kVg+j1SzNq6 zs39?@@wJ)mkzROo7H?tuo8}==6J5%5$-l|@Ct@9Nf8lWZcBl!@61%|TNN_REs&R;0 z1t+Vo4j#}gVJ?RUdgt9xij}OY2cXs&#wqfIv7^gXp;`wwEh#OLSE>wg>R5lDY$?R% zx~X*^1LM%D*JirmpBuDvaUVxo8T8=!UR&e|WHJNB3i}}RiddkV_^q6*Wj!zy2}L#! z`@WtPC?>_fy{9v0Ef)W~Vcay?_404FPO;Z$jl*0&tZk*~G-m;qBA01OxK#n)NGpSC zkXJXbl9ZcUCz$4i}$d*3ALQ4?sOb)7cn@`N0 z7(MEWHX%`mg~RN_j*Bcg5!!DV$V%zz2Sq*Mq7{arbD^ZBQvQ&}P*TwD{*8}lYoYMp z9Ay%^y*sH%S6R#?j9C>K_BB~FnTux>wAXJAP1Uz6R=ohF(Vuulg2Z3R- z{oL}A_KKvz-O*-+bUw+c#U}?GooWRi4S9nLI_TL@V#>{T9+!Wgu-r~!-(F{obENUu z#@~d&be*nF^H_{cS?jt~NMAu#uY)%J*J5>nnkuie6+&ztH$f7}jo5N%rscJjC_yLD z%Pf{zbPBF1Am0^wjVE;_P7JkfMEe6Y20BKHUJ_8fAZ-}D@k5YtG8vIApZhAxulthJ zazt($#?^JJ4Y-shRpkKsJ4=jlEobY`VCSYO&J)iVL0WZ}er!qFlU~vZhI?A-I<>ui z0*3g@=)u7Ee${zBrcXc4U9j*>EHMb0Ll;-ay-Fk)b@ z5F=x;?*@S)xdR_=NzpBKRlgpNp>uU@tu7ny1KLL6L|AG5^BwM94L?Uy2n`G7G;~l_ z=p@JiHvp%2WAq22q*PJ&VJ@@$mAx3UIw0 zwwm8%==0ikJf||)kPI{7r7p~r4P?;Y zi?Cwwuwx(FD*;-p5VKK0{wjZUh<~o0W*?rhQhG|$&9vloUm!(lH^RU0nVgUaaG%YA z{QF5K^88O2Rw-L8hAx*-1yDQ0d3ehRULceHR8Jf_>Gwk8?SAcZk#T5}Z|H8pP;T2n z5Cz@+$n3+liVJn;Wmj5&#%JwybF5(yEOZRi$jWVl2+a7C&msDxeoB^9DFGXS1*y=K zxK#dRa>b-%sl5t?mtjL6qL}wxHMWn9YcCA^4rfA1S4O*jP+%l3+yf|K)`~B&mdyzj zAM>5dsp;Aq?-FH%{y`UaWYj3de&E{guy&U zSq(Qgn7z11aCUJ~*Nin6D*O$ZLnx#wwdKN^>p%=c9iBjbNgY!)UCd1z7vhM5;VNjN zI_b!HJFB#nszk0ebH)~HiJz~v5FV{GY4>@qybr6tzaeTFM^Q64fhn0Kz1B)NkYpMy zYQn2Dv@l?a2F-7UStSNdO<}OEp`jdaPJq@tljHo-YTb>79%Y4ddpW2-0Rs(KU>CO4 ziNk|G9esRy+&^K!<>a4=Ung1~FFR1{-axStIjGGrK(UWlEW^x`pXcJ9^vYzQ|>ihW@Kis253o+|;8(8#b9DX8JZcx`lL8+=vF(Q)T0F zp{F^5L`84~pHJ})N47Z~Jk;aF=1()Pd$^YTb~EdhOB7_46wXveC;4(#$g-4GmjE3f^jCfY z>R0)#1}pL2ZaA;cO%mr_s;`6MyWb#4*X3e~ubnHeo8rkyhbWzvgbe#&nYY7R9Y+ne zfk-t+qDXRnQ5IhHoAqAE8i@c;hy(Jf_BJr9;`?MM9^IbvBOMq$N2$TWMAfj!&Pqe- zi6yA#2)e*Mh4iNg#Mr&&DpzrGk_8d`A->sV2ZQ_30U7(7foAz#ND|L~r9v)BeiZaa zfbmbor-~yOg&uxskH-sxWZWA1M}oInpSVVD+9FMm#ZG|dsDMJ!WvB$#BB^?9UWc>n|@l)J}16{3SLj0K_pu-g}pSQ zv@mNGLqy413Co_SI=psLkVgP)8(ri4`RnzZOR%M-`Ao7xf);&55$B+YBeLOq@=-l3 z4=OtsgmuauO|KCwOZZV!jC)sHx^k|dcVrZj*;%h%lQLBTM5@Ij2i)d2F;bnn=2(p1 zAy+i>=!1pJ4J~g>m6EfLmKc17;47GyqZ99>M;{J zRsK2ilwk+YVHF#S8lY^%#7+^8VY2I3_uBOECog37U7kjQh>HQy?ABBywy4+#C#~kD z4zkNSHA5Wq8}Hunr!^|>oiX9a@BlwL<`wh;m2fw?xyTktD&o%!)#GGj(oM1p11Ntg zj?T;B9<5!m>OkZc?l$mk?xdM@C3@HZ-Me3 znfzI3Om6^+j={VwJuGO2TeZCCe%wqKCF-T(K79Lfi_8Mi?k=SE!mAi2N4-<;Se%PR zl2g`80j97gXi!k1M<#6hP2XOw>MgYL3^X< z4e?wH8rjgRA{n#Qm8-3ZdrQ(N^q^;57^~VLI1{Nu19}I9bSFe+$WTMpoiv;BO1w+z zsLSX|XjNp7em;#&frJ_`B8ZtjB%Jn_Y$V_Kih$Rnp@)PH`u#VEq~DaXs0|vdwHryu zJyQ|qP5eP|GO6^i1Ayqpd;7A>@LbLB^6xorxyxI1l}^9$*K;JOaoaaJR!Jf)LI**y zw^)48gHJEY_K;J*2cDLH5zEOfZ0VV+hs;j|){@=1CszKzT-IHgY$RS;2W2A2Vj^YtSX5n*x@0El@ZRO)NK>(02e{V$r6NH-bF4w z`F;=?7`!X%0oEq^N%qq38Rhg>A`yI!*+?WI#j_AT9()GWwfkcnQPQ*{pM7Q20(RI z$pl%24%+3A2^xb%`8w#0k={7&;B0F{#jV@_8y(mB5_Dz{Dk;z zes^!qBwHy0tvMtHqaKcd`29#570MgvEB!#mSrwTB`VpdOXzt4}_;zvRL;KvK-Fd%i&WcfRw=lD`Iaa=LV}4A$k!dYa3$iWM*Fk7dV` zyvX*GU>Z)&2yF9JP^F8ZbQGro!n)bF&_!Cr%HDI>3YI=&3@3^cq9O2u$R$c?@(HE9 zEaVzTG#pLPV5YOn&$37IAT$$aqauD@aunA7zcKoFFk_HdXf#b+JTpc(Y+LjnfX&&2 z9A-GdIM;hr7uvMxNO_j%@qQ{X8KPy=L@M-+4*lW!Vk;?yo92Du>XN&MbEp!$HZKEc z%+9H$Cj77rU4B2xzxgKKPTm?d{Sa=oA0ok?TL}yG$}=H-83ba9K|;3!_4{4*bJspg z!OBT)nrNt|&1M>a7v)c|M@~dU+u7Xs)+L>I`{S~=^NO$N} zV7T9rGi;Xfw49A^2u}W(ZN{SfUy7^FUI4ss_HL8J>3CX*@{R1aZU?Xc+TKk!I?7FH zgFVaa%FuHysBI5ynCk5vz=R7wrHB>(4b_s_M`4!AT1A*DOORnSVXouK?i0hLw6~ zmGkPJu%(HjDEc=nfYoZk3!=DZM?@;AyR*3^lD`^+wnY4m9vt;^9U!6;2Yvv%f+K|# zmz*lNivA@wWEP0TbQv!EN6KsmIvCM98IkrMNZ=?#`6yORnv3ngp*4t5=Y41&!99|fug1T7`ZKvP*!&#fXs)Vas{<(g0H{IMl|H09$oB;(2>p;xiR7t!e3dDsQG;vabjjz_H zaU+9-q;)K7!4)Q#(DWmaG4uvo-J5~)U5ft-EXx$c&z8S6Sj6z+X+LZrwN#-l)|~JI zgB1Q`#aG0sNmz_a5?B7=4mh~qkqtW(pj~d?h{LLk4uL6~`G-!=PShanfq{pLoaR11 zv;0ek*e{npgo7D@IsX?)F>>p+cZ91bQ)p)#TRR*Tp4iH~x4*rEf0CVFMK41;CdJ;1 z37yeoPjB@;MVKmH=r3S^Hiq{6{-vDhX_4sm@CJCsc6$}d5s{@?I*t$uX@g)MYsZ+Y zgjAecF8{SmU@!5 zFeoAHPys`G7XU2`jpIWHfuS;(`1Qy#^84-~zb@?CAS+t1bk?yq%>w@P_)n0Vo_Yxe z!9(K_%MfMd9ton@Ve*>tOXUJXliCv5I4n2HNd*+=kK5U0PQSkR9~QV&V{j3^$)U`7 z6yAkHRJ*)E$1LdM(6x9BL9OU4?8@YPw!5$#rZqOQ=|ZG{0(BSx8?+5BaTS;_mMM33 zh)ERJE`wnJoS_Km@+$4{d5KxTN2P(;sLk zxJ8kMARy(szN%V1o(OD2F{9XxI($%28lY|bU3u=g^=iz~i@z%DsDwZJ88L?`T2P~t zgd17|=Kf-6zm>r3pX0At5ak_jrtTzN2Et@5D(0_e6*YrQM+DkYVkvPTD^?GDv#Ioo zhRKh;<5ubIgt9) ztu`jz-fr|;v)DNg@sgV{HU5n?Yla*RW!X1Of|5Xz7`W?8et*6m%tX>Tvw-`&HFn?y zR`gjkud1|-E-A0{JH2$X0p27jW!YICBSn#^5!>WzjKm&aXLM$`tQ;4S2F>R*TtX4i zFi}a&B*Z$filKvl^n9W}Z(YQJR6ER~O)Lo!P*qu9SFFnH6QUxSar zSZDHJxZzY2LqmNyIZRbwk-gk33Z0Z|DR*RUw zs>F^a3YfX9uIg1&ByNndF_o}b<%B(wvZ#zV@;5nVLPZJl_=y&@Y zVG(Tnf_CR{dPu#z zKq6R->NlFYly^nYo6?~AZ@P?>TS~vh@ZjB-8^N@1FhpqM>gf3e?Ih{Y_-Xv`NxfIK zJT;X4LOb7LB!u%vPyRs2L*5Fwn!60g*wEI?(uTf81GgNm(w-NyL};t1~K5ri(Kui%+$Hth@ex_Bzn;n`4ZnLRLZ8P9&sw7 zh*H|v$`ub~={ki?$H`ziD>6wzUX2TLS~-DWlxIS@XZzbx^AB(aAZY&APt3VE?HIKy zVWyr5Q>yfS>z90p?)Rb0!ohxIAapjMp~s?*E83AI4=MG9)>y9o}B-w5-?--y?{AepYBPZ?lQnQRx1TY}p==Jc$%+pI0IlWB0I z8MfHS<~31?uW&V1k{1+<><!ByRM?8C78;tz6=Jv{#(sjohmdSwJp^r zzfjD%@R4mDm2PomY}KQ#%DE2Wli@cq9_7=psCQM9P;O+>`$oulpa#% z5|VVHw1xA%}hD`Sgy8*g%Oauc|XZU6kwf>XX49~13_?iON zabjH!4`C5>v$_Q~Vo2H?J#{ z`E%Hn4MXfh?&&lW1Kv$F;M501;>m)wb>lJ=U*aOl{!cymD=anno|Z0s`c<|$K|To& z4HAW7VBg(LC(U;|O*Sx5IWu=(Z^>w{rlKrkS>mco7LZELWsMX$O zY$WJq=t8XTAJPKJv{wjq6o1iFLr2LEbPrO|yyAe6Im7f_yQGoF3e2Gd-|lGWon)^z zjSKL&UcOyKGR3OR28!-&9%OD}GbFiGQ3(sA5KnQ|T9YD`7&_`+(DR0I#I87JfoEL7 z{g*1t2J7%f&`&tm2_by+AUYXIBC2ynRkz;Adk!;`$!WBv8Ugd+=%2Lcrw^R72_YB) z%cL+Y64Rc&viMqRW3iCp7e!@m9j7IzBH{5l?RZTmUef48F&)ltd#mbYKNTmm_F^;9pwQ%3X6*bXpnGRHC)gO79#r5q3jF;Qd_9=$=EwZwD`h_N6DVHKbe{!j9 z#so)@2FW63M~2gF9T7MGtIGiEQeTJ9J=8?-A$r9^oeoWbJ5I+tdcWHHt6MH#NS|({T8}j-+lYdqMAt$UAoZ za(o&{08ULef;i>HXhcBN>|%)iHLc=Vk54(%-^Q3ZtrTl|#dOZU7Q)Q8*&84MR%ao9 zW<2!MO8l7eXvFV(cGeNfE`*{2_}P`YLu??Z_SGDCcT|>{tO%=79ES=iw1ab9_8rJS z`N=4qATW%j7qNb8KW1A-r5F=n&kAElM$SRO{HQ1o9y}~fh8`sgr_QQ|a_qNorO+a{ zMtdXRpjlH(8`2ajg%B4_pXWmI68VtJ^vK}SE%+^Tk+q7mVA0C4tIN$)36) zPvED16qa||G8Lqf6``cKG)9fBppZf@;*fOR9@w51BwwrxFIMBwTv=F$)~L`*T+9J# zMiq;9SxLr7<4iy}QGq8F4n3Z3q}Q>^S;SFjLY2>V!u!jO|FLx(9+-usB>D1%i~F?= zYgXUx@xT|oFS5WF5M`+(Qg;E2Bwmh&vp)fh1E=K1{(O1(7@5>`i*~5X$D0gL(h~6?H9(TlOL89`tc$AirQO04wH=rt=+-ogOLyJZg zQYQ7i5bDLhY}WbV?7}E9^y;w|_JbrP{+3<`=@0u({pG5kUjqK9T+wlibiX6sUl&ox z{&mOLoj;<$6&=KOVsoVVO9zr5hMyMOfX%yZ|M>X}%PydwA)TnC@+o~AYau5A_m~etP#)m}(a^_h0OH*1% z6w%Nj>^!3`gHQrDD;)nWL7U5gMH2qC&aQXqEDE0K4;^wVbqCEs8Hm3dyzzc__|s-# zBinFNK^)%(+GW?g@tmjnS3Q47<~H;$FsOl5w6}R}3wKcI;h`ZYclct#*V6kU1-&$N3xcuB7OdfaK z1|~V)E7U`Uzrm2tWt&4_5Y2;s_nBOj;h>{2ZM+ub_pdWRt* zn8hbai2^;d$W-XDL3);Dqv7xy)qE|3Y5wsbPG9%p+^)Nv`1=Zfu+EQDLsG$ zuv$_ZnKTAwJ%E(xbUq2PT|;?OSbm{G0QzIzXvM|n3tof>=6k}&6H!!W?V&{Epf1f% zEt`AyC`$}eX*=HJDr8pb;5e%@;6v6;?OUSBFcFRr;4kwn zlLLh*IIo&>DN047291hE_*030@xCbqvPU$YwS17E+6E#g%1KuBE5ARC{?C-o@fuwl zk80TWZi7NbxT38rAMmy*^&tYbRu%N>gFl1@2e$i|rZ+rv+1W`L&WD9*o!_T7hGoBC zMG)FlD$u&_lIS;wO-g4Igso%hTE4>oT7wZmK(<~5@}~-LJ7!r#t}z|mII2RR(Vd;X z)fcBvipXX}SC}YMp6;BS8Xc}QVu~^tKgd`OV^sDU|6^m#Y-lIxmMm{LB*$*VuZ(*I z)~`ELpbB?0`ZupxLDDL7T08q`cETwof;wgdDh-F&&k$kCC&LsrQj=drVDMp+gwj=z zSDE!DdiKO@;;^+YV$d{ViAf>fMPF?iBIA~#l+$7Ha@9~ambDVj`YcHz5(D){c93Le z)5t2&dHd+Ze}1HAbN-M6RV`GK{ghmZoi9)%a$S;_3v8868q6Vj*?b(NWWp(*2h}_)nz~rwFXfhfcC2J8f(!i zS9ld`237-B^*rBwu>g5L7Q)n5Ri%B2vn39s37ENHhyWPi0;4=M-Y?&FaxFU&qqMYl?QgLZwxb8=841cpFFMHPD}P7|u>ol;lT{*1oB=_aPLV$O1^QQMH`=sto-#>H znIiq337b$E21i#^TI+WM2~6{IX%;jHB!L=9UzG-B6noeCy6qTdUUJ~vn>cP-Cs#$b ztY<;~f+JT+O61G9?rC9z>5hpc+j7PM9YPWU1h_kf+ibZd)H%B-eEdDsic+6k-p8S4XZu6JM8u&XzB?pp$D=U9fDh32Acs4OBJemgEdCv$-B`G4_4|{qPciL)gjkl0PRwU!xZr~SkVEtuNkZ`Rw zBNya1A8v7*Lyl=O>5nFiAv*O}>o5Je1j5f~3KH2=<`gms{}8e)k@YS}%mq8>Hz7nSUMqX;gN=PjuN>p8x! zUCL}1qzyH(bRxnMu3j0JYYya*aqPqS(9xQRc~}~8;+ zkeoL@n<nr_b?b|?oVP4VzfrW%(Pw&p;lDC2D!DiCEVgrSJyPSTAGAU zDXYfGna+*(Xh6+Od0^QUXB=##et#IL9kUdMRk_+(C&qp=_RdnnPzv)d)v9O+TM6|6 z!TFgq!TOS-^Sm>(qnb7=lX%HSWpRtq48LZ`q_RDhbr>ZEARz^A`H9icBVT}r znCFPX@Uop4#F10wSmqo~Vgl;?H#zwT1mFPvZdJA}Bp9_@P#hVSS?p!@)eKQ^h9}xD zdW>+^$Rk(C_uPBoPd9Ou((4h+Kivt3u_htDt*@HC?zF<=1pd(0cTe89Bb0X`_n}6Sa&ZNFX=g( zhgqV)EY;Bv96Ht|@tKwDVA?9oQY)+v-QAI1$QK~QG*(&wM zt(_~};}?^W+NH9B@kbok6k;n|_^Tg|f?}_%NHX-CxWznsf|S^b&b(T+KqDw!nc)lcukdBj`JYO42gj*iZDndPlFSuP){bKOoU_Pb)@|wt4TK+cF_pCtNw~Qz zkh}`RjbaB1(AZJ5!GHi}J#v(f(Yv0*RUry22HLE~|)%Fr_FeFrHY|ROC6cLyfn5pj}^YL>M^qFZ}R_ zRVIi@zS>6>l=cdBB^9vwbg*R$0lvm^b1_nyH(8-~>%XjjA=5Z9C;ekO4R6?SR0KJ! z3NaA&tVB2T`9Fdnxj!tR#+6PnL=oV{dEVSK|BU_$KUIr&4rW1|uY#-?)ufy>^irON z>2r$e6D(B(VDfG6-S|9-(XZWdqDiY*rbI@u2Sni?t6fJ18`vV#kgd%mbqeo~?%hA9 z(>G17XE-@+nlMt$0un=AK^!q}arRoTtS348m^tn+|A|s8xRHCPcMKH<|lz2P} z7F|zk&@8BFr8Z59Le;%_8Na8435uPT14{7@rA+5p^5mM6b)&00@2mEUcU3SGG}EQf zCKX&PZoBZ0`0quHG;$KdIN`GXRq~%ciM@jeq^XJ{1wmXia+y%zm8b=9t2jajoa4ay zWa9q(-{xliizqF!Yb<2>xH{v;`j>G7Q6F5yJgS*2g&Mvr{13>#-l3PE#C~6xAI&~& z6YCC2o$Pe=lz%20+dSlDnc~EG(K4Hd;ybsbgXXPP%AolnN~F9YE9;Vant?@Ptq)>= z;W(wNQ(ewICncSr(iq8dTntI=(Y*uXRXz>oIMt-kWwBosf3}q)RvW<=C;+i$)@{Ro?nQzCHI23d4z5q)8Y zBP$RWGo?EJ)+E4p=Mk`KA_bH%6ngdV74+%mp_b#5Bf272^L!lgtY;+{Xe|iDETmqn zkE!Q2lZ>#Zth*8xlnm8x*oLy!AihFbIM`!E{r_~mtJ9v0!d^i4c1hK~GI=B&*0ExV zUL3!C#2L;Wr$!XbpzgsB^|@9!O=ktcMfGPZ#Q$Df3~=b7-7hAusZ6O#(Jjz~B|9Nv zEUE-i9#)Y@LJJCFzB(#0(ZUn5qdDn{vAO09;jw=x(_o+B(09`Dboe9)cexfFh$V3p z8g~>uvq7Z2X<#VKaIM=ix@Ajopn!UPw|`{ca?GZ#%ZT?IfBCp;NB3RcTBh-TDG?70 zLLh{XHAM4u4I=brHBlRdw_-SP;$6bt&*Wx?4^b`aSXa7cjVjTOXNl%UWj~yujVCHb zItLiea)r7rh=$3-q^Hi7!DWyCfwyiUhr3R38C$2!W#3Ik+gU4T4(WzKq!Z6OL@|QTvT0EC`cr{UEp`)d{^V%Uum@p;z1wJ0Q8ZcSsnO($az$v&RtW+s6rroUNq%QY zq$HQbaGi`e{~DI7_24!ihGuI?uV4}?+3cn5!nb=zYG1MqaXei6dp5h@^wBR$w$&4kwy>isev|UHX`v!) zNJAct@bNO{eM#1BXN-ti?S`)NY~P65*W~0u1vYe%?_g?*<9PJi@TUY}z zzi~=8FJ69#g-DTD-%i;C%0 zH=5tuK99qOk24HWds6Gvqo>)3IN@haZUuuOb9Pg8@7P}PZ1%K1w`noWS-cRuT2B7y z5Cy88t4c=RO*XQO^g7FI<|485GiYplp*Lv}^}j_^q!0Ax<^+DkeW{Ys@KjBVdGd-p z!$LT_W_9^6jHq^Hk8uqZ`sQ!XZZkCw<(d}13p<1Xf}?Hca?Rh0arV_Sp?pM zi*Dc8EO-#w$6K*;sn^>S29+^o9jO7$?WrH*&T7@{4apa@(q7a}P8p|)hxDrD4k?l(*Md;f=1~}0#+(U4K&a=DgTL)O5vfe$p>8;mbC05No3yq_F1a+QSEk2p(xc%TMtAZUcIV(ut<&Vhkq3%J z5=rUt74|atvrzz9;#3A0DIt4;mm&DWq6t!=PUDbc;YS}E(s5p{PPE9n(BG9i`O^jF z6>l}=H+1?{!+&G;VTo@uWi?dG=fj?dWf-OCE}F8BPj>|&t#e-1oa=3 z7~9^4RI7Z07kYE^r4GV+WT!;R#*V|FLq)Ffa;+<{N>PsDKQ(RdYc#32v8xAg^eTq{ zH; z=QxLTI7qt#&CM*+EIMru;f(pQds(?WQRkXpU@+)JrRqPN>P@oC;+0?&*@8=!&Sr$+ zK%`FJk3Hh2ly&$LgXRUk-k+2hZvjbM7aT*k2H7@)nTFVfyp97urrKQ#i=34N6@=1L z#ELNCiD7`Z6?|GQ))e&203nwtoUdmxmw1y}VIsYs~ba@)bZDb$vT>H^N zd$xOfHX*a>X{08W<~Cwq~cGDcVoW z?0-T1axN|({VcACJhkqk#G#_r zxphWikMT$!zuHaKFK@`u<22sX7#{8?K zj5{~Ldk&|ACGU7NGsQCfmip@K-;i_z-cGKb?b?=~4&s!VyB#7+n}v>!ws-b6KQ!&3 z>O1df>Im4_aKH(tT=mtax^6M7TG<1U8V;`Mk&ECcRB@55zpZ~kK%mtUK%7(KDhf>@ zQrFRs%DQd2X22C`oRaO(Q*kaVtY;OWQyR4%0M5NR^>gl&TB$=w;hz)0uvPr~#XIEn zv_KdtbSLr2#EYE(dygZO%Z-X|_X}7yTUOo+-y=o|v~VptnH^jo6wh%sZfBR2Ml*_b zn4A4y04YG$zaXYFLHL#>q0yJ$@&Ri=Al50TGR!DVFeTo?{FGTQ1M3#xZblbkW#-cLcR1jP~ak@w?T%O;NvDBJd z2TkA%)l(|G?#q=4+cBuo=?Z@~bAbQ%aI$fE#$oz4tWU|2oJ4LW$8V^|2UtxhZoVN2 zyzH-hL4^h$3r~b*u|FnIt(D+Fk$uqQz$oiievtrPGG)uQV%K-QT327Ndx^!OvLj1D z^^dOOq1kCu{!zdnH=A+atEeYCJ;d1dNc>^~0Pn>jSM}AG;4O$0;4%l0Rg4B&`HG=z zpsp?3W+;KD0~94diRsET&dt&p46~RDOEZ(9W(APWFdxiON4GzG#{F2E_GxD{gy51b zFmkPwzM@ee1s$q2os=2tjCi$V(W5o|knZIf27wJ>lda9Wq+Y~ko)h`*6c-r z#t0o;)H-fCz-4CRvHZd9pZc>y(1^$ZXv`tG2H4lVnRf(&K{s>^W5IwLN=_0e>To8a zh5lp7X9;#Uj*x68c#r_AEC=?((51OT3Eo&h5!FsYGZ$0JAHUpmd~Y}tceaTT724gy z2y1gbf|h1kf9g&N&}C~LBU+%cKUOw*f(j&3XTqGhMuEAYrHG$IUjCB5l8Jn0 zy|aJ;JCsNQ>gP-;-)kaXB?rAkEGG!m+N_oZu=I7}h=*M-SYo1fiN}C^Ns#I25j^7m zhI9#61}_3yQQXgGqO&Pv60o;jDO9Vx>au$hLQ8)^AEhrEDY;Io`F;Vk=MLGYVy8nF z`4n3z5wG$Nv&WXabRbyiDvBAzS#s^D+K2`3u>jwTuuJ$;)z$u9!0>gPtQq^f@M_I_ z?3D^TAv9>4x#$$OGG85>2}Xw0ul`sNOc?u#mCc6mW5AbNEa<)4P{P6Vtbo{jOcYm|WlD3B>HX z@_;J^FwrPR)+w}4oVSMZaP#RgvXaVR-u=-+B0r*bE5darWh4VNN!7HfT@8~(VWFz7 zO8&9oh+EEPTXd5d0CS+&+7#;#nKvs;GnrLV{$8lBNjzkhMzhibtZrwIL{CxT9IFLl zn?7?XNc(#&Tt{WPctUrTQ-PrF7x0q=;5>C+M#+?0i+=t9oy`F?LP@1(lOYgN@aUPT zyA>r@Fo>dosXzvb`WvHscsGElv!sQ^DFy->i$fPXt6T5CW1X4rns6E0T3f6U2r#&3v*jqQMl40SWwFAboRC zECeU9Scw4V8Y=X%_JofRmL`oi(ZnfvDrym}IU@_SMk3x-@}x(_1PblMu#6^)b*gv; z3yBIGfd@b!y#t>_7;~IuNUNWI@Ewveg#8=_a`}z2vyRdgt*)#22WTs2PVcT5ieiGd z5Sk0f6bG?)wr|ggvs8&e$daU>1`<$UVMoEc99z6VUI{qq8D*6eidFzM!{QeYa2<+4 zzSL1c{~BQE0j}Z!1XkxGu=9n=pf>x3+S#&pWICDPM1ZKfho9X&52Y(Nv7da}pX4?U zU9y&0Dv-`%b8$B&CJm7**HD^SOn;5+f#|ge0AOS-2oQ|p5Ed0kzLVhLpyhZ6_w0z( zfC=NZRTPwf(A9`h3fLuC6Qe2<1(X({J{bfut>m8IW()*VZv>MK+khujDf^2#?C}xo zab7w|d^8CL!!62p{jc7(=6rGe@6L)sz%jAe9Cct)z%X6WZ*OZg#N^sM$N1xUUCJ}G4qB)mZJzki?SqM4G6`KM8Z%8$22hIQiVP{%R z4L5g6_(ryhvlL5yXvMsg^YKY)LWGO@=@BiGnOj_hnxH+~7uBMHy5!yYW<_uTH1GeW zmVV&cjeJ0m>lA|8zsFrXl%_5{WHDoGtDaw{XMmOwL?b`hWL#&e5b zppz53?aG-a*`Jq>Vj*ahsj1i8O0(4i@_{D`1E)AKETH{FtO+zCLUh>#3WT)&P(Ew? zEGr!835zHs$X8Xa&O8atpD(W`eGOBNUIBBSd|uwZeTyEY%n|K%pP&3GOf?je#lm~sxk?I8f9A?B zza{XB_u5v|Rg8E6kL2CCuGdUv_dy;&*icnjdQnVpG_x#m?XZISU6}kScwK)rb4-ID z8JVET$gA-t9mcKp<-?S)rVERb(G2z2AUr8B)TApJ26qLIT0Q~s$jeZu1 z2LPSIg9hI4Ju!5o(`Kd;gm3AgZJvn|aiO0J+v?h_Hd9@vn`tSKX@pIP#@Gj0;}iPm zeD#N}T;ieeeeh|XZ4HEXDqBKNQRqO55T8wQZ5}<-`9eJluR{(1$RLW`!n7Q$(znO~E(JiX?TBHg-6$5dJ2R zy9ps#$E2WBwpPWnyhT_-Dc=Hoe6@>9veVow3&dDIA!@|p3;@M{_P+>?+B5~$9z6q2 zd!Rtzz+>)>{p3I=9}ZdH5ugCwts1av95)~!1Rv$qzMMT^FBo|7%w?cEKo*xR)|8ZHlTfl-5`MiLaPejphP>U zA{vV!ki{Pk2XpJ)Q`f`A%r?U61gU_dOo28}y9Q=9PVd;L)eM#BVWgr|76y2m!ig3m zwli}c8TdYHn&n5}k+Ar=EkUP-?dHoMcx*c(5%Y4|iUjENSHWX_JSVdX@NvG?!9T-L zvV7j!=@X(vEL$a0kSFxhof%BRQwzI!QC-O07_k_f`Jr25m;Wt^bW$0PowCe`TprIW z=8zyncwCYK0&7-Pj8Z6Sl|X6f3<~2(w3w#KeT^}rFkBFrq1=bDECTu7ek2DLP$Y~5z{)XVfDjaD%-q`&z^hO-)%nX> zqXG;v7-*=U9u%a?;C{7x+xaXBC~wGQX8+Xi07^CwB?(uk^kfjjB83-K$I$=vsy378 zLK6hV449R22K{H~Z#&~#%4B!F=Si?u| zUr670duU{57H8^;X>q1KTzRfTfnJ+20fwKzQpg1yMilq3#LY`&m5!CgP$&*jl2Y%0 z1_s;+Y8(7dSF!!aZXhgdh&3Bnn-kcY^aL8BRZ=j1btKlt#Lro)4EL+1J<;4WuV0sC zw-@-GZ1g8=>FTb*Dk!J=zy{an6b~6Q9n-Iqi}`%)hqTzbPMFsw=oaS}J8;?8Cb3eRqW#-W46 z1Z`}JW}2j|S!tOivVjw|FE>XIgVC*!pkbs&;+mdOG4$h{rl8nEX35|s2=SsT4??SC zFGyj2zyaLMwlD;e!fnII4BZ6-qJc1#kQ$f`!e+yz>A9ugV5F(=g2zXWrp9bVU17qA zWpmNNBcs$P>xd`^*1Sz_Y&!$R)V+yd2nkSBw$5kcXocw}x~3wPK>0V-X;b0M1K6H( zM?P?F!8>UHjqyhYDrOoSZE<3Yqp`GV0UNPMp=)A^s&@*$mfa|})$v);9@3*CG2gDY zNGl%7(FiVnMHdaI7X}-B(8O9EiIyST9B+3ha)c-eMd>ocO36z0TAfQ4a9M1RP9Idjo)L?5t6Fqk)0d??; zwsa0gK)!Xft_PeC2JQ`lRFt%vINcwJvyXqkLJJUxQ{72~%*0vS2sWJ}!*m2ZNMl-|TNA>6_QQ~d z@i?jZV>O{A+8C1w$rmm!={_!}!w#2Q3l4z~e^=2VSWh}-@CpeiD8l2}&+6tv43fsL z_70AY490m#_8a=#6itvlq>g~j7d=SMECO`piQ zPB((%$OAGGhhD;5L>3Ztgpex|<3L8N5M!1~Yp@{2L;I8u>Z7h=U-?{#zwqv-^<)Pm zrELw!M?9Ay8w&^CidWHA@Dou+AfK~52xNWkfc_*w(j|r`QJ#^z{g5*h%JV#t-=ozs zb{${gXMT*r-|dDVVCKc9+E+7Ospp>rADaEilpE4WCi^)e6Ptl!7>WLn&7ztQHn#EL zJlc-}rq7?D9f{0MqM{M9%PJ!sjfYoagN|H)D+Jgrg4Avy9hK(>fI3c7U_TT`YZ$@O zaEM+lVqQ)!UhGgPnP}5;Igsccs$BYNwht%GjD-z_ zyGu*7=RT@1U&tzs$K+Zs%&zf2(R-O-E*fJ1>1SlF*yO8An zE&aoCaX&Pk)h8p@>>QIruI&Da&I2%OW;tdn)QZOeuX|8Tj#Gqlk%b^lb3Ee$xRqXo z!Iq08^1~#a_60#t7183(e;4g_5Fj1AeuCQ+;L|{;{C?W~TrA_<8qKkZ&Zqq3C1Co! zWa;}cicw}h7-WRK^t|3H3vcfwvF>ColviM>z_A3j5`4EM5(#PnUpV(oG*_sYaU}YH z*Ij9D^@LM~hQB-Q5eALa-w`v!DagW3vn|5-Oaq7sgB+0(+zm+Wj$O%BVU2TanuEBK zmmSc5jbk;&23z>^cWN5KDwb|>7IEZ1 zg{Y1tnYVD>>a0jJpzY>`L?R3VvDqsb$hL64)m^vSZ(nd5{$SH06i`p#$h~lm023?A z@GKK#4-gCyN7Rj?W?S%^Kn*6wZeO-u5eYZ96!8CDc4XC+of2_@=9jD<@(=HjpF4G|&W!NA zFdr|IEfI?k<+;Mqp)>~T8LMF5hp45kfm`y0x}unjQkwRD(!{gTlw6r0NaI6(dA$h8 z3-%x*3MhHF5T~_W4r#jDFwo{%(&l6_s5-Pzs6&K^%~zT>Fvl98gNRzbaf#0JRKMuR zRO2;`3WuR2FB4P*q}*CMUMCLlDKgC%>X~Q`6c(!`V(U_{1^hWiq)mb*ktzS~dVn^GN2Vo6xl29CeVDkx zc1d%ax;AX(KWH2`%oh?Q+joPIRkTxti$dKefs_)(2rL`zWs{wm(rlm{UB|egDE7>x z*xxjfk=^0oZXLVmG15O_u4`(0n_mT^=!c{Zr6Eo} zgc(X*aV{8-Nk~HQcT%-EMHj~4pww#F*Gwl4%_>>MrkE%2Yrf{AD|YWarQ4n&7`Nqx zY*Hyy7C%2fkfBaWCO)Fh({p8KzEyoUowyKfzL5QhCo7SJ_U~w?m>9RHu1cym}FS^A-^_^97zATT>c6)zhU3s!Q$R8 zuRgHX$E|?V>ie_dz)9cg{{vWi_)`u$Iaj1!4RXWq^8MjBL`I}x7_L~F_<{!QA5@dt z(vX78F48hR`?G`INEnb$7;}|G_zeJbj`r%B(HOi);|Fqj@Pg=0mVKv))pqfJtztO_ z_ym|dm^^M_N8HjJ8R1OfPvo9i*$)>eLx3@?$2!O3atwI~r^sv7aU37L6J`2^kP$=@ zEGl($jLeyJjXWS=`T)Azea;1?GF@}>5hRq6AtX19oJ2~QQpr%j6N27+iUlL9F3$>8 z=^LW1|I#L*mBPToM~SnJavDPFyg&|MXLE)bV^Y|g8zMQKm7Tkl-wMn`_sfv715$}{ z`3LoLrnW8u;lWsC7^qe*|Fb`gn#zu=RER5-aPJhDtQ{lsNj}Eg+4XDOY+=c^p$-Vh zO8u2f$6)gXL2c0(T?1>Mp&_jDvIxLn%Av2}9ko(sxhg+J2OcDDP}Z7SHXv z&(>J1SEkC89x9;Vw1xjv3K}qBE*oh)x0?}gZUdn*!vx_B%1l+-^lJrAR0X&;Bb88~ z8xhB@u<7X9feO`|EW5K#`n9wf5IH;Ke02tgdFg*fM8~Ixx~f>ro)v{K=`zeyQPC`F zko~P8jSrysI|(BWoAIqL?X+phB%v2^P^D2tw0g`d3f&<*@|NnsZW&`0?-c~#i^G=v zT?PdKC8g!>m8et74C`U?@?DwH0Yx&(pJ+#D$CPT&imriKbZIi(IoTjiQRK<>$Z&50 z(rap@aa@(FeewAQgEha@Q;v?ap(&RlO0tQiGhKs*92_tSP0xY=u;BF~_8Zr=z-E2L z2=pncgHi-~n%#G3463R0r;N?G*GfZy7tDd0N5WuhBU~yxFQhjqI`t|Y%aUiLVC^*` zEO(I)Ruosq09$<#uDe7L5+!)ha2b^YjbTuUDs=eYQ-wxV1wl`#isT2%eL2sCo+>cD zfgQ1c0IAazC`oZd7YrUXcXjfH_p*5hV<+_FA^)@)A1L2As2b9r1na;edF=RnRMt_b z5-i@`c$rBj#a&CpNGD=2lhwqnh+Huf2d#gRaOP9+x0v&|Ht!pNT7bM(LtdR@~)YsPu)WVApfDkoKFl~;$@)m9A zm`^UH9Plb_+%JY_N0`l|5SZw=AUoa9Suj(YW|If2ojNfy@0@}$z3-yM^QXpM@X zP$rC4uoJ;nTO8)!01?X86;=Mq$h46$4I7xdlUA_dfG4uUYgM!hv+FNBqu`B8dYvkS z@z_)%@YPWvpJXdpOxjtuhd39)`<1azWdNuTZ%` zn~(IbjM*7v&)#3LU?>?WSLg18ly);AU)#KrbR(h$iR_-pXgABFf50z7y6?ib>xPuk zG9ZUC`!dZYmt_i3heJjput>drUbY4UIJMUs@?d|=Tm#zJm{X&aaF7ICd2mPaG}j;$ z5wNdo@lbH?Toc%fLV)RFft+$Moz>*!1Y#8yqcYqTg^f^#XJ+hQW3g;0%+z!mx0V^@ z^$+n)NRJ&qiUX2AAa_W)1y5h2=vbg)aZ$Av(SD_~5I_w0Ny4o(QZ1w8^IH9@P4 zFyawYLbJ7kDahg%F&zy|l!5@kF{nq)GF1uYebk|sq+G5c065?8U7?{Qv&n&1@<5O$ z_{j}%waYJJp<%pujAnUAJ9r2s>(TfGwIt!v;8YnhXj&$HY61**nwQCc?fK77ZYJeZv5j;ee^GEI^xi10FDpkG|-U9=p zMDFbcXb&nBlrCyLbeBu274yTgh|&}j7M8%afNBiGiCZ~ZmQ^F$_+#0@(n2>LoqvH>BSMfDHlUse4Q4pD#oRd1@hlat}_yMga4Vic$th7!TB zq$nkB(L{Sy^Or&R8m8W!Q*vAx)iX0DN+TFTA*<*E0{Xn^Nk-_DWEWiS6Qqx{*sg*i z5a{eN)vR}gbjBMl(RU(dE?c}&W~Pb_})3W9(GYt<32P*Fs3I0+FYhwp@*V8D_aS(d(|;wex?mM>-{IEmOkh_tcT zk2FA2VGZLU*SvHhj!5B0d9%e`yZ}@<@Nnw`nAkHiO0*FJ#couZFSRsJPE;e21Vu8} z`!1yD;27(`qJW);p(HMWNFT>cJ7s@ME?Ra*v-|WYcpuGffgB$pF#r_)2`3KWC23PD*Rn<$0G?^gU40gfzNW9%^nj1{7t zY5&Wtss_wb;^#>CqIqK-sfJ3aX3mw3Sc>wS?juJ>Y;V^z^niO{C-Yco$i6#6fUKhO z2-79ZEpF`Xjm<4M{gGtDXToenI)|d^ORQl&H-Pz|T65uwU250}bS=W0l~H+AcWgbIIo zW?UBK21Jz=WG|YI<{)N|M=6;ktn{;rG5ktc+EzI^Y3`kV>8FKnjSp}+u#HGm(MVG$RE{~MS zaf~>=%#Q}T_Mbu$t^Gl?L=+IrhmwSxQ3*_}Odyz~%&Da6QW8DeXL-LpTp$zz-Z`cW zWlLSPfUc&AX2ZH9PF7$bAiTO|*dD0Lw~Ks1-V{7wdVULnaH1&9iv876_)Yj`XdgE)U#>`WGGs?Qd_ zO3}yiOqxgyqM>nZNWbbO;&XV^(g=58Gf5jFq&L37h~OV=3sDnB!01rxE;R6pP--f& za3AAi0=dF$yxBM`RppiV)?O;jU?+`q5g(6Cs}u}L4RA9t>q;$XNw5_W@A0S#MTUBV zz32=@v+0f9cz?r&j4|29!0wX4XEpiz2E<6J1%t$iG%8^@86|)WZ`pF6@^u$b7}SmN z;7U__f$w0kr*qPts5XgBe~lmEktA#zCEITH%h*DnkODyz+i;D85ur3s1`xa|y>pKc ztEYJCyuQ3BS>U9~^Z|z3r!igIAxNT)Gf5D93gBZ%QYA8zgYZ*t|DrH{jZ+(o1NBJ^ z#UV;}U%NR*>zE=N2?;jD1XM@esshO!KG7d8>n?pQSU6iFu46NxRaA+&ldb?ykDsjo zfUMI-D}!Z)U7sTxc#!%@M8^r(F8mcdDU?z$_)~ceBX~q$EZf&f0G2QPgn6wt#)94{ z69z}ggWCrq5oP1u)SUA#$)#^<%gSG%sjJ( zo+wNuT0)aUG$cw`fq+k#l^R<81fG-x0mPH|L+MUOo)a6daig?|RnqJ;E!|cWq@g?{ z#Wef4)7^mcn~n4V@!_raE-Kxxyq%sl_W|+D8~X@IaiA74K6E0p9w9xJ4mO1U4#|Ab z{=Awl7-(=tNT3rUrRzQ%DuFK{cPZkdKpLvYLuDGiNHbKSCh{1O1;wfT^S_Q?kOzU# zEeAvcp2@jWDa;y1-y|2VI%NB&k!h4dxc|^G?XOM z>BDc`(T0i)-Jvv#c{oax!^#P3T_@rG6JD4SFXHxrc*oR1{~~6t5N;tBv0EV3fgIdc zxY^iQ1(1lPkjGJ!#8IhWpgLmRgY`yClndz5POQrgTN-d=%6~=21GY5r_ePlXzC(t% z`DAGp1<0NGvFNLfyoQ56KaK1k#RQ{AM2&uTfpX+<^nijXPUw(ENz?MfLzQ#rtg@9L zfF_Im6Pw${yaz1thK(KwrupuBwZfU2*{u*+aTMqUVrO$p1LY5=;`0>ossUZXbpyrp zr2qdrW1eYx%FJ`o*K-Q!hNI8S*tGfL)PNk~GMVAEX-B<)LPR-$%~RGr77*&Va7bhb z=Cu){LleCZ0&2#@tQwr&~u!SEZz3>MzAn5!wR0X-zte^!k8e*JW9 zf)r+EZ{n4#4%eS?yk-D zFCa?Ws(0hzH@Bx(YgaV~8}pzrD5RV4;Jyz}bSw*`u;@bvub1)?bGig*o&k&~;U(Gt z(`vzkE|>LYuBKL_w3GH6*7Uj-Z}VRe-0+uX)Q~pkSm&2OOq|UVZI3zE$89v@K(wfm zM%L8n5B<$hiXW4-<1sU3#aB92MF{Mra(XXD1T=0~h=X^M8&I**G^?^pq6j zQOGlB9IovHX>N~t@kC!I*DhmSg$c49#8Wl@4bgk#*TAGe#}ye%vG}#7;f{6(@5}|t zD@XA^c`{X*2oerV1M&SW-t~B(GF272JwKZpi_9kN~0GAiJ-Ue&$b~Krlc|W z7Q$t+K+$5+yiP#7rbiGzDU(8}rbCdYa4>9MXQlT_!`kdo>O^ zeSbh9-BnE?rkb|;ScaL?`nbIeNB|ju>~jZ%t%=&~{n25jvf;T%soc{p=CYl4M-(z5 z0~XcSmap=Q9D2sQLx3&d)Lff1txYuQ-EHdbwq!u#(D&^>1gkgQ#r9_l6=^57 z@F6Fp5GOHI6>CrXQn04kMLTGSX1ezig<*`?*aU~)a-n~u>Z|rB655l6qj?{#8igSN z_zsi?aak5wIZUHUVjt1a%C#tY%(bT$L0P2)16K!Bw=>bKM2|F1T9`H(cVz!NL?H ztQypc+@uQ4%Pvr1XwWcl=_Udq;o)WumeO*D6r$f|KE`=2yIKR^-zlg30m80hMf z9pk|y0;{+SknnHu;3c5pe;DyiiynF$9SD+>9S6*#kV4*=wLKGu0+qB92R_F&E4V6c zebCA+q}inmI0UU9!1a4J0TQXq%*HfneJy=Cj{|ksO;9`AIg~tz+`vCWLU$g}HAp~d zR70i(V`aFRb(k^@!vIfx#-V~sM3SrRK{zS~+tvTgOZk-k1jET9DOK7PSYoQ<(E0~= zX8_`oSU#XZPo_*7=7|1n4yt`??Z;$EX7yOW13(--j^4p7uDzELm<52Bi#14tL=H%b zjx`4wogw9Lqs>Pd0?1iUScMq7^;<}xPzB)7lPaaDavC7NXx=S*4#WyEzFb?uU@bIT z*T;P<00;`=L|mtM)%2nN0&jSLv5S`q0z>Plkkl$wL#Ut<40mY?9G7y=1H>f_{MrZk z6>|^x+)xN$mVa<~(jdM13t_*51L^Gz#2bRTYIm8U;=ky^8x2YDa-nUb6DFZgAPA2` zIb6{g(W~$SPl=%vz1;eYj0VlYv(#W72iProq~e}yC?$Q5>zpY?T_~ELaGbcU0E)mf z$lGn9g)AZm8ePDW;^@`u@#7&+Ah=rH?m`-B%_!L?NX90Touzp0zA=#}*Z>0<1$JKt zzKh{~IOYn81ppLk)dMd`%zVmEkhBjXy5mSt$c)1D+%*=0hIF?J$>aeQS#fK8>nm?} zwK7ryqR?^=cj`byYQFIfgKMLEN>;f)u6OTLO91l zVySfy?{K5R+`bVe+l1#*J`EaOh;1iQh?M^fm;zR1$0?A^ETwe^ zFwxa|$V%*>?%ZS2#0=o%|04BV6PV&O?C}*!CuMb=n`I%N2KGJsVTe^wql|?Wly+ugnY@1w2x3$Q)VQG)t!M&6k%VOzuruf zAmSnqCvRoS-E}P!j*-5wm+EtLq6|?SGm2ZJTL#}JtUQ9vz!nX-;SOj3v(#U6P}%SN z=2;~~f;Y1L)8I=th42j#!5?Z#d?NT9Hb)8193>GD7KT2Bw&S?blgqM?iH!xwGSy zqYrSP5ioAxxUgXHR!|ZX{FdsYn&uG5?CxI7m`rY(`iLvdCa{4}`OX^2J&N+J{y#7r z41m|_wak6xa>Msd5-J~A-rSU5eogtkSo=6+@OuH`96qBr(|bU~^Hh@_!p*5Nb6nT7 z5S-IrIWqrOFRQZ9Qb&4NDrY++J{~QMl;vk_rV~5?4=B&sdSodr4YQYZxW*P>+b><& zd0=7_O$rP|_cQLHi6AUc!ld`2JLS+xcUZVJW-bAZo2uA0f~<*?PkUvbsVGUSX-0UE zNB;r9oR1fQSX+Z{iPwv($N;cL5dk2VcHBX#QXsvZktiXq32xf@SB{-+>Y|?X)b2R6 zt%H_XIx^>kRjKSw+6HbM|weua!@2m$<0ab*I0$6 z{J02#G#oO1hR`FsLYMRK>YD$JaV&m4XeochIT(JF$L5H1UH)_c!15ZdBG?Ea(qY1? zOOhHtM)zJ${;M>HeGmvbNkVFbvr8aSQq}d7>iVAl%jC*^^4mR0MA2h;b^`#8P56^R z856p5A(ToXE-T_bfbBd-AU*WBD8lIswtBK4b>NL6I*<=&{e>)6m%Bt06XUjU3aK2h znoKHr#tM@1(XjL(R2fXl7nAVr7M&u%$@t0N;Y^+Eg@h2*aq&``h0%dX5ic#d&}IVE zHn_CHZB^A6@`+n`o2J4hs1t5thSM=GxJ0|H6@TKyL@C3rgEoJ5U60b}z#`T!f$xHE1(f zxN)YDygtR4zjJ2ZzNUuH*h>jXn@%$6*+9*UwY6$g+h*>xkbqJ(Fm*5y`~4(Rh`}{b zl`<0g7_5G!MDSQbo7!_{lz-qQ2Lez)61Hu9*|lYnFlPQygP3Wow5onO5&&z0Z-QQ!Bzi9#h3X_X&4*oKyTXu!<5UGEqv$6lP9 zodEy_=!nLdWK2UnyDl)dIunYft>*M-Hm01R81m`OL12+hS5N~*qI5BriHAQ$;j(7M zc@}tusKcq}`AbKE2o-WrVDo`rzn)2sP>`THvCXu{+cjG?M8qbQ%L06sK4s5hM0*IT z0rTQHwAu(p;9zX(F7$FNMvD*pK);kC8L{Bl@vW0!EOmy^iv7e99-+aDJ%A5eF}u_7 zS0UB7^>a^ZjrMM1m6pI@0F#z>8N>B#?Ni>kj?iSms`oDEDRVG|jDxEo&7MH36ZF zULcNr+Sy2u1Yj1X0YF(T=N5e*?95@y6Y%K3Y=YO_!KSNzu@g&WSU(!OXWQYp@q3?$ z+kj~F2up25HYAXyNQq@46bQ+j^KQ(;M^^PBYj4C#s$P8%Vio`dof*;e%tjbg7jqN^ zK_uydjuZQ!in!jCs@n9CsohG%`$JNIcuoL}V~uT7A|r7TDROId*f6lQ{PNB7eKQXs0-KrWv2N#EwWF3-@D5I9CvSu>-NATk z>htu2KR(40vJymyQ^3QH!SpwAQ%<^bjI&y8Q=q{{}{KgO>zUxr;0k@bNmw zK0{JS1A2TsFZ41jX#iM`j!$|ZK=($e74cpvN*KB1HtJss{Pa0R6!4)Z9s@H<3yu-1 z56J>c8fz~*UCPD<{6K~Y0Y~|TY)DylfhgeQn)_L7lX5Fu1SjFAHQ8fRQ(g`Gp@nnj z)2)!HjFc9{$HM_V!m#_cm}6Vw0f3oSKBDofP&p!C6v&{H3e0!!BC8!HO0rwY2t|j| zbm|03TVymTCX6ddJN&_S1NGm@_}jNZz|CUh1`I!SV6i5NlM9zY{T!nzjW3eHCKAl= zpU#|vUIPCPk;mUO`y=G0N6V-bm7dwVhC}xs(?a&VC%zPuQc(qwcMCZyDgbJS3kNbV z(N;MHUjx1{i4>4!YDAmFg@4U7$`&k0dZ+j8pVequ!6(W+vb}Zms2i+4@q-Ha!3o#i}MY>Gr&y6%rEov!#ZeC zF0K)nGqMTDgCR)30eV0m7dM4Wj6evq(hK0f-GM^)QhB?N1IgGL&_dmNa0v@d@GoM) z$RCU8f(=iKanOnPg|W~A=pT4MfN2hM_NCJa915tiMNEhpX@#P`l>2Y`Xl2=Ke=(go z4h&eQ*KWcGKsEqCk+Z$`t7*>h_f(%OL8kzx^ z$v(9nsOIp6jr6}jH%+K1eyiX^Et@A$9YfA~@MO@?A>PTU>~c7N(vo+%5hOyW#j`K! ztSix2p6Vks8>+h}gUuhddBB>yD>X<9>4y5rT}ZA2QV)?~gUJpe)8x?Ze{JA_gOz;# z0kQDrs%D4+k}ECmf`cc2U<^{cv5N+O^^^*M8sZi$C19TfT3}5mnB$+!LM4_~R`%!2 zI8a49bz+zeyI9;y{BHD``3VV}XCZj{6IN*xxpL);c=eQ)U~P+W;1hmvfZI>h%rHg7 zfpvfp#7>;ZFkKkLeq3QZiZ#|>`54CCw?m0`qh>GP>p!tu2^}7Yzz--QLIagdSDPz@#KSib=7U|7d+4`jf4 z*(1zo*7%v`GIby5%0Xxej7HqJi`Pf~_uDBf@amoo% zc3Qqx6VDfUD^OH+c@W4RY0H%kRc=H(H$Z>wO(SJ|;zCy2!E0;{tD(3fEh^k)&gMa| z_;;`50kGGk1rIEDh)J2Hkt8kxawHAXMcmpL0%{kcY71Q=GmPkSBqYzy#8*8zT1#je zpjU(*MNC}8?6EB^eRaTeBpM3Z)@+UhGK=y9NMHead;8q-&5(D{Mm3>$zb`=Hu)!c_ zzo%_VGbq3N$laUILVvD9Co*hsaA`Et>?_mHqiKkZWWg0nf2L^;29G9^U)`Jrq{&{? z$9ynk>7~{xsw2{~_3h$(i*mIcDuR;dMTF)jbOCwtd(eI zK=I9@8yrxT>oodg!Ig*DvC6Y6eG9Ekr+F^>Hda(rr5i$30jOCguv{X{oFb_JA$CVi zQAs^3?eT3k=>)5T@2dx2G%VcbgwfCY}WQ&_Ewn8Yakzgsb1w{}=-j z2-OeAs0$kNkAD#F+RnNBS!Kg^FHIW0*xg)RhzSjVd-x|bsigzlKja`;zMh=YBqlNt zP<@H=MIbES2B`&mth#U#Y z+<0*V1qFbnv{smr_O-o%mn7|oF!v~jT9mC~j9?sZGRmzcWz)tp-($52CLW?~nanw+jeXmM5EdHiJXL_%l&~21HXGaEdP2UU*<|tR-P77J!(FG>_VC}9A6t-yQCMI= z-P{PoM~VXYz*ro;$Ew44R=03;jpB5jxE<<|z|8a8B1vXDu;j>ZOx5E{LnJg4BP$c` z!A9cITg5bnnOnhf%^AYyZwGN}KN=?Gfno~-vgUc-meoDxi%YePrpCAWkP{SIPH-`3 zxp*(UKkP2g;>G}9vcJ6}D!U~;A7h+vE?;x!-EoLLSqs^2gP&k0{tDKcYG(!m``}nz zd(Z|4)hha;qS2qKlrA(-J*pn?KPbH&w)5eIYG6&*Er}TyE4o6wxLx5RD*$eyAlfC( z2Ifh`$SD<=iq7O~7>3q#Adr zn27>8*bIFEq~0{AL<-mp4a{x?8IV+U3dKgTelG$GZk(6k9O(38W4g0I-&c@jr7cKK ztcrwGEyKr0*G++?WzhfY*X zR@(qKK*+zlwsVw+5|%{U=Ri$Ap7>)$_V*CjY!K!4^wz@B(RpBv2tu zRard)HA>_!ftbea@6fMH#DjUV_qAA2sPvRml>>o56dK23Q1XkY6Ta`~ zZQObYH}r}?F<6X->8?%BR4_}%RRH&kWJ43gFFTw*xvdC5cN7+pvfT5uIo?7uJZPFLjjV@fhb!APaTfyL7?CK}r^S>UE}P~Br_2F%JW7TE#*GDwt6lD#kV-%jOZ87RO`&>G}RS zLT*m)rPAnA*Y#4Zs9ya-j{-NaiYPp4@aWPR+!BK;iwiR*-9#Z1BtIZ@8)L)90bk^5 z$s3-E`{ih}BI`{=Bi$P#mI#Ot#8$1DVj|IzkVqC_34?)mDlv@+^N!=h91c zY~cs-f8%Cdx@x_AK*tsk4`7@Egh+kD3=yfq&>;#f{DM9ix`GG#z2NO9tVAjmokl?> z*UqR=H2b-u@uUeVKez#V7d%1QzO3p+NE9THszMP?1j%0|78?gJyIBc`^Kl*ut&30R zsj!ir_a#-nrwni}eH{(sKHN?w`2DCvMD(P<54zzb*xC$%YMaVd^&nimdySfSep43DdbRJBL_H5utX!S zDR+_{Xxq4b1)F+yN!IM`%j?^H)3+oL2)PM3Ln^y(&PYgonn{orShhJH37C12jN4F* zNRP*)5NP1&OvBttKw}oWpaE%-%=rR3Df01reCliyN9BW@HKw9-l(#bAIn>zqaiIvv zcntR1uS0-|*Xn{^%meeA(KA57at0Ptt+03*U4fBx5Xy0-+zhtW#JnY2iD;Zb-i5UQ zI+3J18aMT^mEl<0Chq*47+hAEP99DHIdmT=&SOw)H-5poQT>jckXohqAen+}XGJDS zAhf)MZEv_57HL~CDrbWWp^sX+SrTAnHW3{tQiK_c(_>)Fg_-HdY;+3Pv1l>Ip&}|G!ppm0U_GSCoVlAERn_% zxedkb>Ioyl+#-F-uP1|<8;mSmzt}o<5fOxOgj1A0Nc-X*|)sOI?;XUVFMrYENBWIBqu!~6SV&0Gk0Up!n#q1LQo0lY*s3d0VhHU zLU!w#VI?CEVp%91bRc&JYt~u^R^R_ZR8w9mes2W+rkCpyhW`f#LbIStDLmls70NP} z{pkOXpT+^SquWLEuR%WaboNIQLH0{WcP#kBqfZH5Jn2cK-IQmLj@@)$C9g`8l7>on zO+krr;ted((UZYYYE8=S$fs#>SaPq4EnxLTLZ#I#>EPxF;)5{ANKkU4*D?!&sbj+2BbxrAM6j9bstR?U?v+zL_P0)|HVW`lN-%q%R23m;wH{eaSKpw(G z0nu=FVxFTcyw(5hH#ht$-~gvRDUaAUbk-Lh6P1$*rao}?j?BZ%=+HeHkTG7cNFwoY zGA)~mEY0>k5on=Ya~x6Q%pX`VbRXNOiL_6S*P(e#3X6My=9E3N2T&dE&9-dYkH(35K!?Yl6D0X}2H#->TLZUz)H03o?@P2oJH>ec6;Vw z$RrFKm$AF`DvGLM7^=csJu!ZVYa6cwH1}vxVX=y}JeKIZO3SBL|J1ezx$P8yfB_oB z;So`UgmruKDW+q=b=|z&y4r9JY~?`%-`2sp$#-rM0j3=zPkr(ji&QWo$23|q&#M)% z7}r#T1)H7#z}E9q%rC(R7#?XwW1e7k2Hh?W0DRDfH~h@}NEQO&GV-pj$x-7bpdaWr zEevrKmPJ+TKaPOEQ7@p85M*A{u_y=MX=YX^~S)NiP+Gp6SYAD;7*1ztzkDIvk^5AWQD9$Wp}eq!26}d}69y!OJ`3sxT_RZn2kb~0 zYu7krflx@xtFly;frA`o#M`KmO`nIQkqLJADEa=gGqa8)1l4stea~2C``(sk+Fa z#+W0OUi6l~$|`eEXQuaRRMY>5tD#U{$Ofs!OxgewpigU~$HPgSjs52&5CaMMQqy5b zC!H1`b#2i6U={k<+nsJD`~=Ul$Q0KUV*Lr?gYOJYe4Z>&F;_E9aiUEN&o3I;)EV{{ zKrX3&0v*8PeNkyQOydldkwBAnz%&ks8m0Av;YQd z(A-+t_>b^~7K&`X@n`~3w$7V;S`q>xdDb@?X&e?*HX8amjRuRR9G-YBr{$;^~c8x@|BjQMa}*eK9T$AXvnMjb~=g zZiAPDk+jM~evz^GR`@%r@QuL^W*u0|4c0mp$Y}{Khn) zUZEu%?oFsHSu+s=c`j($K)evWxk365_^t|dIW)0Cz&ElW(PLy*D;jZ7^dF3L1o}Q& zT)d*NRnU~IO17y+o>K2yGk}wW(8~bc5**SciNnUdcHcoaJKeu3JK2tktOV2&H_tuwO{+ksWrgi6Ssg`YFDxke1Xfd}Bf2k+Dj- zwlpy$P%^0Y%QH1suf>peca|P$U$q0z5+1 z;Fq1U{lezCNVJ|vCSNWlLav>0lCc7>A%Y$z7c4tSY7s%o=+KpuTxsM+?W$3&3VJFeq$>R-5O~V*xpYR4kH-D7Z;y)okEfzpo?iQT5bYEC3?h z@JNv@*qu=O1WxT?;!@X-Y$qFp3Jl4axH9C@eTm8t_vj$%A}rgCKpG>2>^ikwL_fgT zq&w?GGS;>*N$NxRL9uUW*fdhwG(L9bB$*E+5kI|B-f(Q3x)Ys&Vj&BgQLF+bs^j67 zqi%<{AIjWAMmYAJUc_os7^_s$JBi2H1}ueV1q8L(A&QOdaiy$@bj$!nGgb&c0JDPe zFj*)JfZH+G9Cjg(s@uhp>T~5jbLk_x0CaTO*0GZxPM@*)n3KFhr4sMEbih^ma@CQc)P0n>L)VD>>> z>2B)0u~b6hi5JfTxekXx^*r<-GUCK4as%`B&cY!n*R!1D&GrUq(lY@LZ&QdyAifaG zh(yLqVM@m{YX#aBqdCTgrY+3l$f6P*ci`5<)s>20dLMeA zY{;+*G!giSzj<0^$@=oQ58_xN51(u}!^gT^dU?Pm2mED)SwV#Z^LQM($L=8rbkjCZ z%o4w$ygU*Tg#c@~tfp;MiXEp4XX`PsQo{oS&2GeyIi(5z`YKj9FPx3&!c~f|OO6o; ztW5`ln8&lc2kHL55ss|`{2Q1v&`aVG0xA4^=DlYgUB1n+&%&9VQ^I85Ea0-SwE&?-_5A`v zUB#gbA$uYOk(|zC7}Jo?QWQlRMYl(WHD1lK}GO>s;(w9_N!gO5Az8(h7lZzJQ zj=V1zIUCHC@Z1dYOTwP`TJXQYNXel?&VH#UAEqk#nazCsN{!KBm}l{wO6L&ZCH(S! z5UP4G8MC1t*@_d2UN6f>|gVo{q`%FGa!G?PEPHEd6d%^vFq zi#Xj8#w9#cXq2EBj3vi9lxR`{c}Jv8wYie6yk#2oQ>I~1li$Tj!kgvEI#@C$dZ{xo zDiL}JE{M!#hs50Ov6PPuv_{7QSnHtm096u!9O6p^4HE^Hi(&Xiu>*qPb^8einN48pUln8`zh0-{f}GK z=sj1gV=5D?eZ2^eN>bITGZ2~S(cdz?fSq~2n=@Zh5#B#N=o$vA?SNA1`_(}Nw=+QY zYe|}EVgEY?NlvvC?|0L3nFe`6!m2u2KhmW~)S+W^>3)^3|NNp&%pu5}OsKN$Vk+E! zo-3-J#ZV_nbr70ZcteBgieU7c+Z&=R6k%2KG$n;y4@PfK12l^QFzfkCPvs@q)0(bI z^R2-gbGTA{KZk7yz#RD~uujpO@hi*gv52IU!fIB{5H-uH4G#9(YgPQo#&oT0lLW9O zMPeq~#9@Y%PU+ip~Es=@T^T1V^2*Dms;Bxe~?}n2*9Wc;y@BE;C!Zo%rzeQ`tI5PXI zwFCq&c+f?J_W;fCA;RteXI9PW)EWSE9?EU|O7qJjdq{%{Kt;z14FXJJta3Xz43ij& zO;#T?)IbD(@~i}o?*kogt$2u{4mzjof1%8oBuD|O3C2jQC8WI)>c_37w>g3rz9l`5 z?Ehi8uk+S|HXoz5i|juWotilMvCJub!APpSwr(n6K07Ed82Sb~7&T-#IWG{m-l30B ziNN&J)J%cl>JiSj9H45!vEVYCmMZePtk{WIKfGeB^amUO>P280=Y{UO6axdkXw}m> zZu^65o%>z1wJ!=|m5}Hr8o%$& zzT!G+VG(s(NfpV~RRfL2|L=l9J`?3+aDcU?CV9G7KP>dV3Cc(A1 zOjNyhO#nv(Y_NO!Hbln6@=jM*;3o?Fx5YQ!)L(2an#de+11(wO1aI>46DZS+6}kv7 zkhr*VDa@k})&ufPexQ>o^51EpKX~3|l$U|=!~us1NLC``1HSMB98ItH3}jIh5pwZH zhp0~;p&>Tmgl;8_AJ{U>%m^cea)$$hPV77yXM8Nd}Y($ceVX+>!=6QzDKdJ+=po2dSmOp*>?LyqvU*=Z? z)wnoyPvO*H$Fv=ouonJYhSn)cQ0=FWEntqEIgt-CZeT|YUv9MwlN+^1yvS6qALBjX z?`EQx#}+Hn1*;=5H7k(&Twt+nTmp1tb*xe%ek5FQWSquu3z@OTgbl?U94U!E=0moZ z+l3q~*p15e>#A(?M*(5jC%5rzduwYzF%?b+byNDg6e^_Hl|Y^q7)w##cXeV3h{&@ zLzIBvY?h2LvQ|=kcB+Cnv>$D%)74JBlKtr*-OyNiStsje97^V3y9rR7^{1*CU`2of z))T>whPJO5B*fskkwo%LKu$hL6{IOn=GYEET9w!yu+qj1^cY#88ph&M{ z{{DFgDBzqZJq!j5_(7AO>-btFId)A`UDAA zG>F;|Af5U{0VRl1RIUUKPtjoze+TW9I#o2)&GW&+s#2*M%P#0x0ip7mCizSwjYGlR zf=+$v@l}@2&>oEXv5$)4sy0yMg7D>Uu{Bd8wi{v@YfI7FSUI+o$Vw2s zbEVr(Z(~@%6+)Q3f@t8uFkZkaOH8Vwpm`icRWRXpV;nZdF{Ir@ z7KzGiU|}4W*6{*Z$VfS*8|54f_=5bHTd z#da1WXbu`5p#6IPeu_!ZU>r))wP>hG6BC*oQiKl36JCKKym;6}$nDtUlb!+i0X7DU z(=_vZxJ4V~doZSHIk|FH(g099C^44~&a-F#rV6mlHX;o>1HpxE6SV*16yq7;qLv@g zDPSUFc*##*n41B=_y^!A!%iaE7869iGRInt@0&SjVyjDOPJ?U7-7pKf<1;g9GiRMJ zTH)nqW6D9>qn>fpHga=!_StsVQz6sWiy!?$e`O##EKd{ah#cmy2$kZSOftftGinS1 zC*%U9fGOIhuTZI{q#fhfP>_<8Efrb>AQ7ZUZ~2d0NaU}3!iv4H6)Fjg!VBMsnluEm zss7qnW;X&6db_0{CX!dvpUW>3NO(2_f>*)bCfQubxjZC^ih=s4Bb12?WzGXa_S5re zEt4rA@tQ(N%6!!VEKwdJL@9hcHA*vM;>qP&~(d**`I2cw{blAuNq0d30i4GX>;%w*Nfr^n(zB z3X(PCbrlGXExt93-4iFlvxwlr65|7)p3fl=lC6Y+8D|UYwtV@h-eJ_qUmq$OIxcmy zke#I?1#-xWP|4#islz1 zKH3QP$y;y%$F!_<>PZ%w%Ak2u%J$*cG+2&mo`Ev?Jnn5onH{4^QPM}a+odHpr6oXq zDXZXghHYp)$74+wv)P9TdEdTKF`G22B+%usdKj7zWg?HgWZ4)e-8nBbk&&SCAkm%~ zQ(tz_cJ@%De~F0?_7*G`116Q1p)&X)+e3g&%DV0JW^480(^XZ8@96Jyo&fb>gD_Sk zA)&f-^H%A5>?kK6+FF0r6$(e;(jp6{y{i z1(iA`!PIe@!1CasBH-ayxiKt#@Ba#w!{0BU_B!2wxD6&cJQbk3AFvOsd?+!Kn-?KF z9T|eDf+Ofn#A|?FTW>W?k9!>p545p_W?!lmLGz&G3Kp-I+zpMY935H^`x^$Qk)uLo z@wDH=X_Eb3pjXHoku&9v;o0H+5IpUHn_`-yb#9vjp=a5a8{?q2h4IVtTkYr*l9Uln z8d$z~9&yLnHi+T?1o|Le1I6}@OV{M(yJcFtkA8}0VC^1sAz_tBxC1*My z9tcPSPM0Nj7`ZR5B&3^RdqjoGBMK-uTEVeQ_7d`D6*;NCs3hop2*}#7L@Giz{QA!GMu^5ZQkpPqH zWI$-#1fW9Myjz!mDzFn3Kk={-V#^)Zu*6NSEv(o!#c^>!=woH z)PSdIGQ-BxQxe*p!)l9G@Tiq;!=gL*r_mh%eV7E0PPDxV1N!g}EI^Ch1MEt2m4-A! z*p=-#?1eSN6vf0oPYD`#9i!!efA~KFJ4LQA1H=V}O^Re6n9MyK3D=mW24{#3_BRc2 z4DzE>K;~tb2o(d2mjuS|THN>DNt)D$G~0j~SIEA_jez8we#dd5&MgzAOJLg+kK*`Lq*pFcKtYzi!M`W81}i^g#*1aJqC3vSQ;rl}*32&jn8ICAz<1JxeU zQ>5bz>9KYl1Ws^(H1t#mpHrluM7j0^Hn=t~CE3h;Hs76N(La&L`Q=9hC@e?Ls#wWS z^;X#A%b94q-zdNqMbQMnx$ULF=LyDnvR;YPjo;GNFhcov2^5NKaL~}@Y+GRG8IC6! zIV%hCfX6jDMkSSYl^X35jgXSx+VpXjI*^+#3Fd38xxlXF0db<1!x4O}N&tq}KpPZ7 z38TxFV4Ium)8sjrwk?V-q)=dxNRA;9y8aBsP-oT_bX-FcJYA)tXbWV<tr8FpeQ0}$wz9LlkjcXAqg@C(5*%D36d z_ZG%MW|h7LV@%MZSadjO8VJ7Co+;(`*@g+@<^7w_I5$WxYf$5qwxS1ohoTM0kGY@Y z#77>W?jQy0j_78sa;r(44R@oNCD%pv#;&S*hLfoo8~;2W+eLYOU)ZHE*)m>x*m zm1gHa3BNtu?2^HFcrZeHBS=~Uu*#&cYbmD`BH)3a&qv54)do;jTwN{c7q~c;j$3;W z4drjzH5f9Sd%2hvt?%(6O@Ly96{Ou1Qj#Kym94^D)mKF!N96HgzuVm*f1*mMPdYFV zGT@Qd(qVmb+e;|{9c4Djac_s0E~2jhub36d)XPER+`=MThnkForWMROlJQEaWXQaO zXKq%$BHiSP*0)5;qduKoi7{FxeztnoH@=%ns?xpr9aV@o0Tb)Psrs^u4GP*ad0+;m zS$}_kIuQm7>vuwtdxhveqH)OZJ4)UMe?=e27W}DoY=Hal#zapy!t{@b{M{WfP}@8h5A8!5>N~e?>YiyJ{_oMe6%TxEGX#RnaJDLd~x(yD?JI9dg=@J>QW1DRm!-W%wwsvne$ik>kp%nqZ&H@R!nd04!2P;t8P^^Y% zTOFxV9q5i|0LOKJGH^hns>CCvhy12=hb7nsZZQFNtswvg5QhcQ&^zK16s}E;q5jw- z_a(OGGhwOK)?_rBh1Q+x%>8mlJCR&-h`3YQm-ZEXZE79$O?+_)JFIx-T+!L)0HS&k z6CQg)p!sNg`!9F9`r> zfnsl6Jp}yKtP&MDd$mnmR{22Kg*>uPj|J}YBh*7-G23uZTIU%!PHhn}6&r!Iz69Gl z$uDI$YBMhKB?C_~xz4^dI%H@^J#dfx0>eO171X4?Y+i*JGj2?d;A?m*_sMj3FuaPQV>r(1>+b$cP zx8fs6c|X5V@~<-j_oVaNoKF(cYw}Mz3|x#@2&xM^Yto<@GHiU`cY{gdusMaC^96JR zRtL5{A{Yx>#>yT_@^Dd#gOx|-PsRsd8m{v)Q~!+Zf8 z1A+c{TUm=%h!D6iXXQtaqrf{w*m$w43la}*v0-!2mwqXEsw~%#dH)GiA$R2-Xy7tH z&`o!pkwTQIO;6n$N{~RN%<79l9Xg7V?j{n7T?xtux8SK79ko|9LsKUT&`5A2Wpw#~ zZBFQ&Q`>!RFI7Hcm?mZgXVi#!bXqf9Rgi;SAEJQrw3rQs@ll~=0szt1F5yOP2gTna&!`;HqkL$APAYwa6lS! z?W^m=zJ8q^>L(LG9ad0HGjx#y?~1SrLqQRSkvG?vX<961V9xd88!-i!V^N3`4%*^c zHc}mM!Q_aXMl3Lg4ZyS%bUz7|qoj?;_wTTw>=zenPQyCt@$?dl(A0^Yn=C2M0v%s9 zE9429#({t1R^nt4;0%)5@>Us{lE>$uTU38oOm;DsYLo;x$4BFA5xFyl@--$yH&UKCb~LyhOC^%As# z^KoVyspMrwX3KDd<2IBoILeKPMx#7BiS!^qvzvBy@gL!pdLM|_efyOl+rT)9|ADZh ztPUvIx&fEoy}-CZSU2uIP#mYt{D(~h9g1002Fi-s#Q+$FpjIYHvqp`REejJ#ZCR1X zHkeg^1ZWj41Cg$rjYdSd(bjc(-3jHSehV+?VlO6911Q!H*@ghm!FMEmK`(0i-DJnmq;GZ${ z*stx6cD4hpno&>nr!3D~Vr;j*PWVCjW?oM>%rkGU1YdcLB5}`W4rgMYC65Ip;b}dh zjr^!h#xhD@qEM}i9qYR8i6xx=PFy!o^_7fHsFgsB7NgcxKqzs;{xf8s(j>&yGC2{K zUU>x03Dij&;~Cxr;;fRmUd!5I$hYz=V`th3v;mJ>IUZSxM4=^!gVx9fmI+}xc}HV>OI+~@`bHWZbBWO5^QGV+0+nan$nkQ615X%pDl!F=Qg z_&;36M1P+{*h@g~V% zdnuUFoY{8krt=w22BN818v48cWmJYMe(~pv5P$>{gxd zIzcnX5|e|M6|@njez}DrDt!|YrYW^bNk}GfBCtX91%u0a0nO`HM@k0X+X=`T*mfL4 z!?Yl1J?m<-*SZ-bbPUu48Pxe5885B{npYUCd}qvGx5+Xi>(w?c$^wQ8nNxG9=>PC1 zj~p)2LL6|UQw5(Yst9+)E!?@=!`n0@I%euQK0_BpJ(BS2>2}v2<>(&s0tRe>s|=l& zIm8|F7olwh4S`{wfSVMP88fZx-Fr)&aU48ES_0)5CWiIPCX2SH7hc>C`Z^-20!ry@ zM3ku_-C61gU2_McbFz`dH>eO5b(tOcC6N!_10{JMsN?T|Ufn`%NW%MIZY)Qy!^Ykw z;MBX1t{S96SbZO1J>u+e)g;&h67B)_*X%>ZR|3ihNvQr#G$rRXoh}FqWEU)O%{)`t z1`?Pcu8?^`XlV$^Fey~%deDtZbo(AeB0>lfRfAQ!yfS*DR6}#CrFIDe&O{Tn0c-+R zvg$9ZE}hQ=UqqFJnjE8h1&z*o6Gm#<8nz1;Vi*)NN5WWa_MXJ+oYrX9E&V*pp;ecY zQQgk@7;Jv*x^2cyQ4bM?lANP;9?wLY*{2i{ZcKg=h+j#Uk}EtfC?b44RVsBb(=SjU zZ#oD~rlzgZk-HGO!^IR1Vi|f2(BD_`x?Gc{_To_cfnP^g}RKdlrhF&QQNSvQdK1%nu06k!TmoA+^nl9X-I+3mXqK3BfMnbb00aSCu$X?fJ0=e@4BkeSNo={Oy#e-IB9tc`)dk22 zkw<9*AyY5RB?Jb;gsFwqQIQ(O>E8`4Wxh-f3L48l2(IGyJL_MJF)wYTKikMyKBv+4 zJkHIqW~rpNO1{VeqG7?o7R`3Sxtrhu=6HpuS9>Q7q$MK;AF}UaX3~~Fd|K||uyFcS z?YveqPC@Zxwv69XS2M{TYo$xcIlmB$lOJM&+@TWO81lN0hiv4rC~uWWvYd;Uc_d%L zMzMzH{cOCX@evbd8}1?7ibcio&PZ+$Fdh8$>h?VdaDgCj9_FygzvSDg9;ss%9qLL<4b~Wd?G3h(t;M36gSiTAQ5{5;3 z4~pIK17R{q$-R%{Hx0fQ`L-r8?4W@X%!ZMIx8D1I&(Z?t#nJNjfJys;}HdLY$+(g7cK+qDe03aTj?j z6w1dW0Z^&)t8g5HaA3AX^IOU99qrewk1iGjSGn1Bu~))q_6~gkO&AL;3Xg$uKMA-` zDtTv4IpFNowOV2LPtGk|-M$)E7!Dq=$rbSwrlq)(UZ70JxggrZCYBs8{k>(ZwwrbY zJ(At7$u-Obp}6weA%Yo5RQW^DN{{|j1~#|;dE3)Xv<9(MC(X3~udmmjLl**F+Pw}g*jkTEuozw@KCK1zj-8BC58EphF)>^6}b7Msam~W5y5O zo=_3gFf;6#tDNa+~_WtIll`Al(7(3tVDThvHWY=uZq#)l-a6^Wv z*M@#}{42_2f~K0CZ_iX8iuXIllPmMbcMtjdJP&ms0?`rN=J(l>$zU?7x+*nx=3}q$ zo^u#Eqe_i|)fE_B$rC*bSs2_E$rMxUoG!+Hn!$L5r?(06Df_@Unxa}5rO?Aj@w5jL zcL3yr$573bF4>$n5g%kG)&B?|RsqK0bk)l`n@1u7KHj{A2L#0mC~|8&!AclNxRk8q zV#zY?kIkU@KvbKvX4GR&;KFXaFQ*|4*@*--yaM9FCTvC%0U9(5Xs)5e))Tc1~o z6*+Ye;0e*{)}0|vK$!fuK)xj`Uy#K`q{^AB>7Y!!e50dC-6d;TezL3i>VFizvMl3- zP6G~|9cw`q2HKW2FDrrN^ok}-U1|}r!b+C{D_YnVoZg2)==xa(=%VsNXc4?>>f$)f zT;#^xc_%oqdUm$;3K-}0FH*x*b}N9sh$%XdJ!d8?>l$tT0ZSw&Z6;9u&kEVa@N3Rc zX-i^!5D?4o2|84~OSRAj$S<&Ql8egc!%%j}4++_fHfs3E6OkxxFQBzl`yU8V8Awff z7=~}Xu+Y;Nv3za^XA+oF{gpeWnlT*_G$<+4FmgcqSI30kylQku`;7?sagDU)>_Ns}fqe*50klk- z@%C1wLedd{YU@lW#S?ncb9-0eGlbg`TTR+-ID*}cnN1{B33g&g>WWNxBJR9p7pn}Q z_tqV+u=f>J(>@_`>yiD-G9sJg9ME}<>m0JOt<5AxnJ`q}&r<7cn{RS{4Z2#pkrdm; zeyVk&w+{@riolQ-bznu1CBqk!C>SnQJ3r0iF=CDf7kG9VBhy3NG_Ai$keO8Op%L@j z!TZ%jfF<_ID0W`%u{e0%rB<29{M#gv5&m`PId_IIZ6JEIQ!p+mC8@FjBSCwQ0#W$` znPQyb`>Ya0b3LsQbOQ6>Q9vQ4osv{@C#a`jQ!${QK4JYeaZuH5=_-uTOkuo6k&BSn zBf*%5hry!A#1=)JrWJZ~_jY_Y?bx=r50D1y6<$ptO)r?qNaz!y+>dGJ@c=ul!o5_F zBBlCjJ+N7o_7u;cuwh_TmC-IB8MVV(aFT^m#y$8Yewn>HL<9PF(@@SNG9E*_* zqd(SFLlPu8T!}X>4)WwVU=)3Cm8G0ma*$%Jgjw7%;yxz-l14=0VUv^H0Qko%h`$^S z&@8Rwb&jKh6zw2;v-ff@KnFLog_HJc&1ZN!z|HN8<1I8Xu?a&eYHCqzyZPgY>J0&B zQALjIIyRCaz{fGr#8K9IAE_oc<`7UAAig9l>b=14#CMUJEZ%TDfE1xMC+1|;n-Sp1 zz3_-!d#5SY0QE;oFwGtlwR#O|^GS${VFa7(m22JClfBE4y!G}(YB0ocm}Prn7VR!`CA2VEdyhnTVS_$vgj0e_gu4y z5+b-)hW&HLC}CcDU${=?1J0C9K)B{38kV7bjiQIEsxRck<0c_1O!3t`L~u1LaH01; z;ndK^ir(1s>XT*kYUn zd78_M!~*EpxmU1YL&DJYt8e51F!o;JRj6Yf38rZlBpookT-KH#UEMYKf>{Nnlm#TO zWxm9)ZwJX>QN}_!n`A5XiGW8c`1(2NMF@aF!UGL!ZxLmg)*1kOP4eyipKnBb^e3=z zBA4`33%V@!m-*70@{u*W3A5r)hDEH?B4?boH z28RfoCq#vRZA0yS$GG8RdESR9j%c}@f(=lS5eP2h! zpj^&AK*)f1a7RI4D>cD1o{V62+N=Qx2u94PLgQ%emsWfy3b=s)^hQx(goHqZ7Up~1 zSE@ggjF;yec|N6nCnrSn_n=1yQzu-TkdNSqL#&2F?Iwu8PlBo50(BxjPAx@M#Yhfq zuI4S699a}h3J7t1^TL)0p`W#;GNGw@r_f(Kt_&|AIy|A{>KsX-pVpS*(DEu`<;Q5- zlUH#*R)Auh1W`ZxGLXMSQ34nJGmunL3VvF8l*D3#d6C;RjfPTyOz%p*FAlulIlS72 zCa6wVGhKi6qOBYXhd)PXk^Shkb@t}{JbgQ|R0k;HPlSR13&y$^%>RFVqWFj*$SGo| zGw5r;xfPmec#x1#wN)t0yhC7lFC&T;#8KupX7dw^@y70_p}`T5j{`J~!@{`rnzY9Y zpE!=TU9AsV!Jh)m~>^x*mFIsTFE301-e>*hM zHbgN68Z;8TTHG>Tt;>3OK{Eu?bPI-d4q4HpNp=a9tFD4c&=H{-2K71#1A$)3knCdA zWO4q%yU&;ILDieG4nXQ6QCXQBY|H#8I&r{=i3$E4#PlAV1JSj38=!!#gzeSCMIU7e z&Q68EC`Dp>FEy3j%?LmXE;Z17!c87aAwaAR5DP$!ZODY;ZJJ`bbr+ZwuozS@0^dlm zSt?Azh$y+Clule9xdvQR1y)X&yU0YSSHN1p;zddAtg-rhaKoc5PC2!;-n??@1Ho={ z;)3WRXWU4zbsdrX@(5942GmDZhlwP1=f?VPG#U-F*gZ4 zgFU?BoX!PdTB76xKGKJziI7kM7W=Xnsnje(C6fO-Nj8y=I|!)3`a~(mQOYG(tu+XJ z$&bg)T|}a#{r8*mUKCk!2Dtk(CH_1yD|Y`SOq^k2%?7iC$EHSB@Qy}&aYxO?*0R1_XDM2em=hIJznrQDqnGw z(r394@k)H#;I}CCRWv#d!yA%B1U|K&r-gpSklZ)n2(RP zO2B2CT{7@qKwgx43bENGP$E8YW{mw#QYi5tJT*#t0Jp_2j~Q8n2QUx7aAbGe25{KO zqvL!gUA%s5Xkc1saZ7zO2n9tc!X%JxlT!f|2}CtR66-lew#;}0q>+TB7^R=s1= zv%T(c^~RDg&@Z|BVg2Wlt`kp%xCVUeqParof)XxFb*1 zi0I(><->p=5mb~wmL`f7sc<|F#6(BWXTvlXKsb|Ypd_w=V%+K90M~^K0c^zA;f;Tc zKz3=D30avHzcXw*=kzU@rY{NCB7zyNbG_=?I)r+7fVu_r5f|ENgaO+z4xkU5VJ7J6 z!F_Q^VUGE1iiQSI4)`|* zBk<<#A6ked64W66nI5@{Bt&d{`xTlwTLF0k*+RgpNP@~+)HHbj6`5%wyC`aCr87$^ z!GM&dWPn7vJA@Jgc&0`&WAH&qmHQ_#!@YZ$xU}wL?T_zmS)zA5!0bHY=pR{vhJawD)e<|VJ-%)G7?0R5 z3G0}djg}2iG=e#hw27yB)rJL5Oi8S@|FP~6Ei9kFa3BZfQy>!|6x&Jxv&ybDF-Rd0 z$kEiH6)w6#i!|Q1(6waz7xv>7s8!+wL=qh6nosUgwyHT8fhP-L$Q}nMiIZtV6oX5^<@khj zx-rWaViKfsT$=cpMj9pJ5YV{daqN`SKHq(j=@q2Ni#Ui3wjzUIIHr=2q|A6J<1k`> z!V1cE3YzHGvwEtasWjMHH|snQh31P1jV^H@qa-&XDf39mMq>izO-?Tr=DxQih_NGi zhe-+!{d^c$EhFY$3L_6r+ZL4`PD!bSDw0?ygm`hwQz#uHu0fP@NH{>P=H`%(m6H>P z>@mgGH&|dav1!M*Xkq)Ya)Q7#AOP{A_>&K#S)i-nS2WP?f5`%0+$XNb_QC2wJE{hx zimn1f${MNcs2VUyCf;HPR%la79CH^1Gc%2~HWEb1Y%(N2YNA2_wL!lqM`fHviqdrE zZZe5xER128x1dwF7aIt&euPUGuMeereQkOc1@C8MNMpJoG6_LS-S@h}G*1tr#2}Jc zR+8kKWyJWr?lqF$93v0`VOoeyF@i7n3?0s3NtmQlZioEk9yNxvUiMv(zZ5|wyxhPB z;hj<^TT@f2j4C`M@PvtLw09K{%HK*ItFAUXcxG(9BU!)$C}^MBtOf^sT}zLRN8>vw z;Q|5S5uK}N7qmR5bpmR{ErvTfyJG14{)W%(&(K?-v1cr8eW5L0!^kc)DK>>v^k(x8 z8u!ayPWRV(Yvk7YLz*@mW;4;GT zOc4>(flI*NCpBi5d9i?~&)kflV2!B$5TmBtHW6^vp{7uOjzD(!c;9GJRzyNYW?_`| z^brSKTJs_7^BhlV@O$6%1_s)y*THuOX!<;V>_RqK(HH5#;W7=o4bB`#v^<}Rd&6lV zIRbuJ$W1)S4lm5$gJF~#2jUEr_D2WKN zi6GxP49?^6gw$gymaDQ}BQa@CHi~2}(tsP-1t5rQB$leEHB{s!0!z>WPVW+MT(S!T zfhhpACle%YGij!MYtyKp!orw+FA3XXHyr>lB0Pwn_V`>jIewVvDfA!(mrXI;Rv!l7 zfk}c?W_}!!EBjkR^35KTRKIy3 zS5D@3>AY=+P{JIUQPP)XW-gi}T~GLUNF)yVL>n2RTo!V=NxWsqykJA8@>e?9f9x0n z%Y3Arcv3&3;k%PAYt*f_0?1gk5~d|$;M)iq`H42(8AMkWNBl`^mc()lrah)I6u7Iu zWW5sn5y*j^x7HFV=-VWmSJH(lugEem^j1g*5U|juikXy5f=-3!L5J+?*~eq@Mz##WNjOSMWqAOh{p<31 zVS;vAONVr;19~kgi^PJo3bzn1K_)7dHzpyWS?~u*nI`8B$ktFPO{kY$;8Z1CcrZFO z1UE`X&$+c83h382W_)#vWN~P>ai2jd^{(=1BS??t-Y?@8Onm}ClRXN8AALbBeO?F) zon-W+0xfUO^4mZl0Vngn?JBu1`u4x19NMf;1=9z}%4K~~(2sT^yyOv;BO4X9nCjB0 z_-S=7TP4fqpJ7ro-sU{EE4fHTa->|4I&>^SqQc6Kb;0~AugA4=sSai#Tm_8>&vDOF zqdvO^SQD_UB*YcP#zN+S05g(|Tplwk%aL|$h>E}R%8J&rPPnvLj#xVyJ~+2(JoEwt z)WHY`+XoQ=Ze&4GBHwDk+Y$vi%k|0JBLbXd6|&@52vSz_v^g z-MrCFJN3$gDd4CaaGx|lPXpyN7#yvndx}o2EZX#}j7E)7p0~W;dJX?fs>q^T@^ zY)S}*O9v?Fy`w{nsR>W1!&!oP%m@K#nCrobdM|J6yu2Z&m@!yfp$T9M8otz1L#N5L zm-BjDY!Y?6BZz*Fg;pC$oS;w&JGbEKl?P*^`Mq>*z7~sYUo<&fUzq@dI3)&+hb=gV>O!tJ$W^=fWAyd) z^0Kd+!H-f9Q(RRA(%zsTwRhsJXG3z6KS8F=PR^!aMSJ7BB8-AvH_8D-#SKA@v$m5K zsYDU{3^A0PH#dp2@;8h4Vr^g`hv(imZ3Ef>cn%|dk&GY|KyW^^KByn9>7b)VcIKqt zYpD-Kp!E0&>hJ`WIko~v1<5m}0O26tBe*fs@z4_PVCb7;Ie|#F4xUUtFON_ygaVJfJQXOq4^1n&ZkJ znpv#Ztck!}9Oazq|6rgi;C?OnK&Mh?DJF#E@sI89U9b@d?OX1g$1>+L1-=K0dt2iP zx4bGCERcjRWLB zBWN1R*pPwm-r-=NM$_cfYl1aFb{6tfGD7HFNVcUn?DKna_#!ab-t8I*xA&yDgj99#tVZT)Z|8P>7y> z-fJ%PGfV}XRJ7{!mkqmmG=~o;td<61d2My9KOn=~T}J1(5Y&90X9zabU!Kh44aZoz zzR?IzDRCYtq*!Qxu{@^{Ni0LRJ!Q)yYhbti&YfI7IefT->T{)cLbl=CE%1*6%fvv? zl7HV?hqKxG?6BqlbS?7o-uhXR8J)z%>6X{Sx=a&mUktyLLez8O1)C6{$=QOG-GZw% zUHQv1Gk&0V{RD6Tp*#PZB=VGyp=C!=p~=}Rdyc#q%=DK1MRZ;8rng|%=)Kpj0PEN0 zQ*W(^Et@HZ5M!UJ8pz)|qOr$3swo<2!4d)ILna;*f|$OcaQ^@YKBcGNVc2vix^&^b z1!61^;ykfkqX)yQO+BFGv|w}-ufJdZod6pD1hheP1EJwPR|}>&YID9n*i&ep_09Ij zdf+HD>wJaD@9Bj%ePq@;3Mne95lr6Q0q;?D6a;Fug4FIOkOID7#8U4dN^t3U+0-l;!tPDD;G`L2$&SB3!yZiFulw~;P(ZH2Spf#PY6?s< z0JxZtL)Ma4f#%85D!#3k>-DqBQ2wCD%yYnsnCdp5Vs=N1GjXmpzP+O|>yU^P%7#!A zGc^Hbw6lIFka)HIDiOIX8y+n6?yTUz@Wz&t5(9t^{7UU+6Kw+ba94{;>hmoIiz) zch?`(D$lbq%qFcRVL(7iI7vYVfjk0@mc)Ss)7z-)Fgp0(Vsz-i2_>kng>=DEfCp%` z0_%>j6yviC;v7uNM33n z({ivXbJ20h$3(;6kVyAkpE#Ve95(FTE=eg;laLh8A97d>mni%AOE)2z*Eth;_55ix z{;k3U0eM0`K*+=cvwr^&NQ7*rG8A0MQ ziAZ|7^1JG#xcBPBIdU$CzUJtup=6#`i9NLBN{vMnA=b8lADbRuu8%P&t3;sNd z#K|JC=BXt3Vk!LlQIYQgxz!q$x>(J3`YF2L{~!nPX~%^@h=%MGsMu2<0lkq~qgrxQ z=D^BGtlinuA7w3wt**ryWG*5>i=-47pf4bx%?~c0R(nnF23!Etwb6ht8S#ys|?lbby3ux|* z93eo2axTU!eV`60pjEj*=Ok(q`r)Ya0<^5JB)%1&vA}h{`jIO_QMj{#LKoV*tcr!a z4|a~V-u~gzcan9TV|C*e9Qb!Lf+`zO zrY~L<%g>)KBY-(*Lkf0KzA*S3SS=yb@GYTlFnAu~P_zrnUswA5KCCF(^pwA0djx+1 zksLgMJDwgs7k4=hg^PTivIylvqxueysjgBd;lllTb!Nr0i za)nhw?$&$*-Unl2<%#$()dtLLBZQ3pX(|J~B9k&c$*C^3AvRlwFp|E ze)Jz2+YT#Z_w_M}k(XC7T!lUb-<7nDy6AP!3Ian|)(hG1CwJ{!(Q!o^>wcgWdW^_W zTpZST&6OyQPSiFoq)c?1-S~8dyNUueY`g+D!qIvlv8Wx8Sf<*+8MDXm?D7kP^i=GT z=PAQ#*tZ1^rH~AAEf=qKA_o5`=eIZS@s*fApD54=J6M;U=8X|{*{m79eN?1_* zMqJ+NZX_$9_BYe)Dmw(|ZP84n%W`mm)^is(jFe@Ysj zuPi2UWrVOX5+Yc$U=TwdzR60K$rdqY3BD~>d}0(u^OVU8gO+@%{spwdCl>bY_%&J| ztd6oho={KZ@}!L%ldJ2&&)G#_WPfU|E|&+U6`&IdRotD^(6PsppBX~f+LCaWQzS$Y zF@OOpE98d$JPri!x>w3$MmC}|ZvoiY7_&+H&D2TsQo)AG@mSb@nz~f+@b>&lmoMky z(5kFW2BqgGp3{2!dK%%I1=BZq`hQjiB(PyKP~1L0`QUZ}u_e{3?}6?!!MDVj6G?=@ z`TmJo5h?}_f7(=Y;QvG;%z3FsgK@mVBbxw;+B;;F7uos=(IN~NQG7-pKt=4V+8cnx zhdt%O(8#k>0+>sH*a@lQ>9L6oZY+NpVcBvWS$dx{KxdN?1Eng!^&H%BI1(lXDL`cT zAY9MLf+4H7>wK3z?wOv!^1P-8dZeFW@6l{kc@1}mKJvQ#Tz>jI*a;U?LPm{+(4=Bc z&?qo7VawSop0g_{)Pt6^KuAb-mMRU6D2m#&iRHEdrok2TSyESSsfhX`^@}S?c+FEW zWu=yI%W;i6u>`wnKh!Ib7TPwC3vKX*@DIQb+v3m$D;GJF29&sBOn*YqckQ@nNBMaq z*cM@kY@jCyijpkn2V9GRiN)JSyG$ z&%o44o`GWlv0;&nESFG$qWLg8XJ<65<65n1eP&?Amy!ZOnR{QnsSZ^jXbw@kJ_PTS zG#Lv)Gwr#NaUIA!;3lrpqa1eCm8ZwA)>&GM_tTHh_3MirSn6E~^DHjZ?Zd!?IIFoBGV~a^ za>f$B!^t&6!17-QkK;4NI8QT(1;Zbf7dwR__r@CvYqlLlz46WkmI*6i5+WIBGH#RH zUNLe9xjZ)jG4iQl?Ou9|rUl zXCk{85&-H4V!i9EpcEqey2pv|@5{_FjfBhWlstsOC1V68=u!}1CR5}-T}oA*(kC9Z ziw50g&z43`hzhZ2^o`48NoqZSN*s2?mUd*Oh`}I-Mk}J?xheMV*o;nn8O&59Z;!Jgj_O&7!cVzurCs{ zRU|;QVwXCq()Q*3wQPfW#EnW3#1!Zhe}jFIh@utKO0q%6XSicA%+Dez@&{dJspEgcF%(GWxJ)Cx?2vbt> zPks{tii@3tMyjx2}giUfg#m?d2Ny@P@vL5E`_$jfTZjoGoPFGh!NlDG6fEP~>7 zI5$9yEqe`0eSsXAm1KK#m;y}m)5iWnAHJaY38cI;r;m6UL5d7WszW3-7f=IMgr1@I zR{*CDjwcTc^N++PD)u@Wlp^BYo@Cjp14Km3lDZYExSOfj*^*LQ$ zIuWaVl?8u*YArMGS+oULf zi>5}2K9n*iq)nA&b@gpa7BvAm@KM2SZLvRJ#QTaPa?M0&SN-9rk=Srwljw0!pYXAv zu6I^2dIRlWJ=l*yoew^G3D_Q4Zp{QXL`PkHQFq3V{hlOFJ~u`@&G0Q!IL-%bXNMie|JR zreGA(O*&2mU-4@_QII4=`i;Utu!gSkBF&Wm?5VPGWm6R}vR5E_$X9R;=;QiSW6;-? z!u;O{x(a?;x^~nbjSrO^DefnI;Hc_&EGHmcg!XXzAbBz0qR<9Ho+=pgpIjV664M9G zobpc~9W((iRBPT)UH{rJESF>G89mf5$#F@seB)i?Icw6|N^Y~LbH5uXWtX~(AaQ#V zMu@CP(P7#h%fEPI7vR)@MQP_q>xk9N&QQGsX1L>)2mj4|jK~=*3*=qk^i6YdEpwgsC4S2z7F2)CF4 zQF}dl#CvAMiI;^kw3t*1wroCR=L(7wzDq-Xk#06|(Q9m*=1Mxw2DaeEQ0~Y@QqE)e zS|pdJ0AZ7kMDpJhT^nw4VDLO)A`%?!oTi|%$_)5{)y$w*aw^e9>vsAHqi2rA45y>% z?D=*o>2@&0%J@V^baMk>Py$9<4mAnsffMr}PRCi80EsoL)52O}T-2=F1>WTluchM! zHk_>(5Swt)Z>02Q&RB_RyCK*$kgUo$*-pC&I_p1ElS(j2j3E*bjh3q;n4!jYdm;_xZkdy*V9qCU4=zA^l3Atj zWP!^ZU$HUV45gjXPEg7y1>$n3w8ySXCOpwKdW0ZA$T~E@#(#r(fsLhY6*iK)WUsHj zO7GMoqMdlFQAq%)lvhCnNEmP<2}XiSSZXr>-tU0iAc4MAT>-J51C!{xPejE!1D@;?2cjxG=700FTaS78SS9j%45r#;gF^5y}BYH4*@3yq$o%r33-ChYt*n0vyMG zvrq(o<5ZL{{L!92jaoh#9shEZo3Khh?XA-H*tc~mSD>Q00HeKEE+$jW{ynEKwGkR9 z@^6d8=y7NrNNK4dy2tWhk~yVqc~pnVq`F^_L72uWQR8C5%LI zQ%~=w>YDSQ8zd(Xl+js5z_e4awi2#r$M8bJhGKr0@R{2**<*2wa~k&xv<<;mN&ShO zGJY!BaeI2U?6jsNYJ8IKC6ons7GvBkEdU>OF7;?3U3z`1TBYbw;<`(tOwW+pnS%#3 z$LopEiR*w$WG|MOThxV}i1?_46&Mj47c?jO7wHpzP)}vvtjhcm>^T*E)jR?Nw_VJH z(hyf&8z9CwR@|p!%gwhWkz_rR+lGfiIR&)phPlmsr)V9-;umGc1K39zvfxO6QPga> z03Ql7m=%%3;@M=}+>oZW-B zW7r*f;Gfacn-uIX+FxaKgJYJm)wDDM0%H3FZy!IXV46_!}K!3z{KRynX7 z8P%iL`n8lvs8|?0kI3bLIi5@d3CX5dMj1=lZAr8atH3Uzgp*A5YVnA&WveVSRe_F+ zKBu`{E5o8(9}y_j1tTEv;<7PG?zVX5+Z(9%hbbM9cR2Hb$s=HtEJcW;j<_D)6#)T4 zfLP?iNe$dH2-HJ54VYa+XpAcx*kQoQk&Hta#taSgFbG+$IOgd9G;INp!w?1yi{LHr zree(s>|1cNk#QoT3b0gxLt>7_Op7=c?kkK}z^tKJ1Sk@OBX~}zmN6va5X4*wLlPuN zkuU^j6Kp&n`oj>0_zgrEfIsl#!&C=h4RRVNF#upN!a!I6#*J@CSei3=Y&51QrYwFdP^^pke?7K(&F~03raL06GD^ z0j>h)0YU*A0Sy3v0AB$=0M-E40cZgm0e1s-0cir_03iWv0W=2e1~>&C2C!rRp>L5( zTWCN~w3r0IMuFNZvJHR=ARK^l`#1D{G5?pwKS_MA^54V%0DKehr}RFC`2XTB_?==0w^)u1m5PYii@6f)6_5Ydu zv+NIZ_(Rt}Q++LT5!n8!J4x!>sE&v_3*cXat{Zq5;17w;B6$epw}$Rg`0nFJg5D-L zYvw@(goc5TeJjM($AJAZxZHZN}RzBcP0=_>ZI6WVGU zO#Nk-YqZTa3{!84P0K~GsI#32<+_AsXU43wILwZS(8n%S9)lP!Dg$$e2$$9$E?^Nj zql4do#+a8qEP(bD2)DpP|$dp<`TZ#bY6^~7Xv_Lle)77^OsVhMOm(@ z??8O8kA%}ZWpR&2v!7qFSw@TF6d*=9YT^Rtk(n8p=CQWvt1Om=n&5uP;GiT6 zMRvbm39kbp*KB`qoVg12w52Z)T}`X41P>D|q_%K#zuhwb+BpEogY0E)KnSy#@+(m5 z20@LG@LUEvk`I|OIUV^^0_YtG9AElBS!Dsh%k^P9r0moJ25Lkm-gh#igwBDhAOj0!EF&8MxV^-m1U1MEd?H7} zL;r;tfFIT|ei3-Z@gyM=!%Ba7Pa626JRAA`V<2D<{RLRT@0o=bE)XF)nFtUL67`2L z{?_Qz_`Yy2t+I)?9&z#z__Q%L3pnhN}U z_rN#WU)kD59D4whbSYERHY01jM7id50EuI1ctl?<_IT=Y5vP>(sNNkB&U5&F&^kBhm5y{o!y!F+4wdxXoy;!4$W`?_nL(+bK_QDAMUV1O0AwZ| z6j)s}9YEZbY-C^Y)9Ej`aS&~{sXCG2SS3ce$EY;Yv-c8TlrD$C85ATlLZpGP_YWfi z`RQ?z1@zIfa{yqfsUDMEPpwuX%XHdO+ASb3EPi1fBPocvfgsC0xa^CG2SWBPWQ&GS zpCXPti8b>WkYbf#Vg%A?&_UwUsUQE_t4GX?7QqUpKJ2Iw#%)Q4Ft(`9Ja&Yk{C@38 z@%T`)#wWy(kKfEH;ZBQ(m*Iq&L=<)4D7tNO{SsA4Fp4D?(Ex6nQS&f3TK|atgj`fE z2|OX0(&(ZqxJd~IANX&dvX?U14_<~h2(lP6k^H8ep;2HW6oPo?U%v{M>|{sU~;p zLTv$OTx3H^4zNUn4wUfo>j{CEvTC@C+cw+cW*ABH6u@!M2EdBL?1GbL_#e;7YDBas zic?MTazk(khXSyPeDom_I~wkLv?Wr8<%egEfM!*M9^kl$>zsVzaP}S!gcD3;Czy#58RTm?`p)RTS8I<-sC3+*n{A)P*rU!@Npj`e{x9xsif2v zTW`{q3p^?A!Mk60Q{(FLt(&TVe9z z0-!PiOV02JcNeq?AbJaI+B9xC;LB=}Ho0vH(@;Qe0zq~-8ckOa!(u@Wou`p_TR|QT z38H`lJE$G{q1egUX@&v$x7wNLWD#j*!D58GLv^bT+jpdKBrK#SsQsWK(+RO40VA^w z0nA7MN1Y1Fc#5JkwD5TtHG1t;lo=i)U+kFG?1Jh11h9382!marrRE2eZh;JGh`wNO zQA_~n?%97HOKLA^#oG(5*bgSllS%rOc(S%Yj00cYR;!D9G_90{pfq7D4I*$k?byOV zR|epi%oIJ{ou`5zS!-_dnxOa{uNv)(luMo^5TCOItq}2}sxCztLEzBGS)Mf6dzaw< z!GweAgvFYJu&mH(Vl9HJBV%=Jz~~i%nDGIF9ncTET-AQ=fv{L11&K_;ei!iht(!De;ym|y7ksL|^5Ko~B-vSh80++s?unD}bZaYa@ zPH4M$&fw;xEGN3_H1vHW><%-+dg7dfW)F8$bB+h7sThoOtteO(v{&-+iK}r$%G))# z*Nhx^!ZMj1VeG?EkWg+0CYQSX1t96fV9^3c+9C393LU&CHsFCa1q99$`zTMsEWwLc zxsw1|A?k8-m8HCrk6;K7dhNDJN3R9iws%6vTq_}PtR2CZ8TG;ltZ4I}sU+^s8`P3F5QxrypG1-{ zGlr^7$Wsy(lo=xfC~BpKfg<2z4OEeEF@~x{Pi7O#CvqMJy+f+}=CB_$&IuEslB@s# J000000038FvZ??8 literal 0 HcmV?d00001 diff --git a/docs/css/fonts/fontawesome-webfont.svg b/docs/css/fonts/fontawesome-webfont.svg new file mode 100644 index 000000000..1ee89d436 --- /dev/null +++ b/docs/css/fonts/fontawesome-webfont.svg @@ -0,0 +1,565 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/css/fonts/fontawesome-webfont.ttf b/docs/css/fonts/fontawesome-webfont.ttf new file mode 100644 index 0000000000000000000000000000000000000000..ed9372f8ea0fbaa04f42630a48887e4b38945345 GIT binary patch literal 122092 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 +|+&Vdls@0SAya!5R?! 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
6YuX1v{q9=vI}{pN+P4FW!CI?#11< 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 z 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 literal 0 HcmV?d00001 diff --git a/docs/css/fonts/fontawesome-webfont.woff b/docs/css/fonts/fontawesome-webfont.woff new file mode 100644 index 0000000000000000000000000000000000000000..8b280b98fa2fa261aa4b0f8fd061f772073ef83e GIT binary patch literal 71508 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 literal 0 HcmV?d00001 diff --git a/docs/css/lavish-bootstrap.css b/docs/css/lavish-bootstrap.css new file mode 100644 index 000000000..c2af93e59 --- /dev/null +++ b/docs/css/lavish-bootstrap.css @@ -0,0 +1,5898 @@ +/* CSS generated by http://lavishbootstrap.com */ +/*! normalize.css v2.1.0 | MIT License | git.io/normalize */ +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +main, +nav, +section, +summary { + display: block; +} +audio, +canvas, +video { + display: inline-block; +} +audio:not([controls]) { + display: none; + height: 0; +} +[hidden] { + display: none; +} +html { + font-family: sans-serif; + -webkit-text-size-adjust: 100%; + -ms-text-size-adjust: 100%; +} +body { + margin: 0; +} +a:focus { + outline: thin dotted; +} +a:active, +a:hover { + outline: 0; +} +h1 { + font-size: 2em; + margin: 0.67em 0; +} +abbr[title] { + border-bottom: 1px dotted; +} +b, +strong { + font-weight: bold; +} +dfn { + font-style: italic; +} +hr { + -moz-box-sizing: content-box; + box-sizing: content-box; + height: 0; +} +mark { + background: #ff0; + color: #000; +} +code, +kbd, +pre, +samp { + font-family: monospace, serif; + font-size: 1em; +} +pre { + white-space: pre-wrap; +} +q { + quotes: "\201C" "\201D" "\2018" "\2019"; +} +small { + font-size: 80%; +} +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} +sup { + top: -0.5em; +} +sub { + bottom: -0.25em; +} +img { + border: 0; +} +svg:not(:root) { + overflow: hidden; +} +figure { + margin: 0; +} +fieldset { + border: 1px solid #c0c0c0; + margin: 0 2px; + padding: 0.35em 0.625em 0.75em; +} +legend { + border: 0; + padding: 0; +} +button, +input, +select, +textarea { + font-family: inherit; + font-size: 100%; + margin: 0; +} +button, +input { + line-height: normal; +} +button, +select { + text-transform: none; +} +button, +html input[type="button"], +input[type="reset"], +input[type="submit"] { + -webkit-appearance: button; + cursor: pointer; +} +button[disabled], +html input[disabled] { + cursor: default; +} +input[type="checkbox"], +input[type="radio"] { + box-sizing: border-box; + padding: 0; +} +input[type="search"] { + -webkit-appearance: textfield; + -moz-box-sizing: content-box; + -webkit-box-sizing: content-box; + box-sizing: content-box; +} +input[type="search"]::-webkit-search-cancel-button, +input[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} +button::-moz-focus-inner, +input::-moz-focus-inner { + border: 0; + padding: 0; +} +textarea { + overflow: auto; + vertical-align: top; +} +table { + border-collapse: collapse; + border-spacing: 0; +} +@media print { + * { + text-shadow: none !important; + color: #000 !important; + background: transparent !important; + box-shadow: none !important; + } + a, + a:visited { + text-decoration: underline; + } + a[href]:after { + content: " (" attr(href) ")"; + } + abbr[title]:after { + content: " (" attr(title) ")"; + } + .ir a:after, + a[href^="javascript:"]:after, + a[href^="#"]:after { + content: ""; + } + pre, + blockquote { + border: 1px solid #999; + page-break-inside: avoid; + } + thead { + display: table-header-group; + } + tr, + img { + page-break-inside: avoid; + } + img { + max-width: 100% !important; + } + @page { + margin: 2cm .5cm; + } + p, + h2, + h3 { + orphans: 3; + widows: 3; + } + h2, + h3 { + page-break-after: avoid; + } + .navbar { + display: none; + } + .table td, + .table th { + background-color: #fff !important; + } + .btn > .caret, + .dropup > .btn > .caret { + border-top-color: #000 !important; + } + .label { + border: 1px solid #000; + } + .table { + border-collapse: collapse !important; + } + .table-bordered th, + .table-bordered td { + border: 1px solid #ddd !important; + } +} +*, +*:before, +*:after { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +html { + font-size: 62.5%; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); +} +body { + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 14px; + line-height: 1.428571429; + /*color: #77777a; */ + background-color: #ffffff; +} +input, +button, +select, +textarea { + font-family: inherit; + font-size: inherit; + line-height: inherit; +} +button, +input, +select[multiple], +textarea { + background-image: none; +} +a { + color: #248EC2; + text-decoration: none; +} +a:hover, +a:focus { + text-decoration: underline; +} +a:focus { + outline: thin dotted #333; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +img { + vertical-align: middle; +} +.img-responsive { + display: block; + max-width: 100%; + height: auto; +} +.img-rounded { + border-radius: 6px; +} +.img-thumbnail { + padding: 4px; + line-height: 1.428571429; + background-color: #ffffff; + border: 1px solid #dddddd; + border-radius: 4px; + -webkit-transition: all 0.2s ease-in-out; + transition: all 0.2s ease-in-out; + display: inline-block; + max-width: 100%; + height: auto; +} +.img-circle { + border-radius: 50%; +} +hr { + margin-top: 20px; + margin-bottom: 20px; + border: 0; + border-top: 1px solid #bac9c2; +} +.sr-only { + position: absolute; + width: 1px; + height: 1px; + margin: -1px; + padding: 0; + overflow: hidden; + clip: rect(0 0 0 0); + border: 0; +} +p { + margin: 0 0 10px; +} +.lead { + margin-bottom: 20px; + font-size: 16.099999999999998px; + font-weight: 200; + line-height: 1.4; +} +@media (min-width: 768px) { + .lead { + font-size: 21px; + } +} +small { + font-size: 85%; +} +cite { + font-style: normal; +} +.text-muted { + color: #f9faf9; +} +.text-primary { + color: #74ab50; +} +.text-warning { + color: #c09853; +} +.text-danger { + color: #b94a48; +} +.text-success { + color: #468847; +} +.text-info { + color: #3a87ad; +} +.text-left { + text-align: left; +} +.text-right { + text-align: right; +} +.text-center { + text-align: center; +} +h1, +h2, +h3, +h4, +h5, +h6, +.h1, +.h2, +.h3, +.h4, +.h5, +.h6 { + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-weight: 500; + line-height: 1.1; +} +h1 small, +h2 small, +h3 small, +h4 small, +h5 small, +h6 small, +.h1 small, +.h2 small, +.h3 small, +.h4 small, +.h5 small, +.h6 small { + font-weight: normal; + line-height: 1; + color: #f9faf9; +} +h1, +h2, +h3 { + margin-top: 20px; + margin-bottom: 10px; +} +h4, +h5, +h6 { + margin-top: 10px; + margin-bottom: 10px; +} +h1, +.h1 { + font-size: 36px; +} +h2, +.h2 { + font-size: 30px; +} +h3, +.h3 { + font-size: 24px; +} +h4, +.h4 { + font-size: 18px; +} +h5, +.h5 { + font-size: 14px; +} +h6, +.h6 { + font-size: 12px; +} +h1 small, +.h1 small { + font-size: 24px; +} +h2 small, +.h2 small { + font-size: 18px; +} +h3 small, +.h3 small, +h4 small, +.h4 small { + font-size: 14px; +} +.page-header { + padding-bottom: 9px; + margin: 40px 0 20px; + border-bottom: 1px solid #bac9c2; +} +ul, +ol { + margin-top: 0; + margin-bottom: 10px; +} +ul ul, +ol ul, +ul ol, +ol ol { + margin-bottom: 0; +} +.list-unstyled { + padding-left: 0; + list-style: none; +} +.list-inline { + padding-left: 0; + list-style: none; +} +.list-inline > li { + display: inline-block; + padding-left: 5px; + padding-right: 5px; +} +dl { + margin-bottom: 20px; +} +dt, +dd { + line-height: 1.428571429; +} +dt { + font-weight: bold; +} +dd { + margin-left: 0; +} +@media (min-width: 768px) { + .dl-horizontal dt { + float: left; + width: 160px; + clear: left; + text-align: right; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + .dl-horizontal dd { + margin-left: 180px; + } + .dl-horizontal dd:before, + .dl-horizontal dd:after { + content: " "; + /* 1 */ + + display: table; + /* 2 */ + + } + .dl-horizontal dd:after { + clear: both; + } + .dl-horizontal dd:before, + .dl-horizontal dd:after { + content: " "; + /* 1 */ + + display: table; + /* 2 */ + + } + .dl-horizontal dd:after { + clear: both; + } +} +abbr[title], +abbr[data-original-title] { + cursor: help; + border-bottom: 1px dotted #f9faf9; +} +abbr.initialism { + font-size: 90%; + text-transform: uppercase; +} +blockquote { + padding: 10px 20px; + margin: 0 0 20px; + border-left: 5px solid #bac9c2; +} +blockquote p { + font-size: 17.5px; + font-weight: 300; + line-height: 1.25; +} +blockquote p:last-child { + margin-bottom: 0; +} +blockquote small { + display: block; + line-height: 1.428571429; + color: #f9faf9; +} +blockquote small:before { + content: '\2014 \00A0'; +} +blockquote.pull-right { + padding-right: 15px; + padding-left: 0; + border-right: 5px solid #bac9c2; + border-left: 0; +} +blockquote.pull-right p, +blockquote.pull-right small { + text-align: right; +} +blockquote.pull-right small:before { + content: ''; +} +blockquote.pull-right small:after { + content: '\00A0 \2014'; +} +q:before, +q:after, +blockquote:before, +blockquote:after { + content: ""; +} +address { + display: block; + margin-bottom: 20px; + font-style: normal; + line-height: 1.428571429; +} +code, +pre { + font-family: Monaco, Menlo, Consolas, "Courier New", monospace; +} +code { + padding: 2px 4px; + font-size: 90%; + color: #444; + background-color: #f0f0f0; + white-space: nowrap; + border-radius: 4px; +} + +pre { + display: block; + padding: 9.5px; + margin: 0 0 10px; + font-size: 13px; + line-height: 1.428571429; + word-break: break-all; + word-wrap: break-word; + color: #77777a; + background-color: #f5f5f5; + border: 1px solid #cccccc; + border-radius: 4px; +} +pre.prettyprint { + margin-bottom: 20px; +} +pre code { + padding: 0; + font-size: inherit; + color: inherit; + white-space: pre-wrap; + background-color: transparent; + border: 0; +} +.pre-scrollable { + max-height: 340px; + overflow-y: scroll; +} +.container { + margin-right: auto; + margin-left: auto; + padding-left: 15px; + padding-right: 15px; +} +.container:before, +.container:after { + content: " "; + /* 1 */ + + display: table; + /* 2 */ + +} +.container:after { + clear: both; +} +.container:before, +.container:after { + content: " "; + /* 1 */ + + display: table; + /* 2 */ + +} +.container:after { + clear: both; +} +.row { + margin-left: -15px; + margin-right: -15px; +} +.row:before, +.row:after { + content: " "; + /* 1 */ + + display: table; + /* 2 */ + +} +.row:after { + clear: both; +} +.row:before, +.row:after { + content: " "; + /* 1 */ + + display: table; + /* 2 */ + +} +.row:after { + clear: both; +} +.col-xs-1, +.col-xs-2, +.col-xs-3, +.col-xs-4, +.col-xs-5, +.col-xs-6, +.col-xs-7, +.col-xs-8, +.col-xs-9, +.col-xs-10, +.col-xs-11, +.col-xs-12, +.col-sm-1, +.col-sm-2, +.col-sm-3, +.col-sm-4, +.col-sm-5, +.col-sm-6, +.col-sm-7, +.col-sm-8, +.col-sm-9, +.col-sm-10, +.col-sm-11, +.col-sm-12, +.col-md-1, +.col-md-2, +.col-md-3, +.col-md-4, +.col-md-5, +.col-md-6, +.col-md-7, +.col-md-8, +.col-md-9, +.col-md-10, +.col-md-11, +.col-md-12, +.col-lg-1, +.col-lg-2, +.col-lg-3, +.col-lg-4, +.col-lg-5, +.col-lg-6, +.col-lg-7, +.col-lg-8, +.col-lg-9, +.col-lg-10, +.col-lg-11, +.col-lg-12 { + position: relative; + min-height: 1px; + padding-left: 15px; + padding-right: 15px; +} +.col-xs-1, +.col-xs-2, +.col-xs-3, +.col-xs-4, +.col-xs-5, +.col-xs-6, +.col-xs-7, +.col-xs-8, +.col-xs-9, +.col-xs-10, +.col-xs-11 { + float: left; +} +.col-xs-1 { + width: 8.333333333333332%; +} +.col-xs-2 { + width: 16.666666666666664%; +} +.col-xs-3 { + width: 25%; +} +.col-xs-4 { + width: 33.33333333333333%; +} +.col-xs-5 { + width: 41.66666666666667%; +} +.col-xs-6 { + width: 50%; +} +.col-xs-7 { + width: 58.333333333333336%; +} +.col-xs-8 { + width: 66.66666666666666%; +} +.col-xs-9 { + width: 75%; +} +.col-xs-10 { + width: 83.33333333333334%; +} +.col-xs-11 { + width: 91.66666666666666%; +} +.col-xs-12 { + width: 100%; +} +@media (min-width: 768px) { + .container { + max-width: 750px; + } + .col-sm-1, + .col-sm-2, + .col-sm-3, + .col-sm-4, + .col-sm-5, + .col-sm-6, + .col-sm-7, + .col-sm-8, + .col-sm-9, + .col-sm-10, + .col-sm-11 { + float: left; + } + .col-sm-1 { + width: 8.333333333333332%; + } + .col-sm-2 { + width: 16.666666666666664%; + } + .col-sm-3 { + width: 25%; + } + .col-sm-4 { + width: 33.33333333333333%; + } + .col-sm-5 { + width: 41.66666666666667%; + } + .col-sm-6 { + width: 50%; + } + .col-sm-7 { + width: 58.333333333333336%; + } + .col-sm-8 { + width: 66.66666666666666%; + } + .col-sm-9 { + width: 75%; + } + .col-sm-10 { + width: 83.33333333333334%; + } + .col-sm-11 { + width: 91.66666666666666%; + } + .col-sm-12 { + width: 100%; + } + .col-sm-push-1 { + left: 8.333333333333332%; + } + .col-sm-push-2 { + left: 16.666666666666664%; + } + .col-sm-push-3 { + left: 25%; + } + .col-sm-push-4 { + left: 33.33333333333333%; + } + .col-sm-push-5 { + left: 41.66666666666667%; + } + .col-sm-push-6 { + left: 50%; + } + .col-sm-push-7 { + left: 58.333333333333336%; + } + .col-sm-push-8 { + left: 66.66666666666666%; + } + .col-sm-push-9 { + left: 75%; + } + .col-sm-push-10 { + left: 83.33333333333334%; + } + .col-sm-push-11 { + left: 91.66666666666666%; + } + .col-sm-pull-1 { + right: 8.333333333333332%; + } + .col-sm-pull-2 { + right: 16.666666666666664%; + } + .col-sm-pull-3 { + right: 25%; + } + .col-sm-pull-4 { + right: 33.33333333333333%; + } + .col-sm-pull-5 { + right: 41.66666666666667%; + } + .col-sm-pull-6 { + right: 50%; + } + .col-sm-pull-7 { + right: 58.333333333333336%; + } + .col-sm-pull-8 { + right: 66.66666666666666%; + } + .col-sm-pull-9 { + right: 75%; + } + .col-sm-pull-10 { + right: 83.33333333333334%; + } + .col-sm-pull-11 { + right: 91.66666666666666%; + } + .col-sm-offset-1 { + margin-left: 8.333333333333332%; + } + .col-sm-offset-2 { + margin-left: 16.666666666666664%; + } + .col-sm-offset-3 { + margin-left: 25%; + } + .col-sm-offset-4 { + margin-left: 33.33333333333333%; + } + .col-sm-offset-5 { + margin-left: 41.66666666666667%; + } + .col-sm-offset-6 { + margin-left: 50%; + } + .col-sm-offset-7 { + margin-left: 58.333333333333336%; + } + .col-sm-offset-8 { + margin-left: 66.66666666666666%; + } + .col-sm-offset-9 { + margin-left: 75%; + } + .col-sm-offset-10 { + margin-left: 83.33333333333334%; + } + .col-sm-offset-11 { + margin-left: 91.66666666666666%; + } +} +@media (min-width: 992px) { + .container { + max-width: 970px; + } + .col-md-1, + .col-md-2, + .col-md-3, + .col-md-4, + .col-md-5, + .col-md-6, + .col-md-7, + .col-md-8, + .col-md-9, + .col-md-10, + .col-md-11 { + float: left; + } + .col-md-1 { + width: 8.333333333333332%; + } + .col-md-2 { + width: 16.666666666666664%; + } + .col-md-3 { + width: 25%; + } + .col-md-4 { + width: 33.33333333333333%; + } + .col-md-5 { + width: 41.66666666666667%; + } + .col-md-6 { + width: 50%; + } + .col-md-7 { + width: 58.333333333333336%; + } + .col-md-8 { + width: 66.66666666666666%; + } + .col-md-9 { + width: 75%; + } + .col-md-10 { + width: 83.33333333333334%; + } + .col-md-11 { + width: 91.66666666666666%; + } + .col-md-12 { + width: 100%; + } + .col-md-push-0 { + left: auto; + } + .col-md-push-1 { + left: 8.333333333333332%; + } + .col-md-push-2 { + left: 16.666666666666664%; + } + .col-md-push-3 { + left: 25%; + } + .col-md-push-4 { + left: 33.33333333333333%; + } + .col-md-push-5 { + left: 41.66666666666667%; + } + .col-md-push-6 { + left: 50%; + } + .col-md-push-7 { + left: 58.333333333333336%; + } + .col-md-push-8 { + left: 66.66666666666666%; + } + .col-md-push-9 { + left: 75%; + } + .col-md-push-10 { + left: 83.33333333333334%; + } + .col-md-push-11 { + left: 91.66666666666666%; + } + .col-md-pull-0 { + right: auto; + } + .col-md-pull-1 { + right: 8.333333333333332%; + } + .col-md-pull-2 { + right: 16.666666666666664%; + } + .col-md-pull-3 { + right: 25%; + } + .col-md-pull-4 { + right: 33.33333333333333%; + } + .col-md-pull-5 { + right: 41.66666666666667%; + } + .col-md-pull-6 { + right: 50%; + } + .col-md-pull-7 { + right: 58.333333333333336%; + } + .col-md-pull-8 { + right: 66.66666666666666%; + } + .col-md-pull-9 { + right: 75%; + } + .col-md-pull-10 { + right: 83.33333333333334%; + } + .col-md-pull-11 { + right: 91.66666666666666%; + } + .col-md-offset-0 { + margin-left: 0; + } + .col-md-offset-1 { + margin-left: 8.333333333333332%; + } + .col-md-offset-2 { + margin-left: 16.666666666666664%; + } + .col-md-offset-3 { + margin-left: 25%; + } + .col-md-offset-4 { + margin-left: 33.33333333333333%; + } + .col-md-offset-5 { + margin-left: 41.66666666666667%; + } + .col-md-offset-6 { + margin-left: 50%; + } + .col-md-offset-7 { + margin-left: 58.333333333333336%; + } + .col-md-offset-8 { + margin-left: 66.66666666666666%; + } + .col-md-offset-9 { + margin-left: 75%; + } + .col-md-offset-10 { + margin-left: 83.33333333333334%; + } + .col-md-offset-11 { + margin-left: 91.66666666666666%; + } +} +@media (min-width: 1200px) { + .container { + max-width: 1170px; + } + .col-lg-1, + .col-lg-2, + .col-lg-3, + .col-lg-4, + .col-lg-5, + .col-lg-6, + .col-lg-7, + .col-lg-8, + .col-lg-9, + .col-lg-10, + .col-lg-11 { + float: left; + } + .col-lg-1 { + width: 8.333333333333332%; + } + .col-lg-2 { + width: 16.666666666666664%; + } + .col-lg-3 { + width: 25%; + } + .col-lg-4 { + width: 33.33333333333333%; + } + .col-lg-5 { + width: 41.66666666666667%; + } + .col-lg-6 { + width: 50%; + } + .col-lg-7 { + width: 58.333333333333336%; + } + .col-lg-8 { + width: 66.66666666666666%; + } + .col-lg-9 { + width: 75%; + } + .col-lg-10 { + width: 83.33333333333334%; + } + .col-lg-11 { + width: 91.66666666666666%; + } + .col-lg-12 { + width: 100%; + } + .col-lg-push-0 { + left: auto; + } + .col-lg-push-1 { + left: 8.333333333333332%; + } + .col-lg-push-2 { + left: 16.666666666666664%; + } + .col-lg-push-3 { + left: 25%; + } + .col-lg-push-4 { + left: 33.33333333333333%; + } + .col-lg-push-5 { + left: 41.66666666666667%; + } + .col-lg-push-6 { + left: 50%; + } + .col-lg-push-7 { + left: 58.333333333333336%; + } + .col-lg-push-8 { + left: 66.66666666666666%; + } + .col-lg-push-9 { + left: 75%; + } + .col-lg-push-10 { + left: 83.33333333333334%; + } + .col-lg-push-11 { + left: 91.66666666666666%; + } + .col-lg-pull-0 { + right: auto; + } + .col-lg-pull-1 { + right: 8.333333333333332%; + } + .col-lg-pull-2 { + right: 16.666666666666664%; + } + .col-lg-pull-3 { + right: 25%; + } + .col-lg-pull-4 { + right: 33.33333333333333%; + } + .col-lg-pull-5 { + right: 41.66666666666667%; + } + .col-lg-pull-6 { + right: 50%; + } + .col-lg-pull-7 { + right: 58.333333333333336%; + } + .col-lg-pull-8 { + right: 66.66666666666666%; + } + .col-lg-pull-9 { + right: 75%; + } + .col-lg-pull-10 { + right: 83.33333333333334%; + } + .col-lg-pull-11 { + right: 91.66666666666666%; + } + .col-lg-offset-0 { + margin-left: 0; + } + .col-lg-offset-1 { + margin-left: 8.333333333333332%; + } + .col-lg-offset-2 { + margin-left: 16.666666666666664%; + } + .col-lg-offset-3 { + margin-left: 25%; + } + .col-lg-offset-4 { + margin-left: 33.33333333333333%; + } + .col-lg-offset-5 { + margin-left: 41.66666666666667%; + } + .col-lg-offset-6 { + margin-left: 50%; + } + .col-lg-offset-7 { + margin-left: 58.333333333333336%; + } + .col-lg-offset-8 { + margin-left: 66.66666666666666%; + } + .col-lg-offset-9 { + margin-left: 75%; + } + .col-lg-offset-10 { + margin-left: 83.33333333333334%; + } + .col-lg-offset-11 { + margin-left: 91.66666666666666%; + } +} +table { + max-width: 100%; + background-color: transparent; +} +th { + text-align: left; +} +.table { + width: 100%; + margin-bottom: 20px; +} +.table thead > tr > th, +.table tbody > tr > th, +.table tfoot > tr > th, +.table thead > tr > td, +.table tbody > tr > td, +.table tfoot > tr > td { + padding: 8px; + line-height: 1.428571429; + vertical-align: top; + border-top: 1px solid #77777a; +} +.table thead > tr > th { + vertical-align: bottom; + border-bottom: 2px solid #77777a; +} +.table caption + thead tr:first-child th, +.table colgroup + thead tr:first-child th, +.table thead:first-child tr:first-child th, +.table caption + thead tr:first-child td, +.table colgroup + thead tr:first-child td, +.table thead:first-child tr:first-child td { + border-top: 0; +} +.table tbody + tbody { + border-top: 2px solid #77777a; +} +.table .table { + background-color: #ffffff; +} +.table-condensed thead > tr > th, +.table-condensed tbody > tr > th, +.table-condensed tfoot > tr > th, +.table-condensed thead > tr > td, +.table-condensed tbody > tr > td, +.table-condensed tfoot > tr > td { + padding: 5px; +} +.table-bordered { + border: 1px solid #77777a; +} +.table-bordered > thead > tr > th, +.table-bordered > tbody > tr > th, +.table-bordered > tfoot > tr > th, +.table-bordered > thead > tr > td, +.table-bordered > tbody > tr > td, +.table-bordered > tfoot > tr > td { + border: 1px solid #77777a; +} +.table-bordered > thead > tr > th, +.table-bordered > thead > tr > td { + border-bottom-width: 2px; +} +.table-striped > tbody > tr:nth-child(odd) > td, +.table-striped > tbody > tr:nth-child(odd) > th { + background-color: #f9f9f9; +} +.table-hover > tbody > tr:hover > td, +.table-hover > tbody > tr:hover > th { + background-color: #f5f5f5; +} +table col[class*="col-"] { + float: none; + display: table-column; +} +table td[class*="col-"], +table th[class*="col-"] { + float: none; + display: table-cell; +} +.table > thead > tr > td.active, +.table > tbody > tr > td.active, +.table > tfoot > tr > td.active, +.table > thead > tr > th.active, +.table > tbody > tr > th.active, +.table > tfoot > tr > th.active, +.table > thead > tr.active > td, +.table > tbody > tr.active > td, +.table > tfoot > tr.active > td, +.table > thead > tr.active > th, +.table > tbody > tr.active > th, +.table > tfoot > tr.active > th { + background-color: #f5f5f5; +} +.table > thead > tr > td.success, +.table > tbody > tr > td.success, +.table > tfoot > tr > td.success, +.table > thead > tr > th.success, +.table > tbody > tr > th.success, +.table > tfoot > tr > th.success, +.table > thead > tr.success > td, +.table > tbody > tr.success > td, +.table > tfoot > tr.success > td, +.table > thead > tr.success > th, +.table > tbody > tr.success > th, +.table > tfoot > tr.success > th { + background-color: #dff0d8; + border-color: #d6e9c6; +} +.table-hover > tbody > tr > td.success:hover, +.table-hover > tbody > tr > th.success:hover, +.table-hover > tbody > tr.success:hover > td { + background-color: #d0e9c6; + border-color: #c9e2b3; +} +.table > thead > tr > td.danger, +.table > tbody > tr > td.danger, +.table > tfoot > tr > td.danger, +.table > thead > tr > th.danger, +.table > tbody > tr > th.danger, +.table > tfoot > tr > th.danger, +.table > thead > tr.danger > td, +.table > tbody > tr.danger > td, +.table > tfoot > tr.danger > td, +.table > thead > tr.danger > th, +.table > tbody > tr.danger > th, +.table > tfoot > tr.danger > th { + background-color: #f2dede; + border-color: #eed3d7; +} +.table-hover > tbody > tr > td.danger:hover, +.table-hover > tbody > tr > th.danger:hover, +.table-hover > tbody > tr.danger:hover > td { + background-color: #ebcccc; + border-color: #e6c1c7; +} +.table > thead > tr > td.warning, +.table > tbody > tr > td.warning, +.table > tfoot > tr > td.warning, +.table > thead > tr > th.warning, +.table > tbody > tr > th.warning, +.table > tfoot > tr > th.warning, +.table > thead > tr.warning > td, +.table > tbody > tr.warning > td, +.table > tfoot > tr.warning > td, +.table > thead > tr.warning > th, +.table > tbody > tr.warning > th, +.table > tfoot > tr.warning > th { + background-color: #fcf8e3; + border-color: #fbeed5; +} +.table-hover > tbody > tr > td.warning:hover, +.table-hover > tbody > tr > th.warning:hover, +.table-hover > tbody > tr.warning:hover > td { + background-color: #faf2cc; + border-color: #f8e5be; +} +@media (max-width: 768px) { + .table-responsive { + width: 100%; + margin-bottom: 15px; + overflow-y: hidden; + overflow-x: scroll; + border: 1px solid #77777a; + } + .table-responsive > .table { + margin-bottom: 0; + background-color: #fff; + } + .table-responsive > .table > thead > tr > th, + .table-responsive > .table > tbody > tr > th, + .table-responsive > .table > tfoot > tr > th, + .table-responsive > .table > thead > tr > td, + .table-responsive > .table > tbody > tr > td, + .table-responsive > .table > tfoot > tr > td { + white-space: nowrap; + } + .table-responsive > .table-bordered { + border: 0; + } + .table-responsive > .table-bordered > thead > tr > th:first-child, + .table-responsive > .table-bordered > tbody > tr > th:first-child, + .table-responsive > .table-bordered > tfoot > tr > th:first-child, + .table-responsive > .table-bordered > thead > tr > td:first-child, + .table-responsive > .table-bordered > tbody > tr > td:first-child, + .table-responsive > .table-bordered > tfoot > tr > td:first-child { + border-left: 0; + } + .table-responsive > .table-bordered > thead > tr > th:last-child, + .table-responsive > .table-bordered > tbody > tr > th:last-child, + .table-responsive > .table-bordered > tfoot > tr > th:last-child, + .table-responsive > .table-bordered > thead > tr > td:last-child, + .table-responsive > .table-bordered > tbody > tr > td:last-child, + .table-responsive > .table-bordered > tfoot > tr > td:last-child { + border-right: 0; + } + .table-responsive > .table-bordered > thead > tr:last-child > th, + .table-responsive > .table-bordered > tbody > tr:last-child > th, + .table-responsive > .table-bordered > tfoot > tr:last-child > th, + .table-responsive > .table-bordered > thead > tr:last-child > td, + .table-responsive > .table-bordered > tbody > tr:last-child > td, + .table-responsive > .table-bordered > tfoot > tr:last-child > td { + border-bottom: 0; + } +} +fieldset { + padding: 0; + margin: 0; + border: 0; +} +legend { + display: block; + width: 100%; + padding: 0; + margin-bottom: 20px; + font-size: 21px; + line-height: inherit; + color: #77777a; + border: 0; + border-bottom: 1px solid #e5e5e5; +} +label { + display: inline-block; + margin-bottom: 5px; + font-weight: bold; +} +input[type="search"] { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +input[type="radio"], +input[type="checkbox"] { + margin: 4px 0 0; + margin-top: 1px \9; + /* IE8-9 */ + + line-height: normal; +} +input[type="file"] { + display: block; +} +select[multiple], +select[size] { + height: auto; +} +select optgroup { + font-size: inherit; + font-style: inherit; + font-family: inherit; +} +input[type="file"]:focus, +input[type="radio"]:focus, +input[type="checkbox"]:focus { + outline: thin dotted #333; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +input[type="number"]::-webkit-outer-spin-button, +input[type="number"]::-webkit-inner-spin-button { + height: auto; +} +.form-control:-moz-placeholder { + color: #f9faf9; +} +.form-control::-moz-placeholder { + color: #f9faf9; +} +.form-control:-ms-input-placeholder { + color: #f9faf9; +} +.form-control::-webkit-input-placeholder { + color: #f9faf9; +} +.form-control { + display: block; + width: 100%; + height: 34px; + padding: 6px 12px; + font-size: 14px; + line-height: 1.428571429; + color: #4aadd6; + vertical-align: middle; + background-color: #ffffff; + border: 1px solid #cccccc; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; + transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; +} +.form-control:focus { + border-color: #66afe9; + outline: 0; + -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6); + box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6); +} +.form-control[disabled], +.form-control[readonly], +fieldset[disabled] .form-control { + cursor: not-allowed; + background-color: #bac9c2; +} +textarea.form-control { + height: auto; +} +.form-group { + margin-bottom: 15px; +} +.radio, +.checkbox { + display: block; + min-height: 20px; + margin-top: 10px; + margin-bottom: 10px; + padding-left: 20px; + vertical-align: middle; +} +.radio label, +.checkbox label { + display: inline; + margin-bottom: 0; + font-weight: normal; + cursor: pointer; +} +.radio input[type="radio"], +.radio-inline input[type="radio"], +.checkbox input[type="checkbox"], +.checkbox-inline input[type="checkbox"] { + float: left; + margin-left: -20px; +} +.radio + .radio, +.checkbox + .checkbox { + margin-top: -5px; +} +.radio-inline, +.checkbox-inline { + display: inline-block; + padding-left: 20px; + margin-bottom: 0; + vertical-align: middle; + font-weight: normal; + cursor: pointer; +} +.radio-inline + .radio-inline, +.checkbox-inline + .checkbox-inline { + margin-top: 0; + margin-left: 10px; +} +input[type="radio"][disabled], +input[type="checkbox"][disabled], +.radio[disabled], +.radio-inline[disabled], +.checkbox[disabled], +.checkbox-inline[disabled], +fieldset[disabled] input[type="radio"], +fieldset[disabled] input[type="checkbox"], +fieldset[disabled] .radio, +fieldset[disabled] .radio-inline, +fieldset[disabled] .checkbox, +fieldset[disabled] .checkbox-inline { + cursor: not-allowed; +} +.input-sm { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +select.input-sm { + height: 30px; + line-height: 30px; +} +textarea.input-sm { + height: auto; +} +.input-lg { + height: 45px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.33; + border-radius: 6px; +} +select.input-lg { + height: 45px; + line-height: 45px; +} +textarea.input-lg { + height: auto; +} +.has-warning .help-block, +.has-warning .control-label { + color: #c09853; +} +.has-warning .form-control { + border-color: #c09853; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} +.has-warning .form-control:focus { + border-color: #a47e3c; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e; +} +.has-warning .input-group-addon { + color: #c09853; + border-color: #c09853; + background-color: #fcf8e3; +} +.has-error .help-block, +.has-error .control-label { + color: #b94a48; +} +.has-error .form-control { + border-color: #b94a48; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} +.has-error .form-control:focus { + border-color: #953b39; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392; +} +.has-error .input-group-addon { + color: #b94a48; + border-color: #b94a48; + background-color: #f2dede; +} +.has-success .help-block, +.has-success .control-label { + color: #468847; +} +.has-success .form-control { + border-color: #468847; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} +.has-success .form-control:focus { + border-color: #356635; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b; +} +.has-success .input-group-addon { + color: #468847; + border-color: #468847; + background-color: #dff0d8; +} +.form-control-static { + margin-bottom: 0; + padding-top: 7px; +} +.help-block { + display: block; + margin-top: 5px; + margin-bottom: 10px; + color: #b7b7b9; +} +@media (min-width: 768px) { + .form-inline .form-group { + display: inline-block; + margin-bottom: 0; + vertical-align: middle; + } + .form-inline .form-control { + display: inline-block; + } + .form-inline .radio, + .form-inline .checkbox { + display: inline-block; + margin-top: 0; + margin-bottom: 0; + padding-left: 0; + } + .form-inline .radio input[type="radio"], + .form-inline .checkbox input[type="checkbox"] { + float: none; + margin-left: 0; + } +} +.form-horizontal .control-label, +.form-horizontal .radio, +.form-horizontal .checkbox, +.form-horizontal .radio-inline, +.form-horizontal .checkbox-inline { + margin-top: 0; + margin-bottom: 0; + padding-top: 7px; +} +.form-horizontal .form-group { + margin-left: -15px; + margin-right: -15px; +} +.form-horizontal .form-group:before, +.form-horizontal .form-group:after { + content: " "; + /* 1 */ + + display: table; + /* 2 */ + +} +.form-horizontal .form-group:after { + clear: both; +} +.form-horizontal .form-group:before, +.form-horizontal .form-group:after { + content: " "; + /* 1 */ + + display: table; + /* 2 */ + +} +.form-horizontal .form-group:after { + clear: both; +} +@media (min-width: 768px) { + .form-horizontal .control-label { + text-align: right; + } +} +.btn { + display: inline-block; + padding: 6px 12px; + margin-bottom: 0; + font-size: 14px; + font-weight: normal; + line-height: 1.428571429; + text-align: center; + vertical-align: middle; + cursor: pointer; + border: 1px solid transparent; + border-radius: 4px; + white-space: nowrap; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + -o-user-select: none; + user-select: none; +} +.btn:focus { + outline: thin dotted #333; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +.btn:hover, +.btn:focus { + color: #333333; + text-decoration: none; +} +.btn:active, +.btn.active { + outline: 0; + background-image: none; + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); +} +.btn.disabled, +.btn[disabled], +fieldset[disabled] .btn { + cursor: not-allowed; + pointer-events: none; + opacity: 0.65; + filter: alpha(opacity=65); + -webkit-box-shadow: none; + box-shadow: none; +} +.btn-default { + color: #333333; + background-color: #ffffff; + border-color: #cccccc; +} +.btn-default:hover, +.btn-default:focus, +.btn-default:active, +.btn-default.active, +.open .dropdown-toggle.btn-default { + color: #333333; + background-color: #ebebeb; + border-color: #adadad; +} +.btn-default:active, +.btn-default.active, +.open .dropdown-toggle.btn-default { + background-image: none; +} +.btn-default.disabled, +.btn-default[disabled], +fieldset[disabled] .btn-default, +.btn-default.disabled:hover, +.btn-default[disabled]:hover, +fieldset[disabled] .btn-default:hover, +.btn-default.disabled:focus, +.btn-default[disabled]:focus, +fieldset[disabled] .btn-default:focus, +.btn-default.disabled:active, +.btn-default[disabled]:active, +fieldset[disabled] .btn-default:active, +.btn-default.disabled.active, +.btn-default[disabled].active, +fieldset[disabled] .btn-default.active { + background-color: #ffffff; + border-color: #cccccc; +} +.btn-primary { + color: #ffffff; + background-color: #74ab50; + border-color: #689a48; +} +.btn-primary:hover, +.btn-primary:focus, +.btn-primary:active, +.btn-primary.active, +.open .dropdown-toggle.btn-primary { + color: #ffffff; + background-color: #618f43; + border-color: #4c7034; +} +.btn-primary:active, +.btn-primary.active, +.open .dropdown-toggle.btn-primary { + background-image: none; +} +.btn-primary.disabled, +.btn-primary[disabled], +fieldset[disabled] .btn-primary, +.btn-primary.disabled:hover, +.btn-primary[disabled]:hover, +fieldset[disabled] .btn-primary:hover, +.btn-primary.disabled:focus, +.btn-primary[disabled]:focus, +fieldset[disabled] .btn-primary:focus, +.btn-primary.disabled:active, +.btn-primary[disabled]:active, +fieldset[disabled] .btn-primary:active, +.btn-primary.disabled.active, +.btn-primary[disabled].active, +fieldset[disabled] .btn-primary.active { + background-color: #74ab50; + border-color: #689a48; +} +.btn-warning { + color: #ffffff; + background-color: #f0ad4e; + border-color: #eea236; +} +.btn-warning:hover, +.btn-warning:focus, +.btn-warning:active, +.btn-warning.active, +.open .dropdown-toggle.btn-warning { + color: #ffffff; + background-color: #ed9c28; + border-color: #d58512; +} +.btn-warning:active, +.btn-warning.active, +.open .dropdown-toggle.btn-warning { + background-image: none; +} +.btn-warning.disabled, +.btn-warning[disabled], +fieldset[disabled] .btn-warning, +.btn-warning.disabled:hover, +.btn-warning[disabled]:hover, +fieldset[disabled] .btn-warning:hover, +.btn-warning.disabled:focus, +.btn-warning[disabled]:focus, +fieldset[disabled] .btn-warning:focus, +.btn-warning.disabled:active, +.btn-warning[disabled]:active, +fieldset[disabled] .btn-warning:active, +.btn-warning.disabled.active, +.btn-warning[disabled].active, +fieldset[disabled] .btn-warning.active { + background-color: #f0ad4e; + border-color: #eea236; +} +.btn-danger { + color: #ffffff; + background-color: #d9534f; + border-color: #d43f3a; +} +.btn-danger:hover, +.btn-danger:focus, +.btn-danger:active, +.btn-danger.active, +.open .dropdown-toggle.btn-danger { + color: #ffffff; + background-color: #d2322d; + border-color: #ac2925; +} +.btn-danger:active, +.btn-danger.active, +.open .dropdown-toggle.btn-danger { + background-image: none; +} +.btn-danger.disabled, +.btn-danger[disabled], +fieldset[disabled] .btn-danger, +.btn-danger.disabled:hover, +.btn-danger[disabled]:hover, +fieldset[disabled] .btn-danger:hover, +.btn-danger.disabled:focus, +.btn-danger[disabled]:focus, +fieldset[disabled] .btn-danger:focus, +.btn-danger.disabled:active, +.btn-danger[disabled]:active, +fieldset[disabled] .btn-danger:active, +.btn-danger.disabled.active, +.btn-danger[disabled].active, +fieldset[disabled] .btn-danger.active { + background-color: #d9534f; + border-color: #d43f3a; +} +.btn-success { + color: #ffffff; + background-color: #5cb85c; + border-color: #4cae4c; +} +.btn-success:hover, +.btn-success:focus, +.btn-success:active, +.btn-success.active, +.open .dropdown-toggle.btn-success { + color: #ffffff; + background-color: #47a447; + border-color: #398439; +} +.btn-success:active, +.btn-success.active, +.open .dropdown-toggle.btn-success { + background-image: none; +} +.btn-success.disabled, +.btn-success[disabled], +fieldset[disabled] .btn-success, +.btn-success.disabled:hover, +.btn-success[disabled]:hover, +fieldset[disabled] .btn-success:hover, +.btn-success.disabled:focus, +.btn-success[disabled]:focus, +fieldset[disabled] .btn-success:focus, +.btn-success.disabled:active, +.btn-success[disabled]:active, +fieldset[disabled] .btn-success:active, +.btn-success.disabled.active, +.btn-success[disabled].active, +fieldset[disabled] .btn-success.active { + background-color: #5cb85c; + border-color: #4cae4c; +} +.btn-info { + color: #ffffff; + background-color: #347DBE; + border-color: #347DBE; +} +.btn-info:hover, +.btn-info:focus, +.btn-info:active, +.btn-info.active, +.open .dropdown-toggle.btn-info { + color: #ffffff; + background-color: #015CAE; + border-color: #015CAE; +} +.btn-info:active, +.btn-info.active, +.open .dropdown-toggle.btn-info { + background-image: none; +} +.btn-info.disabled, +.btn-info[disabled], +fieldset[disabled] .btn-info, +.btn-info.disabled:hover, +.btn-info[disabled]:hover, +fieldset[disabled] .btn-info:hover, +.btn-info.disabled:focus, +.btn-info[disabled]:focus, +fieldset[disabled] .btn-info:focus, +.btn-info.disabled:active, +.btn-info[disabled]:active, +fieldset[disabled] .btn-info:active, +.btn-info.disabled.active, +.btn-info[disabled].active, +fieldset[disabled] .btn-info.active { + background-color: #5bc0de; + border-color: #46b8da; +} +.btn-link { + color: #74ab50; + font-weight: normal; + cursor: pointer; + border-radius: 0; +} +.btn-link, +.btn-link:active, +.btn-link[disabled], +fieldset[disabled] .btn-link { + background-color: transparent; + -webkit-box-shadow: none; + box-shadow: none; +} +.btn-link, +.btn-link:hover, +.btn-link:focus, +.btn-link:active { + border-color: transparent; +} +.btn-link:hover, +.btn-link:focus { + color: #517738; + text-decoration: underline; + background-color: transparent; +} +.btn-link[disabled]:hover, +fieldset[disabled] .btn-link:hover, +.btn-link[disabled]:focus, +fieldset[disabled] .btn-link:focus { + color: #f9faf9; + text-decoration: none; +} +.btn-lg { + padding: 10px 16px; + font-size: 18px; + line-height: 1.33; + border-radius: 6px; +} +.btn-sm, +.btn-xs { + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +.btn-xs { + padding: 1px 5px; +} +.btn-block { + display: block; + width: 100%; + padding-left: 0; + padding-right: 0; +} +.btn-block + .btn-block { + margin-top: 5px; +} +input[type="submit"].btn-block, +input[type="reset"].btn-block, +input[type="button"].btn-block { + width: 100%; +} +.fade { + opacity: 0; + -webkit-transition: opacity 0.15s linear; + transition: opacity 0.15s linear; +} +.fade.in { + opacity: 1; +} +.collapse { + display: none; +} +.collapse.in { + display: block; +} +.collapsing { + position: relative; + height: 0; + overflow: hidden; + -webkit-transition: height 0.35s ease; + transition: height 0.35s ease; +} +@font-face { + font-family: 'Glyphicons Halflings'; + src: url('../fonts/glyphicons-halflings-regular.eot'); + src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons-halflingsregular') format('svg'); +} +.glyphicon { + position: relative; + top: 1px; + display: inline-block; + font-family: 'Glyphicons Halflings'; + font-style: normal; + font-weight: normal; + line-height: 1; + -webkit-font-smoothing: antialiased; +} +.glyphicon-asterisk:before { + content: "\2a"; +} +.glyphicon-plus:before { + content: "\2b"; +} +.glyphicon-euro:before { + content: "\20ac"; +} +.glyphicon-minus:before { + content: "\2212"; +} +.glyphicon-cloud:before { + content: "\2601"; +} +.glyphicon-envelope:before { + content: "\2709"; +} +.glyphicon-pencil:before { + content: "\270f"; +} +.glyphicon-glass:before { + content: "\e001"; +} +.glyphicon-music:before { + content: "\e002"; +} +.glyphicon-search:before { + content: "\e003"; +} +.glyphicon-heart:before { + content: "\e005"; +} +.glyphicon-star:before { + content: "\e006"; +} +.glyphicon-star-empty:before { + content: "\e007"; +} +.glyphicon-user:before { + content: "\e008"; +} +.glyphicon-film:before { + content: "\e009"; +} +.glyphicon-th-large:before { + content: "\e010"; +} +.glyphicon-th:before { + content: "\e011"; +} +.glyphicon-th-list:before { + content: "\e012"; +} +.glyphicon-ok:before { + content: "\e013"; +} +.glyphicon-remove:before { + content: "\e014"; +} +.glyphicon-zoom-in:before { + content: "\e015"; +} +.glyphicon-zoom-out:before { + content: "\e016"; +} +.glyphicon-off:before { + content: "\e017"; +} +.glyphicon-signal:before { + content: "\e018"; +} +.glyphicon-cog:before { + content: "\e019"; +} +.glyphicon-trash:before { + content: "\e020"; +} +.glyphicon-home:before { + content: "\e021"; +} +.glyphicon-file:before { + content: "\e022"; +} +.glyphicon-time:before { + content: "\e023"; +} +.glyphicon-road:before { + content: "\e024"; +} +.glyphicon-download-alt:before { + content: "\e025"; +} +.glyphicon-download:before { + content: "\e026"; +} +.glyphicon-upload:before { + content: "\e027"; +} +.glyphicon-inbox:before { + content: "\e028"; +} +.glyphicon-play-circle:before { + content: "\e029"; +} +.glyphicon-repeat:before { + content: "\e030"; +} +.glyphicon-refresh:before { + content: "\e031"; +} +.glyphicon-list-alt:before { + content: "\e032"; +} +.glyphicon-flag:before { + content: "\e034"; +} +.glyphicon-headphones:before { + content: "\e035"; +} +.glyphicon-volume-off:before { + content: "\e036"; +} +.glyphicon-volume-down:before { + content: "\e037"; +} +.glyphicon-volume-up:before { + content: "\e038"; +} +.glyphicon-qrcode:before { + content: "\e039"; +} +.glyphicon-barcode:before { + content: "\e040"; +} +.glyphicon-tag:before { + content: "\e041"; +} +.glyphicon-tags:before { + content: "\e042"; +} +.glyphicon-book:before { + content: "\e043"; +} +.glyphicon-print:before { + content: "\e045"; +} +.glyphicon-font:before { + content: "\e047"; +} +.glyphicon-bold:before { + content: "\e048"; +} +.glyphicon-italic:before { + content: "\e049"; +} +.glyphicon-text-height:before { + content: "\e050"; +} +.glyphicon-text-width:before { + content: "\e051"; +} +.glyphicon-align-left:before { + content: "\e052"; +} +.glyphicon-align-center:before { + content: "\e053"; +} +.glyphicon-align-right:before { + content: "\e054"; +} +.glyphicon-align-justify:before { + content: "\e055"; +} +.glyphicon-list:before { + content: "\e056"; +} +.glyphicon-indent-left:before { + content: "\e057"; +} +.glyphicon-indent-right:before { + content: "\e058"; +} +.glyphicon-facetime-video:before { + content: "\e059"; +} +.glyphicon-picture:before { + content: "\e060"; +} +.glyphicon-map-marker:before { + content: "\e062"; +} +.glyphicon-adjust:before { + content: "\e063"; +} +.glyphicon-tint:before { + content: "\e064"; +} +.glyphicon-edit:before { + content: "\e065"; +} +.glyphicon-share:before { + content: "\e066"; +} +.glyphicon-check:before { + content: "\e067"; +} +.glyphicon-move:before { + content: "\e068"; +} +.glyphicon-step-backward:before { + content: "\e069"; +} +.glyphicon-fast-backward:before { + content: "\e070"; +} +.glyphicon-backward:before { + content: "\e071"; +} +.glyphicon-play:before { + content: "\e072"; +} +.glyphicon-pause:before { + content: "\e073"; +} +.glyphicon-stop:before { + content: "\e074"; +} +.glyphicon-forward:before { + content: "\e075"; +} +.glyphicon-fast-forward:before { + content: "\e076"; +} +.glyphicon-step-forward:before { + content: "\e077"; +} +.glyphicon-eject:before { + content: "\e078"; +} +.glyphicon-chevron-left:before { + content: "\e079"; +} +.glyphicon-chevron-right:before { + content: "\e080"; +} +.glyphicon-plus-sign:before { + content: "\e081"; +} +.glyphicon-minus-sign:before { + content: "\e082"; +} +.glyphicon-remove-sign:before { + content: "\e083"; +} +.glyphicon-ok-sign:before { + content: "\e084"; +} +.glyphicon-question-sign:before { + content: "\e085"; +} +.glyphicon-info-sign:before { + content: "\e086"; +} +.glyphicon-screenshot:before { + content: "\e087"; +} +.glyphicon-remove-circle:before { + content: "\e088"; +} +.glyphicon-ok-circle:before { + content: "\e089"; +} +.glyphicon-ban-circle:before { + content: "\e090"; +} +.glyphicon-arrow-left:before { + content: "\e091"; +} +.glyphicon-arrow-right:before { + content: "\e092"; +} +.glyphicon-arrow-up:before { + content: "\e093"; +} +.glyphicon-arrow-down:before { + content: "\e094"; +} +.glyphicon-share-alt:before { + content: "\e095"; +} +.glyphicon-resize-full:before { + content: "\e096"; +} +.glyphicon-resize-small:before { + content: "\e097"; +} +.glyphicon-exclamation-sign:before { + content: "\e101"; +} +.glyphicon-gift:before { + content: "\e102"; +} +.glyphicon-leaf:before { + content: "\e103"; +} +.glyphicon-eye-open:before { + content: "\e105"; +} +.glyphicon-eye-close:before { + content: "\e106"; +} +.glyphicon-warning-sign:before { + content: "\e107"; +} +.glyphicon-plane:before { + content: "\e108"; +} +.glyphicon-random:before { + content: "\e110"; +} +.glyphicon-comment:before { + content: "\e111"; +} +.glyphicon-magnet:before { + content: "\e112"; +} +.glyphicon-chevron-up:before { + content: "\e113"; +} +.glyphicon-chevron-down:before { + content: "\e114"; +} +.glyphicon-retweet:before { + content: "\e115"; +} +.glyphicon-shopping-cart:before { + content: "\e116"; +} +.glyphicon-folder-close:before { + content: "\e117"; +} +.glyphicon-folder-open:before { + content: "\e118"; +} +.glyphicon-resize-vertical:before { + content: "\e119"; +} +.glyphicon-resize-horizontal:before { + content: "\e120"; +} +.glyphicon-hdd:before { + content: "\e121"; +} +.glyphicon-bullhorn:before { + content: "\e122"; +} +.glyphicon-certificate:before { + content: "\e124"; +} +.glyphicon-thumbs-up:before { + content: "\e125"; +} +.glyphicon-thumbs-down:before { + content: "\e126"; +} +.glyphicon-hand-right:before { + content: "\e127"; +} +.glyphicon-hand-left:before { + content: "\e128"; +} +.glyphicon-hand-up:before { + content: "\e129"; +} +.glyphicon-hand-down:before { + content: "\e130"; +} +.glyphicon-circle-arrow-right:before { + content: "\e131"; +} +.glyphicon-circle-arrow-left:before { + content: "\e132"; +} +.glyphicon-circle-arrow-up:before { + content: "\e133"; +} +.glyphicon-circle-arrow-down:before { + content: "\e134"; +} +.glyphicon-globe:before { + content: "\e135"; +} +.glyphicon-tasks:before { + content: "\e137"; +} +.glyphicon-filter:before { + content: "\e138"; +} +.glyphicon-fullscreen:before { + content: "\e140"; +} +.glyphicon-dashboard:before { + content: "\e141"; +} +.glyphicon-heart-empty:before { + content: "\e143"; +} +.glyphicon-link:before { + content: "\e144"; +} +.glyphicon-phone:before { + content: "\e145"; +} +.glyphicon-usd:before { + content: "\e148"; +} +.glyphicon-gbp:before { + content: "\e149"; +} +.glyphicon-sort:before { + content: "\e150"; +} +.glyphicon-sort-by-alphabet:before { + content: "\e151"; +} +.glyphicon-sort-by-alphabet-alt:before { + content: "\e152"; +} +.glyphicon-sort-by-order:before { + content: "\e153"; +} +.glyphicon-sort-by-order-alt:before { + content: "\e154"; +} +.glyphicon-sort-by-attributes:before { + content: "\e155"; +} +.glyphicon-sort-by-attributes-alt:before { + content: "\e156"; +} +.glyphicon-unchecked:before { + content: "\e157"; +} +.glyphicon-expand:before { + content: "\e158"; +} +.glyphicon-collapse-down:before { + content: "\e159"; +} +.glyphicon-collapse-up:before { + content: "\e160"; +} +.glyphicon-log-in:before { + content: "\e161"; +} +.glyphicon-flash:before { + content: "\e162"; +} +.glyphicon-log-out:before { + content: "\e163"; +} +.glyphicon-new-window:before { + content: "\e164"; +} +.glyphicon-record:before { + content: "\e165"; +} +.glyphicon-save:before { + content: "\e166"; +} +.glyphicon-open:before { + content: "\e167"; +} +.glyphicon-saved:before { + content: "\e168"; +} +.glyphicon-import:before { + content: "\e169"; +} +.glyphicon-export:before { + content: "\e170"; +} +.glyphicon-send:before { + content: "\e171"; +} +.glyphicon-floppy-disk:before { + content: "\e172"; +} +.glyphicon-floppy-saved:before { + content: "\e173"; +} +.glyphicon-floppy-remove:before { + content: "\e174"; +} +.glyphicon-floppy-save:before { + content: "\e175"; +} +.glyphicon-floppy-open:before { + content: "\e176"; +} +.glyphicon-credit-card:before { + content: "\e177"; +} +.glyphicon-transfer:before { + content: "\e178"; +} +.glyphicon-cutlery:before { + content: "\e179"; +} +.glyphicon-header:before { + content: "\e180"; +} +.glyphicon-compressed:before { + content: "\e181"; +} +.glyphicon-earphone:before { + content: "\e182"; +} +.glyphicon-phone-alt:before { + content: "\e183"; +} +.glyphicon-tower:before { + content: "\e184"; +} +.glyphicon-stats:before { + content: "\e185"; +} +.glyphicon-sd-video:before { + content: "\e186"; +} +.glyphicon-hd-video:before { + content: "\e187"; +} +.glyphicon-subtitles:before { + content: "\e188"; +} +.glyphicon-sound-stereo:before { + content: "\e189"; +} +.glyphicon-sound-dolby:before { + content: "\e190"; +} +.glyphicon-sound-5-1:before { + content: "\e191"; +} +.glyphicon-sound-6-1:before { + content: "\e192"; +} +.glyphicon-sound-7-1:before { + content: "\e193"; +} +.glyphicon-copyright-mark:before { + content: "\e194"; +} +.glyphicon-registration-mark:before { + content: "\e195"; +} +.glyphicon-cloud-download:before { + content: "\e197"; +} +.glyphicon-cloud-upload:before { + content: "\e198"; +} +.glyphicon-tree-conifer:before { + content: "\e199"; +} +.glyphicon-tree-deciduous:before { + content: "\e200"; +} +.glyphicon-briefcase:before { + content: "\1f4bc"; +} +.glyphicon-calendar:before { + content: "\1f4c5"; +} +.glyphicon-pushpin:before { + content: "\1f4cc"; +} +.glyphicon-paperclip:before { + content: "\1f4ce"; +} +.glyphicon-camera:before { + content: "\1f4f7"; +} +.glyphicon-lock:before { + content: "\1f512"; +} +.glyphicon-bell:before { + content: "\1f514"; +} +.glyphicon-bookmark:before { + content: "\1f516"; +} +.glyphicon-fire:before { + content: "\1f525"; +} +.glyphicon-wrench:before { + content: "\1f527"; +} +.caret { + display: inline-block; + width: 0; + height: 0; + margin-left: 2px; + vertical-align: middle; + border-top: 4px solid #000000; + border-right: 4px solid transparent; + border-left: 4px solid transparent; + border-bottom: 0 dotted; + content: ""; +} +.dropdown { + position: relative; +} +.dropdown-toggle:focus { + outline: 0; +} +.dropdown-menu { + position: absolute; + top: 100%; + left: 0; + z-index: 1000; + display: none; + float: left; + min-width: 160px; + padding: 5px 0; + margin: 2px 0 0; + list-style: none; + font-size: 14px; + background-color: #ffffff; + border: 1px solid #cccccc; + border: 1px solid rgba(0, 0, 0, 0.15); + border-radius: 4px; + -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); + box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); + background-clip: padding-box; +} +.dropdown-menu.pull-right { + right: 0; + left: auto; +} +.dropdown-menu .divider { + height: 1px; + margin: 9px 0; + overflow: hidden; + background-color: #e5e5e5; +} +.dropdown-menu > li > a { + display: block; + padding: 3px 20px; + clear: both; + font-weight: normal; + line-height: 1.428571429; + color: #77777a; + white-space: nowrap; +} +.dropdown-menu > li > a:hover, +.dropdown-menu > li > a:focus { + text-decoration: none; + color: #ffffff; + background-color: #679DCE; +} +.dropdown-menu > .active > a, +.dropdown-menu > .active > a:hover, +.dropdown-menu > .active > a:focus { + color: #ffffff; + text-decoration: none; + outline: 0; + background-color: #679DCE; +} +.dropdown-menu > .disabled > a, +.dropdown-menu > .disabled > a:hover, +.dropdown-menu > .disabled > a:focus { + color: #f9faf9; +} +.dropdown-menu > .disabled > a:hover, +.dropdown-menu > .disabled > a:focus { + text-decoration: none; + background-color: transparent; + background-image: none; + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + cursor: not-allowed; +} +.open > .dropdown-menu { + display: block; +} +.open > a { + outline: 0; +} +.dropdown-header { + display: block; + padding: 3px 20px; + font-size: 12px; + line-height: 1.428571429; + color: #f9faf9; +} +.dropdown-backdrop { + position: fixed; + left: 0; + right: 0; + bottom: 0; + top: 0; + z-index: 990; +} +.pull-right > .dropdown-menu { + right: 0; + left: auto; +} +.dropup .caret, +.navbar-fixed-bottom .dropdown .caret { + border-top: 0 dotted; + border-bottom: 4px solid #000000; + content: ""; +} +.dropup .dropdown-menu, +.navbar-fixed-bottom .dropdown .dropdown-menu { + top: auto; + bottom: 100%; + margin-bottom: 1px; +} +@media (min-width: 768px) { + .navbar-right .dropdown-menu { + right: 0; + left: auto; + } +} +.btn-default .caret { + border-top-color: #333333; +} +.btn-primary .caret, +.btn-success .caret, +.btn-warning .caret, +.btn-danger .caret, +.btn-info .caret { + border-top-color: #fff; +} +.dropup .btn-default .caret { + border-bottom-color: #333333; +} +.dropup .btn-primary .caret, +.dropup .btn-success .caret, +.dropup .btn-warning .caret, +.dropup .btn-danger .caret, +.dropup .btn-info .caret { + border-bottom-color: #fff; +} +.btn-group, +.btn-group-vertical { + position: relative; + display: inline-block; + vertical-align: middle; +} +.btn-group > .btn, +.btn-group-vertical > .btn { + position: relative; + float: left; +} +.btn-group > .btn:hover, +.btn-group-vertical > .btn:hover, +.btn-group > .btn:focus, +.btn-group-vertical > .btn:focus, +.btn-group > .btn:active, +.btn-group-vertical > .btn:active, +.btn-group > .btn.active, +.btn-group-vertical > .btn.active { + z-index: 2; +} +.btn-group > .btn:focus, +.btn-group-vertical > .btn:focus { + outline: none; +} +.btn-group .btn + .btn, +.btn-group .btn + .btn-group, +.btn-group .btn-group + .btn, +.btn-group .btn-group + .btn-group { + margin-left: -1px; +} +.btn-toolbar:before, +.btn-toolbar:after { + content: " "; + /* 1 */ + + display: table; + /* 2 */ + +} +.btn-toolbar:after { + clear: both; +} +.btn-toolbar:before, +.btn-toolbar:after { + content: " "; + /* 1 */ + + display: table; + /* 2 */ + +} +.btn-toolbar:after { + clear: both; +} +.btn-toolbar .btn-group { + float: left; +} +.btn-toolbar > .btn + .btn, +.btn-toolbar > .btn-group + .btn, +.btn-toolbar > .btn + .btn-group, +.btn-toolbar > .btn-group + .btn-group { + margin-left: 5px; +} +.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) { + border-radius: 0; +} +.btn-group > .btn:first-child { + margin-left: 0; +} +.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) { + border-bottom-right-radius: 0; + border-top-right-radius: 0; +} +.btn-group > .btn:last-child:not(:first-child), +.btn-group > .dropdown-toggle:not(:first-child) { + border-bottom-left-radius: 0; + border-top-left-radius: 0; +} +.btn-group > .btn-group { + float: left; +} +.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn { + border-radius: 0; +} +.btn-group > .btn-group:first-child > .btn:last-child, +.btn-group > .btn-group:first-child > .dropdown-toggle { + border-bottom-right-radius: 0; + border-top-right-radius: 0; +} +.btn-group > .btn-group:last-child > .btn:first-child { + border-bottom-left-radius: 0; + border-top-left-radius: 0; +} +.btn-group .dropdown-toggle:active, +.btn-group.open .dropdown-toggle { + outline: 0; +} +.btn-group-xs > .btn { + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; + padding: 1px 5px; +} +.btn-group-sm > .btn { + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +.btn-group-lg > .btn { + padding: 10px 16px; + font-size: 18px; + line-height: 1.33; + border-radius: 6px; +} +.btn-group > .btn + .dropdown-toggle { + padding-left: 8px; + padding-right: 8px; +} +.btn-group > .btn-lg + .dropdown-toggle { + padding-left: 12px; + padding-right: 12px; +} +.btn-group.open .dropdown-toggle { + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); +} +.btn .caret { + margin-left: 0; +} +.btn-lg .caret { + border-width: 5px 5px 0; + border-bottom-width: 0; +} +.dropup .btn-lg .caret { + border-width: 0 5px 5px; +} +.btn-group-vertical > .btn, +.btn-group-vertical > .btn-group { + display: block; + float: none; + width: 100%; + max-width: 100%; +} +.btn-group-vertical > .btn-group:before, +.btn-group-vertical > .btn-group:after { + content: " "; + /* 1 */ + + display: table; + /* 2 */ + +} +.btn-group-vertical > .btn-group:after { + clear: both; +} +.btn-group-vertical > .btn-group:before, +.btn-group-vertical > .btn-group:after { + content: " "; + /* 1 */ + + display: table; + /* 2 */ + +} +.btn-group-vertical > .btn-group:after { + clear: both; +} +.btn-group-vertical > .btn-group > .btn { + float: none; +} +.btn-group-vertical > .btn + .btn, +.btn-group-vertical > .btn + .btn-group, +.btn-group-vertical > .btn-group + .btn, +.btn-group-vertical > .btn-group + .btn-group { + margin-top: -1px; + margin-left: 0; +} +.btn-group-vertical > .btn:not(:first-child):not(:last-child) { + border-radius: 0; +} +.btn-group-vertical > .btn:first-child:not(:last-child) { + border-top-right-radius: 4px; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group-vertical > .btn:last-child:not(:first-child) { + border-bottom-left-radius: 4px; + border-top-right-radius: 0; + border-top-left-radius: 0; +} +.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn { + border-radius: 0; +} +.btn-group-vertical > .btn-group:first-child > .btn:last-child, +.btn-group-vertical > .btn-group:first-child > .dropdown-toggle { + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group-vertical > .btn-group:last-child > .btn:first-child { + border-top-right-radius: 0; + border-top-left-radius: 0; +} +.btn-group-justified { + display: table; + width: 100%; + table-layout: fixed; + border-collapse: separate; +} +.btn-group-justified .btn { + float: none; + display: table-cell; + width: 1%; +} +[data-toggle="buttons"] > .btn > input[type="radio"], +[data-toggle="buttons"] > .btn > input[type="checkbox"] { + display: none; +} +.input-group { + position: relative; + display: table; + border-collapse: separate; +} +.input-group.col { + float: none; + padding-left: 0; + padding-right: 0; +} +.input-group .form-control { + width: 100%; + margin-bottom: 0; +} +.input-group-lg > .form-control, +.input-group-lg > .input-group-addon, +.input-group-lg > .input-group-btn > .btn { + height: 45px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.33; + border-radius: 6px; +} +select.input-group-lg > .form-control, +select.input-group-lg > .input-group-addon, +select.input-group-lg > .input-group-btn > .btn { + height: 45px; + line-height: 45px; +} +textarea.input-group-lg > .form-control, +textarea.input-group-lg > .input-group-addon, +textarea.input-group-lg > .input-group-btn > .btn { + height: auto; +} +.input-group-sm > .form-control, +.input-group-sm > .input-group-addon, +.input-group-sm > .input-group-btn > .btn { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +select.input-group-sm > .form-control, +select.input-group-sm > .input-group-addon, +select.input-group-sm > .input-group-btn > .btn { + height: 30px; + line-height: 30px; +} +textarea.input-group-sm > .form-control, +textarea.input-group-sm > .input-group-addon, +textarea.input-group-sm > .input-group-btn > .btn { + height: auto; +} +.input-group-addon, +.input-group-btn, +.input-group .form-control { + display: table-cell; +} +.input-group-addon:not(:first-child):not(:last-child), +.input-group-btn:not(:first-child):not(:last-child), +.input-group .form-control:not(:first-child):not(:last-child) { + border-radius: 0; +} +.input-group-addon, +.input-group-btn { + width: 1%; + white-space: nowrap; + vertical-align: middle; +} +.input-group-addon { + padding: 6px 12px; + font-size: 14px; + font-weight: normal; + line-height: 1; + text-align: center; + background-color: #bac9c2; + border: 1px solid #cccccc; + border-radius: 4px; +} +.input-group-addon.input-sm { + padding: 5px 10px; + font-size: 12px; + border-radius: 3px; +} +.input-group-addon.input-lg { + padding: 10px 16px; + font-size: 18px; + border-radius: 6px; +} +.input-group-addon input[type="radio"], +.input-group-addon input[type="checkbox"] { + margin-top: 0; +} +.input-group .form-control:first-child, +.input-group-addon:first-child, +.input-group-btn:first-child > .btn, +.input-group-btn:first-child > .dropdown-toggle, +.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle) { + border-bottom-right-radius: 0; + border-top-right-radius: 0; +} +.input-group-addon:first-child { + border-right: 0; +} +.input-group .form-control:last-child, +.input-group-addon:last-child, +.input-group-btn:last-child > .btn, +.input-group-btn:last-child > .dropdown-toggle, +.input-group-btn:first-child > .btn:not(:first-child) { + border-bottom-left-radius: 0; + border-top-left-radius: 0; +} +.input-group-addon:last-child { + border-left: 0; +} +.input-group-btn { + position: relative; + white-space: nowrap; +} +.input-group-btn > .btn { + position: relative; +} +.input-group-btn > .btn + .btn { + margin-left: -4px; +} +.input-group-btn > .btn:hover, +.input-group-btn > .btn:active { + z-index: 2; +} +.nav { + margin-bottom: 0; + padding-left: 0; + list-style: none; +} +.nav:before, +.nav:after { + content: " "; + /* 1 */ + + display: table; + /* 2 */ + +} +.nav:after { + clear: both; +} +.nav:before, +.nav:after { + content: " "; + /* 1 */ + + display: table; + /* 2 */ + +} +.nav:after { + clear: both; +} +.nav > li { + position: relative; + display: block; +} +.nav > li > a { + position: relative; + display: block; + padding: 10px 15px; +} +.nav > li > a:hover, +.nav > li > a:focus { + text-decoration: none; + background-color: #bac9c2; +} +.nav > li.disabled > a { + color: #f9faf9; +} +.nav > li.disabled > a:hover, +.nav > li.disabled > a:focus { + color: #f9faf9; + text-decoration: none; + background-color: transparent; + cursor: not-allowed; +} +.nav .open > a, +.nav .open > a:hover, +.nav .open > a:focus { + background-color: #bac9c2; + border-color: #74ab50; +} +.nav .nav-divider { + height: 1px; + margin: 9px 0; + overflow: hidden; + background-color: #e5e5e5; +} +.nav > li > a > img { + max-width: none; +} +.nav-tabs { + border-bottom: 1px solid #dddddd; +} +.nav-tabs > li { + float: left; + margin-bottom: -1px; +} +.nav-tabs > li > a { + margin-right: 2px; + line-height: 1.428571429; + border: 1px solid transparent; + border-radius: 4px 4px 0 0; +} +.nav-tabs > li > a:hover { + border-color: #bac9c2 #bac9c2 #dddddd; +} +.nav-tabs > li.active > a, +.nav-tabs > li.active > a:hover, +.nav-tabs > li.active > a:focus { + color: #4aadd6; + background-color: #ffffff; + border: 1px solid #dddddd; + border-bottom-color: transparent; + cursor: default; +} +.nav-tabs.nav-justified { + width: 100%; + border-bottom: 0; +} +.nav-tabs.nav-justified > li { + float: none; +} +.nav-tabs.nav-justified > li > a { + text-align: center; +} +@media (min-width: 768px) { + .nav-tabs.nav-justified > li { + display: table-cell; + width: 1%; + } +} +.nav-tabs.nav-justified > li > a { + border-bottom: 1px solid #dddddd; + margin-right: 0; +} +.nav-tabs.nav-justified > .active > a { + border-bottom-color: #ffffff; +} +.nav-pills > li { + float: left; +} +.nav-pills > li > a { + border-radius: 5px; +} +.nav-pills > li + li { + margin-left: 2px; +} +.nav-pills > li.active > a, +.nav-pills > li.active > a:hover, +.nav-pills > li.active > a:focus { + color: #ffffff; + background-color: #74ab50; +} +.nav-stacked > li { + float: none; +} +.nav-stacked > li + li { + margin-top: 2px; + margin-left: 0; +} +.nav-justified { + width: 100%; +} +.nav-justified > li { + float: none; +} +.nav-justified > li > a { + text-align: center; +} +@media (min-width: 768px) { + .nav-justified > li { + display: table-cell; + width: 1%; + } +} +.nav-tabs-justified { + border-bottom: 0; +} +.nav-tabs-justified > li > a { + border-bottom: 1px solid #dddddd; + margin-right: 0; +} +.nav-tabs-justified > .active > a { + border-bottom-color: #ffffff; +} +.tabbable:before, +.tabbable:after { + content: " "; + /* 1 */ + + display: table; + /* 2 */ + +} +.tabbable:after { + clear: both; +} +.tabbable:before, +.tabbable:after { + content: " "; + /* 1 */ + + display: table; + /* 2 */ + +} +.tabbable:after { + clear: both; +} +.tab-content > .tab-pane, +.pill-content > .pill-pane { + display: none; +} +.tab-content > .active, +.pill-content > .active { + display: block; +} +.nav .caret { + border-top-color: #74ab50; + border-bottom-color: #74ab50; +} +.nav a:hover .caret { + border-top-color: #517738; + border-bottom-color: #517738; +} +.nav-tabs .dropdown-menu { + margin-top: -1px; + border-top-right-radius: 0; + border-top-left-radius: 0; +} +.navbar { + position: relative; + z-index: 1000; + min-height: 50px; + margin-bottom: 20px; + border: 1px solid transparent; +} +.navbar:before, +.navbar:after { + content: " "; + /* 1 */ + + display: table; + /* 2 */ + +} +.navbar:after { + clear: both; +} +.navbar:before, +.navbar:after { + content: " "; + /* 1 */ + + display: table; + /* 2 */ + +} +.navbar:after { + clear: both; +} +@media (min-width: 768px) { + .navbar { + border-radius: 4px; + } +} +.navbar-header:before, +.navbar-header:after { + content: " "; + /* 1 */ + + display: table; + /* 2 */ + +} +.navbar-header:after { + clear: both; +} +.navbar-header:before, +.navbar-header:after { + content: " "; + /* 1 */ + + display: table; + /* 2 */ + +} +.navbar-header:after { + clear: both; +} +@media (min-width: 768px) { + .navbar-header { + float: left; + } +} +.navbar-collapse { + max-height: 340px; + overflow-x: visible; + padding-right: 15px; + padding-left: 15px; + border-top: 1px solid transparent; + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1); + -webkit-overflow-scrolling: touch; +} +.navbar-collapse:before, +.navbar-collapse:after { + content: " "; + /* 1 */ + + display: table; + /* 2 */ + +} +.navbar-collapse:after { + clear: both; +} +.navbar-collapse:before, +.navbar-collapse:after { + content: " "; + /* 1 */ + + display: table; + /* 2 */ + +} +.navbar-collapse:after { + clear: both; +} +.navbar-collapse.in { + overflow-y: auto; +} +@media (min-width: 768px) { + .navbar-collapse { + width: auto; + border-top: 0; + box-shadow: none; + } + .navbar-collapse.collapse { + display: block !important; + height: auto !important; + padding-bottom: 0; + overflow: visible !important; + } + .navbar-collapse.in { + overflow-y: visible; + } + .navbar-collapse .navbar-nav.navbar-left:first-child { + margin-left: -15px; + } + .navbar-collapse .navbar-nav.navbar-right:last-child { + margin-right: -15px; + } + .navbar-collapse .navbar-text:last-child { + margin-right: 0; + } +} +.container > .navbar-header, +.container > .navbar-collapse { + margin-right: -15px; + margin-left: -15px; +} +@media (min-width: 768px) { + .container > .navbar-header, + .container > .navbar-collapse { + margin-right: 0; + margin-left: 0; + } +} +.navbar-static-top { + border-width: 0 0 1px; +} +@media (min-width: 768px) { + .navbar-static-top { + border-radius: 0; + } +} +.navbar-fixed-top, +.navbar-fixed-bottom { + position: fixed; + right: 0; + left: 0; + border-width: 0 0 1px; +} +@media (min-width: 768px) { + .navbar-fixed-top, + .navbar-fixed-bottom { + border-radius: 0; + } +} +.navbar-fixed-top { + z-index: 1030; + top: 0; +} +.navbar-fixed-bottom { + bottom: 0; + margin-bottom: 0; +} +.navbar-brand { + float: left; + padding: 15px 15px; + font-size: 18px; + line-height: 20px; +} +.navbar-brand:hover, +.navbar-brand:focus { + text-decoration: none; +} +@media (min-width: 768px) { + .navbar > .container .navbar-brand { + margin-left: -15px; + } +} +.navbar-toggle { + position: relative; + float: right; + margin-right: 15px; + padding: 9px 10px; + margin-top: 8px; + margin-bottom: 8px; + background-color: transparent; + border: 1px solid transparent; + border-radius: 4px; +} +.navbar-toggle .icon-bar { + display: block; + width: 22px; + height: 2px; + border-radius: 1px; +} +.navbar-toggle .icon-bar + .icon-bar { + margin-top: 4px; +} +@media (min-width: 768px) { + .navbar-toggle { + display: none; + } +} +.navbar-nav { + margin: 7.5px -15px; +} +.navbar-nav > li > a { + padding-top: 10px; + padding-bottom: 10px; + line-height: 20px; +} +@media (max-width: 767px) { + .navbar-nav .open .dropdown-menu { + position: static; + float: none; + width: auto; + margin-top: 0; + background-color: transparent; + border: 0; + box-shadow: none; + } + .navbar-nav .open .dropdown-menu > li > a, + .navbar-nav .open .dropdown-menu .dropdown-header { + padding: 5px 15px 5px 25px; + } + .navbar-nav .open .dropdown-menu > li > a { + line-height: 20px; + } + .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-nav .open .dropdown-menu > li > a:focus { + background-image: none; + } +} +@media (min-width: 768px) { + .navbar-nav { + float: left; + margin: 0; + } + .navbar-nav > li { + float: left; + } + .navbar-nav > li > a { + padding-top: 15px; + padding-bottom: 15px; + } +} +@media (min-width: 768px) { + .navbar-left { + float: left !important; + } + .navbar-right { + float: right !important; + } +} +.navbar-form { + margin-left: -15px; + margin-right: -15px; + padding: 10px 15px; + border-top: 1px solid transparent; + border-bottom: 1px solid transparent; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + margin-top: 8px; + margin-bottom: 8px; +} +@media (min-width: 768px) { + .navbar-form .form-group { + display: inline-block; + margin-bottom: 0; + vertical-align: middle; + } + .navbar-form .form-control { + display: inline-block; + } + .navbar-form .radio, + .navbar-form .checkbox { + display: inline-block; + margin-top: 0; + margin-bottom: 0; + padding-left: 0; + } + .navbar-form .radio input[type="radio"], + .navbar-form .checkbox input[type="checkbox"] { + float: none; + margin-left: 0; + } +} +@media (max-width: 767px) { + .navbar-form .form-group { + margin-bottom: 5px; + } +} +@media (min-width: 768px) { + .navbar-form { + width: auto; + border: 0; + margin-left: 0; + margin-right: 0; + padding-top: 0; + padding-bottom: 0; + -webkit-box-shadow: none; + box-shadow: none; + } +} +.navbar-nav > li > .dropdown-menu { + margin-top: 0; + border-top-right-radius: 0; + border-top-left-radius: 0; +} +.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu { + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.navbar-nav.pull-right > li > .dropdown-menu, +.navbar-nav > li > .dropdown-menu.pull-right { + left: auto; + right: 0; +} +.navbar-btn { + margin-top: 8px; + margin-bottom: 8px; +} +.navbar-text { + float: left; + margin-top: 15px; + margin-bottom: 15px; +} +@media (min-width: 768px) { + .navbar-text { + margin-left: 15px; + margin-right: 15px; + } +} +.navbar-default { + background-color: #f8f8f8; + border-color: #e7e7e7; +} +.navbar-default .navbar-brand { + color: #777777; +} +.navbar-default .navbar-brand:hover, +.navbar-default .navbar-brand:focus { + color: #5e5e5e; + background-color: transparent; +} +.navbar-default .navbar-text { + color: #777777; +} +.navbar-default .navbar-nav > li > a { + color: #777777; +} +.navbar-default .navbar-nav > li > a:hover, +.navbar-default .navbar-nav > li > a:focus { + color: #333333; + background-color: transparent; +} +.navbar-default .navbar-nav > .active > a, +.navbar-default .navbar-nav > .active > a:hover, +.navbar-default .navbar-nav > .active > a:focus { + color: #555555; + background-color: #e7e7e7; +} +.navbar-default .navbar-nav > .disabled > a, +.navbar-default .navbar-nav > .disabled > a:hover, +.navbar-default .navbar-nav > .disabled > a:focus { + color: #cccccc; + background-color: transparent; +} +.navbar-default .navbar-toggle { + border-color: #dddddd; +} +.navbar-default .navbar-toggle:hover, +.navbar-default .navbar-toggle:focus { + background-color: #dddddd; +} +.navbar-default .navbar-toggle .icon-bar { + background-color: #cccccc; +} +.navbar-default .navbar-collapse, +.navbar-default .navbar-form { + border-color: #e6e6e6; +} +.navbar-default .navbar-nav > .dropdown > a:hover .caret, +.navbar-default .navbar-nav > .dropdown > a:focus .caret { + border-top-color: #333333; + border-bottom-color: #333333; +} +.navbar-default .navbar-nav > .open > a, +.navbar-default .navbar-nav > .open > a:hover, +.navbar-default .navbar-nav > .open > a:focus { + background-color: #e7e7e7; + color: #555555; +} +.navbar-default .navbar-nav > .open > a .caret, +.navbar-default .navbar-nav > .open > a:hover .caret, +.navbar-default .navbar-nav > .open > a:focus .caret { + border-top-color: #555555; + border-bottom-color: #555555; +} +.navbar-default .navbar-nav > .dropdown > a .caret { + border-top-color: #777777; + border-bottom-color: #777777; +} +@media (max-width: 767px) { + .navbar-default .navbar-nav .open .dropdown-menu > li > a { + color: #777777; + } + .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus { + color: #333333; + background-color: transparent; + } + .navbar-default .navbar-nav .open .dropdown-menu > .active > a, + .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus { + color: #555555; + background-color: #e7e7e7; + } + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a, + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus { + color: #cccccc; + background-color: transparent; + } +} +.navbar-default .navbar-link { + color: #777777; +} +.navbar-default .navbar-link:hover { + color: #333333; +} +.navbar-inverse { + background-color: #74ab50; + border-color: #5c8840; +} +.navbar-inverse .navbar-brand { + color: #f9faf9; +} +.navbar-inverse .navbar-brand:hover, +.navbar-inverse .navbar-brand:focus { + color: #ffffff; + background-color: transparent; +} +.navbar-inverse .navbar-text { + color: #f9faf9; +} +.navbar-inverse .navbar-nav > li > a { + color: #f9faf9; +} +.navbar-inverse .navbar-nav > li > a:hover, +.navbar-inverse .navbar-nav > li > a:focus { + color: #ffffff; + background-color: transparent; +} +.navbar-inverse .navbar-nav > .active > a, +.navbar-inverse .navbar-nav > .active > a:hover, +.navbar-inverse .navbar-nav > .active > a:focus { + color: #ffffff; + background-color: #5c8840; +} +.navbar-inverse .navbar-nav > .disabled > a, +.navbar-inverse .navbar-nav > .disabled > a:hover, +.navbar-inverse .navbar-nav > .disabled > a:focus { + color: #444444; + background-color: transparent; +} +.navbar-inverse .navbar-toggle { + border-color: #333333; +} +.navbar-inverse .navbar-toggle:hover, +.navbar-inverse .navbar-toggle:focus { + background-color: #333333; +} +.navbar-inverse .navbar-toggle .icon-bar { + background-color: #ffffff; +} +.navbar-inverse .navbar-collapse, +.navbar-inverse .navbar-form { + border-color: #649345; +} +.navbar-inverse .navbar-nav > .open > a, +.navbar-inverse .navbar-nav > .open > a:hover, +.navbar-inverse .navbar-nav > .open > a:focus { + background-color: #5c8840; + color: #ffffff; +} +.navbar-inverse .navbar-nav > .dropdown > a:hover .caret { + border-top-color: #ffffff; + border-bottom-color: #ffffff; +} +.navbar-inverse .navbar-nav > .dropdown > a .caret { + border-top-color: #f9faf9; + border-bottom-color: #f9faf9; +} +.navbar-inverse .navbar-nav > .open > a .caret, +.navbar-inverse .navbar-nav > .open > a:hover .caret, +.navbar-inverse .navbar-nav > .open > a:focus .caret { + border-top-color: #ffffff; + border-bottom-color: #ffffff; +} +@media (max-width: 767px) { + .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header { + border-color: #5c8840; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a { + color: #f9faf9; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus { + color: #ffffff; + background-color: transparent; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a, + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus { + color: #ffffff; + background-color: #5c8840; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a, + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus { + color: #444444; + background-color: transparent; + } +} +.navbar-inverse .navbar-link { + color: #f9faf9; +} +.navbar-inverse .navbar-link:hover { + color: #ffffff; +} +.breadcrumb { + padding: 8px 15px; + margin-bottom: 20px; + list-style: none; + background-color: #f5f5f5; + border-radius: 4px; +} +.breadcrumb > li { + display: inline-block; +} +.breadcrumb > li + li:before { + content: "/\00a0"; + padding: 0 5px; + color: #cccccc; +} +.breadcrumb > .active { + color: #f9faf9; +} +.pagination { + display: inline-block; + padding-left: 0; + margin: 20px 0; + border-radius: 4px; +} +.pagination > li { + display: inline; +} +.pagination > li > a, +.pagination > li > span { + position: relative; + float: left; + padding: 6px 12px; + line-height: 1.428571429; + text-decoration: none; + background-color: #ffffff; + border: 1px solid #dddddd; + margin-left: -1px; +} +.pagination > li:first-child > a, +.pagination > li:first-child > span { + margin-left: 0; + border-bottom-left-radius: 4px; + border-top-left-radius: 4px; +} +.pagination > li:last-child > a, +.pagination > li:last-child > span { + border-bottom-right-radius: 4px; + border-top-right-radius: 4px; +} +.pagination > li > a:hover, +.pagination > li > span:hover, +.pagination > li > a:focus, +.pagination > li > span:focus { + background-color: #bac9c2; +} +.pagination > .active > a, +.pagination > .active > span, +.pagination > .active > a:hover, +.pagination > .active > span:hover, +.pagination > .active > a:focus, +.pagination > .active > span:focus { + z-index: 2; + color: #ffffff; + background-color: #74ab50; + border-color: #74ab50; + cursor: default; +} +.pagination > .disabled > span, +.pagination > .disabled > a, +.pagination > .disabled > a:hover, +.pagination > .disabled > a:focus { + color: #f9faf9; + background-color: #ffffff; + border-color: #dddddd; + cursor: not-allowed; +} +.pagination-lg > li > a, +.pagination-lg > li > span { + padding: 10px 16px; + font-size: 18px; +} +.pagination-lg > li:first-child > a, +.pagination-lg > li:first-child > span { + border-bottom-left-radius: 6px; + border-top-left-radius: 6px; +} +.pagination-lg > li:last-child > a, +.pagination-lg > li:last-child > span { + border-bottom-right-radius: 6px; + border-top-right-radius: 6px; +} +.pagination-sm > li > a, +.pagination-sm > li > span { + padding: 5px 10px; + font-size: 12px; +} +.pagination-sm > li:first-child > a, +.pagination-sm > li:first-child > span { + border-bottom-left-radius: 3px; + border-top-left-radius: 3px; +} +.pagination-sm > li:last-child > a, +.pagination-sm > li:last-child > span { + border-bottom-right-radius: 3px; + border-top-right-radius: 3px; +} +.pager { + padding-left: 0; + margin: 20px 0; + list-style: none; + text-align: center; +} +.pager:before, +.pager:after { + content: " "; + /* 1 */ + + display: table; + /* 2 */ + +} +.pager:after { + clear: both; +} +.pager:before, +.pager:after { + content: " "; + /* 1 */ + + display: table; + /* 2 */ + +} +.pager:after { + clear: both; +} +.pager li { + display: inline; +} +.pager li > a, +.pager li > span { + display: inline-block; + padding: 5px 14px; + background-color: #ffffff; + border: 1px solid #dddddd; + border-radius: 15px; +} +.pager li > a:hover, +.pager li > a:focus { + text-decoration: none; + background-color: #bac9c2; +} +.pager .next > a, +.pager .next > span { + float: right; +} +.pager .previous > a, +.pager .previous > span { + float: left; +} +.pager .disabled > a, +.pager .disabled > a:hover, +.pager .disabled > a:focus, +.pager .disabled > span { + color: #f9faf9; + background-color: #ffffff; + cursor: not-allowed; +} +.label { + display: inline; + padding: .2em .6em .3em; + font-size: 75%; + font-weight: bold; + line-height: 1; + color: #ffffff; + text-align: center; + white-space: nowrap; + vertical-align: baseline; + border-radius: .25em; +} +.label[href]:hover, +.label[href]:focus { + color: #ffffff; + text-decoration: none; + cursor: pointer; +} +.label:empty { + display: none; +} + +.label-default[href]:hover, +.label-default[href]:focus { + background-color: #dde3dd; +} +.label-primary { + background-color: #74ab50; +} +.label-primary[href]:hover, +.label-primary[href]:focus { + background-color: #5c8840; +} +.label-success { + background-color: #5cb85c; +} +.label-success[href]:hover, +.label-success[href]:focus { + background-color: #449d44; +} +.label-info { + background-color: #5bc0de; +} +.label-info[href]:hover, +.label-info[href]:focus { + background-color: #31b0d5; +} +.label-warning { + background-color: #f0ad4e; +} +.label-warning[href]:hover, +.label-warning[href]:focus { + background-color: #ec971f; +} +.label-danger { + background-color: #d9534f; +} +.label-danger[href]:hover, +.label-danger[href]:focus { + background-color: #c9302c; +} +.badge { + display: inline-block; + min-width: 10px; + padding: 3px 7px; + font-size: 12px; + font-weight: bold; + color: #ffffff; + line-height: 1; + vertical-align: baseline; + white-space: nowrap; + text-align: center; + background-color: #f9faf9; + border-radius: 10px; +} +.badge:empty { + display: none; +} +a.badge:hover, +a.badge:focus { + color: #ffffff; + text-decoration: none; + cursor: pointer; +} +.btn .badge { + position: relative; + top: -1px; +} +a.list-group-item.active > .badge, +.nav-pills > .active > a > .badge { + color: #74ab50; + background-color: #ffffff; +} +.nav-pills > li > a > .badge { + margin-left: 3px; +} +.jumbotron { + padding: 30px; + margin-bottom: 30px; + font-size: 21px; + font-weight: 200; + line-height: 2.1428571435; + color: inherit; + background-color: #bac9c2; +} +.jumbotron h1 { + line-height: 1; + color: inherit; +} +.jumbotron p { + line-height: 1.4; +} +.container .jumbotron { + border-radius: 6px; +} +@media screen and (min-width: 768px) { + .jumbotron { + padding-top: 48px; + padding-bottom: 48px; + } + .container .jumbotron { + padding-left: 60px; + padding-right: 60px; + } + .jumbotron h1 { + font-size: 63px; + } +} +.thumbnail { + padding: 4px; + line-height: 1.428571429; + background-color: #ffffff; + border: 1px solid #dddddd; + border-radius: 4px; + -webkit-transition: all 0.2s ease-in-out; + transition: all 0.2s ease-in-out; + display: inline-block; + max-width: 100%; + height: auto; + display: block; +} +.thumbnail > img { + display: block; + max-width: 100%; + height: auto; +} +a.thumbnail:hover, +a.thumbnail:focus { + border-color: #74ab50; +} +.thumbnail > img { + margin-left: auto; + margin-right: auto; +} +.thumbnail .caption { + padding: 9px; + color: #77777a; +} +.alert { + padding: 15px; + margin-bottom: 20px; + border: 1px solid transparent; + border-radius: 4px; +} +.alert h4 { + margin-top: 0; + color: inherit; +} +.alert .alert-link { + font-weight: bold; +} +.alert > p, +.alert > ul { + margin-bottom: 0; +} +.alert > p + p { + margin-top: 5px; +} +.alert-dismissable { + padding-right: 35px; +} +.alert-dismissable .close { + position: relative; + top: -2px; + right: -21px; + color: inherit; +} +.alert-success { + background-color: #dff0d8; + border-color: #d6e9c6; + color: #468847; +} +.alert-success hr { + border-top-color: #c9e2b3; +} +.alert-success .alert-link { + color: #356635; +} +.alert-info { + background-color: #d9edf7; + border-color: #bce8f1; + color: #3a87ad; +} +.alert-info hr { + border-top-color: #a6e1ec; +} +.alert-info .alert-link { + color: #2d6987; +} +.alert-warning { + background-color: #fcf8e3; + border-color: #fbeed5; + color: #c09853; +} +.alert-warning hr { + border-top-color: #f8e5be; +} +.alert-warning .alert-link { + color: #a47e3c; +} +.alert-danger { + background-color: #f2dede; + border-color: #eed3d7; + color: #b94a48; +} +.alert-danger hr { + border-top-color: #e6c1c7; +} +.alert-danger .alert-link { + color: #953b39; +} +@-webkit-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +@-moz-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +@-o-keyframes progress-bar-stripes { + from { + background-position: 0 0; + } + to { + background-position: 40px 0; + } +} +@keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +.progress { + overflow: hidden; + height: 20px; + margin-bottom: 20px; + background-color: #f5f5f5; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); +} +.progress-bar { + float: left; + width: 0%; + height: 100%; + font-size: 12px; + color: #ffffff; + text-align: center; + background-color: #74ab50; + -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + -webkit-transition: width 0.6s ease; + transition: width 0.6s ease; +} +.progress-striped .progress-bar { + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-size: 40px 40px; +} +.progress.active .progress-bar { + -webkit-animation: progress-bar-stripes 2s linear infinite; + -moz-animation: progress-bar-stripes 2s linear infinite; + -ms-animation: progress-bar-stripes 2s linear infinite; + -o-animation: progress-bar-stripes 2s linear infinite; + animation: progress-bar-stripes 2s linear infinite; +} +.progress-bar-success { + background-color: #5cb85c; +} +.progress-striped .progress-bar-success { + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} +.progress-bar-info { + background-color: #5bc0de; +} +.progress-striped .progress-bar-info { + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} +.progress-bar-warning { + background-color: #f0ad4e; +} +.progress-striped .progress-bar-warning { + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} +.progress-bar-danger { + background-color: #d9534f; +} +.progress-striped .progress-bar-danger { + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} +.media, +.media-body { + overflow: hidden; + zoom: 1; +} +.media, +.media .media { + margin-top: 15px; +} +.media:first-child { + margin-top: 0; +} +.media-object { + display: block; +} +.media-heading { + margin: 0 0 5px; +} +.media > .pull-left { + margin-right: 10px; +} +.media > .pull-right { + margin-left: 10px; +} +.media-list { + padding-left: 0; + list-style: none; +} +.list-group { + margin-bottom: 20px; + padding-left: 0; +} +.list-group-item { + position: relative; + display: block; + padding: 10px 15px; + margin-bottom: -1px; + background-color: #ffffff; + border: 1px solid #dddddd; +} +.list-group-item:first-child { + border-top-right-radius: 4px; + border-top-left-radius: 4px; +} +.list-group-item:last-child { + margin-bottom: 0; + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; +} +.list-group-item > .badge { + float: right; +} +.list-group-item > .badge + .badge { + margin-right: 5px; +} +a.list-group-item { + color: #555555; +} +a.list-group-item .list-group-item-heading { + color: #333333; +} +a.list-group-item:hover, +a.list-group-item:focus { + text-decoration: none; + background-color: #f5f5f5; +} +.list-group-item.active, +.list-group-item.active:hover, +.list-group-item.active:focus { + z-index: 2; + color: #ffffff; + background-color: #74ab50; + border-color: #74ab50; +} +.list-group-item.active .list-group-item-heading, +.list-group-item.active:hover .list-group-item-heading, +.list-group-item.active:focus .list-group-item-heading { + color: inherit; +} +.list-group-item.active .list-group-item-text, +.list-group-item.active:hover .list-group-item-text, +.list-group-item.active:focus .list-group-item-text { + color: #e1edda; +} +.list-group-item-heading { + margin-top: 0; + margin-bottom: 5px; +} +.list-group-item-text { + margin-bottom: 0; + line-height: 1.3; +} +.panel { + margin-bottom: 20px; + background-color: #ffffff; + border: 1px solid transparent; + border-radius: 4px; + -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); +} +.panel-body { + padding: 15px; +} +.panel-body:before, +.panel-body:after { + content: " "; + /* 1 */ + + display: table; + /* 2 */ + +} +.panel-body:after { + clear: both; +} +.panel-body:before, +.panel-body:after { + content: " "; + /* 1 */ + + display: table; + /* 2 */ + +} +.panel-body:after { + clear: both; +} +.panel > .list-group { + margin-bottom: 0; +} +.panel > .list-group .list-group-item { + border-width: 1px 0; +} +.panel > .list-group .list-group-item:first-child { + border-top-right-radius: 0; + border-top-left-radius: 0; +} +.panel > .list-group .list-group-item:last-child { + border-bottom: 0; +} +.panel-heading + .list-group .list-group-item:first-child { + border-top-width: 0; +} +.panel > .table { + margin-bottom: 0; +} +.panel > .panel-body + .table { + border-top: 1px solid #77777a; +} +.panel-heading { + padding: 10px 15px; + border-bottom: 1px solid transparent; + border-top-right-radius: 3px; + border-top-left-radius: 3px; +} +.panel-title { + margin-top: 0; + margin-bottom: 0; + font-size: 16px; +} +.panel-title > a { + color: inherit; +} +.panel-footer { + padding: 10px 15px; + background-color: #f5f5f5; + border-top: 1px solid #dddddd; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +.panel-group .panel { + margin-bottom: 0; + border-radius: 4px; + overflow: hidden; +} +.panel-group .panel + .panel { + margin-top: 5px; +} +.panel-group .panel-heading { + border-bottom: 0; +} +.panel-group .panel-heading + .panel-collapse .panel-body { + border-top: 1px solid #dddddd; +} +.panel-group .panel-footer { + border-top: 0; +} +.panel-group .panel-footer + .panel-collapse .panel-body { + border-bottom: 1px solid #dddddd; +} +.panel-default { + border-color: #dddddd; +} +.panel-default > .panel-heading { + color: #77777a; + background-color: #f5f5f5; + border-color: #dddddd; +} +.panel-default > .panel-heading + .panel-collapse .panel-body { + border-top-color: #dddddd; +} +.panel-default > .panel-footer + .panel-collapse .panel-body { + border-bottom-color: #dddddd; +} +.panel-primary { + border-color: #74ab50; +} +.panel-primary > .panel-heading { + color: #ffffff; + background-color: #74ab50; + border-color: #74ab50; +} +.panel-primary > .panel-heading + .panel-collapse .panel-body { + border-top-color: #74ab50; +} +.panel-primary > .panel-footer + .panel-collapse .panel-body { + border-bottom-color: #74ab50; +} +.panel-success { + border-color: #d6e9c6; +} +.panel-success > .panel-heading { + color: #468847; + background-color: #dff0d8; + border-color: #d6e9c6; +} +.panel-success > .panel-heading + .panel-collapse .panel-body { + border-top-color: #d6e9c6; +} +.panel-success > .panel-footer + .panel-collapse .panel-body { + border-bottom-color: #d6e9c6; +} +.panel-warning { + border-color: #fbeed5; +} +.panel-warning > .panel-heading { + color: #c09853; + background-color: #fcf8e3; + border-color: #fbeed5; +} +.panel-warning > .panel-heading + .panel-collapse .panel-body { + border-top-color: #fbeed5; +} +.panel-warning > .panel-footer + .panel-collapse .panel-body { + border-bottom-color: #fbeed5; +} +.panel-danger { + border-color: #eed3d7; +} +.panel-danger > .panel-heading { + color: #b94a48; + background-color: #f2dede; + border-color: #eed3d7; +} +.panel-danger > .panel-heading + .panel-collapse .panel-body { + border-top-color: #eed3d7; +} +.panel-danger > .panel-footer + .panel-collapse .panel-body { + border-bottom-color: #eed3d7; +} +.panel-info { + border-color: #bce8f1; +} +.panel-info > .panel-heading { + color: #3a87ad; + background-color: #d9edf7; + border-color: #bce8f1; +} +.panel-info > .panel-heading + .panel-collapse .panel-body { + border-top-color: #bce8f1; +} +.panel-info > .panel-footer + .panel-collapse .panel-body { + border-bottom-color: #bce8f1; +} +.well { + min-height: 20px; + padding: 19px; + margin-bottom: 20px; + background-color: #f5f5f5; + border: 1px solid #e3e3e3; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); +} +.well blockquote { + border-color: #ddd; + border-color: rgba(0, 0, 0, 0.15); +} +.well-lg { + padding: 24px; + border-radius: 6px; +} +.well-sm { + padding: 9px; + border-radius: 3px; +} +.close { + float: right; + font-size: 21px; + font-weight: bold; + line-height: 1; + color: #000000; + text-shadow: 0 1px 0 #ffffff; + opacity: 0.2; + filter: alpha(opacity=20); +} +.close:hover, +.close:focus { + color: #000000; + text-decoration: none; + cursor: pointer; + opacity: 0.5; + filter: alpha(opacity=50); +} +button.close { + padding: 0; + cursor: pointer; + background: transparent; + border: 0; + -webkit-appearance: none; +} +.modal-open { + overflow: hidden; +} +body.modal-open, +.modal-open .navbar-fixed-top, +.modal-open .navbar-fixed-bottom { + margin-right: 15px; +} +.modal { + display: none; + overflow: auto; + overflow-y: scroll; + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1040; +} +.modal.fade .modal-dialog { + -webkit-transform: translate(0, -25%); + -ms-transform: translate(0, -25%); + transform: translate(0, -25%); + -webkit-transition: -webkit-transform 0.3s ease-out; + -moz-transition: -moz-transform 0.3s ease-out; + -o-transition: -o-transform 0.3s ease-out; + transition: transform 0.3s ease-out; +} +.modal.in .modal-dialog { + -webkit-transform: translate(0, 0); + -ms-transform: translate(0, 0); + transform: translate(0, 0); +} +.modal-dialog { + margin-left: auto; + margin-right: auto; + width: auto; + padding: 10px; + z-index: 1050; +} +.modal-content { + position: relative; + background-color: #ffffff; + border: 1px solid #999999; + border: 1px solid rgba(0, 0, 0, 0.2); + border-radius: 6px; + -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5); + box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5); + background-clip: padding-box; + outline: none; +} +.modal-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1030; + background-color: #000000; +} +.modal-backdrop.fade { + opacity: 0; + filter: alpha(opacity=0); +} +.modal-backdrop.in { + opacity: 0.5; + filter: alpha(opacity=50); +} +.modal-header { + padding: 15px; + border-bottom: 1px solid #e5e5e5; + min-height: 16.428571429px; +} +.modal-header .close { + margin-top: -2px; +} +.modal-title { + margin: 0; + line-height: 1.428571429; +} +.modal-body { + position: relative; + padding: 20px; +} +.modal-footer { + margin-top: 15px; + padding: 19px 20px 20px; + text-align: right; + border-top: 1px solid #e5e5e5; +} +.modal-footer:before, +.modal-footer:after { + content: " "; + /* 1 */ + + display: table; + /* 2 */ + +} +.modal-footer:after { + clear: both; +} +.modal-footer:before, +.modal-footer:after { + content: " "; + /* 1 */ + + display: table; + /* 2 */ + +} +.modal-footer:after { + clear: both; +} +.modal-footer .btn + .btn { + margin-left: 5px; + margin-bottom: 0; +} +.modal-footer .btn-group .btn + .btn { + margin-left: -1px; +} +.modal-footer .btn-block + .btn-block { + margin-left: 0; +} +@media screen and (min-width: 768px) { + .modal-dialog { + left: 50%; + right: auto; + width: 600px; + padding-top: 30px; + padding-bottom: 30px; + } + .modal-content { + -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); + box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); + } +} +.tooltip { + position: absolute; + z-index: 1030; + display: block; + visibility: visible; + font-size: 12px; + line-height: 1.4; + opacity: 0; + filter: alpha(opacity=0); +} +.tooltip.in { + opacity: 0.9; + filter: alpha(opacity=90); +} +.tooltip.top { + margin-top: -3px; + padding: 5px 0; +} +.tooltip.right { + margin-left: 3px; + padding: 0 5px; +} +.tooltip.bottom { + margin-top: 3px; + padding: 5px 0; +} +.tooltip.left { + margin-left: -3px; + padding: 0 5px; +} +.tooltip-inner { + max-width: 200px; + padding: 3px 8px; + color: #ffffff; + text-align: center; + text-decoration: none; + background-color: #000000; + border-radius: 4px; +} +.tooltip-arrow { + position: absolute; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} +.tooltip.top .tooltip-arrow { + bottom: 0; + left: 50%; + margin-left: -5px; + border-width: 5px 5px 0; + border-top-color: #000000; +} +.tooltip.top-left .tooltip-arrow { + bottom: 0; + left: 5px; + border-width: 5px 5px 0; + border-top-color: #000000; +} +.tooltip.top-right .tooltip-arrow { + bottom: 0; + right: 5px; + border-width: 5px 5px 0; + border-top-color: #000000; +} +.tooltip.right .tooltip-arrow { + top: 50%; + left: 0; + margin-top: -5px; + border-width: 5px 5px 5px 0; + border-right-color: #000000; +} +.tooltip.left .tooltip-arrow { + top: 50%; + right: 0; + margin-top: -5px; + border-width: 5px 0 5px 5px; + border-left-color: #000000; +} +.tooltip.bottom .tooltip-arrow { + top: 0; + left: 50%; + margin-left: -5px; + border-width: 0 5px 5px; + border-bottom-color: #000000; +} +.tooltip.bottom-left .tooltip-arrow { + top: 0; + left: 5px; + border-width: 0 5px 5px; + border-bottom-color: #000000; +} +.tooltip.bottom-right .tooltip-arrow { + top: 0; + right: 5px; + border-width: 0 5px 5px; + border-bottom-color: #000000; +} +.popover { + position: absolute; + top: 0; + left: 0; + z-index: 1010; + display: none; + max-width: 276px; + padding: 1px; + text-align: left; + background-color: #ffffff; + background-clip: padding-box; + border: 1px solid #cccccc; + border: 1px solid rgba(0, 0, 0, 0.2); + border-radius: 6px; + -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + white-space: normal; +} +.popover.top { + margin-top: -10px; +} +.popover.right { + margin-left: 10px; +} +.popover.bottom { + margin-top: 10px; +} +.popover.left { + margin-left: -10px; +} +.popover-title { + margin: 0; + padding: 8px 14px; + font-size: 14px; + font-weight: normal; + line-height: 18px; + background-color: #f7f7f7; + border-bottom: 1px solid #ebebeb; + border-radius: 5px 5px 0 0; +} +.popover-content { + padding: 9px 14px; +} +.popover .arrow, +.popover .arrow:after { + position: absolute; + display: block; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} +.popover .arrow { + border-width: 11px; +} +.popover .arrow:after { + border-width: 10px; + content: ""; +} +.popover.top .arrow { + left: 50%; + margin-left: -11px; + border-bottom-width: 0; + border-top-color: #999999; + border-top-color: rgba(0, 0, 0, 0.25); + bottom: -11px; +} +.popover.top .arrow:after { + content: " "; + bottom: 1px; + margin-left: -10px; + border-bottom-width: 0; + border-top-color: #ffffff; +} +.popover.right .arrow { + top: 50%; + left: -11px; + margin-top: -11px; + border-left-width: 0; + border-right-color: #999999; + border-right-color: rgba(0, 0, 0, 0.25); +} +.popover.right .arrow:after { + content: " "; + left: 1px; + bottom: -10px; + border-left-width: 0; + border-right-color: #ffffff; +} +.popover.bottom .arrow { + left: 50%; + margin-left: -11px; + border-top-width: 0; + border-bottom-color: #999999; + border-bottom-color: rgba(0, 0, 0, 0.25); + top: -11px; +} +.popover.bottom .arrow:after { + content: " "; + top: 1px; + margin-left: -10px; + border-top-width: 0; + border-bottom-color: #ffffff; +} +.popover.left .arrow { + top: 50%; + right: -11px; + margin-top: -11px; + border-right-width: 0; + border-left-color: #999999; + border-left-color: rgba(0, 0, 0, 0.25); +} +.popover.left .arrow:after { + content: " "; + right: 1px; + border-right-width: 0; + border-left-color: #ffffff; + bottom: -10px; +} +.carousel { + position: relative; +} +.carousel-inner { + position: relative; + overflow: hidden; + width: 100%; +} +.carousel-inner > .item { + display: none; + position: relative; + -webkit-transition: 0.6s ease-in-out left; + transition: 0.6s ease-in-out left; +} +.carousel-inner > .item > img, +.carousel-inner > .item > a > img { + display: block; + max-width: 100%; + height: auto; + line-height: 1; +} +.carousel-inner > .active, +.carousel-inner > .next, +.carousel-inner > .prev { + display: block; +} +.carousel-inner > .active { + left: 0; +} +.carousel-inner > .next, +.carousel-inner > .prev { + position: absolute; + top: 0; + width: 100%; +} +.carousel-inner > .next { + left: 100%; +} +.carousel-inner > .prev { + left: -100%; +} +.carousel-inner > .next.left, +.carousel-inner > .prev.right { + left: 0; +} +.carousel-inner > .active.left { + left: -100%; +} +.carousel-inner > .active.right { + left: 100%; +} +.carousel-control { + position: absolute; + top: 0; + left: 0; + bottom: 0; + width: 15%; + opacity: 0.5; + filter: alpha(opacity=50); + font-size: 20px; + color: #ffffff; + text-align: center; + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6); +} +.carousel-control.left { + background-image: -webkit-gradient(linear, 0% top, 100% top, from(rgba(0, 0, 0, 0.5)), to(rgba(0, 0, 0, 0.0001))); + background-image: -webkit-linear-gradient(left, color-stop(rgba(0, 0, 0, 0.5) 0%), color-stop(rgba(0, 0, 0, 0.0001) 100%)); + background-image: -moz-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%); + background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1); +} +.carousel-control.right { + left: auto; + right: 0; + background-image: -webkit-gradient(linear, 0% top, 100% top, from(rgba(0, 0, 0, 0.0001)), to(rgba(0, 0, 0, 0.5))); + background-image: -webkit-linear-gradient(left, color-stop(rgba(0, 0, 0, 0.0001) 0%), color-stop(rgba(0, 0, 0, 0.5) 100%)); + background-image: -moz-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%); + background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1); +} +.carousel-control:hover, +.carousel-control:focus { + color: #ffffff; + text-decoration: none; + opacity: 0.9; + filter: alpha(opacity=90); +} +.carousel-control .icon-prev, +.carousel-control .icon-next, +.carousel-control .glyphicon-chevron-left, +.carousel-control .glyphicon-chevron-right { + position: absolute; + top: 50%; + left: 50%; + z-index: 5; + display: inline-block; +} +.carousel-control .icon-prev, +.carousel-control .icon-next { + width: 20px; + height: 20px; + margin-top: -10px; + margin-left: -10px; + font-family: serif; +} +.carousel-control .icon-prev:before { + content: '\2039'; +} +.carousel-control .icon-next:before { + content: '\203a'; +} +.carousel-indicators { + position: absolute; + bottom: 10px; + left: 50%; + z-index: 15; + width: 60%; + margin-left: -30%; + padding-left: 0; + list-style: none; + text-align: center; +} +.carousel-indicators li { + display: inline-block; + width: 10px; + height: 10px; + margin: 1px; + text-indent: -999px; + border: 1px solid #ffffff; + border-radius: 10px; + cursor: pointer; +} +.carousel-indicators .active { + margin: 0; + width: 12px; + height: 12px; + background-color: #ffffff; +} +.carousel-caption { + position: absolute; + left: 15%; + right: 15%; + bottom: 20px; + z-index: 10; + padding-top: 20px; + padding-bottom: 20px; + color: #ffffff; + text-align: center; + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6); +} +.carousel-caption .btn { + text-shadow: none; +} +@media screen and (min-width: 768px) { + .carousel-control .icon-prev, + .carousel-control .icon-next { + width: 30px; + height: 30px; + margin-top: -15px; + margin-left: -15px; + font-size: 30px; + } + .carousel-caption { + left: 20%; + right: 20%; + padding-bottom: 30px; + } + .carousel-indicators { + bottom: 20px; + } +} +.clearfix:before, +.clearfix:after { + content: " "; + /* 1 */ + + display: table; + /* 2 */ + +} +.clearfix:after { + clear: both; +} +.pull-right { + float: right !important; +} +.pull-left { + float: left !important; +} +.hide { + display: none !important; +} +.show { + display: block !important; +} +.invisible { + visibility: hidden; +} +.text-hide { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} +.affix { + position: fixed; +} +@-ms-viewport { + width: device-width; +} +@media screen and (max-width: 400px) { + @-ms-viewport { + width: 320px; + } +} +.hidden { + display: none !important; + visibility: hidden !important; +} +.visible-xs { + display: none !important; +} +tr.visible-xs { + display: none !important; +} +th.visible-xs, +td.visible-xs { + display: none !important; +} +@media (max-width: 767px) { + .visible-xs { + display: block !important; + } + tr.visible-xs { + display: table-row !important; + } + th.visible-xs, + td.visible-xs { + display: table-cell !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-xs.visible-sm { + display: block !important; + } + tr.visible-xs.visible-sm { + display: table-row !important; + } + th.visible-xs.visible-sm, + td.visible-xs.visible-sm { + display: table-cell !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-xs.visible-md { + display: block !important; + } + tr.visible-xs.visible-md { + display: table-row !important; + } + th.visible-xs.visible-md, + td.visible-xs.visible-md { + display: table-cell !important; + } +} +@media (min-width: 1200px) { + .visible-xs.visible-lg { + display: block !important; + } + tr.visible-xs.visible-lg { + display: table-row !important; + } + th.visible-xs.visible-lg, + td.visible-xs.visible-lg { + display: table-cell !important; + } +} +.visible-sm { + display: none !important; +} +tr.visible-sm { + display: none !important; +} +th.visible-sm, +td.visible-sm { + display: none !important; +} +@media (max-width: 767px) { + .visible-sm.visible-xs { + display: block !important; + } + tr.visible-sm.visible-xs { + display: table-row !important; + } + th.visible-sm.visible-xs, + td.visible-sm.visible-xs { + display: table-cell !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm { + display: block !important; + } + tr.visible-sm { + display: table-row !important; + } + th.visible-sm, + td.visible-sm { + display: table-cell !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-sm.visible-md { + display: block !important; + } + tr.visible-sm.visible-md { + display: table-row !important; + } + th.visible-sm.visible-md, + td.visible-sm.visible-md { + display: table-cell !important; + } +} +@media (min-width: 1200px) { + .visible-sm.visible-lg { + display: block !important; + } + tr.visible-sm.visible-lg { + display: table-row !important; + } + th.visible-sm.visible-lg, + td.visible-sm.visible-lg { + display: table-cell !important; + } +} +.visible-md { + display: none !important; +} +tr.visible-md { + display: none !important; +} +th.visible-md, +td.visible-md { + display: none !important; +} +@media (max-width: 767px) { + .visible-md.visible-xs { + display: block !important; + } + tr.visible-md.visible-xs { + display: table-row !important; + } + th.visible-md.visible-xs, + td.visible-md.visible-xs { + display: table-cell !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-md.visible-sm { + display: block !important; + } + tr.visible-md.visible-sm { + display: table-row !important; + } + th.visible-md.visible-sm, + td.visible-md.visible-sm { + display: table-cell !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md { + display: block !important; + } + tr.visible-md { + display: table-row !important; + } + th.visible-md, + td.visible-md { + display: table-cell !important; + } +} +@media (min-width: 1200px) { + .visible-md.visible-lg { + display: block !important; + } + tr.visible-md.visible-lg { + display: table-row !important; + } + th.visible-md.visible-lg, + td.visible-md.visible-lg { + display: table-cell !important; + } +} +.visible-lg { + display: none !important; +} +tr.visible-lg { + display: none !important; +} +th.visible-lg, +td.visible-lg { + display: none !important; +} +@media (max-width: 767px) { + .visible-lg.visible-xs { + display: block !important; + } + tr.visible-lg.visible-xs { + display: table-row !important; + } + th.visible-lg.visible-xs, + td.visible-lg.visible-xs { + display: table-cell !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-lg.visible-sm { + display: block !important; + } + tr.visible-lg.visible-sm { + display: table-row !important; + } + th.visible-lg.visible-sm, + td.visible-lg.visible-sm { + display: table-cell !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-lg.visible-md { + display: block !important; + } + tr.visible-lg.visible-md { + display: table-row !important; + } + th.visible-lg.visible-md, + td.visible-lg.visible-md { + display: table-cell !important; + } +} +@media (min-width: 1200px) { + .visible-lg { + display: block !important; + } + tr.visible-lg { + display: table-row !important; + } + th.visible-lg, + td.visible-lg { + display: table-cell !important; + } +} +.hidden-xs { + display: block !important; +} +tr.hidden-xs { + display: table-row !important; +} +th.hidden-xs, +td.hidden-xs { + display: table-cell !important; +} +@media (max-width: 767px) { + .hidden-xs { + display: none !important; + } + tr.hidden-xs { + display: none !important; + } + th.hidden-xs, + td.hidden-xs { + display: none !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .hidden-xs.hidden-sm { + display: none !important; + } + tr.hidden-xs.hidden-sm { + display: none !important; + } + th.hidden-xs.hidden-sm, + td.hidden-xs.hidden-sm { + display: none !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .hidden-xs.hidden-md { + display: none !important; + } + tr.hidden-xs.hidden-md { + display: none !important; + } + th.hidden-xs.hidden-md, + td.hidden-xs.hidden-md { + display: none !important; + } +} +@media (min-width: 1200px) { + .hidden-xs.hidden-lg { + display: none !important; + } + tr.hidden-xs.hidden-lg { + display: none !important; + } + th.hidden-xs.hidden-lg, + td.hidden-xs.hidden-lg { + display: none !important; + } +} +.hidden-sm { + display: block !important; +} +tr.hidden-sm { + display: table-row !important; +} +th.hidden-sm, +td.hidden-sm { + display: table-cell !important; +} +@media (max-width: 767px) { + .hidden-sm.hidden-xs { + display: none !important; + } + tr.hidden-sm.hidden-xs { + display: none !important; + } + th.hidden-sm.hidden-xs, + td.hidden-sm.hidden-xs { + display: none !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .hidden-sm { + display: none !important; + } + tr.hidden-sm { + display: none !important; + } + th.hidden-sm, + td.hidden-sm { + display: none !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .hidden-sm.hidden-md { + display: none !important; + } + tr.hidden-sm.hidden-md { + display: none !important; + } + th.hidden-sm.hidden-md, + td.hidden-sm.hidden-md { + display: none !important; + } +} +@media (min-width: 1200px) { + .hidden-sm.hidden-lg { + display: none !important; + } + tr.hidden-sm.hidden-lg { + display: none !important; + } + th.hidden-sm.hidden-lg, + td.hidden-sm.hidden-lg { + display: none !important; + } +} +.hidden-md { + display: block !important; +} +tr.hidden-md { + display: table-row !important; +} +th.hidden-md, +td.hidden-md { + display: table-cell !important; +} +@media (max-width: 767px) { + .hidden-md.hidden-xs { + display: none !important; + } + tr.hidden-md.hidden-xs { + display: none !important; + } + th.hidden-md.hidden-xs, + td.hidden-md.hidden-xs { + display: none !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .hidden-md.hidden-sm { + display: none !important; + } + tr.hidden-md.hidden-sm { + display: none !important; + } + th.hidden-md.hidden-sm, + td.hidden-md.hidden-sm { + display: none !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .hidden-md { + display: none !important; + } + tr.hidden-md { + display: none !important; + } + th.hidden-md, + td.hidden-md { + display: none !important; + } +} +@media (min-width: 1200px) { + .hidden-md.hidden-lg { + display: none !important; + } + tr.hidden-md.hidden-lg { + display: none !important; + } + th.hidden-md.hidden-lg, + td.hidden-md.hidden-lg { + display: none !important; + } +} +.hidden-lg { + display: block !important; +} +tr.hidden-lg { + display: table-row !important; +} +th.hidden-lg, +td.hidden-lg { + display: table-cell !important; +} +@media (max-width: 767px) { + .hidden-lg.hidden-xs { + display: none !important; + } + tr.hidden-lg.hidden-xs { + display: none !important; + } + th.hidden-lg.hidden-xs, + td.hidden-lg.hidden-xs { + display: none !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .hidden-lg.hidden-sm { + display: none !important; + } + tr.hidden-lg.hidden-sm { + display: none !important; + } + th.hidden-lg.hidden-sm, + td.hidden-lg.hidden-sm { + display: none !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .hidden-lg.hidden-md { + display: none !important; + } + tr.hidden-lg.hidden-md { + display: none !important; + } + th.hidden-lg.hidden-md, + td.hidden-lg.hidden-md { + display: none !important; + } +} +@media (min-width: 1200px) { + .hidden-lg { + display: none !important; + } + tr.hidden-lg { + display: none !important; + } + th.hidden-lg, + td.hidden-lg { + display: none !important; + } +} +.visible-print { + display: none !important; +} +tr.visible-print { + display: none !important; +} +th.visible-print, +td.visible-print { + display: none !important; +} +@media print { + .visible-print { + display: block !important; + } + tr.visible-print { + display: table-row !important; + } + th.visible-print, + td.visible-print { + display: table-cell !important; + } + .hidden-print { + display: none !important; + } + tr.hidden-print { + display: none !important; + } + th.hidden-print, + td.hidden-print { + display: none !important; + } +} diff --git a/docs/css/modern-business.css b/docs/css/modern-business.css new file mode 100755 index 000000000..58dc4a2d6 --- /dev/null +++ b/docs/css/modern-business.css @@ -0,0 +1,93 @@ +/*! + * Start Bootstrap - Modern Business HTML Template (http://startbootstrap.com) + * Code licensed under the Apache License v2.0. + * For details, see http://www.apache.org/licenses/LICENSE-2.0. + */ + +/* Global Styles */ + +html, +body { + height: 100%; +} + +body { + padding-top: 50px; /* Required padding for .navbar-fixed-top. Remove if using .navbar-static-top. Change if height of navigation changes. */ +} + +.img-portfolio { + margin-bottom: 30px; +} + +.img-hover:hover { + opacity: 0.8; +} + +/* Home Page Carousel */ + +header.carousel { + height: 50%; +} + +header.carousel .item, +header.carousel .item.active, +header.carousel .carousel-inner { + height: 100%; +} + +header.carousel .fill { + width: 100%; + height: 100%; + background-position: center; + background-size: cover; +} + +/* 404 Page Styles */ + +.error-404 { + font-size: 100px; +} + +/* Pricing Page Styles */ + +.price { + display: block; + font-size: 50px; + line-height: 50px; +} + +.price sup { + top: -20px; + left: 2px; + font-size: 20px; +} + +.period { + display: block; + font-style: italic; +} + +/* Footer Styles */ + +footer { + margin: 50px 0; +} + +/* Responsive Styles */ + +@media(max-width:991px) { + .client-img, + .img-related { + margin-bottom: 30px; + } +} + +@media(max-width:767px) { + .img-portfolio { + margin-bottom: 15px; + } + + header.carousel .carousel { + height: 70%; + } +} \ No newline at end of file diff --git a/docs/css/printstyles.css b/docs/css/printstyles.css new file mode 100644 index 000000000..5e55e5765 --- /dev/null +++ b/docs/css/printstyles.css @@ -0,0 +1,160 @@ + +/*body.print .container {max-width: 650px;}*/ + +body { + font-size:14px; +} +.nav ul li a {border-top:0px; background-color:transparent; color: #808080; } +#navig a[href] {color: #595959 !important;} +table .table {max-width:650px;} + +#navig li.sectionHead {font-weight: bold; font-size: 18px; color: #595959 !important; } +#navig li {font-weight: normal; } + +#navig a[href]::after { content: leader(".") target-counter(attr(href), page); } + +a[href]::after { + content: " (page " target-counter(attr(href), page) ")" +} + +a[href^="http:"]::after, a[href^="https:"]::after { + content: " (" attr(href) ")"; +} + +a[href] { + color: blue !important; +} +a[href*="mailto"]::after, a[data-toggle="tooltip"]::after, a[href].noCrossRef::after { + content: ""; +} + + +@page { + margin: 60pt 90pt 60pt 90pt; + font-family: sans-serif; + font-style:none; + color: gray; + +} + +.printTitle { + line-height:30pt; + font-size:27pt; + font-weight: bold; + letter-spacing: -.5px; + margin-bottom:25px; +} + +.printSubtitle { + font-size: 19pt; + color: #cccccc !important; + front-family: "Grotesque MT Light"; + line-height: 22pt; + letter-spacing: -.5px; + margin-bottom:20px; +} +.printTitleArea hr { + color: #999999 !important; + height: 2px; + width: 100%; +} + +.printTitleImage { + max-width:300px; + margin-bottom:200px; +} + + +.printTitleImage { + max-width: 250px; +} + +#navig { + /*page-break-before: always;*/ +} + +.copyrightBoilerplate { + page-break-before:always; + font-size:14px; +} + +.lastGeneratedDate { + font-style: italic; + font-size:14px; + color: gray; +} + +.alert a { + text-decoration: none !important; +} + + +body.title { page: title } + +@page title { + @top-left { + content: " "; + } + @top-right { + content: " " + } + @bottom-right { + content: " "; + } + @bottom-left { + content: " "; + } +} + +body.frontmatter { page: frontmatter } +body.frontmatter {counter-reset: page 1} + + +@page frontmatter { + @top-left { + content: prince-script(guideName); + } + @top-right { + content: prince-script(datestamp); + } + @bottom-right { + content: counter(page, lower-roman); + } + @bottom-left { + content: "youremail@domain.com"; } +} + +body.first_page {counter-reset: page 1} + +h1 { string-set: doctitle content() } + +@page { + @top-left { + content: string(doctitle); + font-size: 11px; + font-style: italic; + } + @top-right { + content: prince-script(datestamp); + font-size: 11px; + } + + @bottom-right { + content: "Page " counter(page); + font-size: 11px; + } + @bottom-left { + content: prince-script(guideName); + font-size: 11px; + } +} +.alert { + background-color: #fafafa !important; + border-color: #dedede !important; + color: black; +} + +pre { + background-color: #fafafa; +} + diff --git a/docs/css/syntax.css b/docs/css/syntax.css new file mode 100644 index 000000000..1e651cf79 --- /dev/null +++ b/docs/css/syntax.css @@ -0,0 +1,60 @@ +.highlight { background: #ffffff; } +.highlight .c { color: #999988; font-style: italic } /* Comment */ +.highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */ +.highlight .k { font-weight: bold } /* Keyword */ +.highlight .o { font-weight: bold } /* Operator */ +.highlight .cm { color: #999988; font-style: italic } /* Comment.Multiline */ +.highlight .cp { color: #999999; font-weight: bold } /* Comment.Preproc */ +.highlight .c1 { color: #999988; font-style: italic } /* Comment.Single */ +.highlight .cs { color: #999999; font-weight: bold; font-style: italic } /* Comment.Special */ +.highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */ +.highlight .gd .x { color: #000000; background-color: #ffaaaa } /* Generic.Deleted.Specific */ +.highlight .ge { font-style: italic } /* Generic.Emph */ +.highlight .gr { color: #aa0000 } /* Generic.Error */ +.highlight .gh { color: #999999 } /* Generic.Heading */ +.highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */ +.highlight .gi .x { color: #000000; background-color: #aaffaa } /* Generic.Inserted.Specific */ +.highlight .go { color: #888888 } /* Generic.Output */ +.highlight .gp { color: #555555 } /* Generic.Prompt */ +.highlight .gs { font-weight: bold } /* Generic.Strong */ +.highlight .gu { color: #aaaaaa } /* Generic.Subheading */ +.highlight .gt { color: #aa0000 } /* Generic.Traceback */ +.highlight .kc { font-weight: bold } /* Keyword.Constant */ +.highlight .kd { font-weight: bold } /* Keyword.Declaration */ +.highlight .kp { font-weight: bold } /* Keyword.Pseudo */ +.highlight .kr { font-weight: bold } /* Keyword.Reserved */ +.highlight .kt { color: #445588; font-weight: bold } /* Keyword.Type */ +.highlight .m { color: #009999 } /* Literal.Number */ +.highlight .s { color: #d14 } /* Literal.String */ +.highlight .na { color: #008080 } /* Name.Attribute */ +.highlight .nb { color: #0086B3 } /* Name.Builtin */ +.highlight .nc { color: #445588; font-weight: bold } /* Name.Class */ +.highlight .no { color: #008080 } /* Name.Constant */ +.highlight .ni { color: #800080 } /* Name.Entity */ +.highlight .ne { color: #990000; font-weight: bold } /* Name.Exception */ +.highlight .nf { color: #990000; font-weight: bold } /* Name.Function */ +.highlight .nn { color: #555555 } /* Name.Namespace */ +.highlight .nt { color: #000080 } /* Name.Tag */ +.highlight .nv { color: #008080 } /* Name.Variable */ +.highlight .ow { font-weight: bold } /* Operator.Word */ +.highlight .w { color: #bbbbbb } /* Text.Whitespace */ +.highlight .mf { color: #009999 } /* Literal.Number.Float */ +.highlight .mh { color: #009999 } /* Literal.Number.Hex */ +.highlight .mi { color: #009999 } /* Literal.Number.Integer */ +.highlight .mo { color: #009999 } /* Literal.Number.Oct */ +.highlight .sb { color: #d14 } /* Literal.String.Backtick */ +.highlight .sc { color: #d14 } /* Literal.String.Char */ +.highlight .sd { color: #d14 } /* Literal.String.Doc */ +.highlight .s2 { color: #d14 } /* Literal.String.Double */ +.highlight .se { color: #d14 } /* Literal.String.Escape */ +.highlight .sh { color: #d14 } /* Literal.String.Heredoc */ +.highlight .si { color: #d14 } /* Literal.String.Interpol */ +.highlight .sx { color: #d14 } /* Literal.String.Other */ +.highlight .sr { color: #009926 } /* Literal.String.Regex */ +.highlight .s1 { color: #d14 } /* Literal.String.Single */ +.highlight .ss { color: #990073 } /* Literal.String.Symbol */ +.highlight .bp { color: #999999 } /* Name.Builtin.Pseudo */ +.highlight .vc { color: #008080 } /* Name.Variable.Class */ +.highlight .vg { color: #008080 } /* Name.Variable.Global */ +.highlight .vi { color: #008080 } /* Name.Variable.Instance */ +.highlight .il { color: #009999 } /* Literal.Number.Integer.Long */ \ No newline at end of file diff --git a/docs/css/theme-blue.css b/docs/css/theme-blue.css new file mode 100644 index 000000000..64cc6c387 --- /dev/null +++ b/docs/css/theme-blue.css @@ -0,0 +1,103 @@ +.summary { + color: #808080; + border-left: 5px solid #ED1951; + font-size:16px; +} + + +h3 {color: #ED1951; } +h4 {color: #808080; } + +.nav-tabs > li.active > a, .nav-tabs > li.active > a:hover, .nav-tabs > li.active > a:focus { + background-color: #248ec2; + color: white; +} + +.nav > li.active > a { + background-color: #347DBE; +} + +.nav > li > a:hover { + background-color: #248ec2; +} + +div.navbar-collapse .dropdown-menu > li > a:hover { + background-color: #347DBE; +} + +.nav li.thirdlevel > a { + background-color: #FAFAFA !important; + color: #248EC2; + font-weight: bold; +} + +a[data-toggle="tooltip"] { + color: #649345; + font-style: italic; + cursor: default; +} + +.navbar-inverse { + background-color: #347DBE; + border-color: #015CAE; +} + +.navbar-inverse .navbar-nav > .open > a, .navbar-inverse .navbar-nav > .open > a:hover, .navbar-inverse .navbar-nav > .open > a:focus { + color: #015CAE; +} + +.navbar-inverse .navbar-nav > .open > a, .navbar-inverse .navbar-nav > .open > a:hover, .navbar-inverse .navbar-nav > .open > a:focus { + background-color: #015CAE; + color: #ffffff; +} + +/* not sure if using this ...*/ +.navbar-inverse .navbar-collapse, .navbar-inverse .navbar-form { + border-color: #248ec2 !important; +} + +.btn-primary { + color: #ffffff; + background-color: #347DBE; + border-color: #347DBE; +} + +.navbar-inverse .navbar-nav > .active > a, .navbar-inverse .navbar-nav > .active > a:hover, .navbar-inverse .navbar-nav > .active > a:focus { + background-color: #347DBE; +} + +.btn-primary:hover, +.btn-primary:focus, +.btn-primary:active, +.btn-primary.active, +.open .dropdown-toggle.btn-primary { + background-color: #248ec2; + border-color: #347DBE; +} + +.printTitle { + color: #015CAE !important; +} + +body.print h1 {color: #015CAE !important; font-size:28px !important;} +body.print h2 {color: #595959 !important; font-size:20px !important;} +body.print h3 {color: #E50E51 !important; font-size:14px !important;} +body.print h4 {color: #679DCE !important; font-size:14px; font-style: italic !important;} + +.anchorjs-link:hover { + color: #216f9b; +} + +div.sidebarTitle { + color: #015CAE; +} + +li.sidebarTitle { + margin-top:40px; + font-weight:normal; + font-size:130%; + color: #ED1951; + margin-bottom:10px; + margin-left: 5px; + +} \ No newline at end of file diff --git a/docs/css/theme-green.css b/docs/css/theme-green.css new file mode 100644 index 000000000..f6b0d8b1e --- /dev/null +++ b/docs/css/theme-green.css @@ -0,0 +1,99 @@ +.summary { + color: #808080; + border-left: 5px solid #E50E51; + font-size:16px; +} + + +h3 {color: #E50E51; } +h4 {color: #808080; } + +.nav-tabs > li.active > a, .nav-tabs > li.active > a:hover, .nav-tabs > li.active > a:focus { + background-color: #248ec2; + color: white; +} + +.nav > li.active > a { + background-color: #72ac4a; +} + +.nav > li > a:hover { + background-color: #72ac4a; +} + +div.navbar-collapse .dropdown-menu > li > a:hover { + background-color: #72ac4a; +} + +.nav li.thirdlevel > a { + background-color: #FAFAFA !important; + color: #72ac4a; + font-weight: bold; +} + +a[data-toggle="tooltip"] { + color: #649345; + font-style: italic; + cursor: default; +} + +.navbar-inverse { + background-color: #72ac4a; + border-color: #5b893c; +} + +.navbar-inverse .navbar-nav > .open > a, .navbar-inverse .navbar-nav > .open > a:hover, .navbar-inverse .navbar-nav > .open > a:focus { + color: #5b893c; +} + +.navbar-inverse .navbar-nav > .open > a, .navbar-inverse .navbar-nav > .open > a:hover, .navbar-inverse .navbar-nav > .open > a:focus { + background-color: #5b893c; + color: #ffffff; +} + +/* not sure if using this ...*/ +.navbar-inverse .navbar-collapse, .navbar-inverse .navbar-form { + border-color: #72ac4a !important; +} + +.btn-primary { + color: #ffffff; + background-color: #5b893c; + border-color: #5b893c; +} + +.btn-primary:hover, +.btn-primary:focus, +.btn-primary:active, +.btn-primary.active, +.open .dropdown-toggle.btn-primary { + background-color: #72ac4a; + border-color: #5b893c; +} + +.printTitle { + color: #5b893c !important; +} + +body.print h1 {color: #5b893c !important; font-size:28px;} +body.print h2 {color: #595959 !important; font-size:24px;} +body.print h3 {color: #E50E51 !important; font-size:14px;} +body.print h4 {color: #679DCE !important; font-size:14px; font-style: italic;} + +.anchorjs-link:hover { + color: #4f7233; +} + +div.sidebarTitle { + color: #E50E51; +} + +li.sidebarTitle { + margin-top:40px; + font-weight:normal; + font-size:130%; + color: #ED1951; + margin-bottom:10px; + margin-left: 5px; + +} \ No newline at end of file diff --git a/docs/feed.xml b/docs/feed.xml new file mode 100644 index 000000000..d8d6ac999 --- /dev/null +++ b/docs/feed.xml @@ -0,0 +1,32 @@ +--- +search: exclude +layout: none +--- + + + + + {{ site.title | xml_escape }} + {{ site.description | xml_escape }} + {{ site.url }}/ + + {{ site.time | date_to_rfc822 }} + {{ site.time | date_to_rfc822 }} + Jekyll v{{ jekyll.version }} + {% for post in site.posts limit:10 %} + + {{ post.title | xml_escape }} + {{ post.content | xml_escape }} + {{ post.date | date_to_rfc822 }} + {{ post.url | prepend: site.url }} + {{ post.url | prepend: site.url }} + {% for tag in post.tags %} + {{ tag | xml_escape }} + {% endfor %} + {% for tag in page.tags %} + {{ cat | xml_escape }} + {% endfor %} + + {% endfor %} + + diff --git a/docs/fonts/FontAwesome.otf b/docs/fonts/FontAwesome.otf new file mode 100644 index 0000000000000000000000000000000000000000..81c9ad949b47f64afeca5642ee2494b6e3147f44 GIT binary patch literal 85908 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 uQr82 literal 0 HcmV?d00001 diff --git a/docs/fonts/fontawesome-webfont.eot b/docs/fonts/fontawesome-webfont.eot new file mode 100644 index 0000000000000000000000000000000000000000..84677bc0c5f37f1fac9d87548c4554b5c91717cf GIT binary patch literal 56006 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�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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/fonts/fontawesome-webfont.ttf b/docs/fonts/fontawesome-webfont.ttf new file mode 100644 index 0000000000000000000000000000000000000000..96a3639cdde5e8ab459c6380e3b9524ee81641dc GIT binary patch literal 112160 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 zÄ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 V*eEM;|ho{trTA6=?tf literal 0 HcmV?d00001 diff --git a/docs/fonts/fontawesome-webfont.woff b/docs/fonts/fontawesome-webfont.woff new file mode 100644 index 0000000000000000000000000000000000000000..628b6a52a87e62c6f22426e17c01f6a303aa194e GIT binary patch literal 65452 zcmY(Kb8seKu=lgEZQI5M8{4*R+qO3w+qP|QoF}&JWb?#te)qlq+*9?P?*2@l(`V+) zRLxA)cqoXAgZu#bZeP_Ph~MT%EAju2|6~8RiHobseJ6;1Q~dvA(L|FYAu1;R%?!U| zqHhs{GJt?9s4%g9v%v3||67JJpx&}3c1Dihtp8gQARwTPfIro`7Dg`L3=H}^=YRC| z1p;Pa>t+7UkU>CBe}epo>y}d{jX(XA|`IYIv?s|Nbj2?1Vge;#o!iuHeDYP&C(C2!&kG({8y)`YUF6A1zXWm_MkU z9{RT>3d5k9j1x`}mgT(saZ_{5ai2-B;v6OPYj}pyu8BXhh^RcSMIwAxl9Rc@=*cDP zy?YzAxIOC?^#V=GX|Vn2@?+-4u@V<5j9B$_5RjZ)DN06JIq7#cdNKKla!Po!88ngb zsxZ0}`EOxJZgj;#j!Mh?IHR!@iW<9xNJmzZIV?~Z8BOCPWSNDely3AAdW;Gw8F29M zD1za{z%cg4@uEmp+VTR3v$@Fpo2LeT0F<}E&Dqwn?L&dr+Ue5UQ&krN;yn-4>TFf_ z;NR}ynC||EOJk~EtA@(j2uoeK<-Oi2b?0JyRk`PtR8QqRu+qnmK<@y$ArZ9Lz51Ag zE~EF!uY8(>fc2iA2MF({jvv-HP?NKnU;i!FkMHXb)N{SN2gX-*X^q)`mfIu4?|3GM z;m?FAWfNr(`4ny=q7l`PHE{6Z$Ujo;rXSSFBB>Ti`=7BeDXcIG@>?aCg z_OR1hK0dj#BB3}0M;io^9SUe!Yvd+P{HKWSQlAwdU=K&$S9;vVZP!Us5|L6Dkp_oh6~7>!Qo&w}WS(oFI03>1c6}O68cHc5#g9tSgF1q2IV` zj{O5YM!b+^Z7;ZCW?Zj5tRFv8K4RnO-$M@9yhvk)Ez;!V`eCsd49zjB3N{Z z69&?LG!XVGMdoSoWZA(QXl6?Nrvi-eGsSG{x^+0T^I}dHHmInH+zzAh(!-3V-&;kww_^5_5xPaN~78`Tga08ly^mI_u(` zngGvE()LvO7|n7h%-#BR-RmRaJ=7}0l!@aY&pBk^dn}e_zajXUKhihhB;Hv{u3d*= zZGYt5@z5UAZqu%}>9>it+2@j-C@+?!6rve{Un>u8=!Ynfq@o1*RALr5Iu5>BT_ZF-*QB+g1LmJ)Nl+Q%;F8FI=y?6Wnq+&M zP=fmv-|fJ+r7k^>_qwR8+Pw(GWdZ8dYeWm*EeS?sHY2~18KeN_WdG|~3wT;YD>wxW zM~3X4nZ;YX{=pQ#lwJ_nbRj-Nx;+u_+a(BT242e6Qj9wDT+C7WbWbT^_?O=ZjmHb- z+qE*%i!UIk5a@qS6`(g&=<87+2e^5t=<7!c#G34Royvpw6%YvLq`PV)W-KC`V7WH0 zsxHv#nCR6f-DlEXhtU)6-WYPRV3T|;gZx^1`0+o}R z_>(iIo?(b=uTsPjxd8QeL@wOxF58$;eJZdO9t@WC96u!Csf=o9?DkfRyW-(lO>+Gq z>y=7qq4Lf2Xj6AXOYv=f-GF{h+v)nCC9~z3tgYGgI>xnw!`Uht$LKebpv?k}&(8zr zF3}0l8VhU?eBTC4aA47fS(#63tB4A(&k4+v$N86ffQRwPZ?I_%093Wy1t-&*$9v1c zTdJ-8jwu4b!J5ahIGt#f3nYN+izd_g1m^G!prN><_Cv;H5hDnqZl@h3Nu)N8v$vPn zQB0+Y!ZGEQRbSB*kKG)P{T+>#YyY&jUyOFQ@Q0M>@_Vx%+RJ>$d-j%c{puRnkwC6b z{bjvD87tM~z(bwb@hBj!7O#K_u0ZItt}I<5KX?AckbQJ%S3wLVR$Oqm+%!6GY*mN{UUcC>$`&AuLpTDIgSQEsWZ`lGN zg?tFr{>$}#uHX+aar%*C1SQjAZe{z1RqLOeRZB)mr-4rPIA_frVaSqkHwWce^}}UL z>X%vTS}c>M^*$Sd_YD|hlb7wj&y#x7Su3;5Ws9)!Wg!Q?u*S#w;b5;UdBfx(hv@Z^ z!CC8e%I(B)-FkM`)93{&WYff{uF9Wu^_U#<)YcNSSJXcfhKM^BtGYR>^?VggmQfqN zs}nQvsEkzul2n|3x^#y`DlN3QA`E`KuI!b$+8_xFVQ=MA!@w`lLd%qQmo~-rhOwAh zL~acpqZ3-9diaw&G@vGtsmnMaW2}>hyvl`$);8!st~|wo@NfdRJ$my z8&d_*GB?WZGrmrwNkD=eA3^sSW)Yfvh#>Q_)?bd={TSsiQ zE~|f+sB!iIU;5Nd(`B@$8Z zA5@?oq2b*l0HnOi>b#>%M#{gcagD~XqsOmo<9L`b{3jmP-c?Rx@!r0TgE@+=w%*hQQq&G%K`~4Blp!*>yMh^+5#+F zOr1fBQdU0C9gnQY$pT#ph!+*jcgHm}5kz;!J3Ssun$IB<9YgK_rVt)7_ZhkqBQ<7y z+BY6N>qK)m5pWZ0`XLPxjN3CFYj>YUGF}S)B_4()ksyh}NXj>huSX=fGbTz{ohZii z{4)*tSZXYu%wfn6Hv5u6xLp85Z)$bO9PoP0$z>%VQ6`_86l=HdSCsZKdZ~%caBriV zm(d_{mO@Vunx{A8vjW*m4uKImpe>;GA%Ji+l*E0V&mqV=Z-?u_bkHzJzF5lUGtqE) zYTOJBWEV*W?q|lAHtRkjL5Sb=cCGIr{f%?8mRC|NsAUOQnVUjeo9*@Sdj_~bX>IaL`^fZ=)!Op|Xi?W}_h}Hp61n0;bhmcp8 ze_)=@pR5PM`GJY0#*k>}5X?;}M7BaKsN{~G5L*M|)a<4hcAV~XjLwj5B*F5SUGjr) zZhE24p3LWb5O`|Sc?eca6JCqq0xP@tEXa?!)S7=bO6R6$A7<|8m z)cGo#X|&d2jOX>y5jZrNcWo!Y`EJl24bwz>gH0*Xc(XqO*PYOnvrIeucS3d;$P6|V zX3}gi5A^vK^h*41nu^NTg^F!^35a!f0ok0m2`|rA35JYt6bT)tC~3!~yo|~;HE2EMIU8Msmfg9kz5<=k z#h+%O0DZQ-a#HhW!6{{zId4ZXH^2jY6STl0t%`z=5XDn{n%iIIW{}?CG*F2q4_Ao@ z2ymJoU9TloOkHyG(UGOeJ$?`Nee%748ssqZh(tf17LcY;SxXXExhQ2tfZQb0?i^Pv zyC340XXp2}k2T(=Bzq)m0Xk@ckaswN8Og|Wbl6_fHQI}s$`ig03qd{lZ3Db^e}|u! zM=ISXba{-a+8nfrW5$N}pLgfzqHCLn`a>i&1M~?~3AkQ;HqE58vsvMDAoq3^eL8Ce5{dewN>}{_zU?dw0adi&BS~3w!Vbv6h%$d!lh;O zC^ z1Ok7J?U%dVhCuw5H(Ir>UsO^^c!0H54`<0oVScO>HH>~?99z-#(TFoHa&fRsS9{KW zWqXP_pUthxT5=rPoNrh2(KB#y-C~JVwgf2&zv+LA=jUQ*w{1IISUcsS~K>!=Qxz6W+v^`30(cp0<84M|*m6Kyu0{H8b8oz7l% zkKhPFg}S7&1`ULg6S9EZY9#)xM}cl0qJn3fJQF_);ikOX{42{Tm5S zvbakPm$S(8NYPs)(ie7IX@ugU5!ve4EPir3#-$W~4ZC1WSOC#w6gy+`J9Lep7bd>_ zUC{~|J7XTquS|}UHj0;(_7qO1*p0 z8sSu`Q!@Y9FJfs|nQEC5-=tIXG2Z+=mNa5k52i^`38@a+K2NXBlHMv^0Ta`q!8c#R zw8&lAVal@8+(I%?O8$M@{olh6M*3DqzY$GhWB?Q9BPg*iihx)F&HB}nPj24l!QT=# zapEBsP+rZ9MItKX_C+gc(bs3c%`#=9VBhe4}}?ezA<7Nbhrd9 z;it#tB(-cmBlj2(UNHyoQM)$^I}`O!ZqH?Z8&;2oi5BiO8XksUHPy7Pb3f_d(`k&K z*X1)<7wiMBU5GHHJw~YamfJyM5lSr_3xXiBSKj^G*sxiVC)>;qon()P&Bl9(PyLp6|QMuf!ZagMtH0D7>CS{)*nC;21M?Jc8m;oJ+@mSi+tpLe9Oz{ zbGhB-s^OJv&7mbv3m$4meoR(#UE;;&?bR|&Kw7f9B-(@$Dzd=$7s-tGQ-i7*X`}$> zezJbej>UhxVB?fhFIMpSAyTCvSWT61Qcvt36}_9Xdd5}isfxJj4YUv;jSS+Rt z76VYw2iykmlx9}D8LRGHbx#LpitzuKF$|Hi_;rsE{0rb=qxs=d^C8i(lixLXBV42#@MJLF+Y=jJT2@BY(EN z6zseAW7pO-M=f_=yO*7hH7`san9jWERl$b?NZ`Sa_&$?{$|><*M(2 zuPV#$Y1w38c7aJ#>w+n|z+MMbZ3QchLKgxBO2AH0&j&!N7$I{D!B4T{TaeeGI+3~v z+|zeh9Yws1VEgJt`VsSftE8j4ppWAGwi!s&!!&?fCurm0*|k7o)YrXw*_FUq^e~(m zd=66*eZ7(^)_@)F>=B%7 z_(7)eBHDo8xXWCBZp}6Zk6t~L;2-(I3S@UGrRyi;<8HWJ`|_2`EoH(;_lNUkOOf6> zHrgm$d%92LLGl7uxL2FaCUI$ztKus0a#3>#W02Hn15_Evml>$Ji3F-r1Btg5s7x6I zBoBdWJO1M_cquh37kj~TWc_P!1@)m`VcZqIE6aW>)YcN14a>N2+t>1l#?Lbp`gWKx zwFNZtIh2DqB+k#R(zu#kPB$}`?v=kMje3+#YQ$vtDAmVz1-u9t?gQy2!$pEiiA>oc zQ>3Ha_2fQWDSk&2UT8=ib{Bm+FIuEaXT=Z?sixp6HS^7WWOxrM7RD;9!)w>%88j>w z?fjum<@}e~%!!MhwI)EEOY^Hfmp(=(r5h+&Wl?&mmTdDR3Q&`3@t(4Dg+pm4dJ3f3 z!SehGvlGWp0qZu(TFLtoceXsmRDcoxyTF|Ni^=O)YnOL()!3^6;n^3J9e>-KN$ZOU z(DlF}{>TML6`X|>BcQQ^QkIUR{cA!b6sR&q2D0xHokefX`s`T3?)o7*^Se(i`#rP( z&BEmQ)*`NAG^Er6pGFQ8>w}Xd#F>S`+fB1h;z!R&HT3RR;FF@M9QSmtuYI=KN*d!NHN@S^Aef5tJ1aj>a6Q9D2OpCgVODzjiPsEhwYf7fWaP z9d-t<6JM5qxKPTQDrNNrvN1koR7{3ki~Cch$wo}a)mXgUSlHFroRCk=1bz{GA*Gh$ z+(6M$y2(bKI25{2?VNIwIGiSzz>2U$(gI}$c%rHmIGEPROn7wBwG+Kv_6}>a*55bf$nGJ(2A2Qok4(|{cLsZ}6z!fgj zSS>A!^ATYkB;qSWB!)6vAFrT`*R!ca7&9k#3oCld5aZG3kO}1_;tLDPisl7Iq=8g* z6MpSu&fN5o_iTl+XL9U65L~It`7JMUR&3OeAm`B^=`)3;oiR4mT*T!eisp$?PITQ+ z<&+fSf72+H4|{@jmEpQ@PxDFMWQ>O#*cU^-WV^qGeqCJph{S2k!a(GEP~Tus6QIWY zWKQ0OiJKKY<>NNfL?s464eUp0gL6StJ-L_So%7-kq?h}#yl?^I^Iqi+9r%5v$%y`FJ zYk0a{7Mg-EeUjoPE^?EJw<9uAly~mIp(81^!tC1M80=33i9B;z1`@-fLoFHkUunB} z);O>vo?9YETM-S1Npp`7^;V}eerU#-{wcs#0)z@KKW$luE87Cq+}feVjCQoqH7`Px zF*Qc>wtjQERE_;zlb5kPW#`MS^btQ}Zj+h6X6#a;CXR}Zsqv<@+aa6Zz@Wqd*TcL& zVsy5ciuN$-653S0&e=L?p_%bm;??;OIlsGTQ=qUXaA3pMUCa_rVgq!XX8O%K;07}c zRrSlqi&!^oDvapTdEx<`nG7`G%@gFxBpk}UR+%zkyPhj&JK|Ptt=fGZ72cYULSoXU zPa`{4A;F}Sk9u!{JM7JrL+(WvrMo=;4KL)#&R_43Npr=!x3LyMvZ0L4R1DBZ#|y;1 zuP&Y_rFrve4B<%u&u{qLUwX!9!DptfiuBi9kb0=Dm39mm)OTv;Lt!MgC z!(Otrcr389q8j5T2f<=%&|P_k?`dQ>Ek+Y)4d&Tiiivv$oyjz>Ex0HkxM=f*r=*Ai zv41Q~X2b5UQv8T3m46Mi6fHuDAbRmUOKE6Py8|iLR}8<)&tGeBa#ok;{zD<4)U98# zT5wWDe)Kf>6g}ZXd%{5j#ONt#?~HW;8|_&yuUf#eA~g6UU#b_)sMf5wy5zZ|i+--o z{6%R6O8(O;hM=0^mrQqUCd_(LC7@fjN{ec)tZ;4}d@HnN;4~g{_SL(oUS?HE~uL zS{>D3hqDtYeYNxyU*n`JX4_i;i2_5~FU2rMvtHV74yHB@T{FfCYl8kSRHL#KLV*FP zp$+IGhe&(Q2c}@hOT_&E9iR&2GnCCH>|&p|Tksdbo@ zE7#CqCo^B;RS>Otcqj6!Y3_^7xJX7NuhA{j*4p!oJ|r?DV8V_@W3CUSSu9S3rY-)m zs7;`ztgG2iui2F^fMwP%qfT$|2FV(BHgfS3^0v87rI3F1fEPDu-sI8w@Bs>=U3acGS|Nt5=SU|oAW zGZd+;5!hb#frzn1gv8}Jw^8)hy@;R$uW**%Y2hU@sIc!WZ$EkN> zbh&6>1Yh6vGp|!g`?w{)ktYNb9=K=(CdOXeV_ON#*yGT{H6dCjP43p76Z2Qyi6D>9 zYdV%g{A>K<6Cq9VuP(vih8n+_wI?r{P!cX$&65$6oPq{a^uzzKwmkBYIF1SIE~PoK zPFWmjQhh;~pE~4gQ_Yn`4};5@LPuVM5GEE$a7Ci$S!|nsuv=m~epBLL48qX9aWe&k z-R%CdB(Q-sgM@Nm#!6Zssg>p5V6dc>1}eq*Ff855?+jT;r_UcDEA<{syolJR8_Y9b z=MhpAg*Woq75jBBj`N32N2O0{s~&u`1h{`-6$w=}7LPt;#5&-&p-{FCnN-~U%ZZN^ zh!cVf=_&pSKjgkfUcG~tom|Q)aAAmC_R1Twrhur*7T1u0t79_wMAW`q2VszL z03AH|5lowrS6?b$b)EvM`bt0*>M5FwIyLUD$vn_&u&Q})KhkauR`9XCZlwTKy@j9Q zQW~#HP?bfD-iXID#RUi-%*qr!BtN@w4H#-zmeYAKjU$(0RaqiP=Pd;=gsAOfL~pkq z`HKZ`)dIrcDsZ^+6rQX4;0k?U$4OLJ3Ol+NNwQd)C zoqABT=&gR!Bb-uhqixr)vMo?v|I5y6R9p@w2BrK00Eu3>yGYmt9kweukn-aF_#OEw zgMAV7g9l6L)W;V6gkI5;Y2H~ib)B@IQh zQM|>)X(Vzx0F$NH;6`Hk8ddV7`D1w!wgLpXq`Z9ll6Y~exRXNFE7WUFu{#Hx64vZY z#?7ca#*!Vt#m~a<%#P-C1Xq$Y30sJJC3RNDz8KLkIDmz>{!)mme%I` zF4omy=+3okH0B;Ma34Nmm`IRXr-g3BOX&Q{#H52B@nY5_B9yjQC0i&@l^G3%pl{M=ubxd;35R*UnL0b7s&|%6%l~zsVwYcpf9ro(+7JwZJA~|ER#OdFKmYO!E z)iu+AC1r58UtT2U_oh*YB+x$V-EU`OcU|$o$!%IqR%{`ZfOMh3|9-Ew#uRWCgERuq zA|Wz`c7d=e$&S%;xSAu6RLwohb95Xh*=_kz{~A|SYm0$-2&fQXcImPaIvL5jBolcMh=&Qa;c8+(x{GcIEaqd66N2m1QT(mifL2WuyME+GeXr1T& z7q?V%V5j8X`M~a3r@v{wPCGLgh|VP@eYkX=YH?Q{T>pv;4B=i!{Ih*5Hb(LK#FxVQ z+z&?WZn|IF`u5J8cGB#ffWGkOGV*uW{cqIc3Dfxzg>XF#M(7pFP8qZ5Q9!J1v2<;@1{*|MiXh~jZF zX?GC5-otPIT8DF`>J--NvdSE=U$@F~-U+C2=Hidi7dnPpHidT|!21Uk#c&V28ZQ!o zkg%O0aoecF$`;kw^!#A!!TNZ6yxCsVS(SaOs05zR+kc7;GGWM#G1X588NXS)`#O9G zer$|W8rZVYxI^FpTDx|n^PkJEGZqtd?$^?uSHIpD(rR~--uA`TH`fdUyb}gg5`|R{ zvwcv77%NEkqE5}A4BRx}x{}s_;q$udDN~_vVuv%~D!L+N_%JB)*O`lM;6Euxgo!MX zUVEijaVcUlInt*OJ5*k_w>!hbd1yOzh!E3eis{1WDrSgmchrlMJGNN(jI(ddMa4cV zSdllvA0=J7AT;j>cat~!f0GE!$WZ2LiaiM|8EZ2moinUf3h)~bkAv8w1c0HWv?1G0 z>DU7Qh=4&DF{@#7DQA~yLW+q_S&B0Fi?qU@H#i-(o3dpwE*G(rj@LA;#dVKrj#cc3ecpFNM6&B9crU0$jDCAodi;VQIKn@xph(bM!_1*}99rPcr zVBDz;X(B-=)I=D~oT2+5u*^{!)}DrkF7z#!hOP6VUkgP!Q& z!7%aD#IC2lq&WPU5g6>nj;%zmuIO$GI4)2YLJFFqW7b=s>*OF&bQbmXiCKq zooS!mQ~mi+3D2;;pb-L8L3rm8tO9y@I1*1~+yL&WNs0)kjg>@l&fzvXfTcs2W&p>` zrM}l*yp}f30qEZj;A_jQ!t{(ywF!MVN=!m3=mi`Jsn#X}!&U=a-_(8uV&SV>V^4Pf z&eFz$i`vdPL5v1@2>nAkGQ-R12b^sLItN53xOy^mKOtsZNl^whA6OVYN8DUUIcm;u zPnrJfGxtYbd0FXnqKy|RG1yO|is`k}J3Jzv&+X^AevQv~elcx;LRBA-bE|K*`LzCT zyeFOm1!lEO*M`pV2$SG`!N$(VWq1Id%mY;hX5HdIec`xwqtz=`SkIuZ?pQ zw_NYTjm%|no0Wys($o^Yn#?p@B4rLbTZ$pkB7WWR01dyFmlLHO4-QNdYvS{LFD!~s z>HuKleDTtn^!wgYwhHeg6g3kkshSQ3&5ja*Y4u)H`#>GP-tjemO)X3Ak*OG9jA}4Oq zQ{~w^)LKoz3n^pG*02?TmhD`~SMYqXizldv$CamO*d(8#n!3!DhT0;|8;;9j5lM>6 zK@Bb*F+w}vXap3Y=+*rQzkbv!ggOS1Jv1C-BuQ!eNco{L0yYZ=PTX~ztjenmuYow3 z6XS7op8nhr&>KT(H;}fiYNCkxzIv8OyZlORYEe<%uuQf+JS3h%sOQ3>rOeUDAx}4h1rK7Fm^Y7JU2;p7bI$EmJ*VSzRxu z?pjI89{EGhHT}<9Lo{0btdo1DSD@0QJN`YlrOd_V`BE!pH!5QJnnXnGmh&&#>xpUHE?7$&%WS$Dn~D4L zdI~2@+sAQtCr8bh%*jf}l>W)FmJZRaH{ttxs>9U|GlJzosmX>!x-J@xt$;XT-TWAq z__QBqO|?pK4HngU-Gw+udq9@h*fXP8)kJ5<1`%KDW^G>dt!1r=$+hs1twzB^F2cMW zX;wTdq0e|ma+Sk@==JKq!RL>!HGZ4f-TN+nK3-jXMl7!84{SpGUZ%w$|8jx*{`tLq z#fri!fV{;BCgMm%xw#hHib~;qCG$U7tp(b2MCVpZ!R8K7fLt&LsdCGCx49$2sU+>L zkwb#c=j36WIHJ-B?B@C1v{)>98XH)u(Lf-zu$A=Y4E-;4wt&`t7er&@{ zmfY$P&r3DId%HNpEB$Q{;qCrqkv>E)&$jpE`-Y0+X(N9VEldBs-VEpJoRKn(iT`Jl z;y8mcEUhs@CY7Ygj6+&L!C5D~l{!u?rY(8AD3dQ$_u9o(V ze+G%=_Tg^&O%>-^NR}{C3PK5idllP~kKQLa8dPbXSRGT%&V7jg$B_+%VAbK5ym^v^ zq9`JQEq>sGpiiY&%%@UOQ-NO6<_1R5-mB!MWzr@S_SN{-oM(vXPu%M?c)p))XY~Wh zQs?VJe}1xSP%ULxDyyU|*@YH!eI-uh9(ovW1&-`FYC^htQsp&g5qgi)Q+f54^`QT@ zMSmgiRsJdP=(Lz7i=ATx%>}}o$H)zM>oZqOqynt|Tr^~s`n+1O9&t6R8nXr#4|oL? zzlqjt8)_Y9qCOF?X-ZiGvRps$ikIB~rZAW!twZYCA=uMnMLcg*w{Wa1-s&G zxxgT8YgZwVo^P^)Mu1@n12)BZBSt$est(L-z(yM%fyp;L*&@0}UHh0wJDn zWBCMc1PzU(18IR`uvV%@+?3& zQ5E2AQD>*7i=;~RTl9AtG{%~v_6M! z3LCdJ7=blE6QSFPORETux$L~s1W@zWHJ?E q%u^)w#YX9ZIvhtu?9Cy6YRi6f6G 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 literal 0 HcmV?d00001 diff --git a/docs/fonts/glyphicons-halflings-regular.eot b/docs/fonts/glyphicons-halflings-regular.eot new file mode 100644 index 0000000000000000000000000000000000000000..b93a4953fff68df523aa7656497ee339d6026d64 GIT binary patch literal 20127 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/fonts/glyphicons-halflings-regular.ttf b/docs/fonts/glyphicons-halflings-regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..1413fc609ab6f21774de0cb7e01360095584f65b GIT binary patch literal 45404 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 G`u_lkUM?>H literal 0 HcmV?d00001 diff --git a/docs/fonts/glyphicons-halflings-regular.woff2 b/docs/fonts/glyphicons-halflings-regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..64539b54c3751a6d9adb44c8e3a45ba5a73b77f0 GIT binary patch literal 18028 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 literal 0 HcmV?d00001 diff --git a/docs/images/communicorn.jpg b/docs/images/communicorn.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f8189600d18a5238082f309ad52d6a8b4fcdf801 GIT binary patch literal 119335 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 G1OM4IyA4eM literal 0 HcmV?d00001 diff --git a/docs/images/company_logo.png b/docs/images/company_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..bbf0e28d9750efbc10c14c90856efabce11a9ae2 GIT binary patch literal 13330 zcmV+tH0{fYP)pF@zV>(Z z$30@1RtY5}1IMaswz5gS+SPyVQb3e&9HI>JS?Z6CVw_kBB_siRsDt49>gPBmBx`s4 z&t0lmO0{}c{TLc{WN*bX@>j1QD&I=}=1oLfzYY7!qKDD46Ud*<#-)-a0|4TBq;$k2^)um2g0s zLJ5bXzEJn|iR7lvkLt*ZQo?Nlr!LARA+P8blzK(Qw`?PZc3kU2C z-UO2_9DrJjSd&yvdz6m$HAqEyyHxOPHN|Q2N3vwC{JO zyiCr7$D$d#!;zH!;m-m+>(2XFsa1C=iFG5HOFogh>}qB69WH%rj5N?DJ9Yy#15ebNO;>kqy8;GCt)~urJ;|~byjO0K7)ql0&5j(*6ybNIY1`Hj2ZKMrGRvm4CuW*SvJFbLkWSY)EWDf zVOky|e0c5)j~{GO~IePu9_W$=v@y z?Z@mcJ@|6xe@5QycgX!N`m%>I<&=5iq1c0fM$_hG z_a8!5_hZx-pc%6;O|m+6CacY%H$!I&f>b-`t19WFWyw}aL8u-w(BKV|-Yd!XaII+%M21!Uoup~tk3?jwH2nK?~u z5^skdyC%REOI>!A(trb1d@FUe9t##Or%iiuo_whGXVjX-+D#2QLwA$|Asd(>Tq}Cy z4LIVGre0Y#Stp##0k|;2Q5A^9*1PT&vihH<-mhJBSu+~TRIIQkh}Ek%nJrt3p7A$r zAb0Xhp~kHZW{=}|BMU4XJHS4sAEkeEEg2e_0laqgjdjRGH_Y-7-6wnm12=Bay*)3m z`V64dkh8R-)7ntSe(K~iC_VCeR^7tFkendCPyV71CkXWV;TPo`5`r-^|GbO*)hmOK zTMNu1x>NexACR$!%vn+Edk;C3(wF|6GX-jdTD!h1pnV7gq?zvBepsV1N~ka2>N}89 z15b-}7{ovvvrEkmS>YOPhEGxd?9Yc+Llf{)rG}mp$?jh3SnWGYoG}JBo^zQ|GSaO1da4{Q)9U&_q%48_>z}?bFvj|qt<6?Vvbx56eDOtVx zu)u^t(Fq6)vQ+;ep?~q9u#Y>DlMbaY>IrO^5Sh`bGrlJ>&fPEOlE3(?z~kw_>LklS zivn;2q|P2e)`_QtdQZ^_2wb{_M*5tKIVC~@BOfP7)4j>uTULJR&Ycr%EKMMb*boLu zqeN=JP<85`8`#Mbio81CFuV2&tXjFBd_c}?&k>cEli9j0+5JzGxn8THtez6oLF7E9 zNf)N>N7{!r0-hk|K?jSU@#cOIXe?b=>co{I`@;BKJjPCurM~mj;Nii&h_+33p8=f7 z;5>A%{PAF;769rOObxq0{v34d$L}NW{TbW-$^B*tdu`0ayO7;)5UXucAOR31p8ovL zYQI^Uq!>^@q{g{3?F}Nhl;eV7iijcn_3M;9^ymLM3>=5QC-1-W_!O{|eH9e8Qi~15 zN`$F5MWbR_$SZ0f|Ee*oF6 zd_E*RL42Q_7oQF^jyB*H7c5BUy|;JiP4icL!xe(gjA@~!0|ArP;unX2SQc45n~^pznrJXk@NaQt)#cAFw_DtJ87i1NY#UEMs`1dlp8^UChE)Mj%!IbH2>>GHU7Wz z^uH+k(zAIj`z;Cqv3j2*P9;Ia6x2gnPz%zT_!K#_vYwFOUGv z2eZgu8i2QH{aVV5y;Br4gA3DaUvoK)A?0Wis(OGl))46PkwTDv#t^u-z0c=TR()5n zTjE6W1w^OPtSXf8>ApQF@OUV}mBt3FV^65%2BEW1S_9s251GqaZ2(c#yVnG!2Nl2% zU=umx|3%IlF9fsOG>~Wkf&0~Lt(}d}0Dn{1tW@`-_eA%b9Xr=71h!N_WN9CUfNP6i z4`VnFJZ2IB@nLrb36QGa!+HKm%1(@!p0xtW6%e)H>@&|7J>qXzPuU2lh`f0pi|#j& z+R?0rMH;t&G;1!pAEl~!K|}rQXSj01z@7RkWgZzze#G@ki4_n;yUqPtik@*loE4tv z08k$?yFmpoYa(TkCIU(dop8H;oi)RoH&=9jP#BH!Cm>L*y;;*K`*^g?(2^@4hj$h~ z6D1wLJ7=csftrGW(!ifI5mTb;yKd~siIp%K=?ktG5yzVM$p@6V_ZH@hjsnRQ5Mf$@ zx8Mu%BVYolgw)GZBYTL{fYgZ2Z#TA}gw+FGPRM!_T^M^d*1p&OdP!vCdhj4ph^wvnszJU31Ucz-UM^?<4jJh0t2lFbos9E z`K(vtn8_26Ce20JweVWFQ(lRD8e%5I8cqo@d9sx3O>pAmi+IBj ze23opb+OIEU$ctJZ}~N=;6ac$0WlA0FFHNEFFuV$r#253_V24<4*ojf?iizh7HubFlM0z%hJoztpdL$6#@2)AUZCl3-x{ddjQyAmN&@)iOCWW)K>_+S1yDjh7VVIdU#+XtmXI?`4J4D?T;pTwSf$zm{+OTDfQ67P|Orj#M9u#nC#k8|9615YPop+`9xv_gn6a}0Wv>={uw(0q|cVri}tzRDJG4DNLo3F zqvL2t9fBcbmoP0#Uw$<=#*qM3oFXq=o{<~@5oYdsOKUFh4+3 z1AD@@1vUuygq4~#!8+wkarQM@EmX%ilN2OIK*S&JH;W@3-)P-d%)11aq4$|yU9`0C zhKV?WZaf5yji$XWd;b9kQR-q*=kIC(61`LaicbgS2?-)Z-xU%gAcp$Fw2{q_zbwMs ztNIP)eZ*atGXEZ{UF*TQV#0{OA)xVb-+7b#&9b%$R=W;lpEV+Q3klFMoidD4L(Y~z z>p0{E;Umj4WC9W+VYJn%baeP@6BA2Fu6bGSC2oeQR=KBxUSkSl4g zT^-z4pNq90NtA$qi1nsa|I^s0W}-D=?e>l^J9Xp!a=LKgy^7E+XrCt3pUbyW=Dt4# zGcG|%v~(d^y7^{^4fPoy>O2eb=dvq*O-2*#){{E{{SB=ny73h$lu%@qY9%GbC?p^p za%&eK;E_jBnL1|CxIYY}c{|>JKMytDc4*v0+)lw&rx&W#g2G?;U(x;cfYW5Q-?}yA zyctglPFOf|W{~^B_(aD&b_728;Qmsz!==u-gwj8`KGz3AuxlCZ52y4mZxT0r@xRn) zH=qeq;25Zc8WuT$4*Nd2 z)88Pknh3L@1i~J60a@+k`9MCXT_QX|q@EjZ)r!#hUs3@9tj;}h_KPku<>WkiAJYL@ zhw7*A#03xa;dhLYGe#x=(dIp~>eZbu=<43OwM3P^dCO*cOy+PB@;+6oT;yp-Mhc`Bh1{0`jqu+MMGsDe}HKCg#~GNS_zc8X3>eO2!#WPFR)Qo zk6ZsDBFtB-Ho0DP0fhs(Oxo=XG$COhN4ci2k+rJ>2Q-<276)*{rp~!oK9Ks%nBciU z=^U>5yfS~jnaLB16^V(Y*9Pa!SEGNaF6#z?Pb$KUQ}nqIdUBvDNr(`t!g>6D%0Bmm zxSB2~z)G2&_!MOW^aM;Aib6mTcW~c&E&3M==y=TiWUaeugZsfO@iTUShL{Wpv#$UuP91O%H z(7r1G(&t^u1xMzga*~3oaFtOjHJm{Tox1d@aH>`bT9DZw*(|y5zDe18Z=v!##zZP8 zuG)>uNBxvs)F{W)Z*G_4zW9t%H3HO@*fv?6x>EYGt0|4-Kw%rSZBS}UCV)E>nZA;; z+!BHzu!`j``HBU_X}%BB^%zP`F!wu<%>7$x?QGuK)vV$m(&~NoQS|KWx===|^Uf5q z`wj^F3iIH0RCd*9PP1`lOeJ5KPU0_Kz@2&R&PR!!vrih#sVfEh>~;f$wn5-Jbk#*w z3y7LF=ehx7-ve@POf-Z+XQK^kx$_S%pgc5@)P*zoC9?YT7ug~^0d8QpPSu6}-PuR) zBN7DW+&5nl3kXtWkSJPy<27tYln_1QG15^`1if1As6~PGYjX><@4!f2hukOQ(x2yg zu4^)igIf!pJF~@pqOsVk)%{p*Vp&4;NPHY5UvMToMoxr14v|Vb*2ErkdZ4o55^6_DK&rrb>S5l+BZHkHyWhYZDZ)W*YP}tvyUaa*5N9kS$`4i+ z^YAV~XIervC<#baD7z?g`)G1zO^@`oh7y$Y4}VG)xT9)I?SQL0pzAp`{6aF74HPH) zOfkbeyem7BM9;)Dm*Pb>L(U^(Ir}wAVgaLJBT5Y(PWH*eYP}axa$i{c!DH;X7p2er z0a;*8EMYr5|7I@h`ktKXnN&y@tE2Ke*lvQ3bE=HJo1)U?Pxrms@BYTo4$U3Vrv6>JOy zF}oi_Wk0#TWV}Jq`12u%_g&bN3whM$?@ifM5^yV@>eV)uLjSV z_u+e#ed$?B4H%M(B}t)9DH!h_()2%^#lHhdQg|9PB%^r?b?w9I8<$JhZ;F{uZ&;VhlHRaB$EoEOIJ;NPId$39f$g%AfapTm1m4VPlu?&?L^n!( z_d-#l{GCu%j~8z_5+2`@Bo)xdovSe8^YG#I`2;nyCAG^FiHXv5jeZ~ zzPrhp^rHA#3z^V5j3vru$lmuSa;8rTFvH{lDjf^T$m`fG9aYDx)QBr1J84S-5-~vN z4ayt#?g$|1&F=i?G0IMOjBSXz0=T8qKOdcIuOVoKu^kM9>@&|N3q*Snp(G$tLm9lF zym5rxleA8dN}zCU%FC2}_;1{*psv8&dmkpoNL_x7Tu79P3LDLafJHf{NZ(e%HZZAz zfK~`Bl!nl)3W}ZbF+V3~^2_2AE6K19I+*H>x`V8NL$w6O05A0AS4DbqRH7sxF~MK6 zl7oEOFs)#%BsQ*Rm22xwzaXzJRTe6H1SvCRqwlI-{ZvM{ea1cYl5T;nO`#E z)@yYgV7W)TWsr93fYa53rkAW=$N5|6+hQtx-U>)lnlu>cG^H>45qV!PVbTz;L~YP8 zSKi&cMR0pX6A%#X9sowO7BNnx4#IWGTkttqU3+QWZlXk4ed&I{Bt@jkqjw@MXTO$Y z4?QZQew*Y-x^_60T|6CIcK=SQ~L|pz3r*0a}oLE@1%y(N2&zl;k4v%RS~w z&;lCA=n4p6fLb)DfK&mxU}gVyD>=%pL7c%^=fGB+yM}CN z67*$>d_GDwl=OwcIV)}&f#fqIf|T#w0^iC6#6(JYU4!qDzi0s`U2YxqlU%w?0gxU4 zFENK$U^j1i#FbpeSVAoj5-|96j2(R^sNXO9z+bpswI}TO8yM=;$bd3;+8g3W0}BY} z(SXvXgqk7s?9_Du0nmcsquK11cF<@i#%utnky~%PhP-#*4D@`cdJwb)bCvNGq;qSm zFpQix<-j&%G;Q|3T89P=b3GEbeoH=fcKlqsMtz7&)zPc;@eS*u&ywEovy+aOqnJ(bSeMmUF65a_+BHFv4vtK16PygWN>c_ zB@lZy;Q*5u*$jE`=B!zzuGQqPUe0B)5FYl<1P~s$RVDDgk@qYqb|81nn>UxNWBZZa z{g{fLB*EdWUPiyv)?8cU1K%5g+XjBf&W#W^zwuO@ji#_O!NUFmk15UBZljg|o z+y9?Z(-8YW)`3)2a6kJfz7o`8f>LFX3E<*-tFTjvl(fOvV^6C0i<>C(^tkOKw^FDR z!alk$S?V(OY#iML^8qCkM&n>QwDU%EszC|SAbM7lGG&vTdkHzpa7G%o)P-mEJf70$ zToU=Tk`7MwSP);s(m-h3gdHH<>!rnhWHxO^q&7i59g#%~pGBseqtn|`TF?+_{=7PK z62?aRW1}I>{w>LQ@foeY-k`~}`wt=Oh;DIBDbYZ$!h*rFavg3DQu;o!W|c57VcZ@X zykDtQ&V`N?nGQ!1^{MF8rG&;^x{&;(i^yBDh>dWhofI44M6A46R@)9_UD<&=^&w^M zzq?x7#AvZEmHqfv19a1{eLJ=)6*T+OGaPTp3&5Uua62-)AIr=i zocf+8AoU&Hf&HQ9lK0gYOd`iU7SS{)p|$mSV^+i$VfP!PRIdT#%$&xgVc@t;gA*!A z9;!UUnKOgj*PhSISg6xLVAp7@SK%1jJk(mSI(6d<0E<2Hq+GQwC}B)3`KKO59dWPT zWF6U^jEY)>xBz!6`fPB@c{ZDCFO8iFO>C4(!Q-nh3%a&ZFB(oJ37~ogW^fn4Xxf~t z?+hlpYtPtARD%Gev*yrqafKGrc9%79K?@yk#I&Uu4c zS7xh2_^JvIjPVQRa}d>Ewv@azD~V9us1p=qxBFh|^gJl%gb*^v$hmnRx`$H3FN%d? zMFijHXg2Gy3%1!jUJ0 zGSWeR>CTu+=_`NDDo9-L)sCC_>#gK3`ZBgL0znC_&%v;Tg`UZFu!jtjfANLHWzoIe${U)`NEgVib8R5wx=;)XR~XryHTC@e!!nGd!TWizqPkET2D2*MVF zHxLnb7{cJk+N&9JWz`i#^P6niK<*3U$$NV;r7j*Bs^d~sz|EIM_oX65Aq^Xm)vXtM1G%On>Ii+F5vi!7X=CR0QDk=RL3Zzxm^ds@ z^GUo*>H4TyE(wP|tfTt`ewKrEN+7&>ALnX%g62#qn+qN~Tv^odfV7V5Xbw{w=Yd5h zFtMD4$hFC+%V^tyBjvi>v{m8Enx26Xw8!^O_STLHyPfs>8lstag!)h$I4%hc2jf3HC{YWe;St z+>ljDq!tO3X5fAP36Z*7{M|5>u(aVWQz%j9dXt18f9?ipwq~i-f;N~eTIklzzBs-x z!m%rWdGV|Hd>3D$k8?-#snUM`VE!vG{~hXNy?ckYuGn!B(q5~k$RUu z0TCM8hWapytF)$YFoZEE@K6O|8O#@QZ1S}*+$$kr_cD@Av6-q3+?9;E5(?(BDR+0Dfal=&i40j0h%4wJV+43=gAj3VzV zkxz&OMA?MS8FB?2zUKZd z$vCJ@j1#Iu5R@wyG|{sNk=I&R_wC90H!EWc%^TVHDxqei1kve`T(!F!^1AxGkKPk? zT!L%Q>>4aOyjwxwA@p50#);HD$va4G^08IfqKfy0>J|#(BJxmoAS_cw0$cjrAE=Y$ z#F%DPyg+Xf39O^^lSX%U6wHU}Onp7jbE(0@$v)#ersXLihg$QNc7O$v>4wQnFHaf@ zRy>UUA>J|la#e>Cq|3Nk5wttmCmta0vyY>hkZm)?zp>B$+zg1L(~TPM#JK2h-khTZ zf?A_4Z}EbH#}<5aSn@pmCPV0cbx3>iK723UiPZrVw7NcX-(8gc$@OFk8(jj3k)$uZ zio8V&$esTwky<1kRE>3OnFWQ(#IWd*7G1A?E*%`1pN;lpdL9S??V0<@e-B!N0K&43 z8Q<4II=#?dz&h**K26-uK4f)}xxHeb`uEjI3R?ulMp`JVN2w7%rY!ol z6npA>j3|7flUgk9%M)@W4RsOd$DvNR)PSK>Hu5@3U49L7NW}qGH6>F!v=doJ9UIGB z>Iw=kAQgZr;y@=ZvKC!ZSZxoZdNEkg*(*kboG&msW1>)r6^IjaEW$;%a>r8U+$3AV@`V zo_&Ne$^Cq;d=5>TQR?iA$yQeh|3mTwqypZ% zZ&LZ)H<4S(%C{T9Jg_yDUHx0K&-flu2yQ6%t=9rSYj;0}(rON7*It3&QJ0Wd0Rh03 zlpT8~Wghqo`E{f*eXT$b$KL&^?ANz&Z^0mdI~jDMfv13GpBG$C>7V^(w@>LQ3WXDu zh~-LHxT_Ol3vCW1DvP0QG@{~LHj%$+6A_5UwrtzL-<5lzL1xe1WS@94nZl-wmEd_S{)+ss7j5gR${kfDK{LzZ-wlFm zbv-(^YQ4-O{~#}bcMo}G>0jK)MtE3&wkiAYU&R%nc>zkZTOUH^KFWS;u^)HMg^J4Q zLufeb`8o2qOh#>P^>hEGhcWRAh?+?1g8$=)@=otswlw#yung{KajbSpZng;~6lAI5 z!%;guyFAs!r^4!0kwDQOA92BpSoy2?QK|3>C?_;M?+{Rfkm5XM+vPn@u_GG zcx4}$$Pa@}hZf@rXtEQFC~`)rEIExSCG~1=tKwy5Q~b1{2p|? z)ddV{PZ`g#9oGp0w!{->b>;8mLBcR4mTlW#Bli&515S%!CJBV+aa;!tN>NZ1 z6lRP4xaD);X{eK|{I^$;8&Uf;uJBYR8(QsYK^fZU)sZ^uB6-<$9ubd`4kNNjb5T2J zcF*p;U#{V!w;Rx7LQv3VS#7q~A%_MEIKo)=wrnPUad2-EVp3dJ-?#~x0VDTSVYO+; z_6fVvcNJ4o&ZH_xypfPmg03{!mcDfuL~N)xX;*pUhMSec27SkqzpmBB>sY&CQFg z5m~CHu+9KMHqPt-Z`N)?w9I4=>i4xk=oTQ|91(N({dYotUWjYBAHSc=R6vG8h@R%K zZOj8&k^9LU78HBX8I&6QT_&z8B20--Kybe@+U#SsUj09)oyBV3k<-4x)Umt3U$vYU zCwF<(PlaH>DPlBjLEeY6!cSz=MmGLYzRPn7Q6B4BFEFOWo{MFl{ynn$ z^basMV$YU4b1HeW-xbko7B!S!o*r?f_~ZpLWADhd+l~tGG9gt(T}fTs$ny4(N4IV* z=l1#Q*KukNd-s(32)-~@Nx&NhPPJj@vx7quV`BfUQT&89zjoh&;%Chk`;vL;a3Xav zGsp}jEDQfj{<5WC$JISw#u@)+=4g8no>UbY42KTnXc|3PH63*L7S9x)S?qm@v`qz}V3Q=TJ= zLz!v$R`Sc$-#4zyu^)15WofP-coCKGf@?Q(?=6(R_)0Pw==VQIwzS!$CwX&bL_43A z%PDiu@5w&xoLu5*o(aU!bjee~;C=oHr_C_cYM#hF@^fyg6U0$Fk=5?H=-!!1=U5Yw zxm(-t%64*I`473E782HL7Yf)Joyjj#>Xc#n52+I;b>5{^t`-t)*%a-3)S?83mVf5? zWFMcWRury7&WyL1@rDXiFc+(lz8%!F*wK+NCpALD0v;76aqHEWbD{iA8+blRhyV3r zZg?Z1W`$bjD>W^y3~4k0#ffc!Dkvsbt+!?sId8p2&XW(3hvdw#uIDPSdiCL;rY7Qx zgX{|MN@XWJmd_!#0|HZ4kK?H9%3qUx)(BB|*n$APRL0(!GdcyZx*r|WgossD_w|XC zeeJneUhjS|i!!(UM%g~kuxeLm+ zr@SJ11n~z0Ee>LYJLx6LzA!#A+s<3?1!ewm2W20+CwviIgvkHOP+z#G)U?dFf8>4W z9f4pN=MN1!qtH{S5$?1%M12S$@QAR-3KUMg_B=W71XQ`JAUpXb&Q0?I6obW$f^D7N zryo%H?|+qx+!h$A6HlSkh${oLh{O)1^JkQ*CDFz4yBG(zi*ZspIIlb#IDOt*wVX2Q z#BiT~GU8c9hl1)Bs1b)}gpcY%rj;OF`-pCdCQXA^%M~s}6d%QoO&ck5&mYJG;e`;) z51?$0IN0u^LL!uJ9M$D_jOHE}-rB->mk_5(U3PV1xu9UcN`SaXzTiw8FMbAPv_`v* zG0Y}9Btk#{6ia~vD)akaa#kr^eT9H^=;4(5Zp`|7K%kDq7X--I6`Q9N5zI|oEooUy zP?zM)-u%TubOG`|;wZ`_!RmO~d;Mj{6Y;em=cvdfvQsB%QV zjU=^Ws7Q&|CWAvvWXJU|);NoEEbpllL<=_0;r z)lgA3iavxW(rVd?>zl(c3bGscgh5>NgQBJ+!F^*QrTXi4<3ijA>?(PI`p!UknieKn zTHTK&@BL`gW1>QG1w?{Mf;gOT3zRXdY#FCj8?sM7k1X{wD9{cdX##>&8K|G;-g?n> zkgM@2nf9o&wxphZexB`ItW{isZc0-AioU-%_u|9lf={&pL=6}(VV zSZzDxda~y^Ij=T&=yRwEuII?7`+Cb}%06(9jJvCT1F}xeQ!GlhhQEb?XuFNLm2xow zb>E-QrR-mCC1=XZfnI^0>}H58qWA0RhqH zo+&G1-q~V>s|?7@zvU?|+zqzp@iELOAcUF760cHZPzJjzESa`C?o4tXC3x-1+Gc!g zjvhT4=e2gSy@jK&hyia&_LcvLpG%#2KKCX`0({VX3XJYTRRS{SvcOHws%(s;4#Ks& z5wc;988ZgIfwrUEP7p0*P`EEY%cZ*_q{}FUpjMu1S#}9{vQ{qBzTL=!Zoey_-wLyu zXu{Z|5m{Y&#xohUW_j)EV_d(XA`%O; zaNd09xhF+coNVvK;57`eW?3d!K-5v9FXjqhDKC0#*-Xx>@}eKRNADOW695v@3cGNr z95_Y1Mf#^Tw>Z#e9npq#%~r}pjUYz& z-VX}C=zNiY6gFYP6ZU@LB+H0^HHx(=+|0kMkcsWGc}J>Cl#gH!Ih#oZiW=E0InyVJ z9${L|!;Xk)LYi}EBp`k+Fy)cIWFh&R^jS%a1EL8fU~OWJ3IQ1yS^1Z30%91(MD;^d zaDZ;2Wmk>KPhn1s2$G>(=+o1XG_L%%z%}0Lv~%B?tbMz=Z_Ci`UaU!8n`q`F!>kHf z$i1iP|4g1d`Jo__NpW9@Q;7D6rwwx4057hz@je>HXm`rELZpw1XD zdh}>0<>CY$@J^*KznXb;VVH5T)9MwuBB#xph_(utISK%jv`XB8=w;%fiZ0JQ!Dx3N z0W+c`AQKxT)28O!O&IF+8}8a$SFc`90I*RsYr*$2?P@rCc&%FZ11e--8+K{h`@a8M z_2Y&xqm@uXk>PjB_V~??|G3MV^nU&N-KlEMc)aV>mCkevs$;i+v zp@euaN1Ytix+H64HBko32$BR4ODLhZ@MXmsuNJk27u6{OU*>Fe6{mZugc5d*x$5es zPLCQrEVc4t;RVXNN5L>M`;tq6S3(JTz#4uIYq~b!07MBY>NNSC`f+{GnUzpN0&t@e z3~djsh*?ot`bzLdqd@z0@w7@Pp|E%zYZq%c_K`-78imv3Jaw(`ODG}Pz#2UdYc>e} cKL7y#|Ltkx3)bw2P5=M^07*qoM6N<$f_(n5_5c6? literal 0 HcmV?d00001 diff --git a/docs/images/favicon.ico b/docs/images/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..0d505bed3c3a9383ed47dea35eaef9ec86ef57e1 GIT binary patch literal 177352 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 ZKG|95weC%==U4dIa{YV(ekSe({~zluEsX#G literal 0 HcmV?d00001 diff --git a/docs/index.md b/docs/index.md new file mode 100644 index 000000000..7673d16eb --- /dev/null +++ b/docs/index.md @@ -0,0 +1,66 @@ +--- +title: Talk +keywords: homepage +sidebar: talk_sidebar +permalink: index.html +summary: +--- + +[![CircleCI](https://circleci.com/gh/coralproject/talk.svg?style=svg)](https://circleci.com/gh/coralproject/talk) + +Online comments are broken. Our open-source Talk tool rethinks how moderation, comment display, and conversation function, creating the opportunity for safer, smarter discussions around your work. [Read more about Talk here.](https://coralproject.net/products/talk.html) + +Third party licenses are available via the `/client/3rdpartylicenses.txt` +endpoint when the server is running with built assets. + +## Contributing to Talk + +See our [Contribution Guide](https://github.com/coralproject/talk/blob/master/CONTRIBUTING.md)! + +## Supported Browsers + +### Web + +- Chrome: latest 2 versions +- Firefox: latest 2 versions, and most recent extended support version, if any +- Safari: latest 2 versions +- Internet Explorer: IE Edge, 11 + +### iOS Devices + +- iPad +- iPad Pro +- iPhone 6 Plus +- iPhone 6 +- iPhone 5 + +### iOS Browsers + +- Chrome for iOS: latest version +- Firefox for iOS: latest version +- Safari for iOS: latest version + +### Android Devices + +- Galaxy S5 +- Nexus 5X +- Nexus 6P + +### Android Browsers + +- Chrome for Android: latest version +- Firefox for Android: latest version + +## License + + Copyright 2017 Mozilla Foundation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + + See the License for the specific language governing permissions and limitations under the License. diff --git a/docs/install-docker.md b/docs/install-docker.md new file mode 100644 index 000000000..2a8659a3c --- /dev/null +++ b/docs/install-docker.md @@ -0,0 +1,147 @@ +--- +title: Installation From Docker +sidebar: talk_sidebar +permalink: install-docker.html +summary: +--- + +We currently support packaging the Talk application via Docker, which automates +the dependency install and asset build process. This is the recommended way to +deploy the application when used in production. + +Available as [coralproject/talk](https://hub.docker.com/r/coralproject/talk/) on Docker Hub. + +Images are tagged using the following notation: + +- `x` (where `x` is the major version number): any minor or patch updates will be included in this. If you're ok getting + new features occasionally and all the bug fixes, this is the tag for you. +- `x.y` (where `y` is the minor version number): any patch updates will be + included with this tag. If you like getting fixes and having features change + only when you want, this is the tag for you. **(recommended)** +- `x.y.z` (where `z` is the patch version): this tag never gets updated, and + essentially freezes your version, this should only be used when you are either + extending Talk or are sure of a specific version you want to freeze. + +We provide tags with `*-onbuild` that can be used for easy plugin integration and +acts as a customization endpoint. Instructions are provided in the `PLUGINS.md` +document as to how to use it. + +### Requirements + +There are some runtime requirements for running Talk for Docker: + +- [Docker](https://www.docker.com/) v1.13.0 or later +- [Docker Compose](https://docs.docker.com/compose/) v1.10.0 or later + +_Please be sure to check the versions of these requirements. Incorrect versions +of these may lead to unexpected errors!_ + +### Installing + +An example docker-compose.yml: + +```yaml +version: '2' +services: + talk: + image: coralproject/talk:1.5 + restart: always + ports: + - "5000:5000" + depends_on: + - mongo + - redis + environment: + - TALK_MONGO_URL=mongodb://mongo/talk + - TALK_REDIS_URL=redis://redis + mongo: + image: mongo:3.2 + restart: always + volumes: + - mongo:/data/db + redis: + image: redis:3.2 + restart: always + volumes: + - redis:/data +volumes: + mongo: + external: false + redis: + external: false +``` + +At this stage, you should refer to the `README.md` for configuration variables +that are specific to your installation. Some pre-defined fields have been filled +in the above example which are consistent with Docker Compose naming conventions +for [Docker Links](https://docs.docker.com/compose/networking/#links). + +### Scaling + +If you are interested in splitting apart services, you can simply adjust the +command being executed in the container to optimize for your use case. An +example would be if you wanted to run the API server and the job processor +on different machines. You can achieve this easily with docker compose: + +```yaml +version: '2' +services: + talk-api: + image: coralproject/talk:1.5 + command: cli serve + restart: always + ports: + - "5000:5000" + depends_on: + - mongo + - redis + environment: + - TALK_MONGO_URL=mongodb://mongo/talk + - TALK_REDIS_URL=redis://redis + talk-jobs: + image: coralproject/talk:1.5 + command: cli jobs process + restart: always + ports: + - "5001:5000" + depends_on: + - mongo + - redis + environment: + - TALK_MONGO_URL=mongodb://mongo/talk + - TALK_REDIS_URL=redis://redis + mongo: + image: mongo:3.2 + restart: always + volumes: + - mongo:/data/db + redis: + image: redis:3.2 + restart: always + volumes: + - redis:/data +volumes: + mongo: + external: false + redis: + external: false +``` + +Note that the only difference is in the `command` key. From this, you are able +to discretely control which modules are running in order to have the maximum +flexibility when managing your application. + +### Running + +If you're using docker compose: + +```bash +# Start the services using compose +docker-compose up -d +``` + +If you're using plain docker: + +```bash +docker run -d -P coralproject/talk:latest +``` diff --git a/docs/install-setup.md b/docs/install-setup.md new file mode 100644 index 000000000..1332dbd97 --- /dev/null +++ b/docs/install-setup.md @@ -0,0 +1,38 @@ +--- +title: Setup +sidebar: talk_sidebar +permalink: install-setup.html +summary: +--- + +Once you've installed Talk (either via Docker or source), you still need to +setup the application. If you are unfamiliar with any terminology used in the +setup process, refer to the `TERMINOLOGY.md` document. + +## Via Web + +If you want to perform your setup via the web, you can navigate to your +installation of Talk at the path `/admin/install`. There you will be asked a +series of questions for your installation. + +## Via CLI + +If you want to perform your setup through the terminal, you can simply run: + +```bash +cli setup +``` + +And follow the instructions to perform initial setup and create your first user +account. + + +# Usage + +After setup is complete, you can then refer to the `/admin/configure` path to +get the embed code that you can copy/paste onto your blog or website in order to +start using Talk. + +_In order for the embed to work correctly, you will need to whitelist the domain +that is allowed to embed your site on the `/admin/configure` page, failure to do +so will result in the comment stream not loading._ diff --git a/docs/install-source.md b/docs/install-source.md new file mode 100644 index 000000000..6199b6ffb --- /dev/null +++ b/docs/install-source.md @@ -0,0 +1,80 @@ +--- +title: Installation From Source +sidebar: talk_sidebar +permalink: install-source.html +summary: +--- + +This provides information on how to setup the application from source. Note that +this is not recommended for production deploys, but will work for development +and testing purposes. + +## Requirements + +There are some runtime requirements for running Talk from source: + +- [Node](https://nodejs.org/) ~7.8 +- [Yarn](https://yarnpkg.com/) ^0.22.0 + +_Please be sure to check the versions of these requirements. Incorrect versions +of these may lead to unexpected errors!_ + +## Installing + +### Download + +It is highly recommended that you download a released version as the code +available in `master` may not be stable. You can download the latest release +from the [releases page](https://github.com/coralproject/talk/releases). + +You can also clone the git repository via: + +```bash +git clone https://github.com/coralproject/talk.git +``` + +### Building + +We now have to install the dependencies and build the static assets. + +```bash +# Install package dependancies +yarn + +# Build static files +yarn build +``` + +After you create/modify the `plugins.json` (refer to `PLUGINS.md` for plugin +docs) file, you can re-run the following to install their dependencies: + +```bash +# Reconcile plugins +./bin/cli plugins reconcile + +# Build static files +yarn build +``` + +## Running + +Refer to the `README.md` file for required configuration variables to add to the +environment. + +You can start the server after configuring the server using the command: + +```bash +yarn start +``` + +This will setup the server to serve everything on a single node.js process and +is designed to be used in production. + +You can see other scripts we've made available by consulting the `package.json` +file under the `scripts` key including: + +- `yarn test` run unit tests +- `yarn e2e` run end to end tests +- `yarn build-watch` watch for changes to client files and build static assets +- `yarn dev-start` watch for changes to server files and reload the server while + also sourcing a `.env` file in your local directory for configuration diff --git a/docs/js/customscripts.js b/docs/js/customscripts.js new file mode 100644 index 000000000..8c9fb4cb9 --- /dev/null +++ b/docs/js/customscripts.js @@ -0,0 +1,55 @@ + +$('#mysidebar').height($(".nav").height()); + + +$( document ).ready(function() { + + //this script says, if the height of the viewport is greater than 800px, then insert affix class, which makes the nav bar float in a fixed + // position as your scroll. if you have a lot of nav items, this height may not work for you. + var h = $(window).height(); + //console.log (h); + if (h > 800) { + $( "#mysidebar" ).attr("class", "nav affix"); + } + // activate tooltips. although this is a bootstrap js function, it must be activated this way in your theme. + $('[data-toggle="tooltip"]').tooltip({ + placement : 'top' + }); + + /** + * AnchorJS + */ + anchors.add('h2,h3,h4,h5'); + +}); + +// needed for nav tabs on pages. See Formatting > Nav tabs for more details. +// script from http://stackoverflow.com/questions/10523433/how-do-i-keep-the-current-tab-active-with-twitter-bootstrap-after-a-page-reload +$(function() { + var json, tabsState; + $('a[data-toggle="pill"], a[data-toggle="tab"]').on('shown.bs.tab', function(e) { + var href, json, parentId, tabsState; + + tabsState = localStorage.getItem("tabs-state"); + json = JSON.parse(tabsState || "{}"); + parentId = $(e.target).parents("ul.nav.nav-pills, ul.nav.nav-tabs").attr("id"); + href = $(e.target).attr('href'); + json[parentId] = href; + + return localStorage.setItem("tabs-state", JSON.stringify(json)); + }); + + tabsState = localStorage.getItem("tabs-state"); + json = JSON.parse(tabsState || "{}"); + + $.each(json, function(containerId, href) { + return $("#" + containerId + " a[href=" + href + "]").tab('show'); + }); + + $("ul.nav.nav-pills, ul.nav.nav-tabs").each(function() { + var $this = $(this); + if (!json[$this.attr("id")]) { + return $this.find("a[data-toggle=tab]:first, a[data-toggle=pill]:first").tab("show"); + } + }); +}); diff --git a/docs/js/jekyll-search.js b/docs/js/jekyll-search.js new file mode 100644 index 000000000..04d6a0d3a --- /dev/null +++ b/docs/js/jekyll-search.js @@ -0,0 +1 @@ +!function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a="function"==typeof require&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);throw new Error("Cannot find module '"+o+"'")}var f=n[o]={exports:{}};t[o][0].call(f.exports,function(e){var n=t[o][1][e];return s(n?n:e)},f,f.exports,e,t,n,r)}return n[o].exports}for(var i="function"==typeof require&&require,o=0;o=0}var self=this;self.matches=function(string,crit){return"string"!=typeof string?!1:(string=string.trim(),doMatch(string,crit))}}module.exports=new LiteralSearchStrategy},{}],4:[function(require,module){module.exports=function(){function findMatches(store,crit,strategy){for(var data=store.get(),i=0;i{title}',noResultsText:"No results found",limit:10,fuzzy:!1};self.init=function(_opt){validateOptions(_opt),assignOptions(_opt),isJSON(opt.dataSource)?initWithJSON(opt.dataSource):initWithURL(opt.dataSource)}}var Searcher=require("./Searcher"),Templater=require("./Templater"),Store=require("./Store"),JSONLoader=require("./JSONLoader"),searcher=new Searcher,templater=new Templater,store=new Store,jsonLoader=new JSONLoader;window.SimpleJekyllSearch=new SimpleJekyllSearch}(window,document)},{"./JSONLoader":1,"./Searcher":4,"./Store":5,"./Templater":6}]},{},[7]); \ No newline at end of file diff --git a/docs/js/jquery.ba-throttle-debounce.min.js b/docs/js/jquery.ba-throttle-debounce.min.js new file mode 100644 index 000000000..07205508e --- /dev/null +++ b/docs/js/jquery.ba-throttle-debounce.min.js @@ -0,0 +1,9 @@ +/* + * jQuery throttle / debounce - v1.1 - 3/7/2010 + * http://benalman.com/projects/jquery-throttle-debounce-plugin/ + * + * Copyright (c) 2010 "Cowboy" Ben Alman + * Dual licensed under the MIT and GPL licenses. + * http://benalman.com/about/license/ + */ +(function(b,c){var $=b.jQuery||b.Cowboy||(b.Cowboy={}),a;$.throttle=a=function(e,f,j,i){var h,d=0;if(typeof f!=="boolean"){i=j;j=f;f=c}function g(){var o=this,m=+new Date()-d,n=arguments;function l(){d=+new Date();j.apply(o,n)}function k(){h=c}if(i&&!h){l()}h&&clearTimeout(h);if(i===c&&m>e){l()}else{if(f!==true){h=setTimeout(i?k:l,i===c?e-m:e)}}}if($.guid){g.guid=j.guid=j.guid||$.guid++}return g};$.debounce=function(d,e,f){return f===c?a(d,e,false):a(d,f,e!==false)}})(this); \ No newline at end of file diff --git a/docs/js/jquery.localScroll.min.js b/docs/js/jquery.localScroll.min.js new file mode 100644 index 000000000..48a6e168f --- /dev/null +++ b/docs/js/jquery.localScroll.min.js @@ -0,0 +1,7 @@ +/** + * Copyright (c) 2007-2014 Ariel Flesler - afleslergmailcom | http://flesler.blogspot.com + * Licensed under MIT + * @author Ariel Flesler + * @version 1.3.5 + */ +;(function(a){if(typeof define==='function'&&define.amd){define(['jquery'],a)}else{a(jQuery)}}(function($){var g=location.href.replace(/#.*/,'');var h=$.localScroll=function(a){$('body').localScroll(a)};h.defaults={duration:1000,axis:'y',event:'click',stop:true,target:window};$.fn.localScroll=function(a){a=$.extend({},h.defaults,a);if(a.hash&&location.hash){if(a.target)window.scrollTo(0,0);scroll(0,location,a)}return a.lazy?this.on(a.event,'a,area',function(e){if(filter.call(this)){scroll(e,this,a)}}):this.find('a,area').filter(filter).bind(a.event,function(e){scroll(e,this,a)}).end().end();function filter(){return!!this.href&&!!this.hash&&this.href.replace(this.hash,'')==g&&(!a.filter||$(this).is(a.filter))}};h.hash=function(){};function scroll(e,a,b){var c=a.hash.slice(1),elem=document.getElementById(c)||document.getElementsByName(c)[0];if(!elem)return;if(e)e.preventDefault();var d=$(b.target);if(b.lock&&d.is(':animated')||b.onBefore&&b.onBefore(e,elem,d)===false)return;if(b.stop)d._scrollable().stop(true);if(b.hash){var f=elem.id===c?'id':'name',$a=$(' ').attr(f,c).css({position:'absolute',top:$(window).scrollTop(),left:$(window).scrollLeft()});elem[f]='';$('body').prepend($a);location.hash=a.hash;$a.remove();elem[f]=c}d.scrollTo(elem,b).trigger('notify.serialScroll',[elem])};return h})); \ No newline at end of file diff --git a/docs/js/jquery.navgoco.min.js b/docs/js/jquery.navgoco.min.js new file mode 100755 index 000000000..4ba447533 --- /dev/null +++ b/docs/js/jquery.navgoco.min.js @@ -0,0 +1,8 @@ +/* + * jQuery Navgoco Menus Plugin v0.2.1 (2014-04-11) + * https://github.com/tefra/navgoco + * + * Copyright (c) 2014 Chris T (@tefra) + * BSD - https://github.com/tefra/navgoco/blob/master/LICENSE-BSD + */ +!function(a){"use strict";var b=function(b,c,d){return this.el=b,this.$el=a(b),this.options=c,this.uuid=this.$el.attr("id")?this.$el.attr("id"):d,this.state={},this.init(),this};b.prototype={init:function(){var b=this;b._load(),b.$el.find("ul").each(function(c){var d=a(this);d.attr("data-index",c),b.options.save&&b.state.hasOwnProperty(c)?(d.parent().addClass(b.options.openClass),d.show()):d.parent().hasClass(b.options.openClass)?(d.show(),b.state[c]=1):d.hide()});var c=a("").prepend(b.options.caretHtml),d=b.$el.find("li > a");b._trigger(c,!1),b._trigger(d,!0),b.$el.find("li:has(ul) > a").prepend(c)},_trigger:function(b,c){var d=this;b.on("click",function(b){b.stopPropagation();var e=c?a(this).next():a(this).parent().next(),f=!1;if(c){var g=a(this).attr("href");f=void 0===g||""===g||"#"===g}if(e=e.length>0?e:!1,d.options.onClickBefore.call(this,b,e),!c||e&&f)b.preventDefault(),d._toggle(e,e.is(":hidden")),d._save();else if(d.options.accordion){var h=d.state=d._parents(a(this));d.$el.find("ul").filter(":visible").each(function(){var b=a(this),c=b.attr("data-index");h.hasOwnProperty(c)||d._toggle(b,!1)}),d._save()}d.options.onClickAfter.call(this,b,e)})},_toggle:function(b,c){var d=this,e=b.attr("data-index"),f=b.parent();if(d.options.onToggleBefore.call(this,b,c),c){if(f.addClass(d.options.openClass),b.slideDown(d.options.slide),d.state[e]=1,d.options.accordion){var g=d.state=d._parents(b);g[e]=d.state[e]=1,d.$el.find("ul").filter(":visible").each(function(){var b=a(this),c=b.attr("data-index");g.hasOwnProperty(c)||d._toggle(b,!1)})}}else f.removeClass(d.options.openClass),b.slideUp(d.options.slide),d.state[e]=0;d.options.onToggleAfter.call(this,b,c)},_parents:function(b,c){var d={},e=b.parent(),f=e.parents("ul");return f.each(function(){var b=a(this),e=b.attr("data-index");return e?void(d[e]=c?b:1):!1}),d},_save:function(){if(this.options.save){var b={};for(var d in this.state)1===this.state[d]&&(b[d]=1);c[this.uuid]=this.state=b,a.cookie(this.options.cookie.name,JSON.stringify(c),this.options.cookie)}},_load:function(){if(this.options.save){if(null===c){var b=a.cookie(this.options.cookie.name);c=b?JSON.parse(b):{}}this.state=c.hasOwnProperty(this.uuid)?c[this.uuid]:{}}},toggle:function(b){var c=this,d=arguments.length;if(1>=d)c.$el.find("ul").each(function(){var d=a(this);c._toggle(d,b)});else{var e,f={},g=Array.prototype.slice.call(arguments,1);d--;for(var h=0;d>h;h++){e=g[h];var i=c.$el.find('ul[data-index="'+e+'"]').first();if(i&&(f[e]=i,b)){var j=c._parents(i,!0);for(var k in j)f.hasOwnProperty(k)||(f[k]=j[k])}}for(e in f)c._toggle(f[e],b)}c._save()},destroy:function(){a.removeData(this.$el),this.$el.find("li:has(ul) > a").unbind("click"),this.$el.find("li:has(ul) > a > span").unbind("click")}},a.fn.navgoco=function(c){if("string"==typeof c&&"_"!==c.charAt(0)&&"init"!==c)var d=!0,e=Array.prototype.slice.call(arguments,1);else c=a.extend({},a.fn.navgoco.defaults,c||{}),a.cookie||(c.save=!1);return this.each(function(f){var g=a(this),h=g.data("navgoco");h||(h=new b(this,d?a.fn.navgoco.defaults:c,f),g.data("navgoco",h)),d&&h[c].apply(h,e)})};var c=null;a.fn.navgoco.defaults={caretHtml:"",accordion:!1,openClass:"open",save:!0,cookie:{name:"navgoco",expires:!1,path:"/"},slide:{duration:400,easing:"swing"},onClickBefore:a.noop,onClickAfter:a.noop,onToggleBefore:a.noop,onToggleAfter:a.noop}}(jQuery); \ No newline at end of file diff --git a/docs/js/jquery.scrollTo.min.js b/docs/js/jquery.scrollTo.min.js new file mode 100644 index 000000000..5f5e01e8e --- /dev/null +++ b/docs/js/jquery.scrollTo.min.js @@ -0,0 +1,7 @@ +/** + * Copyright (c) 2007-2014 Ariel Flesler - afleslergmailcom | http://flesler.blogspot.com + * Licensed under MIT + * @author Ariel Flesler + * @version 1.4.14 + */ +;(function(k){'use strict';k(['jquery'],function($){var j=$.scrollTo=function(a,b,c){return $(window).scrollTo(a,b,c)};j.defaults={axis:'xy',duration:0,limit:!0};j.window=function(a){return $(window)._scrollable()};$.fn._scrollable=function(){return this.map(function(){var a=this,isWin=!a.nodeName||$.inArray(a.nodeName.toLowerCase(),['iframe','#document','html','body'])!=-1;if(!isWin)return a;var b=(a.contentWindow||a).document||a.ownerDocument||a;return/webkit/i.test(navigator.userAgent)||b.compatMode=='BackCompat'?b.body:b.documentElement})};$.fn.scrollTo=function(f,g,h){if(typeof g=='object'){h=g;g=0}if(typeof h=='function')h={onAfter:h};if(f=='max')f=9e9;h=$.extend({},j.defaults,h);g=g||h.duration;h.queue=h.queue&&h.axis.length>1;if(h.queue)g/=2;h.offset=both(h.offset);h.over=both(h.over);return this._scrollable().each(function(){if(f==null)return;var d=this,$elem=$(d),targ=f,toff,attr={},win=$elem.is('html,body');switch(typeof targ){case'number':case'string':if(/^([+-]=?)?\d+(\.\d+)?(px|%)?$/.test(targ)){targ=both(targ);break}targ=win?$(targ):$(targ,this);if(!targ.length)return;case'object':if(targ.is||targ.style)toff=(targ=$(targ)).offset()}var e=$.isFunction(h.offset)&&h.offset(d,targ)||h.offset;$.each(h.axis.split(''),function(i,a){var b=a=='x'?'Left':'Top',pos=b.toLowerCase(),key='scroll'+b,old=d[key],max=j.max(d,a);if(toff){attr[key]=toff[pos]+(win?0:old-$elem.offset()[pos]);if(h.margin){attr[key]-=parseInt(targ.css('margin'+b))||0;attr[key]-=parseInt(targ.css('border'+b+'Width'))||0}attr[key]+=e[pos]||0;if(h.over[pos])attr[key]+=targ[a=='x'?'width':'height']()*h.over[pos]}else{var c=targ[pos];attr[key]=c.slice&&c.slice(-1)=='%'?parseFloat(c)/100*max:c}if(h.limit&&/^\d+$/.test(attr[key]))attr[key]=attr[key]<=0?0:Math.min(attr[key],max);if(!i&&h.queue){if(old!=attr[key])animate(h.onAfterFirst);delete attr[key]}});animate(h.onAfter);function animate(a){$elem.animate(attr,g,h.easing,a&&function(){a.call(this,targ,h)})}}).end()};j.max=function(a,b){var c=b=='x'?'Width':'Height',scroll='scroll'+c;if(!$(a).is('html,body'))return a[scroll]-$(a)[c.toLowerCase()]();var d='client'+c,html=a.ownerDocument.documentElement,body=a.ownerDocument.body;return Math.max(html[scroll],body[scroll])-Math.min(html[d],body[d])};function both(a){return $.isFunction(a)||$.isPlainObject(a)?a:{top:a,left:a}}return j})}(typeof define==='function'&&define.amd?define:function(a,b){if(typeof module!=='undefined'&&module.exports){module.exports=b(require('jquery'))}else{b(jQuery)}})); \ No newline at end of file diff --git a/docs/js/jquery.shuffle.min.js b/docs/js/jquery.shuffle.min.js new file mode 100644 index 000000000..d10312719 --- /dev/null +++ b/docs/js/jquery.shuffle.min.js @@ -0,0 +1,1588 @@ +/*! + * Shuffle.js by @Vestride + * Categorize, sort, and filter a responsive grid of items. + * Dependencies: jQuery 1.9+, Modernizr 2.6.2+ + * @license MIT license + * @version 3.0.0 + */ + +/* Modernizr 2.6.2 (Custom Build) | MIT & BSD + * Build: http://modernizr.com/download/#-csstransforms-csstransforms3d-csstransitions-cssclasses-prefixed-teststyles-testprop-testallprops-prefixes-domprefixes + */ +window.Modernizr=function(a,b,c){function z(a){j.cssText=a}function A(a,b){return z(m.join(a+";")+(b||""))}function B(a,b){return typeof a===b}function C(a,b){return!!~(""+a).indexOf(b)}function D(a,b){for(var d in a){var e=a[d];if(!C(e,"-")&&j[e]!==c)return b=="pfx"?e:!0}return!1}function E(a,b,d){for(var e in a){var f=b[a[e]];if(f!==c)return d===!1?a[e]:B(f,"function")?f.bind(d||b):f}return!1}function F(a,b,c){var d=a.charAt(0).toUpperCase()+a.slice(1),e=(a+" "+o.join(d+" ")+d).split(" ");return B(b,"string")||B(b,"undefined")?D(e,b):(e=(a+" "+p.join(d+" ")+d).split(" "),E(e,b,c))}var d="2.6.2",e={},f=!0,g=b.documentElement,h="modernizr",i=b.createElement(h),j=i.style,k,l={}.toString,m=" -webkit- -moz- -o- -ms- ".split(" "),n="Webkit Moz O ms",o=n.split(" "),p=n.toLowerCase().split(" "),q={},r={},s={},t=[],u=t.slice,v,w=function(a,c,d,e){var f,i,j,k,l=b.createElement("div"),m=b.body,n=m||b.createElement("body");if(parseInt(d,10))while(d--)j=b.createElement("div"),j.id=e?e[d]:h+(d+1),l.appendChild(j);return f=["­",'"].join(""),l.id=h,(m?l:n).innerHTML+=f,n.appendChild(l),m||(n.style.background="",n.style.overflow="hidden",k=g.style.overflow,g.style.overflow="hidden",g.appendChild(n)),i=c(l,a),m?l.parentNode.removeChild(l):(n.parentNode.removeChild(n),g.style.overflow=k),!!i},x={}.hasOwnProperty,y;!B(x,"undefined")&&!B(x.call,"undefined")?y=function(a,b){return x.call(a,b)}:y=function(a,b){return b in a&&B(a.constructor.prototype[b],"undefined")},Function.prototype.bind||(Function.prototype.bind=function(b){var c=this;if(typeof c!="function")throw new TypeError;var d=u.call(arguments,1),e=function(){if(this instanceof e){var a=function(){};a.prototype=c.prototype;var f=new a,g=c.apply(f,d.concat(u.call(arguments)));return Object(g)===g?g:f}return c.apply(b,d.concat(u.call(arguments)))};return e}),q.csstransforms=function(){return!!F("transform")},q.csstransforms3d=function(){var a=!!F("perspective");return a&&"webkitPerspective"in g.style&&w("@media (transform-3d),(-webkit-transform-3d){#modernizr{left:9px;position:absolute;height:3px;}}",function(b,c){a=b.offsetLeft===9&&b.offsetHeight===3}),a},q.csstransitions=function(){return F("transition")};for(var G in q)y(q,G)&&(v=G.toLowerCase(),e[v]=q[G](),t.push((e[v]?"":"no-")+v));return e.addTest=function(a,b){if(typeof a=="object")for(var d in a)y(a,d)&&e.addTest(d,a[d]);else{a=a.toLowerCase();if(e[a]!==c)return e;b=typeof b=="function"?b():b,typeof f!="undefined"&&f&&(g.className+=" "+(b?"":"no-")+a),e[a]=b}return e},z(""),i=k=null,e._version=d,e._prefixes=m,e._domPrefixes=p,e._cssomPrefixes=o,e.testProp=function(a){return D([a])},e.testAllProps=F,e.testStyles=w,e.prefixed=function(a,b,c){return b?F(a,b,c):F(a,"pfx")},g.className=g.className.replace(/(^|\s)no-js(\s|$)/,"$1$2")+(f?" js "+t.join(" "):""),e}(this,this.document); + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['jquery', 'modernizr'], factory); + } else { + window.Shuffle = factory(window.jQuery, window.Modernizr); + } +})(function($, Modernizr, undefined) { + +'use strict'; + + +// Validate Modernizr exists. +// Shuffle requires `csstransitions`, `csstransforms`, `csstransforms3d`, +// and `prefixed` to exist on the Modernizr object. +if (typeof Modernizr !== 'object') { + throw new Error('Shuffle.js requires Modernizr.\n' + + 'http://vestride.github.io/Shuffle/#dependencies'); +} + + +/** + * Returns css prefixed properties like `-webkit-transition` or `box-sizing` + * from `transition` or `boxSizing`, respectively. + * @param {(string|boolean)} prop Property to be prefixed. + * @return {string} The prefixed css property. + */ +function dashify( prop ) { + if (!prop) { + return ''; + } + + // Replace upper case with dash-lowercase, + // then fix ms- prefixes because they're not capitalized. + return prop.replace(/([A-Z])/g, function( str, m1 ) { + return '-' + m1.toLowerCase(); + }).replace(/^ms-/,'-ms-'); +} + +// Constant, prefixed variables. +var TRANSITION = Modernizr.prefixed('transition'); +var TRANSITION_DELAY = Modernizr.prefixed('transitionDelay'); +var TRANSITION_DURATION = Modernizr.prefixed('transitionDuration'); + +// Note(glen): Stock Android 4.1.x browser will fail here because it wrongly +// says it supports non-prefixed transitions. +// https://github.com/Modernizr/Modernizr/issues/897 +var TRANSITIONEND = { + 'WebkitTransition' : 'webkitTransitionEnd', + 'transition' : 'transitionend' +}[ TRANSITION ]; + +var TRANSFORM = Modernizr.prefixed('transform'); +var CSS_TRANSFORM = dashify(TRANSFORM); + +// Constants +var CAN_TRANSITION_TRANSFORMS = Modernizr.csstransforms && Modernizr.csstransitions; +var HAS_TRANSFORMS_3D = Modernizr.csstransforms3d; +var SHUFFLE = 'shuffle'; +var COLUMN_THRESHOLD = 0.3; + +// Configurable. You can change these constants to fit your application. +// The default scale and concealed scale, however, have to be different values. +var ALL_ITEMS = 'all'; +var FILTER_ATTRIBUTE_KEY = 'groups'; +var DEFAULT_SCALE = 1; +var CONCEALED_SCALE = 0.001; + + +// Underscore's throttle function. +function throttle(func, wait, options) { + var context, args, result; + var timeout = null; + var previous = 0; + options = options || {}; + var later = function() { + previous = options.leading === false ? 0 : $.now(); + timeout = null; + result = func.apply(context, args); + context = args = null; + }; + return function() { + var now = $.now(); + if (!previous && options.leading === false) { + previous = now; + } + var remaining = wait - (now - previous); + context = this; + args = arguments; + if (remaining <= 0 || remaining > wait) { + clearTimeout(timeout); + timeout = null; + previous = now; + result = func.apply(context, args); + context = args = null; + } else if (!timeout && options.trailing !== false) { + timeout = setTimeout(later, remaining); + } + return result; + }; +} + +function each(obj, iterator, context) { + for (var i = 0, length = obj.length; i < length; i++) { + if (iterator.call(context, obj[i], i, obj) === {}) { + return; + } + } +} + +function defer(fn, context, wait) { + return setTimeout( $.proxy( fn, context ), wait ); +} + +function arrayMax( array ) { + return Math.max.apply( Math, array ); +} + +function arrayMin( array ) { + return Math.min.apply( Math, array ); +} + + +/** + * Always returns a numeric value, given a value. + * @param {*} value Possibly numeric value. + * @return {number} `value` or zero if `value` isn't numeric. + * @private + */ +function getNumber(value) { + return $.isNumeric(value) ? value : 0; +} + + +/** + * Represents a coordinate pair. + * @param {number} [x=0] X. + * @param {number} [y=0] Y. + */ +var Point = function(x, y) { + this.x = getNumber( x ); + this.y = getNumber( y ); +}; + + +/** + * Whether two points are equal. + * @param {Point} a Point A. + * @param {Point} b Point B. + * @return {boolean} + */ +Point.equals = function(a, b) { + return a.x === b.x && a.y === b.y; +}; + + +// Used for unique instance variables +var id = 0; +var $window = $( window ); + + +/** + * Categorize, sort, and filter a responsive grid of items. + * + * @param {Element} element An element which is the parent container for the grid items. + * @param {Object} [options=Shuffle.options] Options object. + * @constructor + */ +var Shuffle = function( element, options ) { + options = options || {}; + $.extend( this, Shuffle.options, options, Shuffle.settings ); + + this.$el = $(element); + this.element = element; + this.unique = 'shuffle_' + id++; + + this._fire( Shuffle.EventType.LOADING ); + this._init(); + + // Dispatch the done event asynchronously so that people can bind to it after + // Shuffle has been initialized. + defer(function() { + this.initialized = true; + this._fire( Shuffle.EventType.DONE ); + }, this, 16); +}; + + +/** + * Events the container element emits with the .shuffle namespace. + * For example, "done.shuffle". + * @enum {string} + */ +Shuffle.EventType = { + LOADING: 'loading', + DONE: 'done', + LAYOUT: 'layout', + REMOVED: 'removed' +}; + + +/** @enum {string} */ +Shuffle.ClassName = { + BASE: SHUFFLE, + SHUFFLE_ITEM: 'shuffle-item', + FILTERED: 'filtered', + CONCEALED: 'concealed' +}; + + +// Overrideable options +Shuffle.options = { + group: ALL_ITEMS, // Initial filter group. + speed: 250, // Transition/animation speed (milliseconds). + easing: 'ease-out', // CSS easing function to use. + itemSelector: '', // e.g. '.picture-item'. + sizer: null, // Sizer element. Use an element to determine the size of columns and gutters. + gutterWidth: 0, // A static number or function that tells the plugin how wide the gutters between columns are (in pixels). + columnWidth: 0, // A static number or function that returns a number which tells the plugin how wide the columns are (in pixels). + delimeter: null, // If your group is not json, and is comma delimeted, you could set delimeter to ','. + buffer: 0, // Useful for percentage based heights when they might not always be exactly the same (in pixels). + initialSort: null, // Shuffle can be initialized with a sort object. It is the same object given to the sort method. + throttle: throttle, // By default, shuffle will throttle resize events. This can be changed or removed. + throttleTime: 300, // How often shuffle can be called on resize (in milliseconds). + sequentialFadeDelay: 150, // Delay between each item that fades in when adding items. + supported: CAN_TRANSITION_TRANSFORMS // Whether to use transforms or absolute positioning. +}; + + +// Not overrideable +Shuffle.settings = { + useSizer: false, + itemCss : { // default CSS for each item + position: 'absolute', + top: 0, + left: 0, + visibility: 'visible' + }, + revealAppendedDelay: 300, + lastSort: {}, + lastFilter: ALL_ITEMS, + enabled: true, + destroyed: false, + initialized: false, + _animations: [], + styleQueue: [] +}; + + +// Expose for testing. +Shuffle.Point = Point; + + +/** + * Static methods. + */ + +/** + * If the browser has 3d transforms available, build a string with those, + * otherwise use 2d transforms. + * @param {Point} point X and Y positions. + * @param {number} scale Scale amount. + * @return {string} A normalized string which can be used with the transform style. + * @private + */ +Shuffle._getItemTransformString = function(point, scale) { + if ( HAS_TRANSFORMS_3D ) { + return 'translate3d(' + point.x + 'px, ' + point.y + 'px, 0) scale3d(' + scale + ', ' + scale + ', 1)'; + } else { + return 'translate(' + point.x + 'px, ' + point.y + 'px) scale(' + scale + ')'; + } +}; + + +/** + * Retrieve the computed style for an element, parsed as a float. This should + * not be used for width or height values because jQuery mangles them and they + * are not precise enough. + * @param {Element} element Element to get style for. + * @param {string} style Style property. + * @return {number} The parsed computed value or zero if that fails because IE + * will return 'auto' when the element doesn't have margins instead of + * the computed style. + * @private + */ +Shuffle._getNumberStyle = function( element, style ) { + return Shuffle._getFloat( $( element ).css( style ) ); +}; + + +/** + * Parse a string as an integer. + * @param {string} value String integer. + * @return {number} The string as an integer or zero. + * @private + */ +Shuffle._getInt = function(value) { + return getNumber( parseInt( value, 10 ) ); +}; + +/** + * Parse a string as an float. + * @param {string} value String float. + * @return {number} The string as an float or zero. + * @private + */ +Shuffle._getFloat = function(value) { + return getNumber( parseFloat( value ) ); +}; + + +/** + * Returns the outer width of an element, optionally including its margins. + * The `offsetWidth` property must be used because having a scale transform + * on the element affects the bounding box. Sadly, Firefox doesn't return an + * integer value for offsetWidth (yet). + * @param {Element} element The element. + * @param {boolean} [includeMargins] Whether to include margins. Default is false. + * @return {number} The width. + */ +Shuffle._getOuterWidth = function( element, includeMargins ) { + var width = element.offsetWidth; + + // Use jQuery here because it uses getComputedStyle internally and is + // cross-browser. Using the style property of the element will only work + // if there are inline styles. + if ( includeMargins ) { + var marginLeft = Shuffle._getNumberStyle( element, 'marginLeft'); + var marginRight = Shuffle._getNumberStyle( element, 'marginRight'); + width += marginLeft + marginRight; + } + + return width; +}; + + +/** + * Returns the outer height of an element, optionally including its margins. + * @param {Element} element The element. + * @param {boolean} [includeMargins] Whether to include margins. Default is false. + * @return {number} The height. + */ +Shuffle._getOuterHeight = function( element, includeMargins ) { + var height = element.offsetHeight; + + if ( includeMargins ) { + var marginTop = Shuffle._getNumberStyle( element, 'marginTop'); + var marginBottom = Shuffle._getNumberStyle( element, 'marginBottom'); + height += marginTop + marginBottom; + } + + return height; +}; + + +/** + * Change a property or execute a function which will not have a transition + * @param {Element} element DOM element that won't be transitioned + * @param {Function} callback A function which will be called while transition + * is set to 0ms. + * @param {Object} [context] Optional context for the callback function. + * @private + */ +Shuffle._skipTransition = function( element, callback, context ) { + var duration = element.style[ TRANSITION_DURATION ]; + + // Set the duration to zero so it happens immediately + element.style[ TRANSITION_DURATION ] = '0ms'; // ms needed for firefox! + + callback.call( context ); + + // Force reflow + var reflow = element.offsetWidth; + // Avoid jshint warnings: unused variables and expressions. + reflow = null; + + // Put the duration back + element.style[ TRANSITION_DURATION ] = duration; +}; + + +/** + * Instance methods. + */ + +Shuffle.prototype._init = function() { + this.$items = this._getItems(); + + this.sizer = this._getElementOption( this.sizer ); + + if ( this.sizer ) { + this.useSizer = true; + } + + // Add class and invalidate styles + this.$el.addClass( Shuffle.ClassName.BASE ); + + // Set initial css for each item + this._initItems(); + + // Bind resize events + // http://stackoverflow.com/questions/1852751/window-resize-event-firing-in-internet-explorer + $window.on('resize.' + SHUFFLE + '.' + this.unique, this._getResizeFunction()); + + // Get container css all in one request. Causes reflow + var containerCSS = this.$el.css(['position', 'overflow']); + var containerWidth = Shuffle._getOuterWidth( this.element ); + + // Add styles to the container if it doesn't have them. + this._validateStyles( containerCSS ); + + // We already got the container's width above, no need to cause another reflow getting it again... + // Calculate the number of columns there will be + this._setColumns( containerWidth ); + + // Kick off! + this.shuffle( this.group, this.initialSort ); + + // The shuffle items haven't had transitions set on them yet + // so the user doesn't see the first layout. Set them now that the first layout is done. + if ( this.supported ) { + defer(function() { + this._setTransitions(); + this.element.style[ TRANSITION ] = 'height ' + this.speed + 'ms ' + this.easing; + }, this); + } +}; + + +/** + * Returns a throttled and proxied function for the resize handler. + * @return {Function} + * @private + */ +Shuffle.prototype._getResizeFunction = function() { + var resizeFunction = $.proxy( this._onResize, this ); + return this.throttle ? + this.throttle( resizeFunction, this.throttleTime ) : + resizeFunction; +}; + + +/** + * Retrieve an element from an option. + * @param {string|jQuery|Element} option The option to check. + * @return {?Element} The plain element or null. + * @private + */ +Shuffle.prototype._getElementOption = function( option ) { + // If column width is a string, treat is as a selector and search for the + // sizer element within the outermost container + if ( typeof option === 'string' ) { + return this.$el.find( option )[0] || null; + + // Check for an element + } else if ( option && option.nodeType && option.nodeType === 1 ) { + return option; + + // Check for jQuery object + } else if ( option && option.jquery ) { + return option[0]; + } + + return null; +}; + + +/** + * Ensures the shuffle container has the css styles it needs applied to it. + * @param {Object} styles Key value pairs for position and overflow. + * @private + */ +Shuffle.prototype._validateStyles = function(styles) { + // Position cannot be static. + if ( styles.position === 'static' ) { + this.element.style.position = 'relative'; + } + + // Overflow has to be hidden + if ( styles.overflow !== 'hidden' ) { + this.element.style.overflow = 'hidden'; + } +}; + + +/** + * Filter the elements by a category. + * @param {string} [category] Category to filter by. If it's given, the last + * category will be used to filter the items. + * @param {ArrayLike} [$collection] Optionally filter a collection. Defaults to + * all the items. + * @return {jQuery} Filtered items. + * @private + */ +Shuffle.prototype._filter = function( category, $collection ) { + category = category || this.lastFilter; + $collection = $collection || this.$items; + + var set = this._getFilteredSets( category, $collection ); + + // Individually add/remove concealed/filtered classes + this._toggleFilterClasses( set.filtered, set.concealed ); + + // Save the last filter in case elements are appended. + this.lastFilter = category; + + // This is saved mainly because providing a filter function (like searching) + // will overwrite the `lastFilter` property every time its called. + if ( typeof category === 'string' ) { + this.group = category; + } + + return set.filtered; +}; + + +/** + * Returns an object containing the filtered and concealed elements. + * @param {string|Function} category Category or function to filter by. + * @param {ArrayLike.} $items A collection of items to filter. + * @return {!{filtered: jQuery, concealed: jQuery}} + * @private + */ +Shuffle.prototype._getFilteredSets = function( category, $items ) { + var $filtered = $(); + var $concealed = $(); + + // category === 'all', add filtered class to everything + if ( category === ALL_ITEMS ) { + $filtered = $items; + + // Loop through each item and use provided function to determine + // whether to hide it or not. + } else { + each($items, function( el ) { + var $item = $(el); + if ( this._doesPassFilter( category, $item ) ) { + $filtered = $filtered.add( $item ); + } else { + $concealed = $concealed.add( $item ); + } + }, this); + } + + return { + filtered: $filtered, + concealed: $concealed + }; +}; + + +/** + * Test an item to see if it passes a category. + * @param {string|Function} category Category or function to filter by. + * @param {jQuery} $item A single item, wrapped with jQuery. + * @return {boolean} Whether it passes the category/filter. + * @private + */ +Shuffle.prototype._doesPassFilter = function( category, $item ) { + if ( $.isFunction( category ) ) { + return category.call( $item[0], $item, this ); + + // Check each element's data-groups attribute against the given category. + } else { + var groups = $item.data( FILTER_ATTRIBUTE_KEY ); + var keys = this.delimeter && !$.isArray( groups ) ? + groups.split( this.delimeter ) : + groups; + return $.inArray(category, keys) > -1; + } +}; + + +/** + * Toggles the filtered and concealed class names. + * @param {jQuery} $filtered Filtered set. + * @param {jQuery} $concealed Concealed set. + * @private + */ +Shuffle.prototype._toggleFilterClasses = function( $filtered, $concealed ) { + $filtered + .removeClass( Shuffle.ClassName.CONCEALED ) + .addClass( Shuffle.ClassName.FILTERED ); + $concealed + .removeClass( Shuffle.ClassName.FILTERED ) + .addClass( Shuffle.ClassName.CONCEALED ); +}; + + +/** + * Set the initial css for each item + * @param {jQuery} [$items] Optionally specifiy at set to initialize + */ +Shuffle.prototype._initItems = function( $items ) { + $items = $items || this.$items; + $items.addClass([ + Shuffle.ClassName.SHUFFLE_ITEM, + Shuffle.ClassName.FILTERED + ].join(' ')); + $items.css( this.itemCss ).data('point', new Point()).data('scale', DEFAULT_SCALE); +}; + + +/** + * Updates the filtered item count. + * @private + */ +Shuffle.prototype._updateItemCount = function() { + this.visibleItems = this._getFilteredItems().length; +}; + + +/** + * Sets css transform transition on a an element. + * @param {Element} element Element to set transition on. + * @private + */ +Shuffle.prototype._setTransition = function( element ) { + element.style[ TRANSITION ] = CSS_TRANSFORM + ' ' + this.speed + 'ms ' + + this.easing + ', opacity ' + this.speed + 'ms ' + this.easing; +}; + + +/** + * Sets css transform transition on a group of elements. + * @param {ArrayLike.} $items Elements to set transitions on. + * @private + */ +Shuffle.prototype._setTransitions = function( $items ) { + $items = $items || this.$items; + each($items, function( el ) { + this._setTransition( el ); + }, this); +}; + + +/** + * Sets a transition delay on a collection of elements, making each delay + * greater than the last. + * @param {ArrayLike.} $collection Array to iterate over. + */ +Shuffle.prototype._setSequentialDelay = function( $collection ) { + if ( !this.supported ) { + return; + } + + // $collection can be an array of dom elements or jquery object + each($collection, function( el, i ) { + // This works because the transition-property: transform, opacity; + el.style[ TRANSITION_DELAY ] = '0ms,' + ((i + 1) * this.sequentialFadeDelay) + 'ms'; + }, this); +}; + + +Shuffle.prototype._getItems = function() { + return this.$el.children( this.itemSelector ); +}; + + +Shuffle.prototype._getFilteredItems = function() { + return this.$items.filter('.' + Shuffle.ClassName.FILTERED); +}; + + +Shuffle.prototype._getConcealedItems = function() { + return this.$items.filter('.' + Shuffle.ClassName.CONCEALED); +}; + + +/** + * Returns the column size, based on column width and sizer options. + * @param {number} containerWidth Size of the parent container. + * @param {number} gutterSize Size of the gutters. + * @return {number} + * @private + */ +Shuffle.prototype._getColumnSize = function( containerWidth, gutterSize ) { + var size; + + // If the columnWidth property is a function, then the grid is fluid + if ( $.isFunction( this.columnWidth ) ) { + size = this.columnWidth(containerWidth); + + // columnWidth option isn't a function, are they using a sizing element? + } else if ( this.useSizer ) { + size = Shuffle._getOuterWidth(this.sizer); + + // if not, how about the explicitly set option? + } else if ( this.columnWidth ) { + size = this.columnWidth; + + // or use the size of the first item + } else if ( this.$items.length > 0 ) { + size = Shuffle._getOuterWidth(this.$items[0], true); + + // if there's no items, use size of container + } else { + size = containerWidth; + } + + // Don't let them set a column width of zero. + if ( size === 0 ) { + size = containerWidth; + } + + return size + gutterSize; +}; + + +/** + * Returns the gutter size, based on gutter width and sizer options. + * @param {number} containerWidth Size of the parent container. + * @return {number} + * @private + */ +Shuffle.prototype._getGutterSize = function( containerWidth ) { + var size; + if ( $.isFunction( this.gutterWidth ) ) { + size = this.gutterWidth(containerWidth); + } else if ( this.useSizer ) { + size = Shuffle._getNumberStyle(this.sizer, 'marginLeft'); + } else { + size = this.gutterWidth; + } + + return size; +}; + + +/** + * Calculate the number of columns to be used. Gets css if using sizer element. + * @param {number} [theContainerWidth] Optionally specify a container width if it's already available. + */ +Shuffle.prototype._setColumns = function( theContainerWidth ) { + var containerWidth = theContainerWidth || Shuffle._getOuterWidth( this.element ); + var gutter = this._getGutterSize( containerWidth ); + var columnWidth = this._getColumnSize( containerWidth, gutter ); + var calculatedColumns = (containerWidth + gutter) / columnWidth; + + // Widths given from getComputedStyle are not precise enough... + if ( Math.abs(Math.round(calculatedColumns) - calculatedColumns) < COLUMN_THRESHOLD ) { + // e.g. calculatedColumns = 11.998876 + calculatedColumns = Math.round( calculatedColumns ); + } + + this.cols = Math.max( Math.floor(calculatedColumns), 1 ); + this.containerWidth = containerWidth; + this.colWidth = columnWidth; +}; + +/** + * Adjust the height of the grid + */ +Shuffle.prototype._setContainerSize = function() { + this.$el.css( 'height', this._getContainerSize() ); +}; + + +/** + * Based on the column heights, it returns the biggest one. + * @return {number} + * @private + */ +Shuffle.prototype._getContainerSize = function() { + return arrayMax( this.positions ); +}; + + +/** + * Fire events with .shuffle namespace + */ +Shuffle.prototype._fire = function( name, args ) { + this.$el.trigger( name + '.' + SHUFFLE, args && args.length ? args : [ this ] ); +}; + + +/** + * Zeros out the y columns array, which is used to determine item placement. + * @private + */ +Shuffle.prototype._resetCols = function() { + var i = this.cols; + this.positions = []; + while (i--) { + this.positions.push( 0 ); + } +}; + + +/** + * Loops through each item that should be shown and calculates the x, y position. + * @param {Array.} items Array of items that will be shown/layed out in order in their array. + * Because jQuery collection are always ordered in DOM order, we can't pass a jq collection. + * @param {boolean} [isOnlyPosition=false] If true this will position the items with zero opacity. + */ +Shuffle.prototype._layout = function( items, isOnlyPosition ) { + each(items, function( item ) { + this._layoutItem( item, !!isOnlyPosition ); + }, this); + + // `_layout` always happens after `_shrink`, so it's safe to process the style + // queue here with styles from the shrink method. + this._processStyleQueue(); + + // Adjust the height of the container. + this._setContainerSize(); +}; + + +/** + * Calculates the position of the item and pushes it onto the style queue. + * @param {Element} item Element which is being positioned. + * @param {boolean} isOnlyPosition Whether to position the item, but with zero + * opacity so that it can fade in later. + * @private + */ +Shuffle.prototype._layoutItem = function( item, isOnlyPosition ) { + var $item = $(item); + var itemData = $item.data(); + var currPos = itemData.point; + var currScale = itemData.scale; + var itemSize = { + width: Shuffle._getOuterWidth( item, true ), + height: Shuffle._getOuterHeight( item, true ) + }; + var pos = this._getItemPosition( itemSize ); + + // If the item will not change its position, do not add it to the render + // queue. Transitions don't fire when setting a property to the same value. + if ( Point.equals(currPos, pos) && currScale === DEFAULT_SCALE ) { + return; + } + + // Save data for shrink + itemData.point = pos; + itemData.scale = DEFAULT_SCALE; + + this.styleQueue.push({ + $item: $item, + point: pos, + scale: DEFAULT_SCALE, + opacity: isOnlyPosition ? 0 : 1, + skipTransition: isOnlyPosition, + callfront: function() { + if ( !isOnlyPosition ) { + $item.css( 'visibility', 'visible' ); + } + }, + callback: function() { + if ( isOnlyPosition ) { + $item.css( 'visibility', 'hidden' ); + } + } + }); +}; + + +/** + * Determine the location of the next item, based on its size. + * @param {{width: number, height: number}} itemSize Object with width and height. + * @return {Point} + * @private + */ +Shuffle.prototype._getItemPosition = function( itemSize ) { + var columnSpan = this._getColumnSpan( itemSize.width, this.colWidth, this.cols ); + + var setY = this._getColumnSet( columnSpan, this.cols ); + + // Finds the index of the smallest number in the set. + var shortColumnIndex = this._getShortColumn( setY, this.buffer ); + + // Position the item + var point = new Point( + Math.round( this.colWidth * shortColumnIndex ), + Math.round( setY[shortColumnIndex] )); + + // Update the columns array with the new values for each column. + // e.g. before the update the columns could be [250, 0, 0, 0] for an item + // which spans 2 columns. After it would be [250, itemHeight, itemHeight, 0]. + var setHeight = setY[shortColumnIndex] + itemSize.height; + var setSpan = this.cols + 1 - setY.length; + for ( var i = 0; i < setSpan; i++ ) { + this.positions[ shortColumnIndex + i ] = setHeight; + } + + return point; +}; + + +/** + * Determine the number of columns an items spans. + * @param {number} itemWidth Width of the item. + * @param {number} columnWidth Width of the column (includes gutter). + * @param {number} columns Total number of columns + * @return {number} + * @private + */ +Shuffle.prototype._getColumnSpan = function( itemWidth, columnWidth, columns ) { + var columnSpan = itemWidth / columnWidth; + + // If the difference between the rounded column span number and the + // calculated column span number is really small, round the number to + // make it fit. + if ( Math.abs(Math.round( columnSpan ) - columnSpan ) < COLUMN_THRESHOLD ) { + // e.g. columnSpan = 4.0089945390298745 + columnSpan = Math.round( columnSpan ); + } + + // Ensure the column span is not more than the amount of columns in the whole layout. + return Math.min( Math.ceil( columnSpan ), columns ); +}; + + +/** + * Retrieves the column set to use for placement. + * @param {number} columnSpan The number of columns this current item spans. + * @param {number} columns The total columns in the grid. + * @return {Array.} An array of numbers represeting the column set. + * @private + */ +Shuffle.prototype._getColumnSet = function( columnSpan, columns ) { + // The item spans only one column. + if ( columnSpan === 1 ) { + return this.positions; + + // The item spans more than one column, figure out how many different + // places it could fit horizontally. + // The group count is the number of places within the positions this block + // could fit, ignoring the current positions of items. + // Imagine a 2 column brick as the second item in a 4 column grid with + // 10px height each. Find the places it would fit: + // [10, 0, 0, 0] + // | | | + // * * * + // + // Then take the places which fit and get the bigger of the two: + // max([10, 0]), max([0, 0]), max([0, 0]) = [10, 0, 0] + // + // Next, find the first smallest number (the short column). + // [10, 0, 0] + // | + // * + // + // And that's where it should be placed! + } else { + var groupCount = columns + 1 - columnSpan; + var groupY = []; + + // For how many possible positions for this item there are. + for ( var i = 0; i < groupCount; i++ ) { + // Find the bigger value for each place it could fit. + groupY[i] = arrayMax( this.positions.slice( i, i + columnSpan ) ); + } + + return groupY; + } +}; + + +/** + * Find index of short column, the first from the left where this item will go. + * + * @param {Array.} positions The array to search for the smallest number. + * @param {number} buffer Optional buffer which is very useful when the height + * is a percentage of the width. + * @return {number} Index of the short column. + * @private + */ +Shuffle.prototype._getShortColumn = function( positions, buffer ) { + var minPosition = arrayMin( positions ); + for (var i = 0, len = positions.length; i < len; i++) { + if ( positions[i] >= minPosition - buffer && positions[i] <= minPosition + buffer ) { + return i; + } + } + return 0; +}; + + +/** + * Hides the elements that don't match our filter. + * @param {jQuery} $collection jQuery collection to shrink. + * @private + */ +Shuffle.prototype._shrink = function( $collection ) { + var $concealed = $collection || this._getConcealedItems(); + + each($concealed, function( item ) { + var $item = $(item); + var itemData = $item.data(); + + // Continuing would add a transitionend event listener to the element, but + // that listener would not execute because the transform and opacity would + // stay the same. + if ( itemData.scale === CONCEALED_SCALE ) { + return; + } + + itemData.scale = CONCEALED_SCALE; + + this.styleQueue.push({ + $item: $item, + point: itemData.point, + scale : CONCEALED_SCALE, + opacity: 0, + callback: function() { + $item.css( 'visibility', 'hidden' ); + } + }); + }, this); +}; + + +/** + * Resize handler. + * @private + */ +Shuffle.prototype._onResize = function() { + // If shuffle is disabled, destroyed, don't do anything + if ( !this.enabled || this.destroyed || this.isTransitioning ) { + return; + } + + // Will need to check height in the future if it's layed out horizontaly + var containerWidth = Shuffle._getOuterWidth( this.element ); + + // containerWidth hasn't changed, don't do anything + if ( containerWidth === this.containerWidth ) { + return; + } + + this.update(); +}; + + +/** + * Returns styles for either jQuery animate or transition. + * @param {Object} opts Transition options. + * @return {!Object} Transforms for transitions, left/top for animate. + * @private + */ +Shuffle.prototype._getStylesForTransition = function( opts ) { + var styles = { + opacity: opts.opacity + }; + + if ( this.supported ) { + styles[ TRANSFORM ] = Shuffle._getItemTransformString( opts.point, opts.scale ); + } else { + styles.left = opts.point.x; + styles.top = opts.point.y; + } + + return styles; +}; + + +/** + * Transitions an item in the grid + * + * @param {Object} opts options. + * @param {jQuery} opts.$item jQuery object representing the current item. + * @param {Point} opts.point A point object with the x and y coordinates. + * @param {number} opts.scale Amount to scale the item. + * @param {number} opts.opacity Opacity of the item. + * @param {Function} opts.callback Complete function for the animation. + * @param {Function} opts.callfront Function to call before transitioning. + * @private + */ +Shuffle.prototype._transition = function( opts ) { + var styles = this._getStylesForTransition( opts ); + this._startItemAnimation( opts.$item, styles, opts.callfront || $.noop, opts.callback || $.noop ); +}; + + +Shuffle.prototype._startItemAnimation = function( $item, styles, callfront, callback ) { + // Transition end handler removes its listener. + function handleTransitionEnd( evt ) { + // Make sure this event handler has not bubbled up from a child. + if ( evt.target === evt.currentTarget ) { + $( evt.target ).off( TRANSITIONEND, handleTransitionEnd ); + callback(); + } + } + + callfront(); + + // Transitions are not set until shuffle has loaded to avoid the initial transition. + if ( !this.initialized ) { + $item.css( styles ); + callback(); + return; + } + + // Use CSS Transforms if we have them + if ( this.supported ) { + $item.css( styles ); + $item.on( TRANSITIONEND, handleTransitionEnd ); + + // Use jQuery to animate left/top + } else { + // Save the deferred object which jQuery returns. + var anim = $item.stop( true ).animate( styles, this.speed, 'swing', callback ); + // Push the animation to the list of pending animations. + this._animations.push( anim.promise() ); + } +}; + + +/** + * Execute the styles gathered in the style queue. This applies styles to elements, + * triggering transitions. + * @param {boolean} noLayout Whether to trigger a layout event. + * @private + */ +Shuffle.prototype._processStyleQueue = function( noLayout ) { + var $transitions = $(); + + // Iterate over the queue and keep track of ones that use transitions. + each(this.styleQueue, function( transitionObj ) { + if ( transitionObj.skipTransition ) { + this._styleImmediately( transitionObj ); + } else { + $transitions = $transitions.add( transitionObj.$item ); + this._transition( transitionObj ); + } + }, this); + + + if ( $transitions.length > 0 && this.initialized ) { + // Set flag that shuffle is currently in motion. + this.isTransitioning = true; + + if ( this.supported ) { + this._whenCollectionDone( $transitions, TRANSITIONEND, this._movementFinished ); + + // The _transition function appends a promise to the animations array. + // When they're all complete, do things. + } else { + this._whenAnimationsDone( this._movementFinished ); + } + + // A call to layout happened, but none of the newly filtered items will + // change position. Asynchronously fire the callback here. + } else if ( !noLayout ) { + defer( this._layoutEnd, this ); + } + + // Remove everything in the style queue + this.styleQueue.length = 0; +}; + + +/** + * Apply styles without a transition. + * @param {Object} opts Transitions options object. + * @private + */ +Shuffle.prototype._styleImmediately = function( opts ) { + Shuffle._skipTransition(opts.$item[0], function() { + opts.$item.css( this._getStylesForTransition( opts ) ); + }, this); +}; + +Shuffle.prototype._movementFinished = function() { + this.isTransitioning = false; + this._layoutEnd(); +}; + +Shuffle.prototype._layoutEnd = function() { + this._fire( Shuffle.EventType.LAYOUT ); +}; + +Shuffle.prototype._addItems = function( $newItems, addToEnd, isSequential ) { + // Add classes and set initial positions. + this._initItems( $newItems ); + + // Add transition to each item. + this._setTransitions( $newItems ); + + // Update the list of + this.$items = this._getItems(); + + // Shrink all items (without transitions). + this._shrink( $newItems ); + each(this.styleQueue, function( transitionObj ) { + transitionObj.skipTransition = true; + }); + + // Apply shrink positions, but do not cause a layout event. + this._processStyleQueue( true ); + + if ( addToEnd ) { + this._addItemsToEnd( $newItems, isSequential ); + } else { + this.shuffle( this.lastFilter ); + } +}; + + +Shuffle.prototype._addItemsToEnd = function( $newItems, isSequential ) { + // Get ones that passed the current filter + var $passed = this._filter( null, $newItems ); + var passed = $passed.get(); + + // How many filtered elements? + this._updateItemCount(); + + this._layout( passed, true ); + + if ( isSequential && this.supported ) { + this._setSequentialDelay( passed ); + } + + this._revealAppended( passed ); +}; + + +/** + * Triggers appended elements to fade in. + * @param {ArrayLike.} $newFilteredItems Collection of elements. + * @private + */ +Shuffle.prototype._revealAppended = function( newFilteredItems ) { + defer(function() { + each(newFilteredItems, function( el ) { + var $item = $( el ); + this._transition({ + $item: $item, + opacity: 1, + point: $item.data('point'), + scale: DEFAULT_SCALE + }); + }, this); + + this._whenCollectionDone($(newFilteredItems), TRANSITIONEND, function() { + $(newFilteredItems).css( TRANSITION_DELAY, '0ms' ); + this._movementFinished(); + }); + }, this, this.revealAppendedDelay); +}; + + +/** + * Execute a function when an event has been triggered for every item in a collection. + * @param {jQuery} $collection Collection of elements. + * @param {string} eventName Event to listen for. + * @param {Function} callback Callback to execute when they're done. + * @private + */ +Shuffle.prototype._whenCollectionDone = function( $collection, eventName, callback ) { + var done = 0; + var items = $collection.length; + var self = this; + + function handleEventName( evt ) { + if ( evt.target === evt.currentTarget ) { + $( evt.target ).off( eventName, handleEventName ); + done++; + + // Execute callback if all items have emitted the correct event. + if ( done === items ) { + callback.call( self ); + } + } + } + + // Bind the event to all items. + $collection.on( eventName, handleEventName ); +}; + + +/** + * Execute a callback after jQuery `animate` for a collection has finished. + * @param {Function} callback Callback to execute when they're done. + * @private + */ +Shuffle.prototype._whenAnimationsDone = function( callback ) { + $.when.apply( null, this._animations ).always( $.proxy( function() { + this._animations.length = 0; + callback.call( this ); + }, this )); +}; + + +/** + * Public Methods + */ + +/** + * The magic. This is what makes the plugin 'shuffle' + * @param {string|Function} [category] Category to filter by. Can be a function + * @param {Object} [sortObj] A sort object which can sort the filtered set + */ +Shuffle.prototype.shuffle = function( category, sortObj ) { + if ( !this.enabled || this.isTransitioning ) { + return; + } + + if ( !category ) { + category = ALL_ITEMS; + } + + this._filter( category ); + + // How many filtered elements? + this._updateItemCount(); + + // Shrink each concealed item + this._shrink(); + + // Update transforms on .filtered elements so they will animate to their new positions + this.sort( sortObj ); +}; + + +/** + * Gets the .filtered elements, sorts them, and passes them to layout. + * @param {Object} opts the options object for the sorted plugin + */ +Shuffle.prototype.sort = function( opts ) { + if ( this.enabled && !this.isTransitioning ) { + this._resetCols(); + + var sortOptions = opts || this.lastSort; + var items = this._getFilteredItems().sorted( sortOptions ); + + this._layout( items ); + + this.lastSort = sortOptions; + } +}; + + +/** + * Reposition everything. + * @param {boolean} isOnlyLayout If true, column and gutter widths won't be + * recalculated. + */ +Shuffle.prototype.update = function( isOnlyLayout ) { + if ( this.enabled && !this.isTransitioning ) { + + if ( !isOnlyLayout ) { + // Get updated colCount + this._setColumns(); + } + + // Layout items + this.sort(); + } +}; + + +/** + * Use this instead of `update()` if you don't need the columns and gutters updated + * Maybe an image inside `shuffle` loaded (and now has a height), which means calculations + * could be off. + */ +Shuffle.prototype.layout = function() { + this.update( true ); +}; + + +/** + * New items have been appended to shuffle. Fade them in sequentially + * @param {jQuery} $newItems jQuery collection of new items + * @param {boolean} [addToEnd=false] If true, new items will be added to the end / bottom + * of the items. If not true, items will be mixed in with the current sort order. + * @param {boolean} [isSequential=true] If false, new items won't sequentially fade in + */ +Shuffle.prototype.appended = function( $newItems, addToEnd, isSequential ) { + this._addItems( $newItems, addToEnd === true, isSequential !== false ); +}; + + +/** + * Disables shuffle from updating dimensions and layout on resize + */ +Shuffle.prototype.disable = function() { + this.enabled = false; +}; + + +/** + * Enables shuffle again + * @param {boolean} [isUpdateLayout=true] if undefined, shuffle will update columns and gutters + */ +Shuffle.prototype.enable = function( isUpdateLayout ) { + this.enabled = true; + if ( isUpdateLayout !== false ) { + this.update(); + } +}; + + +/** + * Remove 1 or more shuffle items + * @param {jQuery} $collection A jQuery object containing one or more element in shuffle + * @return {Shuffle} The shuffle object + */ +Shuffle.prototype.remove = function( $collection ) { + + // If this isn't a jquery object, exit + if ( !$collection.length || !$collection.jquery ) { + return; + } + + function handleRemoved() { + // Remove the collection in the callback + $collection.remove(); + + // Update things now that elements have been removed. + this.$items = this._getItems(); + this._updateItemCount(); + + this._fire( Shuffle.EventType.REMOVED, [ $collection, this ] ); + + // Let it get garbage collected + $collection = null; + } + + // Hide collection first. + this._toggleFilterClasses( $(), $collection ); + this._shrink( $collection ); + + this.sort(); + + this.$el.one( Shuffle.EventType.LAYOUT + '.' + SHUFFLE, $.proxy( handleRemoved, this ) ); +}; + + +/** + * Destroys shuffle, removes events, styles, and classes + */ +Shuffle.prototype.destroy = function() { + // If there is more than one shuffle instance on the page, + // removing the resize handler from the window would remove them + // all. This is why a unique value is needed. + $window.off('.' + this.unique); + + // Reset container styles + this.$el + .removeClass( SHUFFLE ) + .removeAttr('style') + .removeData( SHUFFLE ); + + // Reset individual item styles + this.$items + .removeAttr('style') + .removeData('point') + .removeData('scale') + .removeClass([ + Shuffle.ClassName.CONCEALED, + Shuffle.ClassName.FILTERED, + Shuffle.ClassName.SHUFFLE_ITEM + ].join(' ')); + + // Null DOM references + this.$items = null; + this.$el = null; + this.sizer = null; + this.element = null; + + // Set a flag so if a debounced resize has been triggered, + // it can first check if it is actually destroyed and not doing anything + this.destroyed = true; +}; + + +// Plugin definition +$.fn.shuffle = function( opts ) { + var args = Array.prototype.slice.call( arguments, 1 ); + return this.each(function() { + var $this = $( this ); + var shuffle = $this.data( SHUFFLE ); + + // If we don't have a stored shuffle, make a new one and save it + if ( !shuffle ) { + shuffle = new Shuffle( this, opts ); + $this.data( SHUFFLE, shuffle ); + } else if ( typeof opts === 'string' && shuffle[ opts ] ) { + shuffle[ opts ].apply( shuffle, args ); + } + }); +}; + + +// http://stackoverflow.com/a/962890/373422 +function randomize( array ) { + var tmp, current; + var top = array.length; + + if ( !top ) { + return array; + } + + while ( --top ) { + current = Math.floor( Math.random() * (top + 1) ); + tmp = array[ current ]; + array[ current ] = array[ top ]; + array[ top ] = tmp; + } + + return array; +} + + +// You can return `undefined` from the `by` function to revert to DOM order +// This plugin does NOT return a jQuery object. It returns a plain array because +// jQuery sorts everything in DOM order. +$.fn.sorted = function(options) { + var opts = $.extend({}, $.fn.sorted.defaults, options); + var arr = this.get(); + var revert = false; + + if ( !arr.length ) { + return []; + } + + if ( opts.randomize ) { + return randomize( arr ); + } + + // Sort the elements by the opts.by function. + // If we don't have opts.by, default to DOM order + if ( $.isFunction( opts.by ) ) { + arr.sort(function(a, b) { + + // Exit early if we already know we want to revert + if ( revert ) { + return 0; + } + + var valA = opts.by($(a)); + var valB = opts.by($(b)); + + // If both values are undefined, use the DOM order + if ( valA === undefined && valB === undefined ) { + revert = true; + return 0; + } + + if ( valA < valB || valA === 'sortFirst' || valB === 'sortLast' ) { + return -1; + } + + if ( valA > valB || valA === 'sortLast' || valB === 'sortFirst' ) { + return 1; + } + + return 0; + }); + } + + // Revert to the original array if necessary + if ( revert ) { + return this.get(); + } + + if ( opts.reverse ) { + arr.reverse(); + } + + return arr; +}; + + +$.fn.sorted.defaults = { + reverse: false, // Use array.reverse() to reverse the results + by: null, // Sorting function + randomize: false // If true, this will skip the sorting and return a randomized order in the array +}; + +return Shuffle; + +}); \ No newline at end of file diff --git a/docs/js/mydoc_scroll.html b/docs/js/mydoc_scroll.html new file mode 100644 index 000000000..39fa55e99 --- /dev/null +++ b/docs/js/mydoc_scroll.html @@ -0,0 +1,240 @@ +--- +title: Scroll layout +type: scroll +keywords: json, scrolling, scrollto, jquery plugin +tags: special_layouts +last_updated: November 30, 2015 +summary: "This page demonstrates how you the integration of a script called ScrollTo, which is used here to link definitions of a JSON code sample to a list of definitions for that particular term. The scenario here is that the JSON blocks are really long, with extensive nesting and subnesting, which makes it difficult for tables below the JSON to adequately explain the term in a usable way." +--- + +{% if site.output == "pdf" %} +{{site.data.alerts.note}} The content on this page doesn't display well on PDF, but I included it anyway so you could see the problems this layout poses if you're including it in PDF. {{site.data.alerts.end}} +{% endif %} + +{% if site.output == "web" %} + + + + + + + + + + +
+
+ + +
+
+ + +{{site.data.alerts.note}} This was mostly an experiment to see if there was a better way to document a long JSON code example. I haven't actually used this approach in my own documentation.{{site.data.alerts.end}} + +{% endif %} + diff --git a/docs/js/toc.js b/docs/js/toc.js new file mode 100644 index 000000000..a54d172ef --- /dev/null +++ b/docs/js/toc.js @@ -0,0 +1,82 @@ +// https://github.com/ghiculescu/jekyll-table-of-contents +(function($){ + $.fn.toc = function(options) { + var defaults = { + noBackToTopLinks: false, + title: '', + minimumHeaders: 3, + headers: 'h1, h2, h3, h4', + listType: 'ol', // values: [ol|ul] + showEffect: 'show', // values: [show|slideDown|fadeIn|none] + showSpeed: 'slow' // set to 0 to deactivate effect + }, + settings = $.extend(defaults, options); + + var headers = $(settings.headers).filter(function() { + // get all headers with an ID + var previousSiblingName = $(this).prev().attr( "name" ); + if (!this.id && previousSiblingName) { + this.id = $(this).attr( "id", previousSiblingName.replace(/\./g, "-") ); + } + return this.id; + }), output = $(this); + if (!headers.length || headers.length < settings.minimumHeaders || !output.length) { + return; + } + + if (0 === settings.showSpeed) { + settings.showEffect = 'none'; + } + + var render = { + show: function() { output.hide().html(html).show(settings.showSpeed); }, + slideDown: function() { output.hide().html(html).slideDown(settings.showSpeed); }, + fadeIn: function() { output.hide().html(html).fadeIn(settings.showSpeed); }, + none: function() { output.html(html); } + }; + + var get_level = function(ele) { return parseInt(ele.nodeName.replace("H", ""), 10); } + var highest_level = headers.map(function(_, ele) { return get_level(ele); }).get().sort()[0]; + var return_to_top = ' '; + + var level = get_level(headers[0]), + this_level, + html = settings.title + " <"+settings.listType+">"; + headers.on('click', function() { + if (!settings.noBackToTopLinks) { + window.location.hash = this.id; + } + }) + .addClass('clickable-header') + .each(function(_, header) { + this_level = get_level(header); + if (!settings.noBackToTopLinks && this_level === highest_level) { + $(header).addClass('top-level-header').after(return_to_top); + } + if (this_level === level) // same level as before; same indenting + html += "
  • " + header.innerHTML + ""; + else if (this_level <= level){ // higher level than before; end parent ol + for(i = this_level; i < level; i++) { + html += "
  • " + } + html += "
  • " + header.innerHTML + ""; + } + else if (this_level > level) { // lower level than before; expand the previous to contain a ol + for(i = this_level; i > level; i--) { + html += "<"+settings.listType+">
  • " + } + html += "" + header.innerHTML + ""; + } + level = this_level; // update for the next one + }); + html += ""; + if (!settings.noBackToTopLinks) { + $(document).on('click', '.back-to-top', function() { + $(window).scrollTop(0); + window.location.hash = ''; + }); + } + + render[settings.showEffect](); + }; +})(jQuery); \ No newline at end of file diff --git a/docs/licenses/LICENSE b/docs/licenses/LICENSE new file mode 100644 index 000000000..e04b3d02e --- /dev/null +++ b/docs/licenses/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2016 Tom Johnson + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/docs/licenses/LICENSE-BSD-NAVGOCO.txt b/docs/licenses/LICENSE-BSD-NAVGOCO.txt new file mode 100644 index 000000000..7fdefc390 --- /dev/null +++ b/docs/licenses/LICENSE-BSD-NAVGOCO.txt @@ -0,0 +1,27 @@ +/* This license pertains to the Navgoco jQuery component used for the sidebar. */ + +Copyright (c) 2013, Christodoulos Tsoulloftas, http://www.komposta.net +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name of the nor the names of its + contributors may be used to endorse or promote products derived from this + software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED +OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/docs/pages/plugins/client.md b/docs/pages/plugins/client.md new file mode 100644 index 000000000..dce2d58af --- /dev/null +++ b/docs/pages/plugins/client.md @@ -0,0 +1,278 @@ +--- +title: Talk +keywords: homepage +sidebar: talk_sidebar +permalink: plugins-client.html +summary: +--- +We can build plugins to extend the client side functionality of Talk. + +The ultimate goal of our client side plugin architecture is to allow developers +to build on existing concepts without needing to understand core code while +providing complete power and flexibility of javascript, css and html. + +* [Plugin Architecture](#plugin-architecture) +* Using our building block components +* [Reactions](#reactions) +* [Styling](#styling-plugins) + +Advanced users will quickly realize that our plugins have complete access to core code. If you would like to write advanced plugins that reach outside of our published API as described in this document, please see [our notes on experimental plugins](/plugins/EXPERIMENTAL.md). + +Under the hood our plugins are powered by *React*, *Redux* and *GraphQL*. We can also build them with simple vanilla javascript. + +## Plugin Architecture + +The plugins live in the `/plugins` folder. Each plugin must have an `index.js` file and two folders `client` and `server`. + +### The Client Folder +The frontend of our plugin lives inside the `client` folder. The `client` folder must have an `index.js` file that exports the configuration of our plugin. + +``` +my-plugin/ + ├── client/ + │ └── index.js <-- index for client side functionality + ├── server/ + └── index.js <-- base plugin index +``` + +For now our base plugin `index.js` file should look like this: + +```js +export default { + // We will add more here later. +}; +``` + +### Creating a Component + +We can add our components (or any other javascript code) within the `client` folder. + +``` +my-plugin/ + ├── client/ + │ ├── MyComponent.js + │ └── index.js + ├── server/ + └── index.js +``` + +Our component could look like this: + +```js +import React, {Component} from 'react'; + +class MyButton extends Component { + render() { + return ; + } +} + +export default MyButton; +``` + +Here we create a component that renders a `button`. Now that we created our component we need to specify where it should get injected within Talk! + +To tell Talk where that Component should get injected we need to specify which *Slots* to insert it into. + +```js +import React from 'react'; +export default = () => ; +``` + +### Slots +In Talk we have defined specific *Slots* where we can inject components. + +Here is how we specify our slots config in `my-plugin/index.js` + +```js +import MyButton from './MyButton'; + +export default { + slots: { + commentDetail: [MyButton] + } +}; +``` + +Here I’m specifying that the MyComponent Component will take place within the `commentDetail` in Talk. + +`commentDetail` it’s a specific slot in the CommentStream. It means that it will be embedded inside de comment detail. + +Slots properties take an`Array` so we can add as many components as we want. + +## Building Blocks (TBD) + +`Note: the concepts in this section are still to be implemented. Code samples are for discussion and may change.` + +In order to allow you to build more complex plugins, we have wrapped some of our functionality in higher order components that expose a simple api. + +## Reactions + +Reactions provide users the ability to 'like', 'respect', etc... comments. + +Note: some server side work will need to accompany this client side component. See the like and respect plugins as examples. + +### Building Reactions + +#### Our `client/index.js` : + +```js +import LoveButton from './LoveButton'; + +export default { + slots: { + commentReactions: [LoveButton] + } +}; + +``` +In this example we add our reaction component to the `commentReaction` Slot + +#### Our Reaction component: + +```js +import React from 'react'; +import {withReaction} from 'coral-plugin-api'; + +class LoveButton extends React.Component { + handleClick = () => { + const { + postReaction, + deleteReaction, + alreadyReacted + } = this.props; + + if (alreadyReacted()) { + deleteReaction(); + } else { + postReaction(); + } + }; + + render() { + const {count} = this.props; + return ( + + ); + } +} + +export default withReaction('love')(LoveButton); +``` + + +This feature introduces `withReaction` HOC. `withReaction` takes, as argument, a reaction string and it allows our component to receive specific props for handling reactions. + + * `postReaction` - Posts the reaction + + * `deleteReaction` - Removes the reaction + + * `alreadyReacted` - A function that returns a boolean. + + * `count` - The reaction count + + +For full reference: Please, check `coral-plugin-love`: [LoveButton.js](https://github.com/coralproject/talk/blob/master/plugins/coral-plugin-love/client/LoveButton.js) + +### Comment Stream + +Comment streams may be created with filtering and ordering in place: + +* filter by user +* filter by tag +* sort by date ascending / descending + +### Comment Commit hooks + +// docs for the pre/post comment submit commit hooks + +### Mod Queues + +Moderation queues can be added via configuration objects passed in through plugins. + +Basic mod queues will resemble the current moderation queues but can be generated from different lists of comments. + +* filter by user tag +* filter by comment tag +* filter by comment status +* Custom queries (paired with back end plugins that provide queries to get the data) + +#### Advanced mod queues + +Advanced mod queues can be created giving plugin authors the power to create the cards that appear in the queue, create actions and custom buttons, etc... + +### Custom Configuration + +Plugins may rely on configuration options that admins/moderators can set in the Configuration section. + +Basic settings can be added via json configuration in a plugin. + +* Setting headline +* Setting description +* Setting input type +* Default value +* Variable name + +#### Advanced Custom Configuration (low prioritiy) + +Users can inject configuration interfaces that they create into the configuration allowing for more advanced configuration. + + +## Styling Plugins +Talk uses CSS Modules. This basically means that you can also add your CSS Module to your plugin without colliding with the rest of Talk! + +##### My Component +```js +import styles from './style.css'; + +class MyCoralButton extends Component { + render() { + return ; + } +} +```` + +Our `style.css` should could look like this. +```css + +.button { + background: coral; + border-radius: 3px; +} +``` + +## Plugin Hooks +The plugins injected in the CommentBox such as `commentInputDetailArea` will inherit through props tools for handling hooks. + +### Available hook types: +`preSubmit` : To perform actions before submitting the comment. +`postSubmit` : To perform actions after submitting the comment. + +### Register Hooks +`registerHook` is a function that takes: the hook type, a hook function and returns the hook data. + +#### Usage: +```js + this.addCommentTagHook = this.props.registerHook('postSubmit', (data) => { + const {comment} = data.createComment; + this.props.addCommentTag({ + id: comment.id, + tag: 'OFF_TOPIC' + }); + }); +``` + +### Unregister Hooks + +`unregisterHook` will remove the hook. + +```js + this.props.unregisterHook(this.addCommentTagHook); +``` + +### The server folder and the index file +Read more about the `/server` and how to extend Talk here. +[talk/PLUGINS.md at master · coralproject/talk · GitHub](https://github.com/coralproject/talk/blob/master/PLUGINS.md) diff --git a/docs/plugins-client.md b/docs/plugins-client.md new file mode 100644 index 000000000..4f4e784ec --- /dev/null +++ b/docs/plugins-client.md @@ -0,0 +1,327 @@ +--- +title: Client Plugin API +keywords: homepage +sidebar: talk_sidebar +permalink: plugins-client.html +summary: +--- +We can build plugins to extend the client side functionality of Talk. + +The ultimate goal of our client side plugin architecture is to allow developers +to build on existing concepts without needing to understand core code while +providing complete power and flexibility of javascript, css and html. + +* [Plugin Architecture](#plugin-architecture) +* Using our building block components +* [Reactions](#reactions) +* [Styling](#styling-plugins) + +Advanced users will quickly realize that our plugins have complete access to core code. If you would like to write advanced plugins that reach outside of our published API as described in this document, please see [our notes on experimental plugins](/plugins/EXPERIMENTAL.md). + +Under the hood our plugins are powered by *React*, *Redux* and *GraphQL*. We can also build them with simple vanilla javascript. + +## Plugin Architecture + +The plugins live in the `/plugins` folder. Each plugin must have an `index.js` file and two folders `client` and `server`. + +### The Client Folder +The frontend of our plugin lives inside the `client` folder. The `client` folder must have an `index.js` file that exports the configuration of our plugin. + +``` +my-plugin/ + ├── client/ + │ └── index.js <-- index for client side functionality + ├── server/ + └── index.js <-- base plugin index +``` + +For now our base plugin `index.js` file should look like this: + +```js +export default { + // We will add more here later. +}; +``` + +### Creating a Component + +We can add our components (or any other javascript code) within the `client` folder. + +``` +my-plugin/ + ├── client/ + │ ├── MyComponent.js + │ └── index.js + ├── server/ + └── index.js +``` + +Our component could look like this: + +```js +import React, {Component} from 'react'; + +class MyButton extends Component { + render() { + return ; + } +} + +export default MyButton; +``` + +Here we create a component that renders a `button`. Now that we created our component we need to specify where it should get injected within Talk! + +To tell Talk where that Component should get injected we need to specify which *Slots* to insert it into. + +```js +import React from 'react'; +export default = () => ; +``` + +### Slots +In Talk we have defined specific *Slots* where we can inject components. + +Here is how we specify our slots config in `my-plugin/index.js` + +```js +import MyButton from './MyButton'; + +export default { + slots: { + commentDetail: [MyButton] + } +}; +``` + +Here I’m specifying that the MyComponent Component will take place within the `commentDetail` in Talk. + +`commentDetail` it’s a specific slot in the CommentStream. It means that it will be embedded inside de comment detail. + +Slots properties take an`Array` so we can add as many components as we want. + +## Building Blocks (TBD) + +`Note: the concepts in this section are still to be implemented. Code samples are for discussion and may change.` + +In order to allow you to build more complex plugins, we have wrapped some of our functionality in higher order components that expose a simple api. + +## Reactions + +Reactions provide users the ability to 'like', 'respect', etc... comments. + +Note: some server side work will need to accompany this client side component. See the like and respect plugins as examples. + +### Building Reactions + +#### Our `client/index.js` : + +```js +import LoveButton from './LoveButton'; + +export default { + slots: { + commentReactions: [LoveButton] + } +}; + +``` +In this example we add our reaction component to the `commentReaction` Slot + +#### Our Reaction component: + +```js +import React from 'react'; +import {withReaction} from 'coral-plugin-api'; + +class LoveButton extends React.Component { + handleClick = () => { + const { + postReaction, + deleteReaction, + alreadyReacted + } = this.props; + + if (alreadyReacted()) { + deleteReaction(); + } else { + postReaction(); + } + }; + + render() { + const {count} = this.props; + return ( + + ); + } +} + +export default withReaction('love')(LoveButton); +``` + + +This feature introduces `withReaction` HOC. `withReaction` takes, as argument, a reaction string and it allows our component to receive specific props for handling reactions. + + * `postReaction` - Posts the reaction + + * `deleteReaction` - Removes the reaction + + * `alreadyReacted` - A function that returns a boolean. + + * `count` - The reaction count + + +For full reference: Please, check `coral-plugin-love`: [LoveButton.js](https://github.com/coralproject/talk/blob/master/plugins/coral-plugin-love/client/LoveButton.js) + +### Comment Stream + +Comment streams may be created with filtering and ordering in place: + +* filter by user +* filter by tag +* sort by date ascending / descending + +### Comment Commit hooks + +// docs for the pre/post comment submit commit hooks + +### Mod Queues + +Moderation queues can be added via configuration objects passed in through plugins. + +Basic mod queues will resemble the current moderation queues but can be generated from different lists of comments. + +* filter by user tag +* filter by comment tag +* filter by comment status +* Custom queries (paired with back end plugins that provide queries to get the data) + +#### Advanced mod queues + +Advanced mod queues can be created giving plugin authors the power to create the cards that appear in the queue, create actions and custom buttons, etc... + +### Custom Configuration + +Plugins may rely on configuration options that admins/moderators can set in the Configuration section. + +Basic settings can be added via json configuration in a plugin. + +* Setting headline +* Setting description +* Setting input type +* Default value +* Variable name + +#### Advanced Custom Configuration (low prioritiy) + +Users can inject configuration interfaces that they create into the configuration allowing for more advanced configuration. + + +## Styling Plugins +Talk uses CSS Modules. This basically means that you can also add your CSS Module to your plugin without colliding with the rest of Talk! + +##### My Component +```js +import styles from './style.css'; + +class MyCoralButton extends Component { + render() { + return ; + } +} +```` + +Our `style.css` should could look like this. +```css + +.button { + background: coral; + border-radius: 3px; +} +``` + +## Plugin Hooks +The plugins injected in the CommentBox such as `commentInputDetailArea` will inherit through props tools for handling hooks. + +### Available hook types: +`preSubmit` : To perform actions before submitting the comment. +`postSubmit` : To perform actions after submitting the comment. + +### Register Hooks +`registerHook` is a function that takes: the hook type, a hook function and returns the hook data. + +#### Usage: +```js + this.addCommentTagHook = this.props.registerHook('postSubmit', (data) => { + const {comment} = data.createComment; + this.props.addCommentTag({ + id: comment.id, + tag: 'OFF_TOPIC' + }); + }); +``` + +### Unregister Hooks + +`unregisterHook` will remove the hook. + +```js + this.props.unregisterHook(this.addCommentTagHook); +``` + +### The server folder and the index file +Read more about the `/server` and how to extend Talk here. +[talk/PLUGINS.md at master · coralproject/talk · GitHub](https://github.com/coralproject/talk/blob/master/PLUGINS.md) + +## ESlint and Babel +In talk we use `eslint:recommended` and Babel with the latest ECMAScript Features. But you can use your own! +While building your plugin you need to specify a `.eslintrc.json` file and a`.babelrc` file. + +### `.eslintrc.json` +```json +{ + "env": { + "browser": true, + "es6": true, + "mocha": true + }, + "parserOptions": { + "sourceType": "module", + "ecmaFeatures": { + "experimentalObjectRestSpread": true, + "jsx": true + } + }, + "parser": "babel-eslint", + "plugins": [ + "react" + ], + "rules": { + "react/jsx-uses-react": "error", + "react/jsx-uses-vars": "error", + "no-console": ["warn", { "allow": ["warn", "error"] }] + } +} +``` + +### `.babelrc ` +```json +{ + "presets": [ + "es2015" + ], + "plugins": [ + "add-module-exports", + "transform-class-properties", + "transform-decorators-legacy", + "transform-object-assign", + "transform-object-rest-spread", + "transform-async-to-generator", + "transform-react-jsx" + ] +} +``` diff --git a/docs/plugins-experimental.md b/docs/plugins-experimental.md new file mode 100644 index 000000000..766f5f050 --- /dev/null +++ b/docs/plugins-experimental.md @@ -0,0 +1,63 @@ +--- +title: Experimental Plugin API +keywords: homepage +sidebar: talk_sidebar +permalink: plugins-experimental.html +summary: +--- + +Talk plugins are, in essence, small programs that hook into the core application in a variety of ways. Ultimately, this code can do anything that javascript is capable of. In addition, plugins can import any core code to hook into talk at any level. + +If you want to write plugins that integrate with core code beyond the api described +in the client api or server api section, please keep the following things in mind: + +* core code may change and break your plugin +* you may introduce inefficiencies with your plugin that could hurt performance/ +crash Talk +* you may cause bugs in other areas of Talk + +If you'd like to build a supported plugin but don't have the hooks you need, +please file an issue on this repo and we can discuss deepening the supported +plugin api! + +With that said, if you are still undeterred, here are some of the prime +experimental integration points: + +## Reducers and Actions : Redux + +Talk is powered by Redux and our plugins can too! Our plugins can have their own reducers and actions. + +```js +import MyButton from './MyButton'; +import reducer from './reducer'; + +export default { + slots: { + commentDetail: [MyButton], + }, + reducer +}; +``` + +## Import Actions from Talk +We can easily trigger `Talk` actions in our plugin Components. + +```js +import React, {Component} from 'react'; +import {connect} from 'react-redux'; +import {bindActionCreators} from 'redux'; +import {addTag, removeTag} from 'coral-plugin-commentbox/actions'; + +class MyButton extends Component { + render() { + return ; + } +} + +const mapStateToProps = ({commentBox}) => ({commentBox}); + +const mapDispatchToProps = dispatch => + bindActionCreators({addTag, removeTag}, dispatch); + +export default connect(mapStateToProps, mapDispatchToProps)(OffTopicCheckbox); +``` diff --git a/docs/plugins-server.md b/docs/plugins-server.md new file mode 100644 index 000000000..7b670429f --- /dev/null +++ b/docs/plugins-server.md @@ -0,0 +1,390 @@ +--- +title: Server Plugin API +keywords: homepage +sidebar: talk_sidebar +permalink: plugins-server.html +summary: +--- + +## The Server Folder +The server functionality of our plugin lives inside the `server` folder. The `server` +folder must have an `index.js` file that exports the configuration of our plugin. + +``` +my-plugin/ + ├── client/ + │ └── ... <-- client side plugin files + ├── server/ + │ └── index.js <-- index for server side functionality + │ └── ... <-- other server side plugin files + └── index.js <-- base plugin index +``` + +## Specification + +Each plugin should export a single object with all hooks available on it. + +_**Note: You will have access to the whole core and other plugin's typeDefs, +context, loaders, mutators, resolvers, hooks. This is intentional, as it +encourages composing plugins to merge functionality, like a Slack plugin which +provides a Slack notify context function as well as having the loader for +comments.**_ + +The following are the hooks available: + +### GraphQL hooks + +#### Field: `typeDefs` + +```graphql +enum COLOUR { + RED + BLUE +} + +type Person { + name: String! + colour: COLOUR! +} + +type RootMutation { + createPerson(name: String!): Person +} + +type RootQuery { + people: [Person!] +} + +type Subscription { + leader: Person +} +``` + +Thanks to [gql-merge](https://www.npmjs.com/package/gql-merge) the contents of +`typeDefs` should be a string that will be _merged_ with the existing type +definitions. `enum`'s will be appended to, types will be appended, and new types +will be added. + +#### Field: `context` + +```js +{ + Slack: (context) => ({ + notify: (message) => { + // return a promise after we're done sending notifications. + } + }) +} +``` + +Any property provided here will be added to the context parameter available +inside all resolvers, loaders, mutators, and of course, other context based +plugins. + +The top level item must accept a context for the request which it should use to +configure the context plugin before it would be mounted at `context.plugins`. +This plugin above would mount at: `context.plugins.Slack`, or, if you're using +[object destructuring](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment), `{plugins: {Slack}}`. + +#### Field: `loaders` + +```js +(context) => ({ + People: { + load: () => db.people.find({user: context.user}) + } +}) +``` + +Loaders should be provided as a function which returns a map which is used in +the resolvers function. These must return a promise or a value. + +#### Field: `mutators` + +```js +(context) => ({ + People: { + create: (name) => { + return db.people.insert({user: context.user, name}); + } + } +}) +``` + +Mutators should be provided as a function which returns a map which is used in +the resolvers function. These must return a promise or a value. + +#### Field: `resolvers` + +```js +{ + Person: { + name(obj, args, context) { + return obj.name; + }, + colour(obj, args, context) { + // Bill likes the colour red, everyone else likes blue. + return obj.name === 'bill' ? 'RED' : 'BLUE'; + } + }, + RootQuery: { + people(obj, args, {loaders: {People}}) { + return People.load(); + } + }, + RootMutation: { + createPerson(obj, {name}, {mutators: {People}}) { + return People.create(name); + } + } +} +``` + +Should return a resolver map as described in the +[Apollo Docs](http://dev.apollodata.com/tools/graphql-tools/resolvers.html#Resolver-map). + +This will merge with the existing resolvers in core and from previous plugins. + +#### Field: `hooks` + +```js +{ + RootMutation: { + createPerson: { + post: async (obj, args, {plugins: {Slack}}, info, person) { + if (!person) { + return person; + } + + await Slack.notify(`A new person just was created with name ${person.name}`); + + return person; + } + } + } +} +``` + +Hooks here are pretty special, for each resolver field, you can specify a +pre/post hook that will execute pre and post field resolution. + +If your post function accepts four parameters, then it can modify the field +result. It is *required* that the function resolves a promise (or returns) with +the modified value or simply the original if you didn't modify it. + +#### Field: `setupFunctions` + +```js +setupFunctions: { + leader: (options, args) => ({ + leader: { + filter: (person) => person.place === 1 + }, + }), +} +``` + +Setup functions allow you to create filters that control which pubsub.publish() events +send data to the client. If the type in question contains args, clients may subscribe using those arguments to further filter their subscription. + +For more information, see the [Apollo Docs](https://github.com/apollographql/graphql-subscriptions). + +### Routes + +#### Field: `router` + +```js +(router) => { + router.get('/api/v1/people', (req, res) => { + res.json({people: [{name: 'Bob'}]}); + }); +} +``` + +The Router hook allows you to create a function that accepts the base express +router where you can mount any amount of middleware/routes to do any form of +action needed by external applications. + +### Authorization middleware + +The following example creates the requisite callback route and passport +strategy needed to enable Facebook Authorization: + +```js +const authorization = require('middleware/authorization'); + +module.exports = { + router(router) { + router.get('/api/v1/people', authorization.needed('ADMIN'), (req, res) => { + res.json({people: [{name: 'SECRET PEOPLE'}]}); + }); + } +} +``` + +#### Field: `passport` + +```js +const FacebookStrategy = require('passport-facebook').Strategy; +const UsersService = require('services/users'); +const {ValidateUserLogin, HandleAuthPopupCallback} = require('services/passport'); + +module.exports = { + passport(passport) { + passport.use(new FacebookStrategy({ + clientID: process.env.TALK_FACEBOOK_APP_ID, + clientSecret: process.env.TALK_FACEBOOK_APP_SECRET, + callbackURL: `${process.env.TALK_ROOT_URL}/api/v1/auth/facebook/callback`, + passReqToCallback: true, + profileFields: ['id', 'displayName', 'picture.type(large)'] + }, async (req, accessToken, refreshToken, profile, done) => { + + let user; + try { + user = await UsersService.findOrCreateExternalUser(profile); + } catch (err) { + return done(err); + } + + return ValidateUserLogin(profile, user, done); + })); + }, + router(router) { + + // Note that we have to import the passport instance here, it is + // instantiated after all the strategies have been mounted. + const {passport} = require('services/passport'); + + /** + * Facebook auth endpoint, this will redirect the user immediatly to facebook + * for authorization. + */ + router.get('/facebook', passport.authenticate('facebook', {display: 'popup', authType: 'rerequest', scope: ['public_profile']})); + + /** + * Facebook callback endpoint, this will send the user a html page designed to + * send back the user credentials upon sucesfull login. + */ + router.get('/facebook/callback', (req, res, next) => { + + // Perform the facebook login flow and pass the data back through the opener. + passport.authenticate('facebook', HandleAuthPopupCallback(req, res, next))(req, res, next); + }); + } +}; +``` + +## Full Example + +Contents of `plugins.json`: + +```json +{ + "server": [ + "people" + ] +} +``` + +Located in `plugins/people/index.js`: + +```js +module.exports = { + typeDefs: ` + enum COLOUR { + RED + BLUE + } + + type Person { + name: String! + colour: COLOUR! + } + + type RootMutation { + createPerson(name: String!): Person + } + + type RootQuery { + people: [Person!] + } + + type Subscription { + leader: Person + } + `, + context: { + Slack: () => ({ + notify: (message) => { + // return a promise after we're done sending notifications. + } + }) + }, + loaders: ({user}) => ({ + People: { + load: () => db.people.find({user}) + } + }), + mutators: ({user}) => ({ + People: { + create: (name) => { + return db.people.insert({user, name}); + } + } + }), + resolvers: { + Person: { + name(obj, args, context) { + return obj.name; + }, + colour(obj, args, context) { + // Bill likes the colour red, everyone else likes blue. + return obj.name === 'bill' ? 'RED' : 'BLUE'; + } + }, + RootQuery: { + people(obj, args, {loaders: {People}}) { + return People.load(); + } + }, + RootMutation: { + createPerson(obj, {name}, {mutators: {People}}) { + return People.create(name); + } + } + }, + hooks: { + RootMutation: { + createPerson: { + post: async (obj, args, {plugins: {Slack}}, info, person) => { + if (!person) { + return person; + } + + await Slack.notify(`A new person just was created with name ${person.name}`); + + return person; + } + } + } + }, + setupFunctions: { + leader: (options, args) => ({ + leader: { + filter: (person) => person.place === 1 + } + } + } +}; + +``` + +## API + +You can access any API available inside the talk directory in a plugin by simply +importing the file relative to the talk project root. An example would be if you +wanted to import the `MetadataService`, you would simply write: + +```javascript +const MetadataService = require('services/metadata'); +``` diff --git a/docs/sitemap.xml b/docs/sitemap.xml new file mode 100644 index 000000000..38a04d6c4 --- /dev/null +++ b/docs/sitemap.xml @@ -0,0 +1,24 @@ +--- +layout: none +search: exclude +--- + + + + {% for post in site.posts %} + {% unless post.search == "exclude" %} + + {{site.url}}{{post.url}} + + {% endunless %} + {% endfor %} + + + {% for page in site.pages %} + {% unless page.search == "exclude" %} + + {{site.url}}{{ page.url}} + + {% endunless %} + {% endfor %} + \ No newline at end of file diff --git a/docs/update.sh b/docs/update.sh new file mode 100755 index 000000000..42a3bece5 --- /dev/null +++ b/docs/update.sh @@ -0,0 +1,4 @@ +git add . +git status +git commit -m "content update" +git push \ No newline at end of file From 512767e0232894aa04687a08e15238ce3cce1784 Mon Sep 17 00:00:00 2001 From: Chi Vinh Le Date: Thu, 25 May 2017 17:49:30 +0700 Subject: [PATCH 26/78] Use default response fragments --- client/coral-admin/src/graphql/index.js | 32 --------------- .../coral-embed-stream/src/graphql/index.js | 39 ------------------- client/coral-framework/graphql/fragments.js | 23 ++++++++++- client/coral-framework/graphql/mutations.js | 39 +++++++++++++++++++ 4 files changed, 61 insertions(+), 72 deletions(-) diff --git a/client/coral-admin/src/graphql/index.js b/client/coral-admin/src/graphql/index.js index 8d369ebd7..f71e1b993 100644 --- a/client/coral-admin/src/graphql/index.js +++ b/client/coral-admin/src/graphql/index.js @@ -1,39 +1,7 @@ import {add} from 'coral-framework/services/graphqlRegistry'; -import {gql} from 'react-apollo'; - const queues = ['all', 'premod', 'flagged', 'accepted', 'rejected']; const extension = { - fragments: { - SetUserStatusResponse: gql` - fragment Admin_SetUserStatusResponse on SetUserStatusResponse { - errors { - translation_key - } - } - `, - SuspendUserResponse: gql` - fragment Admin_SuspendUserResponse on SuspendUserResponse { - errors { - translation_key - } - } - `, - RejectUsernameResponse: gql` - fragment Admin_RejectUsernameResponse on RejectUsernameResponse { - errors { - translation_key - } - } - `, - SetCommentStatusResponse: gql` - fragment Admin_SetCommentStatusResponse on SetCommentStatusResponse { - errors { - translation_key - } - } - `, - }, mutations: { SetUserStatus: () => ({ refetchQueries: ['Admin_Community'], diff --git a/client/coral-embed-stream/src/graphql/index.js b/client/coral-embed-stream/src/graphql/index.js index ccf6195f6..cee92d348 100644 --- a/client/coral-embed-stream/src/graphql/index.js +++ b/client/coral-embed-stream/src/graphql/index.js @@ -9,23 +9,6 @@ const extension = { comment { status } - errors { - translation_key - } - } - `, - StopIgnoringUserResponse: gql` - fragment CoralEmbedStream_StopIgnoringUserResponse on StopIgnoringUserResponse { - errors { - translation_key - } - } - `, - IgnoreUserResponse: gql` - fragment CoralEmbedStream_IgnoreUserResponse on IgnoreUserResponse { - errors { - translation_key - } } `, RemoveCommentTagResponse: gql` @@ -36,9 +19,6 @@ const extension = { name } } - errors { - translation_key - } } `, AddCommentTagResponse: gql` @@ -49,16 +29,6 @@ const extension = { name } } - errors { - translation_key - } - } - `, - DeleteActionResponse: gql` - fragment CoralEmbedStream_DeleteActionResponse on DeleteActionResponse { - errors { - translation_key - } } `, CreateFlagResponse: gql` @@ -66,9 +36,6 @@ const extension = { flag { id } - errors { - translation_key - } } `, CreateDontAgreeResponse : gql` @@ -76,9 +43,6 @@ const extension = { dontagree { id } - errors { - translation_key - } } `, CreateCommentResponse: gql` @@ -89,9 +53,6 @@ const extension = { ...CoralEmbedStream_CreateCommentResponse_Comment } } - errors { - translation_key - } } fragment CoralEmbedStream_CreateCommentResponse_Comment on Comment { diff --git a/client/coral-framework/graphql/fragments.js b/client/coral-framework/graphql/fragments.js index f4948ed05..9c396cbaa 100644 --- a/client/coral-framework/graphql/fragments.js +++ b/client/coral-framework/graphql/fragments.js @@ -1,2 +1,23 @@ +import {gql} from 'react-apollo'; +import * as mutations from './mutations'; + +function createDefaultResponseFragments() { + const names = Object.keys(mutations).map((key) => key.replace('with', '')); + const result = {}; + names.forEach((name) => { + const response = `${name}Response`; + result[response] = gql` + fragment Coral_${response} on ${response} { + errors { + translation_key + } + } + `; + }); + return result; +} + // fragments defined here are automatically registered. -export default {}; +export default { + ...createDefaultResponseFragments() +}; diff --git a/client/coral-framework/graphql/mutations.js b/client/coral-framework/graphql/mutations.js index d9c3cfe45..2af4c53ce 100644 --- a/client/coral-framework/graphql/mutations.js +++ b/client/coral-framework/graphql/mutations.js @@ -6,6 +6,9 @@ export const withSetCommentStatus = withMutation( mutation SetCommentStatus($commentId: ID!, $status: COMMENT_STATUS!){ setCommentStatus(id: $commentId, status: $status) { ...SetCommentStatusResponse + errors { + translation_key + } } } `, { @@ -26,6 +29,9 @@ export const withSuspendUser = withMutation( mutation SuspendUser($input: SuspendUserInput!) { suspendUser(input: $input) { ...SuspendUserResponse + errors { + translation_key + } } } `, { @@ -45,6 +51,9 @@ export const withRejectUsername = withMutation( mutation RejectUsername($input: RejectUsernameInput!) { rejectUsername(input: $input) { ...RejectUsernameResponse + errors { + translation_key + } } } `, { @@ -64,6 +73,9 @@ export const withSetUserStatus = withMutation( mutation SetUserStatus($userId: ID!, $status: USER_STATUS!) { setUserStatus(id: $userId, status: $status) { ...SetUserStatusResponse + errors { + translation_key + } } } `, { @@ -84,6 +96,9 @@ export const withPostComment = withMutation( mutation PostComment($comment: CreateCommentInput!) { createComment(comment: $comment) { ...CreateCommentResponse + errors { + translation_key + } } } `, { @@ -103,6 +118,9 @@ export const withEditComment = withMutation( mutation EditComment($id: ID!, $asset_id: ID!, $edit: EditCommentInput) { editComment(id:$id, asset_id:$asset_id, edit:$edit) { ...EditCommentResponse + errors { + translation_key + } } } `, { @@ -124,6 +142,9 @@ export const withPostFlag = withMutation( mutation PostFlag($flag: CreateFlagInput!) { createFlag(flag: $flag) { ...CreateFlagResponse + errors { + translation_key + } } } `, { @@ -142,6 +163,9 @@ export const withPostDontAgree = withMutation( mutation CreateDontAgree($dontagree: CreateDontAgreeInput!) { createDontAgree(dontagree: $dontagree) { ...CreateDontAgreeResponse + errors { + translation_key + } } } `, { @@ -160,6 +184,9 @@ export const withDeleteAction = withMutation( mutation DeleteAction($id: ID!) { deleteAction(id:$id) { ...DeleteActionResponse + errors { + translation_key + } } } `, { @@ -178,6 +205,9 @@ export const withAddCommentTag = withMutation( mutation AddCommentTag($id: ID!, $tag: String!) { addCommentTag(id:$id, tag:$tag) { ...AddCommentTagResponse + errors { + translation_key + } } } `, { @@ -197,6 +227,9 @@ export const withRemoveCommentTag = withMutation( mutation RemoveCommentTag($id: ID!, $tag: String!) { removeCommentTag(id:$id, tag:$tag) { ...RemoveCommentTagResponse + errors { + translation_key + } } } `, { @@ -216,6 +249,9 @@ export const withIgnoreUser = withMutation( mutation IgnoreUser($id: ID!) { ignoreUser(id:$id) { ...IgnoreUserResponse + errors { + translation_key + } } } `, { @@ -234,6 +270,9 @@ export const withStopIgnoringUser = withMutation( mutation StopIgnoringUser($id: ID!) { stopIgnoringUser(id:$id) { ...StopIgnoringUserResponse + errors { + translation_key + } } } `, { From b43a0f533b7c05b156749ef842ebdb309f18e3aa Mon Sep 17 00:00:00 2001 From: Chi Vinh Le Date: Thu, 25 May 2017 18:37:23 +0700 Subject: [PATCH 27/78] Harmonize naming in admin and embed-stream --- client/coral-admin/src/graphql/index.js | 6 +++--- .../src/routes/Community/containers/Community.js | 2 +- .../src/routes/Dashboard/containers/Dashboard.js | 8 ++++---- .../src/routes/Moderation/containers/Comment.js | 4 ++-- .../src/routes/Moderation/containers/Moderation.js | 6 +++--- .../src/routes/Moderation/containers/UserDetail.js | 2 +- client/coral-embed-stream/src/containers/Comment.js | 4 ++-- client/coral-embed-stream/src/containers/Embed.js | 2 +- client/coral-embed-stream/src/containers/Stream.js | 6 +++--- client/coral-embed-stream/src/graphql/index.js | 8 ++++---- client/coral-settings/containers/ProfileContainer.js | 2 +- 11 files changed, 25 insertions(+), 25 deletions(-) diff --git a/client/coral-admin/src/graphql/index.js b/client/coral-admin/src/graphql/index.js index f71e1b993..740af20a1 100644 --- a/client/coral-admin/src/graphql/index.js +++ b/client/coral-admin/src/graphql/index.js @@ -4,14 +4,14 @@ const queues = ['all', 'premod', 'flagged', 'accepted', 'rejected']; const extension = { mutations: { SetUserStatus: () => ({ - refetchQueries: ['Admin_Community'], + refetchQueries: ['CoralAdmin_Community'], }), RejectUsername: () => ({ - refetchQueries: ['Admin_Community'], + refetchQueries: ['CoralAdmin_Community'], }), SetCommentStatus: ({variables: {commentId, status}}) => ({ updateQueries: { - Admin_Moderation: (oldData) => { + CoralAdmin_Moderation: (oldData) => { const comment = queues.reduce((comment, queue) => { return comment ? comment : oldData[queue].find((c) => c.id === commentId); }, null); diff --git a/client/coral-admin/src/routes/Community/containers/Community.js b/client/coral-admin/src/routes/Community/containers/Community.js index e97553cab..8c5de95d4 100644 --- a/client/coral-admin/src/routes/Community/containers/Community.js +++ b/client/coral-admin/src/routes/Community/containers/Community.js @@ -48,7 +48,7 @@ class CommunityContainer extends Component { } export const withCommunityQuery = withQuery(gql` - query Admin_Community($action_type: ACTION_TYPE) { + query CoralAdmin_Community($action_type: ACTION_TYPE) { users(query:{action_type: $action_type}){ id username diff --git a/client/coral-admin/src/routes/Dashboard/containers/Dashboard.js b/client/coral-admin/src/routes/Dashboard/containers/Dashboard.js index 60925e09e..ea1fb2b6c 100644 --- a/client/coral-admin/src/routes/Dashboard/containers/Dashboard.js +++ b/client/coral-admin/src/routes/Dashboard/containers/Dashboard.js @@ -21,15 +21,15 @@ class DashboardContainer extends React.Component { } export const witDashboardQuery = withQuery(gql` - query Admin_Dashboard($from: Date!, $to: Date!) { + query CoralAdmin_Dashboard($from: Date!, $to: Date!) { assetsByFlag: assetMetrics(from: $from, to: $to, sort: FLAG) { - ...Admin_Metrics + ...CoralAdmin_Metrics } assetsByActivity: assetMetrics(from: $from, to: $to, sort: ACTIVITY) { - ...Admin_Metrics + ...CoralAdmin_Metrics } } - fragment Admin_Metrics on Asset { + fragment CoralAdmin_Metrics on Asset { id title url diff --git a/client/coral-admin/src/routes/Moderation/containers/Comment.js b/client/coral-admin/src/routes/Moderation/containers/Comment.js index a0a209865..462040903 100644 --- a/client/coral-admin/src/routes/Moderation/containers/Comment.js +++ b/client/coral-admin/src/routes/Moderation/containers/Comment.js @@ -12,14 +12,14 @@ const pluginFragments = getSlotsFragments([ export default withFragments({ root: gql` - fragment Admin_Moderation_Comment_root on RootQuery { + fragment CoralAdmin_ModerationComment_root on RootQuery { __typename ${pluginFragments.spreads('root')} } ${pluginFragments.definitions('root')} `, comment: gql` - fragment Admin_Moderation_Comment_comment on Comment { + fragment CoralAdmin_ModerationComment_comment on Comment { id body created_at diff --git a/client/coral-admin/src/routes/Moderation/containers/Moderation.js b/client/coral-admin/src/routes/Moderation/containers/Moderation.js index 4cea54a54..e0139814e 100644 --- a/client/coral-admin/src/routes/Moderation/containers/Moderation.js +++ b/client/coral-admin/src/routes/Moderation/containers/Moderation.js @@ -113,7 +113,7 @@ class ModerationContainer extends Component { } const LOAD_MORE_QUERY = gql` - query Admin_Moderation_LoadMore($limit: Int = 10, $cursor: Date, $sort: SORT_ORDER, $asset_id: ID, $statuses:[COMMENT_STATUS!], $action_type: ACTION_TYPE) { + query CoralAdmin_Moderation_LoadMore($limit: Int = 10, $cursor: Date, $sort: SORT_ORDER, $asset_id: ID, $statuses:[COMMENT_STATUS!], $action_type: ACTION_TYPE) { comments(query: {limit: $limit, cursor: $cursor, asset_id: $asset_id, statuses: $statuses, sort: $sort, action_type: $action_type}) { ...${getDefinitionName(Comment.fragments.comment)} action_summaries { @@ -128,7 +128,7 @@ const LOAD_MORE_QUERY = gql` `; const withModQueueQuery = withQuery(gql` - query Admin_Moderation($asset_id: ID, $sort: SORT_ORDER) { + query CoralAdmin_Moderation($asset_id: ID, $sort: SORT_ORDER) { all: comments(query: { statuses: [NONE, PREMOD, ACCEPTED, REJECTED], asset_id: $asset_id, @@ -207,7 +207,7 @@ const withModQueueQuery = withQuery(gql` }); const withQueueCountPolling = withQuery(gql` - query Admin_Moderation_CountPoll($asset_id: ID) { + query CoralAdmin_ModerationCountPoll($asset_id: ID) { allCount: commentCount(query: { asset_id: $asset_id }) diff --git a/client/coral-admin/src/routes/Moderation/containers/UserDetail.js b/client/coral-admin/src/routes/Moderation/containers/UserDetail.js index 24b17e928..e4f98d6be 100644 --- a/client/coral-admin/src/routes/Moderation/containers/UserDetail.js +++ b/client/coral-admin/src/routes/Moderation/containers/UserDetail.js @@ -24,7 +24,7 @@ class UserDetailContainer extends React.Component { } export const withUserDetailQuery = withQuery(gql` - query Admin_UserDetail($author_id: ID!) { + query CoralAdmin_UserDetail($author_id: ID!) { user(id: $author_id) { id username diff --git a/client/coral-embed-stream/src/containers/Comment.js b/client/coral-embed-stream/src/containers/Comment.js index 72a12c92e..8122b1900 100644 --- a/client/coral-embed-stream/src/containers/Comment.js +++ b/client/coral-embed-stream/src/containers/Comment.js @@ -15,14 +15,14 @@ const pluginFragments = getSlotsFragments([ export default withFragments({ root: gql` - fragment Comment_root on RootQuery { + fragment CoralEmbedStream_Comment_root on RootQuery { __typename ${pluginFragments.spreads('root')} } ${pluginFragments.definitions('root')} `, comment: gql` - fragment Comment_comment on Comment { + fragment CoralEmbedStream_Comment_comment on Comment { id body created_at diff --git a/client/coral-embed-stream/src/containers/Embed.js b/client/coral-embed-stream/src/containers/Embed.js index 7309965a4..05dd9fb91 100644 --- a/client/coral-embed-stream/src/containers/Embed.js +++ b/client/coral-embed-stream/src/containers/Embed.js @@ -60,7 +60,7 @@ class EmbedContainer extends React.Component { } const EMBED_QUERY = gql` - query EmbedQuery($assetId: ID, $assetUrl: String, $commentId: ID!, $hasComment: Boolean!, $excludeIgnored: Boolean) { + query CoralEmbedStream_Embed($assetId: ID, $assetUrl: String, $commentId: ID!, $hasComment: Boolean!, $excludeIgnored: Boolean) { asset(id: $assetId, url: $assetUrl) { totalCommentCount(excludeIgnored: $excludeIgnored) } diff --git a/client/coral-embed-stream/src/containers/Stream.js b/client/coral-embed-stream/src/containers/Stream.js index dddfd3c16..f3cb1bfe9 100644 --- a/client/coral-embed-stream/src/containers/Stream.js +++ b/client/coral-embed-stream/src/containers/Stream.js @@ -132,7 +132,7 @@ class StreamContainer extends React.Component { } const LOAD_COMMENT_COUNTS_QUERY = gql` - query LoadCommentCounts($assetUrl: String, $assetId: ID, $excludeIgnored: Boolean) { + query CoralEmbedStream_LoadCommentCounts($assetUrl: String, $assetId: ID, $excludeIgnored: Boolean) { asset(id: $assetId, url: $assetUrl) { id commentCount(excludeIgnored: $excludeIgnored) @@ -145,7 +145,7 @@ const LOAD_COMMENT_COUNTS_QUERY = gql` `; const LOAD_MORE_QUERY = gql` - query LoadMoreComments($limit: Int = 5, $cursor: Date, $parent_id: ID, $asset_id: ID, $sort: SORT_ORDER, $excludeIgnored: Boolean) { + query CoralEmbedStream_LoadMoreComments($limit: Int = 5, $cursor: Date, $parent_id: ID, $asset_id: ID, $sort: SORT_ORDER, $excludeIgnored: Boolean) { new_top_level_comments: comments(query: {limit: $limit, cursor: $cursor, parent_id: $parent_id, asset_id: $asset_id, sort: $sort, excludeIgnored: $excludeIgnored}) { ...${getDefinitionName(Comment.fragments.comment)} replyCount(excludeIgnored: $excludeIgnored) @@ -159,7 +159,7 @@ const LOAD_MORE_QUERY = gql` const fragments = { root: gql` - fragment Stream_root on RootQuery { + fragment CoralEmbedStream_Stream_root on RootQuery { comment(id: $commentId) @include(if: $hasComment) { ...${getDefinitionName(Comment.fragments.comment)} replyCount(excludeIgnored: $excludeIgnored) diff --git a/client/coral-embed-stream/src/graphql/index.js b/client/coral-embed-stream/src/graphql/index.js index cee92d348..caedc3191 100644 --- a/client/coral-embed-stream/src/graphql/index.js +++ b/client/coral-embed-stream/src/graphql/index.js @@ -85,7 +85,7 @@ const extension = { mutations: { IgnoreUser: ({variables}) => ({ updateQueries: { - EmbedQuery: (previousData, {mutationResult}) => { + CoralEmbedStream_Embed: (previousData, {mutationResult}) => { const ignoredUserId = variables.id; const response = mutationResult.data.ignoreUser; if (ignoredUserId && !response.errors) { @@ -101,7 +101,7 @@ const extension = { }), StopIgnoringUser: ({variables}) => ({ updateQueries: { - EmbedStreamProfileQuery: (previousData, {mutationResult}) => { + CoralEmbedStream_Profile: (previousData, {mutationResult}) => { const noLongerIgnoredUserId = variables.id; const response = mutationResult.data.stopIgnoringUser; if (noLongerIgnoredUserId && !response.errors) { @@ -141,7 +141,7 @@ const extension = { } }, updateQueries: { - EmbedQuery: (previousData, {mutationResult: {data: {createComment: {comment}}}}) => { + CoralEmbedStream_Embed: (previousData, {mutationResult: {data: {createComment: {comment}}}}) => { if (previousData.asset.settings.moderation === 'PRE' || comment.status === 'PREMOD' || comment.status === 'REJECTED') { return previousData; } @@ -182,7 +182,7 @@ const extension = { variables: {id, edit}, }) => ({ updateQueries: { - EmbedQuery: (previousData, {mutationResult: {data: {editComment: {comment, errors}}}}) => { + CoralEmbedStream_Embed: (previousData, {mutationResult: {data: {editComment: {comment, errors}}}}) => { // @TODO (kiwi) revisit after streamlining error handling if (errors && errors.length) { diff --git a/client/coral-settings/containers/ProfileContainer.js b/client/coral-settings/containers/ProfileContainer.js index f5779c1c2..575259aa2 100644 --- a/client/coral-settings/containers/ProfileContainer.js +++ b/client/coral-settings/containers/ProfileContainer.js @@ -84,7 +84,7 @@ class ProfileContainer extends Component { const withQuery = graphql( gql` - query EmbedStreamProfileQuery { + query CoralEmbedStream_Profile { me { id ignoredUsers { From 93e6c0af32cdca30c8d4695e89f70ad808bd01e1 Mon Sep 17 00:00:00 2001 From: Chi Vinh Le Date: Thu, 25 May 2017 18:57:42 +0700 Subject: [PATCH 28/78] Use default response fragments 2 --- client/coral-framework/graphql/mutations.js | 39 --------------------- 1 file changed, 39 deletions(-) diff --git a/client/coral-framework/graphql/mutations.js b/client/coral-framework/graphql/mutations.js index 2af4c53ce..d9c3cfe45 100644 --- a/client/coral-framework/graphql/mutations.js +++ b/client/coral-framework/graphql/mutations.js @@ -6,9 +6,6 @@ export const withSetCommentStatus = withMutation( mutation SetCommentStatus($commentId: ID!, $status: COMMENT_STATUS!){ setCommentStatus(id: $commentId, status: $status) { ...SetCommentStatusResponse - errors { - translation_key - } } } `, { @@ -29,9 +26,6 @@ export const withSuspendUser = withMutation( mutation SuspendUser($input: SuspendUserInput!) { suspendUser(input: $input) { ...SuspendUserResponse - errors { - translation_key - } } } `, { @@ -51,9 +45,6 @@ export const withRejectUsername = withMutation( mutation RejectUsername($input: RejectUsernameInput!) { rejectUsername(input: $input) { ...RejectUsernameResponse - errors { - translation_key - } } } `, { @@ -73,9 +64,6 @@ export const withSetUserStatus = withMutation( mutation SetUserStatus($userId: ID!, $status: USER_STATUS!) { setUserStatus(id: $userId, status: $status) { ...SetUserStatusResponse - errors { - translation_key - } } } `, { @@ -96,9 +84,6 @@ export const withPostComment = withMutation( mutation PostComment($comment: CreateCommentInput!) { createComment(comment: $comment) { ...CreateCommentResponse - errors { - translation_key - } } } `, { @@ -118,9 +103,6 @@ export const withEditComment = withMutation( mutation EditComment($id: ID!, $asset_id: ID!, $edit: EditCommentInput) { editComment(id:$id, asset_id:$asset_id, edit:$edit) { ...EditCommentResponse - errors { - translation_key - } } } `, { @@ -142,9 +124,6 @@ export const withPostFlag = withMutation( mutation PostFlag($flag: CreateFlagInput!) { createFlag(flag: $flag) { ...CreateFlagResponse - errors { - translation_key - } } } `, { @@ -163,9 +142,6 @@ export const withPostDontAgree = withMutation( mutation CreateDontAgree($dontagree: CreateDontAgreeInput!) { createDontAgree(dontagree: $dontagree) { ...CreateDontAgreeResponse - errors { - translation_key - } } } `, { @@ -184,9 +160,6 @@ export const withDeleteAction = withMutation( mutation DeleteAction($id: ID!) { deleteAction(id:$id) { ...DeleteActionResponse - errors { - translation_key - } } } `, { @@ -205,9 +178,6 @@ export const withAddCommentTag = withMutation( mutation AddCommentTag($id: ID!, $tag: String!) { addCommentTag(id:$id, tag:$tag) { ...AddCommentTagResponse - errors { - translation_key - } } } `, { @@ -227,9 +197,6 @@ export const withRemoveCommentTag = withMutation( mutation RemoveCommentTag($id: ID!, $tag: String!) { removeCommentTag(id:$id, tag:$tag) { ...RemoveCommentTagResponse - errors { - translation_key - } } } `, { @@ -249,9 +216,6 @@ export const withIgnoreUser = withMutation( mutation IgnoreUser($id: ID!) { ignoreUser(id:$id) { ...IgnoreUserResponse - errors { - translation_key - } } } `, { @@ -270,9 +234,6 @@ export const withStopIgnoringUser = withMutation( mutation StopIgnoringUser($id: ID!) { stopIgnoringUser(id:$id) { ...StopIgnoringUserResponse - errors { - translation_key - } } } `, { From 246ca117be4c958056b662484016c91301d24724 Mon Sep 17 00:00:00 2001 From: Chi Vinh Le Date: Thu, 25 May 2017 19:22:59 +0700 Subject: [PATCH 29/78] Little cleanup for admin services --- client/coral-admin/config.json | 3 --- client/coral-admin/src/services/PymConnection.js | 9 --------- client/coral-admin/src/services/client.js | 6 +++++- client/coral-admin/src/services/config.js | 14 -------------- client/coral-admin/src/services/subscriptions.js | 14 -------------- client/coral-framework/services/client.js | 2 ++ 6 files changed, 7 insertions(+), 41 deletions(-) delete mode 100644 client/coral-admin/config.json delete mode 100644 client/coral-admin/src/services/PymConnection.js delete mode 100644 client/coral-admin/src/services/config.js delete mode 100644 client/coral-admin/src/services/subscriptions.js diff --git a/client/coral-admin/config.json b/client/coral-admin/config.json deleted file mode 100644 index 156740de5..000000000 --- a/client/coral-admin/config.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "basePath": "admin" -} diff --git a/client/coral-admin/src/services/PymConnection.js b/client/coral-admin/src/services/PymConnection.js deleted file mode 100644 index ca592b824..000000000 --- a/client/coral-admin/src/services/PymConnection.js +++ /dev/null @@ -1,9 +0,0 @@ -import Pym from '../../node_modules/pym.js'; - -const pym = new Pym.Child({polling: 100}); -export default pym; - -export const link = (url) => (e) => { - e.preventDefault(); - pym.sendMessage('navigate', url); -}; diff --git a/client/coral-admin/src/services/client.js b/client/coral-admin/src/services/client.js index ff8216373..df97066bc 100644 --- a/client/coral-admin/src/services/client.js +++ b/client/coral-admin/src/services/client.js @@ -4,13 +4,17 @@ import fragmentMatcher from './fragmentMatcher'; export const client = new ApolloClient({ fragmentMatcher, + connectToDevTools: true, addTypename: true, queryTransformer: addTypename, dataIdFromObject: (result) => { if (result.id && result.__typename) { // eslint-disable-line no-underscore-dangle - return result.__typename + result.id; // eslint-disable-line no-underscore-dangle + return `${result.__typename}_${result.id}`; // eslint-disable-line no-underscore-dangle } return null; }, networkInterface }); + +export default client; + diff --git a/client/coral-admin/src/services/config.js b/client/coral-admin/src/services/config.js deleted file mode 100644 index 05cf0ecb8..000000000 --- a/client/coral-admin/src/services/config.js +++ /dev/null @@ -1,14 +0,0 @@ - -/** - * Just load the root config file and throw an - * error message if not present - */ - -try { - module.exports = require('../../config.json'); -} catch (error) { - const message = `The config.json file under the root directory is missing -or invalid Please add one to use this app. You can use config.sample.json as a guide.`; - window.alert(message); - throw new Error(message); -} diff --git a/client/coral-admin/src/services/subscriptions.js b/client/coral-admin/src/services/subscriptions.js deleted file mode 100644 index f514ea18b..000000000 --- a/client/coral-admin/src/services/subscriptions.js +++ /dev/null @@ -1,14 +0,0 @@ -import {print} from 'graphql-tag/printer'; - -// quick way to add the subscribe and unsubscribe functions to the network interface -const addGraphQLSubscriptions = (networkInterface, wsClient) => Object.assign(networkInterface, { - subscribe: (request, handler) => wsClient.subscribe({ - query: print(request.query), - variables: request.variables, - }, handler), - unsubscribe: (id) => { - wsClient.unsubscribe(id); - }, -}); - -export default addGraphQLSubscriptions; diff --git a/client/coral-framework/services/client.js b/client/coral-framework/services/client.js index 47ea9c352..c77bc9848 100644 --- a/client/coral-framework/services/client.js +++ b/client/coral-framework/services/client.js @@ -13,6 +13,7 @@ import {networkInterface} from './transport'; // ); export const client = new ApolloClient({ connectToDevTools: true, + addTypename: true, queryTransformer: addTypename, dataIdFromObject: (result) => { if (result.id && result.__typename) { // eslint-disable-line no-underscore-dangle @@ -24,3 +25,4 @@ export const client = new ApolloClient({ }); export default client; + From bb6be9a7345d7f1b96a13a3e62ad4d9d351b4d18 Mon Sep 17 00:00:00 2001 From: Belen Curcio Date: Thu, 25 May 2017 11:53:40 -0300 Subject: [PATCH 30/78] BE implementation --- client/coral-framework/actions/auth.js | 108 +++++++++++---------- client/coral-framework/helpers/response.js | 4 +- routes/api/auth/index.js | 29 +++++- services/passport.js | 7 ++ 4 files changed, 90 insertions(+), 58 deletions(-) diff --git a/client/coral-framework/actions/auth.js b/client/coral-framework/actions/auth.js index 071235ce3..7798e165f 100644 --- a/client/coral-framework/actions/auth.js +++ b/client/coral-framework/actions/auth.js @@ -9,7 +9,7 @@ const lang = new I18n(translations); import translations from './../translations'; import I18n from '../../coral-framework/modules/i18n/i18n'; -export const showSignInDialog = () => (dispatch) => { +export const showSignInDialog = () => dispatch => { const signInPopUp = window.open( '/embed/stream/login', 'Login', @@ -32,7 +32,7 @@ export const showSignInDialog = () => (dispatch) => { dispatch({type: actions.SHOW_SIGNIN_DIALOG}); }; -export const hideSignInDialog = () => (dispatch) => { +export const hideSignInDialog = () => dispatch => { dispatch({type: actions.HIDE_SIGNIN_DIALOG}); window.close(); }; @@ -51,7 +51,7 @@ const createUsernameSuccess = () => ({ type: actions.CREATE_USERNAME_SUCCESS }); -const createUsernameFailure = (error) => ({ +const createUsernameFailure = error => ({ type: actions.CREATE_USERNAME_FAILURE, error }); @@ -61,7 +61,7 @@ export const updateUsername = ({username}) => ({ username }); -export const createUsername = (userId, formData) => (dispatch) => { +export const createUsername = (userId, formData) => dispatch => { dispatch(createUsernameRequest()); coralApi('/account/username', {method: 'PUT', body: formData}) .then(() => { @@ -69,26 +69,26 @@ export const createUsername = (userId, formData) => (dispatch) => { dispatch(hideCreateUsernameDialog()); dispatch(updateUsername(formData)); }) - .catch((error) => { + .catch(error => { dispatch(createUsernameFailure(lang.t(`error.${error.translation_key}`))); }); }; -export const changeView = (view) => (dispatch) => { +export const changeView = view => dispatch => { dispatch({ type: actions.CHANGE_VIEW, view }); switch (view) { - case 'SIGNUP': - window.resizeTo(500, 800); - break; - case 'FORGOT': - window.resizeTo(500, 400); - break; - default: - window.resizeTo(500, 550); + case 'SIGNUP': + window.resizeTo(500, 800); + break; + case 'FORGOT': + window.resizeTo(500, 400); + break; + default: + window.resizeTo(500, 550); } }; @@ -102,7 +102,7 @@ const signInRequest = () => ({ type: actions.FETCH_SIGNIN_REQUEST }); -const signInFailure = (error) => ({ +const signInFailure = error => ({ type: actions.FETCH_SIGNIN_FAILURE, error }); @@ -111,7 +111,7 @@ const signInFailure = (error) => ({ // AUTH TOKEN //============================================================================== -export const handleAuthToken = (token) => (dispatch) => { +export const handleAuthToken = token => dispatch => { if (!browser || browser.name !== 'safari') { Storage.setItem('exp', jwtDecode(token).exp); Storage.setItem('token', token); @@ -123,26 +123,29 @@ export const handleAuthToken = (token) => (dispatch) => { // SIGN IN //============================================================================== -export const fetchSignIn = (formData) => (dispatch) => { - dispatch(signInRequest()); - return coralApi('/auth/local', {method: 'POST', body: formData}) - .then(({token}) => { - dispatch(handleAuthToken(token)); - dispatch(hideSignInDialog()); - }) - .catch((error) => { - if (error.metadata) { +export const fetchSignIn = formData => { + return dispatch => { + dispatch(signInRequest()); - // the user might not have a valid email. prompt the user user re-request the confirmation email - dispatch( - signInFailure(lang.t('error.emailNotVerified', error.metadata)) - ); - } else { + return coralApi('/auth/local', {method: 'POST', body: formData}) + .then(({token}) => { + dispatch(handleAuthToken(token)); + dispatch(hideSignInDialog()); + }) + .catch(error => { + if (error.metadata) { - // invalid credentials - dispatch(signInFailure(lang.t('error.emailPasswordError'))); - } - }); + // the user might not have a valid email. prompt the user user re-request the confirmation email + dispatch( + signInFailure(lang.t('error.emailNotVerified', error.metadata)) + ); + } else { + + // invalid credentials + dispatch(signInFailure(lang.t('error.emailPasswordError'))); + } + }); + }; }; //============================================================================== @@ -153,17 +156,17 @@ const signInFacebookRequest = () => ({ type: actions.FETCH_SIGNIN_FACEBOOK_REQUEST }); -const signInFacebookSuccess = (user) => ({ +const signInFacebookSuccess = user => ({ type: actions.FETCH_SIGNIN_FACEBOOK_SUCCESS, user }); -const signInFacebookFailure = (error) => ({ +const signInFacebookFailure = error => ({ type: actions.FETCH_SIGNIN_FACEBOOK_FAILURE, error }); -export const fetchSignInFacebook = () => (dispatch) => { +export const fetchSignInFacebook = () => dispatch => { dispatch(signInFacebookRequest()); window.open( `${base}/auth/facebook`, @@ -180,7 +183,7 @@ const signUpFacebookRequest = () => ({ type: actions.FETCH_SIGNUP_FACEBOOK_REQUEST }); -export const fetchSignUpFacebook = () => (dispatch) => { +export const fetchSignUpFacebook = () => dispatch => { dispatch(signUpFacebookRequest()); window.open( `${base}/auth/facebook`, @@ -213,10 +216,10 @@ export const facebookCallback = (err, data) => (dispatch, getState) => { //============================================================================== const signUpRequest = () => ({type: actions.FETCH_SIGNUP_REQUEST}); -const signUpSuccess = (user) => ({type: actions.FETCH_SIGNUP_SUCCESS, user}); -const signUpFailure = (error) => ({type: actions.FETCH_SIGNUP_FAILURE, error}); +const signUpSuccess = user => ({type: actions.FETCH_SIGNUP_SUCCESS, user}); +const signUpFailure = error => ({type: actions.FETCH_SIGNUP_FAILURE, error}); -export const fetchSignUp = (formData, redirectUri) => (dispatch) => { +export const fetchSignUp = (formData, redirectUri) => dispatch => { dispatch(signUpRequest()); coralApi('/users', { @@ -227,7 +230,7 @@ export const fetchSignUp = (formData, redirectUri) => (dispatch) => { .then(({user}) => { dispatch(signUpSuccess(user)); }) - .catch((error) => { + .catch(error => { let errorMessage = lang.t(`error.${error.message}`); // if there is no translation defined, just show the error string @@ -254,7 +257,7 @@ const forgotPasswordFailure = () => ({ type: actions.FETCH_FORGOT_PASSWORD_FAILURE }); -export const fetchForgotPassword = (email) => (dispatch) => { +export const fetchForgotPassword = email => dispatch => { dispatch(forgotPasswordRequest(email)); const redirectUri = pym.parentUrl || location.href; coralApi('/account/password/reset', { @@ -262,14 +265,14 @@ export const fetchForgotPassword = (email) => (dispatch) => { body: {email, loc: redirectUri} }) .then(() => dispatch(forgotPasswordSuccess())) - .catch((error) => dispatch(forgotPasswordFailure(error))); + .catch(error => dispatch(forgotPasswordFailure(error))); }; //============================================================================== // LOGOUT //============================================================================== -export const logout = () => (dispatch) => { +export const logout = () => dispatch => { return coralApi('/auth', {method: 'DELETE'}).then(() => { if (!browser || browser.name !== 'safari') { Storage.removeItem('token'); @@ -283,7 +286,7 @@ export const logout = () => (dispatch) => { //============================================================================== const checkLoginRequest = () => ({type: actions.CHECK_LOGIN_REQUEST}); -const checkLoginFailure = (error) => ({type: actions.CHECK_LOGIN_FAILURE, error}); +const checkLoginFailure = error => ({type: actions.CHECK_LOGIN_FAILURE, error}); const checkLoginSuccess = (user, isAdmin) => ({ type: actions.CHECK_LOGIN_SUCCESS, @@ -291,10 +294,10 @@ const checkLoginSuccess = (user, isAdmin) => ({ isAdmin }); -export const checkLogin = () => (dispatch) => { +export const checkLogin = () => dispatch => { dispatch(checkLoginRequest()); coralApi('/auth') - .then((result) => { + .then(result => { if (!result.user) { if (!browser || browser.name !== 'safari') { Storage.removeItem('token'); @@ -304,14 +307,14 @@ export const checkLogin = () => (dispatch) => { dispatch(checkLoginSuccess(result.user)); }) - .catch((error) => { + .catch(error => { console.error(error); dispatch(checkLoginFailure(`${error.translation_key}`)); }); }; export const validForm = () => ({type: actions.VALID_FORM}); -export const invalidForm = (error) => ({type: actions.INVALID_FORM, error}); +export const invalidForm = error => ({type: actions.INVALID_FORM, error}); //============================================================================== // VERIFY EMAIL @@ -329,7 +332,7 @@ const verifyEmailFailure = () => ({ type: actions.VERIFY_EMAIL_FAILURE }); -export const requestConfirmEmail = (email, redirectUri) => (dispatch) => { +export const requestConfirmEmail = (email, redirectUri) => dispatch => { dispatch(verifyEmailRequest()); return coralApi('/users/resend-verify', { method: 'POST', @@ -339,8 +342,7 @@ export const requestConfirmEmail = (email, redirectUri) => (dispatch) => { .then(() => { dispatch(verifyEmailSuccess()); }) - .catch((err) => { - + .catch(err => { // email might have already been verifyed dispatch(verifyEmailFailure(err)); }); diff --git a/client/coral-framework/helpers/response.js b/client/coral-framework/helpers/response.js index bad2e52f7..b6e48abb3 100644 --- a/client/coral-framework/helpers/response.js +++ b/client/coral-framework/helpers/response.js @@ -5,13 +5,13 @@ const buildOptions = (inputOptions = {}) => { method: 'GET', headers: { Accept: 'application/json', - 'Content-Type': 'application/json' + 'Content-Type': 'application/json', }, credentials: 'same-origin' }; let options = { - defaultOptions, + ...defaultOptions, ...inputOptions }; diff --git a/routes/api/auth/index.js b/routes/api/auth/index.js index 6f610e2b0..90fe31b1e 100644 --- a/routes/api/auth/index.js +++ b/routes/api/auth/index.js @@ -3,6 +3,14 @@ const {passport, HandleGenerateCredentials, HandleLogout} = require('../../../se const router = express.Router(); +const lookup = (i) => { + switch (i) { + case 0: return 'header'; + case 1: return 'cookie'; + case 2: return 'query'; + } +}; + /** * This returns the user if they are logged in. */ @@ -15,16 +23,31 @@ router.get('/', (req, res, next) => { res.status(204).end(); }, (req, res) => { - // Send back the user object. - res.json({user: req.user}); + const authorizations = [ + req.headers.authorization, + req.cookies ? req.cookies.authorization : [], + req.query.authorization + ]; + + res.set('Cache-Control', 'no-cache, no-store, must-revalidate'); + + let i = authorizations.findIndex((source) => source !== null && typeof source != 'undefined' && source.length > 0); + if (i >= 0) { + let authorization = authorizations[i]; + let source = lookup(i); + + // Send back the user object. + res.json({authorization, source, user: req.user}); + } }); /** * This blacklists the token used to authenticate. */ + router.delete('/', HandleLogout); -//============================================================================== +// ============================================================================= // PASSPORT ROUTES //============================================================================== diff --git a/services/passport.js b/services/passport.js index c64bb2334..5e993be51 100644 --- a/services/passport.js +++ b/services/passport.js @@ -47,6 +47,12 @@ const HandleGenerateCredentials = (req, res, next) => (err, user) => { // Generate the token to re-issue to the frontend. const token = GenerateToken(user); + // handling cookie + res.cookie('authorization', token, { + httpOnly: true, + expires: new Date(Date.now() + 900000) + }); + // Send back the details! res.json({user, token}); }; @@ -134,6 +140,7 @@ const HandleLogout = (req, res, next) => { return next(err); } + res.clearCookie('authorization'); res.status(204).end(); }); }; From 4fe89257c244c9ce35b898c7542d762274935603 Mon Sep 17 00:00:00 2001 From: Chi Vinh Le Date: Thu, 25 May 2017 20:55:01 +0700 Subject: [PATCH 31/78] Support store in withMutation --- client/coral-admin/src/services/store.js | 5 ++- client/coral-embed-stream/src/index.js | 9 ++--- client/coral-framework/hocs/withMutation.js | 4 +- client/coral-framework/services/store.js | 42 +++++++++++++-------- 4 files changed, 36 insertions(+), 24 deletions(-) diff --git a/client/coral-admin/src/services/store.js b/client/coral-admin/src/services/store.js index bf2735e45..2ab9d3750 100644 --- a/client/coral-admin/src/services/store.js +++ b/client/coral-admin/src/services/store.js @@ -14,7 +14,7 @@ if (window.devToolsExtension) { middlewares.push(window.devToolsExtension()); } -export default createStore( +const store = createStore( combineReducers({ ...mainReducer, apollo: client.reducer() @@ -22,3 +22,6 @@ export default createStore( {}, compose(...middlewares) ); + +window.coralStore = store; +export default store; diff --git a/client/coral-embed-stream/src/index.js b/client/coral-embed-stream/src/index.js index 0306079f3..0b08d3627 100644 --- a/client/coral-embed-stream/src/index.js +++ b/client/coral-embed-stream/src/index.js @@ -8,16 +8,15 @@ import './graphql'; import {addExternalConfig} from 'coral-embed-stream/src/actions/config'; import reducers from './reducers'; -import localStore, {injectReducers} from 'coral-framework/services/store'; +import {getStore, injectReducers} from 'coral-framework/services/store'; import AppRouter from './AppRouter'; import {pym} from 'coral-framework'; -injectReducers(reducers); - -const store = (window.opener && window.opener.coralStore) ? window.opener.coralStore : localStore; +const store = getStore(); // Don't run this in the popup. -if (store === localStore) { +if (!window.opener) { + injectReducers(reducers); store.dispatch(checkLogin()); pym.sendMessage('getConfig'); diff --git a/client/coral-framework/hocs/withMutation.js b/client/coral-framework/hocs/withMutation.js index 044bcdfad..d05f3f1f5 100644 --- a/client/coral-framework/hocs/withMutation.js +++ b/client/coral-framework/hocs/withMutation.js @@ -5,7 +5,7 @@ import uniq from 'lodash/uniq'; import flatten from 'lodash/flatten'; import isEmpty from 'lodash/isEmpty'; import {getMutationOptions, resolveFragments} from 'coral-framework/services/graphqlRegistry'; -import {store} from 'coral-framework/services/store'; +import {getStore} from 'coral-framework/services/store'; import {getDefinitionName} from '../utils'; /** @@ -23,7 +23,7 @@ export default (document, config) => (WrappedComponent) => { const callbacks = getMutationOptions(name); const mutate = (base) => { const variables = base.variables || config.options.variables; - const configs = callbacks.map((cb) => cb({variables, state: store.getState()})); + const configs = callbacks.map((cb) => cb({variables, state: getStore().getState()})); const optimisticResponse = merge( base.optimisticResponse || config.options.optimisticResponse, diff --git a/client/coral-framework/services/store.js b/client/coral-framework/services/store.js index 22e126d75..297243736 100644 --- a/client/coral-framework/services/store.js +++ b/client/coral-framework/services/store.js @@ -24,22 +24,32 @@ if (window.devToolsExtension) { middlewares.push(window.devToolsExtension()); } -let storeReducers = { - ...mainReducer, - apollo: client.reducer() -}; - -export const store = createStore( - combineReducers(storeReducers), - {}, - compose(...middlewares) -); - -export default store; - export function injectReducers(reducers) { - storeReducers = {...storeReducers, ...reducers}; - store.replaceReducer(combineReducers(storeReducers)); + const store = getStore(); + store.coralReducers = {...store.coralReducers, ...reducers}; + store.replaceReducer(combineReducers(store.coralReducers)); } -window.coralStore = store; +export function getStore() { + if (window.coralStore) { + return window.coralStore; + } + if (window.opener && window.opener.coralStore) { + return window.opener.coralStore; + } + + const coralReducers = { + ...mainReducer, + apollo: client.reducer() + }; + + window.coralStore = createStore( + combineReducers(coralReducers), + {}, + compose(...middlewares) + ); + + window.coralStore.coralReducers = coralReducers; + + return window.coralStore; +} From e510553d9a7fb9accafb92f6c8884878bc2ccb9f Mon Sep 17 00:00:00 2001 From: Belen Curcio Date: Thu, 25 May 2017 13:55:03 -0300 Subject: [PATCH 32/78] Sending cookies if safari --- client/coral-admin/src/actions/auth.js | 20 +++--- client/coral-framework/actions/auth.js | 83 +++++++++++----------- client/coral-framework/helpers/response.js | 4 +- routes/api/auth/index.js | 50 +++++++------ services/passport.js | 15 ++-- 5 files changed, 94 insertions(+), 78 deletions(-) diff --git a/client/coral-admin/src/actions/auth.js b/client/coral-admin/src/actions/auth.js index 00ab46910..16b6c774a 100644 --- a/client/coral-admin/src/actions/auth.js +++ b/client/coral-admin/src/actions/auth.js @@ -1,4 +1,4 @@ -import browser from 'detect-browser'; +import browser from 'bowser'; import * as actions from '../constants/auth'; import coralApi from 'coral-framework/helpers/response'; import * as Storage from 'coral-framework/helpers/storage'; @@ -8,7 +8,7 @@ import {handleAuthToken} from 'coral-framework/actions/auth'; // SIGN IN //============================================================================== -export const handleLogin = (email, password, recaptchaResponse) => dispatch => { +export const handleLogin = (email, password, recaptchaResponse) => (dispatch) => { dispatch({type: actions.LOGIN_REQUEST}); const params = { @@ -29,7 +29,7 @@ export const handleLogin = (email, password, recaptchaResponse) => dispatch => { .then(({user, token}) => { if (!user) { - if (!browser || browser.name !== 'safari') { + if (!browser || browser.name !== 'Safari') { Storage.removeItem('token'); } return dispatch(checkLoginFailure('not logged in')); @@ -38,7 +38,7 @@ export const handleLogin = (email, password, recaptchaResponse) => dispatch => { dispatch(handleAuthToken(token)); dispatch(checkLoginSuccess(user)); }) - .catch(error => { + .catch((error) => { if (error.translation_key === 'LOGIN_MAXIMUM_EXCEEDED') { dispatch({ type: actions.LOGIN_MAXIMUM_EXCEEDED, @@ -66,11 +66,11 @@ const forgotPassowordFailure = () => ({ type: actions.FETCH_FORGOT_PASSWORD_FAILURE }); -export const requestPasswordReset = email => dispatch => { +export const requestPasswordReset = (email) => (dispatch) => { dispatch(forgotPassowordRequest(email)); return coralApi('/account/password/reset', {method: 'POST', body: {email}}) .then(() => dispatch(forgotPassowordSuccess())) - .catch(error => dispatch(forgotPassowordFailure(error))); + .catch((error) => dispatch(forgotPassowordFailure(error))); }; //============================================================================== @@ -87,17 +87,17 @@ const checkLoginSuccess = (user, isAdmin) => ({ isAdmin }); -const checkLoginFailure = error => ({ +const checkLoginFailure = (error) => ({ type: actions.CHECK_LOGIN_FAILURE, error }); -export const checkLogin = () => dispatch => { +export const checkLogin = () => (dispatch) => { dispatch(checkLoginRequest()); return coralApi('/auth') .then(({user}) => { if (!user) { - if (!browser || browser.name !== 'safari') { + if (!browser || browser.name !== 'Safari') { Storage.removeItem('token'); } return dispatch(checkLoginFailure('not logged in')); @@ -105,7 +105,7 @@ export const checkLogin = () => dispatch => { dispatch(checkLoginSuccess(user)); }) - .catch(error => { + .catch((error) => { console.error(error); dispatch(checkLoginFailure(`${error.translation_key}`)); }); diff --git a/client/coral-framework/actions/auth.js b/client/coral-framework/actions/auth.js index 7798e165f..2f0a2dc0f 100644 --- a/client/coral-framework/actions/auth.js +++ b/client/coral-framework/actions/auth.js @@ -1,6 +1,6 @@ import jwtDecode from 'jwt-decode'; import {pym} from 'coral-framework'; -import browser from 'detect-browser'; +import browser from 'bowser'; import * as actions from '../constants/auth'; import * as Storage from '../helpers/storage'; import coralApi, {base} from '../helpers/response'; @@ -9,7 +9,7 @@ const lang = new I18n(translations); import translations from './../translations'; import I18n from '../../coral-framework/modules/i18n/i18n'; -export const showSignInDialog = () => dispatch => { +export const showSignInDialog = () => (dispatch) => { const signInPopUp = window.open( '/embed/stream/login', 'Login', @@ -32,7 +32,7 @@ export const showSignInDialog = () => dispatch => { dispatch({type: actions.SHOW_SIGNIN_DIALOG}); }; -export const hideSignInDialog = () => dispatch => { +export const hideSignInDialog = () => (dispatch) => { dispatch({type: actions.HIDE_SIGNIN_DIALOG}); window.close(); }; @@ -51,7 +51,7 @@ const createUsernameSuccess = () => ({ type: actions.CREATE_USERNAME_SUCCESS }); -const createUsernameFailure = error => ({ +const createUsernameFailure = (error) => ({ type: actions.CREATE_USERNAME_FAILURE, error }); @@ -61,7 +61,7 @@ export const updateUsername = ({username}) => ({ username }); -export const createUsername = (userId, formData) => dispatch => { +export const createUsername = (userId, formData) => (dispatch) => { dispatch(createUsernameRequest()); coralApi('/account/username', {method: 'PUT', body: formData}) .then(() => { @@ -69,26 +69,26 @@ export const createUsername = (userId, formData) => dispatch => { dispatch(hideCreateUsernameDialog()); dispatch(updateUsername(formData)); }) - .catch(error => { + .catch((error) => { dispatch(createUsernameFailure(lang.t(`error.${error.translation_key}`))); }); }; -export const changeView = view => dispatch => { +export const changeView = (view) => (dispatch) => { dispatch({ type: actions.CHANGE_VIEW, view }); switch (view) { - case 'SIGNUP': - window.resizeTo(500, 800); - break; - case 'FORGOT': - window.resizeTo(500, 400); - break; - default: - window.resizeTo(500, 550); + case 'SIGNUP': + window.resizeTo(500, 800); + break; + case 'FORGOT': + window.resizeTo(500, 400); + break; + default: + window.resizeTo(500, 550); } }; @@ -102,7 +102,7 @@ const signInRequest = () => ({ type: actions.FETCH_SIGNIN_REQUEST }); -const signInFailure = error => ({ +const signInFailure = (error) => ({ type: actions.FETCH_SIGNIN_FAILURE, error }); @@ -111,8 +111,8 @@ const signInFailure = error => ({ // AUTH TOKEN //============================================================================== -export const handleAuthToken = token => dispatch => { - if (!browser || browser.name !== 'safari') { +export const handleAuthToken = (token) => (dispatch) => { + if (!browser || browser.name !== 'Safari') { Storage.setItem('exp', jwtDecode(token).exp); Storage.setItem('token', token); } @@ -123,8 +123,8 @@ export const handleAuthToken = token => dispatch => { // SIGN IN //============================================================================== -export const fetchSignIn = formData => { - return dispatch => { +export const fetchSignIn = (formData) => { + return (dispatch) => { dispatch(signInRequest()); return coralApi('/auth/local', {method: 'POST', body: formData}) @@ -132,7 +132,7 @@ export const fetchSignIn = formData => { dispatch(handleAuthToken(token)); dispatch(hideSignInDialog()); }) - .catch(error => { + .catch((error) => { if (error.metadata) { // the user might not have a valid email. prompt the user user re-request the confirmation email @@ -156,17 +156,17 @@ const signInFacebookRequest = () => ({ type: actions.FETCH_SIGNIN_FACEBOOK_REQUEST }); -const signInFacebookSuccess = user => ({ +const signInFacebookSuccess = (user) => ({ type: actions.FETCH_SIGNIN_FACEBOOK_SUCCESS, user }); -const signInFacebookFailure = error => ({ +const signInFacebookFailure = (error) => ({ type: actions.FETCH_SIGNIN_FACEBOOK_FAILURE, error }); -export const fetchSignInFacebook = () => dispatch => { +export const fetchSignInFacebook = () => (dispatch) => { dispatch(signInFacebookRequest()); window.open( `${base}/auth/facebook`, @@ -183,7 +183,7 @@ const signUpFacebookRequest = () => ({ type: actions.FETCH_SIGNUP_FACEBOOK_REQUEST }); -export const fetchSignUpFacebook = () => dispatch => { +export const fetchSignUpFacebook = () => (dispatch) => { dispatch(signUpFacebookRequest()); window.open( `${base}/auth/facebook`, @@ -216,10 +216,10 @@ export const facebookCallback = (err, data) => (dispatch, getState) => { //============================================================================== const signUpRequest = () => ({type: actions.FETCH_SIGNUP_REQUEST}); -const signUpSuccess = user => ({type: actions.FETCH_SIGNUP_SUCCESS, user}); -const signUpFailure = error => ({type: actions.FETCH_SIGNUP_FAILURE, error}); +const signUpSuccess = (user) => ({type: actions.FETCH_SIGNUP_SUCCESS, user}); +const signUpFailure = (error) => ({type: actions.FETCH_SIGNUP_FAILURE, error}); -export const fetchSignUp = (formData, redirectUri) => dispatch => { +export const fetchSignUp = (formData, redirectUri) => (dispatch) => { dispatch(signUpRequest()); coralApi('/users', { @@ -230,7 +230,7 @@ export const fetchSignUp = (formData, redirectUri) => dispatch => { .then(({user}) => { dispatch(signUpSuccess(user)); }) - .catch(error => { + .catch((error) => { let errorMessage = lang.t(`error.${error.message}`); // if there is no translation defined, just show the error string @@ -257,7 +257,7 @@ const forgotPasswordFailure = () => ({ type: actions.FETCH_FORGOT_PASSWORD_FAILURE }); -export const fetchForgotPassword = email => dispatch => { +export const fetchForgotPassword = (email) => (dispatch) => { dispatch(forgotPasswordRequest(email)); const redirectUri = pym.parentUrl || location.href; coralApi('/account/password/reset', { @@ -265,16 +265,16 @@ export const fetchForgotPassword = email => dispatch => { body: {email, loc: redirectUri} }) .then(() => dispatch(forgotPasswordSuccess())) - .catch(error => dispatch(forgotPasswordFailure(error))); + .catch((error) => dispatch(forgotPasswordFailure(error))); }; //============================================================================== // LOGOUT //============================================================================== -export const logout = () => dispatch => { +export const logout = () => (dispatch) => { return coralApi('/auth', {method: 'DELETE'}).then(() => { - if (!browser || browser.name !== 'safari') { + if (!browser || browser.name !== 'Safari') { Storage.removeItem('token'); } dispatch({type: actions.LOGOUT}); @@ -286,7 +286,7 @@ export const logout = () => dispatch => { //============================================================================== const checkLoginRequest = () => ({type: actions.CHECK_LOGIN_REQUEST}); -const checkLoginFailure = error => ({type: actions.CHECK_LOGIN_FAILURE, error}); +const checkLoginFailure = (error) => ({type: actions.CHECK_LOGIN_FAILURE, error}); const checkLoginSuccess = (user, isAdmin) => ({ type: actions.CHECK_LOGIN_SUCCESS, @@ -294,12 +294,12 @@ const checkLoginSuccess = (user, isAdmin) => ({ isAdmin }); -export const checkLogin = () => dispatch => { +export const checkLogin = () => (dispatch) => { dispatch(checkLoginRequest()); coralApi('/auth') - .then(result => { + .then((result) => { if (!result.user) { - if (!browser || browser.name !== 'safari') { + if (!browser || browser.name !== 'Safari') { Storage.removeItem('token'); } throw new Error('Not logged in'); @@ -307,14 +307,14 @@ export const checkLogin = () => dispatch => { dispatch(checkLoginSuccess(result.user)); }) - .catch(error => { + .catch((error) => { console.error(error); dispatch(checkLoginFailure(`${error.translation_key}`)); }); }; export const validForm = () => ({type: actions.VALID_FORM}); -export const invalidForm = error => ({type: actions.INVALID_FORM, error}); +export const invalidForm = (error) => ({type: actions.INVALID_FORM, error}); //============================================================================== // VERIFY EMAIL @@ -332,7 +332,7 @@ const verifyEmailFailure = () => ({ type: actions.VERIFY_EMAIL_FAILURE }); -export const requestConfirmEmail = (email, redirectUri) => dispatch => { +export const requestConfirmEmail = (email, redirectUri) => (dispatch) => { dispatch(verifyEmailRequest()); return coralApi('/users/resend-verify', { method: 'POST', @@ -342,7 +342,8 @@ export const requestConfirmEmail = (email, redirectUri) => dispatch => { .then(() => { dispatch(verifyEmailSuccess()); }) - .catch(err => { + .catch((err) => { + // email might have already been verifyed dispatch(verifyEmailFailure(err)); }); diff --git a/client/coral-framework/helpers/response.js b/client/coral-framework/helpers/response.js index b6e48abb3..ce9de6942 100644 --- a/client/coral-framework/helpers/response.js +++ b/client/coral-framework/helpers/response.js @@ -32,9 +32,9 @@ const buildOptions = (inputOptions = {}) => { return options; }; -const handleResp = res => { +const handleResp = (res) => { if (res.status > 399) { - return res.json().then(err => { + return res.json().then((err) => { let message = err.message || res.status; const error = new Error(); diff --git a/routes/api/auth/index.js b/routes/api/auth/index.js index 90fe31b1e..e0e39adf9 100644 --- a/routes/api/auth/index.js +++ b/routes/api/auth/index.js @@ -1,16 +1,9 @@ const express = require('express'); +const bowser = require('bowser'); const {passport, HandleGenerateCredentials, HandleLogout} = require('../../../services/passport'); const router = express.Router(); -const lookup = (i) => { - switch (i) { - case 0: return 'header'; - case 1: return 'cookie'; - case 2: return 'query'; - } -}; - /** * This returns the user if they are logged in. */ @@ -23,22 +16,39 @@ router.get('/', (req, res, next) => { res.status(204).end(); }, (req, res) => { - const authorizations = [ - req.headers.authorization, - req.cookies ? req.cookies.authorization : [], - req.query.authorization - ]; + // If the user is Safari, let's send a cookie + const browser = bowser._detect(req.headers['user-agent']); - res.set('Cache-Control', 'no-cache, no-store, must-revalidate'); + if (browser.name === 'Safari') { - let i = authorizations.findIndex((source) => source !== null && typeof source != 'undefined' && source.length > 0); - if (i >= 0) { - let authorization = authorizations[i]; - let source = lookup(i); + const lookup = (i) => { + switch (i) { + case 0: return 'header'; + case 1: return 'cookie'; + case 2: return 'query'; + } + }; - // Send back the user object. - res.json({authorization, source, user: req.user}); + const authorizations = [ + req.headers.authorization, + req.cookies ? req.cookies.authorization : [], + req.query.authorization + ]; + + res.set('Cache-Control', 'no-cache, no-store, must-revalidate'); + + let i = authorizations.findIndex((source) => source !== null && typeof source != 'undefined' && source.length > 0); + if (i >= 0) { + let authorization = authorizations[i]; + let source = lookup(i); + + // Send back the user object. + res.json({authorization, source, user: req.user}); + } } + + // Send back the user object. + res.json({user: req.user}); }); /** diff --git a/services/passport.js b/services/passport.js index 5e993be51..4b1c10158 100644 --- a/services/passport.js +++ b/services/passport.js @@ -9,6 +9,7 @@ const errors = require('../errors'); const uuid = require('uuid'); const debug = require('debug')('talk:passport'); const {createClient} = require('./redis'); +const bowser = require('bowser'); // Create a redis client to use for authentication. const client = createClient(); @@ -47,11 +48,15 @@ const HandleGenerateCredentials = (req, res, next) => (err, user) => { // Generate the token to re-issue to the frontend. const token = GenerateToken(user); - // handling cookie - res.cookie('authorization', token, { - httpOnly: true, - expires: new Date(Date.now() + 900000) - }); + // If the user is Safari, let's send a cookie + const browser = bowser._detect(req.headers['user-agent']); + + if (browser.name === 'Safari') { + res.cookie('authorization', token, { + httpOnly: true, + expires: new Date(Date.now() + 900000) + }); + } // Send back the details! res.json({user, token}); From 0107aa67cd06df67a6740512c88e21badd088d16 Mon Sep 17 00:00:00 2001 From: Chi Vinh Le Date: Fri, 26 May 2017 01:59:34 +0700 Subject: [PATCH 33/78] Correct keys and translations --- .../components/Steps/AddOrganizationName.js | 6 +-- .../components/Steps/CreateYourAccount.js | 10 ++-- .../Install/components/Steps/FinalStep.js | 6 +-- .../Install/components/Steps/InitialStep.js | 4 +- .../components/Steps/PermittedDomainsStep.js | 6 +-- .../src/components/LoadMore.js | 2 +- locales/en.yml | 50 +++++++++---------- locales/es.yml | 48 +++++++++--------- 8 files changed, 66 insertions(+), 66 deletions(-) diff --git a/client/coral-admin/src/containers/Install/components/Steps/AddOrganizationName.js b/client/coral-admin/src/containers/Install/components/Steps/AddOrganizationName.js index 294e64f8d..064167dda 100644 --- a/client/coral-admin/src/containers/Install/components/Steps/AddOrganizationName.js +++ b/client/coral-admin/src/containers/Install/components/Steps/AddOrganizationName.js @@ -8,18 +8,18 @@ const AddOrganizationName = (props) => { const {handleSettingsChange, handleSettingsSubmit, install} = props; return (
    -

    {t('ADD_ORGANIZATION.DESCRIPTION')}

    +

    {t('install.add_organization.description')}

    - +
    diff --git a/client/coral-admin/src/containers/Install/components/Steps/CreateYourAccount.js b/client/coral-admin/src/containers/Install/components/Steps/CreateYourAccount.js index d07b9e9ff..c5d334610 100644 --- a/client/coral-admin/src/containers/Install/components/Steps/CreateYourAccount.js +++ b/client/coral-admin/src/containers/Install/components/Steps/CreateYourAccount.js @@ -14,7 +14,7 @@ const InitialStep = (props) => { className={styles.textField} id="email" type="email" - label={t('CREATE.EMAIL')} + label={t('install.create.email')} onChange={handleUserChange} showErrors={install.showErrors} errorMsg={install.errors.email} @@ -25,7 +25,7 @@ const InitialStep = (props) => { className={styles.textField} id="username" type="text" - label={t('CREATE.USERNAME')} + label={t('install.create.username')} onChange={handleUserChange} showErrors={install.showErrors} errorMsg={install.errors.username} @@ -35,7 +35,7 @@ const InitialStep = (props) => { className={styles.textField} id="password" type="password" - label={t('CREATE.PASSWORD')} + label={t('install.create.password')} onChange={handleUserChange} showErrors={install.showErrors} errorMsg={install.errors.password} @@ -45,7 +45,7 @@ const InitialStep = (props) => { className={styles.textField} id="confirmPassword" type="password" - label={t('CREATE.CONFIRM_PASSWORD')} + label={t('install.create.confirm_password')} onChange={handleUserChange} showErrors={install.showErrors} errorMsg={install.errors.confirm_password} @@ -53,7 +53,7 @@ const InitialStep = (props) => { { !props.install.isLoading ? - + : } diff --git a/client/coral-admin/src/containers/Install/components/Steps/FinalStep.js b/client/coral-admin/src/containers/Install/components/Steps/FinalStep.js index a09b6ebb1..dbfd33461 100644 --- a/client/coral-admin/src/containers/Install/components/Steps/FinalStep.js +++ b/client/coral-admin/src/containers/Install/components/Steps/FinalStep.js @@ -8,9 +8,9 @@ import t from 'coral-framework/services/i18n'; const InitialStep = () => { return (
    -

    {t('FINAL.DESCRIPTION')}

    - - +

    {t('install.final.description')}

    + +
    ); }; diff --git a/client/coral-admin/src/containers/Install/components/Steps/InitialStep.js b/client/coral-admin/src/containers/Install/components/Steps/InitialStep.js index 1d8d8b050..aceb0d965 100644 --- a/client/coral-admin/src/containers/Install/components/Steps/InitialStep.js +++ b/client/coral-admin/src/containers/Install/components/Steps/InitialStep.js @@ -8,8 +8,8 @@ const InitialStep = (props) => { const {nextStep} = props; return (
    -

    {t('INITIAL.DESCRIPTION')}

    - +

    {t('install.initial.description')}

    +
    ); }; diff --git a/client/coral-admin/src/containers/Install/components/Steps/PermittedDomainsStep.js b/client/coral-admin/src/containers/Install/components/Steps/PermittedDomainsStep.js index 450aeabd8..fde78779d 100644 --- a/client/coral-admin/src/containers/Install/components/Steps/PermittedDomainsStep.js +++ b/client/coral-admin/src/containers/Install/components/Steps/PermittedDomainsStep.js @@ -10,9 +10,9 @@ const PermittedDomainsStep = (props) => { const domains = install.data.settings.domains.whitelist; return (
    -

    {t('PERMITTED_DOMAINS.TITLE')}

    +

    {t('install.permitted_domains.title')}

    -

    {t('PERMITTED_DOMAINS.DESCRIPTION')}

    +

    {t('install.permitted_domains.description')}

    { onChange={(tags) => handleDomainsChange(tags)} />
    - +
    ); }; diff --git a/client/coral-embed-stream/src/components/LoadMore.js b/client/coral-embed-stream/src/components/LoadMore.js index 8715e7902..c9c8a9704 100644 --- a/client/coral-embed-stream/src/components/LoadMore.js +++ b/client/coral-embed-stream/src/components/LoadMore.js @@ -33,7 +33,7 @@ class LoadMore extends React.Component { } if (this.initialState) { - return t('framework.view_all_repliesInitial', count); + return t('framework.view_all_replies_initial', count); } else { return t('framework.view_all_replies', count); } diff --git a/locales/en.yml b/locales/en.yml index 99b2558ca..bbe4f3b25 100644 --- a/locales/en.yml +++ b/locales/en.yml @@ -119,7 +119,7 @@ en: sign_out: "Sign Out" stories: Stories stream_settings: "Stream Settings" - suspect_word_title: "Suspect wåords list" + suspect_word_title: "Suspect words list" suspect_word_text: "Comments which contain these words or phrases (not case-sensitive) will be highlighted in the comment stream. Type a word and press Enter or Tab to add. Optionally paste a comma-separated list." tech_settings: "Tech Settings" title: "Configure Comment Stream" @@ -202,14 +202,14 @@ en: ignored_users: "Ignored users" my_comments: "My Comments" my_profile: "My profile" - new_count: "View 0 new 1" + new_count: "View {0} new {1}" profile: Profile show_all_comments: "Show all comments" success_bio_update: "Your biography has been updated" success_name_update: "Your username has been updated" success_update_settings: "The changes you have made have been applied to the comment stream on this article" - view_all_replies: "view 0 replies" - view_all_replies_initial: "view all 0 replies" + view_all_replies: "view {0} replies" + view_all_replies_initial: "view all {0} replies" view_more_comments: "view more comments" view_reply: "view reply" from_settings_page: "From the Profile Page you can see your comment history." @@ -372,24 +372,24 @@ en: username_offensive: "This username is offensive" view_conversation: "View Conversation" install: - INITIAL: - DESCRIPTION: "Let's set up your Talk community in just a few short steps." - SUBMIT: "Get Started" - ADD_ORGANIZATION: - DESCRIPTION: "Please tell us the name of your organization. This will appear in emails when inviting new team members." - LABEL: "Organization Name" - SAVE: "Save" - CREATE: - EMAIL: "Email address" - USERNAME: "Username" - PASSWORD: "Password" - CONFIRM_PASSWORD: "Confirm Password" - SAVE: "Save" - PERMITTED_DOMAINS: - TITLE: "Permitted domains" - DESCRIPTION: "Enter the domains you would like to permit for Talk, e.g. your local, staging and production environments (ex. localhost:3000, staging.domain.com, domain.com)." - SUBMIT: "Finish install" - FINAL: - DESCRIPTION: "Thanks for installing Talk! We sent an email to verify your email address. While you finish setting up the account, you can start engaging with your readers now." - LAUNCH: "Launch Talk" - CLOSE: "Close this Installer" + initial: + description: "Let's set up your Talk community in just a few short steps." + submit: "Get Started" + add_organization: + description: "Please tell us the name of your organization. This will appear in emails when inviting new team members." + label: "Organization Name" + save: "Save" + create: + email: "Email address" + username: "Username" + password: "Password" + confirm_password: "Confirm Password" + save: "Save" + permitted_domains: + title: "Permitted domains" + description: "Enter the domains you would like to permit for Talk, e.g. your local, staging and production environments (ex. localhost:3000, staging.domain.com, domain.com)." + submit: "Finish install" + final: + description: "Thanks for installing Talk! We sent an email to verify your email address. While you finish setting up the account, you can start engaging with your readers now." + launch: "Launch Talk" + close: "Close this Installer" diff --git a/locales/es.yml b/locales/es.yml index f80755b71..e5f236d6b 100644 --- a/locales/es.yml +++ b/locales/es.yml @@ -244,14 +244,14 @@ es: ignored_users: "Usuarios ignorados" my_comments: "Mis Comentarios" my_profile: "Mi perfil" - new_count: "Ver 0 1 nuevo" + new_count: "Ver {0} {1} nuevo" profile: Perfil show_all_comments: "Mostrar todos los comentarios" success_bio_update: "Tu biografia fue actualizada" success_name_update: "Tu nombre de usuario ha sido actualizado" success_update_settings: "La configuración de este articulo fue actualizada" - view_all_replies: "ver 0 respuestas" - view_all_replies_initial: "ver todas las 0 respuestas" + view_all_replies: "ver {0} respuestas" + view_all_replies_initial: "ver todas las {0} respuestas" view_more_comments: "Ver más comentarios" view_reply: "ver respuesta" from_settings_page: "Desde la página de configuración puedes ver tu historia de\ @@ -437,29 +437,29 @@ es: username_offensive: "Este nombre de usuario es ofensivo" view_conversation: "Ver Conversación" install: - INITIAL: - DESCRIPTION: "Vamos a crear su comunidad Talk en unos pocos pasos." - SUBMIT: "Empecemos" - ADD_ORGANIZATION: - DESCRIPTION: "Por favor díganos el nombre de su organización. Esta aparecerá\ + initial: + description: "Vamos a crear su comunidad Talk en unos pocos pasos." + submit: "Empecemos" + add_organization: + description: "Por favor díganos el nombre de su organización. Esta aparecerá\ \ en correos cuando se inviten a nuevos miembros del equipo." - LABEL: "Nombre de la Organización" - SAVE: "Guardar" - CREATE: - EMAIL: "Dirección de correo" - USERNAME: "Nombre de Usuario" - PASSWORD: "Contraseña" - CONFIRM_PASSWORD: "Confirmar Contraseña" - SAVE: "Guardar" - PERMITTED_DOMAINS: - TITLE: "Dominios permitidos" - DESCRIPTION: "Ingresar los dominios en donde estará Talk, por ejemplo sus ambientes\ + label: "Nombre de la Organización" + save: "Guardar" + create: + email: "Dirección de correo" + username: "Nombre de Usuario" + password: "Contraseña" + confirm_password: "Confirmar Contraseña" + save: "Guardar" + permitted_domains: + title: "Dominios permitidos" + description: "Ingresar los dominios en donde estará Talk, por ejemplo sus ambientes\ \ locales, de staging y producción (ej. localhost:3000, staging.domain.com,\ \ domain.com)." - SUBMIT: "Terminar la Instalación" - FINAL: - DESCRIPTION: "¡Gracias por instalar Talk! Enviamos un correo para verificar\ + submit: "Terminar la Instalación" + final: + description: "¡Gracias por instalar Talk! Enviamos un correo para verificar\ \ su dirección de correo. Mientras esta terminando de configurar su cuenta,\ \ ya puede comenzar a involucrarse con sus lectores." - LAUNCH: "Iniciar Talk" - CLOSE: "Cerrar este instalador" + launch: "Iniciar Talk" + close: "Cerrar este instalador" From 209005aff530159b06cd70eaf566ee28cec82cbf Mon Sep 17 00:00:00 2001 From: Chi Vinh Le Date: Fri, 26 May 2017 02:10:00 +0700 Subject: [PATCH 34/78] More key misspellings --- .../src/containers/ModerationQueue/components/FlagBox.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/coral-admin/src/containers/ModerationQueue/components/FlagBox.js b/client/coral-admin/src/containers/ModerationQueue/components/FlagBox.js index b899dc92f..7dff51fdb 100644 --- a/client/coral-admin/src/containers/ModerationQueue/components/FlagBox.js +++ b/client/coral-admin/src/containers/ModerationQueue/components/FlagBox.js @@ -40,13 +40,13 @@ class FlagBox extends Component {
    -

    {t('community.Flags')} ({actionSummaries.length}):

    +

    {t('community.flags')} ({actionSummaries.length}):

      {actionSummaries.map((action, i) =>
    • {this.reasonMap(action.reason)} ({action.count})
    • )}
    - {showDetail ? t('modqueue.less-detail') : t('modqueue.more_detail')} + {showDetail ? t('modqueue.less_detail') : t('modqueue.more_detail')}
    {showDetail && (
    From f5bd2a9db3dd73aefa37e234120aefa06955b0da Mon Sep 17 00:00:00 2001 From: David Erwin Date: Thu, 25 May 2017 15:17:50 -0400 Subject: [PATCH 35/78] Update top nav --- docs/_data/topnav.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/docs/_data/topnav.yml b/docs/_data/topnav.yml index 32083bbd6..224dac890 100644 --- a/docs/_data/topnav.yml +++ b/docs/_data/topnav.yml @@ -5,11 +5,13 @@ topnav: items: - title: Github external_url: https://github.com/coralproject - - title: The Coral Project - external_url: https://coralproject.net - title: CircleCI external_url: https://circleci.com/gh/coralproject/talk - title: Docker external_url: https://hub.docker.com/r/coralproject/talk/ - title: Roadmap external_url: https://www.pivotaltracker.com/n/projects/1863625 + - title: Home + external_url: https://coralproject.net + - title: Blog + external_url: https://coralproject.net From 75080cfe3055d214ac29d14e5b50760ebb49082b Mon Sep 17 00:00:00 2001 From: Belen Curcio Date: Thu, 25 May 2017 16:19:19 -0300 Subject: [PATCH 36/78] Password reset and valid locations --- client/coral-admin/src/actions/auth.js | 7 +++++-- services/users.js | 3 +-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/client/coral-admin/src/actions/auth.js b/client/coral-admin/src/actions/auth.js index 29971e294..2eb85c86a 100644 --- a/client/coral-admin/src/actions/auth.js +++ b/client/coral-admin/src/actions/auth.js @@ -1,6 +1,7 @@ +import {pym} from 'coral-framework'; import * as actions from '../constants/auth'; -import * as Storage from 'coral-framework/helpers/storage'; import coralApi from 'coral-framework/helpers/response'; +import * as Storage from 'coral-framework/helpers/storage'; import {handleAuthToken} from 'coral-framework/actions/auth'; //============================================================================== @@ -52,7 +53,9 @@ const forgotPassowordFailure = () => ({ export const requestPasswordReset = (email) => (dispatch) => { dispatch(forgotPassowordRequest(email)); - return coralApi('/account/password/reset', {method: 'POST', body: {email}}) + const redirectUri = location.href; + + return coralApi('/account/password/reset', {method: 'POST', body: {email, loc: redirectUri}}) .then(() => dispatch(forgotPassowordSuccess())) .catch((error) => dispatch(forgotPassowordFailure(error))); }; diff --git a/services/users.js b/services/users.js index 496db4528..07a690411 100644 --- a/services/users.js +++ b/services/users.js @@ -566,10 +566,9 @@ module.exports = class UsersService { // endpoint. return; } - let redirectDomain; try { - redirectDomain = url.parse(loc).hostname; + redirectDomain = url.parse(loc).host; } catch (e) { return Promise.reject('redirect location is invalid'); } From 21644bda8a7cf18c84dcd3c54f8eee72efd7b3e6 Mon Sep 17 00:00:00 2001 From: Belen Curcio Date: Thu, 25 May 2017 16:24:39 -0300 Subject: [PATCH 37/78] Linting --- client/coral-admin/src/actions/auth.js | 1 - 1 file changed, 1 deletion(-) diff --git a/client/coral-admin/src/actions/auth.js b/client/coral-admin/src/actions/auth.js index 2eb85c86a..d5a1eeea1 100644 --- a/client/coral-admin/src/actions/auth.js +++ b/client/coral-admin/src/actions/auth.js @@ -1,4 +1,3 @@ -import {pym} from 'coral-framework'; import * as actions from '../constants/auth'; import coralApi from 'coral-framework/helpers/response'; import * as Storage from 'coral-framework/helpers/storage'; From a8c361e2f7bdc8fea5105b87e6b46eee09ea31b6 Mon Sep 17 00:00:00 2001 From: Belen Curcio Date: Thu, 25 May 2017 16:53:12 -0300 Subject: [PATCH 38/78] by hostname --- services/users.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/users.js b/services/users.js index 07a690411..4c76f179c 100644 --- a/services/users.js +++ b/services/users.js @@ -568,7 +568,7 @@ module.exports = class UsersService { } let redirectDomain; try { - redirectDomain = url.parse(loc).host; + redirectDomain = url.parse(loc).hostname; } catch (e) { return Promise.reject('redirect location is invalid'); } From 841735b7877096efe8d8994903a1ceaaec4de02e Mon Sep 17 00:00:00 2001 From: Chi Vinh Le Date: Fri, 26 May 2017 02:55:09 +0700 Subject: [PATCH 39/78] Restore error functionality --- client/coral-admin/src/actions/auth.js | 2 +- .../src/components/CountdownSeconds.js | 2 +- .../src/components/EditableCommentContent.js | 12 +++---- errors.js | 8 ++--- locales/en.yml | 32 +++++++++-------- locales/es.yml | 34 ++++++++++--------- 6 files changed, 47 insertions(+), 43 deletions(-) diff --git a/client/coral-admin/src/actions/auth.js b/client/coral-admin/src/actions/auth.js index 8dbaf7554..29971e294 100644 --- a/client/coral-admin/src/actions/auth.js +++ b/client/coral-admin/src/actions/auth.js @@ -23,7 +23,7 @@ export const handleLogin = (email, password, recaptchaResponse) => (dispatch) => dispatch(checkLoginSuccess(user)); }) .catch((error) => { - if (error.translation_key === 'login_maximum_exceeded') { + if (error.translation_key === 'LOGIN_MAXIMUM_EXCEEDED') { dispatch({ type: actions.LOGIN_MAXIMUM_EXCEEDED, message: error.translation_key diff --git a/client/coral-embed-stream/src/components/CountdownSeconds.js b/client/coral-embed-stream/src/components/CountdownSeconds.js index ce339867f..d350c803b 100644 --- a/client/coral-embed-stream/src/components/CountdownSeconds.js +++ b/client/coral-embed-stream/src/components/CountdownSeconds.js @@ -36,7 +36,7 @@ export class CountdownSeconds extends React.Component { const secRemaining = msRemaining / 1000; const wholeSecRemaining = Math.floor(secRemaining); const plural = secRemaining !== 1; - const units = t(plural ? 'edit_comment.secondsPlural' : 'edit_comment.second'); + const units = t(plural ? 'edit_comment.seconds_plural' : 'edit_comment.second'); let classFromProp; if (typeof classNameForMsRemaining === 'function') { classFromProp = classNameForMsRemaining(msRemaining); diff --git a/client/coral-embed-stream/src/components/EditableCommentContent.js b/client/coral-embed-stream/src/components/EditableCommentContent.js index 1af4a9fa7..6654b0e13 100644 --- a/client/coral-embed-stream/src/components/EditableCommentContent.js +++ b/client/coral-embed-stream/src/components/EditableCommentContent.js @@ -83,9 +83,9 @@ export class EditableCommentContent extends React.Component { if (error.translation_key) { addNotification('error', t(`error.${error.translation_key}`)); } else if (error.networkError) { - addNotification('error', t('error.networkError')); + addNotification('error', t('error.network_error')); } else { - addNotification('error', t('edit_comment.unexpectedError')); + addNotification('error', t('edit_comment.unexpected_error')); throw error; } } @@ -114,7 +114,7 @@ export class EditableCommentContent extends React.Component { return (comment.body !== originalBody) && !editWindowExpired; }} saveComment={this.editComment} - bodyLabel={t('edit_comment.bodyInputLabel')} + bodyLabel={t('edit_comment.body_input_label')} bodyPlaceholder="" submitText={{t('edit_comment.save_button')}} saveButtonCStyle="green" @@ -126,15 +126,15 @@ export class EditableCommentContent extends React.Component { { editWindowExpired ? - {t('edit_comment.editWindowExpired')} + {t('edit_comment.edit_window_expired')} { typeof this.props.stopEditing === 'function' - ?  {t('edit_comment.editWindowExpiredClose')} + ?  {t('edit_comment.edit_window_expired_close')} : null } : - {t('edit_comment.editWindowTimerPrefix')} + {t('edit_comment.edit_window_timer_prefix')} (remainingMs <= 10 * 1000) ? styles.editWindowAlmostOver : '' } diff --git a/errors.js b/errors.js index 4f26c7bd5..c203b1d25 100644 --- a/errors.js +++ b/errors.js @@ -40,7 +40,7 @@ const ErrPasswordTooShort = new APIError('password must be at least 8 characters }); const ErrMissingEmail = new APIError('email is required', { - translation_key: 'email_required', + translation_key: 'EMAIL_REQUIRED', status: 400 }); @@ -50,7 +50,7 @@ const ErrMissingPassword = new APIError('password is required', { }); const ErrEmailTaken = new APIError('Email address already in use', { - translation_key: 'email_in_use', + translation_key: 'EMAIL_IN_USE', status: 400 }); @@ -146,13 +146,13 @@ const ErrInstallLock = new APIError('install lock active', { // ErrPermissionUpdateUsername is returned when the user does not have permission to update their username. const ErrPermissionUpdateUsername = new APIError('You do not have permission to update your username.', { - translation_key: 'edit_username_not_authorized', + translation_key: 'EDIT_USERNAME_NOT_AUTHORIZED', status: 500 }); // ErrLoginAttemptMaximumExceeded is returned when the login maximum is exceeded. const ErrLoginAttemptMaximumExceeded = new APIError('You have made too many incorrect password attempts.', { - translation_key: 'login_maximum_exceeded', + translation_key: 'LOGIN_MAXIMUM_EXCEEDED', status: 429 }); diff --git a/locales/en.yml b/locales/en.yml index bbe4f3b25..a2978e15e 100644 --- a/locales/en.yml +++ b/locales/en.yml @@ -151,38 +151,40 @@ en: no_likes: "There have been no likes in the last 5 minutes. All quiet." done: Done edit_comment: - bodyInputLabel: "Edit this comment" + body_input_label: "Edit this comment" save_button: "Save changes" - editWindowExpired: "You can no longer edit this comment. The time window to do so has expired. Why not post another one?" - editWindowExpiredClose: "Close" - editWindowTimerPrefix: "Edit Window: " + edit_window_expired: "You can no longer edit this comment. The time window to do so has expired. Why not post another one?" + edit_window_expired_close: "Close" + edit_window_timer_prefix: "Edit Window: " second: "second" - secondsPlural: "seconds" - unexpectedError: "Unexpected error while saving changes. Sorry!" + seconds_plural: "seconds" + unexpected_error: "Unexpected error while saving changes. Sorry!" embedlink: copy: "Copy to Clipboard" error: - comment_too_short: "Your comment must have something in it" + COMMENT_TOO_SHORT: "Your comment must have something in it" NOT_AUTHORIZED: "Your username or password is not recognized by our system." NO_SPECIAL_CHARACTERS: "Usernames can contain letters numbers and _ only" PASSWORD_LENGTH: "Password is too short" PROFANITY_ERROR: "Usernames must not contain profanity. Please contact the administrator if you believe this to be in error." USERNAME_IN_USE: "Username already in use" USERNAME_REQUIRED: "Must input a username" - confirm_password: "Passwords don't match. Please check again" - edit_window_ended: "You can no longer edit this comment. The time window to do so has expired." - edit_username_not_authorized: "You do not have permission to update your username." + EDIT_WINDOW_ENDED: "You can no longer edit this comment. The time window to do so has expired." + EDIT_USERNAME_NOT_AUTHORIZED: "You do not have permission to update your username." + EMAIL_IN_USE: "Email address already in use" + EMAIL_REQUIRED: "An email address is required" + LOGIN_MAXIMUM_EXCEEDED: "You have made too many unsuccessful password attempts. Please wait." + PASSWORD_REQUIRED: "Must input a password" + COMMENTING_CLOSED: "Commenting is already closed" + NOT_FOUND: "Resource not found" + INVALID_ASSET_URL: "Assert URL is invalid" email: "Not a valid E-Mail" + confirm_password: "Passwords don't match. Please check again" network_error: "Failed to connect to server. Check your internet connection and try again." - email_in_use: "Email address already in use" email_not_verified: "E-mail address {0} not verified." email_password: "E-mail and/or password combination incorrect." - email_required: "An email address is required" - email_username_in_use: "Email address or username already in use" - login_maximum_exceeded: "You have made too many unsuccessful password attempts. Please wait." organization_name: "Organization name must only contain letters or numbers." password: "Password must be at least 8 characters" - password_required: "Must input a password" username: "Usernames can contain letters numbers and _ only" flag_comment: "Report comment" flag_reason: "Reason for reporting (Optional)" diff --git a/locales/es.yml b/locales/es.yml index e5f236d6b..61f653bf1 100644 --- a/locales/es.yml +++ b/locales/es.yml @@ -185,19 +185,19 @@ es: no_likes: "¡No ha habido ningún 'me gusta' en los últimos 5 minutos. Todo tranquilo." done: Hecho edit_comment: - bodyInputLabel: "Editar este comentario" + body_input_label: "Editar este comentario" save_button: "Guardar cambios" - editWindowExpired: "No se puede editar este comentario. El periodo de edición\ + edit_window_expired: "No se puede editar este comentario. El periodo de edición\ \ ya ha concluido. Podrías publicar uno nuevo :-)" - editWindowExpiredClose: "Cerrar" - editWindowTimerPrefix: "Ventana Edición:" + edit_window_expired_close: "Cerrar" + edit_window_timer_prefix: "Ventana Edición:" second: "segundo" - secondsPlural: "segundos" - unexpectedError: "Lo siento. Ha habido un error no previsto al guardar los cambios." + seconds_plural: "segundos" + unexpected_error: "Lo siento. Ha habido un error no previsto al guardar los cambios." embedlink: copy: "Copiar al portapapeles" error: - comment_too_short: "Tu comentario debe tener algo escrito" + COMMENT_TOO_SHORT: "Tu comentario debe tener algo escrito" NOT_AUTHORIZED: "Acción no autorizada." NO_SPECIAL_CHARACTERS: "Los nombres pueden contener letras números y _" PASSWORD_LENGTH: "Contraseña es muy corta" @@ -205,23 +205,25 @@ es: \ al o la administradora si cree que esto es un error" USERNAME_IN_USE: "Este nombre ya está siendo usado." USERNAME_REQUIRED: "Debe ingresar un nombre" - confirm_password: "Las contraseñas no coinciden. Inténtelo nuevamente" - edit_window_ended: "No puedes editar este comentario. El tiempo de edición ha\ + EDIT_WINDOW_ENDED: "No puedes editar este comentario. El tiempo de edición ha\ \ expirado." - edit_username_not_authorized: "No tiene permiso para editar el nombre de usuario." + EDIT_USERNAME_NOT_AUTHORIZED: "No tiene permiso para editar el nombre de usuario." + EMAIL_IN_USE: "Este correo se encuentra en uso" + EMAIL_REQUIRED: "Se requiere un correo" + LOGIN_MAXIMUM_EXCEEDED: "Ha realizado demasiados intentos fallidos de usar la\ + \ contraseña. Por favor espere." + PASSWORD_REQUIRED: "Debe ingresar la contraseña" + COMMENTING_CLOSED: "Los comentarios ya estan cerrados" + NOT_FOUND: "Recurso no encontrado" + INVALID_ASSET_URL: "La URL del articulo no es valida" email: "No es un correo válido" + confirm_password: "Las contraseñas no coinciden. Inténtelo nuevamente" network_error: "Error al conectar con el servidor. Compruebe su conexión a Internet\ \ y vuelva a intentarlo." - email_in_use: "Este correo se encuentra en uso" email_not_verified: "Correo {0} no confirmado." email_password: "Correo y/o contraseña incorrecta." - email_required: "Se requiere un correo" - email_username_in_use: "Correo o nombre en uso." - login_maximum_exceeded: "Ha realizado demasiados intentos fallidos de usar la\ - \ contraseña. Por favor espere." organization_name: "El nombre de la organización debe contener letras y/o números." password: "La contraseña debe tener por lo menos 8 caracteres" - password_required: "Debe ingresar la contraseña" username: "Los nombres pueden contener letras números y _" flag_comment: "Reportar este comentario" flag_reason: "Razón por la que hacer este reporte (Opcional)" From a39fcee3f8f6b46ce292916d48a1fcdbaa2cd880 Mon Sep 17 00:00:00 2001 From: Chi Vinh Le Date: Fri, 26 May 2017 03:04:06 +0700 Subject: [PATCH 40/78] More error handling fixes --- client/coral-admin/src/components/AdminLogin.js | 2 +- client/coral-admin/src/services/notification.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/client/coral-admin/src/components/AdminLogin.js b/client/coral-admin/src/components/AdminLogin.js index f63a0014d..9deee53f7 100644 --- a/client/coral-admin/src/components/AdminLogin.js +++ b/client/coral-admin/src/components/AdminLogin.js @@ -35,7 +35,7 @@ class AdminLogin extends React.Component { const {errorMessage, loginMaxExceeded, recaptchaPublic} = this.props; const signInForm = (
    - {errorMessage && {t(`errors.${errorMessage}`)}} + {errorMessage && {t(`error.${errorMessage}`)}} { console.error(err); toast( - err.translation_key ? t(`errors.${err.translation_key}`) : err, + err.translation_key ? t(`error.${err.translation_key}`) : err, {type: 'error'} ); }); From 460f3f292b3e89967dd2568b96b4bcc5c4a1f271 Mon Sep 17 00:00:00 2001 From: Belen Curcio Date: Thu, 25 May 2017 17:41:35 -0300 Subject: [PATCH 41/78] =?UTF-8?q?=C3=81dding=20dependencies?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app.js | 4 ++++ package.json | 3 +++ yarn.lock | 40 ++++++++++++++++++++++++++++++++++++---- 3 files changed, 43 insertions(+), 4 deletions(-) diff --git a/app.js b/app.js index 16840f965..d0f0f316b 100644 --- a/app.js +++ b/app.js @@ -11,6 +11,8 @@ const errors = require('./errors'); const {createGraphOptions} = require('./graph'); const apollo = require('graphql-server-express'); const accepts = require('accepts'); +const compression = require('compression'); +const cookieParser = require('cookie-parser'); const app = express(); @@ -31,6 +33,8 @@ app.set('trust proxy', 1); app.use(helmet({ frameguard: false })); +app.use(compression()); +app.use(cookieParser()); app.use(bodyParser.json()); //============================================================================== diff --git a/package.json b/package.json index cbf514cf5..b1eb180ed 100644 --- a/package.json +++ b/package.json @@ -54,10 +54,13 @@ "app-module-path": "^2.2.0", "bcrypt": "^1.0.2", "body-parser": "^1.17.1", + "bowser": "^1.7.0", "cli-table": "^0.3.1", "colors": "^1.1.2", "commander": "^2.9.0", + "compression": "^1.6.2", "connect-redis": "^3.1.0", + "cookie-parser": "^1.4.3", "cross-spawn": "^5.1.0", "csurf": "^1.9.0", "dataloader": "^1.3.0", diff --git a/yarn.lock b/yarn.lock index 3fd71e907..cc1ddd018 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1262,6 +1262,10 @@ boom@2.x.x: dependencies: hoek "2.x.x" +bowser@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/bowser/-/bowser-1.7.0.tgz#169de4018711f994242bff9a8009e77a1f35e003" + brace-expansion@^1.0.0: version "1.1.7" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.7.tgz#3effc3c50e000531fb720eaff80f0ae8ef23cf59" @@ -1395,6 +1399,10 @@ builtin-status-codes@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" +bytes@2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-2.3.0.tgz#d5b680a165b6201739acb611542aabc2d8ceb070" + bytes@2.4.0: version "2.4.0" resolved "https://registry.yarnpkg.com/bytes/-/bytes-2.4.0.tgz#7d97196f9d5baf7f6935e25985549edd2a6c2339" @@ -1815,6 +1823,12 @@ component-emitter@^1.2.0: version "1.2.1" resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" +compressible@~2.0.8: + version "2.0.10" + resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.10.tgz#feda1c7f7617912732b29bf8cf26252a20b9eecd" + dependencies: + mime-db ">= 1.27.0 < 2" + compression-webpack-plugin@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/compression-webpack-plugin/-/compression-webpack-plugin-0.4.0.tgz#811de04215f811ea6a12d4d8aed8457d758f13ac" @@ -1824,6 +1838,17 @@ compression-webpack-plugin@^0.4.0: optionalDependencies: node-zopfli "^2.0.0" +compression@^1.6.2: + version "1.6.2" + resolved "https://registry.yarnpkg.com/compression/-/compression-1.6.2.tgz#cceb121ecc9d09c52d7ad0c3350ea93ddd402bc3" + dependencies: + accepts "~1.3.3" + bytes "2.3.0" + compressible "~2.0.8" + debug "~2.2.0" + on-headers "~1.0.1" + vary "~1.1.0" + concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" @@ -1925,6 +1950,13 @@ convert-source-map@^1.1.0: version "1.5.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.0.tgz#9acd70851c6d5dfdd93d9282e5edf94a03ff46b5" +cookie-parser@^1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/cookie-parser/-/cookie-parser-1.4.3.tgz#0fe31fa19d000b95f4aadf1f53fdc2b8a203baa5" + dependencies: + cookie "0.3.1" + cookie-signature "1.0.6" + cookie-signature@1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" @@ -5147,14 +5179,14 @@ miller-rabin@^4.0.0: bn.js "^4.0.0" brorand "^1.0.1" +"mime-db@>= 1.27.0 < 2", mime-db@~1.27.0: + version "1.27.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.27.0.tgz#820f572296bbd20ec25ed55e5b5de869e5436eb1" + mime-db@~1.12.0: version "1.12.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.12.0.tgz#3d0c63180f458eb10d325aaa37d7c58ae312e9d7" -mime-db@~1.27.0: - version "1.27.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.27.0.tgz#820f572296bbd20ec25ed55e5b5de869e5436eb1" - mime-types@^2.1.10, mime-types@^2.1.12, mime-types@~2.1.11, mime-types@~2.1.15, mime-types@~2.1.7: version "2.1.15" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.15.tgz#a4ebf5064094569237b8cf70046776d09fc92aed" From 178cecad053f2c754470386008cc5ee4ec314933 Mon Sep 17 00:00:00 2001 From: Kim Gardner Date: Thu, 25 May 2017 16:58:35 -0400 Subject: [PATCH 42/78] Update version 1.7.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 84d0fdf52..f40ea4e1e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "talk", - "version": "1.6.0", + "version": "1.7.0", "description": "A better commenting experience from Mozilla, The New York Times, and the Washington Post. https://coralproject.net", "main": "app.js", "scripts": { From 32715d390392ebbdd5736e0f2fa30bda929b111e Mon Sep 17 00:00:00 2001 From: IAmSamHankins Date: Thu, 25 May 2017 17:21:32 -0400 Subject: [PATCH 43/78] initial style updates on comment stream for PT 142803055 ~ copy translations still needed --- client/coral-embed-stream/style/default.css | 6 ++++-- client/coral-plugin-history/Comment.css | 7 +++---- client/coral-ui/components/TextField.css | 1 + 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/client/coral-embed-stream/style/default.css b/client/coral-embed-stream/style/default.css index 42a0d7c85..91b149f7c 100644 --- a/client/coral-embed-stream/style/default.css +++ b/client/coral-embed-stream/style/default.css @@ -170,6 +170,7 @@ hr { display: flex; align-items: center; justify-content: center; + font-weight: 400; } .hidden { @@ -240,6 +241,8 @@ hr { .coral-plugin-commentcontent-text { margin-bottom: 7px; font-size: 16px; + font-weight: 100; + line-height: 1.4; } .coral-plugin-author-name-text { @@ -319,7 +322,6 @@ button.comment__action-button[disabled], .coral-plugin-pubdate-text { display: inline-block; - margin-left: 5px; } .coral-plugin-permalinks-container { @@ -367,7 +369,7 @@ button.comment__action-button[disabled], .coral-plugin-flags-popup-radio-label { margin:5px; - font-weight: 700; + font-weight: 400; font-size: .9rem; } diff --git a/client/coral-plugin-history/Comment.css b/client/coral-plugin-history/Comment.css index bc2134639..4e827cdde 100644 --- a/client/coral-plugin-history/Comment.css +++ b/client/coral-plugin-history/Comment.css @@ -13,10 +13,10 @@ } .assetURL { - font-size: 16px; - color: black; text-decoration: none; font-weight: bold; + font-size: 12px; + color: #2c3e50; } .commentBody { @@ -32,7 +32,7 @@ } li { - margin-bottom: 10px; + margin-bottom: 5px; &:nth-child(1) { color: #5394D7; @@ -46,7 +46,6 @@ i { margin-right: 5px; font-size: 15px; - vertical-align: bottom; } a:hover { diff --git a/client/coral-ui/components/TextField.css b/client/coral-ui/components/TextField.css index 33b1389e7..5682748be 100644 --- a/client/coral-ui/components/TextField.css +++ b/client/coral-ui/components/TextField.css @@ -18,6 +18,7 @@ box-sizing: border-box; border-radius: 2px; margin: 5px auto; + font-size: 14px; } input.error{ From cbf7cc67f4100ba123eacf7035808da9315079bd Mon Sep 17 00:00:00 2001 From: Belen Curcio Date: Thu, 25 May 2017 18:30:01 -0300 Subject: [PATCH 44/78] Extracting token from cookie if safari --- client/coral-framework/actions/auth.js | 10 ++++---- routes/api/auth/index.js | 2 +- services/passport.js | 32 +++++++++++++++++++++++++- 3 files changed, 37 insertions(+), 7 deletions(-) diff --git a/client/coral-framework/actions/auth.js b/client/coral-framework/actions/auth.js index 2f0a2dc0f..f0827ca73 100644 --- a/client/coral-framework/actions/auth.js +++ b/client/coral-framework/actions/auth.js @@ -112,10 +112,8 @@ const signInFailure = (error) => ({ //============================================================================== export const handleAuthToken = (token) => (dispatch) => { - if (!browser || browser.name !== 'Safari') { - Storage.setItem('exp', jwtDecode(token).exp); - Storage.setItem('token', token); - } + Storage.setItem('exp', jwtDecode(token).exp); + Storage.setItem('token', token); dispatch({type: 'HANDLE_AUTH_TOKEN'}); }; @@ -129,7 +127,9 @@ export const fetchSignIn = (formData) => { return coralApi('/auth/local', {method: 'POST', body: formData}) .then(({token}) => { - dispatch(handleAuthToken(token)); + if (!browser || browser.name !== 'Safari') { + dispatch(handleAuthToken(token)); + } dispatch(hideSignInDialog()); }) .catch((error) => { diff --git a/routes/api/auth/index.js b/routes/api/auth/index.js index e0e39adf9..c5c2e3dfb 100644 --- a/routes/api/auth/index.js +++ b/routes/api/auth/index.js @@ -8,7 +8,7 @@ const router = express.Router(); * This returns the user if they are logged in. */ router.get('/', (req, res, next) => { - + console.log('is there req user>', req.user); if (req.user) { return next(); } diff --git a/services/passport.js b/services/passport.js index 4b1c10158..07a98f789 100644 --- a/services/passport.js +++ b/services/passport.js @@ -174,7 +174,37 @@ const ExtractJwt = require('passport-jwt').ExtractJwt; passport.use(new JwtStrategy({ // Prepare the extractor from the header. - jwtFromRequest: ExtractJwt.fromAuthHeaderWithScheme('Bearer'), + jwtFromRequest: (req, res) => { + + const browser = bowser._detect(req.headers['user-agent']); + + if (browser.name === 'Safari') { + const lookup = (i) => { + switch (i) { + case 0: return 'header'; + case 1: return 'cookie'; + case 2: return 'query'; + } + } + + // Adding custom extractor + const authorizations = [ + req.headers.authorization, + req.cookies.authorization, + req.query.authorization + ]; + + let i = authorizations.findIndex((source) => source !== null && typeof source != 'undefined' && source.length > 0); + + if (i >= 0) { + let authorization = authorizations[i]; + let source = lookup(i); + return authorization; + } + } else { + return ExtractJwt.fromAuthHeaderWithScheme('Bearer')(req) + } +}, // Use the secret passed in which is loaded from the environment. This can be // a certificate (loaded) or a HMAC key. From 8171cb53e1301027dfd5d959e4ad13dd486ad3a9 Mon Sep 17 00:00:00 2001 From: Belen Curcio Date: Thu, 25 May 2017 20:04:32 -0300 Subject: [PATCH 45/78] =?UTF-8?q?=C3=81dding=20another=20extractor?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- client/coral-framework/helpers/response.js | 4 +- client/coral-framework/services/transport.js | 7 ++- routes/api/auth/index.js | 34 +-------------- services/passport.js | 46 +++++++------------- 4 files changed, 25 insertions(+), 66 deletions(-) diff --git a/client/coral-framework/helpers/response.js b/client/coral-framework/helpers/response.js index ce9de6942..b3e167d16 100644 --- a/client/coral-framework/helpers/response.js +++ b/client/coral-framework/helpers/response.js @@ -1,4 +1,4 @@ -import browser from 'detect-browser'; +import browser from 'bowser'; const buildOptions = (inputOptions = {}) => { const defaultOptions = { @@ -15,7 +15,7 @@ const buildOptions = (inputOptions = {}) => { ...inputOptions }; - if (!browser || browser.name !== 'safari') { + if (!browser || browser.name !== 'Safari') { let authorization = localStorage.getItem('token'); if (authorization) { diff --git a/client/coral-framework/services/transport.js b/client/coral-framework/services/transport.js index e421ca3da..8aa33e2f4 100644 --- a/client/coral-framework/services/transport.js +++ b/client/coral-framework/services/transport.js @@ -1,5 +1,6 @@ import {createNetworkInterface} from 'apollo-client'; import * as Storage from '../helpers/storage'; +import browser from 'bowser'; //============================================================================== // NETWORK INTERFACE @@ -21,7 +22,11 @@ networkInterface.use([{ if (!req.options.headers) { req.options.headers = {}; // Create the header object if needed. } - req.options.headers['authorization'] = `Bearer ${Storage.getItem('token')}`; + + if (!browser || browser.name !== 'Safari') { + req.options.headers['authorization'] = `Bearer ${Storage.getItem('token')}`; + } + next(); } }]); diff --git a/routes/api/auth/index.js b/routes/api/auth/index.js index c5c2e3dfb..05fb8b5e4 100644 --- a/routes/api/auth/index.js +++ b/routes/api/auth/index.js @@ -8,7 +8,8 @@ const router = express.Router(); * This returns the user if they are logged in. */ router.get('/', (req, res, next) => { - console.log('is there req user>', req.user); + console.log('REQ.USER', req.user); + if (req.user) { return next(); } @@ -16,37 +17,6 @@ router.get('/', (req, res, next) => { res.status(204).end(); }, (req, res) => { - // If the user is Safari, let's send a cookie - const browser = bowser._detect(req.headers['user-agent']); - - if (browser.name === 'Safari') { - - const lookup = (i) => { - switch (i) { - case 0: return 'header'; - case 1: return 'cookie'; - case 2: return 'query'; - } - }; - - const authorizations = [ - req.headers.authorization, - req.cookies ? req.cookies.authorization : [], - req.query.authorization - ]; - - res.set('Cache-Control', 'no-cache, no-store, must-revalidate'); - - let i = authorizations.findIndex((source) => source !== null && typeof source != 'undefined' && source.length > 0); - if (i >= 0) { - let authorization = authorizations[i]; - let source = lookup(i); - - // Send back the user object. - res.json({authorization, source, user: req.user}); - } - } - // Send back the user object. res.json({user: req.user}); }); diff --git a/services/passport.js b/services/passport.js index 07a98f789..d67407b3c 100644 --- a/services/passport.js +++ b/services/passport.js @@ -170,41 +170,24 @@ const CheckBlacklisted = (jwt) => new Promise((resolve, reject) => { const JwtStrategy = require('passport-jwt').Strategy; const ExtractJwt = require('passport-jwt').ExtractJwt; +let cookieExtractor = function(req) { + let token = null; + + if (req && req.cookies) { + token = req.cookies['authorization']; + } + + return token; +}; + // Extract the JWT from the 'Authorization' header with the 'Bearer' scheme. passport.use(new JwtStrategy({ // Prepare the extractor from the header. - jwtFromRequest: (req, res) => { - - const browser = bowser._detect(req.headers['user-agent']); - - if (browser.name === 'Safari') { - const lookup = (i) => { - switch (i) { - case 0: return 'header'; - case 1: return 'cookie'; - case 2: return 'query'; - } - } - - // Adding custom extractor - const authorizations = [ - req.headers.authorization, - req.cookies.authorization, - req.query.authorization - ]; - - let i = authorizations.findIndex((source) => source !== null && typeof source != 'undefined' && source.length > 0); - - if (i >= 0) { - let authorization = authorizations[i]; - let source = lookup(i); - return authorization; - } - } else { - return ExtractJwt.fromAuthHeaderWithScheme('Bearer')(req) - } -}, + jwtFromRequest: ExtractJwt.fromExtractors([ + cookieExtractor, + ExtractJwt.fromAuthHeaderWithScheme('Bearer') + ]), // Use the secret passed in which is loaded from the environment. This can be // a certificate (loaded) or a HMAC key. @@ -227,6 +210,7 @@ passport.use(new JwtStrategy({ // Load the user from the environment, because we just got a user from the // header. try { + console.log(req.cookies, req.headers) // Check to see if the token has been revoked await CheckBlacklisted(jwt); From 8edc16ed8507a5b2625c2d685f8d8fa28cd2ed32 Mon Sep 17 00:00:00 2001 From: Belen Curcio Date: Thu, 25 May 2017 20:06:49 -0300 Subject: [PATCH 46/78] Removing logs --- routes/api/auth/index.js | 1 - services/passport.js | 1 - 2 files changed, 2 deletions(-) diff --git a/routes/api/auth/index.js b/routes/api/auth/index.js index 05fb8b5e4..9035ce268 100644 --- a/routes/api/auth/index.js +++ b/routes/api/auth/index.js @@ -8,7 +8,6 @@ const router = express.Router(); * This returns the user if they are logged in. */ router.get('/', (req, res, next) => { - console.log('REQ.USER', req.user); if (req.user) { return next(); diff --git a/services/passport.js b/services/passport.js index d67407b3c..719086f89 100644 --- a/services/passport.js +++ b/services/passport.js @@ -210,7 +210,6 @@ passport.use(new JwtStrategy({ // Load the user from the environment, because we just got a user from the // header. try { - console.log(req.cookies, req.headers) // Check to see if the token has been revoked await CheckBlacklisted(jwt); From 276e58060aee26f6213b52c7c99abe34030ddb89 Mon Sep 17 00:00:00 2001 From: Chi Vinh Le Date: Fri, 26 May 2017 17:11:29 +0700 Subject: [PATCH 47/78] Fix change username dialog --- .../coral-plugin-auth/client/components/ChangeUsername.js | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/plugins/coral-plugin-auth/client/components/ChangeUsername.js b/plugins/coral-plugin-auth/client/components/ChangeUsername.js index 9b0cbb1a6..5b5a54510 100644 --- a/plugins/coral-plugin-auth/client/components/ChangeUsername.js +++ b/plugins/coral-plugin-auth/client/components/ChangeUsername.js @@ -23,7 +23,7 @@ class ChangeUsernameContainer extends React.Component { this.state = { formData: { - username: props.user.username + username: (props.auth.user && props.auth.user.username) || '' }, errors: {}, showErrors: false @@ -84,7 +84,7 @@ class ChangeUsernameContainer extends React.Component { const {validForm, invalidForm} = this.props; this.displayErrors(); if (this.isCompleted() && !Object.keys(errors).length) { - this.props.createUsername(this.props.user.id, this.state.formData); + this.props.createUsername(this.props.auth.user.id, this.state.formData); validForm(); } else { invalidForm(lang.t('createdisplay.checkTheForm')); @@ -113,7 +113,9 @@ class ChangeUsernameContainer extends React.Component { } } -const mapStateToProps = ({auth, user}) => ({auth, user}); +const mapStateToProps = ({auth}) => ({ + auth: auth.toJS() +}); const mapDispatchToProps = dispatch => bindActionCreators( From bab47c9d444c450a98ab8d5ab6a77ee941453721 Mon Sep 17 00:00:00 2001 From: Chi Vinh Le Date: Fri, 26 May 2017 20:33:43 +0700 Subject: [PATCH 48/78] Separate store --- client/coral-embed-stream/src/index.js | 6 ++---- client/coral-framework/actions/auth.js | 11 ++++++----- .../client/components/ChangeUsername.js | 2 +- routes/api/auth/index.js | 1 - 4 files changed, 9 insertions(+), 11 deletions(-) diff --git a/client/coral-embed-stream/src/index.js b/client/coral-embed-stream/src/index.js index 0306079f3..66ed9ad56 100644 --- a/client/coral-embed-stream/src/index.js +++ b/client/coral-embed-stream/src/index.js @@ -8,16 +8,14 @@ import './graphql'; import {addExternalConfig} from 'coral-embed-stream/src/actions/config'; import reducers from './reducers'; -import localStore, {injectReducers} from 'coral-framework/services/store'; +import store, {injectReducers} from 'coral-framework/services/store'; import AppRouter from './AppRouter'; import {pym} from 'coral-framework'; injectReducers(reducers); -const store = (window.opener && window.opener.coralStore) ? window.opener.coralStore : localStore; - // Don't run this in the popup. -if (store === localStore) { +if (!window.opener) { store.dispatch(checkLogin()); pym.sendMessage('getConfig'); diff --git a/client/coral-framework/actions/auth.js b/client/coral-framework/actions/auth.js index f0827ca73..c4d6d782e 100644 --- a/client/coral-framework/actions/auth.js +++ b/client/coral-framework/actions/auth.js @@ -192,7 +192,7 @@ export const fetchSignUpFacebook = () => (dispatch) => { ); }; -export const facebookCallback = (err, data) => (dispatch, getState) => { +export const facebookCallback = (err, data) => (dispatch) => { if (err) { dispatch(signInFacebookFailure(err)); return; @@ -201,10 +201,6 @@ export const facebookCallback = (err, data) => (dispatch, getState) => { dispatch(handleAuthToken(data.token)); dispatch(signInFacebookSuccess(data.user)); dispatch(hideSignInDialog()); - const {user: {canEditName, status}} = getState().auth.toJS(); - if (canEditName && status !== 'BANNED') { - dispatch(showCreateUsernameDialog()); - } } catch (err) { dispatch(signInFacebookFailure(err)); return; @@ -306,6 +302,11 @@ export const checkLogin = () => (dispatch) => { } dispatch(checkLoginSuccess(result.user)); + + // Display create username dialog if necessary. + if (result.user.canEditName && result.user.status !== 'BANNED') { + dispatch(showCreateUsernameDialog()); + } }) .catch((error) => { console.error(error); diff --git a/plugins/coral-plugin-auth/client/components/ChangeUsername.js b/plugins/coral-plugin-auth/client/components/ChangeUsername.js index 5b5a54510..761fe786d 100644 --- a/plugins/coral-plugin-auth/client/components/ChangeUsername.js +++ b/plugins/coral-plugin-auth/client/components/ChangeUsername.js @@ -100,7 +100,7 @@ class ChangeUsernameContainer extends React.Component { return (
    Date: Fri, 26 May 2017 20:48:24 +0700 Subject: [PATCH 49/78] Detect mobile safari & desktop safari --- client/coral-admin/src/actions/auth.js | 6 +++--- client/coral-framework/actions/auth.js | 8 ++++---- client/coral-framework/helpers/response.js | 4 ++-- client/coral-framework/services/transport.js | 4 ++-- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/client/coral-admin/src/actions/auth.js b/client/coral-admin/src/actions/auth.js index 16b6c774a..69e7d4303 100644 --- a/client/coral-admin/src/actions/auth.js +++ b/client/coral-admin/src/actions/auth.js @@ -1,4 +1,4 @@ -import browser from 'bowser'; +import bowser from 'bowser'; import * as actions from '../constants/auth'; import coralApi from 'coral-framework/helpers/response'; import * as Storage from 'coral-framework/helpers/storage'; @@ -29,7 +29,7 @@ export const handleLogin = (email, password, recaptchaResponse) => (dispatch) => .then(({user, token}) => { if (!user) { - if (!browser || browser.name !== 'Safari') { + if (!bowser.safari && !bowser.ios) { Storage.removeItem('token'); } return dispatch(checkLoginFailure('not logged in')); @@ -97,7 +97,7 @@ export const checkLogin = () => (dispatch) => { return coralApi('/auth') .then(({user}) => { if (!user) { - if (!browser || browser.name !== 'Safari') { + if (!bowser.safari && !bowser.ios) { Storage.removeItem('token'); } return dispatch(checkLoginFailure('not logged in')); diff --git a/client/coral-framework/actions/auth.js b/client/coral-framework/actions/auth.js index c4d6d782e..2deda5f1d 100644 --- a/client/coral-framework/actions/auth.js +++ b/client/coral-framework/actions/auth.js @@ -1,6 +1,6 @@ import jwtDecode from 'jwt-decode'; import {pym} from 'coral-framework'; -import browser from 'bowser'; +import bowser from 'bowser'; import * as actions from '../constants/auth'; import * as Storage from '../helpers/storage'; import coralApi, {base} from '../helpers/response'; @@ -127,7 +127,7 @@ export const fetchSignIn = (formData) => { return coralApi('/auth/local', {method: 'POST', body: formData}) .then(({token}) => { - if (!browser || browser.name !== 'Safari') { + if (!bowser.safari && !bowser.ios) { dispatch(handleAuthToken(token)); } dispatch(hideSignInDialog()); @@ -270,7 +270,7 @@ export const fetchForgotPassword = (email) => (dispatch) => { export const logout = () => (dispatch) => { return coralApi('/auth', {method: 'DELETE'}).then(() => { - if (!browser || browser.name !== 'Safari') { + if (!bowser.safari && !bowser.ios) { Storage.removeItem('token'); } dispatch({type: actions.LOGOUT}); @@ -295,7 +295,7 @@ export const checkLogin = () => (dispatch) => { coralApi('/auth') .then((result) => { if (!result.user) { - if (!browser || browser.name !== 'Safari') { + if (!bowser.safari && !bowser.ios) { Storage.removeItem('token'); } throw new Error('Not logged in'); diff --git a/client/coral-framework/helpers/response.js b/client/coral-framework/helpers/response.js index b3e167d16..ac6e53cf9 100644 --- a/client/coral-framework/helpers/response.js +++ b/client/coral-framework/helpers/response.js @@ -1,4 +1,4 @@ -import browser from 'bowser'; +import bowser from 'bowser'; const buildOptions = (inputOptions = {}) => { const defaultOptions = { @@ -15,7 +15,7 @@ const buildOptions = (inputOptions = {}) => { ...inputOptions }; - if (!browser || browser.name !== 'Safari') { + if (!bowser.safari && !bowser.ios) { let authorization = localStorage.getItem('token'); if (authorization) { diff --git a/client/coral-framework/services/transport.js b/client/coral-framework/services/transport.js index 8aa33e2f4..0c430a021 100644 --- a/client/coral-framework/services/transport.js +++ b/client/coral-framework/services/transport.js @@ -1,6 +1,6 @@ import {createNetworkInterface} from 'apollo-client'; import * as Storage from '../helpers/storage'; -import browser from 'bowser'; +import bowser from 'bowser'; //============================================================================== // NETWORK INTERFACE @@ -23,7 +23,7 @@ networkInterface.use([{ req.options.headers = {}; // Create the header object if needed. } - if (!browser || browser.name !== 'Safari') { + if (!bowser.safari && !bowser.ios) { req.options.headers['authorization'] = `Bearer ${Storage.getItem('token')}`; } From 6a9f216c0f98dd404e744d8c75e6ed6f5390acd8 Mon Sep 17 00:00:00 2001 From: Chi Vinh Le Date: Fri, 26 May 2017 20:58:48 +0700 Subject: [PATCH 50/78] Detect mobile & desktop safari server side --- services/passport.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/passport.js b/services/passport.js index 719086f89..f3eb0da83 100644 --- a/services/passport.js +++ b/services/passport.js @@ -51,7 +51,7 @@ const HandleGenerateCredentials = (req, res, next) => (err, user) => { // If the user is Safari, let's send a cookie const browser = bowser._detect(req.headers['user-agent']); - if (browser.name === 'Safari') { + if (browser.ios || browser.safari) { res.cookie('authorization', token, { httpOnly: true, expires: new Date(Date.now() + 900000) From d4569b5f518d5e029cd1f0ffdc4f3d40bed58303 Mon Sep 17 00:00:00 2001 From: Chi Vinh Le Date: Fri, 26 May 2017 21:37:11 +0700 Subject: [PATCH 51/78] Set cookie for facebook login on safari --- services/passport.js | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/services/passport.js b/services/passport.js index f3eb0da83..4f5a8fb8d 100644 --- a/services/passport.js +++ b/services/passport.js @@ -33,6 +33,17 @@ const GenerateToken = (user) => JWT.sign({}, JWT_SECRET, { audience: JWT_AUDIENCE }); +// SetTokenForSafari sends the token in a cookie for Safari clients. +const SetTokenForSafari = (req, res, token) => { + const browser = bowser._detect(req.headers['user-agent']); + if (browser.ios || browser.safari) { + res.cookie('authorization', token, { + httpOnly: true, + expires: new Date(Date.now() + 900000) + }); + } +}; + // HandleGenerateCredentials validates that an authentication scheme did indeed // return a user, if it did, then sign and return the user and token to be used // by the frontend to display and update the UI. @@ -48,15 +59,7 @@ const HandleGenerateCredentials = (req, res, next) => (err, user) => { // Generate the token to re-issue to the frontend. const token = GenerateToken(user); - // If the user is Safari, let's send a cookie - const browser = bowser._detect(req.headers['user-agent']); - - if (browser.ios || browser.safari) { - res.cookie('authorization', token, { - httpOnly: true, - expires: new Date(Date.now() + 900000) - }); - } + SetTokenForSafari(req, res, token); // Send back the details! res.json({user, token}); @@ -77,6 +80,8 @@ const HandleAuthPopupCallback = (req, res, next) => (err, user) => { // Generate the token to re-issue to the frontend. const token = GenerateToken(user); + SetTokenForSafari(req, res, token); + // We logged in the user! Let's send back the user data. res.render('auth-callback', {auth: JSON.stringify({err: null, data: {user, token}})}); }; From 7b6b46f3e5551433683ec972832d8f438dafb07b Mon Sep 17 00:00:00 2001 From: Chi Vinh Le Date: Fri, 26 May 2017 21:38:29 +0700 Subject: [PATCH 52/78] Sync username with store --- .../client/components/ChangeUsername.js | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/plugins/coral-plugin-auth/client/components/ChangeUsername.js b/plugins/coral-plugin-auth/client/components/ChangeUsername.js index 761fe786d..cbb7adba5 100644 --- a/plugins/coral-plugin-auth/client/components/ChangeUsername.js +++ b/plugins/coral-plugin-auth/client/components/ChangeUsername.js @@ -30,6 +30,16 @@ class ChangeUsernameContainer extends React.Component { }; } + componentWillReceiveProps(next) { + if (!this.props.auth.showCreateUsernameDialog && next.auth.showCreateUsernameDialog) { + this.setState({ + formData: { + username: (this.props.auth.user && this.props.auth.user.username) || '', + }, + }); + } + } + handleChange = e => { const {name, value} = e.target; this.setState( From ce46329e27a7d78bbf894bb773217e71feb0c175 Mon Sep 17 00:00:00 2001 From: David Erwin Date: Fri, 26 May 2017 11:07:10 -0400 Subject: [PATCH 53/78] Create FAQ page --- docs/_data/sidebars/talk_sidebar.yml | 3 ++ docs/faq.md | 69 ++++++++++++++++++++++++++++ 2 files changed, 72 insertions(+) create mode 100644 docs/faq.md diff --git a/docs/_data/sidebars/talk_sidebar.yml b/docs/_data/sidebars/talk_sidebar.yml index 827ed6177..888ce94bf 100644 --- a/docs/_data/sidebars/talk_sidebar.yml +++ b/docs/_data/sidebars/talk_sidebar.yml @@ -11,6 +11,9 @@ entries: - title: About url: /index.html output: web + - title: FAQ + url: /faq.html + output: web - title: Installation output: web diff --git a/docs/faq.md b/docs/faq.md new file mode 100644 index 000000000..3182c3c1c --- /dev/null +++ b/docs/faq.md @@ -0,0 +1,69 @@ +--- +title: Frequently Asked Questions +sidebar: talk_sidebar +permalink: faq.html +summary: +--- + +### How are new stories/assets added to Talk? Is there an API? + +There are three ways that new assets can make their way into Talk: _just in time_, _active_ and manual. + +#### Just in Time asset creation + +Talk ships with a _just in time_ mechanism that works out of the box without integration with any CMS or manual work needed. + +The _just in time_ flow looks like this: + +* Request comes in for a stream on an asset that doesn't yet exist. +* Talk screens the domain against the domain whitelist, fails if doesn't pass. +* Then, concurrently + * Talk creates a new asset record and returns the stream data (which will be empty) + * Schedules a job to scrape the new page and fill in asset information. + +The scraping mechanism utilizes [metascraper](https://www.npmjs.com/package/metascraper) and is queued using the [Que](https://www.npmjs.com/package/kue). If your Talk deployments is configured to run separate job worker cluster, scraping will be performed by them. + +#### Active (or push based) asset creation + +If tighter CMS integration is required to push custom data into assets and/or keep data in sync as changes are made in a CMS an _active_ push based workflow must be implemented. + +This is an ideal candidate for a plugin. If you are interested in working on it, please [contact us](https://coralproject.net/contact.html)! + +#### Manual asset creation + +Sometimes you want to load a lot of assets into the database. The most common use case for this is populating the database during an initial installation. We recommend writing a script that transforms the data from it's source and inserts it into the _assets_ collection. + +For current schema information, please see the [asset model](https://github.com/coralproject/talk/blob/master/models/asset.js). + +### Where are your http API docs? + +Coral relies on GraphQL for the vast majority of it's client <-> server communication. All core queries, mutations and subscriptions are defined along with types and comments in our central [TypeDef](https://github.com/coralproject/talk/blob/master/graph/typeDefs.graphql). For plugin graph api typedefs, see each plugin's `/server/` directory. + +In addition, Talk Server ships with [GraphiQL](https://github.com/graphql/graphiql). GraphiQL provides a full data layer IDE including interactive documentation. The autocompletes and documentation are populated from introspection meaning that Core _and plugin_ apis will be fully explorable. + +To access GraphiQL: + +* [Install Talk](install-source.html). +* Open http://localhost:3000/api/v1/graph/iql in your browser. (Note, your server an port may differ.) + +### Where is documentation for a specific component? + +We strive for clear inline documentation across our codebase, but have gaps. Contributions to documentation would be greatly appreciated and is a great way to start contributing to the project! + +If you are considering changing a core component (aka, one that is not in a plugin), you are entering the realm of a core developer. We strongly ask that you reach out the coral team before forking and changing core code. We are glad to help talk through your product need and come up with a strategy for implementing as a plugin, or working with you to extend the plugin API for your use case. + +### How do I contribue to these docs? + +Contributions to the docs are much appreciated and a great way to get involved in the project. + +Fork the Talk repo, clone it locally (no need to go through the install from source process), then: + +``` +cd docs +docker build --no-cache -t mydocs . +docker run -v "$PWD:/src" -p 4000:4000 mydocs serve -H 0.0.0.0 +``` + +You can edit the files in docs with any editor and view the live updates in a browser by hitting `http://localhost:4000`. + +Once you've made the changes, file a PR back to the `coralproject/talk` repo. From deea24d0c5ca0a2c07f0ea4d9664f184ad38a425 Mon Sep 17 00:00:00 2001 From: David Erwin Date: Fri, 26 May 2017 11:12:16 -0400 Subject: [PATCH 54/78] Add docs to .eslintignore --- .eslintignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.eslintignore b/.eslintignore index fc0d50a25..e106646a4 100644 --- a/.eslintignore +++ b/.eslintignore @@ -1,4 +1,5 @@ dist +docs client/lib **/*.html plugins/* From 1dbecab13e6d3d57916b855825545ffaf86bf05f Mon Sep 17 00:00:00 2001 From: David Erwin Date: Fri, 26 May 2017 11:27:10 -0400 Subject: [PATCH 55/78] Add swagger user docs and tools page --- docs/_data/sidebars/talk_sidebar.yml | 3 + {docs-tmp => docs}/swagger.yaml | 496 --------------------------- docs/tools.md | 36 ++ 3 files changed, 39 insertions(+), 496 deletions(-) rename {docs-tmp => docs}/swagger.yaml (52%) create mode 100644 docs/tools.md diff --git a/docs/_data/sidebars/talk_sidebar.yml b/docs/_data/sidebars/talk_sidebar.yml index 888ce94bf..6429aaf93 100644 --- a/docs/_data/sidebars/talk_sidebar.yml +++ b/docs/_data/sidebars/talk_sidebar.yml @@ -14,6 +14,9 @@ entries: - title: FAQ url: /faq.html output: web + - title: Tools + url: /tools.html + output: web - title: Installation output: web diff --git a/docs-tmp/swagger.yaml b/docs/swagger.yaml similarity index 52% rename from docs-tmp/swagger.yaml rename to docs/swagger.yaml index 10e8f34f6..733018af7 100644 --- a/docs-tmp/swagger.yaml +++ b/docs/swagger.yaml @@ -13,502 +13,6 @@ produces: - application/json paths: - /comments: - get: - tags: - - Comments - parameters: - - name: action_type - in: query - description: Performs a search based on the actions that have been added to it. - type: string - enum: - - rejected - - accepted - - new - responses: - 200: - description: Comments matching the query. - schema: - type: array - items: - $ref: '#/definitions/Comment' - 500: - description: An error occured. - schema: - $ref: '#/definitions/Error' - post: - tags: - - Comments - parameters: - - name: body - in: body - required: true - schema: - type: object - properties: - body: - type: string - description: The text of the comment to create. - asset_id: - type: string - description: The parent asset of this comment. - parent_id: - type: string - description: The parent comment of this comment (null if the comment is not a reply.) - responses: - 201: - description: The comment that was created. - schema: - $ref: '#/definitions/Comment' - 500: - description: An error occured. - schema: - $ref: '#/definitions/Error' - - /comments/{comment_id}: - get: - tags: - - Comments - parameters: - - name: comment_id - in: path - description: The id of the comment to retrieve. - type: string - required: true - responses: - 200: - description: The comment was found. - schema: - $ref: '#/definitions/Comment' - 404: - description: The comment was not found. - 500: - description: An error occured. - schema: - $ref: '#/definitions/Error' - delete: - tags: - - Comments - parameters: - - name: comment_id - in: path - description: The id of the comment to delete. - type: string - required: true - responses: - 204: - description: The comment was deleted. - 500: - description: An error occured. - schema: - $ref: '#/definitions/Error' - - /comments/{comment_id}/status: - put: - tags: - - Comments - - Moderation - parameters: - - name: comment_id - in: path - description: The id of the comment to retrieve. - type: string - format: uuid - required: true - - name: body - in: body - description: The status to update to. - required: true - schema: - type: object - properties: - status: - type: string - description: The status to update to. - enum: - - new - - flagged - - accepted - - rejected - responses: - 204: - description: The comment status was updated. - 500: - description: An error occured. - schema: - $ref: '#/definitions/Error' - /comments/{item_id}/actions: - post: - tags: - - Comments - - Actions - parameters: - - name: item_id - in: path - description: The id of the item which is the target of the action. - type: string - required: true - - name: body - in: body - description: The action to add. - required: true - schema: - type: object - properties: - action_type: - type: string - description: The type of action to add - enum: - - like - - flag - metadata: - type: object - description: An arbitrary object describing the action, should be consistent per action type. - responses: - 201: - description: The action created. - schema: - $ref: '#/definitions/Action' - 500: - description: An error occured. - schema: - $ref: '#/definitions/Error' - /actions/{action_id}: - delete: - tags: - - Actions - parameters: - - name: action_id - in: path - description: The id of the action to delete. - type: string - required: true - responses: - 204: - description: The action was deleted. - 500: - description: An error occured. - schema: - $ref: '#/definitions/Error' - /auth: - get: - tags: - - Auth - description: Retrieves the current authentication credentials. - responses: - 200: - description: The current user. - schema: - $ref: '#/definitions/User' - 500: - description: An error occured. - schema: - $ref: '#/definitions/Error' - delete: - tags: - - Auth - description: Logs out the current authenticated user. - responses: - 204: - description: The current user has been logged out. - 500: - description: An error occured. - schema: - $ref: '#/definitions/Error' - /auth/local: - post: - tags: - - Auth - parameters: - - name: body - in: body - required: true - description: The login credentials. - schema: - type: object - properties: - email: - type: string - description: The email address of the current user. - password: - type: string - description: The password of the current user. - responses: - 200: - description: The user has authenticated sucesfully. - schema: - $ref: '#/definitions/User' - 401: - description: The authentication error. - schema: - $ref: '#/definitions/Error' - 500: - description: An error occured. - schema: - $ref: '#/definitions/Error' - /auth/facebook: - get: - tags: - - Auth - responses: - 302: - description: Redirects the user to perform external facebook authentication. - 500: - description: An error occured. - schema: - $ref: '#/definitions/Error' - /auth/facebook/callback: - get: - tags: - - Auth - responses: - 200: - description: Logs in the user after FB Auth. - schema: - $ref: '#/definitions/User' - 500: - description: An error occured. - schema: - $ref: '#/definitions/Error' - /queue/comments/pending: - get: - tags: - - Comments - - Moderation - responses: - 200: - description: The comments that are not moderated. - schema: - type: object - properties: - comments: - type: array - description: The comments that have yet to be moderated. - items: - $ref: '#/definitions/Comment' - users: - type: array - description: The users authoring these comments. - items: - $ref: '#/definitions/User' - actions: - type: array - description: The actions which have taken place on these comments. - items: - $ref: '#/definitions/Actions' - 500: - description: An error occured. - schema: - $ref: '#/definitions/Error' - /assets: - get: - parameters: - - name: limit - in: query - type: number - format: int32 - description: Limit the listing results - - name: skip - in: query - type: number - format: int32 - description: Skip the listing results - - name: sort - in: query - enum: - - asc - - desc - type: string - description: Sorting method - - name: field - in: query - type: string - description: Field to sort by. - - name: filter - in: query - type: string - enum: - - open - - closed - description: Comment status to filter by. - - name: search - in: query - type: string - description: String to search by. - responses: - 200: - description: Assets listed. - schema: - type: object - properties: - count: - type: number - description: Total number of assets found. - result: - type: array - items: - $ref: '#/definitions/Asset' - - /assets/{asset_id}: - get: - parameters: - - name: asset_id - in: path - required: true - type: string - format: uuid - responses: - 200: - description: The requested asset. - schema: - $ref: '#/definitions/Asset' - 404: - description: The asset was not found. - 500: - description: An error occured. - schema: - $ref: '#/definitions/Error' - - - /assets/{asset_id}/scrape: - post: - parameters: - - name: asset_id - in: path - required: true - type: string - format: uuid - responses: - 201: - description: The job that was created. - schema: - $ref: '#/definitions/Job' - 404: - description: The asset was not found. - 500: - description: An error occured. - schema: - $ref: '#/definitions/Error' - - /assets/{asset_id}/settings: - put: - parameters: - - name: asset_id - in: path - required: true - type: string - format: uuid - - name: body - in: body - required: true - schema: - $ref: '#/definitions/Settings' - responses: - 204: - description: The asset settings were updated. - 404: - description: The asset was not found. - 500: - description: An error occured. - schema: - $ref: '#/definitions/Error' - - /assets/{asset_id}/status: - put: - parameters: - - name: asset_id - required: true - in: path - type: string - format: uuid - description: The id of the asset to be updated - - name: body - in: body - required: true - schema: - type: object - properties: - closedAt: - type: number - description: The Unix timestamp when the stream will be or was previously closed. - closedMessage: - type: string - description: The message to display to users when the stream is closed. - responses: - 204: - description: Status update successful. - 500: - description: An error has occurred. - schema: - $ref: '#/definitions/Error' - /stream: - get: - tags: - - Actions - - Assets - - Comments - - Users - parameters: - - name: asset_url - in: query - description: The url of the asset for which to get the comment stream. - type: string - format: url - responses: - 200: - description: The comment stream. - schema: - type: object - properties: - asset: - $ref: '#/definitions/Asset' - comments: - type: array - description: All comments for this asset. - items: - $ref: '#/definitions/Comment' - users: - type: array - description: All authors of comments on this asset. - items: - $ref: '#/definitions/User' - actions: - type: array - description: All actions on comments on this asset and their authors. - items: - $ref: '#/definitions/Actions' - 500: - description: An error occured. - schema: - $ref: '#/definitions/Error' - /settings: - get: - responses: - 200: - description: All global settings. - schema: - $ref: '#/definitions/Settings' - 500: - description: An error occured. - schema: - $ref: '#/definitions/Error' - put: - parameters: - - name: body - in: body - required: true - description: Settings to be updated. - schema: - type: object - description: Any allowed setting and value. - responses: - 204: - description: The settings were updated. - 500: - description: An error occured. - schema: - $ref: '#/definitions/Error' /users: get: parameters: diff --git a/docs/tools.md b/docs/tools.md new file mode 100644 index 000000000..d32d16dfb --- /dev/null +++ b/docs/tools.md @@ -0,0 +1,36 @@ +--- +title: Tooling +keywords: homepage +sidebar: talk_sidebar +permalink: plugins-client.html +summary: +--- + +## Debugging +How we debug errors at Coral + +### React Debugging +For debugging React + +#### React Developer Tools +Another amazing tool for debugging React Applications. You can see where the props are, and much more. + +[React Developer Tools Extension](https://chrome.google.com/webstore/detail/react-developer-tools/fmkadmapgofadopljbjfkapdkoienihi?hl=en) + + +### Redux Debugging +For debugging Redux + +#### Redux Devtool Extension +Redux Devtool is an amazing debug tool. You can easily see what' happening with the state, the payloads, and more. + +[Redux Devtool Chrome Extension](https://chrome.google.com/webstore/detail/redux-devtools/lmhkpmbekcpmknklioeibfkpmmfibljd?hl=en) + +[Redux Devtool Github Repo](https://github.com/zalmoxisus/redux-devtools-extension) + +### GraphQL + +Talk ships with GraphiQL, a live data layer IDE. We strongly recommend using GraphiQL early and often as you work with all things queries, mutations and subscriptions! + +* [Install Talk](install-source.html). +* Open http://localhost:3000/api/v1/graph/iql in your browser. (Note, your server an port may differ.) From 5f83584e4832c7597df61b74f9074e06d3b5aef5 Mon Sep 17 00:00:00 2001 From: David Erwin Date: Fri, 26 May 2017 11:37:33 -0400 Subject: [PATCH 56/78] Update tooling and client architecture docs --- docs/_data/sidebars/talk_sidebar.yml | 13 ++- docs/client-architecture.md | 128 +++++++++++++++++++++++++++ docs/tools.md | 2 +- 3 files changed, 139 insertions(+), 4 deletions(-) create mode 100644 docs/client-architecture.md diff --git a/docs/_data/sidebars/talk_sidebar.yml b/docs/_data/sidebars/talk_sidebar.yml index 6429aaf93..fcb3cb324 100644 --- a/docs/_data/sidebars/talk_sidebar.yml +++ b/docs/_data/sidebars/talk_sidebar.yml @@ -14,9 +14,6 @@ entries: - title: FAQ url: /faq.html output: web - - title: Tools - url: /tools.html - output: web - title: Installation output: web @@ -46,3 +43,13 @@ entries: - title: Experimental url: /plugins-experimental.html output: web + + - title: Development + output: web + folderitems: + - title: Client Architecture + url: /client-architecture.html + output: web + - title: Tools + url: /tools.html + output: web diff --git a/docs/client-architecture.md b/docs/client-architecture.md new file mode 100644 index 000000000..46f593758 --- /dev/null +++ b/docs/client-architecture.md @@ -0,0 +1,128 @@ +--- +title: Core Client Architecture +keywords: homepage +sidebar: talk_sidebar +permalink: client-architecture.html +summary: +--- + +## The Stack + - [React](#react) + - [Redux](#redux) + - [ImmutableJS](#immutablejs) + + +## The Architecture +Our frontend lives within [talk/client](https://github.com/coralproject/talk/tree/153193959cb4dfa5d8feaabb49811325f836ee68/client) folder. Every folder contains a plugin. In [coral-framework](https://github.com/coralproject/talk/tree/153193959cb4dfa5d8feaabb49811325f836ee68/client/coral-framework) you will find the core architecture of Talk. +Here is where our Redux Application, translations, components, and helpers live. + + +## Presentational and Container Components +We use a common simple pattern called +__Presentational and Container Components__ + +It basically consist in having two types of components: + - Presentational + - Containers + +### Presentational Components +- __How our UI looks like__ +- Are stateless components +- Render props +- Allow containment of children via `this.props.children` +- They have DOM Markup + +### Container Components +* __How things work__ +* They don’t have markup nor styles +* They provide data and behaviour to Presentational or Container Components +* They connect via `react-redux`’s `connect()` to the state. +* They `mapStateToProps` the state to the Presentational Container. +* They `mapDispatchToProps` to send actions to the Presentational Container. +* Name Convention `Container.js` + +How a container looks like: +```js +/* +* mapStateToProps +* We map the part of the state that we want to use +*/ + +const mapStateToProps = state => ({ + auth: state.auth.toJS() +}); + +/* +* mapDispatchToProps +* We map the actions that we want to use +*/ + +const mapDispatchToProps = dispatch => ({ + checkLogin: () => dispatch(checkLogin()) +}); + + +/* +* connect +* We wrap our container in a connect() function +*/ + +export default connect( + mapStateToProps, + mapDispatchToProps +)(SignInContainer); +```` + +How our SignInContainer works: [talk/SignInContainer.js · GitHub](https://github.com/coralproject/talk/blob/153193959cb4dfa5d8feaabb49811325f836ee68/client/coral-sign-in/containers/SignInContainer.js) + +Within our plugins we create two folders `containers` and `components` so we can differentiate them: +``` +coral-sign-in/ +├── containers/ +│ └── SignInContainer.js +└── components/ + ├── SignInContent.js + └── SignUpContent.js +``` + +More about this architecture: + +[Container Components – Learn React with chantastic – Medium](https://medium.com/@learnreact/container-components-c0e67432e005#.w8mzgndcg) + + +[Presentational and Container Components – Dan Abramov – Medium](https://medium.com/@dan_abramov/smart-and-dumb-components-7ca2f9a7c7d0#.ai4ih55v3) + + +## GraphQL +We use [Apollo](http://www.apollodata.com/) to handle graph requests and handle state. + +## Redux +We use [Redux](http://redux.js.org/) to handle the auth state. + + +## ImmutableJS +We use Immutable JS to maintain our state immutable. +We found some really good tradeoffs while building Talk. + +[How to use ImmutableJS and how we use it with Talk](https://facebook.github.io/immutable-js/docs/#/) + + +## Test +[How we do testing at Coral with Talk](/tools.html) + + +## Lint +For linting in Talk we use `eslint:recommended` + +You can find more info about the rules and best practices here: +http://eslint.org/docs/rules/#best-practices + +## Lint the code +```js +yarn lint +``` + + +## The Future of the Frontend +- Preact +- Reselect diff --git a/docs/tools.md b/docs/tools.md index d32d16dfb..51036d96e 100644 --- a/docs/tools.md +++ b/docs/tools.md @@ -2,7 +2,7 @@ title: Tooling keywords: homepage sidebar: talk_sidebar -permalink: plugins-client.html +permalink: tools.html summary: --- From 1d3a75e4250a4e9048f80263ecf686d19f5498e6 Mon Sep 17 00:00:00 2001 From: David Erwin Date: Fri, 26 May 2017 11:39:24 -0400 Subject: [PATCH 57/78] Update doc menu title --- docs/_data/sidebars/talk_sidebar.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/_data/sidebars/talk_sidebar.yml b/docs/_data/sidebars/talk_sidebar.yml index fcb3cb324..c7ba32025 100644 --- a/docs/_data/sidebars/talk_sidebar.yml +++ b/docs/_data/sidebars/talk_sidebar.yml @@ -5,7 +5,7 @@ entries: levels: one folders: - - title: Quickstart + - title: Talk output: web folderitems: - title: About From 69a9afe084f8e7bc92b63e99a5c5ac06a0302d10 Mon Sep 17 00:00:00 2001 From: David Erwin Date: Fri, 26 May 2017 11:40:56 -0400 Subject: [PATCH 58/78] Remove old docs --- docs-tmp/diagrams/architecture.png | Bin 62004 -> 0 bytes docs-tmp/diagrams/architecture.xml | 1 - docs-tmp/diagrams/data-model.png | Bin 45245 -> 0 bytes docs-tmp/diagrams/data-model.xml | 1 - docs-tmp/diagrams/moderation-flow-post.png | Bin 47848 -> 0 bytes docs-tmp/diagrams/moderation-flow-pre.png | Bin 48071 -> 0 bytes docs-tmp/diagrams/moderation-flow.xml | 1 - docs-tmp/frontend/DEBUG.md | 22 -- docs-tmp/frontend/HOOKS.md | 0 docs-tmp/frontend/IMMUTABLEJS.md | 390 --------------------- docs-tmp/frontend/PLUGINS-experimental.md | 102 ------ docs-tmp/frontend/PLUGINS.md | 270 -------------- docs-tmp/frontend/README.md | 121 ------- docs-tmp/frontend/REDUX.md | 223 ------------ docs-tmp/frontend/TEST.md | 123 ------- docs-tmp/plugins/CLIENT.md | 272 -------------- docs-tmp/plugins/EXPERIMENTAL.md | 102 ------ docs-tmp/plugins/README.md | 163 --------- docs-tmp/plugins/SERVER.md | 382 -------------------- 19 files changed, 2173 deletions(-) delete mode 100644 docs-tmp/diagrams/architecture.png delete mode 100644 docs-tmp/diagrams/architecture.xml delete mode 100644 docs-tmp/diagrams/data-model.png delete mode 100644 docs-tmp/diagrams/data-model.xml delete mode 100644 docs-tmp/diagrams/moderation-flow-post.png delete mode 100644 docs-tmp/diagrams/moderation-flow-pre.png delete mode 100644 docs-tmp/diagrams/moderation-flow.xml delete mode 100644 docs-tmp/frontend/DEBUG.md delete mode 100644 docs-tmp/frontend/HOOKS.md delete mode 100644 docs-tmp/frontend/IMMUTABLEJS.md delete mode 100644 docs-tmp/frontend/PLUGINS-experimental.md delete mode 100644 docs-tmp/frontend/PLUGINS.md delete mode 100644 docs-tmp/frontend/README.md delete mode 100644 docs-tmp/frontend/REDUX.md delete mode 100644 docs-tmp/frontend/TEST.md delete mode 100644 docs-tmp/plugins/CLIENT.md delete mode 100644 docs-tmp/plugins/EXPERIMENTAL.md delete mode 100644 docs-tmp/plugins/README.md delete mode 100644 docs-tmp/plugins/SERVER.md diff --git a/docs-tmp/diagrams/architecture.png b/docs-tmp/diagrams/architecture.png deleted file mode 100644 index 0096ccd41af9621933ca8620344f06d3ede4bba0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 62004 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 z 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«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 C7Pt`r diff --git a/docs-tmp/diagrams/architecture.xml b/docs-tmp/diagrams/architecture.xml deleted file mode 100644 index ce2b09a19..000000000 --- a/docs-tmp/diagrams/architecture.xml +++ /dev/null @@ -1 +0,0 @@ -7Vpbc6M2FP41nrYP6wFksP1oO0k7nd1O2nTa7qMMCtZGICpE4vTXVwIJkCVnnQbbWU/z4MDRBen7zk0HRmCVbX9ksNh8ogkio8BLtiNwNQqC6dwTv1Lw3AjCYNoIUoaTRuR3gjv8D1JCNS6tcIJKoyOnlHBcmMKY5jmKuSGDjNEns9s9JeZTC5giS3AXQ2JL/8QJ3zTSWeh18p8QTjf6yb6nWtYwfkgZrXL1vFEA7uu/pjmDei7Vv9zAhD71ROB6BFaMUt5cZdsVIhJaDVsz7mZPa7tuhnJ+yIBJ1Ix4hKRCesn1wvizBkOMELiLm6VYbSGFMaGVmGD5tMEc3RUwlsInoQlCtuEZEXe+uFRTI8bRdu/6/HbXQpkQzRBnz6KLGhBpjdCK1Nw9daQEGvpNn5C56giVIqTtzB0Y4kLh4cYGOKBIhJqoW8r4hqY0h+S6ky5r7pGcwTPBQFvM/5LicajuPuuWXCys1yRvP6sJSg4ZX0iNrmGHZYljLb7BpJ08T+xOQtjr8gVx/qwsDVacClG3g4+UFqpfyRl9QCtKKKv3DLz6r23R9tARbLEpIKMVixVmCkWx4hSpXoHSOgnni1rAEIEcP5pW+RZOw/kxOPV7jHrjaWiQalA6Bt8IqTvU/BeWQ+9EpEb+8UkNTFLHfmTyGrbtt4hhsQXEviETHoDtJpKcgO3AiliLohCCO8REqBkFERErWib4UVym8vL7X0R6MgpWcp/bgqGyHH8pf9AdxeN6fS1FOijEOdCyot7eEAemZojzdZbRC3L+xBXkZt7b0Zx8Pf4fH4I2fVIQABcEMxcEkwEgiCbHdx8vhYTatVyil/AnjtB/Ii/huxTbcg2LJMP5SObIN+JXHmOYWAbN9zkHewLpet6JI/F1dqwdSTCzrShwWFE0hBGF5zWi6cUaUXhGIwotI1pRBmWX62yNkvIdaDmYOWLFsbTcn9vJRyWeGni3jD5i4T7OAUmkE2Bt+L59TPY9YEMCBoCkXW4HySeIiUrIsNj1OQAJDECmDhVxlQ2GwCME53WEl+oHdc3gLCfMwC6T/UzXwta9XyskJI5Dx0OF3tcxY7aTYx/qN6cDGAVwBBKCxWa+kxjeib1biIhtcRMEU8dymkvLuRe6uiOCBKe51GkxvzyFLyVIOIZkoRoynCS12blQ34Pra4qWhxxnpg6kgyGQjo7hfuyi5WW4mDe4DjX0lmIxY0t9sHOYB7ucNi5Njepoff1EjR+0Jqr1o93PYSWAo5TPTJVpg5Sjzn056mRGLDC3I1ZzLD1BxJrYdZz/X14ci9TwRKQC+/hxw2jtNq7zRJ5CSJXivHTlIwzBWHS8YSiptoemJfqFXxOLE1qt6xbf0BV/TyQd9k3g7rkvmJzw3DeZWsCrYpFQNFU+imAmd52vy8JdK1rRLKtyzJ/39f1qtekTzGHa1bgPJK/KyCKWC+0yoY9wjcgtLXFd7AJXa8o5zUQHIhuW7UvsniWp19h2NsXpDtntO21pd4V+GyKVA+epEg+gEMAMkD6w9QEcSx1mdjrbI9eiDWXrujLwrmkbnhLgOHcfixKdYvco+Q0l2C7HaHgTyGEp4N13Dhj4O4adigSIbGjmcxsa3x8AG/2sgXMBqyRxifE+1J8fnaH8GjpKazRP6dV+p3FqrTYNPnAWHl3v7QZR68CCx3C+PXyivyv5RdVSFhU+qPrAQvQg6J53rbuR975JrexpZMOHslZPOYs/Kbb2LLpS/jskD+LfgsWSj5hXjfgKw5TBrBcUmseZS3ghJTjz9v4QLWNfUkiKDXzlNi6p1mNmIbZbb2VvrDTL3L39LrA55nffXoLrfwE= \ No newline at end of file diff --git a/docs-tmp/diagrams/data-model.png b/docs-tmp/diagrams/data-model.png deleted file mode 100644 index 43855b5423db8767b0e2153b4aef1af8ca0ae723..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 45245 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 QBLjn;){d>o8s>ig7q~d`RR910 diff --git a/docs-tmp/diagrams/data-model.xml b/docs-tmp/diagrams/data-model.xml deleted file mode 100644 index 1597bf7d9..000000000 --- a/docs-tmp/diagrams/data-model.xml +++ /dev/null @@ -1 +0,0 @@ -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 \ No newline at end of file diff --git a/docs-tmp/diagrams/moderation-flow-post.png b/docs-tmp/diagrams/moderation-flow-post.png deleted file mode 100644 index 18860abd39ddffe9590473276a9ea4eace6493f9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 47848 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 Zoj*Dy**wNZW`lnh^)6p1`}5j^{{gszk*)v$ diff --git a/docs-tmp/diagrams/moderation-flow.xml b/docs-tmp/diagrams/moderation-flow.xml deleted file mode 100644 index 08d4a28d0..000000000 --- a/docs-tmp/diagrams/moderation-flow.xml +++ /dev/null @@ -1 +0,0 @@ -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 \ No newline at end of file diff --git a/docs-tmp/frontend/DEBUG.md b/docs-tmp/frontend/DEBUG.md deleted file mode 100644 index 36a7ac0fa..000000000 --- a/docs-tmp/frontend/DEBUG.md +++ /dev/null @@ -1,22 +0,0 @@ -# Debug -How we debug errors at Coral - -## React Debugging -For debugging React - -### React Developer Tools -Another amazing tool for debugging React Applications. You can see where the props are, and much more. - -[React Developer Tools Extension](https://chrome.google.com/webstore/detail/react-developer-tools/fmkadmapgofadopljbjfkapdkoienihi?hl=en) - - -## Redux Debugging -For debugging Redux - -### Redux Devtool Extension -Redux Devtool is an amazing debug tool. You can easily see what' happening with the state, the payloads, and more. - -[Redux Devtool Chrome Extension](https://chrome.google.com/webstore/detail/redux-devtools/lmhkpmbekcpmknklioeibfkpmmfibljd?hl=en) - -[Redux Devtool Github Repo](https://github.com/zalmoxisus/redux-devtools-extension) - diff --git a/docs-tmp/frontend/HOOKS.md b/docs-tmp/frontend/HOOKS.md deleted file mode 100644 index e69de29bb..000000000 diff --git a/docs-tmp/frontend/IMMUTABLEJS.md b/docs-tmp/frontend/IMMUTABLEJS.md deleted file mode 100644 index 76a9323cf..000000000 --- a/docs-tmp/frontend/IMMUTABLEJS.md +++ /dev/null @@ -1,390 +0,0 @@ -# InmutableJS -InmutableJS is a library from Facebook that provides a series of inmutable data structures. They are always immutable. The reference to them can change but the data inside of them cannot which means you can build predictable and reliable state models. -We use ImmutableJS in Talk and it becomes really easy to manage Talk’s application state. [Immutable.js](https://facebook.github.io/immutable-js/) - -More about Immutable Data and React: -[React.js Conf 2015 - Immutable Data and React - YouTube](https://www.youtube.com/watch?v=I7IdS-PbEgI&feature=youtu.be) - -## Why ImmutableJS? -- __Immutable Data is faster__ -* Tracking mutation and Maintaining state is difficult -* Encourages you to think differently about how data flows through your application - -## Getting Started -ImmutableJS API is pretty expense. We will try to cover the basics and more to show its power. - -ImmutableJS provides many Persistent Immutable data structures including: `List()`, `Stack()`, `Map()`, `OrderedMap()`, `Set()`, `OrderedSet()` and `Record()`. - -We will cover the most common data structures. `Map()` , `List()` and `Record()` and also we will describe the behaviour of `Seq()` with `Range()` - - -## Map() -- [Map()](https://facebook.github.io/immutable-js/docs/#/Map) - * Read values - * [get()](https://facebook.github.io/immutable-js/docs/#/Map/get) - * [has()](https://facebook.github.io/immutable-js/docs/#/Map/has) - * [first()](https://facebook.github.io/immutable-js/docs/#/Map/first) - * [last()](https://facebook.github.io/immutable-js/docs/#/Map/last) - * Read deep values - * [getIn()](https://facebook.github.io/immutable-js/docs/#/Map/getIn) - * Change Values - - [set()](https://facebook.github.io/immutable-js/docs/#/Map/set) - * [merge()](https://facebook.github.io/immutable-js/docs/#/Map/merge) - * [update()](https://facebook.github.io/immutable-js/docs/#/Map/update) - * [clear()](https://facebook.github.io/immutable-js/docs/#/Map/clear) - * [delete()](https://facebook.github.io/immutable-js/docs/#/Map/delete) - * Change deep values - * [setIn()](https://facebook.github.io/immutable-js/docs/#/Map/getIn) - * Conversion to JavaScript types - * [toJS()](https://facebook.github.io/immutable-js/docs/#/Map/toJS) - * [toArray()](https://facebook.github.io/immutable-js/docs/#/Map/toArray) - * [toObject](https://facebook.github.io/immutable-js/docs/#/Map/toObject) - * Member - * [size](https://facebook.github.io/immutable-js/docs/#/Map/size) - - -Creates a new Immutable Map. An Object graph. [Map - Immutable.js](https://facebook.github.io/immutable-js/docs/#/Map) - -```js - -const data = { - ‘one’: { - title: ‘One’, - value: 1 - }, - ‘two’: { - title: ‘Two’, - value: 2 - } -} - -let map = Inmutable.Map(data) -``` - -### get() -Returns the value associated with the provided key, Since inmutable data cannot be mutated they create a new reference to the new data. -[get() - Immutable.js](https://facebook.github.io/immutable-js/docs/#/Map/get) - -```js -map.get(‘one’).title -``` - - -```js -let obj = { 1: “one” }; -Object.keys(obj); // [ “1” ] -obj[“1”]; // “one” -obj[1]; // “one” - -let map = Map(obj); -map.get(“1”); // “one” -map.get(1); // undefined -``` - -### getIn() -To get data from a deeply nested structure. -[getIn() - Immutable.js](https://facebook.github.io/immutable-js/docs/#/Map/getIn) - -*With a Map()* -```js - -let map = Inmutable.Map({ - title: ‘Todo One’, - text: ‘Do todo’ - category: { - title: ‘Some category’, - order: 1 - } -}) - -map.getIn([‘category’, ‘title’]) // ‘Some Category’ - -``` - -### length - size -To get the size of a Map() or a List() -```js -map.size -``` - -### set() -```js -map.set(‘three’, {title: ‘three’, value: 3}) -``` - -### delete() -```js -map.delete(‘three’, {title: ‘three’, value: 3}) -``` - -### update() -```js -map.update(‘one’, item => ‘’) -``` - -### clear() -Returns a new Map containing no keys or values. - -```js -map.clear() -``` - -### merge() -Returns a new Map resulting from merging the provided iterables. -```js - -let mapX = Inmutable.Map({a: 10, b: 20, c: 30}) -let mapY = Inmutable.Map({a: 10, b: 20, c: 30}) - -mapX.merge(mapY) // { a: 50, b: 40, c: 30, d: 60 } -``` - -### Querying Methods - -#### has -Returns a boolean if it finds the id key - -```js -map.has(item.id) -``` - -#### first -Returns the first element of a Map -```js -map.first() -``` - -### Iteration Methods -We can use methods like `.filter`, `.map`, `.reduce` . However it’s not recommended to use `.forEach` since it can mutate the data producing side effects. - -#### groupBy - -Returns the first element of a Map -```js -items.groupBy(item => { - return todo.completed -}); -``` - -### Working with Subsets of a Map() - -#### slice() -Returns the last two items of a Map() -slice(, ) -```js -items.slice(items.size-2, todos.size); -``` - -#### takeLast() -Returns the last two items of a Map() -```js -items.takeLast(2); -``` - -#### butLast() -Returns the last item -```js -items.butLast(); -``` - -#### rest() -```js -items.rest(); -``` - -#### skip() -Returns a Map() skipping the first 5 items -```js -items.skip(5); -``` - -#### skipUntil() -Returns a Map() skipping until it finds the value -```js -items.skipUntil(item => item.value === 1); -``` - -#### skipWhile() -Returns a Map() up until it finds 1 included. -```js -items.skipWhile(item => item.value === 1); -``` - -### Equality Methods - -#### is() -```js -let mapX = Inmutable.Map({a: 10, b: 20, c: 30}) -let mapY = Inmutable.Map({a: 10, b: 20, c: 30}) - -Immutable.is(mapX, mapY); // true -``` - -### FromJS - -#### Object to Map() -Creates deeply nested Map() from a plain Javascript Object - -```js -let object = {a: 10, b: 20, c: 30}; - -Immutable.fromJS(object); // Map() -``` - - -#### Array to List() -Creates List() from a JS Array - -```js -let array = [10,20,30]; - -Immutable.fromJS(object); // List() -``` - -#### Usage of the reviver function -The reviver function takes a key and a value. Converting JS to Map() or List() - -```js -let array = [10,20,30]; - -Immutable.fromJS(array, (key, value) => { - return value.toMap(); -}); // Map() -``` - -*Note: the getIn will be index based instead of object based if it comes from an array* - -### List() - -Most of the __Map()__ methods can be used with __List()__ -But there are some differences. - -### Differences between the Immutable Map() and List() -List() have the same methods that a JS Array has. But instead of mutating the array it returns a new one. - -Usually we wouldn’t use the push method in immutable data structures but with Immutable.List()s push methods are safe to be used. - -```js -let list = Immutable.List() -list.push(3) -list.toArray() // [3] -``` - -#### get() and getIn() -The get method with Map() is _key_ based and with List() is _index_ based. - -```js -// get() -let list = Immutable.List(); -list.push(3); -list.get(0); // 3 - -let map = Immutable.Map(); -list.set('active', true); -list.get('active'); // true - -// getIn() -let map = Inmutable.List([10, 20, 30, [40, 50]]) -map.getIn([3, 1]) // 50 -``` - -#### of() -We can create a __List()__ by using the _of_ method - -```js -const items = []; -const list = Immutable.List.of('red', 'green', 'blue'); -``` - -*Using the spread operator:* -```js -const items = ['red', 'green', 'blue']; -const list = Immutable.List.of(...items); -``` - -### Sequences -Represents a sequence of values. [Seq() - Immutable.js](https://facebook.github.io/immutable-js/docs/#/Seq) - -- Sequences are immutable — Once a sequence is created, it cannot be changed. -- Sequences are Lazy - -Creating sequences with _of()_ -```js -let range = [0, 1, 2 ... 999] -let sequence = Immutable.Seq.of(...range) -``` - -For Example: the following performs no work, because the resulting of the sequence values are never iterated: - -```js - -let operations = 0; - -let squared = sequence.map(num => { - operations++; - return num * num; -}) -operations; // 0 - -// Now using the sequence -squared.take(10).toArray(); -operations; // 10 - -``` - -Once the sequence is used, it performs only the work necessary. It will return it only when you ask for them. - -This is really powerful because it doesn’t produce an overflow with infinite an infinite range. - -```js -let squaredRange = Immutable.Range(1, Infinity); - -squaredRange.size; // Infinity - -first1000squared = squaredRange - .take(1000) - .map(n => n * n); - -first1000squared.size; // 1000 -``` - -__Seq()__ allows for the efficient chaining of operations - -```js -let squaredOdds = Immutable.Range(0, Infinity) - .filter(n => n % 2 !== 0) - .map(n => n * n) - .take(1000); - -console.log( - squaredOdds.toArray() -) - -``` - -You can fin this example here: [Sequences - JS Bin](http://jsbin.com/nilekuj/edit?js,console) - -[image:12FACC54-0BAF-4C93-A782-F77DB7CD04D3-813-00001ABD60F45CC4/Screen Shot 2016-12-22 at 8.23.33 AM.png] - -## Memoization with Immutable JS -Immutable JS provides advanced memoization. - -```js -const seq = Immutable.Range(1, Infinity) - .map(n => ({ - value: n - })) - -console.time(‘First Run’); -seq.take(1000); -console.timeEnd(‘First Run’); // First Run: 0.577ms - -console.time(‘Second Run’); -seq.take(1000); -console.timeEnd(‘Second Run’); // Second Run: 0.165ms -``` - - -### Play with Immutable JS -[JS Bin - Collaborative JavaScript Debugging](http://jsbin.com/nilekuj/edit?js,console) - diff --git a/docs-tmp/frontend/PLUGINS-experimental.md b/docs-tmp/frontend/PLUGINS-experimental.md deleted file mode 100644 index 895be5900..000000000 --- a/docs-tmp/frontend/PLUGINS-experimental.md +++ /dev/null @@ -1,102 +0,0 @@ -# Experimental plugins - -Talk plugins are, in essence, small programs that hook into the core application in a variety of ways. Ultimately, this code can do anything that javascript is capable of. In addition, plugins can import any core code to hook into talk at any level. - -If you want to write plugins that integrate with core code beyond the api described in [PLUGINS.md](PLUGINS.md), please keep the following things in mind: - -* core code may change and break your plugin -* you may introduce inefficiencies with your plugin that could hurt performance/crash Talk -* you may cause bugs in other areas of Talk - -If you'd like to build a supported plugin but don't have the hooks you need, please file an issue on this repo and we can discuss deepening the supported plugin api! - -With that said, here's some of the prime experimental integration points: - -## Reducers and Actions : Redux - -Talk is powered by Redux and our plugins can too! Our plugins can have their own reducers and actions. - -```js -import MyButton from './MyButton'; -import reducer from './reducer'; - -export default { - slots: { - commentDetail: [MyButton], - }, - reducer -}; -``` - -## Import Actions from Talk -We can easily trigger `Talk` actions in our plugin Components. - -```js -import React, {Component} from 'react'; -import {connect} from 'react-redux'; -import {bindActionCreators} from 'redux'; -import {addTag, removeTag} from 'coral-plugin-commentbox/actions'; - -class MyButton extends Component { - render() { - return ; - } -} - -const mapStateToProps = ({commentBox}) => ({commentBox}); - -const mapDispatchToProps = dispatch => - bindActionCreators({addTag, removeTag}, dispatch); - -export default connect(mapStateToProps, mapDispatchToProps)(OffTopicCheckbox); -``` - -## ESlint and Babel -In talk we use `eslint:recommended` and Babel with the latest ECMAScript Features. But you can use your own! -While building your plugin you need to specify a `.eslintrc.json` file and a`.babelrc` file. - -#### `.eslintrc.json` -```json -{ - "env": { - "browser": true, - "es6": true, - "mocha": true - }, - "parserOptions": { - "sourceType": "module", - "ecmaFeatures": { - "experimentalObjectRestSpread": true, - "jsx": true - } - }, - "parser": "babel-eslint", - "plugins": [ - "react" - ], - "rules": { - "react/jsx-uses-react": "error", - "react/jsx-uses-vars": "error", - "no-console": ["warn", { "allow": ["warn", "error"] }] - } -} -```` - - -#### `. babelrc ` -```json -{ - "presets": [ - "es2015" - ], - "plugins": [ - "add-module-exports", - "transform-class-properties", - "transform-decorators-legacy", - "transform-object-assign", - "transform-object-rest-spread", - "transform-async-to-generator", - "transform-react-jsx" - ] -} -```` diff --git a/docs-tmp/frontend/PLUGINS.md b/docs-tmp/frontend/PLUGINS.md deleted file mode 100644 index 0edc4d455..000000000 --- a/docs-tmp/frontend/PLUGINS.md +++ /dev/null @@ -1,270 +0,0 @@ -# Plugins -We can build plugins to extend the functionality of Talk. - -This guide is a walkthrough of our plugin architecture and components that we provide that allow you to build on top of Core coral components without having to understand the concepts there in. It is organized into three sections: - -* [Plugin Architecture](#plugin-architecture) -* Using our building block components -* [Reactions](#reactions) -* [Styling](#styling-plugins) - -Advanced users will quickly realize that our plugins have complete access to core code. If you would like to write advanced plugins that reach outside of our published API as described in this document, please see [our notes on experimental pluginss](PLUGINS-experimental.md). - -Under the hood our plugins are powered by *React*, *Redux* and *GraphQL*. We can also build them with simple vanilla javascript. - -## Plugin Architecture - -The plugins live in the `/plugins` folder. Each plugin must have an `index.js` file and two folders `client` and `server`. - -### The Client Folder -The frontend of our plugin lives inside the `client` folder. The `client` folder must have an `index.js` file that exports the configuration of our plugin. - -``` -my-plugin/ - ├── client/ - │ └── index.js <-- index for client side functionality - ├── server/ - └── index.js <-- base plugin index -``` - -For now our base plugin `index.js` file should look like this: - -```js -export default { - // We will add more here later. -}; -``` - -### Creating a Component - -We can add our components (or any other javascript code) within the `client` folder. - -``` -my-plugin/ - ├── client/ - │ ├── MyComponent.js - │ └── index.js - ├── server/ - └── index.js -``` - -Our component could look like this: - -```js -import React, {Component} from 'react'; - -class MyButton extends Component { - render() { - return ; - } -} - -export default MyButton; -``` - -Here we create a component that renders a `button`. Now that we created our component we need to specify where it should get injected within Talk! - -To tell Talk where that Component should get injected we need to specify which *Slots* to insert it into. - -```js -import React from 'react'; -export default = () => ; -``` - -### Slots -In Talk we have defined specific *Slots* where we can inject components. - -Here is how we specify our slots config in `my-plugin/index.js` - -```js -import MyButton from './MyButton'; - -export default { - slots: { - commentDetail: [MyButton] - } -}; -``` - -Here I’m specifying that the MyComponent Component will take place within the `commentDetail` in Talk. - -`commentDetail` it’s a specific slot in the CommentStream. It means that it will be embedded inside de comment detail. - -Slots properties take an`Array` so we can add as many components as we want. - -## Building Blocks (TBD) - -`Note: the concepts in this section are still to be implemented. Code samples are for discussion and may change.` - -In order to allow you to build more complex plugins, we have wrapped some of our functionality in higher order components that expose a simple api. - -## Reactions - -Reactions provide users the ability to 'like', 'respect', etc... comments. - -Note: some server side work will need to accompany this client side component. See the like and respect plugins as examples. - -### Building Reactions - -#### Our `client/index.js` : - -```js -import LoveButton from './LoveButton'; - -export default { - slots: { - commentReactions: [LoveButton] - } -}; - -``` -In this example we add our reaction component to the `commentReaction` Slot - -#### Our Reaction component: - -```js -import React from 'react'; -import {withReaction} from 'coral-plugin-api'; - -class LoveButton extends React.Component { - handleClick = () => { - const { - postReaction, - deleteReaction, - alreadyReacted - } = this.props; - - if (alreadyReacted()) { - deleteReaction(); - } else { - postReaction(); - } - }; - - render() { - const {count} = this.props; - return ( - - ); - } -} - -export default withReaction('love')(LoveButton); -``` - - -This feature introduces `withReaction` HOC. `withReaction` takes, as argument, a reaction string and it allows our component to receive specific props for handling reactions. - - * `postReaction` - Posts the reaction - - * `deleteReaction` - Removes the reaction - - * `alreadyReacted` - A function that returns a boolean. - - * `count` - The reaction count - - -For full reference: Please, check `coral-plugin-love`: [LoveButton.js](https://github.com/coralproject/talk/blob/master/plugins/coral-plugin-love/client/LoveButton.js) - -### Comment Stream - -Comment streams may be created with filtering and ordering in place: - -* filter by user -* filter by tag -* sort by date ascending / descending - -### Comment Commit hooks - -// docs for the pre/post comment submit commit hooks - -### Mod Queues - -Moderation queues can be added via configuration objects passed in through plugins. - -Basic mod queues will resemble the current moderation queues but can be generated from different lists of comments. - -* filter by user tag -* filter by comment tag -* filter by comment status -* Custom queries (paired with back end plugins that provide queries to get the data) - -#### Advanced mod queues - -Advanced mod queues can be created giving plugin authors the power to create the cards that appear in the queue, create actions and custom buttons, etc... - -### Custom Configuration - -Plugins may rely on configuration options that admins/moderators can set in the Configuration section. - -Basic settings can be added via json configuration in a plugin. - -* Setting headline -* Setting description -* Setting input type -* Default value -* Variable name - -#### Advanced Custom Configuration (low prioritiy) - -Users can inject configuration interfaces that they create into the configuration allowing for more advanced configuration. - - -## Styling Plugins -Talk uses CSS Modules. This basically means that you can also add your CSS Module to your plugin without colliding with the rest of Talk! - -##### My Component -```js -import styles from './style.css'; - -class MyCoralButton extends Component { - render() { - return ; - } -} -```` - -Our `style.css` should could look like this. -```css - -.button { - background: coral; - border-radius: 3px; -} -``` - -## Plugin Hooks -The plugins injected in the CommentBox such as `commentInputDetailArea` will inherit through props tools for handling hooks. - -### Available hook types: -`preSubmit` : To perform actions before submitting the comment. -`postSubmit` : To perform actions after submitting the comment. - -### Register Hooks -`registerHook` is a function that takes: the hook type, a hook function and returns the hook data. - -#### Usage: -```js - this.addCommentTagHook = this.props.registerHook('postSubmit', (data) => { - const {comment} = data.createComment; - this.props.addCommentTag({ - id: comment.id, - tag: 'OFF_TOPIC' - }); - }); -``` - -### Unregister Hooks - -`unregisterHook` will remove the hook. - -```js - this.props.unregisterHook(this.addCommentTagHook); -``` - -### The server folder and the index file -Read more about the `/server` and how to extend Talk here. -[talk/PLUGINS.md at master · coralproject/talk · GitHub](https://github.com/coralproject/talk/blob/master/PLUGINS.md) diff --git a/docs-tmp/frontend/README.md b/docs-tmp/frontend/README.md deleted file mode 100644 index 083b776e0..000000000 --- a/docs-tmp/frontend/README.md +++ /dev/null @@ -1,121 +0,0 @@ -# Frontend Architecture -## The Stack - - [React](#react) - - [Redux](#redux) - - [ImmutableJS](#immutablejs) - - -## The Architecture -Our frontend lives within [talk/client](https://github.com/coralproject/talk/tree/153193959cb4dfa5d8feaabb49811325f836ee68/client) folder. Every folder contains a plugin. In [coral-framework](https://github.com/coralproject/talk/tree/153193959cb4dfa5d8feaabb49811325f836ee68/client/coral-framework) you will find the core architecture of Talk. -Here is where our Redux Application, translations, components, and helpers live. - - -## Presentational and Container Components -We use a common simple pattern called -__Presentational and Container Components__ - -It basically consist in having two types of components: - - Presentational - - Containers - -### Presentational Components -- __How our UI looks like__ -- Are stateless components -- Render props -- Allow containment of children via `this.props.children` -- They have DOM Markup - -### Container Components -* __How things work__ -* They don’t have markup nor styles -* They provide data and behaviour to Presentational or Container Components -* They connect via `react-redux`’s `connect()` to the state. -* They `mapStateToProps` the state to the Presentational Container. -* They `mapDispatchToProps` to send actions to the Presentational Container. -* Name Convention `Container.js` - -How a container looks like: -```js -/* -* mapStateToProps -* We map the part of the state that we want to use -*/ - -const mapStateToProps = state => ({ - auth: state.auth.toJS() -}); - -/* -* mapDispatchToProps -* We map the actions that we want to use -*/ - -const mapDispatchToProps = dispatch => ({ - checkLogin: () => dispatch(checkLogin()) -}); - - -/* -* connect -* We wrap our container in a connect() function -*/ - -export default connect( - mapStateToProps, - mapDispatchToProps -)(SignInContainer); -```` - -How our SignInContainer works: [talk/SignInContainer.js · GitHub](https://github.com/coralproject/talk/blob/153193959cb4dfa5d8feaabb49811325f836ee68/client/coral-sign-in/containers/SignInContainer.js) - -Within our plugins we create two folders `containers` and `components` so we can differentiate them: -``` -coral-sign-in/ -├── containers/ -│ └── SignInContainer.js -└── components/ - ├── SignInContent.js - └── SignUpContent.js -``` - -More about this architecture: - -[Container Components – Learn React with chantastic – Medium](https://medium.com/@learnreact/container-components-c0e67432e005#.w8mzgndcg) - - -[Presentational and Container Components – Dan Abramov – Medium](https://medium.com/@dan_abramov/smart-and-dumb-components-7ca2f9a7c7d0#.ai4ih55v3) - - -## React -## Redux -We use Redux to handle the state container of Talk. - -[How we to use Redux, and how we use it with Talk](https://github.com/coralproject/talk/blob/frontenddocs/docs/frontend/REDUX.md) - - -## ImmutableJS -We use Immutable JS to maintain our state immutable. -We found some really good tradeoffs while building Talk. - -[How to use ImmutableJS and how we use it with Talk](https://github.com/coralproject/talk/blob/frontenddocs/docs/frontend/IMMUTABLEJS.md) - - -## Test -[How we do testing at Coral with Talk](https://github.com/coralproject/talk/blob/frontenddocs/docs/frontend/DEBUG.md) - - -## Lint -For linting in Talk we use `eslint:recommended` - -You can find more info about the rules and best practices here: -http://eslint.org/docs/rules/#best-practices - -## Lint the code -```js -yarn lint -``` - - -## The Future of the Frontend -- Preact -- Reselect diff --git a/docs-tmp/frontend/REDUX.md b/docs-tmp/frontend/REDUX.md deleted file mode 100644 index f82d88520..000000000 --- a/docs-tmp/frontend/REDUX.md +++ /dev/null @@ -1,223 +0,0 @@ -# Redux -Redux is a predictable state container for JavaScript apps. - -To understand Redux we need to dive into a few concepts. - -- [Actions](#actions) -- [Action Creators](#actions) -- [Action Types](#actions) -- [Reducers](#reducers) -- [Stores](#store) - -## The three principles -These are the three principles to build Redux applications. The following are specified in the Redux Documentation [Three Principles · Redux](http://redux.js.org/docs/introduction/ThreePrinciples.html) - -### Single source of truth -The state of your whole application is stored in an object tree within a single store. We are going to represent the whole state of our application in a single Javascript Object. - -### State is read-only -The only way to change the state is to emit an action, an object describing what happened. - -### Changes are made with pure functions -To specify how the state tree is transformed by actions, you write pure reducers. - -## Actions -Actions describe that something happened in our application. They are payloads of information that send data to your store. __They are the only source of information for the store.__ - -Here is an example: -```js -const ADD_COMMENT = 'ADD_COMMENT'; - -{ - type: ADD_COMMENT, - comment: 'This is my comment.' -} -``` - -Actions are JavaScript objects. Every action must have a `type` property that indicates the type of action being performed. Types should be defined as constants. - -Once an app becomes big enough, you may want to move them into a separate module. We store them in a `contants.js` file. [auth.js Constants](https://github.com/coralproject/talk/blob/153193959cb4dfa5d8feaabb49811325f836ee68/client/coral-framework/constants/auth.js) - -```js -import { ADD_COMMENT, REMOVE_COMMENT } from './constants' -``` - -We can dispatch an action by using `dispatch()`. - -Our actions live within the `coral-framework/actions` folder. [talk/client/coral-framework/actions](https://github.com/coralproject/talk/tree/153193959cb4dfa5d8feaabb49811325f836ee68/client/coral-framework/actions) - -More about Actions: [Actions · Redux](http://redux.js.org/docs/basics/Actions.html) - -### Async Actions -For our async operations we dispatch three actions. - -- `_REQUEST` - -- `_SUCCESS` - -- `_FAILURE` - -#### Request -We use the postfix `_REQUEST` to know that the resource is being requested. - -#### Success -We use the postfix `_SUCCESS` to know that the resource response came back successfully. - -#### Failure -We use the postfix `_FAILURE` to know that the resource request failed. - -## Action Creators -Action Creators are functions that return actions. This makes it easier to use, portable and testable. - -```js -function addComment(comment) { - return { - type: ADD_COMMENT, - comment - } -} -``` - -So we can later trigger those actions by using `dispatch()` - -```js -dispatch(addComment(comment)) -dispatch(removeComment(comment.id)) -``` - - -## Dispatch Function -The `dispatch()` function can be accessed directly from the store as `store.dispatch()`, but more likely you'll access it using a helper like react-redux's`connect()`. - -We use `connect()`in our containers. More about this in Architecture. - -## Reducers -With Actions we describe that something happened in our application. But we don’t specify how our state will be modified with this change. - -In a Reducer we will specify how the state of our application change when an action has been dispatched. - -Here we also will want to specify the `initialState` - -Before building reducers it’s important to that you: - - Don’t mutate the state - - Return the previous state in the default case. - -Here is an example of an auth reducer: -```js -const initialState = { - isLoading: false, - loggedIn: false, - user: null, - error: '' -}; - -function auth (state = initialState, action) { - switch (action.type) { - case actions.CHECK_LOGIN_REQUEST: - return Object.assign({}, state, { - isLoading: true - }); - case actions.CHECK_LOGIN_SUCCESS: - return Object.assign({}, state, { - isLoading: false, - loggedIn: true, - user: action.user, - error: '' - }); - case actions.CHECK_LOGIN_FAILURE: - return Object.assign({}, state, { - isLoading: false, - error: action.error, - loggedIn: false, - user: null - }); - default: - return state - } -} -``` - -Notice that a reducer takes the `state` as first argument and when it’s not defined it returns the `initialState`. As a second argument it takes the `action`. We have our state and we have the action. This is the time to specify how we modify the state. - -### Reducers using ImmutableJS -We are using ImmutableJS to maintain our app state. Here is a guide on how to use ImmutableJS. - -This is how a simplified version of our [auth reducer](https://github.com/coralproject/talk/blob/153193959cb4dfa5d8feaabb49811325f836ee68/client/coral-framework/reducers/auth.js) looks like: -```js -const initialState = Map({ - isLoading: false, - loggedIn: false, - user: null, - error: ‘’ -}); - -function auth (state = initialState, action) { - switch (action.type) { - case CHECK_LOGIN_REQUEST: - return state - .set('isLoading', true); - case CHECK_LOGIN_SUCCESS: - return state - .set('isLoading', false) - .set('loggedIn', true) - .set('user', action.user) - .set('error', ''); - }); - case CHECK_LOGIN_FAILURE: - return state - .set('isLoading', false) - .set('error', action.error) - .set('loggedIn', false) - .set('user', null) - }); - default: - return state - } -} -``` - -Looks cleaner, right? - -It’s pretty easy to follow. Here it says if a `CHECK_LOGIN_REQUEST` action has been dispatched set the `isLoading` from our state to `true`. And we can show a tiny loader to let the user now we are requesting something to the server. - -Our actions live within the `coral-framework/reducers` folder. [talk/client/coral-framework/reducers ](https://github.com/coralproject/talk/tree/153193959cb4dfa5d8feaabb49811325f836ee68/client/coral-framework/reducers) - -More about Reducers: [Reducers · Redux](http://redux.js.org/docs/basics/Reducers.html) - -And the last thing we need to see is the __Store__ - -### Store - The `Store` is what holds the application state. Here we can access and update the state. - -It’s important to note that we will only have a single store in our application called `rootReducer` and we will use reducer composition instead of many stores. - -Here is an example of how create a store with [createStore()](http://redux.js.org/docs/api/createStore.html) using a reducer: -```js -import { createStore } from 'redux' -import authReducer from './auth' -let store = createStore(authReducer) -``` - -We do have a lot of stores so we will need to combine all our reducers with [combineReducers()](http://redux.js.org/docs/api/combineReducers.html) within a single store - -```js -import {combineReducers} from 'redux'; - -import authReducer from './auth' -import configReducer from './config' -import userReducer from './user' - -const rootReducer = combineReducers({ - authReducer, - configReducer, - userReducer - ... -}); -``` - -More about Stores: [Store · Redux](http://redux.js.org/docs/basics/Store.html) - -## Useful Resources -[Redux Documentation · Redux](http://redux.js.org/) -[Getting Started with Redux](https://egghead.io/courses/getting-started-with-redux) -[Usage with React · Redux](http://redux.js.org/docs/basics/UsageWithReact.html) diff --git a/docs-tmp/frontend/TEST.md b/docs-tmp/frontend/TEST.md deleted file mode 100644 index 0ce5a47bf..000000000 --- a/docs-tmp/frontend/TEST.md +++ /dev/null @@ -1,123 +0,0 @@ -# Test -How we do testing at Coral with Talk. - -We use Nightwatch and Selenium for our E2E tests and Enzyme for our React Components. - -## E2E tests -For our E2E Test we use Nightwatch and Selenium. - -#### Selenium Server Setup - -Selenium Server is a Java application which Nightwatch uses to connect to the various browsers. - -You will need to have the Java Development Kit (JDK) installed. -[Java SE Development Kit 8 - Downloads](http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html) - -The minimum required version is 7. -You can check this by running `java -version` - -#### Folder Structure - -``` -e2e/ - ├── pages - | ├── adminPage.js - | └── embedStreamPage.js - ├── reports - ├── tests - | ├── Admin - | ├── Commenter - | ├── Moderator - | └── Visitor - -``` - -#### Pages -Here we will have all the selectors and commands for a Page - -#### Reports -The folder that Nightwatch will use after running the tests - -#### Tests -Within `tests` folder we have 4 Folders and a couple of files. -`Admin`, `Commenter`, `Moderator`, `Visitor` contains all the group tests based on the user role and their actions. - -## Tests -The `pree2e` script will create 3 users: a Commenter, a Moderator, and an Admin - -* Commenter - * Login - - Post a comment - * Likes a comment - * Flag a comment - * Flag a username - * Gets Permalink - * Visits Permalink - -- Moderator - * Login - -- Admin - * Login - - Approve Comment - - Reject Comment - * Ban User - -- Visitor - * Tries to like a comment - * Tries to flag a comment - - Tries to flag a username - * Signs up - -## Run the tests -Run Talk -`dotenv yarn start` - -Run e2e tests -`yarn e2e` - - -## Advanced Nightwatch and Selenium Settings - -### Adding an Integration Environment -```json -{ - … - “test_settings” : { - “default” : { - “launch_url” : “http://localhost”, - “globals” : { - “myGlobalVar” : “some value”, - “otherGlobal” : “some other value” - } - }, - “integration” : { - “launch_url” : “http://staging.host”, - “globals” : { - “myGlobalVar” : “other value” - } - } - } -} -``` - -`nightwatch —env integration` - -### Chrome Options -[List of Chromium Command Line Switches « Peter Beverloo](http://peter.sh/experiments/chromium-command-line-switches/) - -## Tags -You'll notice that each test file starts with tags. This is useful to selectively target tests to run. - -_i.e nightwatch --tag login will only run login tests tagged with login_ -```js -module.exports { - '@tags': ['login'], - 'Test': browser => { - [...] - } -} -``` - -Source: http://nightwatchjs.org/guide#test-tags - diff --git a/docs-tmp/plugins/CLIENT.md b/docs-tmp/plugins/CLIENT.md deleted file mode 100644 index 3842fef77..000000000 --- a/docs-tmp/plugins/CLIENT.md +++ /dev/null @@ -1,272 +0,0 @@ -# Plugins -We can build plugins to extend the client side functionality of Talk. - -The ultimate goal of our client side plugin architecture is to allow developers -to build on existing concepts without needing to understand core code while -providing complete power and flexibility of javascript, css and html. - -* [Plugin Architecture](#plugin-architecture) -* Using our building block components -* [Reactions](#reactions) -* [Styling](#styling-plugins) - -Advanced users will quickly realize that our plugins have complete access to core code. If you would like to write advanced plugins that reach outside of our published API as described in this document, please see [our notes on experimental plugins](/plugins/EXPERIMENTAL.md). - -Under the hood our plugins are powered by *React*, *Redux* and *GraphQL*. We can also build them with simple vanilla javascript. - -## Plugin Architecture - -The plugins live in the `/plugins` folder. Each plugin must have an `index.js` file and two folders `client` and `server`. - -### The Client Folder -The frontend of our plugin lives inside the `client` folder. The `client` folder must have an `index.js` file that exports the configuration of our plugin. - -``` -my-plugin/ - ├── client/ - │ └── index.js <-- index for client side functionality - ├── server/ - └── index.js <-- base plugin index -``` - -For now our base plugin `index.js` file should look like this: - -```js -export default { - // We will add more here later. -}; -``` - -### Creating a Component - -We can add our components (or any other javascript code) within the `client` folder. - -``` -my-plugin/ - ├── client/ - │ ├── MyComponent.js - │ └── index.js - ├── server/ - └── index.js -``` - -Our component could look like this: - -```js -import React, {Component} from 'react'; - -class MyButton extends Component { - render() { - return ; - } -} - -export default MyButton; -``` - -Here we create a component that renders a `button`. Now that we created our component we need to specify where it should get injected within Talk! - -To tell Talk where that Component should get injected we need to specify which *Slots* to insert it into. - -```js -import React from 'react'; -export default = () => ; -``` - -### Slots -In Talk we have defined specific *Slots* where we can inject components. - -Here is how we specify our slots config in `my-plugin/index.js` - -```js -import MyButton from './MyButton'; - -export default { - slots: { - commentDetail: [MyButton] - } -}; -``` - -Here I’m specifying that the MyComponent Component will take place within the `commentDetail` in Talk. - -`commentDetail` it’s a specific slot in the CommentStream. It means that it will be embedded inside de comment detail. - -Slots properties take an`Array` so we can add as many components as we want. - -## Building Blocks (TBD) - -`Note: the concepts in this section are still to be implemented. Code samples are for discussion and may change.` - -In order to allow you to build more complex plugins, we have wrapped some of our functionality in higher order components that expose a simple api. - -## Reactions - -Reactions provide users the ability to 'like', 'respect', etc... comments. - -Note: some server side work will need to accompany this client side component. See the like and respect plugins as examples. - -### Building Reactions - -#### Our `client/index.js` : - -```js -import LoveButton from './LoveButton'; - -export default { - slots: { - commentReactions: [LoveButton] - } -}; - -``` -In this example we add our reaction component to the `commentReaction` Slot - -#### Our Reaction component: - -```js -import React from 'react'; -import {withReaction} from 'coral-plugin-api'; - -class LoveButton extends React.Component { - handleClick = () => { - const { - postReaction, - deleteReaction, - alreadyReacted - } = this.props; - - if (alreadyReacted()) { - deleteReaction(); - } else { - postReaction(); - } - }; - - render() { - const {count} = this.props; - return ( - - ); - } -} - -export default withReaction('love')(LoveButton); -``` - - -This feature introduces `withReaction` HOC. `withReaction` takes, as argument, a reaction string and it allows our component to receive specific props for handling reactions. - - * `postReaction` - Posts the reaction - - * `deleteReaction` - Removes the reaction - - * `alreadyReacted` - A function that returns a boolean. - - * `count` - The reaction count - - -For full reference: Please, check `coral-plugin-love`: [LoveButton.js](https://github.com/coralproject/talk/blob/master/plugins/coral-plugin-love/client/LoveButton.js) - -### Comment Stream - -Comment streams may be created with filtering and ordering in place: - -* filter by user -* filter by tag -* sort by date ascending / descending - -### Comment Commit hooks - -// docs for the pre/post comment submit commit hooks - -### Mod Queues - -Moderation queues can be added via configuration objects passed in through plugins. - -Basic mod queues will resemble the current moderation queues but can be generated from different lists of comments. - -* filter by user tag -* filter by comment tag -* filter by comment status -* Custom queries (paired with back end plugins that provide queries to get the data) - -#### Advanced mod queues - -Advanced mod queues can be created giving plugin authors the power to create the cards that appear in the queue, create actions and custom buttons, etc... - -### Custom Configuration - -Plugins may rely on configuration options that admins/moderators can set in the Configuration section. - -Basic settings can be added via json configuration in a plugin. - -* Setting headline -* Setting description -* Setting input type -* Default value -* Variable name - -#### Advanced Custom Configuration (low prioritiy) - -Users can inject configuration interfaces that they create into the configuration allowing for more advanced configuration. - - -## Styling Plugins -Talk uses CSS Modules. This basically means that you can also add your CSS Module to your plugin without colliding with the rest of Talk! - -##### My Component -```js -import styles from './style.css'; - -class MyCoralButton extends Component { - render() { - return ; - } -} -```` - -Our `style.css` should could look like this. -```css - -.button { - background: coral; - border-radius: 3px; -} -``` - -## Plugin Hooks -The plugins injected in the CommentBox such as `commentInputDetailArea` will inherit through props tools for handling hooks. - -### Available hook types: -`preSubmit` : To perform actions before submitting the comment. -`postSubmit` : To perform actions after submitting the comment. - -### Register Hooks -`registerHook` is a function that takes: the hook type, a hook function and returns the hook data. - -#### Usage: -```js - this.addCommentTagHook = this.props.registerHook('postSubmit', (data) => { - const {comment} = data.createComment; - this.props.addCommentTag({ - id: comment.id, - tag: 'OFF_TOPIC' - }); - }); -``` - -### Unregister Hooks - -`unregisterHook` will remove the hook. - -```js - this.props.unregisterHook(this.addCommentTagHook); -``` - -### The server folder and the index file -Read more about the `/server` and how to extend Talk here. -[talk/PLUGINS.md at master · coralproject/talk · GitHub](https://github.com/coralproject/talk/blob/master/PLUGINS.md) diff --git a/docs-tmp/plugins/EXPERIMENTAL.md b/docs-tmp/plugins/EXPERIMENTAL.md deleted file mode 100644 index 895be5900..000000000 --- a/docs-tmp/plugins/EXPERIMENTAL.md +++ /dev/null @@ -1,102 +0,0 @@ -# Experimental plugins - -Talk plugins are, in essence, small programs that hook into the core application in a variety of ways. Ultimately, this code can do anything that javascript is capable of. In addition, plugins can import any core code to hook into talk at any level. - -If you want to write plugins that integrate with core code beyond the api described in [PLUGINS.md](PLUGINS.md), please keep the following things in mind: - -* core code may change and break your plugin -* you may introduce inefficiencies with your plugin that could hurt performance/crash Talk -* you may cause bugs in other areas of Talk - -If you'd like to build a supported plugin but don't have the hooks you need, please file an issue on this repo and we can discuss deepening the supported plugin api! - -With that said, here's some of the prime experimental integration points: - -## Reducers and Actions : Redux - -Talk is powered by Redux and our plugins can too! Our plugins can have their own reducers and actions. - -```js -import MyButton from './MyButton'; -import reducer from './reducer'; - -export default { - slots: { - commentDetail: [MyButton], - }, - reducer -}; -``` - -## Import Actions from Talk -We can easily trigger `Talk` actions in our plugin Components. - -```js -import React, {Component} from 'react'; -import {connect} from 'react-redux'; -import {bindActionCreators} from 'redux'; -import {addTag, removeTag} from 'coral-plugin-commentbox/actions'; - -class MyButton extends Component { - render() { - return ; - } -} - -const mapStateToProps = ({commentBox}) => ({commentBox}); - -const mapDispatchToProps = dispatch => - bindActionCreators({addTag, removeTag}, dispatch); - -export default connect(mapStateToProps, mapDispatchToProps)(OffTopicCheckbox); -``` - -## ESlint and Babel -In talk we use `eslint:recommended` and Babel with the latest ECMAScript Features. But you can use your own! -While building your plugin you need to specify a `.eslintrc.json` file and a`.babelrc` file. - -#### `.eslintrc.json` -```json -{ - "env": { - "browser": true, - "es6": true, - "mocha": true - }, - "parserOptions": { - "sourceType": "module", - "ecmaFeatures": { - "experimentalObjectRestSpread": true, - "jsx": true - } - }, - "parser": "babel-eslint", - "plugins": [ - "react" - ], - "rules": { - "react/jsx-uses-react": "error", - "react/jsx-uses-vars": "error", - "no-console": ["warn", { "allow": ["warn", "error"] }] - } -} -```` - - -#### `. babelrc ` -```json -{ - "presets": [ - "es2015" - ], - "plugins": [ - "add-module-exports", - "transform-class-properties", - "transform-decorators-legacy", - "transform-object-assign", - "transform-object-rest-spread", - "transform-async-to-generator", - "transform-react-jsx" - ] -} -```` diff --git a/docs-tmp/plugins/README.md b/docs-tmp/plugins/README.md deleted file mode 100644 index ff869b3b0..000000000 --- a/docs-tmp/plugins/README.md +++ /dev/null @@ -1,163 +0,0 @@ -# Plugins - -The talk platform ships with a plugin architecture featuring that allows -developers to: - -* extend or replace server side graph, rest and auth functionality -* inject functionality into front end embeds and the admin application -* create new front end build targets for embedding -* build plugins from local folders or published via npm/yarn -* deploy plugins throughout the application lifecycle - -## Basic Concepts - -All plugin code lives in the `/plugin` directory. - -Each plugin is provided in a single folder named after the plugin. - -### Naming a Plugin - -Each plugin has a name which must be globally unique. Plugins with name -collisions will not be able to be run together in an instance of Talk. - -If you are creating a plugin for the open source community, we recommend the -following naming convention: - -``` -coral-talk-plugin-[name] -``` - -If you are creating a variant of a plugin for an organization, we recommend -adding the organization's name: - -``` -coral-talk-plugin-[name]-[organization] -``` - -## Plugin Registration - -In order for a Plugin to be active it must be _registered_. - -The parsing order for the plugin registration is as follows: - -- `TALK_PLUGINS_JSON` environment variable -- `plugins.json` file -- `plugins.default.json` file - -If you need to "disable all plugins", you can simply provide `{}` as the -contents of `process.env.TALK_PLUGINS_JSON` or the `plugins.json`. - -### Local Plugins - -The format for plugins.json looks like this: - -```json -{ - "server": [ - "coral-plugin-respect", - "coral-plugin-facebook-auth" - ], - "client": [ - "coral-plugin-respect" - ] -} -``` - -The `server` array specifies which plugins will be loaded when the server -starts. The `client` array specifies which plugins will be built into the -front end bundles. - -Where we have a `server` key with an array of plugins that match the folder -name in the `plugins/` folder. For example, the above config would -require a plugin from `plugins/coral-plugin-respect` and -`plugins/coral-plugin-facebook-auth`. - -### Published Plugins - -If the package is external (available on NPM) you can specify the string for -the version by using an object instead, for example: - -```json -{ - "server": [ - {"people": "^1.2.0"} - ] -} -``` - -### Resolving Plugins - -External plugins can be _resolved_ by running: - -```bash -./bin/cli plugins reconcile -``` - -This achieves two things: - -1. It will traverse into local plugin folders and install their dependencies. - _Note that if the plugin is already installed and available in the node_modules folder, it will not be - fetched again unless there is a version mismatch._ This will result in the - project `package.json` and `yarn.lock` files to be modified, this is normal as - this ensures that repeated deployments (with the same config) will have the - same config, these changes should not be committed to source control. -2. It will seek out dependencies that are listed in the object notation and try - to install them from npm. - -## Plugin Dependencies - -You may also include additional external dependencies in your local packages by -specifying a `package.json` at your plugin root which will result in a -`node_modules` folder being generated at the plugin root with your specific -dependencies. - -## Deployment Solutions - -Plugins can be deployed with a production instance of Talk. - -### Source - -Source deployments can just modify the `plugins.json` file and include any -local plugins into the `plugins/` directory. After including the config, you -need to reconcile the plugins and build the static assets: - -```bash -# get plugin dependancies and remote plugins -./bin/cli plugins reconcile - -# build staic assets (including enabled client side plugins) -yarn build -``` - -Then the application can be started as is. - -If you are working on a plugin, our changes to the plugins will be picked up -naturally by our development scripts: - -```bash -# Watch for changes to client files and rebuild -yarn build-watch -``` - -```bash -# Watch for changes to server files and restart -yarn dev-start -``` - - -### Docker - -If you deploy using Docker, you can extend from the `*-onbuild` image, an -example `Dockerfile` for your project could be: - -```Dockerfile -FROM coralproject/talk:latest-onbuild -``` - -Where the directory for your instance would contain a `plugins.json` file -describing the plugin requirements and a `plugins` directory containing any -other local plugins that should be included. - -Onbuild triggers will execute when the image is building with your custom -configuration and will ensure that the image is ready to use by building all -assets inside the image as well. diff --git a/docs-tmp/plugins/SERVER.md b/docs-tmp/plugins/SERVER.md deleted file mode 100644 index cb39096be..000000000 --- a/docs-tmp/plugins/SERVER.md +++ /dev/null @@ -1,382 +0,0 @@ -# Server Plugins - -### The Client Folder -The frontend of our plugin lives inside the `client` folder. The `client` folder must have an `index.js` file that exports the configuration of our plugin. - -``` -my-plugin/ - ├── client/ - │ └── ... <-- client side plugin files - ├── server/ - │ └── index.js <-- index for server side functionality - └── index.js <-- base plugin index -``` - -## Specification - -Each plugin should export a single object with all hooks available on it. - -_**Note: You will have access to the whole core and other plugin's typeDefs, -context, loaders, mutators, resolvers, hooks. This is intentional, as it -encourages composing plugins to merge functionality, like a Slack plugin which -provides a Slack notify context function as well as having the loader for -comments.**_ - -The following are the hooks available: - -### GraphQL hooks - -#### Field: `typeDefs` - -```graphql -enum COLOUR { - RED - BLUE -} - -type Person { - name: String! - colour: COLOUR! -} - -type RootMutation { - createPerson(name: String!): Person -} - -type RootQuery { - people: [Person!] -} - -type Subscription { - leader: Person -} -``` - -Thanks to [gql-merge](https://www.npmjs.com/package/gql-merge) the contents of -`typeDefs` should be a string that will be _merged_ with the existing type -definitions. `enum`'s will be appended to, types will be appended, and new types -will be added. - -#### Field: `context` - -```js -{ - Slack: (context) => ({ - notify: (message) => { - // return a promise after we're done sending notifications. - } - }) -} -``` - -Any property provided here will be added to the context parameter available -inside all resolvers, loaders, mutators, and of course, other context based -plugins. - -The top level item must accept a context for the request which it should use to -configure the context plugin before it would be mounted at `context.plugins`. -This plugin above would mount at: `context.plugins.Slack`, or, if you're using -[object destructuring](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment), `{plugins: {Slack}}`. - -#### Field: `loaders` - -```js -(context) => ({ - People: { - load: () => db.people.find({user: context.user}) - } -}) -``` - -Loaders should be provided as a function which returns a map which is used in -the resolvers function. These must return a promise or a value. - -#### Field: `mutators` - -```js -(context) => ({ - People: { - create: (name) => { - return db.people.insert({user: context.user, name}); - } - } -}) -``` - -Mutators should be provided as a function which returns a map which is used in -the resolvers function. These must return a promise or a value. - -#### Field: `resolvers` - -```js -{ - Person: { - name(obj, args, context) { - return obj.name; - }, - colour(obj, args, context) { - // Bill likes the colour red, everyone else likes blue. - return obj.name === 'bill' ? 'RED' : 'BLUE'; - } - }, - RootQuery: { - people(obj, args, {loaders: {People}}) { - return People.load(); - } - }, - RootMutation: { - createPerson(obj, {name}, {mutators: {People}}) { - return People.create(name); - } - } -} -``` - -Should return a resolver map as described in the -[Apollo Docs](http://dev.apollodata.com/tools/graphql-tools/resolvers.html#Resolver-map). - -This will merge with the existing resolvers in core and from previous plugins. - -#### Field: `hooks` - -```js -{ - RootMutation: { - createPerson: { - post: async (obj, args, {plugins: {Slack}}, info, person) { - if (!person) { - return person; - } - - await Slack.notify(`A new person just was created with name ${person.name}`); - - return person; - } - } - } -} -``` - -Hooks here are pretty special, for each resolver field, you can specify a -pre/post hook that will execute pre and post field resolution. - -If your post function accepts four parameters, then it can modify the field -result. It is *required* that the function resolves a promise (or returns) with -the modified value or simply the original if you didn't modify it. - -#### Field: `setupFunctions` - -```js -setupFunctions: { - leader: (options, args) => ({ - leader: { - filter: (person) => person.place === 1 - }, - }), -} -``` - -Setup functions allow you to create filters that control which pubsub.publish() events -send data to the client. If the type in question contains args, clients may subscribe using those arguments to further filter their subscription. - -For more information, see the [Apollo Docs](https://github.com/apollographql/graphql-subscriptions). - -### Routes - -#### Field: `router` - -```js -(router) => { - router.get('/api/v1/people', (req, res) => { - res.json({people: [{name: 'Bob'}]}); - }); -} -``` - -The Router hook allows you to create a function that accepts the base express -router where you can mount any amount of middleware/routes to do any form of -action needed by external applications. - -### Authorization middleware - -The following example creates the requisite callback route and passport -strategy needed to enable Facebook Authorization: - -```js -const authorization = require('middleware/authorization'); - -module.exports = { - router(router) { - router.get('/api/v1/people', authorization.needed('ADMIN'), (req, res) => { - res.json({people: [{name: 'SECRET PEOPLE'}]}); - }); - } -} -``` - -#### Field: `passport` - -```js -const FacebookStrategy = require('passport-facebook').Strategy; -const UsersService = require('services/users'); -const {ValidateUserLogin, HandleAuthPopupCallback} = require('services/passport'); - -module.exports = { - passport(passport) { - passport.use(new FacebookStrategy({ - clientID: process.env.TALK_FACEBOOK_APP_ID, - clientSecret: process.env.TALK_FACEBOOK_APP_SECRET, - callbackURL: `${process.env.TALK_ROOT_URL}/api/v1/auth/facebook/callback`, - passReqToCallback: true, - profileFields: ['id', 'displayName', 'picture.type(large)'] - }, async (req, accessToken, refreshToken, profile, done) => { - - let user; - try { - user = await UsersService.findOrCreateExternalUser(profile); - } catch (err) { - return done(err); - } - - return ValidateUserLogin(profile, user, done); - })); - }, - router(router) { - - // Note that we have to import the passport instance here, it is - // instantiated after all the strategies have been mounted. - const {passport} = require('services/passport'); - - /** - * Facebook auth endpoint, this will redirect the user immediatly to facebook - * for authorization. - */ - router.get('/facebook', passport.authenticate('facebook', {display: 'popup', authType: 'rerequest', scope: ['public_profile']})); - - /** - * Facebook callback endpoint, this will send the user a html page designed to - * send back the user credentials upon sucesfull login. - */ - router.get('/facebook/callback', (req, res, next) => { - - // Perform the facebook login flow and pass the data back through the opener. - passport.authenticate('facebook', HandleAuthPopupCallback(req, res, next))(req, res, next); - }); - } -}; -``` - -## Full Example - -Contents of `plugins.json`: - -```json -{ - "server": [ - "people" - ] -} -``` - -Located in `plugins/people/index.js`: - -```js -module.exports = { - typeDefs: ` - enum COLOUR { - RED - BLUE - } - - type Person { - name: String! - colour: COLOUR! - } - - type RootMutation { - createPerson(name: String!): Person - } - - type RootQuery { - people: [Person!] - } - - type Subscription { - leader: Person - } - `, - context: { - Slack: () => ({ - notify: (message) => { - // return a promise after we're done sending notifications. - } - }) - }, - loaders: ({user}) => ({ - People: { - load: () => db.people.find({user}) - } - }), - mutators: ({user}) => ({ - People: { - create: (name) => { - return db.people.insert({user, name}); - } - } - }), - resolvers: { - Person: { - name(obj, args, context) { - return obj.name; - }, - colour(obj, args, context) { - // Bill likes the colour red, everyone else likes blue. - return obj.name === 'bill' ? 'RED' : 'BLUE'; - } - }, - RootQuery: { - people(obj, args, {loaders: {People}}) { - return People.load(); - } - }, - RootMutation: { - createPerson(obj, {name}, {mutators: {People}}) { - return People.create(name); - } - } - }, - hooks: { - RootMutation: { - createPerson: { - post: async (obj, args, {plugins: {Slack}}, info, person) => { - if (!person) { - return person; - } - - await Slack.notify(`A new person just was created with name ${person.name}`); - - return person; - } - } - } - }, - setupFunctions: { - leader: (options, args) => ({ - leader: { - filter: (person) => person.place === 1 - } - } - } -}; - -``` - -## API - -You can access any API available inside the talk directory in a plugin by simply -importing the file relative to the talk project root. An example would be if you -wanted to import the `MetadataService`, you would simply write: - -```javascript -const MetadataService = require('services/metadata'); -``` From 82c5d140bef2b01c335be99f74a2327e7ef23c56 Mon Sep 17 00:00:00 2001 From: Andrew Losowsky Date: Fri, 26 May 2017 12:30:26 -0400 Subject: [PATCH 59/78] added iphone 7 support in the list --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 718847d9e..ffb54a4fd 100644 --- a/README.md +++ b/README.md @@ -58,6 +58,8 @@ alternative methods of loading configuration during development. - iPad - iPad Pro +- iPhone 7 Plus +- iPhone 7 - iPhone 6 Plus - iPhone 6 - iPhone 5 From 05e5200e79852a6a33b3bf40a7af7eab6fdc70ba Mon Sep 17 00:00:00 2001 From: IAmSamHankins Date: Fri, 26 May 2017 12:48:15 -0400 Subject: [PATCH 60/78] moderation panel design cleanup PT 144120491 --- client/coral-admin/src/components/ui/Header.css | 3 +++ .../ModerationQueue/components/CommentCount.css | 7 ++++--- .../components/ModerationHeader.js | 2 +- .../ModerationQueue/components/styles.css | 16 +++++++++++----- client/coral-embed-stream/style/default.css | 2 +- 5 files changed, 20 insertions(+), 10 deletions(-) diff --git a/client/coral-admin/src/components/ui/Header.css b/client/coral-admin/src/components/ui/Header.css index eba94d892..7cb68ecbf 100644 --- a/client/coral-admin/src/components/ui/Header.css +++ b/client/coral-admin/src/components/ui/Header.css @@ -73,6 +73,8 @@ font-weight: 500; background-color: transparent; transition: background-color 200ms; + font-weight: 100; + letter-spacing: .8; &:hover { background-color: #232323; @@ -80,6 +82,7 @@ &.active { background-color: #232323; + font-weight: 400; } } diff --git a/client/coral-admin/src/containers/ModerationQueue/components/CommentCount.css b/client/coral-admin/src/containers/ModerationQueue/components/CommentCount.css index 6ca30866a..b684d0f4a 100644 --- a/client/coral-admin/src/containers/ModerationQueue/components/CommentCount.css +++ b/client/coral-admin/src/containers/ModerationQueue/components/CommentCount.css @@ -3,12 +3,13 @@ background: #989797; margin: 2px; vertical-align: middle; - padding: 4px 7px; + padding: 1px 7px; border-radius: 2px; - margin-left: 10px; + margin-left: 2px; line-height: 20px; box-sizing: border-box; - height: 27px; + height: 21px; right: 0; margin-top: -2px; + font-size: 12px; } diff --git a/client/coral-admin/src/containers/ModerationQueue/components/ModerationHeader.js b/client/coral-admin/src/containers/ModerationQueue/components/ModerationHeader.js index 5d6e8b9de..1a982a68c 100644 --- a/client/coral-admin/src/containers/ModerationQueue/components/ModerationHeader.js +++ b/client/coral-admin/src/containers/ModerationQueue/components/ModerationHeader.js @@ -10,7 +10,7 @@ const ModerationHeader = (props) => ( props.asset ?
    All Streams - + {props.asset.title} diff --git a/client/coral-admin/src/containers/ModerationQueue/components/styles.css b/client/coral-admin/src/containers/ModerationQueue/components/styles.css index 52800fe43..bfc79355d 100644 --- a/client/coral-admin/src/containers/ModerationQueue/components/styles.css +++ b/client/coral-admin/src/containers/ModerationQueue/components/styles.css @@ -18,18 +18,21 @@ .tab { flex: 1; - color: white; + color: #EEEEEE; text-transform: capitalize; - font-weight: 500; + font-weight: 100; font-size: 15px; letter-spacing: 1px; transition: border-bottom 200ms; + padding: 0px 5px; + margin-right: 30px; } .active { color: white; box-sizing: border-box; - border-bottom: solid 5px #F36451; + border-bottom: solid 4px #F36451; + font-weight: 400; } .active > span { @@ -97,7 +100,7 @@ span { flex: 1; color: white; text-transform: capitalize; - font-weight: 500; + font-weight: 400; font-size: 15px; letter-spacing: 1px; transition: opacity 200ms; @@ -371,6 +374,7 @@ span { padding: 10px 15px; box-sizing: border-box; border-radius: 2px; + bor box-shadow: 0 2px 2px 0 rgba(0,0,0,.14), 0 3px 1px -2px rgba(0,0,0,.2), 0 1px 5px 0 rgba(0,0,0,.12); > div { @@ -388,6 +392,7 @@ span { font-size: 13px; letter-spacing: 0.7px; font-weight: 400; + border-bottom: 0px; } label { @@ -421,7 +426,8 @@ span { .tabIcon { position: relative; - top: 7px; + top: 2px; + font-size: 16px; } .username { diff --git a/client/coral-embed-stream/style/default.css b/client/coral-embed-stream/style/default.css index 91b149f7c..04b2536a3 100644 --- a/client/coral-embed-stream/style/default.css +++ b/client/coral-embed-stream/style/default.css @@ -242,7 +242,7 @@ hr { margin-bottom: 7px; font-size: 16px; font-weight: 100; - line-height: 1.4; + line-height: 1.3; } .coral-plugin-author-name-text { From 99a9154d4053a607909b613a040e8a714e901bf9 Mon Sep 17 00:00:00 2001 From: Chi Vinh Le Date: Sat, 27 May 2017 00:26:04 +0700 Subject: [PATCH 61/78] Remove unused dependency --- package.json | 1 - yarn.lock | 4 ---- 2 files changed, 5 deletions(-) diff --git a/package.json b/package.json index b1eb180ed..11634fa8d 100644 --- a/package.json +++ b/package.json @@ -65,7 +65,6 @@ "csurf": "^1.9.0", "dataloader": "^1.3.0", "debug": "^2.6.3", - "detect-browser": "^1.7.0", "dotenv": "^4.0.0", "ejs": "^2.5.6", "env-rewrite": "^1.0.2", diff --git a/yarn.lock b/yarn.lock index cc1ddd018..3d01f098e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2422,10 +2422,6 @@ destroy@~1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" -detect-browser@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/detect-browser/-/detect-browser-1.7.0.tgz#11758cd6aa07d76c25784036d19154ae0392c3b3" - detect-indent@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" From a7cdcb0bf7f5d6d8918da9c71317886b23e7f3f9 Mon Sep 17 00:00:00 2001 From: Chi Vinh Le Date: Sat, 27 May 2017 00:54:36 +0700 Subject: [PATCH 62/78] Fix request options and use better filename --- client/coral-admin/src/actions/assets.js | 2 +- client/coral-admin/src/actions/auth.js | 2 +- client/coral-admin/src/actions/community.js | 2 +- client/coral-admin/src/actions/install.js | 2 +- client/coral-admin/src/actions/settings.js | 2 +- client/coral-admin/src/actions/users.js | 2 +- client/coral-framework/actions/asset.js | 2 +- client/coral-framework/actions/auth.js | 2 +- client/coral-framework/actions/user.js | 2 +- .../helpers/{response.js => request.js} | 13 +++++-------- 10 files changed, 14 insertions(+), 17 deletions(-) rename client/coral-framework/helpers/{response.js => request.js} (82%) diff --git a/client/coral-admin/src/actions/assets.js b/client/coral-admin/src/actions/assets.js index f5c2f848a..8a18a8e3f 100644 --- a/client/coral-admin/src/actions/assets.js +++ b/client/coral-admin/src/actions/assets.js @@ -8,7 +8,7 @@ import { UPDATE_ASSETS } from '../constants/assets'; -import coralApi from '../../../coral-framework/helpers/response'; +import coralApi from '../../../coral-framework/helpers/request'; /** * Action disptacher related to assets diff --git a/client/coral-admin/src/actions/auth.js b/client/coral-admin/src/actions/auth.js index 69e7d4303..57871b79d 100644 --- a/client/coral-admin/src/actions/auth.js +++ b/client/coral-admin/src/actions/auth.js @@ -1,6 +1,6 @@ import bowser from 'bowser'; import * as actions from '../constants/auth'; -import coralApi from 'coral-framework/helpers/response'; +import coralApi from 'coral-framework/helpers/request'; import * as Storage from 'coral-framework/helpers/storage'; import {handleAuthToken} from 'coral-framework/actions/auth'; diff --git a/client/coral-admin/src/actions/community.js b/client/coral-admin/src/actions/community.js index 9a8743762..36b9ffb0a 100644 --- a/client/coral-admin/src/actions/community.js +++ b/client/coral-admin/src/actions/community.js @@ -14,7 +14,7 @@ import { HIDE_SUSPENDUSER_DIALOG } from '../constants/community'; -import coralApi from '../../../coral-framework/helpers/response'; +import coralApi from '../../../coral-framework/helpers/request'; export const fetchAccounts = (query = {}) => (dispatch) => { diff --git a/client/coral-admin/src/actions/install.js b/client/coral-admin/src/actions/install.js index 21ff58de1..15413e220 100644 --- a/client/coral-admin/src/actions/install.js +++ b/client/coral-admin/src/actions/install.js @@ -1,4 +1,4 @@ -import coralApi from 'coral-framework/helpers/response'; +import coralApi from 'coral-framework/helpers/request'; import * as actions from '../constants/install'; import validate from 'coral-framework/helpers/validate'; import errorMsj from 'coral-framework/helpers/error'; diff --git a/client/coral-admin/src/actions/settings.js b/client/coral-admin/src/actions/settings.js index b0530e77e..65c200420 100644 --- a/client/coral-admin/src/actions/settings.js +++ b/client/coral-admin/src/actions/settings.js @@ -1,4 +1,4 @@ -import coralApi from '../../../coral-framework/helpers/response'; +import coralApi from '../../../coral-framework/helpers/request'; export const SETTINGS_LOADING = 'SETTINGS_LOADING'; export const SETTINGS_RECEIVED = 'SETTINGS_RECEIVED'; diff --git a/client/coral-admin/src/actions/users.js b/client/coral-admin/src/actions/users.js index 2642db90d..e888d5b74 100644 --- a/client/coral-admin/src/actions/users.js +++ b/client/coral-admin/src/actions/users.js @@ -1,4 +1,4 @@ -import coralApi from '../../../coral-framework/helpers/response'; +import coralApi from '../../../coral-framework/helpers/request'; import * as userTypes from '../constants/users'; /** diff --git a/client/coral-framework/actions/asset.js b/client/coral-framework/actions/asset.js index 129cd1c3c..9c0081470 100644 --- a/client/coral-framework/actions/asset.js +++ b/client/coral-framework/actions/asset.js @@ -1,5 +1,5 @@ import * as actions from '../constants/asset'; -import coralApi from '../helpers/response'; +import coralApi from '../helpers/request'; import {addNotification} from '../actions/notification'; import I18n from 'coral-framework/modules/i18n/i18n'; diff --git a/client/coral-framework/actions/auth.js b/client/coral-framework/actions/auth.js index 2deda5f1d..f714f1fac 100644 --- a/client/coral-framework/actions/auth.js +++ b/client/coral-framework/actions/auth.js @@ -3,7 +3,7 @@ import {pym} from 'coral-framework'; import bowser from 'bowser'; import * as actions from '../constants/auth'; import * as Storage from '../helpers/storage'; -import coralApi, {base} from '../helpers/response'; +import coralApi, {base} from '../helpers/request'; const lang = new I18n(translations); import translations from './../translations'; diff --git a/client/coral-framework/actions/user.js b/client/coral-framework/actions/user.js index 910fe0865..95d4116a6 100644 --- a/client/coral-framework/actions/user.js +++ b/client/coral-framework/actions/user.js @@ -1,5 +1,5 @@ import {addNotification} from '../actions/notification'; -import coralApi from '../helpers/response'; +import coralApi from '../helpers/request'; import * as actions from '../constants/auth'; import I18n from 'coral-framework/modules/i18n/i18n'; diff --git a/client/coral-framework/helpers/response.js b/client/coral-framework/helpers/request.js similarity index 82% rename from client/coral-framework/helpers/response.js rename to client/coral-framework/helpers/request.js index ac6e53cf9..0e15003e1 100644 --- a/client/coral-framework/helpers/response.js +++ b/client/coral-framework/helpers/request.js @@ -1,4 +1,6 @@ import bowser from 'bowser'; +import * as Storage from './storage'; +import merge from 'lodash/merge'; const buildOptions = (inputOptions = {}) => { const defaultOptions = { @@ -10,18 +12,13 @@ const buildOptions = (inputOptions = {}) => { credentials: 'same-origin' }; - let options = { - ...defaultOptions, - ...inputOptions - }; + let options = merge({}, defaultOptions, inputOptions); if (!bowser.safari && !bowser.ios) { - let authorization = localStorage.getItem('token'); + let authorization = Storage.getItem('token'); if (authorization) { - options.headers = { - Authorization: `Bearer ${authorization}` - }; + options.headers.Authorization = `Bearer ${authorization}`; } } From 52b3dcab43d0f8c48ac5e542996c5c8ab6069f5a Mon Sep 17 00:00:00 2001 From: Chi Vinh Le Date: Sat, 27 May 2017 01:05:12 +0700 Subject: [PATCH 63/78] Fix changing username not updating --- plugins/coral-plugin-auth/client/components/UserBox.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/coral-plugin-auth/client/components/UserBox.js b/plugins/coral-plugin-auth/client/components/UserBox.js index a4a0e1c99..d8adf2380 100644 --- a/plugins/coral-plugin-auth/client/components/UserBox.js +++ b/plugins/coral-plugin-auth/client/components/UserBox.js @@ -25,7 +25,7 @@ const UserBox = ({loggedIn, user, logout, onShowProfile}) => ( const mapStateToProps = ({auth, user}) => ({ loggedIn: auth.toJS().loggedIn, - user: user.toJS() + user: auth.toJS().user }); const mapDispatchToProps = dispatch => From 54e7956af589341364d4c6bb09f731e4fd3ffaf3 Mon Sep 17 00:00:00 2001 From: Kim Gardner Date: Fri, 26 May 2017 15:08:47 -0400 Subject: [PATCH 64/78] Update default plugins that ship with Coral core --- plugins.default.json | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/plugins.default.json b/plugins.default.json index b3443af48..3f64a383b 100644 --- a/plugins.default.json +++ b/plugins.default.json @@ -1,9 +1,13 @@ { "server": [ "coral-plugin-respect", - "coral-plugin-facebook-auth" + "coral-plugin-like", + "coral-plugin-facebook-auth", + "coral-plugin-auth" ], "client": [ - "coral-plugin-respect" + "coral-plugin-respect", + "coral-plugin-like", + "coral-plugin-auth" ] } From 8713a2ae875493a45f1dfe1068d88baf3eadcfa4 Mon Sep 17 00:00:00 2001 From: Chi Vinh Le Date: Sat, 27 May 2017 02:08:54 +0700 Subject: [PATCH 65/78] Enable Linting --- .eslintignore | 5 ++++ .../client/components/ChangeUsername.js | 14 +++++----- .../client/components/FakeComment.js | 3 ++- .../client/components/ForgotContent.js | 4 +-- .../client/components/SignInButton.js | 2 +- .../client/components/SignInContainer.js | 27 ++++++++++--------- .../client/components/SignUpContent.js | 2 +- .../client/components/UserBox.js | 6 ++--- plugins/coral-plugin-auth/client/index.js | 3 ++- plugins/coral-plugin-auth/index.js | 3 ++- .../client/components/LikeButton.js | 17 ++++++------ .../client/containers/LikeButton.js | 27 ++++++++++--------- .../coral-plugin-love/client/LoveButton.js | 2 +- plugins/coral-plugin-love/index.js | 8 +++--- .../coral-plugin-mod/client/components/Box.js | 5 ++-- .../client/components/Container.js | 6 ++--- plugins/coral-plugin-mod/index.js | 4 +-- .../client/components/OffTopicCheckbox.js | 7 +++-- .../client/components/OffTopicTag.js | 4 +-- 19 files changed, 78 insertions(+), 71 deletions(-) diff --git a/.eslintignore b/.eslintignore index fc0d50a25..96e49da53 100644 --- a/.eslintignore +++ b/.eslintignore @@ -3,5 +3,10 @@ client/lib **/*.html plugins/* !plugins/coral-plugin-facebook-auth +!plugins/coral-plugin-auth !plugins/coral-plugin-respect +!plugins/coral-plugin-offtopic +!plugins/coral-plugin-like +!plugins/coral-plugin-mod +!plugins/coral-plugin-love node_modules diff --git a/plugins/coral-plugin-auth/client/components/ChangeUsername.js b/plugins/coral-plugin-auth/client/components/ChangeUsername.js index cbb7adba5..ee02b2e17 100644 --- a/plugins/coral-plugin-auth/client/components/ChangeUsername.js +++ b/plugins/coral-plugin-auth/client/components/ChangeUsername.js @@ -40,10 +40,10 @@ class ChangeUsernameContainer extends React.Component { } } - handleChange = e => { + handleChange = (e) => { const {name, value} = e.target; this.setState( - state => ({ + (state) => ({ ...state, formData: { ...state.formData, @@ -57,7 +57,7 @@ class ChangeUsernameContainer extends React.Component { }; addError = (name, error) => { - return this.setState(state => ({ + return this.setState((state) => ({ errors: { ...state.errors, [name]: error @@ -75,20 +75,20 @@ class ChangeUsernameContainer extends React.Component { } else { const {[name]: prop, ...errors} = this.state.errors; // eslint-disable-line // Removes Error - this.setState(state => ({...state, errors})); + this.setState((state) => ({...state, errors})); } }; isCompleted = () => { const {formData} = this.state; - return !Object.keys(formData).filter(prop => !formData[prop].length).length; + return !Object.keys(formData).filter((prop) => !formData[prop].length).length; }; displayErrors = (show = true) => { this.setState({showErrors: show}); }; - handleSubmitUsername = e => { + handleSubmitUsername = (e) => { e.preventDefault(); const {errors} = this.state; const {validForm, invalidForm} = this.props; @@ -127,7 +127,7 @@ const mapStateToProps = ({auth}) => ({ auth: auth.toJS() }); -const mapDispatchToProps = dispatch => +const mapDispatchToProps = (dispatch) => bindActionCreators( { createUsername, diff --git a/plugins/coral-plugin-auth/client/components/FakeComment.js b/plugins/coral-plugin-auth/client/components/FakeComment.js index 01cc6863e..349e7d0a4 100644 --- a/plugins/coral-plugin-auth/client/components/FakeComment.js +++ b/plugins/coral-plugin-auth/client/components/FakeComment.js @@ -69,4 +69,5 @@ export const FakeComment = ({username, created_at, body}) => (
    -); \ No newline at end of file +); + diff --git a/plugins/coral-plugin-auth/client/components/ForgotContent.js b/plugins/coral-plugin-auth/client/components/ForgotContent.js index 2099330bc..8bd6b27a6 100644 --- a/plugins/coral-plugin-auth/client/components/ForgotContent.js +++ b/plugins/coral-plugin-auth/client/components/ForgotContent.js @@ -7,7 +7,7 @@ import I18n from 'coral-framework/modules/i18n/i18n'; const lang = new I18n(translations); class ForgotContent extends React.Component { - handleSubmit = e => { + handleSubmit = (e) => { e.preventDefault(); this.props.fetchForgotPassword(this.emailInput.value); }; @@ -25,7 +25,7 @@ class ForgotContent extends React.Component {
    (this.emailInput = input)} + ref={(input) => (this.emailInput = input)} type="text" style={{fontSize: 16}} id="email" diff --git a/plugins/coral-plugin-auth/client/components/SignInButton.js b/plugins/coral-plugin-auth/client/components/SignInButton.js index b54cbfedd..881233c83 100644 --- a/plugins/coral-plugin-auth/client/components/SignInButton.js +++ b/plugins/coral-plugin-auth/client/components/SignInButton.js @@ -18,7 +18,7 @@ const mapStateToProps = ({auth}) => ({ loggedIn: auth.toJS().loggedIn }); -const mapDispatchToProps = dispatch => +const mapDispatchToProps = (dispatch) => bindActionCreators({showSignInDialog}, dispatch); export default connect(mapStateToProps, mapDispatchToProps)(SignInButton); diff --git a/plugins/coral-plugin-auth/client/components/SignInContainer.js b/plugins/coral-plugin-auth/client/components/SignInContainer.js index cbff000ee..523f343ed 100644 --- a/plugins/coral-plugin-auth/client/components/SignInContainer.js +++ b/plugins/coral-plugin-auth/client/components/SignInContainer.js @@ -61,7 +61,8 @@ class SignInContainer extends React.Component { window.removeEventListener('storage', this.handleAuth); } - handleAuth = e => { + handleAuth = (e) => { + // Listening to FB changes // FB localStorage key is 'auth' const authCallback = this.props.facebookCallback; @@ -72,10 +73,10 @@ class SignInContainer extends React.Component { } }; - handleChange = e => { + handleChange = (e) => { const {name, value} = e.target; this.setState( - state => ({ + (state) => ({ ...state, formData: { ...state.formData, @@ -88,12 +89,12 @@ class SignInContainer extends React.Component { ); }; - handleChangeEmail = e => { + handleChangeEmail = (e) => { const {value} = e.target; this.setState({emailToBeResent: value}); }; - handleResendVerification = e => { + handleResendVerification = (e) => { e.preventDefault(); this.props .requestConfirmEmail( @@ -102,6 +103,7 @@ class SignInContainer extends React.Component { ) .then(() => { setTimeout(() => { + // allow success UI to be shown for a second, and then close the modal this.props.hideSignInDialog(); }, 2500); @@ -109,7 +111,7 @@ class SignInContainer extends React.Component { }; addError = (name, error) => { - return this.setState(state => ({ + return this.setState((state) => ({ errors: { ...state.errors, [name]: error @@ -133,20 +135,20 @@ class SignInContainer extends React.Component { } else { const {[name]: prop, ...errors} = this.state.errors; // eslint-disable-line // Removes Error - this.setState(state => ({...state, errors})); + this.setState((state) => ({...state, errors})); } }; isCompleted = () => { const {formData} = this.state; - return !Object.keys(formData).filter(prop => !formData[prop].length).length; + return !Object.keys(formData).filter((prop) => !formData[prop].length).length; }; displayErrors = (show = true) => { this.setState({showErrors: show}); }; - handleSignUp = e => { + handleSignUp = (e) => { e.preventDefault(); const {errors} = this.state; const {fetchSignUp, validForm, invalidForm} = this.props; @@ -159,7 +161,7 @@ class SignInContainer extends React.Component { } }; - handleSignIn = e => { + handleSignIn = (e) => { e.preventDefault(); this.props.fetchSignIn(this.state.formData); }; @@ -183,17 +185,16 @@ class SignInContainer extends React.Component { } } -const mapStateToProps = state => ({ +const mapStateToProps = (state) => ({ auth: state.auth.toJS() }); -const mapDispatchToProps = dispatch => +const mapDispatchToProps = (dispatch) => bindActionCreators( { checkLogin, facebookCallback, fetchSignUp, - fetchSignUp, fetchSignIn, fetchSignInFacebook, fetchSignUpFacebook, diff --git a/plugins/coral-plugin-auth/client/components/SignUpContent.js b/plugins/coral-plugin-auth/client/components/SignUpContent.js index 5f2dd36ea..fd885d1fe 100644 --- a/plugins/coral-plugin-auth/client/components/SignUpContent.js +++ b/plugins/coral-plugin-auth/client/components/SignUpContent.js @@ -1,5 +1,5 @@ import styles from './styles.css'; -import React, {PropTypes} from 'react'; +import React from 'react'; import translations from '../translations'; import I18n from 'coral-framework/modules/i18n/i18n'; import {Button, TextField, Spinner, Success, Alert} from 'coral-ui'; diff --git a/plugins/coral-plugin-auth/client/components/UserBox.js b/plugins/coral-plugin-auth/client/components/UserBox.js index d8adf2380..cfd0fc9d2 100644 --- a/plugins/coral-plugin-auth/client/components/UserBox.js +++ b/plugins/coral-plugin-auth/client/components/UserBox.js @@ -4,7 +4,7 @@ import {connect} from 'react-redux'; import {bindActionCreators} from 'redux'; import translations from '../translations'; import I18n from 'coral-framework/modules/i18n/i18n'; -import {showSignInDialog, logout} from 'coral-framework/actions/auth'; +import {logout} from 'coral-framework/actions/auth'; const lang = new I18n(translations); const UserBox = ({loggedIn, user, logout, onShowProfile}) => ( @@ -23,12 +23,12 @@ const UserBox = ({loggedIn, user, logout, onShowProfile}) => (
    ); -const mapStateToProps = ({auth, user}) => ({ +const mapStateToProps = ({auth}) => ({ loggedIn: auth.toJS().loggedIn, user: auth.toJS().user }); -const mapDispatchToProps = dispatch => +const mapDispatchToProps = (dispatch) => bindActionCreators({logout}, dispatch); export default connect(mapStateToProps, mapDispatchToProps)(UserBox); diff --git a/plugins/coral-plugin-auth/client/index.js b/plugins/coral-plugin-auth/client/index.js index 41fa3adbe..c41c097bd 100644 --- a/plugins/coral-plugin-auth/client/index.js +++ b/plugins/coral-plugin-auth/client/index.js @@ -8,4 +8,5 @@ export default { stream: [UserBox, SignInButton, ChangeUserNameContainer], login: [SignInContainer] } -}; \ No newline at end of file +}; + diff --git a/plugins/coral-plugin-auth/index.js b/plugins/coral-plugin-auth/index.js index a09954537..85dfb349b 100644 --- a/plugins/coral-plugin-auth/index.js +++ b/plugins/coral-plugin-auth/index.js @@ -1 +1,2 @@ -module.exports = {}; \ No newline at end of file +module.exports = {}; + diff --git a/plugins/coral-plugin-like/client/components/LikeButton.js b/plugins/coral-plugin-like/client/components/LikeButton.js index b91ffd42a..0a88d35a4 100644 --- a/plugins/coral-plugin-like/client/components/LikeButton.js +++ b/plugins/coral-plugin-like/client/components/LikeButton.js @@ -1,19 +1,18 @@ -import React, { Component } from 'react'; +import React, {Component} from 'react'; import styles from './style.css'; -import Icon from './Icon'; -import { I18n } from 'coral-framework'; +import {I18n} from 'coral-framework'; import cn from 'classnames'; import translations from '../translations.json'; -import { getMyActionSummary, getTotalActionCount } from 'coral-framework/utils'; +import {getMyActionSummary, getTotalActionCount} from 'coral-framework/utils'; const lang = new I18n(translations); const name = 'coral-plugin-like'; class LikeButton extends Component { handleClick = () => { - const { postLike, showSignInDialog, deleteAction } = this.props; - const { root: { me }, comment } = this.props; + const {postLike, showSignInDialog, deleteAction} = this.props; + const {root: {me}, comment} = this.props; const myLikeActionSummary = getMyActionSummary( 'LikeActionSummary', @@ -42,7 +41,7 @@ class LikeButton extends Component { }; render() { - const { comment } = this.props; + const {comment} = this.props; if (!comment) { return null; @@ -56,7 +55,7 @@ class LikeButton extends Component {
    - ) + ); } } - const mapStateToProps = ({commentBox}) => ({commentBox}); -const mapDispatchToProps = dispatch => +const mapDispatchToProps = (dispatch) => bindActionCreators({addTag, removeTag}, dispatch); export default connect(mapStateToProps, mapDispatchToProps)(OffTopicCheckbox); diff --git a/plugins/coral-plugin-offtopic/client/components/OffTopicTag.js b/plugins/coral-plugin-offtopic/client/components/OffTopicTag.js index 73e2372ed..0bd0fb1c2 100644 --- a/plugins/coral-plugin-offtopic/client/components/OffTopicTag.js +++ b/plugins/coral-plugin-offtopic/client/components/OffTopicTag.js @@ -2,8 +2,8 @@ import React from 'react'; import styles from './styles.css'; const isOffTopic = (tags) => { - return !!tags.filter(tag => tag.name === 'OFF_TOPIC').length -} + return !!tags.filter((tag) => tag.name === 'OFF_TOPIC').length; +}; export default (props) => ( From 89cb4c4502dea8a58c28746e4fe2f92b2140f275 Mon Sep 17 00:00:00 2001 From: Chi Vinh Le Date: Sat, 27 May 2017 02:45:59 +0700 Subject: [PATCH 66/78] Resolve infinite loop --- .../client/components/SignUpContent.js | 32 +++++++------------ 1 file changed, 12 insertions(+), 20 deletions(-) diff --git a/plugins/coral-plugin-auth/client/components/SignUpContent.js b/plugins/coral-plugin-auth/client/components/SignUpContent.js index fd885d1fe..2c0cf1f31 100644 --- a/plugins/coral-plugin-auth/client/components/SignUpContent.js +++ b/plugins/coral-plugin-auth/client/components/SignUpContent.js @@ -7,12 +7,17 @@ import {Button, TextField, Spinner, Success, Alert} from 'coral-ui'; const lang = new I18n(translations); class SignUpContent extends React.Component { - constructor() { - super(); - this.state = { - successfulSignup: false - }; + componentWillReceiveProps(next) { + if ( + !this.props.emailVerificationEnabled && + !this.props.auth.successSignUp && + next.auth.successSignUp + ) { + setTimeout(() => { + this.props.changeView('SIGNIN'); + }, 2000); + } } render() { @@ -28,19 +33,6 @@ class SignUpContent extends React.Component { fetchSignUpFacebook } = this.props; - const beforeSignup = !auth.isLoading && !auth.successSignUp; - const successfulSignup = !auth.isLoading && auth.successSignUp; - - // the first time we render a successfulSignup, trigger a timer - if (this.successfulSignup ^ successfulSignup && !emailVerificationEnabled) { - setTimeout(() => { - changeView('SIGNIN'); - }, 1000); - this.setState({ - successfulSignup: true - }); - } - return (
    @@ -50,7 +42,7 @@ class SignUpContent extends React.Component {
    {auth.error && {auth.error}} - {beforeSignup && + {!auth.successSignUp &&
    } - {successfulSignup && + {auth.successSignUp &&
    {emailVerificationEnabled && From 681e07306bacc10604dd5223f381083736a919ba Mon Sep 17 00:00:00 2001 From: Chi Vinh Le Date: Sat, 27 May 2017 03:11:57 +0700 Subject: [PATCH 67/78] Require email verification info --- client/coral-framework/actions/auth.js | 11 ++++++++++- client/coral-framework/constants/auth.js | 3 +++ client/coral-framework/reducers/auth.js | 6 +++++- .../client/components/SignInContainer.js | 4 ++-- 4 files changed, 20 insertions(+), 4 deletions(-) diff --git a/client/coral-framework/actions/auth.js b/client/coral-framework/actions/auth.js index f714f1fac..ee799c8cc 100644 --- a/client/coral-framework/actions/auth.js +++ b/client/coral-framework/actions/auth.js @@ -9,7 +9,7 @@ const lang = new I18n(translations); import translations from './../translations'; import I18n from '../../coral-framework/modules/i18n/i18n'; -export const showSignInDialog = () => (dispatch) => { +export const showSignInDialog = () => (dispatch, getState) => { const signInPopUp = window.open( '/embed/stream/login', 'Login', @@ -21,6 +21,10 @@ export const showSignInDialog = () => (dispatch) => { let loaded = false; signInPopUp.onload = () => { loaded = true; + + // Fire some actions inside the popups reducer, to initialize required state. + const required = getState().asset.toJS().settings.requireEmailConfirmation; + signInPopUp.coralStore.dispatch(setRequireEmailVerification(required)); }; // Use `onunload` instead of `onbeforeunload` which is not supported in IOS Safari. @@ -96,6 +100,11 @@ export const cleanState = () => ({ type: actions.CLEAN_STATE }); +export const setRequireEmailVerification = (required) => ({ + type: actions.SET_REQUIRE_EMAIL_VERIFICATION, + required, +}); + // Sign In Actions const signInRequest = () => ({ diff --git a/client/coral-framework/constants/auth.js b/client/coral-framework/constants/auth.js index 24599ac50..a9ac52739 100644 --- a/client/coral-framework/constants/auth.js +++ b/client/coral-framework/constants/auth.js @@ -46,3 +46,6 @@ export const VERIFY_EMAIL_REQUEST = 'VERIFY_EMAIL_REQUEST'; export const VERIFY_EMAIL_SUCCESS = 'VERIFY_EMAIL_SUCCESS'; export const VERIFY_EMAIL_FAILURE = 'VERIFY_EMAIL_FAILURE'; export const UPDATE_USERNAME = 'UPDATE_USERNAME'; + +export const SET_REQUIRE_EMAIL_VERIFICATION = 'SET_REQUIRE_EMAIL_VERIFICATION'; + diff --git a/client/coral-framework/reducers/auth.js b/client/coral-framework/reducers/auth.js index 8fa4ed75b..7a1744d59 100644 --- a/client/coral-framework/reducers/auth.js +++ b/client/coral-framework/reducers/auth.js @@ -16,7 +16,8 @@ const initialState = Map({ emailVerificationLoading: false, emailVerificationSuccess: false, successSignUp: false, - fromSignUp: false + fromSignUp: false, + requireEmailConfirmation: false, }); const purge = (user) => { @@ -142,6 +143,9 @@ export default function auth (state = initialState, action) { return state .set('emailVerificationSuccess', true) .set('emailVerificationLoading', false); + case actions.SET_REQUIRE_EMAIL_VERIFICATION: + return state + .set('requireEmailConfirmation', action.required); default : return state; } diff --git a/plugins/coral-plugin-auth/client/components/SignInContainer.js b/plugins/coral-plugin-auth/client/components/SignInContainer.js index 523f343ed..9ef868f1d 100644 --- a/plugins/coral-plugin-auth/client/components/SignInContainer.js +++ b/plugins/coral-plugin-auth/client/components/SignInContainer.js @@ -167,8 +167,8 @@ class SignInContainer extends React.Component { }; render() { - const {auth, requireEmailConfirmation} = this.props; - const {emailVerificationLoading, emailVerificationSuccess} = auth; + const {auth} = this.props; + const {requireEmailConfirmation, emailVerificationLoading, emailVerificationSuccess} = auth; return ( Date: Mon, 29 May 2017 20:35:43 +0700 Subject: [PATCH 68/78] Change not authorized error message --- locales/en.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/locales/en.yml b/locales/en.yml index 2fdd4a589..2f0b41511 100644 --- a/locales/en.yml +++ b/locales/en.yml @@ -150,7 +150,7 @@ en: copy: "Copy to Clipboard" error: COMMENT_TOO_SHORT: "Your comment must have something in it" - NOT_AUTHORIZED: "Your username or password is not recognized by our system." + NOT_AUTHORIZED: "You are not authorized to perform this action." NO_SPECIAL_CHARACTERS: "Usernames can contain letters numbers and _ only" PASSWORD_LENGTH: "Password is too short" PROFANITY_ERROR: "Usernames must not contain profanity. Please contact the administrator if you believe this to be in error." From bd5e272f00a6a84ec5ee73d6d8ddfc0b342971fe Mon Sep 17 00:00:00 2001 From: Chi Vinh Le Date: Mon, 29 May 2017 22:00:27 +0700 Subject: [PATCH 69/78] Use correct redirect url --- client/coral-framework/actions/auth.js | 30 ++++++++++++------- client/coral-framework/constants/auth.js | 2 ++ client/coral-framework/reducers/auth.js | 5 ++++ .../client/components/SignInContainer.js | 4 +-- 4 files changed, 28 insertions(+), 13 deletions(-) diff --git a/client/coral-framework/actions/auth.js b/client/coral-framework/actions/auth.js index ee799c8cc..3d15484e8 100644 --- a/client/coral-framework/actions/auth.js +++ b/client/coral-framework/actions/auth.js @@ -1,5 +1,4 @@ import jwtDecode from 'jwt-decode'; -import {pym} from 'coral-framework'; import bowser from 'bowser'; import * as actions from '../constants/auth'; import * as Storage from '../helpers/storage'; @@ -24,7 +23,9 @@ export const showSignInDialog = () => (dispatch, getState) => { // Fire some actions inside the popups reducer, to initialize required state. const required = getState().asset.toJS().settings.requireEmailConfirmation; + const redirectUri = getState().auth.toJS().redirectUri; signInPopUp.coralStore.dispatch(setRequireEmailVerification(required)); + signInPopUp.coralStore.dispatch(setRedirectUri(redirectUri)); }; // Use `onunload` instead of `onbeforeunload` which is not supported in IOS Safari. @@ -100,11 +101,6 @@ export const cleanState = () => ({ type: actions.CLEAN_STATE }); -export const setRequireEmailVerification = (required) => ({ - type: actions.SET_REQUIRE_EMAIL_VERIFICATION, - required, -}); - // Sign In Actions const signInRequest = () => ({ @@ -224,7 +220,8 @@ const signUpRequest = () => ({type: actions.FETCH_SIGNUP_REQUEST}); const signUpSuccess = (user) => ({type: actions.FETCH_SIGNUP_SUCCESS, user}); const signUpFailure = (error) => ({type: actions.FETCH_SIGNUP_FAILURE, error}); -export const fetchSignUp = (formData, redirectUri) => (dispatch) => { +export const fetchSignUp = (formData) => (dispatch, getState) => { + const redirectUri = getState().auth.toJS().redirectUri; dispatch(signUpRequest()); coralApi('/users', { @@ -262,9 +259,9 @@ const forgotPasswordFailure = () => ({ type: actions.FETCH_FORGOT_PASSWORD_FAILURE }); -export const fetchForgotPassword = (email) => (dispatch) => { +export const fetchForgotPassword = (email) => (dispatch, getState) => { dispatch(forgotPasswordRequest(email)); - const redirectUri = pym.parentUrl || location.href; + const redirectUri = getState().auth.toJS().redirectUri; coralApi('/account/password/reset', { method: 'POST', body: {email, loc: redirectUri} @@ -342,7 +339,8 @@ const verifyEmailFailure = () => ({ type: actions.VERIFY_EMAIL_FAILURE }); -export const requestConfirmEmail = (email, redirectUri) => (dispatch) => { +export const requestConfirmEmail = (email) => (dispatch, getState) => { + const redirectUri = getState().auth.toJS().redirectUri; dispatch(verifyEmailRequest()); return coralApi('/users/resend-verify', { method: 'POST', @@ -356,5 +354,17 @@ export const requestConfirmEmail = (email, redirectUri) => (dispatch) => { // email might have already been verifyed dispatch(verifyEmailFailure(err)); + throw err; }); }; + +// Login Popup actions. +export const setRequireEmailVerification = (required) => ({ + type: actions.SET_REQUIRE_EMAIL_VERIFICATION, + required, +}); + +export const setRedirectUri = (uri) => ({ + type: actions.SET_REDIRECT_URI, + uri, +}); diff --git a/client/coral-framework/constants/auth.js b/client/coral-framework/constants/auth.js index a9ac52739..57bde6f3f 100644 --- a/client/coral-framework/constants/auth.js +++ b/client/coral-framework/constants/auth.js @@ -47,5 +47,7 @@ export const VERIFY_EMAIL_SUCCESS = 'VERIFY_EMAIL_SUCCESS'; export const VERIFY_EMAIL_FAILURE = 'VERIFY_EMAIL_FAILURE'; export const UPDATE_USERNAME = 'UPDATE_USERNAME'; +// Login Popup actions. export const SET_REQUIRE_EMAIL_VERIFICATION = 'SET_REQUIRE_EMAIL_VERIFICATION'; +export const SET_REDIRECT_URI = 'SET_REDIRECT_URI'; diff --git a/client/coral-framework/reducers/auth.js b/client/coral-framework/reducers/auth.js index 7a1744d59..5a05de28e 100644 --- a/client/coral-framework/reducers/auth.js +++ b/client/coral-framework/reducers/auth.js @@ -1,5 +1,6 @@ import {Map, fromJS} from 'immutable'; import * as actions from '../constants/auth'; +import {pym} from 'coral-framework'; const initialState = Map({ isLoading: false, @@ -18,6 +19,7 @@ const initialState = Map({ successSignUp: false, fromSignUp: false, requireEmailConfirmation: false, + redirectUri: pym.parentUrl || location.href, }); const purge = (user) => { @@ -146,6 +148,9 @@ export default function auth (state = initialState, action) { case actions.SET_REQUIRE_EMAIL_VERIFICATION: return state .set('requireEmailConfirmation', action.required); + case actions.SET_REDIRECT_URI: + return state + .set('redirectUri', action.uri); default : return state; } diff --git a/plugins/coral-plugin-auth/client/components/SignInContainer.js b/plugins/coral-plugin-auth/client/components/SignInContainer.js index 9ef868f1d..bfa8e97b9 100644 --- a/plugins/coral-plugin-auth/client/components/SignInContainer.js +++ b/plugins/coral-plugin-auth/client/components/SignInContainer.js @@ -1,6 +1,5 @@ import React from 'react'; import {connect} from 'react-redux'; -import {pym} from 'coral-framework'; import SignDialog from './SignDialog'; import {bindActionCreators} from 'redux'; import translations from '../translations'; @@ -99,7 +98,6 @@ class SignInContainer extends React.Component { this.props .requestConfirmEmail( this.state.emailToBeResent, - pym.parentUrl || location.href ) .then(() => { setTimeout(() => { @@ -154,7 +152,7 @@ class SignInContainer extends React.Component { const {fetchSignUp, validForm, invalidForm} = this.props; this.displayErrors(); if (this.isCompleted() && !Object.keys(errors).length) { - fetchSignUp(this.state.formData, pym.parentUrl || location.href); + fetchSignUp(this.state.formData); validForm(); } else { invalidForm(lang.t('signIn.checkTheForm')); From a598bca12b79be52d10e038cc832fdfea7986ce3 Mon Sep 17 00:00:00 2001 From: Chi Vinh Le Date: Mon, 29 May 2017 22:10:16 +0700 Subject: [PATCH 70/78] Allow domains with ports --- services/users.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/services/users.js b/services/users.js index 4c76f179c..f7f70b99e 100644 --- a/services/users.js +++ b/services/users.js @@ -568,7 +568,11 @@ module.exports = class UsersService { } let redirectDomain; try { - redirectDomain = url.parse(loc).hostname; + const {hostname, port} = url.parse(loc); + redirectDomain = hostname; + if (port) { + redirectDomain += `:${port}`; + } } catch (e) { return Promise.reject('redirect location is invalid'); } From 04ef1c5be532bf92f374c1c94bbdc053d65a2931 Mon Sep 17 00:00:00 2001 From: Chi Vinh Le Date: Mon, 29 May 2017 22:45:56 +0700 Subject: [PATCH 71/78] Use new translation service --- client/coral-framework/hocs/withMutation.js | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/client/coral-framework/hocs/withMutation.js b/client/coral-framework/hocs/withMutation.js index 940d781aa..285932372 100644 --- a/client/coral-framework/hocs/withMutation.js +++ b/client/coral-framework/hocs/withMutation.js @@ -7,9 +7,7 @@ import isEmpty from 'lodash/isEmpty'; import {getMutationOptions, resolveFragments} from 'coral-framework/services/graphqlRegistry'; import {store} from 'coral-framework/services/store'; import {getDefinitionName, getResponseErrors} from '../utils'; -import I18n from 'coral-framework/modules/i18n/i18n'; -import translations from 'coral-framework/translations.json'; -const lang = new I18n(translations); +import t from 'coral-framework/services/i18n'; class ResponseErrors extends Error { constructor(errors) { @@ -24,7 +22,7 @@ class ResponseError { } translate(...args) { - return lang.t(`error.${this.translation_key}`, ...args); + return t(`error.${this.translation_key}`, ...args); } } From 68f6c8acb67f4408b43c8741be12a9fa0ac6c9d5 Mon Sep 17 00:00:00 2001 From: Chi Vinh Le Date: Tue, 30 May 2017 01:08:45 +0700 Subject: [PATCH 72/78] No shared store between popup and embed --- client/coral-framework/services/store.js | 3 --- 1 file changed, 3 deletions(-) diff --git a/client/coral-framework/services/store.js b/client/coral-framework/services/store.js index 297243736..0530d8c28 100644 --- a/client/coral-framework/services/store.js +++ b/client/coral-framework/services/store.js @@ -34,9 +34,6 @@ export function getStore() { if (window.coralStore) { return window.coralStore; } - if (window.opener && window.opener.coralStore) { - return window.opener.coralStore; - } const coralReducers = { ...mainReducer, From 109f4b2c0ff75faf0ff7c94e1ffe8bee7ea5f989 Mon Sep 17 00:00:00 2001 From: Chi Vinh Le Date: Wed, 31 May 2017 00:44:16 +0700 Subject: [PATCH 73/78] Handle mutation errors --- .../Moderation/components/Moderation.js | 31 +------------------ .../Moderation/containers/Moderation.js | 30 ++++++++++++++++++ .../coral-admin/src/services/notification.js | 19 ++++++------ 3 files changed, 41 insertions(+), 39 deletions(-) diff --git a/client/coral-admin/src/routes/Moderation/components/Moderation.js b/client/coral-admin/src/routes/Moderation/components/Moderation.js index 4f5441e4f..956575ce4 100644 --- a/client/coral-admin/src/routes/Moderation/components/Moderation.js +++ b/client/coral-admin/src/routes/Moderation/components/Moderation.js @@ -1,8 +1,6 @@ import React, {Component} from 'react'; -import * as notification from 'coral-admin/src/services/notification'; import key from 'keymaster'; import styles from './styles.css'; -import t, {timeago} from 'coral-framework/services/i18n'; import BanUserDialog from './BanUserDialog'; import SuspendUserDialog from './SuspendUserDialog'; @@ -72,33 +70,6 @@ export default class Moderation extends Component { } } - suspendUser = async (args) => { - this.props.hideSuspendUserDialog(); - try { - const result = await this.props.suspendUser(args); - if (result.data.suspendUser.errors) { - throw result.data.suspendUser.errors; - } - notification.success( - t('suspenduser.notify_suspend_until', - this.props.moderation.suspendUserDialog.username, - timeago(args.until)), - ); - const {commentStatus, commentId} = this.props.moderation.suspendUserDialog; - if (commentStatus !== 'REJECTED') { - return this.props.rejectComment({commentId}) - .then((result) => { - if (result.data.setCommentStatus.errors) { - throw result.data.setCommentStatus.errors; - } - }); - } - } - catch(err) { - notification.showMutationErrors(err); - } - }; - componentWillUnmount() { key.unbind('s'); key.unbind('shift+/'); @@ -206,7 +177,7 @@ export default class Moderation extends Component { userId={moderation.suspendUserDialog.userId} organizationName={root.settings.organizationName} onCancel={props.hideSuspendUserDialog} - onPerform={this.suspendUser} + onPerform={this.props.suspendUser} /> { + this.props.hideSuspendUserDialog(); + try { + const result = await this.props.suspendUser(args); + if (result.data.suspendUser.errors) { + throw result.data.suspendUser.errors; + } + notification.success( + t('suspenduser.notify_suspend_until', + this.props.moderation.suspendUserDialog.username, + timeago(args.until)), + ); + const {commentStatus, commentId} = this.props.moderation.suspendUserDialog; + if (commentStatus !== 'REJECTED') { + return this.props.rejectComment({commentId}) + .then((result) => { + if (result.data.setCommentStatus.errors) { + throw result.data.setCommentStatus.errors; + } + }); + } + } + catch(err) { + notification.showMutationErrors(err); + } + }; + banUser = ({userId}) => { return this.props.setUserStatus({userId, status: 'BANNED'}); } @@ -108,6 +137,7 @@ class ModerationContainer extends Component { banUser={this.banUser} acceptComment={this.acceptComment} rejectComment={this.rejectComment} + suspendUser={this.suspendUser} />; } } diff --git a/client/coral-admin/src/services/notification.js b/client/coral-admin/src/services/notification.js index cc25b0756..5e8673060 100644 --- a/client/coral-admin/src/services/notification.js +++ b/client/coral-admin/src/services/notification.js @@ -13,13 +13,14 @@ export function info(msg) { return toast(msg, {type: 'info'}); } -export function showMutationErrors(err) { - const errors = Array.isArray(err) ? err : [err]; - errors.forEach((err) => { - console.error(err); - toast( - err.translation_key ? t(`error.${err.translation_key}`) : err, - {type: 'error'} - ); - }); +export function showMutationErrors(error) { + console.error(error); + if (error.errors) { + error.errors.forEach((err) => { + toast( + err.translation_key ? t(`error.${err.translation_key}`) : err, + {type: 'error'} + ); + }); + } } From b402f70f384ff33eb8a0943a3ced5c31da15da59 Mon Sep 17 00:00:00 2001 From: Chi Vinh Le Date: Thu, 1 Jun 2017 01:34:32 +0700 Subject: [PATCH 74/78] Hide comment box during perm view --- client/coral-embed-stream/src/components/Stream.js | 1 + 1 file changed, 1 insertion(+) diff --git a/client/coral-embed-stream/src/components/Stream.js b/client/coral-embed-stream/src/components/Stream.js index d93044c9e..68fb3611a 100644 --- a/client/coral-embed-stream/src/components/Stream.js +++ b/client/coral-embed-stream/src/components/Stream.js @@ -100,6 +100,7 @@ class Stream extends React.Component { {loggedIn && !banned && !temporarilySuspended && + !highlightedComment && Date: Wed, 31 May 2017 13:38:14 -0400 Subject: [PATCH 75/78] Update README with Trust info --- README.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index a514d1ee1..9390f19fd 100644 --- a/README.md +++ b/README.md @@ -44,9 +44,12 @@ sign and verify tokens via a `HS256` algorithm. Refer to the wiki page on [Configuration Loading](https://github.com/coralproject/talk/wiki/Configuration-Loading) for alternative methods of loading configuration during development. -## Plugins +### Using Trust + +Talk ships with core components we call "Trust". This allow Talk to automatically do special things based on intelligence built into the system. + +Our first feature is the notion of Karma. Talk will automatically pre-moderate comments of users who have a negative karma score. You can [see more how karma works here](/talk/services/karma.js). -Talk ships with a plugin architecture that allows developers to significantly extend the platform. For more information, see our [plugin documentation](docs/PLUGINS.md). ## Supported Browsers From c172260d74945e8c3dc94e34574542143868772a Mon Sep 17 00:00:00 2001 From: Kim Gardner Date: Wed, 31 May 2017 14:09:53 -0400 Subject: [PATCH 76/78] Fix link --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 9390f19fd..fc2aba463 100644 --- a/README.md +++ b/README.md @@ -48,7 +48,7 @@ alternative methods of loading configuration during development. Talk ships with core components we call "Trust". This allow Talk to automatically do special things based on intelligence built into the system. -Our first feature is the notion of Karma. Talk will automatically pre-moderate comments of users who have a negative karma score. You can [see more how karma works here](/talk/services/karma.js). +Our first feature is the notion of Karma. Talk will automatically pre-moderate comments of users who have a negative karma score. You can [see more how karma works here](/services/karma.js). ## Supported Browsers From ac8e723e7584138ff80e9285b244d3284cef589a Mon Sep 17 00:00:00 2001 From: Kim Gardner Date: Wed, 31 May 2017 15:21:02 -0400 Subject: [PATCH 77/78] Copy changes --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index fc2aba463..1b2c1590f 100644 --- a/README.md +++ b/README.md @@ -46,7 +46,7 @@ alternative methods of loading configuration during development. ### Using Trust -Talk ships with core components we call "Trust". This allow Talk to automatically do special things based on intelligence built into the system. +Talk ships with core components we call "Trust". This allows Talk to automate certain actions based on previous user behavior. Our first feature is the notion of Karma. Talk will automatically pre-moderate comments of users who have a negative karma score. You can [see more how karma works here](/services/karma.js). From 93d8e0015bf5a23a2feecfae0f606b50fd38e863 Mon Sep 17 00:00:00 2001 From: Kim Gardner Date: Wed, 31 May 2017 15:27:23 -0400 Subject: [PATCH 78/78] Remove space --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index 1b2c1590f..48055e326 100644 --- a/README.md +++ b/README.md @@ -50,7 +50,6 @@ Talk ships with core components we call "Trust". This allows Talk to automate ce Our first feature is the notion of Karma. Talk will automatically pre-moderate comments of users who have a negative karma score. You can [see more how karma works here](/services/karma.js). - ## Supported Browsers ### Web