mirror of
https://github.com/scm-manager/scm-manager.git
synced 2025-11-05 21:15:43 +01:00
Change AddEntryTo... to single-line component, add className prop to InputField and Autocomplete
This commit is contained in:
@@ -1,4 +1,5 @@
|
|||||||
import React from "react";
|
import React from "react";
|
||||||
|
import classNames from "classnames";
|
||||||
import { Async, AsyncCreatable } from "react-select";
|
import { Async, AsyncCreatable } from "react-select";
|
||||||
import { SelectValue } from "@scm-manager/ui-types";
|
import { SelectValue } from "@scm-manager/ui-types";
|
||||||
import LabelWithHelpIcon from "./forms/LabelWithHelpIcon";
|
import LabelWithHelpIcon from "./forms/LabelWithHelpIcon";
|
||||||
@@ -14,6 +15,7 @@ type Props = {
|
|||||||
loadingMessage: string;
|
loadingMessage: string;
|
||||||
noOptionsMessage: string;
|
noOptionsMessage: string;
|
||||||
creatable?: boolean;
|
creatable?: boolean;
|
||||||
|
className?: string;
|
||||||
};
|
};
|
||||||
|
|
||||||
type State = {};
|
type State = {};
|
||||||
@@ -53,10 +55,11 @@ class Autocomplete extends React.Component<Props, State> {
|
|||||||
loadingMessage,
|
loadingMessage,
|
||||||
noOptionsMessage,
|
noOptionsMessage,
|
||||||
loadSuggestions,
|
loadSuggestions,
|
||||||
creatable
|
creatable,
|
||||||
|
className
|
||||||
} = this.props;
|
} = this.props;
|
||||||
return (
|
return (
|
||||||
<div className="field">
|
<div className={classNames("field", className)}>
|
||||||
<LabelWithHelpIcon label={label} helpText={helpText} />
|
<LabelWithHelpIcon label={label} helpText={helpText} />
|
||||||
<div className="control">
|
<div className="control">
|
||||||
{creatable ? (
|
{creatable ? (
|
||||||
|
|||||||
@@ -1,7 +1,8 @@
|
|||||||
import React, { MouseEvent } from "react";
|
import React, { MouseEvent } from "react";
|
||||||
import InputField from "./InputField";
|
import styled from "styled-components";
|
||||||
import Level from "../layout/Level";
|
import Level from "../layout/Level";
|
||||||
import { AddButton } from "../buttons";
|
import InputField from "./InputField";
|
||||||
|
import AddButton from "../buttons/AddButton";
|
||||||
|
|
||||||
type Props = {
|
type Props = {
|
||||||
addEntry: (p: string) => void;
|
addEntry: (p: string) => void;
|
||||||
@@ -17,6 +18,22 @@ type State = {
|
|||||||
entryToAdd: string;
|
entryToAdd: string;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const StyledLevel = styled(Level)`
|
||||||
|
align-items: stretch;
|
||||||
|
margin-bottom: 1rem !important; // same margin as field
|
||||||
|
`;
|
||||||
|
|
||||||
|
const StyledInputField = styled(InputField)`
|
||||||
|
width: 100%;
|
||||||
|
margin-right: 1.5rem;
|
||||||
|
`;
|
||||||
|
|
||||||
|
const StyledField = styled.div.attrs(props => ({
|
||||||
|
className: "field"
|
||||||
|
}))`
|
||||||
|
align-self: flex-end;
|
||||||
|
`;
|
||||||
|
|
||||||
class AddEntryToTableField extends React.Component<Props, State> {
|
class AddEntryToTableField extends React.Component<Props, State> {
|
||||||
constructor(props: Props) {
|
constructor(props: Props) {
|
||||||
super(props);
|
super(props);
|
||||||
@@ -37,8 +54,9 @@ class AddEntryToTableField extends React.Component<Props, State> {
|
|||||||
render() {
|
render() {
|
||||||
const { disabled, buttonLabel, fieldLabel, errorMessage, helpText } = this.props;
|
const { disabled, buttonLabel, fieldLabel, errorMessage, helpText } = this.props;
|
||||||
return (
|
return (
|
||||||
<>
|
<StyledLevel
|
||||||
<InputField
|
children={
|
||||||
|
<StyledInputField
|
||||||
label={fieldLabel}
|
label={fieldLabel}
|
||||||
errorMessage={errorMessage}
|
errorMessage={errorMessage}
|
||||||
onChange={this.handleAddEntryChange}
|
onChange={this.handleAddEntryChange}
|
||||||
@@ -48,16 +66,17 @@ class AddEntryToTableField extends React.Component<Props, State> {
|
|||||||
disabled={disabled}
|
disabled={disabled}
|
||||||
helpText={helpText}
|
helpText={helpText}
|
||||||
/>
|
/>
|
||||||
<Level
|
}
|
||||||
right={
|
right={
|
||||||
|
<StyledField>
|
||||||
<AddButton
|
<AddButton
|
||||||
label={buttonLabel}
|
label={buttonLabel}
|
||||||
action={this.addButtonClicked}
|
action={this.addButtonClicked}
|
||||||
disabled={disabled || this.state.entryToAdd === "" || !this.isValid()}
|
disabled={disabled || this.state.entryToAdd === "" || !this.isValid()}
|
||||||
/>
|
/>
|
||||||
|
</StyledField>
|
||||||
}
|
}
|
||||||
/>
|
/>
|
||||||
</>
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,8 @@
|
|||||||
import React, { MouseEvent } from "react";
|
import React, { MouseEvent } from "react";
|
||||||
|
import styled from "styled-components";
|
||||||
import { SelectValue } from "@scm-manager/ui-types";
|
import { SelectValue } from "@scm-manager/ui-types";
|
||||||
import Autocomplete from "../Autocomplete";
|
|
||||||
import Level from "../layout/Level";
|
import Level from "../layout/Level";
|
||||||
|
import Autocomplete from "../Autocomplete";
|
||||||
import AddButton from "../buttons/AddButton";
|
import AddButton from "../buttons/AddButton";
|
||||||
|
|
||||||
type Props = {
|
type Props = {
|
||||||
@@ -20,6 +21,11 @@ type State = {
|
|||||||
selectedValue?: SelectValue;
|
selectedValue?: SelectValue;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const StyledAutocomplete = styled(Autocomplete)`
|
||||||
|
width: 100%;
|
||||||
|
margin-right: 1.5rem;
|
||||||
|
`;
|
||||||
|
|
||||||
class AutocompleteAddEntryToTableField extends React.Component<Props, State> {
|
class AutocompleteAddEntryToTableField extends React.Component<Props, State> {
|
||||||
constructor(props: Props) {
|
constructor(props: Props) {
|
||||||
super(props);
|
super(props);
|
||||||
@@ -41,8 +47,9 @@ class AutocompleteAddEntryToTableField extends React.Component<Props, State> {
|
|||||||
|
|
||||||
const { selectedValue } = this.state;
|
const { selectedValue } = this.state;
|
||||||
return (
|
return (
|
||||||
<div className="field">
|
<Level
|
||||||
<Autocomplete
|
children={
|
||||||
|
<StyledAutocomplete
|
||||||
label={fieldLabel}
|
label={fieldLabel}
|
||||||
loadSuggestions={loadSuggestions}
|
loadSuggestions={loadSuggestions}
|
||||||
valueSelected={this.handleAddEntryChange}
|
valueSelected={this.handleAddEntryChange}
|
||||||
@@ -53,8 +60,13 @@ class AutocompleteAddEntryToTableField extends React.Component<Props, State> {
|
|||||||
noOptionsMessage={noOptionsMessage}
|
noOptionsMessage={noOptionsMessage}
|
||||||
creatable={true}
|
creatable={true}
|
||||||
/>
|
/>
|
||||||
<Level right={<AddButton label={buttonLabel} action={this.addButtonClicked} disabled={disabled} />} />
|
}
|
||||||
|
right={
|
||||||
|
<div className="field">
|
||||||
|
<AddButton label={buttonLabel} action={this.addButtonClicked} disabled={disabled} />
|
||||||
</div>
|
</div>
|
||||||
|
}
|
||||||
|
/>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ type Props = {
|
|||||||
errorMessage?: string;
|
errorMessage?: string;
|
||||||
disabled?: boolean;
|
disabled?: boolean;
|
||||||
helpText?: string;
|
helpText?: string;
|
||||||
|
className?: string;
|
||||||
};
|
};
|
||||||
|
|
||||||
class InputField extends React.Component<Props> {
|
class InputField extends React.Component<Props> {
|
||||||
@@ -47,11 +48,21 @@ class InputField extends React.Component<Props> {
|
|||||||
};
|
};
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
const { type, placeholder, value, validationError, errorMessage, disabled, label, helpText } = this.props;
|
const {
|
||||||
|
type,
|
||||||
|
placeholder,
|
||||||
|
value,
|
||||||
|
validationError,
|
||||||
|
errorMessage,
|
||||||
|
disabled,
|
||||||
|
label,
|
||||||
|
helpText,
|
||||||
|
className
|
||||||
|
} = this.props;
|
||||||
const errorView = validationError ? "is-danger" : "";
|
const errorView = validationError ? "is-danger" : "";
|
||||||
const helper = validationError ? <p className="help is-danger">{errorMessage}</p> : "";
|
const helper = validationError ? <p className="help is-danger">{errorMessage}</p> : "";
|
||||||
return (
|
return (
|
||||||
<div className="field">
|
<div className={classNames("field", className)}>
|
||||||
<LabelWithHelpIcon label={label} helpText={helpText} />
|
<LabelWithHelpIcon label={label} helpText={helpText} />
|
||||||
<div className="control">
|
<div className="control">
|
||||||
<input
|
<input
|
||||||
|
|||||||
@@ -4,15 +4,22 @@ import classNames from "classnames";
|
|||||||
type Props = {
|
type Props = {
|
||||||
className?: string;
|
className?: string;
|
||||||
left?: ReactNode;
|
left?: ReactNode;
|
||||||
|
children?: ReactNode;
|
||||||
right?: ReactNode;
|
right?: ReactNode;
|
||||||
};
|
};
|
||||||
|
|
||||||
export default class Level extends React.Component<Props> {
|
export default class Level extends React.Component<Props> {
|
||||||
render() {
|
render() {
|
||||||
const { className, left, right } = this.props;
|
const { className, left, children, right } = this.props;
|
||||||
|
let child = null;
|
||||||
|
if (children) {
|
||||||
|
child = <div className="level-item">{children}</div>;
|
||||||
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className={classNames("level", className)}>
|
<div className={classNames("level", className)}>
|
||||||
<div className="level-left">{left}</div>
|
<div className="level-left">{left}</div>
|
||||||
|
{child}
|
||||||
<div className="level-right">{right}</div>
|
<div className="level-right">{right}</div>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|||||||
Reference in New Issue
Block a user