mirror of https://github.com/grafana/grafana.git
				
				
				
			
		
			
	
	
		
			71 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
		
		
			
		
	
	
			71 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
|  | import { css } from '@emotion/css'; | ||
|  | import { useId } from '@react-aria/utils'; | ||
|  | import React, { FormEvent, PropsWithChildren, ReactElement } from 'react'; | ||
|  | 
 | ||
|  | import { GrafanaTheme2 } from '@grafana/data'; | ||
|  | import { Field, TextArea, useStyles2 } from '@grafana/ui'; | ||
|  | 
 | ||
|  | interface VariableTextAreaFieldProps { | ||
|  |   name: string; | ||
|  |   value: string; | ||
|  |   placeholder: string; | ||
|  |   onChange?: (event: FormEvent<HTMLTextAreaElement>) => void; | ||
|  |   width: number; | ||
|  |   ariaLabel?: string; | ||
|  |   required?: boolean; | ||
|  |   testId?: string; | ||
|  |   onBlur?: (event: FormEvent<HTMLTextAreaElement>) => void; | ||
|  |   description?: React.ReactNode; | ||
|  | } | ||
|  | 
 | ||
|  | export function VariableTextAreaField({ | ||
|  |   value, | ||
|  |   name, | ||
|  |   description, | ||
|  |   placeholder, | ||
|  |   onChange, | ||
|  |   onBlur, | ||
|  |   ariaLabel, | ||
|  |   required, | ||
|  |   width, | ||
|  |   testId, | ||
|  | }: PropsWithChildren<VariableTextAreaFieldProps>): ReactElement { | ||
|  |   const styles = useStyles2(getStyles); | ||
|  |   const id = useId(); | ||
|  | 
 | ||
|  |   return ( | ||
|  |     <Field label={name} description={description} htmlFor={id}> | ||
|  |       <TextArea | ||
|  |         id={id} | ||
|  |         rows={2} | ||
|  |         value={value} | ||
|  |         onChange={onChange} | ||
|  |         onBlur={onBlur} | ||
|  |         placeholder={placeholder} | ||
|  |         required={required} | ||
|  |         aria-label={ariaLabel} | ||
|  |         cols={width} | ||
|  |         className={styles.textarea} | ||
|  |         data-testid={testId} | ||
|  |       /> | ||
|  |     </Field> | ||
|  |   ); | ||
|  | } | ||
|  | 
 | ||
|  | export function getStyles(theme: GrafanaTheme2) { | ||
|  |   return { | ||
|  |     textarea: css({ | ||
|  |       whiteSpace: 'pre-wrap', | ||
|  |       minHeight: theme.spacing(4), | ||
|  |       height: 'auto', | ||
|  |       overflow: 'auto', | ||
|  |       padding: `${theme.spacing(0.75)} ${theme.spacing(1)}`, | ||
|  |       width: 'inherit', | ||
|  | 
 | ||
|  |       [theme.breakpoints.down('sm')]: { | ||
|  |         width: '100%', | ||
|  |       }, | ||
|  |     }), | ||
|  |   }; | ||
|  | } |