diff --git a/.gitignore b/.gitignore
index bee8a64..cf394d1 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1 +1,5 @@
__pycache__
+*.pyc
+magic_rules/opm-faces/
+magic_rules/node_modules/
+magic_rules/static/js/*
diff --git a/magic_rules/datastore/objects.json b/magic_rules/datastore/objects.json
index 9e26dfe..64c56c8 100644
--- a/magic_rules/datastore/objects.json
+++ b/magic_rules/datastore/objects.json
@@ -1 +1,14 @@
-{}
\ No newline at end of file
+{
+ "Ruler": {
+ "type": "Ruler",
+ "Inches": null,
+ "rules": []
+ },
+ "Cat": {
+ "Color": null,
+ "Licks": null,
+ "type": "Cat",
+ "rules": [],
+ "Food preference": null
+ }
+}
\ No newline at end of file
diff --git a/magic_rules/js/calculations-creator.js b/magic_rules/js/calculations-creator.js
new file mode 100644
index 0000000..f1b0e95
--- /dev/null
+++ b/magic_rules/js/calculations-creator.js
@@ -0,0 +1,196 @@
+import React from 'react';
+
+class Operation extends React.Component {
+ constructor() {
+ super()
+ }
+ render() {
+ var i = this.props.count;
+ return (
+
+
+
+
+ )
+ }
+}
+
+class FormulaValue extends React.Component {
+ constructor() {
+ super()
+ this.state = {
+ type: 'static_value'
+ }
+ this.handleToggleChange = this.handleToggleChange.bind(this);
+ }
+
+ handleToggleChange(event) {
+ this.setState({ type: event.target.value });
+ }
+
+ renderStaticInput() {
+ var i = this.props.count;
+ return(
+
+
+
+
+ )
+ }
+
+ renderAttrInput() {
+ let objectKeys = [];
+ for (var key in this.props.selectedObj) {
+ if (this.props.selectedObj.hasOwnProperty(key) && key != 'type' && key != 'rules'){
+ objectKeys.push();
+ }
+ }
+ console.log(this.props.selectedObj);
+ return (
+
+
+
+
+ )
+ }
+
+ render() {
+ var i = this.props.count;
+ console.log(this.props.objects);
+ return(
+
+
+
+ { this.state.type === 'static_value' ? this.renderStaticInput() : this.renderAttrInput() }
+
+
+ )
+ }
+}
+
+class CalculationsCreator extends React.Component {
+ constructor(props) {
+ super(props);
+ this.state = {
+ inputs: 1, //0-based
+ operations: 0, //0-based
+ objects: [],
+ selectedObj: {}
+ }
+ this.handleAddOperation = this.handleAddOperation.bind(this);
+ this.handleObjSelect = this.handleObjSelect.bind(this);
+ }
+
+ fetchUrl(url) {
+ return fetch(url)
+ .then(response => response.json());
+ }
+
+ componentDidMount() {
+ this.fetchUrl('http://127.0.0.1:5000/api/prototypes/read')
+ .then(data => {
+ const objects = [];
+ for (var key in data) {
+ if (data.hasOwnProperty(key)){
+ objects.push(data[key]);
+ }
+ }
+ this.setState({ objects });
+ });
+ }
+
+ handleAddOperation(e){
+ e.preventDefault();
+ this.setState({
+ inputs: this.state.inputs + 1,
+ operations: this.state.operations + 1
+ });
+ }
+
+ handleObjSelect(event) {
+ let obj = this.state.objects.filter((object) => {
+ return object.type == event.target.value;
+ });
+ this.setState({ selectedObj: obj[0] });
+ }
+
+ render() {
+ var formulas = [];
+ for (var i=0; i < this.state.inputs; i++) {
+ if (i==0) {
+ formulas.push();
+ formulas.push();
+ formulas.push();
+ } else {
+ formulas.push();
+ formulas.push();
+ }
+ }
+ return (
+
+ );
+ }
+};
+
+export default CalculationsCreator;
diff --git a/magic_rules/js/calculations.js b/magic_rules/js/calculations.js
new file mode 100644
index 0000000..642af22
--- /dev/null
+++ b/magic_rules/js/calculations.js
@@ -0,0 +1,5 @@
+import CalculationsCreator from './calculations-creator';
+import React from 'react';
+import ReactDOM from 'react-dom';
+
+ReactDOM.render(, document.getElementById('js-create-calculations'));
diff --git a/magic_rules/js/object-creator.js b/magic_rules/js/object-creator.js
new file mode 100644
index 0000000..4839aba
--- /dev/null
+++ b/magic_rules/js/object-creator.js
@@ -0,0 +1,44 @@
+import React from 'react';
+
+class ObjectCreator extends React.Component {
+ constructor(props) {
+ super(props);
+ this.state = {
+ inputs: [{ 'name': 'attribute_1' }]
+ }
+ this.handleAddAttribute = this.handleAddAttribute.bind(this);
+ }
+
+ handleAddAttribute(e) {
+ e.preventDefault();
+ let newInputName = `attribute_${this.state.inputs.length}`;
+ this.setState({
+ inputs: this.state.inputs.concat([{'name': newInputName}])
+ });
+ }
+
+ render() {
+ console.log(this.state);
+ return (
+
+ );
+ }
+};
+
+export default ObjectCreator;
diff --git a/magic_rules/js/objects.js b/magic_rules/js/objects.js
new file mode 100644
index 0000000..837ce06
--- /dev/null
+++ b/magic_rules/js/objects.js
@@ -0,0 +1,5 @@
+import ObjectCreator from './object-creator';
+import React from 'react';
+import ReactDOM from 'react-dom';
+
+ReactDOM.render(, document.getElementById('js-create-object'));
diff --git a/magic_rules/js/rules-editor.js b/magic_rules/js/rules-editor.js
new file mode 100644
index 0000000..7bea046
--- /dev/null
+++ b/magic_rules/js/rules-editor.js
@@ -0,0 +1,9 @@
+import React from 'react';
+
+var RulesEditor = React.createClass({
+ render() {
+ return React form
;
+ }
+});
+
+export default RulesEditor;
diff --git a/magic_rules/js/rules.js b/magic_rules/js/rules.js
new file mode 100644
index 0000000..06b83fc
--- /dev/null
+++ b/magic_rules/js/rules.js
@@ -0,0 +1,5 @@
+import RulesEditor from './rules-editor';
+import React from 'react';
+import ReactDOM from 'react-dom';
+
+ReactDOM.render(, document.getElementById('js-create-rules'));
diff --git a/magic_rules/package.json b/magic_rules/package.json
new file mode 100644
index 0000000..b999ea2
--- /dev/null
+++ b/magic_rules/package.json
@@ -0,0 +1,24 @@
+{
+ "name": "starter-kit",
+ "version": "1.1.0",
+ "description": "",
+ "main": "index.js",
+ "scripts": {
+ "test": "echo \"Error: no test specified\" && exit 1",
+ "build": "webpack",
+ "start": "python app.py"
+ },
+ "author": "",
+ "license": "ISC",
+ "devDependencies": {
+ "babel-core": "^6.4.5",
+ "babel-loader": "^6.2.1",
+ "babel-preset-es2015": "^6.3.13",
+ "babel-preset-react": "^6.3.13",
+ "webpack": "^1.12.12"
+ },
+ "dependencies": {
+ "react": "^0.14.7",
+ "react-dom": "^0.14.7"
+ }
+}
diff --git a/magic_rules/templates/base.html b/magic_rules/templates/base.html
index e69de29..6649b2d 100644
--- a/magic_rules/templates/base.html
+++ b/magic_rules/templates/base.html
@@ -0,0 +1,12 @@
+
+
+
+
+{% block extrahead %}
+{% endblock %}
+
+
+{% block body %}{% endblock %}
+{% block scripts %}{% endblock %}
+
+
diff --git a/magic_rules/templates/create_calculations.html b/magic_rules/templates/create_calculations.html
index 67fd80f..4434a9e 100644
--- a/magic_rules/templates/create_calculations.html
+++ b/magic_rules/templates/create_calculations.html
@@ -1,6 +1,5 @@
-
-
-
+{% extends "base.html" %}
+{% block body %}
Rule magic!
@@ -9,88 +8,11 @@
Create calculations
-
+{% endblock %}
+
+{% block scripts %}
+
+{% endblock %}
diff --git a/magic_rules/templates/create_data.html b/magic_rules/templates/create_data.html
index ea84c15..8cad5ff 100644
--- a/magic_rules/templates/create_data.html
+++ b/magic_rules/templates/create_data.html
@@ -1,6 +1,5 @@
-
-
-
+{% extends "base.html" %}
+{% block body %}
Rule magic!
@@ -39,3 +38,4 @@
{% endfor %}
+{% endblock %}
diff --git a/magic_rules/templates/create_prototypes.html b/magic_rules/templates/create_prototypes.html
index d4aebd9..8570069 100644
--- a/magic_rules/templates/create_prototypes.html
+++ b/magic_rules/templates/create_prototypes.html
@@ -1,6 +1,5 @@
-
-
-
+{% extends "base.html" %}
+{% block body %}
Rule magic!
@@ -9,29 +8,12 @@
Create object prototype
-
+{% endblock %}
+
+{% block scripts %}
+
+{% endblock %}
+
diff --git a/magic_rules/templates/create_rules.html b/magic_rules/templates/create_rules.html
index 0906bf6..81d64bf 100644
--- a/magic_rules/templates/create_rules.html
+++ b/magic_rules/templates/create_rules.html
@@ -1,6 +1,6 @@
-
-
-
+{% extends "base.html" %}
+{% block body %}
+
Rule magic!
@@ -9,6 +9,9 @@
Create rules
+
+
+