diff --git a/public/apps/configuration/panels/internal-user-edit/backend-role-panel.tsx b/public/apps/configuration/panels/internal-user-edit/backend-role-panel.tsx index 73b6c3075..5dae5dc13 100644 --- a/public/apps/configuration/panels/internal-user-edit/backend-role-panel.tsx +++ b/public/apps/configuration/panels/internal-user-edit/backend-role-panel.tsx @@ -22,35 +22,43 @@ import { EuiFormRow, } from '@elastic/eui'; import { isEmpty } from 'lodash'; -import React, { Dispatch, Fragment, SetStateAction } from 'react'; +import React, { Dispatch, Fragment, SetStateAction, useState } from 'react'; import { appendElementToArray, removeElementFromArray, updateElementInArrayHandler, } from '../../utils/array-state-utils'; import { PanelWithHeader } from '../../utils/panel-with-header'; -import { FormRow } from '../../utils/form-row'; import { DocLinks, LIMIT_WIDTH_INPUT_CLASS } from '../../constants'; function generateBackendRolesPanels( backendRoles: string[], - setBackendRoles: Dispatch> + setBackendRoles: Dispatch>, + emptyRoleIndex: number, + roleEmptyErrorMessage: string, + setRoleEmptyErrorMessage: Dispatch> ) { const panels = backendRoles.map((backendRole, arrayIndex) => { return ( - + - updateElementInArrayHandler(setBackendRoles, [arrayIndex])(e.target.value) - } + onChange={(e) => { + updateElementInArrayHandler(setBackendRoles, [arrayIndex])(e.target.value); + setRoleEmptyErrorMessage(''); + }} placeholder="Type in backend role" /> - + @@ -67,6 +75,7 @@ function generateBackendRolesPanels( ); }); + return <>{panels}; } @@ -75,6 +84,8 @@ export function BackendRolePanel(props: { setState: Dispatch>; }) { const { state, setState } = props; + const [roleEmptyErrorMessage, setRoleEmptyErrorMessage] = useState(''); + const [emptyRoleIndex, setEmptyRoleIndex] = useState(-1); // Show one empty row if there is no data. if (isEmpty(state)) { setState(['']); @@ -86,12 +97,24 @@ export function BackendRolePanel(props: { helpLink={DocLinks.AccessControlDoc} optional > - {generateBackendRolesPanels(state, setState)} + {generateBackendRolesPanels( + state, + setState, + emptyRoleIndex, + roleEmptyErrorMessage, + setRoleEmptyErrorMessage + )} { - appendElementToArray(setState, [], ''); + if (state.indexOf('') !== -1) { + setRoleEmptyErrorMessage('Type a backend role before adding a new one'); + setEmptyRoleIndex(state.indexOf('')); + } else { + setRoleEmptyErrorMessage(''); + appendElementToArray(setState, [], ''); + } }} > Add another backend role diff --git a/public/apps/configuration/panels/internal-user-edit/test/__snapshots__/backend-role-panel.test.tsx.snap b/public/apps/configuration/panels/internal-user-edit/test/__snapshots__/backend-role-panel.test.tsx.snap new file mode 100644 index 000000000..39a209a27 --- /dev/null +++ b/public/apps/configuration/panels/internal-user-edit/test/__snapshots__/backend-role-panel.test.tsx.snap @@ -0,0 +1,125 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`User editing - backend role panel BackendRolePanel add backend role when one of the previous roles is blank 1`] = ` + + + + + + + + + + + Remove + + + + + + + + + + + + + + Remove + + + + + + + Add another backend role + + +`; + +exports[`User editing - backend role panel BackendRolePanel add backend role when the previous role is blank 1`] = ` + + + + Add another backend role + + +`; diff --git a/public/apps/configuration/panels/internal-user-edit/test/backend-role-panel.test.tsx b/public/apps/configuration/panels/internal-user-edit/test/backend-role-panel.test.tsx index 452c10082..268ca7759 100644 --- a/public/apps/configuration/panels/internal-user-edit/test/backend-role-panel.test.tsx +++ b/public/apps/configuration/panels/internal-user-edit/test/backend-role-panel.test.tsx @@ -13,8 +13,8 @@ * permissions and limitations under the License. */ -import { EuiFieldText, EuiFlexGroup } from '@elastic/eui'; -import { shallow } from 'enzyme'; +import { EuiFieldText, EuiFlexGroup, EuiFormRow } from '@elastic/eui'; +import { mount, shallow } from 'enzyme'; import React from 'react'; import { appendElementToArray, @@ -27,6 +27,7 @@ jest.mock('../../../utils/array-state-utils', () => ({ appendElementToArray: jest.fn(), removeElementFromArray: jest.fn(), updateElementInArrayHandler: jest.fn().mockReturnValue(jest.fn()), + setRoleEmptyErrorMessage: jest.fn(), })); describe('User editing - backend role panel', () => { @@ -71,5 +72,20 @@ describe('User editing - backend role panel', () => { expect(removeElementFromArray).toBeCalledWith(setState, [], 0); }); + + // TODO: Fix the tests for backend role error message + it('add backend role when the previous role is blank', () => { + const component = shallow(); + component.find('#backend-role-add-row').simulate('click'); + component.find('#backend-role-add-row').simulate('click'); + expect(component).toMatchSnapshot(); + }); + + it('add backend role when one of the previous roles is blank', () => { + const component = shallow(); + component.find('#backend-role-0').simulate('change', { target: { value: '' } }); + component.find('#backend-role-add-row').simulate('click'); + expect(component).toMatchSnapshot(); + }); }); });