Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,11 @@ jest.mock('@kbn/unified-search-plugin/public', () => ({
{'Add Field'}
</button>
)}
{props.onEditDataView && (
<button type="button" onClick={() => props.onEditDataView()} data-test-subj="editDataView">
{'Edit Data View'}
</button>
)}
<div data-test-subj="currentDataViewId">{props.currentDataViewId}</div>
<div data-test-subj="trigger">{props.trigger.label}</div>
</div>
Expand Down Expand Up @@ -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<typeof useKibana>);
Expand Down Expand Up @@ -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(
<TestProviders>
<DataViewPicker scope={DataViewManagerScopeName.default} />
</TestProviders>
);

expect(screen.queryByTestId('editDataView')).not.toBeInTheDocument();
});

it('does not render add field button', () => {
jest
.mocked(useKibana().services.dataViewEditor.userPermissions.editDataView)
.mockReturnValue(false);

render(
<TestProviders>
<DataViewPicker scope={DataViewManagerScopeName.default} />
</TestProviders>
);

expect(screen.queryByTestId('addField')).not.toBeInTheDocument();
});
});
});
Original file line number Diff line number Diff line change
Expand Up @@ -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>();

Expand Down Expand Up @@ -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') {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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<typeof useKibana>);
Expand Down