diff --git a/x-pack/solutions/security/plugins/security_solution/public/data_view_manager/components/data_view_picker/index.test.tsx b/x-pack/solutions/security/plugins/security_solution/public/data_view_manager/components/data_view_picker/index.test.tsx index 17f0044bbc9d7..e07d39451c3f6 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/data_view_manager/components/data_view_picker/index.test.tsx +++ b/x-pack/solutions/security/plugins/security_solution/public/data_view_manager/components/data_view_picker/index.test.tsx @@ -62,6 +62,11 @@ jest.mock('@kbn/unified-search-plugin/public', () => ({ {'Add Field'} )} + {props.onEditDataView && ( + + )}
{props.currentDataViewId}
{props.trigger.label}
@@ -89,7 +94,10 @@ describe('DataViewPicker', () => { jest.mocked(useKibana).mockReturnValue({ services: { dataViewFieldEditor: { openEditor: jest.fn() }, - dataViewEditor: { openEditor: jest.fn() }, + dataViewEditor: { + openEditor: jest.fn(), + userPermissions: { editDataView: jest.fn().mockReturnValue(true) }, + }, data: { dataViews: { get: jest.fn() } }, }, } as unknown as ReturnType); @@ -194,4 +202,34 @@ describe('DataViewPicker', () => { expect(jest.mocked(useKibana().services.dataViewFieldEditor.openEditor)).toHaveBeenCalled(); }); }); + + describe('when user does not have editDataView permission', () => { + it('does not render edit data view button', () => { + jest + .mocked(useKibana().services.dataViewEditor.userPermissions.editDataView) + .mockReturnValue(false); + + render( + + + + ); + + expect(screen.queryByTestId('editDataView')).not.toBeInTheDocument(); + }); + + it('does not render add field button', () => { + jest + .mocked(useKibana().services.dataViewEditor.userPermissions.editDataView) + .mockReturnValue(false); + + render( + + + + ); + + expect(screen.queryByTestId('addField')).not.toBeInTheDocument(); + }); + }); }); diff --git a/x-pack/solutions/security/plugins/security_solution/public/data_view_manager/components/data_view_picker/index.tsx b/x-pack/solutions/security/plugins/security_solution/public/data_view_manager/components/data_view_picker/index.tsx index e083a01046e8f..313b161569028 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/data_view_manager/components/data_view_picker/index.tsx +++ b/x-pack/solutions/security/plugins/security_solution/public/data_view_manager/components/data_view_picker/index.tsx @@ -46,6 +46,12 @@ export const DataViewPicker = memo(({ scope, onClosePopover, disabled }: DataVie const { services: { dataViewEditor, data, dataViewFieldEditor, fieldFormats }, } = useKibana(); + + const canEditDataView = useMemo( + () => Boolean(dataViewEditor?.userPermissions.editDataView()), + [dataViewEditor] + ); + const closeDataViewEditor = useRef<() => void | undefined>(); const closeFieldEditor = useRef<() => void | undefined>(); @@ -117,17 +123,22 @@ export const DataViewPicker = memo(({ scope, onClosePopover, disabled }: DataVie /** * Selects data view again. After changes are made to the data view, this results in cache invalidation and will force the reload everywhere. */ - const handleDataViewModified = useCallback( - (updatedDataView: DataView) => { + const handleDataViewModified = useMemo(() => { + if (!canEditDataView) { + return undefined; + } + return (updatedDataView: DataView) => { if (!updatedDataView.id) { return; } handleChangeDataView(updatedDataView.id, updatedDataView.getIndexPattern()); - }, - [handleChangeDataView] - ); + }; + }, [canEditDataView, handleChangeDataView]); - const handleAddField = useCallback(() => editField(undefined, 'add'), [editField]); + const handleAddField = useMemo( + () => (canEditDataView ? () => editField(undefined, 'add') : undefined), + [editField, canEditDataView] + ); const triggerConfig = useMemo(() => { if (status === 'loading') { diff --git a/x-pack/solutions/security/plugins/security_solution/public/resolver/view/controls/sourcerer_selection.test.tsx b/x-pack/solutions/security/plugins/security_solution/public/resolver/view/controls/sourcerer_selection.test.tsx index 28c8d5c1d852b..55140a8e53d3f 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/resolver/view/controls/sourcerer_selection.test.tsx +++ b/x-pack/solutions/security/plugins/security_solution/public/resolver/view/controls/sourcerer_selection.test.tsx @@ -55,7 +55,10 @@ describe('SourcererButton', () => { jest.mocked(useKibana).mockReturnValue({ services: { dataViewFieldEditor: { openEditor: jest.fn() }, - dataViewEditor: { openEditor: jest.fn() }, + dataViewEditor: { + openEditor: jest.fn(), + userPermissions: { editDataView: jest.fn().mockReturnValue(true) }, + }, data: { dataViews: { get: jest.fn() } }, }, } as unknown as ReturnType);