diff --git a/frontend/src/components/Styled/index.ts b/frontend/src/components/Styled/index.ts new file mode 100644 index 0000000000..bff30f653e --- /dev/null +++ b/frontend/src/components/Styled/index.ts @@ -0,0 +1,74 @@ +import * as AntD from 'antd'; +import { TextProps } from 'antd/lib/typography/Text'; +import { TitleProps } from 'antd/lib/typography/Title'; +import React from 'react'; +import styled, { + FlattenSimpleInterpolation, +} from 'styled-components'; + +import { IStyledClass } from './types'; + +const styledClass = (props: IStyledClass): FlattenSimpleInterpolation => + props.styledclass; + +type TStyledCol = AntD.ColProps & IStyledClass; +const StyledCol = styled(AntD.Col)` + ${styledClass} +`; + +type TStyledRow = AntD.RowProps & IStyledClass; +const StyledRow = styled(AntD.Row)` + ${styledClass} +`; + +type TStyledDivider = AntD.DividerProps & IStyledClass; +const StyledDivider = styled(AntD.Divider)` + ${styledClass} +`; + +type TStyledSpace = AntD.SpaceProps & IStyledClass; +const StyledSpace = styled(AntD.Space)` + ${styledClass} +`; + +type TStyledTabs = AntD.TabsProps & IStyledClass; +const StyledTabs = styled(AntD.Divider)` + ${styledClass} +`; + +type TStyledButton = AntD.ButtonProps & IStyledClass; +const StyledButton = styled(AntD.Button)` + ${styledClass} +`; + +const { Text } = AntD.Typography; +type TStyledTypographyText = TextProps & IStyledClass; +const StyledTypographyText = styled(Text)` + ${styledClass} +`; + +const { Title } = AntD.Typography; +type TStyledTypographyTitle = TitleProps & IStyledClass; +const StyledTypographyTitle = styled(Title)` + ${styledClass} +`; + +type TStyledDiv = React.HTMLAttributes & IStyledClass; +const StyledDiv = styled.div` + ${styledClass} +`; + +const StyledTypography = { + Text: StyledTypographyText, + Title: StyledTypographyTitle, +}; +export { + StyledButton, + StyledCol, + StyledDiv, + StyledDivider, + StyledRow, + StyledSpace, + StyledTabs, + StyledTypography, +}; diff --git a/frontend/src/components/Styled/styles.ts b/frontend/src/components/Styled/styles.ts new file mode 100644 index 0000000000..8425beae07 --- /dev/null +++ b/frontend/src/components/Styled/styles.ts @@ -0,0 +1,41 @@ +import { css, FlattenSimpleInterpolation } from 'styled-components'; + +const cssProprty = (key: string, value): FlattenSimpleInterpolation => + key && + value && + css` + ${key}: ${value}; + `; + +interface IFlexProps { + flexDirection?: string; // Need to replace this with exact css props. Not able to find any :( + flex?: number | string; +} +export const Flex = ({ + flexDirection, + flex, +}: IFlexProps): FlattenSimpleInterpolation => css` + ${cssProprty('flex-direction', flexDirection)} + ${cssProprty('flex', flex)} +`; + +interface IDisplayProps { + display?: string; +} +export const Display = ({ + display, +}: IDisplayProps): FlattenSimpleInterpolation => css` + ${cssProprty('display', display)} +`; + +interface ISpacingProps { + margin?: string; + padding?: string; +} +export const Spacing = ({ + margin, + padding, +}: ISpacingProps): FlattenSimpleInterpolation => css` + ${cssProprty('margin', margin)} + ${cssProprty('padding', padding)} +`; diff --git a/frontend/src/components/Styled/types.ts b/frontend/src/components/Styled/types.ts new file mode 100644 index 0000000000..fb829fb394 --- /dev/null +++ b/frontend/src/components/Styled/types.ts @@ -0,0 +1,5 @@ +import { FlattenSimpleInterpolation } from 'styled-components'; + +export interface IStyledClass { + styledclass?: FlattenSimpleInterpolation[]; +} diff --git a/frontend/src/container/GantChart/Trace/index.tsx b/frontend/src/container/GantChart/Trace/index.tsx index 4b409a60f7..1feecac85b 100644 --- a/frontend/src/container/GantChart/Trace/index.tsx +++ b/frontend/src/container/GantChart/Trace/index.tsx @@ -1,9 +1,7 @@ import { CaretDownFilled, CaretRightFilled } from '@ant-design/icons'; -import { Col, Row } from 'antd'; -import { - IIntervalUnit, - resolveTimeFromInterval, -} from 'container/TraceDetail/utils'; +import { Col } from 'antd'; +import { StyledCol, StyledRow } from 'components/Styled'; +import { IIntervalUnit } from 'container/TraceDetail/utils'; import useThemeMode from 'hooks/useThemeMode'; import { SPAN_DETAILS_LEFT_COL_WIDTH } from 'pages/TraceDetail/constants'; import React, { useEffect, useRef, useState } from 'react'; @@ -18,6 +16,7 @@ import { CardContainer, CaretContainer, HoverCard, + styles, Wrapper, } from './styles'; @@ -106,7 +105,7 @@ const Trace = (props: TraceProps): JSX.Element => { const inMsCount = value; const nodeLeftOffset = ((startTime - globalStart) * 1e2) / globalSpread; const width = (value * 1e2) / (globalSpread * 1e6); - const panelWidth = SPAN_DETAILS_LEFT_COL_WIDTH - level * (16 + 1) - 16; + const panelWidth = SPAN_DETAILS_LEFT_COL_WIDTH - level * (16 + 1) - 48; return ( <> @@ -124,8 +123,8 @@ const Trace = (props: TraceProps): JSX.Element => { /> - - + + {totalSpans !== 1 && ( @@ -139,8 +138,8 @@ const Trace = (props: TraceProps): JSX.Element => { - - + + ` height: 3rem; opacity: 0.5; `; + +const flexNoWrap = css` + flex-wrap: nowrap; +`; + +const overFlowHidden = css` + overflow: hidden; +`; + +export const styles = { + flexNoWrap, + overFlowHidden, +}; diff --git a/frontend/src/container/GantChart/index.tsx b/frontend/src/container/GantChart/index.tsx index 7c22d29a3b..575f22d7a5 100644 --- a/frontend/src/container/GantChart/index.tsx +++ b/frontend/src/container/GantChart/index.tsx @@ -41,7 +41,6 @@ const GanttChart = (props: GanttChartProps): JSX.Element => { {isExpandAll ? : } diff --git a/frontend/src/container/GantChart/styles.ts b/frontend/src/container/GantChart/styles.ts index cefa618526..4d523c4998 100644 --- a/frontend/src/container/GantChart/styles.ts +++ b/frontend/src/container/GantChart/styles.ts @@ -44,4 +44,5 @@ export const CollapseButton = styled.div` position: absolute; top: 0; left: 0; + font-size: 1.2rem; `; diff --git a/frontend/src/container/Timeline/index.tsx b/frontend/src/container/Timeline/index.tsx index 562d691a42..deed52a9cf 100644 --- a/frontend/src/container/Timeline/index.tsx +++ b/frontend/src/container/Timeline/index.tsx @@ -1,9 +1,10 @@ -import { INTERVAL_UNITS } from 'container/TraceDetail/utils'; +import { StyledDiv } from 'components/Styled'; +import { IIntervalUnit, INTERVAL_UNITS } from 'container/TraceDetail/utils'; import useThemeMode from 'hooks/useThemeMode'; import React, { useEffect, useState } from 'react'; import { useMeasure } from 'react-use'; -import styles from './style.module.css'; +import { styles, Svg, TimelineInterval } from './styles'; import { Interval } from './types'; import { getIntervals, getIntervalSpread } from './utils'; @@ -14,7 +15,7 @@ const Timeline = ({ traceMetaData, globalTraceMetadata, setIntervalUnit, -}: TimelineProps) => { +}: TimelineProps): JSX.Element => { const [ref, { width }] = useMeasure(); const { isDarkMode } = useThemeMode(); @@ -51,12 +52,10 @@ const Timeline = ({ }, []); return ( -
- + {intervals && intervals.map((interval, index) => ( - {interval.label} @@ -85,18 +82,18 @@ const Timeline = ({ stroke={isDarkMode ? 'white' : 'black'} strokeWidth="1" /> - + ))} - -
+ + ); }; interface TimelineProps { traceMetaData: object; - globalTraceMetadata: object; - intervalUnit: object; - setIntervalUnit: Function; + globalTraceMetadata: Record; + intervalUnit: IIntervalUnit; + setIntervalUnit: VoidFunction; } export default Timeline; diff --git a/frontend/src/container/Timeline/style.module.css b/frontend/src/container/Timeline/style.module.css deleted file mode 100644 index 2ddc6e497f..0000000000 --- a/frontend/src/container/Timeline/style.module.css +++ /dev/null @@ -1,8 +0,0 @@ -.svg-container { - overflow: visible; - position: absolute; -} -.timeline-tick { - text-anchor: middle; - font-size: 0.6rem; -} diff --git a/frontend/src/container/Timeline/styles.ts b/frontend/src/container/Timeline/styles.ts new file mode 100644 index 0000000000..f3f1345014 --- /dev/null +++ b/frontend/src/container/Timeline/styles.ts @@ -0,0 +1,19 @@ +import styled, { css } from 'styled-components'; + +const timelineContainer = css` + flex: 1; + overflow: visible; +`; + +export const styles = { + timelineContainer, +}; +export const Svg = styled.svg` + overflow: visible !important; + position: absolute; +`; + +export const TimelineInterval = styled.g` + text-anchor: middle; + font-size: 0.6rem; +`; diff --git a/frontend/src/container/TraceDetail/SelectedSpanDetails/ErrorTag.tsx b/frontend/src/container/TraceDetail/SelectedSpanDetails/ErrorTag.tsx index 8de84e5bdc..17127f390b 100644 --- a/frontend/src/container/TraceDetail/SelectedSpanDetails/ErrorTag.tsx +++ b/frontend/src/container/TraceDetail/SelectedSpanDetails/ErrorTag.tsx @@ -1,16 +1,17 @@ -import { Button, Collapse, Modal } from 'antd'; +import { Collapse, Modal } from 'antd'; +import { StyledButton } from 'components/Styled'; import useThemeMode from 'hooks/useThemeMode'; import React, { useState } from 'react'; import { ITraceTree } from 'types/api/trace/getTraceItem'; -import { CustomSubText, CustomSubTitle } from './styles'; +import { CustomSubText, CustomSubTitle, styles } from './styles'; +// import Editor from 'components/Editor'; const { Panel } = Collapse; const ErrorTag = ({ event }: ErrorTagProps): JSX.Element => { const [isOpen, setIsOpen] = useState(false); const { isDarkMode } = useThemeMode(); - // const useTextRef = useRef(''); const [text, setText] = useState({ text: '', @@ -28,6 +29,7 @@ const ErrorTag = ({ event }: ErrorTagProps): JSX.Element => { return ( { {value}
{isEllipsed && ( - + )} diff --git a/frontend/src/container/TraceDetail/SelectedSpanDetails/index.tsx b/frontend/src/container/TraceDetail/SelectedSpanDetails/index.tsx index 21ccde3de9..13df0efef8 100644 --- a/frontend/src/container/TraceDetail/SelectedSpanDetails/index.tsx +++ b/frontend/src/container/TraceDetail/SelectedSpanDetails/index.tsx @@ -1,4 +1,5 @@ import { Space, Tabs, Typography } from 'antd'; +import { StyledSpace, StyledTabs } from 'components/Styled'; import useThemeMode from 'hooks/useThemeMode'; import React from 'react'; import { ITraceTree } from 'types/api/trace/getTraceItem'; @@ -10,6 +11,7 @@ import { CustomSubTitle, CustomText, CustomTitle, + styles, } from './styles'; const { TabPane } = Tabs; @@ -25,7 +27,11 @@ const SelectedSpanDetails = (props: SelectedSpanDetailsProps): JSX.Element => { return ( - + Details for selected Span Service @@ -35,13 +41,16 @@ const SelectedSpanDetails = (props: SelectedSpanDetailsProps): JSX.Element => { Operation {name} - - + + {tags.length !== 0 ? ( tags.map((tags) => { return ( - + {tags.value && ( <> {tags.key} @@ -64,7 +73,7 @@ const SelectedSpanDetails = (props: SelectedSpanDetailsProps): JSX.Element => { No events data in selected span )} - + ); }; diff --git a/frontend/src/container/TraceDetail/SelectedSpanDetails/styles.ts b/frontend/src/container/TraceDetail/SelectedSpanDetails/styles.ts index f467a87b35..b93e1f5647 100644 --- a/frontend/src/container/TraceDetail/SelectedSpanDetails/styles.ts +++ b/frontend/src/container/TraceDetail/SelectedSpanDetails/styles.ts @@ -1,5 +1,5 @@ import { Typography } from 'antd'; -import styled from 'styled-components'; +import styled, { css } from 'styled-components'; const { Text, Title, Paragraph } = Typography; export const CustomTitle = styled(Title)` @@ -44,3 +44,24 @@ export const CardContainer = styled.div` flex: 1; overflow-y: auto; `; + +const removeMargin = css` + margin: 0; +`; +const removePadding = css` + padding: 0; +`; + +const selectedSpanDetailsContainer = css` + margin-left: 0.5rem; +`; + +const spanEventsTabsContainer = css` + margin-top: 1rem; +`; +export const styles = { + removeMargin, + removePadding, + selectedSpanDetailsContainer, + spanEventsTabsContainer, +}; diff --git a/frontend/src/container/TraceDetail/TraceGraph.module.css b/frontend/src/container/TraceDetail/TraceGraph.module.css deleted file mode 100644 index 9127050c97..0000000000 --- a/frontend/src/container/TraceDetail/TraceGraph.module.css +++ /dev/null @@ -1,3 +0,0 @@ -.trace-detail-content-spacing { - margin-right: 1rem; -} diff --git a/frontend/src/container/TraceDetail/index.tsx b/frontend/src/container/TraceDetail/index.tsx index 7c9d5ab8de..e89d78530a 100644 --- a/frontend/src/container/TraceDetail/index.tsx +++ b/frontend/src/container/TraceDetail/index.tsx @@ -1,5 +1,14 @@ import { FilterOutlined } from '@ant-design/icons'; -import { Button, Col, Divider, Row, Space, Typography } from 'antd'; +import { Button, Col } from 'antd'; +import { + StyledCol, + StyledDiv, + StyledDivider, + StyledRow, + StyledSpace, + StyledTypography, +} from 'components/Styled'; +import * as StyledStyles from 'components/Styled/styles'; import GanttChart from 'container/GantChart'; import { getNodeById } from 'container/GantChart/utils'; import Timeline from 'container/Timeline'; @@ -15,9 +24,8 @@ import { getSpanTreeMetadata } from 'utils/getSpanTreeMetadata'; import { spanToTreeUtil } from 'utils/spanToTree'; import SelectedSpanDetails from './SelectedSpanDetails'; -import styles from './TraceGraph.module.css'; -import { getSortedData } from './utils'; -import { INTERVAL_UNITS } from './utils'; +import * as styles from './styles'; +import { getSortedData, IIntervalUnit, INTERVAL_UNITS } from './utils'; const TraceDetail = ({ response }: TraceDetailProps): JSX.Element => { const spanServiceColors = useMemo( @@ -28,7 +36,9 @@ const TraceDetail = ({ response }: TraceDetailProps): JSX.Element => { const urlQuery = useUrlQuery(); const [spanId] = useState(urlQuery.get('spanId')); - const [intervalUnit, setIntervalUnit] = useState(INTERVAL_UNITS[0]); + const [intervalUnit, setIntervalUnit] = useState( + INTERVAL_UNITS[0], + ); // const [searchSpanString, setSearchSpanString] = useState(''); const [activeHoverId, setActiveHoverId] = useState(''); const [activeSelectedId, setActiveSelectedId] = useState(spanId || ''); @@ -74,20 +84,20 @@ const TraceDetail = ({ response }: TraceDetailProps): JSX.Element => { }; return ( - - - - + + + - + Trace Details - - + + {traceMetaData.totalSpans} Span - - + + { intervalUnit={intervalUnit} /> - - - + + { }} > {dayjs(traceMetaData.globalStart / 1e6).format('hh:mm:ssa MM/DD')} - - + + - - - - + + + {/* { /> */} - + - + - -
+ + { spanId={spanId || ''} intervalUnit={intervalUnit} /> -
- + + - + - + - -
+ + ); }; diff --git a/frontend/src/container/TraceDetail/styles.ts b/frontend/src/container/TraceDetail/styles.ts new file mode 100644 index 0000000000..38c420042c --- /dev/null +++ b/frontend/src/container/TraceDetail/styles.ts @@ -0,0 +1,79 @@ +import { css } from 'styled-components'; + +/** + * Styles for the left container. Containers flamegraph, timeline and gantt chart + */ +export const leftContainer = [ + css` + display: flex; + flex-direction: column; + `, +]; + +/** + * Styles for the top container. Contains TotalSpans, FlameGraph and Timeline. + */ +export const flameAndTimelineContainer = [ + css` + margin: 0 1rem 0 0; + `, +]; + +export const traceMetaDataContainer = [ + css` + display: flex; + flex-direction: column; + align-items: center; + `, +]; + +export const traceDateAndTimelineContainer = css` + margin-top: 2rem; +`; + +export const traceDateTimeContainer = css` + display: flex; + aligh-items: center; + justify-content: center; +`; +export const timelineContainer = css` + overflow: visible; + margin: 0 1rem 0 0; +`; +export const ganttChartContainer = css` + margin: 1.5rem 1rem 0.5rem; + display: flex; + flex-direction: column; + position: relative; + flex: 1; + overflow-y: auto; + overflow-x: hidden; +`; + +export const selectedSpanDetailContainer = css` + height: 100%; + position: relative; + display: flex; + flex-direction: column; +`; + + +/** + * Generic / Common styles + */ + +export const verticalSeparator = css` + height: 100%; + margin: 0; +`; + +export const traceDetailContentSpacing = css` + margin: 0 1rem 0 0; +`; + +export const floatRight = css` + float: right; +`; +export const removeMargin = css` + margin: 0; +`; diff --git a/frontend/src/container/TraceFlameGraph/index.tsx b/frontend/src/container/TraceFlameGraph/index.tsx index eec06e000e..344098624f 100644 --- a/frontend/src/container/TraceFlameGraph/index.tsx +++ b/frontend/src/container/TraceFlameGraph/index.tsx @@ -1,5 +1,4 @@ import Color from 'color'; -import { ITraceMetaData } from 'container/GantChart'; import { IIntervalUnit, resolveTimeFromInterval, diff --git a/frontend/src/store/actions/index.ts b/frontend/src/store/actions/index.ts index 6ee8a31184..403f685057 100644 --- a/frontend/src/store/actions/index.ts +++ b/frontend/src/store/actions/index.ts @@ -4,5 +4,6 @@ export * from './global'; export * from './metrics'; export * from './MetricsActions'; export * from './serviceMap'; +export * from './traces'; export * from './types'; export * from './usage';