import React, { useEffect, useState } from 'react'; import { Tooltip, Select, Utils, Divider, Button } from 'knowdesign'; import { IconFont } from '@knowdesign/icons'; import moment from 'moment'; import { DRangeTime } from 'knowdesign'; import IndicatorDrawer from './IndicatorDrawer'; import NodeScope from './NodeScope'; import './style/index.less'; import { MetricType } from 'src/api'; export interface Inode { name: string; desc: string; } export interface KsHeaderOptions { rangeTime: [number, number]; isRelativeRangeTime: boolean; isAutoReload: boolean; gridNum?: number; scopeData?: { isTop: boolean; data: number | number[]; }; } export interface IindicatorSelectModule { metricType?: MetricType; hide?: boolean; drawerTitle?: string; selectedRows: (string | number)[]; checkboxProps?: (record: any) => { [props: string]: any }; tableData?: Inode[]; submitCallback?: (value: (string | number)[]) => Promise; } export interface IfilterData { hostName?: string; logCollectTaskId?: string | number; pathId?: string | number; agent?: string; } export interface IcustomScope { label: string; value: string | number; } export interface InodeScopeModule { customScopeList: IcustomScope[]; scopeName?: string; scopeLabel?: string; searchPlaceholder?: string; change?: () => void; } interface PropsType { indicatorSelectModule?: IindicatorSelectModule; hideNodeScope?: boolean; hideGridSelect?: boolean; nodeScopeModule?: InodeScopeModule; onChange: (options: KsHeaderOptions) => void; } // 列布局选项 const GRID_SIZE_OPTIONS = [ { label: '3列', value: 8, }, { label: '2列', value: 12, }, { label: '1列', value: 24, }, ]; const SingleChartHeader = ({ indicatorSelectModule, nodeScopeModule = { customScopeList: [], }, hideNodeScope = false, hideGridSelect = false, onChange: onChangeCallback, }: PropsType): JSX.Element => { const [gridNum, setGridNum] = useState(GRID_SIZE_OPTIONS[1].value); const [rangeTime, setRangeTime] = useState<[number, number]>(() => { const curTimeStamp = moment().valueOf(); return [curTimeStamp - 60 * 60 * 1000, curTimeStamp]; }); const [isRelativeRangeTime, setIsRelativeRangeTime] = useState(true); const [isAutoReload, setIsAutoReload] = useState(false); const [indicatorDrawerVisible, setIndicatorDrawerVisible] = useState(false); const [scopeData, setScopeData] = useState<{ isTop: boolean; data: any; }>({ isTop: true, data: 5, }); useEffect(() => { onChangeCallback({ rangeTime, scopeData, gridNum, isRelativeRangeTime, isAutoReload, }); setIsAutoReload(false); }, [rangeTime, scopeData, gridNum, isRelativeRangeTime]); // 当时间范围为相对时间时,每隔 1 分钟刷新一次时间 useEffect(() => { let relativeTimer: number; if (isRelativeRangeTime) { relativeTimer = window.setInterval(() => { setIsAutoReload(true); reloadRangeTime(); }, 1 * 60 * 1000); } return () => { relativeTimer && window.clearInterval(relativeTimer); }; }, [isRelativeRangeTime, rangeTime]); const sizeChange = (value: number) => { setGridNum(value); }; const timeChange = (curRangeTime: [number, number], isRelative: boolean) => { setRangeTime([...curRangeTime]); setIsRelativeRangeTime(isRelative); }; const reloadRangeTime = () => { if (isRelativeRangeTime) { const timeLen = rangeTime[1] - rangeTime[0] || 0; const curTimeStamp = moment().valueOf(); setRangeTime([curTimeStamp - timeLen, curTimeStamp]); } else { setRangeTime([...rangeTime]); } }; const openIndicatorDrawer = () => { setIndicatorDrawerVisible(true); }; const closeIndicatorDrawer = () => { setIndicatorDrawerVisible(false); }; const nodeScopeChange = (data: any, isTop?: any) => { setScopeData({ isTop, data, }); }; return ( <>
{!hideNodeScope && } {!hideGridSelect && (