Skip to content

Commit bb4afd4

Browse files
committed
Make tooltips behaviour as in guides
1 parent 58ad2cc commit bb4afd4

8 files changed

+68
-215
lines changed

.vscode/settings.json

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,5 +9,9 @@
99
"*.js": "javascript",
1010
"*.js.flow": "javascript"
1111
},
12-
"prettier.eslintIntegration": true
12+
"prettier.eslintIntegration": true,
13+
"files.exclude": {
14+
"**/dist": true,
15+
"**/retail-ui-dist": true,
16+
}
1317
}

src/Behaviour/ValidationContext.jsx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,6 @@ export default class ValidationContext extends React.Component<ValidationContext
104104
if (!withoutFocus) {
105105
firstInvalid.focus();
106106
}
107-
firstInvalid.activateValidationMessageIfNeed();
108107
}
109108

110109
if (this.props.onValidationUpdated) {

src/Behaviour/ValidationWrapper.jsx

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -188,12 +188,6 @@ export default class ValidationWrapper extends React.Component<ValidationWrapper
188188
}
189189
}
190190

191-
activateValidationMessageIfNeed() {
192-
if (this.refs.errorMessage && typeof this.refs.errorMessage.setOpened === "function") {
193-
this.refs.errorMessage.setOpened(true);
194-
}
195-
}
196-
197191
async focus(): Promise<void> {
198192
if (this.child) {
199193
const childDomElement = ReactDom.findDOMNode(this.child);

src/Tooltips/ValidationTooltip.jsx

Lines changed: 13 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
// @flow
22
/* eslint-disable import/no-dynamic-require, prefer-template */
33
import * as React from "react";
4-
import PropTypes from "prop-types";
54
import ReactUiDetection from "../ReactUiDetection";
65

76
// $FlowFixMe we use define plugin
@@ -10,7 +9,7 @@ const Tooltip = requireDefault(Tooltip2);
109

1110
function requireDefault<T>(obj: T): T {
1211
// $FlowFixMe default is a same module
13-
return obj && obj.__esModule ? obj.default : obj // eslint-disable-line
12+
return obj && obj.__esModule ? obj.default : obj; // eslint-disable-line
1413
}
1514

1615
type ValidationTooltipProps = {
@@ -20,63 +19,30 @@ type ValidationTooltipProps = {
2019
};
2120

2221
type ValidationTooltipState = {
23-
opened: boolean,
22+
focus: boolean,
23+
mouseOver: boolean,
2424
};
2525

2626
export default class ValidationTooltip extends React.Component<ValidationTooltipProps, ValidationTooltipState> {
2727
state: ValidationTooltipState = {
28-
opened: false,
28+
focus: false,
29+
mouseOver: false,
2930
};
3031

31-
static contextTypes = {
32-
validationTooltipContext: PropTypes.any,
33-
};
34-
35-
componentWillReceiveProps(nextProps: ValidationTooltipProps) {
36-
if (this.props.error !== nextProps.error) {
37-
this.context.validationTooltipContext.errorStateUpdated(this, this.props.error, nextProps.error);
38-
}
39-
}
40-
41-
componentWillMount() {
42-
if (this.context.validationTooltipContext) {
43-
this.context.validationTooltipContext.registerInstance(this);
44-
}
45-
}
46-
47-
componentWillUnmount() {
48-
if (this.context.validationTooltipContext) {
49-
this.context.validationTooltipContext.unregisterInstance(this);
50-
}
51-
}
52-
53-
setOpened(opened: boolean) {
54-
if (this.state.opened !== opened) {
55-
this.setState({
56-
opened: opened,
57-
});
58-
}
59-
}
60-
61-
getBoxDomElement(): Element {
62-
// eslint-disable-next-line no-underscore-dangle
63-
return this.refs.tooltip._hotspotDOM;
64-
}
65-
6632
handleFocus() {
67-
this.context.validationTooltipContext.instanceFocus(this);
33+
this.setState({ focus: true });
6834
}
6935

7036
handleBlur() {
71-
this.context.validationTooltipContext.instanceBlur(this);
37+
this.setState({ focus: false });
7238
}
7339

7440
handleMouseOver() {
75-
this.context.validationTooltipContext.instanceMouseOver(this);
41+
this.setState({ mouseOver: true });
7642
}
7743

7844
handleMouseOut() {
79-
this.context.validationTooltipContext.instanceMouseOut(this);
45+
this.setState({ mouseOver: false });
8046
}
8147

8248
render(): React.Node {
@@ -108,7 +74,9 @@ export default class ValidationTooltip extends React.Component<ValidationTooltip
10874
ref="tooltip"
10975
{...props}
11076
closeButton={false}
111-
trigger={this.props.error && this.state.opened ? "opened" : "closed"}>
77+
trigger={
78+
this.props.error && (this.state.focus || this.state.mouseOver) ? "opened" : "closed"
79+
}>
11280
{React.cloneElement(prevRenderItem(value, data, ...rest))}
11381
</Tooltip>
11482
);
@@ -122,7 +90,7 @@ export default class ValidationTooltip extends React.Component<ValidationTooltip
12290
ref="tooltip"
12391
{...props}
12492
closeButton={false}
125-
trigger={this.props.error && this.state.opened ? "opened" : "closed"}>
93+
trigger={this.props.error && (this.state.focus || this.state.mouseOver) ? "opened" : "closed"}>
12694
{React.cloneElement(onlyChild, childProps)}
12795
</Tooltip>
12896
);

src/Tooltips/ValidationTooltipContext.jsx

Lines changed: 0 additions & 157 deletions
This file was deleted.

src/index.js

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,12 @@
11
// @flow
22
/* eslint-disable react/no-multi-comp */
33
import * as React from "react";
4-
import ValidationTooltipContext from "./Tooltips/ValidationTooltipContext";
54
import ValidationContext from "./Behaviour/ValidationContext";
65
import ValidationWrapper from "./Behaviour/ValidationWrapper";
76
import ValidationTooltip from "./Tooltips/ValidationTooltip";
87
import type { RenderErrorMessage } from "./Behaviour/ValidationWrapper";
98

10-
export { ValidationTooltip, ValidationTooltipContext, ValidationContext, ValidationWrapper };
9+
export { ValidationTooltip, ValidationContext, ValidationWrapper };
1110

1211
type ValidationContainerProps = {
1312
children?: any,
@@ -33,7 +32,7 @@ export class ValidationContainer extends React.Component<ValidationContainerProp
3332
contextProps.verticalOffset = this.props.scrollOffset || 50;
3433
return (
3534
<ValidationContext ref="childContext" {...contextProps}>
36-
<ValidationTooltipContext ref="childTooltipContext">{children}</ValidationTooltipContext>
35+
{children}
3736
</ValidationContext>
3837
);
3938
}

stories/Input.stories.js

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -227,6 +227,49 @@ class Example6 extends React.Component {
227227
}
228228
}
229229

230+
class Example7 extends React.Component {
231+
state = {
232+
value1: "",
233+
value2: "",
234+
value3: "",
235+
};
236+
237+
validateValue(value) {
238+
if (value === "") {
239+
return { message: "Должно быть не пусто", type: "submit" };
240+
} else if (value.split(" ").length !== 2) {
241+
return { message: "Значение должно состоять из двух слов.", type: "lostfocus" };
242+
}
243+
return null;
244+
}
245+
246+
render() {
247+
const { value1, value2, value3 } = this.state;
248+
return (
249+
<ValidationContainer ref="container">
250+
<div>
251+
<div style={{ padding: 20 }}>
252+
<ValidationWrapperV1 validationInfo={this.validateValue(value1)}>
253+
<Input value={value1} onChange={(e, value) => this.setState({ value1: value })} />
254+
</ValidationWrapperV1>
255+
</div>
256+
<div style={{ padding: 20 }}>
257+
<ValidationWrapperV1 validationInfo={this.validateValue(value2)}>
258+
<Input value={value2} onChange={(e, value) => this.setState({ value2: value })} />
259+
</ValidationWrapperV1>
260+
</div>
261+
<div style={{ padding: 20 }}>
262+
<ValidationWrapperV1 validationInfo={this.validateValue(value3)}>
263+
<Input value={value3} onChange={(e, value) => this.setState({ value3: value })} />
264+
</ValidationWrapperV1>
265+
</div>
266+
</div>
267+
<Button onClick={() => this.refs.container.submit()}>Отправить</Button>
268+
</ValidationContainer>
269+
);
270+
}
271+
}
272+
230273
storiesOf("Input", module)
231274
.add("#1", () => {
232275
return <Example1 />;
@@ -245,4 +288,7 @@ storiesOf("Input", module)
245288
})
246289
.add("#6 Выбор первого контра для валидации", () => {
247290
return <Example6 />;
291+
})
292+
.add("#7 Три невалидных поля по сабмиту", () => {
293+
return <Example7 />;
248294
});

stories/RadioGroup.stories.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@ class RadioGroupStory extends React.Component {
1212
};
1313

1414
validateSex() {
15-
const { value1 } = this.state;
16-
if (value1 == null) {
15+
const { sex } = this.state;
16+
if (sex == null) {
1717
return { message: "Должно быть не пусто", type: "submit" };
1818
}
1919
return null;

0 commit comments

Comments
 (0)