diff --git a/client/tpk/navbar/navbar.jsx b/client/tpk/navbar/navbar.jsx index b780998..06ca26d 100644 --- a/client/tpk/navbar/navbar.jsx +++ b/client/tpk/navbar/navbar.jsx @@ -9,7 +9,7 @@ var Navbar = React.createClass({ -
Total Party Knolling
+
Total Player Knolling
v0.0.0
diff --git a/client/tpk/sheetRenderer/parts/box/box.jsx b/client/tpk/sheetRenderer/parts/box/box.jsx new file mode 100644 index 0000000..5a484e0 --- /dev/null +++ b/client/tpk/sheetRenderer/parts/box/box.jsx @@ -0,0 +1,54 @@ +var React = require('react'); +var _ = require('lodash'); +var cx = require('classnames'); + +var utils = require('../utils'); + +var Box = React.createClass({ + mixins : [utils], + getDefaultProps: function() { + return { + //name : 'box', + defaultData : {}, + + id : '', + title : '', + label : '', + shadow : false, + border : false + }; + }, + + handleChange : function(newData){ + this.updateData(newData); + }, + + renderChildren : function(){ + return React.Children.map(this.props.children, (child)=>{ + if(!React.isValidElement(child)) return null; + return React.cloneElement(child, { + onChange : this.handleChange, + data : this.data() + }) + }) + }, + renderTitle : function(){ + if(this.props.title) return
{this.props.title}
+ }, + renderLabel : function(){ + if(this.props.label) return
{this.props.label}
+ }, + + render : function(){ + return
+ {this.renderTitle()} + {this.renderChildren()} + {this.renderLabel()} +
+ } +}); + +module.exports = Box; diff --git a/client/tpk/sheetRenderer/parts/box/box.less b/client/tpk/sheetRenderer/parts/box/box.less new file mode 100644 index 0000000..a72b5af --- /dev/null +++ b/client/tpk/sheetRenderer/parts/box/box.less @@ -0,0 +1,30 @@ +.box{ + position : relative; + padding : 10px; + margin: 10px; + + &.border{ + border: 1px solid black; + } + &.shadow{ + background-color: #ddd; + } + + + h5{ + text-transform: uppercase; + font-size : 0.6em; + text-align: center; + width : 100%; + font-weight: 800; + + &.title{ + margin-top: -5px; + margin-bottom: 10px; + } + &.label{ + margin-bottom: -5px; + margin-top: 10px; + } + } +} \ No newline at end of file diff --git a/client/tpk/sheetRenderer/parts/index.js b/client/tpk/sheetRenderer/parts/index.js new file mode 100644 index 0000000..266c978 --- /dev/null +++ b/client/tpk/sheetRenderer/parts/index.js @@ -0,0 +1,13 @@ +module.exports = { + TextInput : require('./textInput/textInput.jsx'), + PlayerInfo : require('./playerInfo/playerInfo.jsx'), + + SkillList : require('./skillList/skillList.jsx'), + Skill : require('./skill/skill.jsx'), + + //ShadowBox : require('./shadowBox/shadowBox.jsx'), + //BorderBox : require('./borderBox/borderBox.jsx'), + + + Box : require('./box/box.jsx') +} \ No newline at end of file diff --git a/client/tpk/sheetRenderer/parts/playerInfo/playerInfo.jsx b/client/tpk/sheetRenderer/parts/playerInfo/playerInfo.jsx new file mode 100644 index 0000000..9f4664e --- /dev/null +++ b/client/tpk/sheetRenderer/parts/playerInfo/playerInfo.jsx @@ -0,0 +1,25 @@ +var React = require('react'); +var _ = require('lodash'); +var cx = require('classnames'); + +var TextInput = require('../textInput/textInput.jsx'); +var Box = require('../box/box.jsx'); + +var PlayerInfo = React.createClass({ + getDefaultProps: function() { + return { + title: "player info", + border : true + }; + }, + render : function(){ + return + + + + {this.props.children} + + } +}); + +module.exports = PlayerInfo; diff --git a/client/tpk/sheetRenderer/parts/playerInfo/playerInfo.less b/client/tpk/sheetRenderer/parts/playerInfo/playerInfo.less new file mode 100644 index 0000000..a2acaa3 --- /dev/null +++ b/client/tpk/sheetRenderer/parts/playerInfo/playerInfo.less @@ -0,0 +1,3 @@ +.playerInfo{ + margin-bottom: 20px; +} \ No newline at end of file diff --git a/client/tpk/sheetRenderer/parts/skill/skill.jsx b/client/tpk/sheetRenderer/parts/skill/skill.jsx new file mode 100644 index 0000000..a9204c3 --- /dev/null +++ b/client/tpk/sheetRenderer/parts/skill/skill.jsx @@ -0,0 +1,62 @@ +var React = require('react'); +var _ = require('lodash'); +var cx = require('classnames'); + +var utils = require('../utils'); + +var Skill = React.createClass({ + getDefaultProps: function() { + return { + name : 'skill', + defaultData : { + prof : false, + expert : false, + val : '' + }, + + id : '', + label : '', + sublabel : '', + showExpert : false + }; + }, + + id : utils.id, + data : utils.data, + updateData : utils.updateData, + + handleToggleProf : function(){ + this.updateData({ + prof : !this.data().prof + }) + }, + handleToggleExpert : function(){ + this.updateData({ + expert : !this.data().expert + }) + }, + handleValChange : function(e){ + console.log('yo'); + this.updateData({ + val : e.target.value + }) + }, + renderExpert : function(){ + if(this.props.showExpert){ + return + } + }, + render : function(){ + return
+ {this.renderExpert()} + + + +
+ } +}); + +module.exports = Skill; diff --git a/client/tpk/sheetRenderer/parts/skill/skill.less b/client/tpk/sheetRenderer/parts/skill/skill.less new file mode 100644 index 0000000..e4b0aa5 --- /dev/null +++ b/client/tpk/sheetRenderer/parts/skill/skill.less @@ -0,0 +1,35 @@ + +.skill{ + position : relative; + padding-left : 15px; + input[type="radio"]{ + margin : 0px; + } + .expertToggle{ + position : absolute; + top : 1px; + left : 0px; + } + input[type="text"]{ + width : 25px; + margin-left : 10px; + background-color : transparent; + text-align : center; + border : none; + border-bottom : 1px solid black; + outline : none; + &:focus{ + background-color : #ddd; + } + } + label{ + margin-left : 10px; + font-size : 0.8em; + small{ + margin-left : 5px; + font-size : 0.8em; + color : #999; + text-transform : uppercase; + } + } +} \ No newline at end of file diff --git a/client/tpk/sheetRenderer/parts/skillList/skillList.jsx b/client/tpk/sheetRenderer/parts/skillList/skillList.jsx new file mode 100644 index 0000000..89b540d --- /dev/null +++ b/client/tpk/sheetRenderer/parts/skillList/skillList.jsx @@ -0,0 +1,61 @@ +var React = require('react'); +var _ = require('lodash'); +var cx = require('classnames'); + +var Skill = require('../skill/skill.jsx'); +var Box = require('../box/box.jsx'); + + +var skill_list = [ + {name : 'Acrobatics', stat : 'Dex'}, + {name : 'Animal Handling', stat : 'Wis'}, + {name : 'Arcana', stat : 'Int'}, + {name : 'Athletics', stat : 'Str'}, + {name : 'Deception', stat : 'Cha'}, + {name : 'History', stat : 'Int'}, + {name : 'Insight', stat : 'Wis'}, + {name : 'Intimidation', stat : 'Cha'}, + {name : 'Investigation', stat : 'Int'}, + {name : 'Medicine', stat : 'Wis'}, + {name : 'Nature', stat : 'Int'}, + {name : 'Perception', stat : 'Wis'}, + {name : 'Performance', stat : 'Cha'}, + {name : 'Persuasion', stat : 'Cha'}, + {name : 'Religion', stat : 'Int'}, + {name : 'Sleight of Hand', stat : 'Dex'}, + {name : 'Stealth', stat : 'Dex'}, + {name : 'Survival', stat : 'Wis'} +] + + +var SkillList = React.createClass({ + getDefaultProps: function() { + return { + name : 'skills', + + //title : 'Skills', + shadow : true, + border : false, + showExpert : false + }; + }, + + + renderSkills : function(){ + return _.map(skill_list, (skill)=>{ + return + }) + }, + + render : function(){ + return + {this.renderSkills()} + {this.props.children} + + } +}); + +module.exports = SkillList; diff --git a/client/tpk/sheetRenderer/parts/skillList/skillList.less b/client/tpk/sheetRenderer/parts/skillList/skillList.less new file mode 100644 index 0000000..6bb4bdf --- /dev/null +++ b/client/tpk/sheetRenderer/parts/skillList/skillList.less @@ -0,0 +1,3 @@ +.COM{ + +} \ No newline at end of file diff --git a/client/tpk/sheetRenderer/parts/textInput/textInput.jsx b/client/tpk/sheetRenderer/parts/textInput/textInput.jsx new file mode 100644 index 0000000..7b85e74 --- /dev/null +++ b/client/tpk/sheetRenderer/parts/textInput/textInput.jsx @@ -0,0 +1,44 @@ +var React = require('react'); +var _ = require('lodash'); +var cx = require('classnames'); + +var utils = require('../utils'); + +var TextInput = React.createClass({ + getDefaultProps: function() { + return { + name : 'text', + defaultData : '', + + id : '', + label : '', + }; + }, + + id : utils.id, + data : utils.data, + updateData : utils.updateData, + + handleChange : function(e){ + this.updateData(e.target.value); + }, + + renderLabel : function(){ + if(this.props.label) return + }, + + render : function(){ + return
+ {this.renderLabel()} + +
+ } +}); + +module.exports = TextInput; diff --git a/client/tpk/sheetRenderer/parts/textInput/textInput.less b/client/tpk/sheetRenderer/parts/textInput/textInput.less new file mode 100644 index 0000000..532967b --- /dev/null +++ b/client/tpk/sheetRenderer/parts/textInput/textInput.less @@ -0,0 +1,6 @@ +.textInput{ + label{ + display: inline-block; + width : 50px; + } +} \ No newline at end of file diff --git a/client/tpk/sheetRenderer/parts/utils.js b/client/tpk/sheetRenderer/parts/utils.js new file mode 100644 index 0000000..95dcd3c --- /dev/null +++ b/client/tpk/sheetRenderer/parts/utils.js @@ -0,0 +1,33 @@ +var _ = require('lodash'); + + +module.exports = { + id : function(){ + if(this.props.id) return this.props.id; + if(this.props.label) return _.snakeCase(this.props.label); + if(this.props.title) return _.snakeCase(this.props.title); + return this.props.name; + }, + data : function(){ + if(!this.id()) return this.props.data || this.props.defaultData; + if(this.props.data && this.props.data[this.id()]) return this.props.data[this.id()]; + return this.props.defaultData; + }, + updateData : function(val){ + if(typeof this.props.onChange !== 'function') throw "No onChange handler set"; + + var newVal = val; + + //Clone the data if it's an object to avoid mutation bugs + if(_.isObject(val)) newVal = _.extend({}, this.data(), val); + + if(this.id()){ + this.props.onChange({ + [this.id()] : newVal + }); + }else{ + //If the box has no id, don't add it to the chain + this.props.onChange(newVal) + } + } +} \ No newline at end of file diff --git a/client/tpk/sheetRenderer/sheetRenderer.jsx b/client/tpk/sheetRenderer/sheetRenderer.jsx new file mode 100644 index 0000000..5fc6aa2 --- /dev/null +++ b/client/tpk/sheetRenderer/sheetRenderer.jsx @@ -0,0 +1,79 @@ +var React = require('react'); +var _ = require('lodash'); +var cx = require('classnames'); + +var jsx2json = require('naturalcrit/jsx-parser'); + +var Parts = require('./parts'); + + +var SheetRenderer = React.createClass({ + getDefaultProps: function() { + return { + code : '', + characterData : {}, + onChange : function(){}, + }; + }, + + renderElement : function(node, key){ + if(!node.tag) return null; + + if(!Parts[node.tag]) throw 'Could Not Find Element: ' + node.tag + + return React.createElement( + Parts[node.tag], + {key : key, ...node.props}, + ...this.renderChildren(node.children)) + }, + renderChildren : function(nodes){ + return _.map(nodes, (node, index)=>{ + if(_.isString(node)) return node; + return this.renderElement(node, index); + }) + }, + renderSheet : function(){ + try{ + var nodes = jsx2json(this.props.code); + nodes = _.map(nodes, (node)=>{ + node.props.data = this.props.characterData; + node.props.onChange = (newData)=>{ + this.props.onChange(_.extend(this.props.characterData, newData)); + } + return node + }) + return this.renderChildren(nodes); + }catch(e){ + return
Error bruh {e.toString()}
+ } + }, + + + + + render : function(){ + return
+ +

Character Sheet

+ +
+ {this.renderSheet()} + +
+ +
+ } +}); + + +module.exports = SheetRenderer; + + +/* + +yo test link + + + + +*/ \ No newline at end of file diff --git a/client/tpk/sheetRenderer/sheetRenderer.less b/client/tpk/sheetRenderer/sheetRenderer.less new file mode 100644 index 0000000..077c37b --- /dev/null +++ b/client/tpk/sheetRenderer/sheetRenderer.less @@ -0,0 +1,11 @@ +.sheetRenderer{ + + padding-right : 10px; + + + .sheetContainer{ + background-color: white; + padding : 20px; + } + +} \ No newline at end of file diff --git a/client/tpk/tpk.jsx b/client/tpk/tpk.jsx index 5ee42fb..da39a8d 100644 --- a/client/tpk/tpk.jsx +++ b/client/tpk/tpk.jsx @@ -7,6 +7,12 @@ var Navbar = require('./navbar/navbar.jsx'); var SplitPane = require('naturalcrit/splitPane/splitPane.jsx'); var SheetEditor = require('./sheetEditor/sheetEditor.jsx'); +var SheetRenderer = require('./sheetRenderer/sheetRenderer.jsx'); + + +const SPLATSHEET_TEMPLATE = 'splatsheet_template'; +const SPLATSHEET_DATA = 'splatsheet_data'; + var TPK = React.createClass({ @@ -14,14 +20,17 @@ var TPK = React.createClass({ getInitialState: function() { return { - sheetCode: '' + sheetCode: "\n\t\n", + + sheetData : {} }; }, //remove later componentDidMount: function() { this.setState({ - sheetCode : localStorage.getItem('temp') + sheetCode : localStorage.getItem(SPLATSHEET_TEMPLATE) || this.state.sheetCode, + sheetData : JSON.parse(localStorage.getItem(SPLATSHEET_DATA)) || this.state.sheetData }) }, @@ -34,7 +43,14 @@ var TPK = React.createClass({ sheetCode : code }); - localStorage.setItem('temp', code); + localStorage.setItem(SPLATSHEET_TEMPLATE, code); + }, + + handleDataChange : function(data){ + this.setState({ + sheetData : JSON.parse(JSON.stringify(data)), + }); + localStorage.setItem(SPLATSHEET_DATA, JSON.stringify(data)); }, render : function(){ @@ -49,9 +65,10 @@ var TPK = React.createClass({
-
- {this.state.sheetCode} -
+
diff --git a/shared/naturalcrit/codeEditor/codeEditor.jsx b/shared/naturalcrit/codeEditor/codeEditor.jsx index 12596ce..1b6dce2 100644 --- a/shared/naturalcrit/codeEditor/codeEditor.jsx +++ b/shared/naturalcrit/codeEditor/codeEditor.jsx @@ -39,7 +39,7 @@ var CodeEditor = React.createClass({ }, componentWillReceiveProps: function(nextProps){ - if(this.codeMirror && nextProps.value !== undefined && this.codeMirror.getValue() != nextProps.value) { + if(this.codeMirror && nextProps.value && this.codeMirror.getValue() != nextProps.value) { this.codeMirror.setValue(nextProps.value); } },