UNPKG

12.4 kBJavaScriptView Raw
1/**
2 * Dropdown component
3 * @class ApDropdown
4 */
5
6'use strict';
7
8Object.defineProperty(exports, "__esModule", {
9 value: true
10});
11
12var _react = require('react');
13
14var _react2 = _interopRequireDefault(_react);
15
16var _reactDom = require('react-dom');
17
18var _reactDom2 = _interopRequireDefault(_reactDom);
19
20var _classnames = require('classnames');
21
22var _classnames2 = _interopRequireDefault(_classnames);
23
24var _apemanReactSpinner = require('apeman-react-spinner');
25
26var _apemanReactMixins = require('apeman-react-mixins');
27
28var _apemanReactButton = require('apeman-react-button');
29
30function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
31
32/** @lends ApDropdown */
33var ApDropdown = _react2.default.createClass({
34 displayName: 'ApDropdown',
35
36
37 // --------------------
38 // Specs
39 // --------------------
40
41 propTypes: {
42 /** Icon class name for open state */
43 openIcon: _react.PropTypes.string,
44 /** Icon class name for closed state */
45 closedIcon: _react.PropTypes.string,
46 /** Show spinner */
47 spinning: _react.PropTypes.bool,
48 /** Spinner theme */
49 spinner: _react.PropTypes.string,
50 /** Open or not */
51 open: _react.PropTypes.bool.isRequired,
52 /** Handler for tap event */
53 onTap: _react.PropTypes.func.isRequired
54 },
55
56 mixins: [_apemanReactMixins.ApLayoutMixin, _apemanReactMixins.ApOutsideMixin],
57
58 statics: {},
59
60 getInitialState: function getInitialState() {
61 return {
62 open: false
63 };
64 },
65 getDefaultProps: function getDefaultProps() {
66 return {
67 openIcon: 'ion ion-chevron-up',
68 closedIcon: 'ion ion-chevron-down',
69 spinning: false,
70 spinner: _apemanReactSpinner.ApSpinner.DEFAULT_THEME
71 };
72 },
73 render: function render() {
74 var s = this;
75 var state = s.state;
76 var props = s.props;
77 var layouts = s.layouts;
78
79
80 return _react2.default.createElement(
81 'div',
82 { className: (0, _classnames2.default)('ap-dropdown', {
83 'ap-dropdown-open': props.open,
84 'ap-dropdown-closed': !props.open
85 }, props.className),
86 style: Object.assign({}, props.style) },
87 s._renderSpinner(),
88 _react2.default.createElement(
89 'div',
90 { className: 'ap-dropdown-button-wrap' },
91 _react2.default.createElement(
92 _apemanReactButton.ApButton,
93 { className: 'ap-dropdown-button', onTap: s.handleButtonTap },
94 props.title,
95 _react2.default.createElement('i', { className: (0, _classnames2.default)('ap-dropdown-icon', props.open ? props.openIcon : props.closedIcon) })
96 )
97 ),
98 _react2.default.createElement(
99 'div',
100 { className: 'ap-dropdown-content', style: layouts.content },
101 _react2.default.createElement(
102 'div',
103 { className: 'ap-dropdown-content-inner',
104 ref: function ref(inner) {
105 return s.registerContentInner(inner);
106 } },
107 props.children
108 )
109 )
110 );
111 },
112
113
114 // --------------------
115 // Lifecycle
116 // --------------------
117
118 componentWillMount: function componentWillMount() {
119 var s = this;
120 },
121 componentDidMount: function componentDidMount() {
122 var s = this;
123 s.layout();
124 },
125
126
127 // ------------------
128 // For ApLayoutMixin
129 // ------------------
130
131 getInitialLayouts: function getInitialLayouts() {
132 return {
133 content: null
134 };
135 },
136 calcLayouts: function calcLayouts() {
137 var s = this;
138 var contentInner = s.contentInner;
139
140 var contentRect = contentInner.getBoundingClientRect();
141 return {
142 content: {
143 height: contentRect.height
144 }
145 };
146 },
147
148
149 // ------------------
150 // Custom
151 // ------------------
152
153 contentInner: null,
154
155 registerContentInner: function registerContentInner(contentInner) {
156 var s = this;
157 s.contentInner = contentInner;
158 },
159 handleButtonTap: function handleButtonTap(e) {
160 var s = this;
161 var props = s.props;
162
163 props.onTap(e);
164 },
165
166
167 // ------------------
168 // Private
169 // ------------------
170 _renderSpinner: function _renderSpinner() {
171 var s = this;
172 var props = s.props;
173
174 if (!props.spinning) {
175 return null;
176 }
177 return _react2.default.createElement(
178 'div',
179 { className: 'ap-dropdown-spinner-cover' },
180 _react2.default.createElement(_apemanReactSpinner.ApSpinner, { theme: props.spinner,
181 className: 'ap-dropdown-spinner',
182 enabled: true })
183 );
184 }
185});
186
187exports.default = ApDropdown;
188//# sourceMappingURL=data:application/json;base64,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QUNELEdBakhrQztBQW1IbkMsaUJBbkhtQywyQkFtSGxCLENBbkhrQixFQW1IZjtBQUNsQixRQUFNLElBQUksSUFBVjtBQURrQixRQUVaLEtBRlksR0FFRixDQUZFLENBRVosS0FGWTs7QUFHbEIsVUFBTSxLQUFOLENBQVksQ0FBWjtBQUNELEdBdkhrQzs7Ozs7O0FBNEhuQyxnQkE1SG1DLDRCQTRIakI7QUFDaEIsUUFBTSxJQUFJLElBQVY7QUFEZ0IsUUFFVixLQUZVLEdBRUEsQ0FGQSxDQUVWLEtBRlU7O0FBR2hCLFFBQUksQ0FBQyxNQUFNLFFBQVgsRUFBcUI7QUFDbkIsYUFBTyxJQUFQO0FBQ0Q7QUFDRCxXQUNFO0FBQUE7TUFBQSxFQUFLLFdBQVUsMkJBQWY7TUFDRSwrREFBVyxPQUFRLE1BQU0sT0FBekI7QUFDVyxtQkFBVSxxQkFEckI7QUFFVyxpQkFBVSxJQUZyQjtBQURGLEtBREY7QUFPRDtBQXpJa0MsQ0FBbEIsQ0FBbkI7O2tCQTRJZSxVIiwiZmlsZSI6ImFwX2Ryb3Bkb3duLmpzIiwic291cmNlUm9vdCI6Ii9Vc2Vycy9va3VuaXNoaW5pc2hpL1Byb2plY3RzL2FwZW1hbi1wcm9qZWN0cy9hcGVtYW4tcmVhY3QtZHJvcGRvd24vbGliIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBEcm9wZG93biBjb21wb25lbnRcbiAqIEBjbGFzcyBBcERyb3Bkb3duXG4gKi9cblxuJ3VzZSBzdHJpY3QnXG5cbmltcG9ydCBSZWFjdCwge1Byb3BUeXBlcyBhcyB0eXBlc30gZnJvbSAncmVhY3QnXG5pbXBvcnQgUmVhY3RET00gZnJvbSAncmVhY3QtZG9tJ1xuaW1wb3J0IGNsYXNzbmFtZXMgZnJvbSAnY2xhc3NuYW1lcydcbmltcG9ydCB7QXBTcGlubmVyfSBmcm9tICdhcGVtYW4tcmVhY3Qtc3Bpbm5lcidcblxuaW1wb3J0IHtBcExheW91dE1peGluLCBBcFB1cmVNaXhpbiwgQXBPdXRzaWRlTWl4aW59IGZyb20gJ2FwZW1hbi1yZWFjdC1taXhpbnMnXG5pbXBvcnQge0FwQnV0dG9ufSBmcm9tICdhcGVtYW4tcmVhY3QtYnV0dG9uJ1xuXG4vKiogQGxlbmRzIEFwRHJvcGRvd24gKi9cbmNvbnN0IEFwRHJvcGRvd24gPSBSZWFjdC5jcmVhdGVDbGFzcyh7XG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gU3BlY3NcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICBwcm9wVHlwZXM6IHtcbiAgICAvKiogSWNvbiBjbGFzcyBuYW1lIGZvciBvcGVuIHN0YXRlICovXG4gICAgb3Blbkljb246IHR5cGVzLnN0cmluZyxcbiAgICAvKiogSWNvbiBjbGFzcyBuYW1lIGZvciBjbG9zZWQgc3RhdGUgKi9cbiAgICBjbG9zZWRJY29uOiB0eXBlcy5zdHJpbmcsXG4gICAgLyoqIFNob3cgc3Bpbm5lciAqL1xuICAgIHNwaW5uaW5nOiB0eXBlcy5ib29sLFxuICAgIC8qKiBTcGlubmVyIHRoZW1lICovXG4gICAgc3Bpbm5lcjogdHlwZXMuc3RyaW5nLFxuICAgIC8qKiBPcGVuIG9yIG5vdCAqL1xuICAgIG9wZW46IHR5cGVzLmJvb2wuaXNSZXF1aXJlZCxcbiAgICAvKiogSGFuZGxlciBmb3IgdGFwIGV2ZW50ICovXG4gICAgb25UYXA6IHR5cGVzLmZ1bmMuaXNSZXF1aXJlZFxuICB9LFxuXG4gIG1peGluczogW1xuICAgIEFwTGF5b3V0TWl4aW4sXG4gICAgQXBPdXRzaWRlTWl4aW5cbiAgXSxcblxuICBzdGF0aWNzOiB7fSxcblxuICBnZXRJbml0aWFsU3RhdGUgKCkge1xuICAgIHJldHVybiB7XG4gICAgICBvcGVuOiBmYWxzZVxuICAgIH1cbiAgfSxcblxuICBnZXREZWZhdWx0UHJvcHMgKCkge1xuICAgIHJldHVybiB7XG4gICAgICBvcGVuSWNvbjogJ2lvbiBpb24tY2hldnJvbi11cCcsXG4gICAgICBjbG9zZWRJY29uOiAnaW9uIGlvbi1jaGV2cm9uLWRvd24nLFxuICAgICAgc3Bpbm5pbmc6IGZhbHNlLFxuICAgICAgc3Bpbm5lcjogQXBTcGlubmVyLkRFRkFVTFRfVEhFTUVcbiAgICB9XG4gIH0sXG5cbiAgcmVuZGVyICgpIHtcbiAgICBjb25zdCBzID0gdGhpc1xuICAgIGxldCB7IHN0YXRlLCBwcm9wcywgbGF5b3V0cyB9ID0gc1xuXG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXYgY2xhc3NOYW1lPXsgY2xhc3NuYW1lcygnYXAtZHJvcGRvd24nLCB7XG4gICAgICAgICAgICAgICAgJ2FwLWRyb3Bkb3duLW9wZW4nOiBwcm9wcy5vcGVuLFxuICAgICAgICAgICAgICAgICdhcC1kcm9wZG93bi1jbG9zZWQnOiAhcHJvcHMub3BlblxuICAgICAgICAgICAgfSwgcHJvcHMuY2xhc3NOYW1lKSB9XG4gICAgICAgICAgIHN0eWxlPXsgT2JqZWN0LmFzc2lnbih7fSwgcHJvcHMuc3R5bGUpIH0+XG4gICAgICAgIHsgcy5fcmVuZGVyU3Bpbm5lcigpIH1cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJhcC1kcm9wZG93bi1idXR0b24td3JhcFwiPlxuICAgICAgICAgIDxBcEJ1dHRvbiBjbGFzc05hbWU9XCJhcC1kcm9wZG93bi1idXR0b25cIiBvblRhcD17IHMuaGFuZGxlQnV0dG9uVGFwIH0+XG4gICAgICAgICAgICB7IHByb3BzLnRpdGxlIH1cbiAgICAgICAgICAgIDxpIGNsYXNzTmFtZT17IGNsYXNzbmFtZXMoJ2FwLWRyb3Bkb3duLWljb24nLCBwcm9wcy5vcGVuID8gcHJvcHMub3Blbkljb24gOiBwcm9wcy5jbG9zZWRJY29uKSB9Lz5cbiAgICAgICAgICA8L0FwQnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJhcC1kcm9wZG93bi1jb250ZW50XCIgc3R5bGU9eyBsYXlvdXRzLmNvbnRlbnQgfT5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImFwLWRyb3Bkb3duLWNvbnRlbnQtaW5uZXJcIlxuICAgICAgICAgICAgICAgcmVmPXsgKGlubmVyKSA9PiBzLnJlZ2lzdGVyQ29udGVudElubmVyKGlubmVyKSB9PlxuICAgICAgICAgICAgeyBwcm9wcy5jaGlsZHJlbiB9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgKVxuICB9LFxuXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIExpZmVjeWNsZVxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIGNvbXBvbmVudFdpbGxNb3VudCAoKSB7XG4gICAgY29uc3QgcyA9IHRoaXNcbiAgfSxcblxuICBjb21wb25lbnREaWRNb3VudCAoKSB7XG4gICAgY29uc3QgcyA9IHRoaXNcbiAgICBzLmxheW91dCgpXG4gIH0sXG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIEZvciBBcExheW91dE1peGluXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIGdldEluaXRpYWxMYXlvdXRzICgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgY29udGVudDogbnVsbFxuICAgIH1cbiAgfSxcblxuICBjYWxjTGF5b3V0cyAoKSB7XG4gICAgY29uc3QgcyA9IHRoaXNcbiAgICBsZXQgeyBjb250ZW50SW5uZXIgfSA9IHNcbiAgICBsZXQgY29udGVudFJlY3QgPSBjb250ZW50SW5uZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClcbiAgICByZXR1cm4ge1xuICAgICAgY29udGVudDoge1xuICAgICAgICBoZWlnaHQ6IGNvbnRlbnRSZWN0LmhlaWdodFxuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gQ3VzdG9tXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIGNvbnRlbnRJbm5lcjogbnVsbCxcblxuICByZWdpc3RlckNvbnRlbnRJbm5lciAoY29udGVudElubmVyKSB7XG4gICAgY29uc3QgcyA9IHRoaXNcbiAgICBzLmNvbnRlbnRJbm5lciA9IGNvbnRlbnRJbm5lclxuICB9LFxuXG4gIGhhbmRsZUJ1dHRvblRhcCAoZSkge1xuICAgIGNvbnN0IHMgPSB0aGlzXG4gICAgbGV0IHsgcHJvcHMgfSA9IHNcbiAgICBwcm9wcy5vblRhcChlKVxuICB9LFxuXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyBQcml2YXRlXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLVxuICBfcmVuZGVyU3Bpbm5lciAoKSB7XG4gICAgY29uc3QgcyA9IHRoaXNcbiAgICBsZXQgeyBwcm9wcyB9ID0gc1xuICAgIGlmICghcHJvcHMuc3Bpbm5pbmcpIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuICAgIHJldHVybiAoXG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImFwLWRyb3Bkb3duLXNwaW5uZXItY292ZXJcIj5cbiAgICAgICAgPEFwU3Bpbm5lciB0aGVtZT17IHByb3BzLnNwaW5uZXIgfVxuICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImFwLWRyb3Bkb3duLXNwaW5uZXJcIlxuICAgICAgICAgICAgICAgICAgIGVuYWJsZWQ9eyB0cnVlIH0vPlxuICAgICAgPC9kaXY+XG4gICAgKVxuICB9XG59KVxuXG5leHBvcnQgZGVmYXVsdCBBcERyb3Bkb3duXG4iXX0=
\No newline at end of file