mirror of https://github.com/grafana/grafana.git
				
				
				
			
		
			
				
	
	
		
			124 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
			
		
		
	
	
			124 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
| import { css, cx } from '@emotion/css';
 | |
| import React, { MouseEventHandler } from 'react';
 | |
| import { DraggableProvidedDragHandleProps } from 'react-beautiful-dnd';
 | |
| 
 | |
| import { GrafanaTheme2 } from '@grafana/data';
 | |
| import { Icon, useStyles2 } from '@grafana/ui';
 | |
| 
 | |
| interface QueryOperationRowHeaderProps {
 | |
|   actionsElement?: React.ReactNode;
 | |
|   disabled?: boolean;
 | |
|   draggable: boolean;
 | |
|   dragHandleProps?: DraggableProvidedDragHandleProps;
 | |
|   headerElement?: React.ReactNode;
 | |
|   isContentVisible: boolean;
 | |
|   onRowToggle: () => void;
 | |
|   reportDragMousePosition: MouseEventHandler<HTMLDivElement>;
 | |
|   titleElement?: React.ReactNode;
 | |
| }
 | |
| 
 | |
| export const QueryOperationRowHeader: React.FC<QueryOperationRowHeaderProps> = ({
 | |
|   actionsElement,
 | |
|   disabled,
 | |
|   draggable,
 | |
|   dragHandleProps,
 | |
|   headerElement,
 | |
|   isContentVisible,
 | |
|   onRowToggle,
 | |
|   reportDragMousePosition,
 | |
|   titleElement,
 | |
| }: QueryOperationRowHeaderProps) => {
 | |
|   const styles = useStyles2(getStyles);
 | |
| 
 | |
|   return (
 | |
|     <div className={styles.header}>
 | |
|       <div className={styles.column}>
 | |
|         <Icon
 | |
|           name={isContentVisible ? 'angle-down' : 'angle-right'}
 | |
|           className={styles.collapseIcon}
 | |
|           onClick={onRowToggle}
 | |
|         />
 | |
|         {titleElement && (
 | |
|           <div className={styles.titleWrapper} onClick={onRowToggle} aria-label="Query operation row title">
 | |
|             <div className={cx(styles.title, disabled && styles.disabled)}>{titleElement}</div>
 | |
|           </div>
 | |
|         )}
 | |
|         {headerElement}
 | |
|       </div>
 | |
| 
 | |
|       <div className={styles.column}>
 | |
|         {actionsElement}
 | |
|         {draggable && (
 | |
|           <Icon
 | |
|             title="Drag and drop to reorder"
 | |
|             name="draggabledots"
 | |
|             size="lg"
 | |
|             className={styles.dragIcon}
 | |
|             onMouseMove={reportDragMousePosition}
 | |
|             {...dragHandleProps}
 | |
|           />
 | |
|         )}
 | |
|       </div>
 | |
|     </div>
 | |
|   );
 | |
| };
 | |
| 
 | |
| const getStyles = (theme: GrafanaTheme2) => ({
 | |
|   header: css`
 | |
|     label: Header;
 | |
|     padding: ${theme.spacing(0.5, 0.5)};
 | |
|     border-radius: ${theme.shape.borderRadius(1)};
 | |
|     background: ${theme.colors.background.secondary};
 | |
|     min-height: ${theme.spacing(4)};
 | |
|     display: grid;
 | |
|     grid-template-columns: minmax(100px, max-content) min-content;
 | |
|     align-items: center;
 | |
|     justify-content: space-between;
 | |
|     white-space: nowrap;
 | |
| 
 | |
|     &:focus {
 | |
|       outline: none;
 | |
|     }
 | |
|   `,
 | |
|   column: css`
 | |
|     label: Column;
 | |
|     display: flex;
 | |
|     align-items: center;
 | |
|   `,
 | |
|   dragIcon: css`
 | |
|     cursor: grab;
 | |
|     color: ${theme.colors.text.disabled};
 | |
|     margin: ${theme.spacing(0, 0.5)};
 | |
|     &:hover {
 | |
|       color: ${theme.colors.text};
 | |
|     }
 | |
|   `,
 | |
|   collapseIcon: css`
 | |
|     color: ${theme.colors.text.disabled};
 | |
|     cursor: pointer;
 | |
|     &:hover {
 | |
|       color: ${theme.colors.text};
 | |
|     }
 | |
|   `,
 | |
|   titleWrapper: css`
 | |
|     display: flex;
 | |
|     align-items: center;
 | |
|     flex-grow: 1;
 | |
|     cursor: pointer;
 | |
|     overflow: hidden;
 | |
|     margin-right: ${theme.spacing(0.5)};
 | |
|   `,
 | |
|   title: css`
 | |
|     font-weight: ${theme.typography.fontWeightBold};
 | |
|     color: ${theme.colors.text.link};
 | |
|     margin-left: ${theme.spacing(0.5)};
 | |
|     overflow: hidden;
 | |
|     text-overflow: ellipsis;
 | |
|   `,
 | |
|   disabled: css`
 | |
|     color: ${theme.colors.text.disabled};
 | |
|   `,
 | |
| });
 | |
| 
 | |
| QueryOperationRowHeader.displayName = 'QueryOperationRowHeader';
 |