Fix Picker re-positioning on popup contents change, fix non-critical exception when handling a bogus click in a closed popup

master
Vitaliy Filippov 2021-10-07 00:23:51 +03:00
parent 8e09ec62a3
commit d155becf23
2 changed files with 22 additions and 7 deletions

View File

@ -205,6 +205,13 @@ export default class Picker extends React.Component
{
return;
}
let ph;
if (this.state.height)
{
ph = this.picker.style.height;
// Trigger reflow
this.picker.style.height = 'auto';
}
const inputRect = this.input
? ReactDOM.findDOMNode(this.input).getBoundingClientRect()
: { left: this.props.popupX||0, top: this.props.popupY||0 };
@ -214,6 +221,10 @@ export default class Picker extends React.Component
{
this.setState(pos);
}
else if (ph)
{
this.picker.style.height = ph;
}
}
static getScrollHeight(el)
@ -233,15 +244,15 @@ export default class Picker extends React.Component
const screen_width = window.innerWidth || document.documentElement.offsetWidth;
const screen_height = window.innerHeight || document.documentElement.offsetHeight;
let direction = props && props.direction;
if (!direction || direction === 'auto')
{
const down = input_pos.top + popup_size.height < screen_height ||
input_pos.top < screen_height/2;
direction = down ? 'down' : 'up';
}
let top = input_pos.top
+ (props.usePortal ? (window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop) : 0)
- (document.documentElement.clientTop || document.body.clientTop || 0);
if (!direction || direction === 'auto')
{
const down = top + (input_pos.height||0) + popup_size.height < screen_height-32 ||
(top + (input_pos.height||0)) < screen_height/2;
direction = down ? 'down' : 'up';
}
const max_height = (direction == 'down' ? screen_height-top-(input_pos.height||0)-32 : top-32);
const height = Math.ceil(popup_size.height < max_height ? popup_size.height : max_height);
top = direction == 'down' ? (top + (input_pos.height||0)) : (top - height);

View File

@ -1,5 +1,5 @@
// Menu-like Picker variant with keyboard control
// Version 2021-09-18
// Version 2021-10-07
// License: LGPLv3.0+
// (c) Vitaliy Filippov 2020+
@ -79,6 +79,10 @@ export default class PickerMenu extends Picker
onMouseDown = (ev) =>
{
if (this.state.active == null)
{
return;
}
if (!this.props.keepOnClick)
{
if (this.input)