UNPKG

codogo-react-widgets

Version:

Provides a unified way to access the styling of commonly used widgets across different apps

302 lines (252 loc) 12.9 kB
import _extends from "babel-runtime/helpers/extends"; import _classCallCheck from "babel-runtime/helpers/classCallCheck"; import _createClass from "babel-runtime/helpers/createClass"; import _possibleConstructorReturn from "babel-runtime/helpers/possibleConstructorReturn"; import _inherits from "babel-runtime/helpers/inherits"; import _taggedTemplateLiteral from "babel-runtime/helpers/taggedTemplateLiteral"; var _desc, _value, _class, _class2, _desc2, _value2, _class3; var _templateObject = _taggedTemplateLiteral(["\n\tposition: relative;\n\tline-height: 1;\n\t// max-height: ", "em;\n\tdisplay: inline-block;\n\toverflow: visible;\n\tcursor: pointer;\n\twidth: 10em;\n\tflex: 7;\n"], ["\n\tposition: relative;\n\tline-height: 1;\n\t// max-height: ", "em;\n\tdisplay: inline-block;\n\toverflow: visible;\n\tcursor: pointer;\n\twidth: 10em;\n\tflex: 7;\n"]), _templateObject2 = _taggedTemplateLiteral(["\n\tbackground: ", ";\n\tborder-radius: ", ";\n\tborder: 1px solid ", ";\n\tpadding: ", ";\n\tposition: relative;\n\n\t&:hover {\n\t\tbackground: ", ";\n\t}\n\n\t&:before {\n\t\tcontent: \"\";\n\t\tposition: absolute;\n\t\ttop: ", "em;\n\t\tright: ", "em;\n\t\tborder: ", "em solid transparent;\n\t\tborder-top-width: ", "em;\n\t\tborder-bottom-width: 0;\n\t\tborder-top-color: ", ";\n\t\theight: ", "em;\n\t\twidth: ", "em;\n\t}\n"], ["\n\tbackground: ", ";\n\tborder-radius: ", ";\n\tborder: 1px solid ", ";\n\tpadding: ", ";\n\tposition: relative;\n\n\t&:hover {\n\t\tbackground: ", ";\n\t}\n\n\t&:before {\n\t\tcontent: \"\";\n\t\tposition: absolute;\n\t\ttop: ", "em;\n\t\tright: ", "em;\n\t\tborder: ", "em solid transparent;\n\t\tborder-top-width: ", "em;\n\t\tborder-bottom-width: 0;\n\t\tborder-top-color: ", ";\n\t\theight: ", "em;\n\t\twidth: ", "em;\n\t}\n"]), _templateObject3 = _taggedTemplateLiteral(["\n\tbackground: ", ";\n\tborder-radius: ", ";\n\tborder: 1px solid ", ";\n\tbox-shadow: inset 0 -2em 2em -2em ", ";\n\tdisplay: ", ";\n\tleft: 0;\n\tmax-height: 60vh;\n\toverflow-y: scroll;\n\tpadding: 0;\n\tposition: absolute;\n\tright: 0;\n\ttop: 100%;\n\tz-index: 10;\n\n\t", ";\n"], ["\n\tbackground: ", ";\n\tborder-radius: ", ";\n\tborder: 1px solid ", ";\n\tbox-shadow: inset 0 -2em 2em -2em ", ";\n\tdisplay: ", ";\n\tleft: 0;\n\tmax-height: 60vh;\n\toverflow-y: scroll;\n\tpadding: 0;\n\tposition: absolute;\n\tright: 0;\n\ttop: 100%;\n\tz-index: 10;\n\n\t", ";\n"]), _templateObject4 = _taggedTemplateLiteral(["\n\t", " overflow: hidden;\n\tpadding: ", "em ", "em;\n\ttext-overflow: ellipsis;\n\twhite-space: nowrap;\n\n\t&:hover {\n\t\tbackground: ", ";\n\t}\n"], ["\n\t", " overflow: hidden;\n\tpadding: ", "em ", "em;\n\ttext-overflow: ellipsis;\n\twhite-space: nowrap;\n\n\t&:hover {\n\t\tbackground: ", ";\n\t}\n"]), _templateObject5 = _taggedTemplateLiteral(["\n\talign-items: center;\n\tdisplay: flex;\n\tflex-direction: row;\n\tmargin: ", ";\n"], ["\n\talign-items: center;\n\tdisplay: flex;\n\tflex-direction: row;\n\tmargin: ", ";\n"]), _templateObject6 = _taggedTemplateLiteral(["\n\tpadding: ", ";\n\tflex: 3;\n\ttext-align: right;\n\tborder: 1px transparent;\n"], ["\n\tpadding: ", ";\n\tflex: 3;\n\ttext-align: right;\n\tborder: 1px transparent;\n"]); function _applyDecoratedDescriptor(target, property, decorators, descriptor, context) { var desc = {}; Object['ke' + 'ys'](descriptor).forEach(function (key) { desc[key] = descriptor[key]; }); desc.enumerable = !!desc.enumerable; desc.configurable = !!desc.configurable; if ('value' in desc || desc.initializer) { desc.writable = true; } desc = decorators.slice().reverse().reduce(function (desc, decorator) { return decorator(target, property, desc) || desc; }, desc); if (context && desc.initializer !== void 0) { desc.value = desc.initializer ? desc.initializer.call(context) : void 0; desc.initializer = undefined; } if (desc.initializer === void 0) { Object['define' + 'Property'](target, property, desc); desc = null; } return desc; } import React from "react"; import * as R from "ramda"; import styled from "styled-components"; import autobind from "autobind-decorator"; import clickOutside from "react-onclickoutside"; import ReactDOM from "react-dom"; import { lighten } from "polished"; import { getArrowWidth, getBorderRadius, getColor, getMarginLeft, getMarginRight, getMarginVertical, getPaddingHorizontal, getPaddingVertical, getPadding2 } from "../getters"; // -------------------------------------------------- var getWrapperMaxHeight = R.pipe(getPaddingVertical, R.multiply(2), R.add(1)); var getWrapperMaxWidth = R.pipe(getPaddingHorizontal, R.multiply(2), R.add(1)); // -------------------------------------------------- var Wrapper = styled.div(_templateObject, getWrapperMaxHeight); var getTriggerPadding = function getTriggerPadding(props) { return [getPaddingVertical(props), getWrapperMaxWidth(props), getPaddingVertical(props), getPaddingHorizontal(props)].join("em ") + "em"; }; var Trigger = styled.div(_templateObject2, getColor("lightgray"), getBorderRadius, getColor("gray"), getTriggerPadding, getColor("midgray"), function (props) { return getPaddingVertical(props) + (1 - getArrowWidth(props)) / 2; }, getPaddingHorizontal, function (props) { return getArrowWidth(props) / 2; }, getArrowWidth, getColor("darkgray"), getArrowWidth, getArrowWidth); var getContentBorderRadius = function getContentBorderRadius(props) { return ["0", "0", getBorderRadius(props), getBorderRadius(props)].join(" "); }; var Content = styled.div(_templateObject3, getColor("lightgray"), getContentBorderRadius, getColor("gray"), R.path(["theme", "colors", "darkgray"]), function (p) { return p.active ? "block" : "none"; }, function (_ref) { var scrolled = _ref.scrolled; return scrolled ? "\n\t\tbox-shadow: none;\n\t" : ""; }); var getOptionBackgroundColor = function getOptionBackgroundColor(props) { return props.active ? "background-color: " + lighten(0.4, getColor("primary")(props)) + ";" : ""; }; var Option = styled.div(_templateObject4, getOptionBackgroundColor, getPaddingVertical, getPaddingHorizontal, getColor("midgray")); var getOuterWrapperMargin = function getOuterWrapperMargin(props) { return [getMarginVertical(props), getMarginRight(props), getMarginVertical(props), getMarginLeft(props)].join("em ") + "em"; }; var OuterWrapper = styled.div(_templateObject5, getOuterWrapperMargin); var Label = styled.div(_templateObject6, getPadding2); // -------------------------------------------------- var DropdownOption = (_class = function (_React$Component) { _inherits(DropdownOption, _React$Component); function DropdownOption() { _classCallCheck(this, DropdownOption); return _possibleConstructorReturn(this, (DropdownOption.__proto__ || Object.getPrototypeOf(DropdownOption)).apply(this, arguments)); } _createClass(DropdownOption, [{ key: "onClick", value: function onClick() { this.props.onClick({ value: this.props.value || this.props.children, target: { value: this.props.value || this.props.children } }); } }, { key: "render", value: function render() { return React.createElement(Option, _extends({}, this.props, { onClick: this.onClick })); } }]); return DropdownOption; }(React.Component), (_applyDecoratedDescriptor(_class.prototype, "onClick", [autobind], Object.getOwnPropertyDescriptor(_class.prototype, "onClick"), _class.prototype)), _class); var Dropdown = clickOutside(_class2 = (_class3 = function (_React$Component2) { _inherits(Dropdown, _React$Component2); function Dropdown(props) { _classCallCheck(this, Dropdown); var _this2 = _possibleConstructorReturn(this, (Dropdown.__proto__ || Object.getPrototypeOf(Dropdown)).call(this, props)); _this2.state = { active: false, scrolled: false }; return _this2; } _createClass(Dropdown, [{ key: "calculateScrollState", value: function calculateScrollState() { if (this.dropdownContentRef.scrollHeight - this.dropdownContentRef.clientHeight - this.dropdownContentRef.scrollTop === 0) { this.setState({ scrolled: true }); } } }, { key: "toggle", value: function toggle() { this.setState(function (pState) { return { active: !pState.active }; }, this.calculateScrollState); } }, { key: "show", value: function show() { this.setState({ active: true }); } }, { key: "hide", value: function hide() { this.setState({ active: false }); } }, { key: "onClickOption", value: function onClickOption(e) { this.hide(); this.props.onChange(e); } }, { key: "handleClickOutside", value: function handleClickOutside() { this.hide(); } //Scrolling }, { key: "onWrapperScroll", value: function onWrapperScroll(e) { if (e.target.scrollHeight - e.target.clientHeight - e.target.scrollTop === 0) { this.setState({ scrolled: true }); } else { this.state.scrolled && this.setState({ scrolled: false }); } } }, { key: "componentDidMount", value: function componentDidMount() { var dropdownContent = ReactDOM.findDOMNode(this.dropdownContentRef); dropdownContent.addEventListener("scroll", this.onWrapperScroll); } }, { key: "componentWillUnmount", value: function componentWillUnmount() { var dropdownContent = ReactDOM.findDOMNode(this.dropdownContentRef); dropdownContent.removeEventListener("scroll", this.onWrapperScroll); } }, { key: "onDropdownContentRef", value: function onDropdownContentRef(ref) { this.dropdownContentRef = ref || this.dropdownContentRef; } }, { key: "render", value: function render() { var _this3 = this; var _props = this.props, label = _props.label, value = _props.value, children = _props.children; return React.createElement( OuterWrapper, null, label && React.createElement( Label, null, label ), React.createElement( Wrapper, null, React.createElement( Trigger, { onClick: this.toggle }, !!value ? (children.find(function (o) { return value === o.props.value || value === o.props.children; }) || children[0]).props.children : this.props.default || "Choose..." ), React.createElement( Content, _extends({ innerRef: this.onDropdownContentRef }, this.state), this.props.children && this.props.children.length > 0 ? React.Children.map(children, function (_ref2, i) { var optionProps = _ref2.props; return React.createElement(DropdownOption, _extends({ key: i }, optionProps, { onClick: _this3.onClickOption, active: value === optionProps.value })); }) : React.createElement( Option, { onClick: this.hide }, "No options supplied" ) ) ) ); } }]); return Dropdown; }(React.Component), (_applyDecoratedDescriptor(_class3.prototype, "calculateScrollState", [autobind], Object.getOwnPropertyDescriptor(_class3.prototype, "calculateScrollState"), _class3.prototype), _applyDecoratedDescriptor(_class3.prototype, "toggle", [autobind], Object.getOwnPropertyDescriptor(_class3.prototype, "toggle"), _class3.prototype), _applyDecoratedDescriptor(_class3.prototype, "show", [autobind], Object.getOwnPropertyDescriptor(_class3.prototype, "show"), _class3.prototype), _applyDecoratedDescriptor(_class3.prototype, "hide", [autobind], Object.getOwnPropertyDescriptor(_class3.prototype, "hide"), _class3.prototype), _applyDecoratedDescriptor(_class3.prototype, "onClickOption", [autobind], Object.getOwnPropertyDescriptor(_class3.prototype, "onClickOption"), _class3.prototype), _applyDecoratedDescriptor(_class3.prototype, "handleClickOutside", [autobind], Object.getOwnPropertyDescriptor(_class3.prototype, "handleClickOutside"), _class3.prototype), _applyDecoratedDescriptor(_class3.prototype, "onWrapperScroll", [autobind], Object.getOwnPropertyDescriptor(_class3.prototype, "onWrapperScroll"), _class3.prototype), _applyDecoratedDescriptor(_class3.prototype, "onDropdownContentRef", [autobind], Object.getOwnPropertyDescriptor(_class3.prototype, "onDropdownContentRef"), _class3.prototype)), _class3)) || _class2; var Blank = function Blank(props) { return React.createElement("div", props); }; Dropdown.Option = Blank; Dropdown.Trigger = function (props) { return React.createElement(Option, _extends({}, props, { trigger: true })); }; // -------------------------------------------------- Dropdown.Old = function (props) { return React.createElement( "form", null, React.createElement( "select", { value: props.value, onChange: props.onChange }, props.children ) ); }; Dropdown.Old.Option = function (props) { return React.createElement( "option", { value: props.value }, props.children ); }; // -------------------------------------------------- export default Dropdown;