Skip to content

Commit bd25d02

Browse files
Vojtěch Václav Portešvojtechportes
authored andcommitted
fix: Fixed readOnly mode in text mode when the whole editor is in a readOnly mode
1 parent d902543 commit bd25d02

2 files changed

Lines changed: 67 additions & 24 deletions

File tree

src/builder/builder.test.tsx

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -411,6 +411,41 @@ describe('#components/Builder', () => {
411411
).toBeGreaterThan(0);
412412
});
413413

414+
it('Protects the full text editor range when the Builder is read-only', () => {
415+
const { container } = render(
416+
<Builder
417+
fields={fields}
418+
data={[
419+
{
420+
type: 'GROUP',
421+
value: 'AND',
422+
isNegated: false,
423+
children: [
424+
{ field: 'MOCK_FIELD', value: 'alpha', operator: 'EQUAL' },
425+
{ field: 'MOCK_NUMBER', value: 2, operator: 'EQUAL' },
426+
],
427+
},
428+
]}
429+
textMode
430+
defaultMode="text"
431+
readOnly
432+
components={{
433+
...defaultComponents,
434+
TextModeEditor: CustomTextModeEditor,
435+
}}
436+
onChange={jest.fn()}
437+
/>
438+
);
439+
440+
expect(queryByDataTest(container, 'CustomTextModeEditor')).not.toBeNull();
441+
expect(getByDataTest(container, 'CustomTextModeEditorInput')).toHaveValue(
442+
"(MOCK_FIELD = 'alpha' AND MOCK_NUMBER = 2)"
443+
);
444+
expect(getByDataTest(container, 'CustomTextModeEditorProtectedRangeCount')).toHaveTextContent(
445+
'1'
446+
);
447+
});
448+
414449
it('Preserves locked rules after valid text edits in a custom TextModeEditor', async () => {
415450
const onChange = jest.fn();
416451
const { container } = render(

src/builder/builder.tsx

Lines changed: 32 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -589,30 +589,38 @@ export const Builder = forwardRef<IBuilderRef, IBuilderProps>(({
589589

590590
const content =
591591
textModeEnabled && mode === 'text' ? (
592-
TextModeEditorComponent === defaultComponents.TextModeEditor ? (
593-
<DefaultTextModeEditor
594-
value={textValue}
595-
diagnostics={textDiagnostics}
596-
protectedRanges={textProtectedRanges}
597-
protectedRangeHoverMessage={strings.textMode?.lockedRangesHover || null}
598-
errorMessage={textErrorMessage}
599-
TextModeInputComponent={TextModeInputComponent}
600-
readOnly={readOnly}
601-
allowProtectedRangeDeletion={!readOnlyProtectsDelete}
602-
onChange={handleTextChange}
603-
/>
604-
) : (
605-
<TextModeEditorComponent
606-
value={textValue}
607-
diagnostics={textDiagnostics}
608-
protectedRanges={textProtectedRanges}
609-
protectedRangeHoverMessage={strings.textMode?.lockedRangesHover || null}
610-
errorMessage={textErrorMessage}
611-
readOnly={readOnly}
612-
allowProtectedRangeDeletion={!readOnlyProtectsDelete}
613-
onChange={handleTextChange}
614-
/>
615-
)
592+
(() => {
593+
const textModeProtectedRanges = readOnly
594+
? textValue.length > 0
595+
? [{ start: 0, end: textValue.length }]
596+
: []
597+
: textProtectedRanges;
598+
599+
return TextModeEditorComponent === defaultComponents.TextModeEditor ? (
600+
<DefaultTextModeEditor
601+
value={textValue}
602+
diagnostics={textDiagnostics}
603+
protectedRanges={textModeProtectedRanges}
604+
protectedRangeHoverMessage={strings.textMode?.lockedRangesHover || null}
605+
errorMessage={textErrorMessage}
606+
TextModeInputComponent={TextModeInputComponent}
607+
readOnly={readOnly}
608+
allowProtectedRangeDeletion={!readOnlyProtectsDelete}
609+
onChange={handleTextChange}
610+
/>
611+
) : (
612+
<TextModeEditorComponent
613+
value={textValue}
614+
diagnostics={textDiagnostics}
615+
protectedRanges={textModeProtectedRanges}
616+
protectedRangeHoverMessage={strings.textMode?.lockedRangesHover || null}
617+
errorMessage={textErrorMessage}
618+
readOnly={readOnly}
619+
allowProtectedRangeDeletion={!readOnlyProtectsDelete}
620+
onChange={handleTextChange}
621+
/>
622+
);
623+
})()
616624
) : (
617625
builderContent
618626
);

0 commit comments

Comments
 (0)