diff --git a/client/main.html b/client/main.html index 28e9a87..32dd10b 100644 --- a/client/main.html +++ b/client/main.html @@ -1,12 +1,23 @@ - Application Name - + YoungDesk + + + -
+
diff --git a/imports/client/views/org/enter/Login.js b/imports/client/views/org/enter/Login.js deleted file mode 100644 index c6e5cb7..0000000 --- a/imports/client/views/org/enter/Login.js +++ /dev/null @@ -1,54 +0,0 @@ -import React from 'react'; -import { Link } from 'react-router'; -import { Row, Col, FormGroup, ControlLabel, FormControl, Button } from 'react-bootstrap'; -import handleLogin from './module/login'; - -export default class Login extends React.Component { - componentDidMount() { - handleLogin({ component: this }); - } - - handleSubmit(event) { - event.preventDefault(); - } - - render() { - return ( -
- - -

Login

-
(this.loginForm = form) } - className="login" - onSubmit={ this.handleSubmit } - > - - Email Address - - - - - Password - Forgot Password? - - - - -
- -
-
- ); - } -} diff --git a/imports/client/views/org/enter/login/LoginView.js b/imports/client/views/org/enter/login/LoginView.js new file mode 100644 index 0000000..8ebed8f --- /dev/null +++ b/imports/client/views/org/enter/login/LoginView.js @@ -0,0 +1,54 @@ +import React from 'react'; +import { Link } from 'react-router'; +import { Row, Col, FormGroup, ControlLabel, FormControl, Button } from 'react-bootstrap'; +import handleLogin from './login'; + +export default class Login extends React.Component { + componentDidMount() { + handleLogin({ component: this }); + } + + handleSubmit(event) { + event.preventDefault(); + } + + render() { + return ( +
+ + +

Login

+
(this.loginForm = form) } + className="login" + onSubmit={ this.handleSubmit } + > + + Email Address + + + + + Password + Forgot Password? + + + + +
+ +
+
+ ); + } +} diff --git a/imports/client/views/org/enter/login/login.js b/imports/client/views/org/enter/login/login.js new file mode 100644 index 0000000..a83a0d3 --- /dev/null +++ b/imports/client/views/org/enter/login/login.js @@ -0,0 +1,57 @@ +/* eslint-disable no-undef */ + +import { browserHistory } from 'react-router'; +import { Meteor } from 'meteor/meteor'; +import { Bert } from 'meteor/themeteorchef:bert'; +import '/imports/client/components/validation'; + +let component; + +const login = () => { + const email = document.querySelector('[name="emailAddress"]').value; + const password = document.querySelector('[name="password"]').value; + + Meteor.loginWithPassword(email, password, (error) => { + if (error) { + Bert.alert(error.reason, 'warning'); + } else { + Bert.alert('Logged in!', 'success'); + + const { location } = component.props; + if (location.state && location.state.nextPathname) { + browserHistory.push(location.state.nextPathname); + } else { + browserHistory.push('/'); + } + } + }); +}; + +const validate = () => { + $(component.loginForm).validate({ + rules: { + emailAddress: { + required: true, + email: true, + }, + password: { + required: true, + }, + }, + messages: { + emailAddress: { + required: 'Need an email address here.', + email: 'Is this email address legit?', + }, + password: { + required: 'Need a password here.', + }, + }, + submitHandler() { login(); }, + }); +}; + +export default function handleLogin(options) { + component = options.component; + validate(); +} diff --git a/imports/client/views/org/enter/module/login.js b/imports/client/views/org/enter/module/login.js deleted file mode 100644 index a83a0d3..0000000 --- a/imports/client/views/org/enter/module/login.js +++ /dev/null @@ -1,57 +0,0 @@ -/* eslint-disable no-undef */ - -import { browserHistory } from 'react-router'; -import { Meteor } from 'meteor/meteor'; -import { Bert } from 'meteor/themeteorchef:bert'; -import '/imports/client/components/validation'; - -let component; - -const login = () => { - const email = document.querySelector('[name="emailAddress"]').value; - const password = document.querySelector('[name="password"]').value; - - Meteor.loginWithPassword(email, password, (error) => { - if (error) { - Bert.alert(error.reason, 'warning'); - } else { - Bert.alert('Logged in!', 'success'); - - const { location } = component.props; - if (location.state && location.state.nextPathname) { - browserHistory.push(location.state.nextPathname); - } else { - browserHistory.push('/'); - } - } - }); -}; - -const validate = () => { - $(component.loginForm).validate({ - rules: { - emailAddress: { - required: true, - email: true, - }, - password: { - required: true, - }, - }, - messages: { - emailAddress: { - required: 'Need an email address here.', - email: 'Is this email address legit?', - }, - password: { - required: 'Need a password here.', - }, - }, - submitHandler() { login(); }, - }); -}; - -export default function handleLogin(options) { - component = options.component; - validate(); -} diff --git a/imports/client/views/org/module/Index.js b/imports/client/views/org/module/Index.js new file mode 100644 index 0000000..e69de29 diff --git a/imports/client/views/org/module/navigation/AppNavigation.js b/imports/client/views/org/module/navigation/AppNavigation.js new file mode 100644 index 0000000..319c936 --- /dev/null +++ b/imports/client/views/org/module/navigation/AppNavigation.js @@ -0,0 +1,27 @@ +import React from 'react'; +import { Navbar } from 'react-bootstrap'; +import { Link } from 'react-router'; +import PublicNavigation from './PublicNavigation.js'; +import AuthenticatedNavigation from './AuthenticatedNavigation.js'; + +const renderNavigation = hasUser => (hasUser ? : ); + +const AppNavigation = ({ hasUser }) => ( + + + + Application Name + + + + + { renderNavigation(hasUser) } + + +); + +AppNavigation.propTypes = { + hasUser: React.PropTypes.object, +}; + +export default AppNavigation; diff --git a/imports/client/views/org/module/navigation/AuthenticatedNavigation.js b/imports/client/views/org/module/navigation/AuthenticatedNavigation.js new file mode 100644 index 0000000..87a0c38 --- /dev/null +++ b/imports/client/views/org/module/navigation/AuthenticatedNavigation.js @@ -0,0 +1,30 @@ +import React from 'react'; +import { browserHistory } from 'react-router'; +import { LinkContainer } from 'react-router-bootstrap'; +import { Nav, NavItem, NavDropdown, MenuItem } from 'react-bootstrap'; +import { Meteor } from 'meteor/meteor'; + +const handleLogout = () => Meteor.logout(() => browserHistory.push('/login')); + +const userName = () => { + const user = Meteor.user(); + const name = user && user.profile ? user.profile.name : ''; + return user ? `${name.first} ${name.last}` : ''; +}; + +const AuthenticatedNavigation = () => ( +
+ + +
+); + +export default AuthenticatedNavigation; diff --git a/imports/client/views/org/module/navigation/Loading.js b/imports/client/views/org/module/navigation/Loading.js new file mode 100644 index 0000000..c97a7eb --- /dev/null +++ b/imports/client/views/org/module/navigation/Loading.js @@ -0,0 +1,30 @@ +import React from 'react'; + +const Loading = () => ( + + + + + +); + +export default Loading; diff --git a/imports/client/views/org/module/navigation/PublicNavigation.js b/imports/client/views/org/module/navigation/PublicNavigation.js new file mode 100644 index 0000000..d04fc80 --- /dev/null +++ b/imports/client/views/org/module/navigation/PublicNavigation.js @@ -0,0 +1,16 @@ +import React from 'react'; +import { LinkContainer } from 'react-router-bootstrap'; +import { Nav, NavItem } from 'react-bootstrap'; + +const PublicNavigation = () => ( + +); + +export default PublicNavigation; diff --git a/imports/client/views/org/module/navigation/index.js b/imports/client/views/org/module/navigation/index.js new file mode 100644 index 0000000..65f743d --- /dev/null +++ b/imports/client/views/org/module/navigation/index.js @@ -0,0 +1,7 @@ +import { composeWithTracker } from 'react-komposer'; +import { Meteor } from 'meteor/meteor'; +import AppNavigation from '../components/AppNavigation.js'; + +const composer = (props, onData) => onData(null, { hasUser: Meteor.user() }); + +export default composeWithTracker(composer, {}, {}, { pure: false })(AppNavigation); diff --git a/imports/startup/client/routes.js b/imports/startup/client/routes.js index 36d266e..a2f5e2f 100644 --- a/imports/startup/client/routes.js +++ b/imports/startup/client/routes.js @@ -4,15 +4,33 @@ import React from 'react'; import { render } from 'react-dom'; import { Router, Route, IndexRoute, browserHistory } from 'react-router'; import { Meteor } from 'meteor/meteor'; -import App from '/imports/client/layouts/OrgApp'; + +/** + * General Components + */ import Index from '/imports/client/views/app/module/Index'; -import Login from '/imports/client/views/org/enter/Login'; + +/** + * Org Components + */ + +import App from '/imports/client/layouts/OrgApp'; +import Login from '/imports/client/views/org/enter/login/LoginView'; import NotFound from '/imports/client/views/org/NotFound'; import RecoverPassword from '/imports/client/views/org/enter/RecoverPassword'; import ResetPassword from '/imports/client/views/org/enter/ResetPassword'; -import Signup from '/imports/client/views/nonOrg/enter/SignupView'; import { Orgs } from '/imports/collections/orgs/index'; +/** + * NonOrg Components + */ +import Signup from '/imports/client/views/nonOrg/enter/SignupView'; + +/** + * Invalid Org Components + */ + + const authenticate = (nextState, replace) => { if (!Meteor.loggingIn() && !Meteor.userId()) { @@ -24,7 +42,7 @@ const authenticate = (nextState, replace) => { }; -const detectOrg = (nextState, replace) => { +const detectOrg = () => { orgSlug = ""; var hostnameArray = document.location.hostname.split( "." ); if(hostnameArray[1]=='localhost'){ @@ -35,13 +53,13 @@ const detectOrg = (nextState, replace) => { console.log(res); if(res){ Session.set('orgId', res._id._str); - render(getOrgRoutes(),document.getElementById('react-root')); + render(getOrgRoutes(),document.getElementById('app')); }else{ - render(getInvalidOrgRoute(),document.getElementById('react-root')); + render(getInvalidOrgRoute(),document.getElementById('app')); } }); }else{ - render(getNonOrgRoutes(),document.getElementById('react-root')); + render(getNonOrgRoutes(),document.getElementById('app')); } } const checkSlug = (nextState, replace) => { diff --git a/imports/startup/server/browser-policy.js b/imports/startup/server/browser-policy.js index 8b97e3b..a519fcf 100644 --- a/imports/startup/server/browser-policy.js +++ b/imports/startup/server/browser-policy.js @@ -1,3 +1,14 @@ import { BrowserPolicy } from 'meteor/browser-policy-common'; // e.g., BrowserPolicy.content.allowOriginForAll( 's3.amazonaws.com' ); BrowserPolicy.content.allowFontOrigin("data:"); + +BrowserPolicy.content.disallowEval(); + +BrowserPolicy.framing.allowAll(); +BrowserPolicy.content.allowInlineScripts(); +BrowserPolicy.content.allowInlineStyles(); +BrowserPolicy.content.allowSameOriginForAll(); +BrowserPolicy.content.allowDataUrlForAll(); +BrowserPolicy.content.allowOriginForAll('*'); +BrowserPolicy.content.allowOriginForAll('http://*'); +BrowserPolicy.content.allowOriginForAll('https://*');