Skip to content

Commit 00753f4

Browse files
committed
feat: Codemirror - FindAndReplace - shortcuts update, replace shortcut working even when replace field is hidden fix
1 parent d117012 commit 00753f4

File tree

5 files changed

+77
-5
lines changed

5 files changed

+77
-5
lines changed

src/Common/CodeMirror/CodeEditor.tsx

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ import { cleanKubeManifest, useEffectAfterMount } from '@Common/Helper'
3535
import { DEFAULT_JSON_SCHEMA_URI, MODES } from '@Common/Constants'
3636

3737
import { codeEditorFindReplace, readOnlyTooltip, yamlHighlight } from './Extensions'
38+
import { openSearchPanel, openSearchPanelWithReplace, replaceAll, showReplaceFieldState } from './Commands'
3839
import { CodeEditorContextProps, CodeEditorProps } from './types'
3940
import { CodeEditorReducer, initialState, parseValueToCode } from './CodeEditor.reducer'
4041
import { getFoldGutterElement, getLanguageExtension, getValidationSchema } from './utils'
@@ -197,14 +198,20 @@ const CodeEditor = <DiffView extends boolean = false>({
197198
const baseExtensions: Extension[] = [
198199
basicSetup(basicSetupOptions),
199200
themeExtension,
200-
keymap.of(vscodeKeymap.filter(({ key }) => !disableSearch || key !== 'Mod-f')),
201+
keymap.of([
202+
...vscodeKeymap.filter(({ key }) => key !== 'Mod-Alt-Enter' && key !== 'Mod-Enter' && key !== 'Mod-f'),
203+
...(!disableSearch ? [{ key: 'Mod-f', run: openSearchPanel, scope: 'editor search-panel' }] : []),
204+
{ key: 'Mod-Enter', run: replaceAll, scope: 'editor search-panel' },
205+
{ key: 'Mod-Alt-f', run: openSearchPanelWithReplace, scope: 'editor search-panel' },
206+
]),
201207
indentationMarkers(),
202208
getLanguageExtension(mode),
203209
foldingCompartment.of(foldConfig),
204210
lintGutter(),
205211
search({
206212
createPanel: codeEditorFindReplace,
207213
}),
214+
showReplaceFieldState,
208215
...(mode === MODES.YAML ? [yamlHighlight] : []),
209216
]
210217

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
import { openSearchPanel as cmOpenSearchPanel, replaceAll as cmReplaceAll, searchPanelOpen } from '@codemirror/search'
2+
import { Command, EditorState, EditorView, StateEffect, StateField } from '@uiw/react-codemirror'
3+
4+
export const setShowReplaceField = StateEffect.define<boolean>()
5+
6+
export const showReplaceFieldState = StateField.define<boolean>({
7+
create() {
8+
return false
9+
},
10+
update(value, tr) {
11+
const effect = tr.effects.find((_effect) => _effect.is(setShowReplaceField))
12+
if (effect) {
13+
return effect.value
14+
}
15+
return value
16+
},
17+
})
18+
19+
export const getShowReplaceField = (state: EditorState) => {
20+
const curState = state.field(showReplaceFieldState, false)
21+
return curState || false
22+
}
23+
24+
export const openSearchPanel: Command = (view: EditorView) => {
25+
cmOpenSearchPanel(view)
26+
view.dispatch({
27+
effects: [setShowReplaceField.of(searchPanelOpen(view.state) ? getShowReplaceField(view.state) : false)],
28+
})
29+
return true
30+
}
31+
32+
export const openSearchPanelWithReplace: Command = (view: EditorView) => {
33+
openSearchPanel(view)
34+
view.dispatch({ effects: [setShowReplaceField.of(true)] })
35+
return true
36+
}
37+
38+
export const replaceAll: Command = (view: EditorView) => {
39+
const isReplaceEnabled = getShowReplaceField(view.state)
40+
if (isReplaceEnabled) {
41+
cmReplaceAll(view)
42+
}
43+
return true
44+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export * from './findAndReplace'

src/Common/CodeMirror/Extensions/findAndReplace.tsx

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ import {
5151
REPLACE_SHORTCUT_KEYS,
5252
} from '../CodeEditor.constants'
5353
import { getFindReplaceToggleButtonIconClass, getUpdatedSearchMatchesCount } from '../utils'
54+
import { getShowReplaceField, setShowReplaceField } from '../Commands'
5455

5556
const FindReplaceToggleButton = ({
5657
isChecked,
@@ -84,11 +85,11 @@ const FindReplaceToggleButton = ({
8485
)
8586
}
8687

87-
const FindReplace = ({ view, defaultQuery }: FindReplaceProps) => {
88+
const FindReplace = ({ view, defaultQuery, defaultShowReplace }: FindReplaceProps) => {
8889
// STATES
8990
const [query, setQuery] = useState<SearchQuery>(new SearchQuery({ search: '' }))
9091
const [matchesCount, setMatchesCount] = useState({ count: 0, current: 1 })
91-
const [showReplace, setShowReplace] = useState(!!query.replace)
92+
const [showReplace, setShowReplace] = useState<boolean>(defaultShowReplace)
9293

9394
// CONSTANTS
9495
const isPreviousNextButtonDisabled = !matchesCount.count
@@ -128,6 +129,12 @@ const FindReplace = ({ view, defaultQuery }: FindReplaceProps) => {
128129
setMatchesCount(getUpdatedSearchMatchesCount(defaultQuery, view))
129130
}, [view.state.doc.length])
130131

132+
useEffect(() => {
133+
if (defaultShowReplace !== showReplace) {
134+
setShowReplace(defaultShowReplace)
135+
}
136+
}, [defaultShowReplace])
137+
131138
useEffect(() => {
132139
if (isReadOnly && showReplace) {
133140
setShowReplace(false)
@@ -200,6 +207,7 @@ const FindReplace = ({ view, defaultQuery }: FindReplaceProps) => {
200207

201208
const handleReplaceVisibility = () => {
202209
setShowReplace(!showReplace)
210+
view.dispatch({ effects: [setShowReplaceField.of(!showReplace)] })
203211
}
204212

205213
const handleClose = (e: MouseEvent<HTMLButtonElement>) => {
@@ -431,11 +439,19 @@ export const codeEditorFindReplace = (view: EditorView): Panel => {
431439
}
432440
}
433441

434-
dom.className = 'code-editor__search mt-8 mb-4 mr-8 ml-auto p-5 bg__secondary dc__border br-4 dc__w-fit-content'
442+
dom.className =
443+
'code-editor__search mt-8 mb-4 mr-8 ml-auto p-5 bg__secondary dc__border br-4 dc__w-fit-content fs-14'
435444
dom.onkeydown = keydown
436445

437446
const renderFindReplace = () => {
438-
render(<FindReplace view={view} defaultQuery={getSearchQuery(view.state)} />, dom)
447+
render(
448+
<FindReplace
449+
view={view}
450+
defaultQuery={getSearchQuery(view.state)}
451+
defaultShowReplace={getShowReplaceField(view.state)}
452+
/>,
453+
dom,
454+
)
439455
}
440456

441457
const mount = () => {
@@ -450,6 +466,9 @@ export const codeEditorFindReplace = (view: EditorView): Panel => {
450466
if (effect.is(setSearchQuery)) {
451467
renderFindReplace()
452468
}
469+
if (effect.is(setShowReplaceField)) {
470+
renderFindReplace()
471+
}
453472
})
454473
})
455474

src/Common/CodeMirror/types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,7 @@ export type FindReplaceQuery = Partial<
9898
export interface FindReplaceProps {
9999
view: EditorView
100100
defaultQuery: SearchQuery
101+
defaultShowReplace: boolean
101102
}
102103

103104
// REDUCER TYPES

0 commit comments

Comments
 (0)