mirror of https://github.com/grafana/grafana.git
				
				
				
			
		
			
				
	
	
		
			91 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
			
		
		
	
	
			91 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
| import React, { ReactNode } from 'react';
 | |
| import { css } from 'emotion';
 | |
| import { TimeOption, TimeZone } from '@grafana/data';
 | |
| import { TimeRange } from '@grafana/data';
 | |
| import { TimePickerTitle } from './TimePickerTitle';
 | |
| import { TimeRangeOption } from './TimeRangeOption';
 | |
| import { mapOptionToTimeRange } from './mapper';
 | |
| import { stylesFactory } from '../../../themes';
 | |
| 
 | |
| const getStyles = stylesFactory(() => {
 | |
|   return {
 | |
|     title: css`
 | |
|       display: flex;
 | |
|       align-items: center;
 | |
|       justify-content: space-between;
 | |
|       padding: 8px 16px 5px 9px;
 | |
|     `,
 | |
|   };
 | |
| });
 | |
| 
 | |
| const getOptionsStyles = stylesFactory(() => {
 | |
|   return {
 | |
|     grow: css`
 | |
|       flex-grow: 1;
 | |
|       align-items: flex-start;
 | |
|     `,
 | |
|   };
 | |
| });
 | |
| 
 | |
| interface Props {
 | |
|   title?: string;
 | |
|   options: TimeOption[];
 | |
|   value?: TimeRange;
 | |
|   onSelect: (option: TimeRange) => void;
 | |
|   placeholderEmpty?: ReactNode;
 | |
|   timeZone?: TimeZone;
 | |
| }
 | |
| 
 | |
| export const TimeRangeList: React.FC<Props> = props => {
 | |
|   const styles = getStyles();
 | |
|   const { title, options, placeholderEmpty } = props;
 | |
| 
 | |
|   if (typeof placeholderEmpty !== 'undefined' && options.length <= 0) {
 | |
|     return <>{placeholderEmpty}</>;
 | |
|   }
 | |
| 
 | |
|   if (!title) {
 | |
|     return <Options {...props} />;
 | |
|   }
 | |
| 
 | |
|   return (
 | |
|     <>
 | |
|       <div className={styles.title}>
 | |
|         <TimePickerTitle>{title}</TimePickerTitle>
 | |
|       </div>
 | |
|       <Options {...props} />
 | |
|     </>
 | |
|   );
 | |
| };
 | |
| 
 | |
| const Options: React.FC<Props> = ({ options, value, onSelect, timeZone }) => {
 | |
|   const styles = getOptionsStyles();
 | |
| 
 | |
|   return (
 | |
|     <>
 | |
|       <div>
 | |
|         {options.map((option, index) => (
 | |
|           <TimeRangeOption
 | |
|             key={keyForOption(option, index)}
 | |
|             value={option}
 | |
|             selected={isEqual(option, value)}
 | |
|             onSelect={option => onSelect(mapOptionToTimeRange(option, timeZone))}
 | |
|           />
 | |
|         ))}
 | |
|       </div>
 | |
|       <div className={styles.grow}></div>
 | |
|     </>
 | |
|   );
 | |
| };
 | |
| 
 | |
| function keyForOption(option: TimeOption, index: number): string {
 | |
|   return `${option.from}-${option.to}-${index}`;
 | |
| }
 | |
| 
 | |
| function isEqual(x: TimeOption, y?: TimeRange): boolean {
 | |
|   if (!y || !x) {
 | |
|     return false;
 | |
|   }
 | |
|   return y.raw.from === x.from && y.raw.to === x.to;
 | |
| }
 |