UNPKG

@aappddeevv/dynamics-client-ui

Version:

## What is it? A library to help you create great dynamics applications.

288 lines (222 loc) 11.1 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.List = undefined; var _extends2 = require("babel-runtime/helpers/extends"); var _extends3 = _interopRequireDefault(_extends2); var _objectWithoutProperties2 = require("babel-runtime/helpers/objectWithoutProperties"); var _objectWithoutProperties3 = _interopRequireDefault(_objectWithoutProperties2); var _set = require("babel-runtime/core-js/set"); var _set2 = _interopRequireDefault(_set); var _getPrototypeOf = require("babel-runtime/core-js/object/get-prototype-of"); var _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf); var _classCallCheck2 = require("babel-runtime/helpers/classCallCheck"); var _classCallCheck3 = _interopRequireDefault(_classCallCheck2); var _createClass2 = require("babel-runtime/helpers/createClass"); var _createClass3 = _interopRequireDefault(_createClass2); var _possibleConstructorReturn2 = require("babel-runtime/helpers/possibleConstructorReturn"); var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2); var _inherits2 = require("babel-runtime/helpers/inherits"); var _inherits3 = _interopRequireDefault(_inherits2); exports.Item = Item; exports.ListContainer = ListContainer; var _react = require("react"); var _react2 = _interopRequireDefault(_react); var _recompose = require("recompose"); var _ramda = require("ramda"); var _ramda2 = _interopRequireDefault(_ramda); var _Utils = require("../Dynamics/Utils"); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /** * Simple react list. */ var ListManager = function (_React$Component) { (0, _inherits3.default)(ListManager, _React$Component); function ListManager(props) { (0, _classCallCheck3.default)(this, ListManager); var _this = (0, _possibleConstructorReturn3.default)(this, (ListManager.__proto__ || (0, _getPrototypeOf2.default)(ListManager)).call(this, props)); _this.checkedValues = new _set2.default(); _this.input_handleOnChange = function (e) { _this.state.onListChange(_this.checkedValues); }; _this.input_updateList = function (key, checked) { return checked ? _this.checkedValues.add(key) : _this.checkedValues.remove(key); }; _this.getItemProps = function () { var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; var type = _ref.type, onChange = _ref.onChange, rest = (0, _objectWithoutProperties3.default)(_ref, ["type", "onChange"]); return (0, _extends3.default)({ onChange: (0, _Utils.composeEventHandlers)(onChange, _this.input_handleOnChange), updateList: _this.input_updateList }, rest); }; _this.getCombinedProps = function () { return { getItemProps: _this.getInputProps }; }; _this.state = { onListChange: props.onListChange }; return _this; } /** Non-state in the sense it does not drive rendering. */ // Factor out type, it's always "checked" for this component. (0, _createClass3.default)(ListManager, [{ key: "render", value: function render() { this.checkedValues.clear(); var children = (0, _Utils.firstOrElse)(this.props.children, _Utils.noop); var element = (0, _Utils.firstOrElse)(children(this.getCombinedProps())); if (!element) return null; return element; } }]); return ListManager; }(_react2.default.Component); ListManager.defaultProps = { onChange: _Utils.noop, onListChange: _Utils.noop }; var isNilOr = function isNilOr(v, o) { return _ramda2.default.isNil(v) ? o : v; }; /** * Default and fairly standard checkbox list implementation. Renders a list of checkboxes from an options list (a strict value). * The outer container does not need to know about ChcekBoxListManager. The callback onChange receives * convenient properties such as the option item and its checked status as well as the event object. This * class takes over the rendering process and makes assumptions about the options data model. * * @param options Array of {value,label} pairs. Value will be converted to a string. * @param checked Array|function of values representing checked status or a function taking a value and returning * boolean (true if checked) . If checked is undefined it will look for "checked" property on each option element. * @param {(value, checked, evt) => undefined } onChange Optional. Individual checkbox change callback. You can use * onListChange instead of this. * @parma {(Set of values) => undefined} onListChange Called with all checked values if a checkbox changes or after the * the component mounts. * @param Container Outer react container Component. * @param CheckBoxComponent Your own checkbox component. It will be passed {key,value,label,checked,getInputProps}. */ var _List = function (_React$Component2) { (0, _inherits3.default)(_List, _React$Component2); function _List() { var _ref2; var _temp, _this2, _ret; (0, _classCallCheck3.default)(this, _List); for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } return _ret = (_temp = (_this2 = (0, _possibleConstructorReturn3.default)(this, (_ref2 = _List.__proto__ || (0, _getPrototypeOf2.default)(_List)).call.apply(_ref2, [this].concat(args))), _this2), _this2.makeItem = function (opt, idx, checkme, ItemComponent, getInputProps, firstOnChange) { var value = isNilOr(opt.value, "value-" + idx); var label = isNilOr(opt.label, "label-" + idx); var isChecked = checkme(value); var cprops = { key: value.toString(), label: label, checked: isChecked, value: value, option: opt, // the only trick we do is to make the onChange API easier to use. // so we change the onChange handler from getInputProps(). getInputProps: function (_getInputProps) { function getInputProps(_x2) { return _getInputProps.apply(this, arguments); } getInputProps.toString = function () { return _getInputProps.toString(); }; return getInputProps; }(function (_ref3) { var onChange = _ref3.onChange, p = (0, _objectWithoutProperties3.default)(_ref3, ["onChange"]); return getInputProps((0, _extends3.default)({}, p, { //onChange: composeEventHandlers(firstOnChange(value, isChecked), onChange)})} onChange: (0, _Utils.composeEventHandlers)(firstOnChange(value, isChecked), onChange) })); }) //console.log(cprops) };return _react2.default.createElement(ItemComponent, (0, _extends3.default)({ key: value }, cprops)); }, _temp), (0, _possibleConstructorReturn3.default)(_this2, _ret); } // make map func an arrow outside of render so the callback func does not force a render (0, _createClass3.default)(_List, [{ key: "render", value: function render() { var _this3 = this; var _props = this.props, options = _props.options, checked = _props.checked, onListChange = _props.onListChange, onChange = _props.onChange, ItemComponent = _props.ItemComponent, Container = _props.Container, rest = (0, _objectWithoutProperties3.default)(_props, ["options", "checked", "onListChange", "onChange", "ItemComponent", "Container"]); var originalOnChange = onChange; // When rendering, we already know what is checked or not, so curry onChange handler with that info. /* const localOnChange = (value, isChecked, onOneChanged) => onOneChanged ? * R.curry(onOneChanged)(value, !isChecked) : null*/ var localOnChange = function localOnChange(value, isChecked) { return originalOnChange ? function (evt) { return originalOnChange(value, !isChecked, evt); } : null; }; var checkme = function checkme(value) { if (_ramda2.default.is(Array, checked)) return checked.includes(value);else if (_ramda2.default.is(Function, checked)) return checked(value); return false; }; return _react2.default.createElement( ListManager, { onChange: onChange, onListChange: onListChange }, function (_ref4) { var getItemProps = _ref4.getItemProps; return _react2.default.createElement( Container, rest, options.map(function (opt, idx) { return _this3.makeItem(opt, idx, checkme, ItemComponent, getInputProps, localOnChange); }) ); } ); } }]); return _List; }(_react2.default.Component); function Item(_ref5) { var getInputProps = _ref5.getInputProps, children = _ref5.children, rest = (0, _objectWithoutProperties3.default)(_ref5, ["getInputProps", "children"]); var _getInputProps2 = getInputProps(rest), key = _getInputProps2.key, value = _getInputProps2.value, label = _getInputProps2.label, checked = _getInputProps2.checked, option = _getInputProps2.option, onChange = _getInputProps2.onChange, updateList = _getInputProps2.updateList, iprops = (0, _objectWithoutProperties3.default)(_getInputProps2, ["key", "value", "label", "checked", "option", "onChange", "updateList"]); var id = value.toString(); if (checked) updateList(value, checked); return _react2.default.createElement( "li", { id: id, onClick: onChange }, label ? label : children ); } function ListContainer(_ref6) { var children = _ref6.children, className = _ref6.className, style = _ref6.style; return _react2.default.createElement( "ul", { style: (0, _extends3.default)({ margin: 0, padding: 0, listStyleType: "none" }, style), className: className }, children ); } var List = exports.List = (0, _recompose.defaultProps)({ options: [], checked: [], Container: ListContainer, CheckBoxComponent: Item })(_List); exports.default = List; //# sourceMappingURL=List.js.map