This file was deleted.

@@ -0,0 +1,48 @@
'use strict';

Object.defineProperty(exports, "__esModule", {
value: true
});

var _react = require('react');

var _react2 = _interopRequireDefault(_react);

var _dataRow = require('./dataRow');

var _dataRow2 = _interopRequireDefault(_dataRow);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

var DataDiv = function DataDiv(props) {
var mergedArray = Object.keys(props.objectToDisplay).concat(props.hiddenProps);
mergedArray.sort();
var dataRows = [];
for (var i = 0; i < mergedArray.length; i++) {
if (mergedArray[i] != mergedArray[i + 1]) {
if (props.positionedProps.indexOf(mergedArray[i]) < 0) {
dataRows.push(_react2.default.createElement(_dataRow2.default, { key: mergedArray[i], name: mergedArray[i], value: props.objectToDisplay[mergedArray[i]] }));
}
} else {
i++;
}
}
for (var x = props.positionedProps.length - 1; x > -1; x--) {
if (props.hiddenProps.indexOf(props.positionedProps[x]) < 0) {
dataRows.splice(0, 0, _react2.default.createElement(_dataRow2.default, { key: props.positionedProps[x], name: props.positionedProps[x], value: props.objectToDisplay[props.positionedProps[x]] }));
}
}
return _react2.default.createElement(
'div',
null,
dataRows
);
};

DataDiv.propTypes = {
objectToDisplay: _react2.default.PropTypes.object.isRequired,
positionedProps: _react2.default.PropTypes.array,
hiddenProps: _react2.default.PropTypes.array
};

exports.default = DataDiv;
@@ -8,17 +8,19 @@ var _react = require("react");

var _react2 = _interopRequireDefault(_react);

var _util = require("../../util");

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

