12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697 |
- import {Component} from 'react';
- import Confirm from 'sentry/components/confirm';
- import FormField from 'sentry/components/forms/formField';
- import Switch from 'sentry/components/switchButton';
- // XXX(epurkhiser): This is wrong, it should not be inheriting these props
- import {InputFieldProps, OnEvent} from './inputField';
- export interface BooleanFieldProps extends InputFieldProps {
- confirm?: {
- false?: React.ReactNode;
- true?: React.ReactNode;
- };
- }
- export default class BooleanField extends Component<BooleanFieldProps> {
- coerceValue(value: any) {
- return !!value;
- }
- handleChange = (
- value: any,
- onChange: OnEvent,
- onBlur: OnEvent,
- e: React.FormEvent<HTMLInputElement>
- ) => {
- // We need to toggle current value because Switch is not an input
- const newValue = this.coerceValue(!value);
- onChange(newValue, e);
- onBlur(newValue, e);
- };
- render() {
- const {confirm, ...fieldProps} = this.props;
- return (
- <FormField {...fieldProps} resetOnError>
- {({
- children: _children,
- onChange,
- onBlur,
- value,
- disabled,
- ...props
- }: {
- disabled: boolean;
- onBlur: OnEvent;
- onChange: OnEvent;
- type: string;
- value: any;
- children?: React.ReactNode;
- }) => {
- // Create a function with required args bound
- const handleChange = this.handleChange.bind(this, value, onChange, onBlur);
- const {type: _, ...propsWithoutType} = props;
- const switchProps = {
- ...propsWithoutType,
- size: 'lg' as React.ComponentProps<typeof Switch>['size'],
- isActive: !!value,
- isDisabled: disabled,
- toggle: handleChange,
- };
- if (confirm) {
- return (
- <Confirm
- renderMessage={() => confirm[(!value).toString()]}
- onConfirm={() => handleChange({})}
- >
- {({open}) => (
- <Switch
- {...switchProps}
- toggle={(e: React.MouseEvent) => {
- // If we have a `confirm` prop and enabling switch
- // Then show confirm dialog, otherwise propagate change as normal
- if (confirm[(!value).toString()]) {
- // Open confirm modal
- open();
- return;
- }
- handleChange(e);
- }}
- />
- )}
- </Confirm>
- );
- }
- return <Switch {...switchProps} />;
- }}
- </FormField>
- );
- }
- }
|