Skip to content

Commit d6753a2

Browse files
committed
Add filter options to the context menu
1 parent a85a2bb commit d6753a2

3 files changed

Lines changed: 47 additions & 7 deletions

File tree

src/components/view/view-context-menu-builder.ts

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import {
1717
snippetExportOptions
1818
} from '../../model/ui/export';
1919
import { ContextMenuItem } from '../../model/ui/context-menu';
20+
import { Filter, HostnameFilter } from '../../model/filters/search-filters';
2021

2122
export class ViewEventContextMenuBuilder {
2223

@@ -27,7 +28,8 @@ export class ViewEventContextMenuBuilder {
2728
private onPin: (event: CollectedEvent) => void,
2829
private onDelete: (event: CollectedEvent) => void,
2930
private onBuildRuleFromExchange: (exchange: HttpExchangeView) => void,
30-
private onPrepareToResendRequest?: (exchange: HttpExchangeView) => void
31+
private onPrepareToResendRequest: (exchange: HttpExchangeView) => void,
32+
private onAddFilter: (filter: Filter) => void
3133
) {}
3234

3335
private readonly BaseOptions = {
@@ -54,6 +56,26 @@ export class ViewEventContextMenuBuilder {
5456
if (event.isHttp()) {
5557
const menuOptions = [
5658
this.BaseOptions.Pin,
59+
{
60+
type: 'submenu',
61+
label: 'Filter traffic like this',
62+
items: [
63+
{
64+
type: 'option',
65+
label: 'Show only this hostname',
66+
callback: () => this.onAddFilter(
67+
new HostnameFilter(`hostname=${event.request.parsedUrl.hostname}`)
68+
)
69+
},
70+
{
71+
type: 'option',
72+
label: 'Hide this hostname',
73+
callback: () => this.onAddFilter(
74+
new HostnameFilter(`hostname!=${event.request.parsedUrl.hostname}`)
75+
)
76+
}
77+
]
78+
},
5779
{
5880
type: 'option',
5981
label: 'Copy Request URL',

src/components/view/view-page.tsx

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,9 @@ import {
1313
import { observer, disposeOnUnmount, inject } from 'mobx-react';
1414
import * as portals from 'react-reverse-portal';
1515

16-
import { WithInjected, CollectedEvent, HttpExchangeView, RawTunnel } from '../../types';
16+
import { WithInjected, CollectedEvent, HttpExchangeView } from '../../types';
1717
import { NARROW_LAYOUT_BREAKPOINT, styled } from '../../styles';
18-
import { useHotkeys, isEditable, windowSize, AriaCtrlCmd, Ctrl } from '../../util/ui';
18+
import { useHotkeys, isEditable, windowSize, AriaCtrlCmd } from '../../util/ui';
1919
import { debounceComputed } from '../../util/observable';
2020
import { UnreachableCheck, unreachableCheck } from '../../util/error';
2121

@@ -28,7 +28,7 @@ import { RulesStore } from '../../model/rules/rules-store';
2828
import { AccountStore } from '../../model/account/account-store';
2929
import { SendStore } from '../../model/send/send-store';
3030
import { HttpExchange } from '../../model/http/http-exchange';
31-
import { FilterSet } from '../../model/filters/search-filters';
31+
import { Filter, FilterSet } from '../../model/filters/search-filters';
3232
import { buildRuleFromExchange } from '../../model/rules/rule-creation';
3333

3434
import { SplitPane } from '../split-pane';
@@ -254,7 +254,8 @@ class ViewPage extends React.Component<ViewPageProps> {
254254
this.onPin,
255255
this.onDelete,
256256
this.onBuildRuleFromExchange,
257-
this.onPrepareToResendRequest
257+
this.onPrepareToResendRequest,
258+
this.onAddSearchFilter
258259
);
259260

260261
componentDidMount() {
@@ -500,6 +501,23 @@ class ViewPage extends React.Component<ViewPageProps> {
500501
this.searchFiltersUnderConsideration = filters;
501502
}
502503

504+
@action.bound
505+
onAddSearchFilter(filter: Filter) {
506+
if (this.searchFiltersUnderConsideration) {
507+
this.searchFiltersUnderConsideration = [
508+
this.searchFiltersUnderConsideration[0],
509+
filter,
510+
...this.searchFiltersUnderConsideration.slice(1)
511+
];
512+
}
513+
514+
this.props.uiStore.activeFilterSet = [
515+
this.props.uiStore.activeFilterSet[0],
516+
filter,
517+
...this.props.uiStore.activeFilterSet.slice(1)
518+
]
519+
}
520+
503521
@action.bound
504522
onSelected(event: CollectedEvent | undefined) {
505523
this.props.uiStore.setSelectedEventId(event?.id);

src/model/filters/search-filters.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -670,7 +670,7 @@ class ProtocolFilter extends Filter {
670670
}
671671
}
672672

673-
class HostnameFilter extends Filter {
673+
export class HostnameFilter extends Filter {
674674

675675
static filterSyntax = [
676676
new FixedStringSyntax("hostname"),
@@ -1465,7 +1465,7 @@ class NotFilter extends Filter {
14651465

14661466
private innerFilter: Filter;
14671467

1468-
constructor(private filterValue: string) {
1468+
constructor(filterValue: string) {
14691469
super(filterValue);
14701470

14711471
const innerValue = filterValue.slice(4, -1);

0 commit comments

Comments
 (0)