fix bouncing help icons on mobiles devices

This commit is contained in:
Sebastian Sdorra
2018-11-13 07:39:19 +01:00
parent 24de639c1e
commit e7c9560073
11 changed files with 102 additions and 76 deletions

View File

@@ -1,39 +1,33 @@
//@flow //@flow
import React from "react"; import React from "react";
import injectSheet from "react-jss"; import injectSheet from "react-jss";
import classNames from "classnames"; import Tooltip from './Tooltip';
import HelpIcon from './HelpIcon';
const styles = { const styles = {
img: { tooltip: {
display: "block" display: "inline-block",
}, paddingLeft: "3px"
q: {
float: "left",
paddingLeft: "3px",
float: "right"
} }
}; };
type Props = { type Props = {
message: string, message: string,
classes: any classes: any
}; }
class Help extends React.Component<Props> { class Help extends React.Component<Props> {
render() { render() {
const { message, classes } = this.props; const { message, classes } = this.props;
const multiline = message.length > 60 ? "is-tooltip-multiline" : "";
return ( return (
<div <Tooltip className={classes.tooltip} message={message}>
className={classNames("tooltip is-tooltip-right", multiline, classes.q)} <HelpIcon />
data-tooltip={message} </Tooltip>
>
<i
className={classNames("fa fa-question has-text-info", classes.img)}
/>
</div>
); );
} }
} }
export default injectSheet(styles)(Help); export default injectSheet(styles)(Help);

View File

@@ -0,0 +1,14 @@
//@flow
import React from "react";
import classNames from "classnames";
type Props = {
};
class HelpIcon extends React.Component<Props> {
render() {
return <i className={classNames("fa fa-question has-text-info")} />
}
}
export default HelpIcon;

View File

@@ -1,46 +0,0 @@
//@flow
import React from "react";
import { Help } from "./index";
type Props = {
label: string,
helpText?: string
};
class LabelWithHelpIcon extends React.Component<Props> {
renderLabel = () => {
const label = this.props.label;
if (label) {
return <label className="label">{label}</label>;
}
return "";
};
renderHelp = () => {
const helpText = this.props.helpText;
if (helpText) {
return (
<div className="control columns is-vcentered">
<Help message={helpText} />
</div>
);
} else return null;
};
renderLabelWithHelpIcon = () => {
if (this.props.label) {
return (
<div className="field is-grouped">
<div className="control">{this.renderLabel()}</div>
{this.renderHelp()}
</div>
);
} else return null;
};
render() {
return this.renderLabelWithHelpIcon();
}
}
export default LabelWithHelpIcon;

View File

@@ -0,0 +1,26 @@
//@flow
import * as React from "react";
import classNames from "classnames";
type Props = {
message: string,
className: string,
children: React.Node
};
class Tooltip extends React.Component<Props> {
render() {
const { className, message, children } = this.props;
const multiline = message.length > 60 ? "is-tooltip-multiline" : "";
return (
<div
className={classNames("tooltip", "is-tooltip-right", multiline, className)}
data-tooltip={message}
>
{children}
</div>
);
}
}
export default Tooltip;

View File

@@ -10,7 +10,9 @@ type Props = {
disabled?: boolean, disabled?: boolean,
helpText?: string helpText?: string
}; };
class Checkbox extends React.Component<Props> { class Checkbox extends React.Component<Props> {
onCheckboxChange = (event: SyntheticInputEvent<HTMLInputElement>) => { onCheckboxChange = (event: SyntheticInputEvent<HTMLInputElement>) => {
if (this.props.onChange) { if (this.props.onChange) {
this.props.onChange(event.target.checked, this.props.name); this.props.onChange(event.target.checked, this.props.name);
@@ -20,12 +22,8 @@ class Checkbox extends React.Component<Props> {
renderHelp = () => { renderHelp = () => {
const helpText = this.props.helpText; const helpText = this.props.helpText;
if (helpText) { if (helpText) {
return ( return <Help message={helpText} />;
<div className="control columns is-vcentered"> }
<Help message={helpText} />
</div>
);
} else return null;
}; };
render() { render() {
@@ -39,10 +37,11 @@ class Checkbox extends React.Component<Props> {
onChange={this.onCheckboxChange} onChange={this.onCheckboxChange}
disabled={this.props.disabled} disabled={this.props.disabled}
/> />
{" "}
{this.props.label} {this.props.label}
{this.renderHelp()}
</label> </label>
</div> </div>
{this.renderHelp()}
</div> </div>
); );
} }

View File

@@ -1,7 +1,7 @@
//@flow //@flow
import React from "react"; import React from "react";
import classNames from "classnames"; import classNames from "classnames";
import { LabelWithHelpIcon } from "../index"; import LabelWithHelpIcon from "./LabelWithHelpIcon";
type Props = { type Props = {
label?: string, label?: string,

View File

@@ -0,0 +1,37 @@
//@flow
import React from "react";
import Help from '../Help';
type Props = {
label?: string,
helpText?: string
};
class LabelWithHelpIcon extends React.Component<Props> {
renderHelp() {
const { helpText } = this.props;
if (helpText) {
return (
<Help message={helpText} />
);
}
}
render() {
const {label } = this.props;
if (label) {
const help = this.renderHelp();
return (
<label className="label">
{label} { help }
</label>
);
}
return "";
}
}
export default LabelWithHelpIcon;

View File

@@ -1,7 +1,7 @@
//@flow //@flow
import React from "react"; import React from "react";
import classNames from "classnames"; import classNames from "classnames";
import { LabelWithHelpIcon } from "../index"; import LabelWithHelpIcon from "./LabelWithHelpIcon";
export type SelectItem = { export type SelectItem = {
value: string, value: string,

View File

@@ -1,6 +1,6 @@
//@flow //@flow
import React from "react"; import React from "react";
import { LabelWithHelpIcon } from "../index"; import LabelWithHelpIcon from "./LabelWithHelpIcon";
export type SelectItem = { export type SelectItem = {
value: string, value: string,

View File

@@ -5,4 +5,5 @@ export { default as Checkbox } from "./Checkbox.js";
export { default as InputField } from "./InputField.js"; export { default as InputField } from "./InputField.js";
export { default as Select } from "./Select.js"; export { default as Select } from "./Select.js";
export { default as Textarea } from "./Textarea.js"; export { default as Textarea } from "./Textarea.js";
export { default as LabelWithHelpIcon } from "./LabelWithHelpIcon";

View File

@@ -17,8 +17,9 @@ export { default as Notification } from "./Notification.js";
export { default as Paginator } from "./Paginator.js"; export { default as Paginator } from "./Paginator.js";
export { default as LinkPaginator } from "./LinkPaginator.js"; export { default as LinkPaginator } from "./LinkPaginator.js";
export { default as ProtectedRoute } from "./ProtectedRoute.js"; export { default as ProtectedRoute } from "./ProtectedRoute.js";
export { default as Help } from "./Help.js"; export { default as Help } from "./Help";
export { default as LabelWithHelpIcon } from "./LabelWithHelpIcon.js"; export { default as HelpIcon } from "./HelpIcon";
export { default as Tooltip } from "./Tooltip";
export { getPageFromMatch } from "./urls"; export { getPageFromMatch } from "./urls";
export { apiClient, NOT_FOUND_ERROR, UNAUTHORIZED_ERROR } from "./apiclient.js"; export { apiClient, NOT_FOUND_ERROR, UNAUTHORIZED_ERROR } from "./apiclient.js";