initial project checkin
This commit is contained in:
commit
afce2f47a4
8
.gitignore
vendored
Normal file
8
.gitignore
vendored
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
*~
|
||||||
|
node_modules
|
||||||
|
|
||||||
|
# have to add the bundle to version control so deployment with git subtree works
|
||||||
|
# browser-bundle.js
|
||||||
|
# skeleton.css
|
||||||
|
|
||||||
|
browser-bundle.js.map
|
13
README.md
Normal file
13
README.md
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
## Math
|
||||||
|
|
||||||
|
http://www.geog.ucsb.edu/ideas/Insolation.html
|
||||||
|
|
||||||
|
## Libraries
|
||||||
|
|
||||||
|
https://www.npmjs.com/package/suncalc
|
||||||
|
|
||||||
|
## Tools
|
||||||
|
|
||||||
|
http://www.sunearthtools.com/dp/tools/pos_sun.php
|
||||||
|
|
||||||
|
|
2222
dist/browser-bundle.js
vendored
Normal file
2222
dist/browser-bundle.js
vendored
Normal file
File diff suppressed because one or more lines are too long
22
dist/index.html
vendored
Normal file
22
dist/index.html
vendored
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>Dubdiff 2</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="table-container">
|
||||||
|
<div class="table-block footer-push">
|
||||||
|
<div id="root">If you see this then something is wrong.</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="table-block">
|
||||||
|
<div class="container">
|
||||||
|
<footer id="footer" class="twelve columns">
|
||||||
|
<p><a href="http://adamarthurryan.com">Adam Brown</a> | This website is <a href="https://github.com/adamarthurryan/dubdiff-2">open source</a>.</p>
|
||||||
|
</footer>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<script src="browser-bundle.js"></script>
|
||||||
|
<link href="old-dubdiff.css" rel="stylesheet">
|
||||||
|
</body>
|
||||||
|
</html>
|
7002
dist/old-dubdiff.css
vendored
Normal file
7002
dist/old-dubdiff.css
vendored
Normal file
File diff suppressed because it is too large
Load Diff
29
package.json
Normal file
29
package.json
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
{
|
||||||
|
"name": "dubdiff-2",
|
||||||
|
"version": "0.0.0",
|
||||||
|
"description": "",
|
||||||
|
"main": "index.js",
|
||||||
|
"scripts": {
|
||||||
|
"build": "npm run webpack --colors",
|
||||||
|
"start": "npm run webpack --progress --colors --watch",
|
||||||
|
"deploy": "git subtree push --prefix dist origin gh-pages",
|
||||||
|
"test": "echo \"Error: no test specified\" && exit 1"
|
||||||
|
},
|
||||||
|
"author": "",
|
||||||
|
"license": "BSD-2-Clause",
|
||||||
|
"dependencies": {
|
||||||
|
"react": "^0.14.5",
|
||||||
|
"react-dom": "^0.14.5",
|
||||||
|
"react-redux": "^4.4.6",
|
||||||
|
"redux": "^3.5.1",
|
||||||
|
"reselect": "^2.5.1"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"babel-core": "^6.3.26",
|
||||||
|
"babel-loader": "^6.2.0",
|
||||||
|
"babel-preset-es2015": "^6.3.13",
|
||||||
|
"babel-preset-react": "^6.3.13",
|
||||||
|
"copyfiles": "^0.2.2",
|
||||||
|
"webpack": "^1.12.9"
|
||||||
|
}
|
||||||
|
}
|
3
src/actions.js
Normal file
3
src/actions.js
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
|
||||||
|
export const updateOriginalInput = (data) => ({ type: 'UPDATE_ORIGINAL_INPUT', data})
|
||||||
|
export const updateFinalInput = (data) => ({ type: 'UPDATE_FINAL_INPUT', data})
|
40
src/client.js
Normal file
40
src/client.js
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
import React from 'react'
|
||||||
|
import ReactDOM from 'react-dom'
|
||||||
|
|
||||||
|
import * as Redux from 'redux'
|
||||||
|
|
||||||
|
import {Provider} from 'react-redux'
|
||||||
|
import * as localStore from './localStore'
|
||||||
|
|
||||||
|
import * as reducers from './reducers'
|
||||||
|
|
||||||
|
import Main from './components/Main'
|
||||||
|
|
||||||
|
|
||||||
|
//create the redux store
|
||||||
|
//initial state is retrieved from localStore
|
||||||
|
const store = Redux.createStore(
|
||||||
|
Redux.combineReducers(reducers),
|
||||||
|
localStore.get(),
|
||||||
|
window.devToolsExtension ? window.devToolsExtension() : undefined
|
||||||
|
)
|
||||||
|
|
||||||
|
//save the state whenever the state changes
|
||||||
|
function saveState() {
|
||||||
|
let state = store.getState()
|
||||||
|
//pass the elements of state that should be persisted to the local store as an array of element name strings
|
||||||
|
localStore.set(state, [])
|
||||||
|
}
|
||||||
|
store.subscribe(saveState)
|
||||||
|
|
||||||
|
|
||||||
|
function render() {
|
||||||
|
ReactDOM.render(
|
||||||
|
<Provider store={store}>
|
||||||
|
<Main/>
|
||||||
|
</Provider>
|
||||||
|
, document.getElementById('root'))
|
||||||
|
}
|
||||||
|
|
||||||
|
render()
|
||||||
|
|
90
src/components/Main.js
Normal file
90
src/components/Main.js
Normal file
@ -0,0 +1,90 @@
|
|||||||
|
|
||||||
|
import React from 'react'
|
||||||
|
import {connect} from 'react-redux'
|
||||||
|
|
||||||
|
import * as Actions from '../actions'
|
||||||
|
import * as Selectors from '../selectors'
|
||||||
|
|
||||||
|
const mapStateToProps = (state) => ({
|
||||||
|
input: state.input,
|
||||||
|
safeInput: Selectors.safeInput(state),
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
|
const mapDispatchToProps = dispatch => ({
|
||||||
|
onChangeOriginal: (text) => dispatch(Actions.updateOriginalInput(text)),
|
||||||
|
onChangeFinal: (text) => dispatch(Actions.updateFinalInput(text))
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
|
class Main extends React.Component {
|
||||||
|
|
||||||
|
constructor() {
|
||||||
|
super()
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
render () {
|
||||||
|
return (
|
||||||
|
<div class="container">
|
||||||
|
<form class="row">
|
||||||
|
<div class="col-md-2 col-sm-12 form-group">
|
||||||
|
<div class="controls well col-lg-12">
|
||||||
|
<a type="button" ng-click="compare()" class="btn btn-block btn-primary">compare</a>
|
||||||
|
</div>
|
||||||
|
<div class="controls well btn-group col-lg-12">
|
||||||
|
<a ng-class="{"active": isMarkdownFormat}" type="submit" ng-click="toggleMarkdownFormat()" class="btn btn-block btn-primary active">
|
||||||
|
<span ng-class="{"glyphicon-ok": isMarkdownFormat}" class="glyphicon glyphicon-ok"></span>
|
||||||
|
As Markdown
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-lg-5 col-sm-12 form-group">
|
||||||
|
<label for="docA">Original</label>
|
||||||
|
<textarea id="docA" ng-model="docA" class="form-control"></textarea>
|
||||||
|
</div>
|
||||||
|
<div class="col-lg-5 col-sm-12 form-group">
|
||||||
|
<label for="docB">Final</label>
|
||||||
|
<textarea id="docB" ng-model="docB" class="form-control"></textarea>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function renderDate(props) {
|
||||||
|
return <div>
|
||||||
|
<DateInputForm/>
|
||||||
|
<div>
|
||||||
|
<p><strong>Data for {props.formattedDate}</strong></p>
|
||||||
|
<DateResultsSummary/>
|
||||||
|
<DateResultsChart/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
|
||||||
|
function renderMonthly(props) {
|
||||||
|
return <div>
|
||||||
|
<p><strong>Yearly Data</strong></p>
|
||||||
|
<MonthlyResultsSummary/>
|
||||||
|
<MonthlyResultsChart/>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
export default connect(mapStateToProps, mapDispatchToProps)(Main)
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
{this.props.view == "RESULTS" ?
|
||||||
|
(this.props.inputIsValid.valid ?
|
||||||
|
<div>
|
||||||
|
<p><strong>{this.props.formattedDate}</strong></p>
|
||||||
|
<DateResultsSummary/>
|
||||||
|
<DateResultsTable/>
|
||||||
|
</div> :
|
||||||
|
<InvalidResults/>
|
||||||
|
):
|
||||||
|
*/
|
7
src/localStore.js
Normal file
7
src/localStore.js
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
export const get = () => JSON.parse(localStorage.getItem('state')) || undefined;
|
||||||
|
|
||||||
|
export function set (state, props) {
|
||||||
|
let toSave = {}
|
||||||
|
props.forEach(p => toSave[p] = state[p])
|
||||||
|
localStorage.setItem('state', JSON.stringify(toSave))
|
||||||
|
}
|
40
src/reducers.js
Normal file
40
src/reducers.js
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
|
||||||
|
|
||||||
|
export function textInput (state, action ) {
|
||||||
|
switch (action.type) {
|
||||||
|
case 'UPDATE_ORIGINAL_INPUT':
|
||||||
|
return Object.assign({}, state, {original:action.data})
|
||||||
|
default:
|
||||||
|
return state || {original:"", final:""}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
export function locationInput (state, action) {
|
||||||
|
switch (action.type) {
|
||||||
|
case 'UPDATE_LOCATION_INPUT':
|
||||||
|
return Object.assign({}, state, action.data)
|
||||||
|
default:
|
||||||
|
return state || {latitude:"0", longitude:"0"}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export function dateInput (state, action) {
|
||||||
|
switch (action.type) {
|
||||||
|
case 'UPDATE_DATE_INPUT':
|
||||||
|
return action.data
|
||||||
|
default:
|
||||||
|
return state || "Jun 21"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export function view (state, action) {
|
||||||
|
switch (action.type) {
|
||||||
|
case 'VIEW_DATE':
|
||||||
|
return 'DATE'
|
||||||
|
case 'VIEW_MONTHLY':
|
||||||
|
return 'MONTHLY'
|
||||||
|
default:
|
||||||
|
return state || 'MONTHLY'
|
||||||
|
}
|
||||||
|
}
|
13
src/selectors.js
Normal file
13
src/selectors.js
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
//per http://redux.js.org/docs/recipes/ComputingDerivedData.html
|
||||||
|
|
||||||
|
import { createSelector } from 'reselect'
|
||||||
|
|
||||||
|
const input = (state) => state.input
|
||||||
|
|
||||||
|
export const safeInput = createSelector(
|
||||||
|
[input],
|
||||||
|
(input) => {
|
||||||
|
//!!! sanitize the input here and return
|
||||||
|
return input
|
||||||
|
}
|
||||||
|
)
|
21
webpack.config.js
Normal file
21
webpack.config.js
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
module.exports = {
|
||||||
|
cache: true,
|
||||||
|
entry: './src/client',
|
||||||
|
output: {
|
||||||
|
filename: './dist/browser-bundle.js'
|
||||||
|
},
|
||||||
|
target: 'web',
|
||||||
|
devtool: 'eval-cheap-module-source-map',
|
||||||
|
module: {
|
||||||
|
loaders: [
|
||||||
|
{
|
||||||
|
test: /\.js$/,
|
||||||
|
loader: 'babel-loader',
|
||||||
|
query: {
|
||||||
|
presets: ['es2015', 'react'],
|
||||||
|
compact: "false"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
]
|
||||||
|
},
|
||||||
|
};
|
Loading…
Reference in New Issue
Block a user