import styles from './Text.module.scss'; import { openNotification } from '../../utils'; import { IconButton, Modal, Input, HorizontalGroup, Button, VerticalGroup } from '@grafana/ui'; import cn from 'classnames/bind'; import CopyToClipboard from 'react-copy-to-clipboard'; import React, { FC, HTMLAttributes, ChangeEvent, useState, useCallback } from 'react'; export type TextType = 'primary' | 'secondary' | 'disabled' | 'link' | 'success' | 'warning'; interface TextProps extends HTMLAttributes { type?: TextType; strong?: boolean; underline?: boolean; size?: 'small' | 'medium' | 'large'; keyboard?: boolean; className?: string; wrap?: boolean; copyable?: boolean; editable?: boolean; onTextChange?: (value?: string) => void; clearBeforeEdit?: boolean; hidden?: boolean; editModalTitle?: string; } interface TextInterface extends React.FC { Title: React.FC; } const PLACEHOLDER = '**********'; const cx = cn.bind(styles); const Text: TextInterface = (props) => { const { type, size = 'medium', strong = false, underline = false, children, onClick, keyboard = false, className, wrap = true, copyable = false, editable = false, onTextChange, clearBeforeEdit = false, hidden = false, editModalTitle = 'New value', style, } = props; const [isEditMode, setIsEditMode] = useState(false); const [value, setValue] = useState(); const handleEditClick = useCallback(() => { setValue(clearBeforeEdit || hidden ? '' : (children as string)); setIsEditMode(true); }, [clearBeforeEdit, hidden, children]); const handleCancelEdit = useCallback(() => { setIsEditMode(false); }, []); const handleConfirmEdit = useCallback(() => { setIsEditMode(false); //@ts-ignore onTextChange(value); }, [value, onTextChange]); const handleInputChange = useCallback((e: ChangeEvent) => { setValue(e.target.value); }, []); return ( {hidden ? PLACEHOLDER : children} {editable && ( )} {copyable && ( { openNotification('Text copied'); }} > )} {isEditMode && ( { if (node) { node.focus(); } }} value={value} onChange={handleInputChange} /> )} ); }; interface TitleProps extends TextProps { level: 1 | 2 | 3 | 4 | 5 | 6; } const Title: FC = (props) => { const { level, className, style, ...restProps } = props; // @ts-ignore const Tag: keyof JSX.IntrinsicElements = `h${level}`; return ( ); }; Text.Title = Title; export default Text;