UNPKG

armstrong-react

Version:

Rocketmakers Armstrong library of React components

83 lines (82 loc) 3.06 kB
"use strict"; 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;