diff --git a/frontend/app/components/shared/DevTools/NetworkPanel/NetworkPanel.tsx b/frontend/app/components/shared/DevTools/NetworkPanel/NetworkPanel.tsx index 241d449ff..0e634e02c 100644 --- a/frontend/app/components/shared/DevTools/NetworkPanel/NetworkPanel.tsx +++ b/frontend/app/components/shared/DevTools/NetworkPanel/NetworkPanel.tsx @@ -15,6 +15,7 @@ import { Duration } from 'luxon'; import { connectPlayer, jump, pause } from 'Player'; import { useModal } from 'App/components/Modal'; import FetchDetailsModal from 'Shared/FetchDetailsModal'; +import { sort } from 'App/duck/sessions'; const ALL = 'ALL'; const XHR = 'xhr'; @@ -33,7 +34,7 @@ const TAB_TO_TYPE_MAP: any = { [OTHER]: TYPES.OTHER, }; const TABS: any = [ALL, XHR, JS, CSS, IMG, MEDIA, OTHER].map((tab) => ({ - text: tab, + text: tab === 'xhr' ? 'XHR (Fetch)' : tab, key: tab, })); @@ -46,7 +47,7 @@ function compare(a: any, b: any, key: string) { return 0; } -export function renderType(r) { +export function renderType(r: any) { return ( {r.type}}>
{r.type}
@@ -181,6 +182,7 @@ function NetworkPanel(props: Props) { const { showModal, hideModal } = useModal(); const [activeTab, setActiveTab] = useState(ALL); const [sortBy, setSortBy] = useState('time'); + const [sortAscending, setSortAscending] = useState(true); const [filter, setFilter] = useState(''); const [showOnlyErrors, setShowOnlyErrors] = useState(false); const onTabClick = (activeTab: any) => setActiveTab(activeTab); @@ -200,22 +202,29 @@ function NetworkPanel(props: Props) { ); const filterRE = getRE(filter, 'i'); - let filtered = resources; - fetchList.forEach( - (fetchCall: any) => - (filtered = filtered.filter((networkCall: any) => networkCall.url !== fetchCall.url)) - ); - filtered = filtered.concat(fetchList); - filtered = filtered.sort((a: any, b: any) => { - return compare(a, b, sortBy); - }); + let filtered = React.useMemo(() => { + let list = resources; + fetchList.forEach( + (fetchCall: any) => + (list = list.filter((networkCall: any) => networkCall.url !== fetchCall.url)) + ); + list = list.concat(fetchList); + list = list.sort((a: any, b: any) => { + return compare(a, b, sortBy); + }); - filtered = filtered.filter( - ({ type, name, status }: any) => - (!!filter ? filterRE.test(status) || filterRE.test(name) || filterRE.test(type) : true) && - (activeTab === ALL || type === TAB_TO_TYPE_MAP[activeTab]) && - (showOnlyErrors ? parseInt(status) >= 400 : true) - ); + if (!sortAscending) { + list = list.reverse(); + } + + list = list.filter( + ({ type, name, status }: any) => + (!!filter ? filterRE.test(status) || filterRE.test(name) || filterRE.test(type) : true) && + (activeTab === ALL || type === TAB_TO_TYPE_MAP[activeTab]) && + (showOnlyErrors ? parseInt(status) >= 400 : true) + ); + return list; + }, [filter, sortBy, sortAscending, showOnlyErrors, activeTab]); // const lastIndex = currentIndex || filtered.filter((item: any) => item.time <= time).length - 1; const referenceLines = []; @@ -240,10 +249,10 @@ function NetworkPanel(props: Props) { const handleSort = (sortKey: string) => { if (sortKey === sortBy) { - setSortBy('time'); - } else { - setSortBy(sortKey); + setSortAscending(!sortAscending); + // setSortBy('time'); } + setSortBy(sortKey); }; return ( @@ -330,6 +339,7 @@ function NetworkPanel(props: Props) { additionalHeight={additionalHeight} onJump={jump} sortBy={sortBy} + sortAscending={sortAscending} // activeIndex={lastIndex} > {[ diff --git a/frontend/app/components/shared/DevTools/TimeTable/TimeTable.tsx b/frontend/app/components/shared/DevTools/TimeTable/TimeTable.tsx index a0af1c906..921d3557d 100644 --- a/frontend/app/components/shared/DevTools/TimeTable/TimeTable.tsx +++ b/frontend/app/components/shared/DevTools/TimeTable/TimeTable.tsx @@ -71,7 +71,8 @@ type Props = { hoverable?: boolean; onRowClick?: (row: any, index: number) => void; onJump?: (time: any) => void; - sortBy?: string + sortBy?: string; + sortAscending?: boolean; }; type TimeLineInfo = { @@ -262,10 +263,10 @@ export default class TimeTable extends React.PureComponent { onColumnClick = (dataKey: string, onClick: any) => { if (typeof onClick === 'function') { // this.scroller.current.scrollToRow(0); - onClick(dataKey) + onClick(dataKey); this.scroller.current.forceUpdateGrid(); } - } + }; render() { const { @@ -277,6 +278,7 @@ export default class TimeTable extends React.PureComponent { additionalHeight = 0, activeIndex, sortBy = '', + sortAscending = true, } = this.props; const { timewidth, timestart } = this.state; @@ -324,14 +326,14 @@ export default class TimeTable extends React.PureComponent {
{columns.map(({ label, width, dataKey, onClick = null }) => (
this.onColumnClick(dataKey, onClick)} > {label} - {!!sortBy && sortBy === dataKey && ( - - )} + {!!sortBy && sortBy === dataKey && }
))}
diff --git a/frontend/app/components/ui/SVG.tsx b/frontend/app/components/ui/SVG.tsx index b12dd305b..2ce71aba7 100644 --- a/frontend/app/components/ui/SVG.tsx +++ b/frontend/app/components/ui/SVG.tsx @@ -97,7 +97,7 @@ const SVG = (props: Props) => { case 'caret-down-fill': return ; case 'caret-left-fill': return ; case 'caret-right-fill': return ; - case 'caret-up-fill': return ; + case 'caret-up-fill': return ; case 'chat-dots': return ; case 'chat-right-text': return ; case 'chat-square-quote': return ; diff --git a/frontend/app/svg/icons/caret-down-fill.svg b/frontend/app/svg/icons/caret-down-fill.svg index 12557a66e..e0fd6b7aa 100644 --- a/frontend/app/svg/icons/caret-down-fill.svg +++ b/frontend/app/svg/icons/caret-down-fill.svg @@ -1,3 +1,3 @@ - + \ No newline at end of file diff --git a/frontend/app/svg/icons/caret-up-fill.svg b/frontend/app/svg/icons/caret-up-fill.svg index b4c7e5485..3270a7ffa 100644 --- a/frontend/app/svg/icons/caret-up-fill.svg +++ b/frontend/app/svg/icons/caret-up-fill.svg @@ -1 +1,3 @@ - \ No newline at end of file + + + \ No newline at end of file