Skip to content
This repository was archived by the owner on Sep 30, 2024. It is now read-only.

Commit 37b6ded

Browse files
authored
Search: always respect default pattern type (#63410)
Previously, enabling then disabling the regexp toggle would always set the patterntype to `keyword`, even when the user has set `search.defaultPatternType: standard`. Now, toggles always revert back to the default pattern type. To support this, this PR adds `defaultPatternType` to the nav bar query state, which is updated every time there's a settings update. Having `defaultPatternType` available also lets us fix another bug: when the default pattern type has been set to `standard` we no longer awkwardly show `patterntype: standard` in the search bar. (This confusing behavior was introduced recently in #63326.) **Overall, this PR set us up to remove `experimentalFeatures.keywordSearch`, along with the keyword search toggle.** To opt out of keyword search, users can just set `search.defaultPatternType`, and have it work everywhere.
1 parent dbc8d5b commit 37b6ded

File tree

14 files changed

+155
-32
lines changed

14 files changed

+155
-32
lines changed

client/branded/src/search-ui/input/SearchBox.story.tsx

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,8 @@ const defaultProps: SearchBoxProps = {
2828
telemetryRecorder: noOpTelemetryRecorder,
2929
queryState: { query: 'hello repo:test' },
3030
isSourcegraphDotCom: false,
31-
patternType: SearchPatternType.standard,
31+
patternType: SearchPatternType.keyword,
32+
defaultPatternType: SearchPatternType.keyword,
3233
setPatternType: () => {},
3334
caseSensitive: false,
3435
setCaseSensitivity: () => {},
@@ -61,11 +62,21 @@ export const SearchBoxStory: StoryFn = () => (
6162
<SearchBox {...defaultProps} patternType={SearchPatternType.regexp} />
6263
</div>
6364

65+
<H2>Standard enabled</H2>
66+
<div className="w-100 d-flex my-2">
67+
<SearchBox {...defaultProps} patternType={SearchPatternType.standard} />
68+
</div>
69+
6470
<H2>Structural enabled</H2>
6571
<div className="w-100 d-flex my-2">
6672
<SearchBox {...defaultProps} patternType={SearchPatternType.structural} />
6773
</div>
6874

75+
<H2>Default patterntype</H2>
76+
<div className="w-100 d-flex my-2">
77+
<SearchBox {...defaultProps} defaultPatternType={SearchPatternType.standard} />
78+
</div>
79+
6980
<H2>Case sensitivity enabled</H2>
7081
<div className="w-100 d-flex my-2">
7182
<SearchBox {...defaultProps} caseSensitive={true} />

client/branded/src/search-ui/input/SearchBox.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,7 @@ export const SearchBox: FC<SearchBoxProps> = props => {
194194
{props.showKeywordSearchToggle ? (
195195
<Toggles
196196
patternType={props.patternType}
197+
defaultPatternType={props.defaultPatternType}
197198
setPatternType={props.setPatternType}
198199
caseSensitive={props.caseSensitive}
199200
setCaseSensitivity={props.setCaseSensitivity}

client/branded/src/search-ui/input/toggles/Toggles.test.tsx

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@ describe('Toggles', () => {
1515
renderWithBrandedContext(
1616
<Toggles
1717
navbarSearchQuery="(case:yes foo) or (case:no bar)"
18-
patternType={SearchPatternType.standard}
18+
patternType={SearchPatternType.keyword}
19+
defaultPatternType={SearchPatternType.keyword}
1920
setPatternType={() => undefined}
2021
caseSensitive={false}
2122
setCaseSensitivity={() => undefined}
@@ -33,7 +34,8 @@ describe('Toggles', () => {
3334
renderWithBrandedContext(
3435
<Toggles
3536
navbarSearchQuery="(foo patterntype:literal) or (bar patterntype:structural)"
36-
patternType={SearchPatternType.standard}
37+
patternType={SearchPatternType.keyword}
38+
defaultPatternType={SearchPatternType.keyword}
3739
setPatternType={() => undefined}
3840
caseSensitive={false}
3941
setCaseSensitivity={() => undefined}
@@ -50,7 +52,26 @@ describe('Toggles', () => {
5052
renderWithBrandedContext(
5153
<Toggles
5254
navbarSearchQuery="(foo patterntype:literal) or (bar patterntype:structural)"
53-
patternType={SearchPatternType.standard}
55+
patternType={SearchPatternType.keyword}
56+
defaultPatternType={SearchPatternType.keyword}
57+
setPatternType={() => undefined}
58+
caseSensitive={false}
59+
setCaseSensitivity={() => undefined}
60+
searchMode={SearchMode.Precise}
61+
setSearchMode={() => undefined}
62+
telemetryService={NOOP_TELEMETRY_SERVICE}
63+
telemetryRecorder={noOpTelemetryRecorder}
64+
/>
65+
)
66+
expect(screen.getAllByRole('checkbox', { name: 'Regular expression toggle' })).toMatchSnapshot()
67+
})
68+
69+
test('regexp toggle with default patterntype', () => {
70+
renderWithBrandedContext(
71+
<Toggles
72+
navbarSearchQuery="foo.*bar"
73+
patternType={SearchPatternType.keyword}
74+
defaultPatternType={SearchPatternType.standard}
5475
setPatternType={() => undefined}
5576
caseSensitive={false}
5677
setCaseSensitivity={() => undefined}

client/branded/src/search-ui/input/toggles/Toggles.tsx

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ export interface TogglesProps
2828
TelemetryV2Props,
2929
Partial<Pick<SubmitSearchProps, 'submitSearch'>> {
3030
navbarSearchQuery: string
31+
defaultPatternType: SearchPatternType
3132
className?: string
3233
/**
3334
* If set to false makes all buttons non-actionable. The main use case for
@@ -46,6 +47,7 @@ export const Toggles: React.FunctionComponent<React.PropsWithChildren<TogglesPro
4647
const {
4748
navbarSearchQuery,
4849
patternType,
50+
defaultPatternType,
4951
setPatternType,
5052
caseSensitive,
5153
setCaseSensitivity,
@@ -75,23 +77,22 @@ export const Toggles: React.FunctionComponent<React.PropsWithChildren<TogglesPro
7577
}, [caseSensitive, setCaseSensitivity, submitOnToggle, telemetryRecorder])
7678

7779
const toggleRegexp = useCallback((): void => {
78-
const newPatternType =
79-
patternType !== SearchPatternType.regexp ? SearchPatternType.regexp : SearchPatternType.keyword
80+
const newPatternType = patternType !== SearchPatternType.regexp ? SearchPatternType.regexp : defaultPatternType
8081

8182
setPatternType(newPatternType)
8283
submitOnToggle({ newPatternType })
8384
telemetryService.log('ToggleRegexpPatternType', { currentStatus: patternType === SearchPatternType.regexp })
8485
telemetryRecorder.recordEvent('search.regexpPatternType', 'toggle')
85-
}, [patternType, setPatternType, submitOnToggle, telemetryService, telemetryRecorder])
86+
}, [patternType, defaultPatternType, setPatternType, submitOnToggle, telemetryService, telemetryRecorder])
8687

8788
const toggleStructuralSearch = useCallback((): void => {
8889
const newPatternType: SearchPatternType =
89-
patternType !== SearchPatternType.structural ? SearchPatternType.structural : SearchPatternType.keyword
90+
patternType !== SearchPatternType.structural ? SearchPatternType.structural : defaultPatternType
9091

9192
setPatternType(newPatternType)
9293
submitOnToggle({ newPatternType })
9394
telemetryRecorder.recordEvent('search.structuralPatternType', 'toggle')
94-
}, [patternType, setPatternType, submitOnToggle, telemetryRecorder])
95+
}, [patternType, defaultPatternType, setPatternType, submitOnToggle, telemetryRecorder])
9596

9697
return (
9798
<div className={classNames(className, styles.toggleContainer)}>

client/branded/src/search-ui/input/toggles/__snapshots__/Toggles.test.tsx.snap

Lines changed: 27 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

client/shared/src/search/searchQueryState.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ export interface SearchQueryState {
6969
queryState: QueryState
7070
searchCaseSensitivity: boolean
7171
searchPatternType: SearchPatternType
72+
defaultPatternType: SearchPatternType
7273
searchQueryFromURL: string
7374
searchMode: SearchMode
7475

client/vscode/src/webview/search-panel/SearchHomeView.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,7 @@ export const SearchHomeView: React.FunctionComponent<React.PropsWithChildren<Sea
167167
caseSensitive={caseSensitive}
168168
setCaseSensitivity={setCaseSensitivity}
169169
patternType={patternType}
170+
defaultPatternType={SearchPatternType.standard}
170171
setPatternType={setPatternType}
171172
searchMode={searchMode}
172173
setSearchMode={setSearchMode}

client/vscode/src/webview/search-panel/SearchResultsView.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ import {
1717
import { LATEST_VERSION, type RepositoryMatch, type SearchMatch } from '@sourcegraph/shared/src/search/stream'
1818
import { buildSearchURLQuery } from '@sourcegraph/shared/src/util/url'
1919

20-
import type { SearchPatternType } from '../../graphql-operations'
20+
import { SearchPatternType } from '../../graphql-operations'
2121
import type { SearchResultsState } from '../../state'
2222
import type { WebviewPageProps } from '../platform/context'
2323

@@ -322,6 +322,7 @@ export const SearchResultsView: React.FunctionComponent<React.PropsWithChildren<
322322
caseSensitive={context.submittedSearchQueryState?.searchCaseSensitivity}
323323
setCaseSensitivity={setCaseSensitivity}
324324
patternType={context.submittedSearchQueryState?.searchPatternType}
325+
defaultPatternType={SearchPatternType.standard}
325326
setPatternType={setPatternType}
326327
searchMode={context.submittedSearchQueryState?.searchMode}
327328
setSearchMode={setSearchMode}

client/vscode/src/webview/sidebars/search/SearchSidebarView.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ export const SearchSidebarView: FC<SearchSidebarViewProps> = React.memo(function
5959
queryState: { query: '' },
6060
searchCaseSensitivity: false,
6161
searchPatternType: SearchPatternType.standard,
62+
defaultPatternType: SearchPatternType.standard, // Not used here
6263
searchQueryFromURL: '',
6364
searchMode: SearchMode.Precise,
6465

client/web/src/nav/new-global-navigation/NewGlobalNavigationBar.tsx

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,13 @@ export const NewGlobalNavigationBar: FC<NewGlobalNavigationBar> = props => {
156156

157157
type NavigationSearchBoxState = Pick<
158158
SearchQueryState,
159-
'queryState' | 'setQueryState' | 'submitSearch' | 'searchCaseSensitivity' | 'searchPatternType' | 'searchMode'
159+
| 'queryState'
160+
| 'setQueryState'
161+
| 'submitSearch'
162+
| 'searchCaseSensitivity'
163+
| 'searchPatternType'
164+
| 'defaultPatternType'
165+
| 'searchMode'
160166
>
161167

162168
/**
@@ -170,6 +176,7 @@ const selectQueryState = (state: SearchQueryState): NavigationSearchBoxState =>
170176
submitSearch: state.submitSearch,
171177
searchCaseSensitivity: state.searchCaseSensitivity,
172178
searchPatternType: state.searchPatternType,
179+
defaultPatternType: state.defaultPatternType,
173180
searchMode: state.searchMode,
174181
})
175182

@@ -191,8 +198,15 @@ const NavigationSearchBox: FC<NavigationSearchBoxProps> = props => {
191198
const location = useLocation()
192199
const showKeywordSearchToggle = useKeywordSearch()
193200

194-
const { searchMode, queryState, searchPatternType, searchCaseSensitivity, setQueryState, submitSearch } =
195-
useNavbarQueryState(selectQueryState, shallow)
201+
const {
202+
searchMode,
203+
queryState,
204+
searchPatternType,
205+
defaultPatternType,
206+
searchCaseSensitivity,
207+
setQueryState,
208+
submitSearch,
209+
} = useNavbarQueryState(selectQueryState, shallow)
196210

197211
const submitSearchOnChange = useCallback(
198212
(parameters: Partial<SubmitSearchParameters> = {}) => {
@@ -231,6 +245,7 @@ const NavigationSearchBox: FC<NavigationSearchBoxProps> = props => {
231245
<Toggles
232246
searchMode={searchMode}
233247
patternType={searchPatternType}
248+
defaultPatternType={defaultPatternType}
234249
caseSensitive={searchCaseSensitivity}
235250
navbarSearchQuery={queryState.query}
236251
structuralSearchDisabled={structuralSearchDisabled}

0 commit comments

Comments
 (0)