From a0e296a230cd814a6f987c7c5487dfa0a511119f Mon Sep 17 00:00:00 2001 From: Everett Ross Date: Tue, 2 Apr 2019 17:21:09 -0400 Subject: [PATCH 01/13] WIP - add uiFind icons, scroll to first match Signed-off-by: Everett Ross --- .../components/TracePage/ScrollManager.tsx | 15 ++++- .../TracePageHeader/TracePageHeader.tsx | 3 + .../TracePageHeader/TracePageSearchBar.tsx | 10 ++- .../TraceTimelineViewer/SpanDetail/index.tsx | 12 ++-- .../VirtualizedTraceView.tsx | 5 ++ .../TracePage/TraceTimelineViewer/duck.tsx | 66 ++++++++++++------- .../TracePage/TraceTimelineViewer/index.tsx | 1 + .../src/components/TracePage/index.tsx | 19 ++++-- 8 files changed, 90 insertions(+), 41 deletions(-) diff --git a/packages/jaeger-ui/src/components/TracePage/ScrollManager.tsx b/packages/jaeger-ui/src/components/TracePage/ScrollManager.tsx index 96c4afee03..d8b28fea4f 100644 --- a/packages/jaeger-ui/src/components/TracePage/ScrollManager.tsx +++ b/packages/jaeger-ui/src/components/TracePage/ScrollManager.tsx @@ -12,6 +12,10 @@ // See the License for the specific language governing permissions and // limitations under the License. +import _get from 'lodash/get'; +import _findIndex from 'lodash/findIndex'; +import _isUndefined from 'lodash/isUndefined'; + import { TNil } from '../../types'; import { Span, SpanReference, Trace } from '../../types/trace'; @@ -120,7 +124,7 @@ export default class ScrollManager { this._scroller.scrollTo(y); } - _scrollToVisibleSpan(direction: 1 | -1) { + _scrollToVisibleSpan(direction: 1 | -1, startRow?: number) { const xrs = this._accessors; /* istanbul ignore next */ if (!xrs) { @@ -131,7 +135,8 @@ export default class ScrollManager { } const { duration, spans, startTime: traceStartTime } = this._trace; const isUp = direction < 0; - const boundaryRow = isUp ? xrs.getTopRowIndexVisible() : xrs.getBottomRowIndexVisible(); + const boundaryRow = _isUndefined(startRow) ? (isUp ? xrs.getTopRowIndexVisible() : xrs.getBottomRowIndexVisible()): startRow; + console.log(boundaryRow); const spanIndex = xrs.mapRowIndexToSpanIndex(boundaryRow); if ((spanIndex === 0 && isUp) || (spanIndex === spans.length - 1 && !isUp)) { return; @@ -184,7 +189,7 @@ export default class ScrollManager { // If there are hidden children, scroll to the last visible span if (childrenAreHidden) { - let isFallbackHidden: boolean | TNil; + let isFallbackHidden: boolean; do { const { isHidden, parentIDs } = isSpanHidden(spans[nextSpanIndex], childrenAreHidden, spansMap); if (isHidden) { @@ -255,6 +260,10 @@ export default class ScrollManager { this._scrollToVisibleSpan(-1); }; + scrollToFirstVisibleSpan = () => { + this._scrollToVisibleSpan(1, 0); + }; + destroy() { this._trace = undefined; this._scroller = undefined as any; diff --git a/packages/jaeger-ui/src/components/TracePage/TracePageHeader/TracePageHeader.tsx b/packages/jaeger-ui/src/components/TracePage/TracePageHeader/TracePageHeader.tsx index 3ed9cb6386..843c50db1f 100644 --- a/packages/jaeger-ui/src/components/TracePage/TracePageHeader/TracePageHeader.tsx +++ b/packages/jaeger-ui/src/components/TracePage/TracePageHeader/TracePageHeader.tsx @@ -40,6 +40,7 @@ import './TracePageHeader.css'; type TracePageHeaderEmbedProps = { canCollapse: boolean; clearSearch: () => void; + focusUiFind: () => void; hideMap: boolean; hideSummary: boolean; linkToStandalone: string; @@ -95,6 +96,7 @@ export function TracePageHeaderFn(props: TracePageHeaderEmbedProps & { forwarded const { canCollapse, clearSearch, + focusUiFind, forwardedRef, hideMap, hideSummary, @@ -164,6 +166,7 @@ export function TracePageHeaderFn(props: TracePageHeaderEmbedProps & { forwarded {showShortcutsHelp && } void; nextResult: () => void; clearSearch: () => void; + focusUiFind: () => void; resultCount: number; navigable: boolean; }; export function TracePageSearchBarFn(props: TracePageSearchBarProps & { forwardedRef: React.Ref }) { - const { clearSearch, forwardedRef, navigable, nextResult, prevResult, resultCount, textFilter } = props; + const { clearSearch, focusUiFind, forwardedRef, navigable, nextResult, prevResult, resultCount, textFilter } = props; const count = textFilter ? {resultCount} : null; @@ -70,6 +71,13 @@ export function TracePageSearchBarFn(props: TracePageSearchBarProps & { forwarde icon="down" onClick={nextResult} /> + + {' '} + {spanID} + + + From 5a146ef5e8631addc97092245e0a8fd1ffe1a574 Mon Sep 17 00:00:00 2001 From: Everett Ross Date: Tue, 23 Apr 2019 18:18:47 -0400 Subject: [PATCH 08/13] Move scroll indicator from set/map to standalone Signed-off-by: Everett Ross --- .../components/TracePage/ScrollManager.tsx | 11 +++- .../TracePageHeader/TracePageSearchBar.css | 12 +++-- .../TracePageHeader/TracePageSearchBar.tsx | 2 +- .../VirtualizedTraceView.test.js | 50 ++++++++++++------- .../VirtualizedTraceView.tsx | 37 ++++++++++---- .../TraceTimelineViewer/duck.test.js | 49 ++++++++++++------ .../TracePage/TraceTimelineViewer/duck.tsx | 22 ++++++-- .../jaeger-ui/src/types/TTraceTimeline.tsx | 5 +- 8 files changed, 132 insertions(+), 56 deletions(-) diff --git a/packages/jaeger-ui/src/components/TracePage/ScrollManager.tsx b/packages/jaeger-ui/src/components/TracePage/ScrollManager.tsx index b975555f3b..807a0f25a5 100644 --- a/packages/jaeger-ui/src/components/TracePage/ScrollManager.tsx +++ b/packages/jaeger-ui/src/components/TracePage/ScrollManager.tsx @@ -131,8 +131,15 @@ export default class ScrollManager { } const { duration, spans, startTime: traceStartTime } = this._trace; const isUp = direction < 0; - const boundaryRow = isUp ? xrs.getTopRowIndexVisible() : xrs.getBottomRowIndexVisible(); - const spanIndex = xrs.mapRowIndexToSpanIndex(startRow != null ? startRow : boundaryRow); + let boundaryRow: number; + if (startRow != null) { + boundaryRow = startRow; + } else if (isUp) { + boundaryRow = xrs.getTopRowIndexVisible(); + } else { + boundaryRow = xrs.getBottomRowIndexVisible(); + } + const spanIndex = xrs.mapRowIndexToSpanIndex(boundaryRow); if ((spanIndex === 0 && isUp) || (spanIndex === spans.length - 1 && !isUp)) { return; } diff --git a/packages/jaeger-ui/src/components/TracePage/TracePageHeader/TracePageSearchBar.css b/packages/jaeger-ui/src/components/TracePage/TracePageHeader/TracePageSearchBar.css index 044b01193a..703e81f7a2 100644 --- a/packages/jaeger-ui/src/components/TracePage/TracePageHeader/TracePageSearchBar.css +++ b/packages/jaeger-ui/src/components/TracePage/TracePageHeader/TracePageSearchBar.css @@ -23,12 +23,12 @@ limitations under the License. } .TracePageSearchBar--bar { - max-width: 100%; - transition: max-width 1.5s; + max-width: 20rem; + transition: max-width 0.5s; } -.TracePageSearchBar--bar:not(:focus-within) { - max-width: 20rem; +.TracePageSearchBar--bar:focus-within { + max-width: 100%; } .TracePageSearchBar--count { @@ -43,3 +43,7 @@ limitations under the License. .TracePageSearchBar--btn.is-disabled { opacity: 0.5; } + +.TracePageSearchBar--btn.locate-btn { + padding: 1px 8px 4px; +} diff --git a/packages/jaeger-ui/src/components/TracePage/TracePageHeader/TracePageSearchBar.tsx b/packages/jaeger-ui/src/components/TracePage/TracePageHeader/TracePageSearchBar.tsx index b5a7aee93f..bf88749497 100644 --- a/packages/jaeger-ui/src/components/TracePage/TracePageHeader/TracePageSearchBar.tsx +++ b/packages/jaeger-ui/src/components/TracePage/TracePageHeader/TracePageSearchBar.tsx @@ -68,7 +68,7 @@ export function TracePageSearchBarFn(props: TracePageSearchBarProps & { forwarde {navigable && ( <> - + diff --git a/packages/jaeger-ui/src/components/TracePage/TraceTimelineViewer/SpanDetailRow.tsx b/packages/jaeger-ui/src/components/TracePage/TraceTimelineViewer/SpanDetailRow.tsx index 04ff414df9..875d40a783 100644 --- a/packages/jaeger-ui/src/components/TracePage/TraceTimelineViewer/SpanDetailRow.tsx +++ b/packages/jaeger-ui/src/components/TracePage/TraceTimelineViewer/SpanDetailRow.tsx @@ -25,7 +25,6 @@ import { Log, Span, KeyValuePair, Link } from '../../../types/trace'; import './SpanDetailRow.css'; type SpanDetailRowProps = { - addToUiFind: (spanID: string) => void; color: string; columnDivision: number; detailState: DetailState; @@ -51,7 +50,6 @@ export default class SpanDetailRow extends React.PureComponent
{ - const { uiFind, history, location } = this.props; - if (!uiFind || !uiFind.includes(addition)) { - updateUiFind({ - history, - location, - uiFind: cx(uiFind, addition), - }); - } - }; - getAccessors() { const lv = this.listView; if (!lv) { @@ -401,7 +389,6 @@ export class VirtualizedTraceViewImpl extends React.PureComponent ', () => { expect(wrapper).toMatchSnapshot(); }); - it('updates state when icon is clicked', () => { + it('updates state when clicked', () => { expect(wrapper.state().hasCopied).toBe(false); - wrapper.find(Icon).simulate('click'); + wrapper.find(Button).simulate('click'); expect(wrapper.state().hasCopied).toBe(true); }); diff --git a/packages/jaeger-ui/src/components/common/CopyIcon.tsx b/packages/jaeger-ui/src/components/common/CopyIcon.tsx index 7c6d1dd932..f21d86f7e0 100644 --- a/packages/jaeger-ui/src/components/common/CopyIcon.tsx +++ b/packages/jaeger-ui/src/components/common/CopyIcon.tsx @@ -14,12 +14,16 @@ import * as React from 'react'; -import { Icon, Tooltip } from 'antd'; +import { Tooltip, Button } from 'antd'; +import { TooltipPlacement } from 'antd/lib/tooltip/index'; + import CopyToClipboard from 'react-copy-to-clipboard'; type PropsType = { className?: string; copyText: string; + icon?: string; + placement?: TooltipPlacement; tooltipTitle: string; }; @@ -30,6 +34,8 @@ type StateType = { export default class CopyIcon extends React.PureComponent { static defaultProps: Partial = { className: undefined, + icon: 'copy', + placement: 'left', }; state = { @@ -56,11 +62,16 @@ export default class CopyIcon extends React.PureComponent arrowPointAtCenter mouseLeaveDelay={0.5} onVisibleChange={this.handleTooltipVisibilityChange} - placement="left" + placement={this.props.placement} title={this.state.hasCopied ? 'Copied' : this.props.tooltipTitle} > - +