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);
}
},