Skip to content

Commit 49442a6

Browse files
committed
Maxceems mission planner submission
1 parent 94182f9 commit 49442a6

File tree

64 files changed

+2760
-33
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

64 files changed

+2760
-33
lines changed

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,4 @@ node_modules
55
.idea
66
dist
77
coverage
8+
.tmp

README.md

+4-4
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111

1212

1313
## Configuration
14-
Configuration files are located under `config` dir.
14+
Configuration files are located under `config` dir.
1515
See Guild https://github.com/lorenwest/node-config/wiki/Configuration-Files
1616

1717
|Name|Description|
@@ -32,7 +32,7 @@ See Guild https://github.com/lorenwest/node-config/wiki/Configuration-Files
3232
|`dev`|Start app in the dev mode.|
3333
|`lint`|Lint all `.js` files.|
3434
|`lint:fix`|Lint and fix all `.js` files. [Read more on this](http://eslint.org/docs/user-guide/command-line-interface.html#fix).|
35+
|`test`|Run tests using [mocha-webpack](https://github.com/webpack/mocha-loader) for all `*.spec.(js|jsx)` files in the `src` dir.|
3536

36-
37-
## Video
38-
http://take.ms/WZkTO
37+
## Google Map
38+
In this project module [react-google-maps](https://github.com/tomchentw/react-google-maps) is used to work with google maps. So it can be used for any new functionality.

blueprints/component/files/src/components/__name__/__name__.jsx

+2-1
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,12 @@ import styles from './<%= pascalEntityName %>.scss';
44

55
export const <%= pascalEntityName %> = () => (
66
<div styleName="<%= dashesEntityName %>">
7+
<%= pascalEntityName %>
78
</div>
89
);
910

1011
<%= pascalEntityName %>.propTypes = {
11-
foo: PropTypes.string.isRequired,
12+
// foo: PropTypes.string.isRequired,
1213
};
1314

1415
export default CSSModules(<%= pascalEntityName %>, styles);

blueprints/component/files/src/components/__name__/__name__.scss

+2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
.<%= dashesEntityName %> {
2+
background-color: transparent;
3+
24
:global {
35

46
}

blueprints/route/files/src/routes/__name__/components/__name__View.js

-14
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import React, {PropTypes} from 'react';
2+
import CSSModules from 'react-css-modules';
3+
import styles from './<%= pascalEntityName %>View.scss';
4+
5+
export const <%= pascalEntityName %>View = () => (
6+
<div styleName="<%= dashesEntityName %>-view">
7+
<%= pascalEntityName %>View
8+
</div>
9+
);
10+
11+
<%= pascalEntityName %>View.propTypes = {
12+
// foo: PropTypes.string.isRequired,
13+
};
14+
15+
export default CSSModules(<%= pascalEntityName %>View, styles);

blueprints/route/files/src/routes/__name__/components/__name__View.scss

+3-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
.<%= camelEntityName %>View {
1+
.<%= dashesEntityName %>-view {
2+
background-color: transparent;
3+
24
:global {
35

46
}

blueprints/route/files/src/routes/__name__/containers/__name__Container.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { asyncConnect } from 'redux-connect';
2-
import {actions} from '../modules/<%= pascalEntityName %>';
2+
import { actions } from '../modules/<%= pascalEntityName %>';
33

44
import <%= pascalEntityName %>View from '../components/<%= pascalEntityName %>View';
55

blueprints/route/files/src/routes/__name__/index.js

+1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ export default (store) => ({
66
require.ensure([], (require) => {
77
const <%= pascalEntityName %> = require('./containers/<%= pascalEntityName %>Container').default;
88
const reducer = require('./modules/<%= pascalEntityName %>').default;
9+
910
injectReducer(store, { key: '<%= camelEntityName %>', reducer });
1011
cb(null, <%= pascalEntityName %>);
1112
}, '<%= pascalEntityName %>');

blueprints/route/files/src/routes/__name__/modules/__name__.js

+5-2
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ export const SAMPLE = '<%= pascalEntityName %>/SAMPLE';
1111

1212

1313
export const sample2 = () => async (dispatch, getState) => {
14-
14+
getState(); // to pass eslint from the begining
1515
};
1616

1717
export const actions = {
@@ -23,5 +23,8 @@ export const actions = {
2323
// Reducer
2424
// ------------------------------------
2525
export default handleActions({
26-
[SAMPLE]: (state, {payload}) => state,
26+
[SAMPLE]: (state, {payload}) => {
27+
payload; // to pass eslint from the begining
28+
return state;
29+
},
2730
}, {});

config/default.js

+1
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,5 @@
55
module.exports = {
66
PORT: process.env.PORT || 3000,
77
GOOGLE_API_KEY: process.env.GOOGLE_API_KEY || 'AIzaSyCrL-O319wNJK8kk8J_JAYsWgu6yo5YsDI',
8+
API_BASE_PATH: process.env.API_BASE_PATH || 'http://localhost:3500',
89
};

package.json

+15-2
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@
88
"start": "cross-env NODE_ENV=production node server",
99
"build": "cross-env NODE_ENV=production webpack --bail --progress --build --tc",
1010
"lint": "eslint --ext jsx --ext js .",
11-
"lint:fix": "npm run lint -- --fix"
11+
"lint:fix": "npm run lint -- --fix",
12+
"test": "mocha-webpack --require setup-test.js --webpack-config webpack.config-test.js \"src/**/*.spec.(jsx|js)\""
1213
},
1314
"author": "",
1415
"license": "MIT",
@@ -34,6 +35,7 @@
3435
"express": "^4.14.0",
3536
"extract-text-webpack-plugin": "^1.0.1",
3637
"file-loader": "^0.9.0",
38+
"flexboxgrid": "^6.3.1",
3739
"history": "^2.0.0",
3840
"html-webpack-plugin": "^2.22.0",
3941
"imports-loader": "^0.6.5",
@@ -50,8 +52,11 @@
5052
"react-css-modules": "^3.7.10",
5153
"react-date-picker": "^5.3.28",
5254
"react-dom": "^15.3.2",
55+
"react-flexbox-grid": "^0.10.2",
56+
"react-google-maps": "^6.0.1",
5357
"react-modal": "^1.5.2",
5458
"react-redux": "^4.0.0",
59+
"react-redux-toastr": "^4.2.2",
5560
"react-router": "^2.8.1",
5661
"react-router-redux": "^4.0.0",
5762
"react-select": "^1.0.0-rc.2",
@@ -73,15 +78,23 @@
7378
"yargs": "^4.0.0"
7479
},
7580
"devDependencies": {
81+
"chai": "^3.5.0",
82+
"css-modules-require-hook": "^4.0.5",
83+
"enzyme": "^2.6.0",
7684
"eslint": "^3.7.1",
7785
"eslint-config-airbnb": "^12.0.0",
7886
"eslint-plugin-babel": "^3.3.0",
7987
"eslint-plugin-import": "^1.16.0",
8088
"eslint-plugin-jsx-a11y": "^2.2.2",
8189
"eslint-plugin-react": "^6.3.0",
90+
"jsdom": "^9.8.3",
91+
"mocha": "^3.2.0",
92+
"mocha-webpack": "^0.7.0",
8293
"nodemon": "^1.8.1",
94+
"react-addons-test-utils": "^15.4.1",
8395
"webpack-dev-middleware": "^1.8.3",
84-
"webpack-hot-middleware": "^2.13.0"
96+
"webpack-hot-middleware": "^2.13.0",
97+
"webpack-node-externals": "^1.5.4"
8598
},
8699
"engines": {
87100
"node": "6.7.0"

setup-test.js

+31
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
const hook = require('css-modules-require-hook');
2+
const sass = require('node-sass');
3+
4+
/*
5+
take care of css modules
6+
*/
7+
hook({
8+
extensions: ['.scss', '.css'],
9+
generateScopedName: '[local]___[hash:base64:5]',
10+
preprocessCss: (data, file) => sass.renderSync({ file }).css,
11+
});
12+
13+
/*
14+
init jsdom to simulate browser
15+
*/
16+
const jsdom = require('jsdom').jsdom;
17+
18+
const exposedProperties = ['window', 'navigator', 'document'];
19+
20+
global.document = jsdom('');
21+
global.window = document.defaultView;
22+
Object.keys(document.defaultView).forEach((property) => {
23+
if (typeof global[property] === 'undefined') {
24+
exposedProperties.push(property);
25+
global[property] = document.defaultView[property];
26+
}
27+
});
28+
29+
global.navigator = {
30+
userAgent: 'node.js',
31+
};

src/components/Button/Button.jsx

+4-2
Original file line numberDiff line numberDiff line change
@@ -4,19 +4,21 @@ import _ from 'lodash';
44
import cn from 'classnames';
55
import styles from './Button.scss';
66

7-
export const Button = ({children, color, ...rest}) => (
8-
<button {..._.omit(rest, 'styles')} styleName={cn('button', `color-${color}`)}>
7+
export const Button = ({children, color, size, ...rest}) => (
8+
<button {..._.omit(rest, 'styles')} styleName={cn('button', `color-${color}`, `size-${size}`)}>
99
{children}
1010
</button>
1111
);
1212

1313
Button.propTypes = {
1414
children: PropTypes.string.isRequired,
1515
color: PropTypes.string.isRequired,
16+
size: PropTypes.string,
1617
};
1718

1819
Button.defaultProps = {
1920
type: 'button',
21+
size: 'normal',
2022
};
2123

2224
export default CSSModules(Button, styles, {allowMultiple: true});

src/components/Button/Button.scss

+10-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
.button {
2-
padding: 13px 10px;
32
min-width: 115px;
43
color: white;
54
border: none;
@@ -12,4 +11,13 @@
1211

1312
.color-blue {
1413
background: #315b95;
15-
}
14+
}
15+
16+
.size-normal {
17+
padding: 13px 10px;
18+
}
19+
20+
.size-medium {
21+
height: 38px;
22+
padding: 0 10px;
23+
}

src/components/TextField/TextField.jsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import styles from './TextField.scss';
55

66
export const TextField = (props) => (
77
<div styleName="text-field">
8-
<input {..._.pick(props, 'type', 'value', 'onChange')} />
8+
<input {..._.pick(props, 'type', 'value', 'onChange', 'placeholder')} />
99
</div>
1010
);
1111

src/containers/AppContainer.jsx

+12-1
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,21 @@ import React, { PropTypes } from 'react';
22
import { ReduxAsyncConnect } from 'redux-connect';
33
import { Router } from 'react-router';
44
import { Provider } from 'react-redux';
5+
import ReduxToastr from 'react-redux-toastr';
56

67
const AppContainer = ({ history, routes, routerKey, store }) => (
78
<Provider store={store}>
8-
<Router history={history} render={(props) => <ReduxAsyncConnect {...props} />} key={routerKey}>{routes}</Router>
9+
<div>
10+
<Router history={history} render={(props) => <ReduxAsyncConnect {...props} />} key={routerKey}>{routes}</Router>
11+
<ReduxToastr
12+
timeOut={3000}
13+
newestOnTop={false}
14+
preventDuplicates
15+
position="top-right"
16+
transitionIn="fadeIn"
17+
transitionOut="fadeOut"
18+
/>
19+
</div>
920
</Provider>
1021
);
1122

src/routes/Dashboard/modules/Dashboard.js

+2
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,9 @@ import { handleActions } from 'redux-actions';
66

77

88
export const sendRequest = (values) => new Promise((resolve) => {
9+
/* eslint-disable no-alert */
910
alert(JSON.stringify(values, null, 2));
11+
/* eslint-enable no-alert */
1012
resolve();
1113
});
1214

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
import React, { PropTypes } from 'react';
2+
import CSSModules from 'react-css-modules';
3+
import { Link } from 'react-router';
4+
import styles from './MissionListView.scss';
5+
6+
export const MissionListView = ({ missions, deleteMission }) => (
7+
<div styleName="mission-list-view">
8+
<div styleName="wrap">
9+
<div styleName="header">
10+
<h1 styleName="title">Mission List</h1>
11+
<Link to="/mission-planner" styleName="create-btn">Create New Mission</Link>
12+
</div>
13+
<div styleName="panel">
14+
{missions.length ? (
15+
<table styleName="my-request-table">
16+
<thead styleName="thead">
17+
<tr>
18+
<th styleName="th">Mission Name</th>
19+
<th styleName="th" />
20+
<th styleName="th" />
21+
<th styleName="th" />
22+
</tr>
23+
</thead>
24+
<tbody>
25+
{missions.map((mission) => (
26+
<tr styleName="tr" key={mission.id}>
27+
<td styleName="td">{mission.missionName}</td>
28+
<td styleName="td"><Link to={`/mission-planner/${mission.id}`}>Edit</Link></td>
29+
<td styleName="td"><a href={mission.downloadLink} target="_blank" rel="noopener noreferrer">Download</a></td>
30+
<td styleName="td"><a href="#" onClick={(event) => { event.preventDefault(); deleteMission(mission.id); }}>Delete</a></td>
31+
</tr>
32+
))}
33+
</tbody>
34+
</table>
35+
) : (
36+
<span>No missions found.</span>
37+
)}
38+
</div>
39+
</div>
40+
</div>
41+
);
42+
43+
MissionListView.propTypes = {
44+
missions: PropTypes.array.isRequired,
45+
deleteMission: PropTypes.func.isRequired,
46+
};
47+
48+
export default CSSModules(MissionListView, styles);

0 commit comments

Comments
 (0)