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 ( +
+ + +
+ Implemention method + + + OR + + +
+ { formulas } + + Add another operation + +
+ ); + } +}; + +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 ( +
+ + + {this.state.inputs.map(function(input, i) { + return( +
+ + +
+ ) + })} + Add another attribute + +
+ ); + } +}; + +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

-
-
- - - - - - - - - - - - - - - - - - {% for num in range(6) %} - - - - - - {% if num != 5 %} - - - - - {% endif %} - {% endfor %} - - - - - - - - - -
Calculation name: -
Implemention method
By rule (contingent on rule): - -
OR
Directly on prototype (always calcuated): - - -
Static value: - or value from attribute: - -
Operator: - -
- -
- -
-
+
+{% 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

-
-
- - - - - - - {% for num in range(5) %} - - - - - {% endfor %} - - - - - - -
Name:
Attribute:
- -
-
+
+{% 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

+
+ +
@@ -86,3 +89,4 @@

+{% endblock %} diff --git a/magic_rules/templates/steps.html b/magic_rules/templates/steps.html index a09143e..7a1a3d6 100644 --- a/magic_rules/templates/steps.html +++ b/magic_rules/templates/steps.html @@ -1,6 +1,5 @@ - - - +{% extends "base.html" %} +{% block body %}

Rule magic! @@ -19,3 +18,4 @@

Clear all data

+{% endblock %} diff --git a/magic_rules/templates/view_data.html b/magic_rules/templates/view_data.html index 1ff4377..874d41d 100644 --- a/magic_rules/templates/view_data.html +++ b/magic_rules/templates/view_data.html @@ -1,6 +1,6 @@ - - - +{% extends "base.html" %} +{% block body %} +

Rule magic! @@ -27,3 +27,4 @@

{% endfor %}

+{% endblock %} diff --git a/magic_rules/webpack.config.js b/magic_rules/webpack.config.js new file mode 100644 index 0000000..306ab0f --- /dev/null +++ b/magic_rules/webpack.config.js @@ -0,0 +1,73 @@ +var webpack = require('webpack'); +module.exports = [ + { + name: 'rules', + entry: [ + "./js/rules.js" + ], + output: { + path: __dirname + '/static/js', + filename: "rules.js" + }, + module: { + loaders: [ + { + test: /\.js?$/, + loader: 'babel-loader', + query: { + presets: ['es2015', 'react'] + }, + exclude: /node_modules/ + } + ] + }, + plugins: [ + ] +}, { + name: 'objects', + entry: [ + "./js/objects.js" + ], + output: { + path: __dirname + '/static/js', + filename: "objects.js" + }, + module: { + loaders: [ + { + test: /\.js?$/, + loader: 'babel-loader', + query: { + presets: ['es2015', 'react'] + }, + exclude: /node_modules/ + } + ] + }, + plugins: [ + ] +}, { + name: 'calculations', + entry: [ + "./js/calculations.js" + ], + output: { + path: __dirname + '/static/js', + filename: "calculations.js" + }, + module: { + loaders: [ + { + test: /\.js?$/, + loader: 'babel-loader', + query: { + presets: ['es2015', 'react'] + }, + exclude: /node_modules/ + } + ] + }, + plugins: [ + ] +} +];