-
Notifications
You must be signed in to change notification settings - Fork 13
Expand file tree
/
Copy pathOptions.js
More file actions
85 lines (79 loc) · 2.61 KB
/
Options.js
File metadata and controls
85 lines (79 loc) · 2.61 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
import React, { Component } from 'react';
import cx from 'classnames';
import Option from './Option';
import { getOptionIndex, isOptGroup } from './utils';
export default class Options extends Component {
componentWillReceiveProps({ options, highlightedOption }) {
this.scrollTo({ options, highlightedOption });
}
componentDidMount() {
let { options, highlightedOption } = this.props;
this.optionsListOffsetHeight = this.optionsList.offsetHeight;
this.scrollTo({ options, highlightedOption });
}
componentDidUpdate() {
if (!this.optionsListOffsetHeight) {
this.optionsListOffsetHeight = this.optionsList.offsetHeight;
}
}
scrollTo({ options, highlightedOption }) {
if (highlightedOption) {
let optionIndex = getOptionIndex(options, highlightedOption);
let $option = this.optionsList.querySelector(`[data-option-index="${optionIndex}"]`);
let delta = 0;
if ($option) {
let $optionOffsetHeight = $option.offsetHeight;
let $optionOffsetTop = $option.offsetTop;
delta = $optionOffsetTop + $optionOffsetHeight - this.optionsListOffsetHeight;
}
if (delta > 0) {
this.optionsList.scrollTop = delta;
} else {
this.optionsList.scrollTop = 0;
}
}
}
renderOptions(options, optGroupDisabled = false) {
let { select, optionLabelPath, optionComponent, highlightedOption, onOptionClick } = this.props;
return options.map((option, index) => {
let optionIndex = getOptionIndex(this.props.options, option);
if (isOptGroup(option)) {
return (
<div
key={index}
data-group-index={optionIndex}
className={cx('PowerSelect__OptGroup', {
'PowerSelect__OptGroup--disabled': !!option.disabled,
})}
>
<div className="PowerSelect__OptGroup__Label">{option.label}</div>
{this.renderOptions(option.options, option.disabled)}
</div>
);
}
return (
<Option
key={index}
optionIndex={optionIndex}
option={option}
select={select}
disabled={optGroupDisabled}
optionLabelPath={optionLabelPath}
optionComponent={optionComponent}
isHighlighted={option === highlightedOption}
onOptionClick={() => {
onOptionClick(option);
}}
/>
);
});
}
render() {
let { options } = this.props;
return (
<div className="PowerSelect__Options" ref={optionsList => (this.optionsList = optionsList)}>
{this.renderOptions(options)}
</div>
);
}
}