//Displays data
function DataRow(props) {
return props.name && props.value && _react2.default.createElement(
return !props.value == "" && props.name && props.value && _react2.default.createElement(
"span",
{ className: (props.name + "-cell").toLowerCase() },
_react2.default.createElement(
"b",
null,
props.name
(0, _util.beautifyString)(props.name)
),
": ",
props.value,
@@ -0,0 +1,38 @@
'use strict';

Object.defineProperty(exports, "__esModule", {
value: true
});

var _react = require('react');

var _react2 = _interopRequireDefault(_react);

var _reactRedux = require('react-redux');

var _reactBootstrap = require('react-bootstrap');

var _monsterSearchContainer = require('../container/monsterSearchContainer');

var _monsterSearchContainer2 = _interopRequireDefault(_monsterSearchContainer);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

var MonsterPage = function MonsterPage(props) {
return _react2.default.createElement(
'div',
null,
_react2.default.createElement(
_reactBootstrap.Row,
{ id: 'spell-page-div', className: 'boostrap-row-margin-override' },
_react2.default.createElement(
_reactBootstrap.Col,
{ id: 'search-container', xs: 12, sm: 3 },
_react2.default.createElement(_monsterSearchContainer2.default, null)
)
),
_react2.default.createElement('script', { src: 'bundle.js' })
);
};

exports.default = MonsterPage;
@@ -8,46 +8,18 @@ var _react = require("react");

var _react2 = _interopRequireDefault(_react);

var _dataRow = require("./dataRow");
var _dataDiv = require("./dataDiv");

var _dataRow2 = _interopRequireDefault(_dataRow);
var _dataDiv2 = _interopRequireDefault(_dataDiv);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

//Contains a spell. Will eventually be able to click attributes to expand them so will need state.
function SpellDiv(props) {
console.log(JSON.stringify(props.filters));
return _react2.default.createElement(
"div",
null,
_react2.default.createElement(_dataRow2.default, { name: "Name", value: props.spell.name }),
(!props.filters || props.filters.desc) && _react2.default.createElement(_dataRow2.default, { name: "Description", value: props.spell.desc }),
(!props.filters || props.filters.level) && _react2.default.createElement(_dataRow2.default, { name: "Level", value: props.spell.level == 0 ? "Cantrip" : props.spell.level }),
(!props.filters || props.filters.class) && _react2.default.createElement(_dataRow2.default, { name: "Class", value: props.spell.class }),
(!props.filters || props.filters.range) && _react2.default.createElement(_dataRow2.default, { name: "Range", value: props.spell.range }),
(!props.filters || props.filters.casting_time) && _react2.default.createElement(_dataRow2.default, { name: "Casting Time", value: props.spell.casting_time }),
(!props.filters || props.filters.duration) && _react2.default.createElement(_dataRow2.default, { name: "Duration", value: props.spell.duration }),
(!props.filters || props.filters.concentration) && _react2.default.createElement(_dataRow2.default, { name: "Concentration", value: props.spell.concentration }),
(!props.filters || props.filters.school) && _react2.default.createElement(_dataRow2.default, { name: "School", value: props.spell.school }),
(!props.filters || props.filters.components) && _react2.default.createElement(_dataRow2.default, { name: "Components", value: props.spell.components }),
(!props.filters || props.filters.ritual) && _react2.default.createElement(_dataRow2.default, { name: "Ritual", value: props.spell.ritual })
_react2.default.createElement(_dataDiv2.default, { objectToDisplay: props.spell, hiddenProps: props.filters, positionedProps: ['name', 'description'] })
);
}

SpellDiv.propTypes = {
spell: _react2.default.PropTypes.shape({
name: _react2.default.PropTypes.string.isRequired,
description: _react2.default.PropTypes.string,
range: _react2.default.PropTypes.string,
components: _react2.default.PropTypes.string,
ritual: _react2.default.PropTypes.string,
duration: _react2.default.PropTypes.string,
concentration: _react2.default.PropTypes.string,
casting_time: _react2.default.PropTypes.string,
level: _react2.default.PropTypes.oneOfType([_react2.default.PropTypes.string, _react2.default.PropTypes.number]),
school: _react2.default.PropTypes.string,
class: _react2.default.PropTypes.string
})
};

exports.default = SpellDiv;
@@ -23,7 +23,7 @@ var SpellListItem = function SpellListItem(props) {
'div',
{ className: 'spell-list-item', onDoubleClick: props.handleDoubleClick },
_react2.default.createElement(_spellListItemHeader2.default, { removeSpell: props.removeSpell, toggleMinimization: props.toggleMinimization, name: props.spell.name }),
_react2.default.createElement(_spellDiv2.default, { spell: props.spell, filters: props.filters })
_react2.default.createElement(_spellDiv2.default, { objectToDisplay: props.spell, hiddenProps: props.filters })
);
};

Large diffs are not rendered by default.

This file was deleted.

This file was deleted.

@@ -4,27 +4,19 @@ Object.defineProperty(exports, "__esModule", {
value: true
});

function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }

function filters() {
var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : { desc: true,
level: true,
class: true,
range: true,
casting_time: true,
duration: true,
concentration: true,
school: true,
components: true,
ritual: true };
var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ["page", "material"];
var action = arguments[1];

switch (action.type) {
case "ADD_FILTER":
return Object.assign({}, state, _defineProperty({}, action.filterName, true));
return [].concat(_toConsumableArray(state), [action.filterName]);
break;
case "REMOVE_FILTER":
return Object.assign({}, state, _defineProperty({}, action.filterName, false));
var filterIndex = state.indexOf(action.filterName);
return [].concat(_toConsumableArray(state.slice(0, filterIndex)), _toConsumableArray(state.slice(filterIndex + 1)));
break;
default:
return state;
@@ -26,10 +26,15 @@ var _settingReducer = require('./settingReducer');

var _settingReducer2 = _interopRequireDefault(_settingReducer);

var _monsterReducer = require('./monsterReducer');

var _monsterReducer2 = _interopRequireDefault(_monsterReducer);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

var rootReducer = (0, _redux.combineReducers)({
spells: _spellReducer2.default,
monsters: _monsterReducer2.default,
filters: _filterReducer2.default,
user: _userReducer2.default,
modals: _modalReducer2.default,
@@ -0,0 +1,43 @@
"use strict";

Object.defineProperty(exports, "__esModule", {
value: true
});

var _monsterSearcher = require("../searchers/monsterSearcher");

var _monsterSearcher2 = _interopRequireDefault(_monsterSearcher);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }

function monsters() {
var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : { monsterList: [] };
var action = arguments[1];

switch (action.type) {
case "SEARCH_MONSTER":
var newMonster = _monsterSearcher2.default.search(action.monsterName);
if (newMonster) {
console.log(JSON.stringify(state));
return Object.assign({}, state, { currentMonster: newMonster });
} else {
return state;
}
break;
case "ADD_MONSTER":
var addedMonsterList = [].concat(_toConsumableArray(state.monsterList), [action.newMonster]);
return Object.assign({}, state, { monsterList: addedMonsterList });
console.log(JSON.stringify(state));
break;
case "REMOVE_MONSTER":
var removedMonsterList = [].concat(_toConsumableArray(state.monsterList.slice(0, action.monsterIndex)), _toConsumableArray(state.monsterList.slice(action.monsterIndex + 1)));
return Object.assign({}, state, { monsterList: removedMonsterList });
break;
default:
return state;
}
}

exports.default = monsters;
@@ -29,7 +29,6 @@ function spells() {
case "ADD_SPELL":
var addedSpellList = [].concat(_toConsumableArray(state.spellList), [action.newSpell]);
return Object.assign({}, state, { spellList: addedSpellList });
return state;
break;
case "REMOVE_SPELL":
var removedSpellList = [].concat(_toConsumableArray(state.spellList.slice(0, action.spellIndex)), _toConsumableArray(state.spellList.slice(action.spellIndex + 1)));
@@ -1,7 +1,7 @@
"use strict";

Object.defineProperty(exports, "__esModule", {
value: true
value: true
});

var _react = require("react");
@@ -22,19 +22,24 @@ var _startPageContainer = require("./components/container/startPageContainer");

var _startPageContainer2 = _interopRequireDefault(_startPageContainer);

var _monsterPage = require("./components/presentational/monsterPage");

var _monsterPage2 = _interopRequireDefault(_monsterPage);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

var AppRouter = function AppRouter() {
return _react2.default.createElement(
_reactRouter.Router,
{ history: _reactRouter.browserHistory },
_react2.default.createElement(
_reactRouter.Route,
{ path: "/", component: _appRoot2.default },
_react2.default.createElement(_reactRouter.Route, { path: "spell", component: _spellPage2.default }),
_react2.default.createElement(_reactRouter.Route, { path: "start", component: _startPageContainer2.default })
)
);
return _react2.default.createElement(
_reactRouter.Router,
{ history: _reactRouter.browserHistory },
_react2.default.createElement(
_reactRouter.Route,
{ path: "/", component: _appRoot2.default },
_react2.default.createElement(_reactRouter.Route, { path: "spells", component: _spellPage2.default }),
_react2.default.createElement(_reactRouter.Route, { path: "start", component: _startPageContainer2.default }),
_react2.default.createElement(_reactRouter.Route, { path: "monsters", component: _monsterPage2.default })
)
);
};

exports.default = AppRouter;
@@ -52,7 +52,25 @@ router.get("/start", function (req, res) {
});
});

router.get("/spell", function (req, res) {
router.get("/spells", function (req, res) {
(0, _reactRouter.match)({ routes: routes, location: req.url }, function (error, redirectLocation, renderProps) {
if (error) {
console.log(error.message);
res.status(500).send(error.message);
} else if (renderProps) {
var content = _server2.default.renderToString(_react2.default.createElement(
_reactRedux.Provider,
{ store: _configureStore.store },
_react2.default.createElement(_reactRouter.RouterContext, renderProps)
));
res.send(unmanagedMarkup + ("<div id = 'page-wrapper'>" + content + "</div>"));
} else {
res.status(404).send("Not Found");
}
});
});

router.get("/monsters", function (req, res) {
(0, _reactRouter.match)({ routes: routes, location: req.url }, function (error, redirectLocation, renderProps) {
if (error) {
console.log(error.message);

This file was deleted.

This file was deleted.

This file was deleted.

@@ -17,5 +17,12 @@ var initialCapsString = function initialCapsString(string) {
return null;
};

var beautifyString = function beautifyString(string) {
return string.replace(/_|-/g, " ").replace(/\b\w/g, function (letter) {
return letter.toUpperCase();
});
};

exports.normalizeString = normalizeString;
exports.initialCapsString = initialCapsString;
exports.initialCapsString = initialCapsString;
exports.beautifyString = beautifyString;

Large diffs are not rendered by default.

@@ -0,0 +1,78 @@
//import {storeMonsterList, retrieveMonsterList} from '../databaseConvenienceFunctions';

function searchMonster(monsterName){
return {type: "SEARCH_MONSTER", monsterName: monsterName};
}

function addMonster(newMonster){
return {type: "ADD_MONSTER", newMonster: newMonster};
}

function removeMonster(monsterIndex){
return {type: "REMOVE_MONSTER", monsterIndex: monsterIndex};
}

export {searchMonster, addMonster, removeMonster};
//
// function requestRetrieveMonsterList(user){
// return {type: "REQUEST_RETRIEVE_MONSTER_LIST", user: user};
// }
//
// function recieveRetrieveMonsterList(user, monsterList){
// return {type: "RECIEVE_RETRIEVE_MONSTER_LIST", user: user, monsterList: monsterList};
// }
//
// function errorRetrieveMonsterList(){
// return {type: "ERROR_RETRIEVE_MONSTER_LIST"};
// }
//
// function requestStoreMonsterList(user){
// return {type: "REQUEST_STORE_MONSTER_LIST", user: user};
// }
//
// function recieveStoreMonsterList(user){
// return {type: "RECIEVE_STORE_MONSTER_LIST", user: user};
// }
//
// function attemptStoreMonsterList(monsterList, user) {
// return ((dispatch, getState) => {
// dispatch(requestStoreMonsterList(user));
// storeMonsterList(monsterList, user)
// .then((response) => {
// dispatch(recieveStoreMonsterList(user));
// console.log(response);
// })
// .catch((response) => {
// console.log(response);
// });
// });
// }
//
// function attemptRetrieveMonsterList(user) {
// if (user){
// return ((dispatch, getState) => {
// dispatch(requestRetrieveMonsterList(user));
// console.log("Sent request");
// retrieveMonsterList(user)
// .then((response) => {
// let {monsterList} = JSON.parse(response).Item;
// dispatch(recieveRetrieveMonsterList(user, monsterList));
// console.log(response);
// },
// (response) => {
// console.log("ERROR ACCESSING DB");
// dispatch(errorRetrieveMonsterList());
// })
// .catch((reason) =>{
// console.log(`ERROR RESOLVING PROMISE: ${reason}`);
// dispatch(errorRetrieveMonsterList());
// });
// });
// }
// else{
// console.log("No user");
// }
// }


//export {searchMonster, attemptAddMonster, removeMonster, attemptStoreMonsterList, attemptRetrieveMonsterList, recieveRetrieveMonsterList, requestRetrieveMonsterList};
@@ -23,16 +23,19 @@ class FilterSettingsModalContentContainer extends React.Component{
return (
<div>
<h5>Filters</h5>
<ControlledToggleItem isChecked = {this.props.filters["desc"]} handleChange = {this.toggleFilter} value = "desc" name = "Description"/>
<ControlledToggleItem isChecked = {this.props.filters["level"]} handleChange = {this.toggleFilter} value = "level" name = "Level"/>
<ControlledToggleItem isChecked = {this.props.filters["class"]} handleChange = {this.toggleFilter} value = "class" name = "Class"/>
<ControlledToggleItem isChecked = {this.props.filters["range"]} handleChange = {this.toggleFilter} value = "range" name = "Range"/>
<ControlledToggleItem isChecked = {this.props.filters["casting_time"]} handleChange = {this.toggleFilter} value = "casting_time" name = "Casting Time"/>
<ControlledToggleItem isChecked = {this.props.filters["duration"]} handleChange = {this.toggleFilter} value = "duration" name = "Duration"/>
<ControlledToggleItem isChecked = {this.props.filters["concentration"]} handleChange = {this.toggleFilter} value = "concentration" name = "Concentration"/>
<ControlledToggleItem isChecked = {this.props.filters["school"]} handleChange = {this.toggleFilter} value = "school" name = "School"/>
<ControlledToggleItem isChecked = {this.props.filters["components"]} handleChange = {this.toggleFilter} value = "components" name = "Components"/>
<ControlledToggleItem isChecked = {this.props.filters["ritual"]} handleChange = {this.toggleFilter} value = "ritual" name = "Ritual"/>
<ControlledToggleItem isChecked = {this.props.filters.indexOf("description") > -1} handleChange = {this.toggleFilter} value = "description" name = "Description"/>
<ControlledToggleItem isChecked = {this.props.filters.indexOf("level") > -1} handleChange = {this.toggleFilter} value = "level" name = "Level"/>
<ControlledToggleItem isChecked = {this.props.filters.indexOf("class") > -1} handleChange = {this.toggleFilter} value = "class" name = "Class"/>
<ControlledToggleItem isChecked = {this.props.filters.indexOf("range") > -1} handleChange = {this.toggleFilter} value = "range" name = "Range"/>
<ControlledToggleItem isChecked = {this.props.filters.indexOf("casting_time") > -1} handleChange = {this.toggleFilter} value = "casting_time" name = "Casting Time"/>
<ControlledToggleItem isChecked = {this.props.filters.indexOf("duration") > -1} handleChange = {this.toggleFilter} value = "duration" name = "Duration"/>
<ControlledToggleItem isChecked = {this.props.filters.indexOf("concentration") > -1} handleChange = {this.toggleFilter} value = "concentration" name = "Concentration"/>
<ControlledToggleItem isChecked = {this.props.filters.indexOf("school") > -1} handleChange = {this.toggleFilter} value = "school" name = "School"/>
<ControlledToggleItem isChecked = {this.props.filters.indexOf("components") > -1} handleChange = {this.toggleFilter} value = "components" name = "Components"/>
<ControlledToggleItem isChecked = {this.props.filters.indexOf("ritual") > -1} handleChange = {this.toggleFilter} value = "ritual" name = "Ritual"/>
<ControlledToggleItem isChecked = {this.props.filters.indexOf("material") > -1} handleChange = {this.toggleFilter} value = "material" name = "Material"/>
<ControlledToggleItem isChecked = {this.props.filters.indexOf("page") > -1} handleChange = {this.toggleFilter} value = "page" name = "Page"/>

</div>
);
}
@@ -0,0 +1,42 @@
import React from "react";
import ReactDOM from "react-dom";
import {connect} from "react-redux";
import {searchMonster, addMonster} from "~/actions/monsterActions"
import ImageButton from '../presentational/imageButton';
import SearchContainer from './searchContainer';

//Search container.
class SpellSearchContainer extends React.Component{
constructor(props){
super(props);
this.handleChange = this.handleChange.bind(this);
this.addMonster = this.addMonster.bind(this);
this.state = {currentText: ""};
}

handleChange(event){
this.setState({currentText: event.target.value});
this.props.dispatch(searchMonster(this.state.currentText));
}

addMonster(event){
this.props.dispatch(addMonster(this.props.currentMonster));
}

render () {
return (
<SearchContainer positionedProps = {['name']} onFound = {this.addMonster} handleChange = {this.handleChange} currentText = {this.state.currentText} foundItem = {this.props.currentMonster} hiddenProps = {['actions', 'special_abilities', 'legendary_actions']}/>
);
}
}
//SearchContainer = Radium(SearchContainer);



function mapStateToProps(state, ownProps){
return {
currentMonster: state.monsters.currentMonster
}
}

export default connect(mapStateToProps)(SpellSearchContainer);
@@ -0,0 +1,35 @@
import React from "react";
import ReactDOM from "react-dom";
import SpellDiv from "../presentational/spellDiv";
import ImageButton from '../presentational/imageButton';
import DataDiv from '../presentational/dataDiv';

//Search container.
class SearchContainer extends React.Component{
constructor(props){
super(props);
this.onKeyUp = this.onKeyUp.bind(this);
}

onKeyUp(event){
let keycode = (event.keyCode ? event.keyCode : event.which);
if(keycode === 13){
this.props.onFound();
}
}

render () {
return (
<div>
<div id = 'search-input'>
<input className = "styled-input" type = "text" onKeyUp = {this.onKeyUp} value = {this.props.currentText} onChange = {this.props.handleChange} />
{this.props.foundItem && <ImageButton imageSrc = {"plus"} handleClick = {this.props.onFound}/>}
</div>
{this.props.foundItem && <DataDiv positionedProps = {this.props.positionedProps} hiddenProps = {this.props.hiddenProps} objectToDisplay = {this.props.foundItem}/>}
{/*{this.props.foundItem && <SpellDiv spell = {this.props.foundItem}/>}*/}
</div>
);
}
}

export default SearchContainer;
@@ -1,17 +1,16 @@
import React from "react";
import ReactDOM from "react-dom";
import SpellDiv from "../presentational/spellDiv";
import {connect} from "react-redux";
import {attemptAddSpell, searchSpell} from "~/actions/spellActions"
import ImageButton from '../presentational/imageButton';
import SearchContainer from './searchContainer';

//Search container.
class SpellSearchContainer extends React.Component{
constructor(props){
super(props);
this.handleChange = this.handleChange.bind(this);
this.addSpell = this.addSpell.bind(this);
this.addSpellOnEnter = this.addSpellOnEnter.bind(this);
this.state = {currentText: ""};
}

@@ -25,22 +24,9 @@ class SpellSearchContainer extends React.Component{
this.props.dispatch(attemptAddSpell(this.props.currentSpell));
}

addSpellOnEnter(event){
let keycode = (event.keyCode ? event.keyCode : event.which);
if(keycode === 13){
this.addSpell();
}
}

render () {
return (
<div>
<div id = 'search-input'>
<input className = "styled-input" type = "text" onKeyUp = {this.addSpellOnEnter} value = {this.state.currentText} onChange = {this.handleChange} />
{this.props.currentSpell && <ImageButton imageSrc = {"plus"} handleClick = {this.addSpell}/>}
</div>
{this.props.currentSpell && <SpellDiv spell = {this.props.currentSpell}/>}
</div>
<SearchContainer positionedProps = {['name', 'description']} hiddenProps = {['page']} onFound = {this.addSpell} handleChange = {this.handleChange} currentText = {this.state.currentText} foundItem = {this.props.currentSpell}/>
);
}
}
@@ -3,7 +3,7 @@ import StartPage from '../presentational/startPage.js';
import {connect} from 'react-redux';
import {setUser} from '../../actions/userActions.js';
import {attemptRetrieveSpellList} from '../../actions/spellActions';
import {normalizeString} from '../../util';
import {normalizeString} from '~/util';

class StartPageContainer extends React.Component{
constructor(props){
@@ -0,0 +1,36 @@
import React from 'react';
import DataRow from './dataRow';

let DataDiv = (props) => {
let mergedArray = Object.keys(props.objectToDisplay).concat(props.hiddenProps);
mergedArray.sort();
let dataRows = [];
for (let i = 0; i < mergedArray.length; i++){
if(mergedArray[i] != mergedArray[i + 1]){
if(props.positionedProps.indexOf(mergedArray[i]) < 0){
dataRows.push(<DataRow key = {mergedArray[i]} name = {mergedArray[i]} value = {props.objectToDisplay[mergedArray[i]]}/>);
}
}
else{
i++;
}
}
for (let x = props.positionedProps.length - 1; x > -1; x--){
if(props.hiddenProps.indexOf(props.positionedProps[x]) < 0){
dataRows.splice(0, 0, <DataRow key = {props.positionedProps[x]} name = {props.positionedProps[x]} value = {props.objectToDisplay[props.positionedProps[x]]}/>);
}
}
return (
<div>
{dataRows}
</div>
);
}

DataDiv.propTypes = {
objectToDisplay: React.PropTypes.object.isRequired,
positionedProps: React.PropTypes.array,
hiddenProps: React.PropTypes.array
}

export default DataDiv;
@@ -1,9 +1,10 @@
import React from "react";
import {beautifyString} from '~/util';

//Displays data
function DataRow(props){
return (
(props.name && props.value && <span className = {(props.name + "-cell").toLowerCase()}><b>{props.name}</b>: {props.value} {props.addBreak && <br/>}</span>)
(!props.value == "" && props.name && props.value && <span className = {(props.name + "-cell").toLowerCase()}><b>{beautifyString(props.name)}</b>: {props.value} {props.addBreak && <br/>}</span>)
);
};

@@ -0,0 +1,28 @@
import React from 'react';
import {connect} from "react-redux";
import {Row, Col} from 'react-bootstrap';
import MonsterSearchContainer from '../container/monsterSearchContainer';

let MonsterPage = (props) => {
return (
<div>
{/* <Row>
<Col className = "title-background" xs={12}>
<SpellPageHeaderContainer/>
</Col>
</Row>
<SettingsModalContainer/>*/}
<Row id = "spell-page-div" className = "boostrap-row-margin-override">
<Col id = 'search-container' xs = {12} sm = {3}>
<MonsterSearchContainer/>
</Col>
{/*<Col id = 'spell-list' xs = {12} sm = {9}>
<SpellList/>
</Col> */}
</Row>
<script src="bundle.js"></script>
</div>
);
}

export default MonsterPage;
@@ -1,41 +1,10 @@
import React from "react";
import DataRow from "./dataRow";
import DataDiv from "./dataDiv";

//Contains a spell. Will eventually be able to click attributes to expand them so will need state.
function SpellDiv(props){
console.log(JSON.stringify(props.filters));
return (<div>
<DataRow name = "Name" value = {props.spell.name}/>
{(!props.filters || props.filters.desc) && <DataRow name = "Description" value = {props.spell.desc}/>}
{(!props.filters || props.filters.level) && <DataRow name = "Level" value = {props.spell.level == 0 ? "Cantrip" : (props.spell.level)}/>}
{(!props.filters || props.filters.class) && <DataRow name = "Class" value = {props.spell.class}/>}
{(!props.filters || props.filters.range) && <DataRow name = "Range" value = {props.spell.range}/>}
{(!props.filters || props.filters.casting_time) && <DataRow name = "Casting Time" value = {props.spell.casting_time}/>}
{(!props.filters || props.filters.duration) && <DataRow name = "Duration" value = {props.spell.duration}/>}
{(!props.filters || props.filters.concentration) && <DataRow name = "Concentration" value = {props.spell.concentration}/>}
{(!props.filters || props.filters.school) && <DataRow name = "School" value = {props.spell.school}/>}
{(!props.filters || props.filters.components) && <DataRow name = "Components" value = {props.spell.components}/>}
{(!props.filters || props.filters.ritual) && <DataRow name = "Ritual" value = {props.spell.ritual}/>}
</div>);
}

SpellDiv.propTypes = {
spell: React.PropTypes.shape({
name: React.PropTypes.string.isRequired,
description: React.PropTypes.string,
range: React.PropTypes.string,
components: React.PropTypes.string,
ritual: React.PropTypes.string,
duration: React.PropTypes.string,
concentration: React.PropTypes.string,
casting_time: React.PropTypes.string,
level: React.PropTypes.oneOfType([
React.PropTypes.string,
React.PropTypes.number,
]),
school: React.PropTypes.string,
class: React.PropTypes.string
})
return (<div>
<DataDiv objectToDisplay = {props.spell} hiddenProps = {props.filters} positionedProps = {['name', 'description']}/>
</div>)
}

export default SpellDiv;
@@ -6,7 +6,7 @@ let SpellListItem = (props) =>{
return(
<div className = 'spell-list-item' onDoubleClick = {props.handleDoubleClick}>
<SpellListItemHeader removeSpell = {props.removeSpell} toggleMinimization = {props.toggleMinimization} name = {props.spell.name}/>
<SpellDiv spell = {props.spell} filters = {props.filters}/>
<SpellDiv objectToDisplay = {props.spell} hiddenProps = {props.filters}/>
</div>
);
}

Large diffs are not rendered by default.

@@ -1,21 +1,11 @@
function filters(state = {desc:true,
level:true,
class:true,
range:true,
casting_time:true,
duration:true,
concentration:true,
school:true,
components:true,
ritual:true},
action)
{
function filters(state = ["page", "material"], action){
switch (action.type){
case "ADD_FILTER":
return Object.assign({}, state, {[action.filterName]: true});
return [...state, action.filterName];
break;
case "REMOVE_FILTER":
return Object.assign({}, state, {[action.filterName]: false});
let filterIndex = state.indexOf(action.filterName);
return [...state.slice(0, filterIndex), ...state.slice(filterIndex + 1)];
break;
default:
return state;
@@ -4,9 +4,11 @@ import filters from './filterReducer';
import user from './userReducer';
import modals from './modalReducer';
import settings from './settingReducer';
import monsters from './monsterReducer';

const rootReducer = combineReducers({
spells: spells,
monsters: monsters,
filters: filters,
user: user,
modals: modals,
@@ -0,0 +1,30 @@
import monsterSearcher from "~/searchers/monsterSearcher";

function monsters(state = {monsterList: []}, action)
{
switch (action.type){
case "SEARCH_MONSTER":
let newMonster = monsterSearcher.search(action.monsterName);
if(newMonster){
console.log(JSON.stringify(state));
return Object.assign({}, state, {currentMonster: newMonster});
}
else{
return state;
}
break;
case "ADD_MONSTER":
let addedMonsterList = [...state.monsterList, action.newMonster];
return Object.assign({}, state, {monsterList: addedMonsterList});
console.log(JSON.stringify(state));
break;
case "REMOVE_MONSTER":
let removedMonsterList = [...state.monsterList.slice(0, action.monsterIndex), ...state.monsterList.slice(action.monsterIndex + 1)];
return Object.assign({}, state, {monsterList: removedMonsterList});
break;
default:
return state;
}
}

export default monsters;
@@ -16,7 +16,6 @@ function spells(state = {spellList: []}, action)
case "ADD_SPELL":
let addedSpellList = [...state.spellList, action.newSpell];
return Object.assign({}, state, {spellList: addedSpellList});
return state;
break;
case "REMOVE_SPELL":
let removedSpellList = [...state.spellList.slice(0, action.spellIndex), ...state.spellList.slice(action.spellIndex + 1)];
@@ -4,13 +4,16 @@ import {Router, browserHistory, Route} from "react-router";
import AppRoot from "./components/presentational/appRoot";
import SpellPage from "./components/presentational/spellPage";
import StartPageContainer from './components/container/startPageContainer';
import MonsterPage from './components/presentational/monsterPage';


var AppRouter = () => {
return(
<Router history = {browserHistory}>
<Route path="/" component = {AppRoot}>
<Route path="spell" component = {SpellPage}/>
<Route path="spells" component = {SpellPage}/>
<Route path="start" component = {StartPageContainer}/>
<Route path="monsters" component = {MonsterPage}/>
</Route>
</Router>
);
@@ -33,7 +33,26 @@ router.get("/start", (req, res) => {
});
});

router.get("/spell", (req, res) => {
router.get("/spells", (req, res) => {
match({routes, location: req.url}, (error, redirectLocation, renderProps) => {
if(error){
console.log(error.message);
res.status(500).send(error.message);
}
else if(renderProps){
const content = ReactDOMServer.renderToString(
<Provider store = {store}>
<RouterContext {...renderProps}/>
</Provider>);
res.send(unmanagedMarkup + `<div id = 'page-wrapper'>${content}</div>`);
}
else{
res.status(404).send("Not Found");
}
});
});

router.get("/monsters", (req, res) => {
match({routes, location: req.url}, (error, redirectLocation, renderProps) => {
if(error){
console.log(error.message);
@@ -12,4 +12,8 @@ let initialCapsString = (string) => {
return null;
}

export {normalizeString, initialCapsString};
let beautifyString = (string) => {
return string.replace(/_|-/g, " ").replace(/\b\w/g, (letter) => letter.toUpperCase());
}

export {normalizeString, initialCapsString, beautifyString};