armstrong-react
Version:
Rocketmakers Armstrong library of React components
83 lines (82 loc) • 3.06 kB
JavaScript
;
var __extends = (this && this.__extends) || function (d, b) {
for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
var React = require("react");
var _ = require("underscore");
var formBinders_1 = require("./formBinders");
var JsonEntityBinder = (function () {
function JsonEntityBinder(data) {
this.data = data;
}
JsonEntityBinder.prototype.getValue = function (dataName) {
var parts = dataName.split(".");
var d = _.reduce(parts, function (result, p) {
if (!result) {
throw new Error(p + " not found in data");
}
return result[p];
}, this.data);
return d;
};
JsonEntityBinder.prototype.setValue = function (dataName, value) {
var parts = dataName.split(".");
var d = this.data;
for (var i = 0; i < parts.length - 1; i++) {
d = d[parts[i]];
}
d[parts[parts.length - 1]] = value;
};
JsonEntityBinder.prototype.toJson = function () {
return this.data;
};
return JsonEntityBinder;
}());
var Form = (function (_super) {
__extends(Form, _super);
function Form() {
_super.apply(this, arguments);
}
Form.jsonDataBinder = function (data) {
return new JsonEntityBinder(data);
};
Form.prototype.render = function () {
var ch = this.processChildren(this.props.children);
return (React.createElement("form", {className: "form " + this.props.className, onSubmit: function (e) { e.preventDefault(); return false; }}, ch));
};
Form.prototype.processChildren = function (node) {
var _this = this;
return React.Children.map(node, function (element) {
if (!element) {
return;
}
if (!element.props) {
return element;
}
var props = _.extend({}, element.props);
var children = element.props.children;
var fai = props;
var formBinder = fai.__formBinder;
if (formBinder) {
delete fai.__formBinder;
formBinder.setElementProperty(props, _this.props.dataBinder);
formBinder.handleValueChanged(props, _this.props.dataBinder, function () { return _this.notifyChange(); });
if (formBinder.extender) {
formBinder.extender(props, _this.props.dataBinder, function () { return _this.notifyChange(); });
}
}
else if (children) {
children = _this.processChildren(children);
}
return React.cloneElement(element, props, children);
});
};
Form.prototype.notifyChange = function () {
this.props.onDataChanged(this.props.dataBinder.toJson());
};
Form.Bind = formBinders_1.FormBinder;
return Form;
}(React.Component));
exports.Form = Form;