UNPKG

10.9 kBJavaScriptView Raw
1'use strict';
2
3Object.defineProperty(exports, "__esModule", {
4 value: true
5});
6exports.SelectMany = undefined;
7
8var _extends2 = require('babel-runtime/helpers/extends');
9
10var _extends3 = _interopRequireDefault(_extends2);
11
12var _slicedToArray2 = require('babel-runtime/helpers/slicedToArray');
13
14var _slicedToArray3 = _interopRequireDefault(_slicedToArray2);
15
16var _toConsumableArray2 = require('babel-runtime/helpers/toConsumableArray');
17
18var _toConsumableArray3 = _interopRequireDefault(_toConsumableArray2);
19
20var _objectWithoutProperties2 = require('babel-runtime/helpers/objectWithoutProperties');
21
22var _objectWithoutProperties3 = _interopRequireDefault(_objectWithoutProperties2);
23
24var _propTypes = require('prop-types');
25
26var _propTypes2 = _interopRequireDefault(_propTypes);
27
28var _react = require('react');
29
30var _react2 = _interopRequireDefault(_react);
31
32var _helperFunctions = require('./helperFunctions');
33
34var _CTCPopover = require('./CTCPopover');
35
36var _CTCPopover2 = _interopRequireDefault(_CTCPopover);
37
38var _defaultStyles = require('./defaultStyles');
39
40var _Button = require('./Button');
41
42var _Button2 = _interopRequireDefault(_Button);
43
44var _StyledSelect = require('./StyledSelect');
45
46function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
47
48var defaultRenderCurrentOption = function defaultRenderCurrentOption(_ref) {
49 var label = _ref.label;
50
51 if (typeof label === 'string') {
52 return label;
53 } else {
54 var flattened = (0, _helperFunctions.flatten)(label);
55 return flattened.join(', ');
56 }
57};
58
59var SelectMany = function SelectMany(_ref2) {
60 var _ref2$onChange = _ref2.onChange,
61 onChange = _ref2$onChange === undefined ? function (x) {
62 return console.log(x);
63 } : _ref2$onChange,
64 _ref2$renderCurrentOp = _ref2.renderCurrentOption,
65 renderCurrentOption = _ref2$renderCurrentOp === undefined ? defaultRenderCurrentOption : _ref2$renderCurrentOp,
66 _ref2$sortingFunction = _ref2.sortingFunction,
67 sortingFunction = _ref2$sortingFunction === undefined ? function () {
68 return 0;
69 } : _ref2$sortingFunction,
70 _ref2$showUnselectedO = _ref2.showUnselectedOnly,
71 showUnselectedOnly = _ref2$showUnselectedO === undefined ? false : _ref2$showUnselectedO,
72 children = _ref2.children,
73 _ref2$shouldRenderCle = _ref2.shouldRenderClearSelection,
74 shouldRenderClearSelection = _ref2$shouldRenderCle === undefined ? true : _ref2$shouldRenderCle,
75 renderTrigger = _ref2.renderTrigger,
76 _ref2$initialOptions = _ref2.initialOptions,
77 initialOptions = _ref2$initialOptions === undefined ? [] : _ref2$initialOptions,
78 props = (0, _objectWithoutProperties3.default)(_ref2, ['onChange', 'renderCurrentOption', 'sortingFunction', 'showUnselectedOnly', 'children', 'shouldRenderClearSelection', 'renderTrigger', 'initialOptions']);
79
80 function init(initialOptions) {
81 return { currentOptions: initialOptions };
82 }
83
84 var reducer = function reducer(_ref3, action) {
85 var currentOptions = _ref3.currentOptions;
86
87 var updatedState = {};
88 switch (action.type) {
89 case 'add':
90 if (sortingFunction) {
91 updatedState = {
92 currentOptions: [].concat((0, _toConsumableArray3.default)(currentOptions), [action.payload.option]).sort(sortingFunction)
93 };
94 } else {
95 updatedState = {
96 currentOptions: [].concat((0, _toConsumableArray3.default)(currentOptions), [action.payload.option])
97 };
98 }
99 break;
100 case 'remove':
101 updatedState = {
102 currentOptions: currentOptions.filter(function (currentOption) {
103 return currentOption.value !== action.payload.option.value;
104 })
105 };
106 break;
107 case 'clear':
108 updatedState = init(action.payload.options);
109 break;
110 default:
111 throw new Error();
112 }
113 onChange(updatedState.currentOptions);
114 return updatedState;
115 };
116
117 var _useReducer = (0, _react.useReducer)(reducer, initialOptions, init),
118 _useReducer2 = (0, _slicedToArray3.default)(_useReducer, 2),
119 currentOptions = _useReducer2[0].currentOptions,
120 dispatch = _useReducer2[1];
121
122 var renderClearSelection = function renderClearSelection() {
123 return shouldRenderClearSelection ? _react2.default.createElement(_Button2.default, {
124 type: 'cancel',
125 colors: _defaultStyles.buttonStyles.redden,
126 onClick: function onClick(e) {
127 e.stopPropagation();
128 e.nativeEvent.stopImmediatePropagation();
129 dispatch({ type: 'clear', payload: { options: [] } });
130 }
131 }) : null;
132 };
133 var renderRemoveCurrentOption = function renderRemoveCurrentOption(currentOption) {
134 return _react2.default.createElement(_Button2.default, {
135 className: 'selectmany__option__remove',
136 type: 'cancel',
137 colors: 'darkhighlight',
138 onClick: function onClick(e) {
139 e.stopPropagation();
140 e.nativeEvent.stopImmediatePropagation();
141 dispatch({
142 type: 'remove',
143 payload: { option: currentOption }
144 });
145 }
146 });
147 };
148
149 var isActive = function isActive(option) {
150 return currentOptions.some(function (currentOption) {
151 return currentOption.value === option.value;
152 });
153 };
154
155 var getChildProps = function getChildProps() {
156 var _ref4 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
157
158 var className = _ref4.className,
159 style = _ref4.style,
160 _onClick = _ref4.onClick,
161 option = _ref4.option,
162 props = (0, _objectWithoutProperties3.default)(_ref4, ['className', 'style', 'onClick', 'option']);
163
164 var optionIsActive = isActive(option);
165 var handleClassName = (0, _helperFunctions.advancedMulti)({
166 unflattenedBases: [className, 'selectmany__option'],
167 flipVars: [[optionIsActive, 'active', 'inactive']]
168 });
169 return (0, _extends3.default)({
170 onClick: function onClick(e) {
171 for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
172 args[_key - 1] = arguments[_key];
173 }
174
175 e.stopPropagation();
176 e.nativeEvent.stopImmediatePropagation();
177 if (isActive(option)) {
178 dispatch({ type: 'remove', payload: { option: option } });
179 } else {
180 dispatch({ type: 'add', payload: { option: option } });
181 }
182 _onClick && _onClick.apply(undefined, [e].concat(args));
183 },
184 className: handleClassName,
185 style: style
186 }, props);
187 };
188
189 var handleRenderTrigger = function handleRenderTrigger(_ref5) {
190 var isOn = _ref5.isOn,
191 _getTriggerProps = _ref5.getTriggerProps;
192 return renderTrigger ? renderTrigger({
193 dispatch: dispatch,
194 currentOptions: currentOptions,
195 isOn: isOn,
196 getTriggerProps: function getTriggerProps() {
197 var _ref6 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
198
199 var className = _ref6.className,
200 props = (0, _objectWithoutProperties3.default)(_ref6, ['className']);
201 return _getTriggerProps((0, _extends3.default)({
202 className: ['selectmany__trigger', className]
203 }, props));
204 }
205 }) : _react2.default.createElement(
206 _Button2.default,
207 {
208 type: 'caretdown',
209 isOn: isOn
210 },
211 function (_ref7) {
212 var getButtonProps = _ref7.getButtonProps,
213 icon = _ref7.icon,
214 commonProps = (0, _objectWithoutProperties3.default)(_ref7, ['getButtonProps', 'icon']);
215 return _react2.default.createElement(
216 _StyledSelect.DROPDOWN_TRIGGER,
217 (0, _extends3.default)({}, commonProps, getButtonProps((0, _extends3.default)({}, _getTriggerProps({
218 className: 'selectmany__trigger'
219 })))),
220 _react2.default.createElement(
221 _StyledSelect.TRIGGER_OPTIONS,
222 {
223 className: 'selectmany__options'
224 },
225 currentOptions.length > 0 ? currentOptions.map(function (currentOption, i) {
226 return _react2.default.createElement(
227 _StyledSelect.TRIGGER_OPTION,
228 {
229 key: '' + currentOption.value + i,
230 className: 'selectmany__option'
231 },
232 _react2.default.createElement(
233 _StyledSelect.TRIGGER_OPTION_LABEL,
234 { className: 'selectmany__option__label' },
235 renderCurrentOption(currentOption)
236 ),
237 renderRemoveCurrentOption(currentOption)
238 );
239 }) : _react2.default.createElement(
240 _StyledSelect.EMPTY_GUIDE,
241 {
242 className: 'selectmany__guide'
243 },
244 'select one...'
245 )
246 ),
247 _react2.default.createElement(
248 _StyledSelect.TRIGGER_CONTROLS,
249 { className: 'selectmany__removeall' },
250 currentOptions.length > 0 && renderClearSelection(),
251 _react2.default.createElement(
252 _StyledSelect.TRIGGER_CONTROLS_CARET,
253 {
254 className: 'selectmany__caret'
255 },
256 icon
257 )
258 )
259 );
260 }
261 );
262 };
263 return _react2.default.createElement(
264 _CTCPopover2.default,
265 (0, _extends3.default)({
266 renderTrigger: handleRenderTrigger
267
268 }, props),
269 function (_ref8) {
270 var getChildrenProps = _ref8.getChildrenProps,
271 toggleIsOn = _ref8.toggleIsOn;
272 return typeof children === 'function' ? children({
273 getChildProps: getChildProps,
274 getChildrenProps: getChildrenProps,
275 toggleIsOn: toggleIsOn,
276 currentOptions: currentOptions
277 }) : _react2.default.createElement(
278 _StyledSelect.DROPDOWN_CHILDREN,
279 (0, _extends3.default)({}, getChildrenProps({ style: { zIndex: 1 } })),
280 children.filter(function (option) {
281 if (showUnselectedOnly) {
282 if (!currentOptions.some(function (currentOption) {
283 return currentOption.value === option.value;
284 })) {
285 return option;
286 }
287 } else {
288 return option;
289 }
290 }).map(function (option) {
291 return _react2.default.createElement(
292 _StyledSelect.DROPDOWN_OPTION,
293 (0, _extends3.default)({}, getChildProps({ option: option }), {
294 colors: _defaultStyles.buttonStyles.monochrome,
295 isOn: currentOptions.some(function (currentOption) {
296 return currentOption.value === option.value;
297 }),
298 key: option.value
299 }),
300 option.label
301 );
302 })
303 );
304 }
305 );
306};
307
308exports.SelectMany = SelectMany;
309exports.default = SelectMany;
\No newline at end of file