mirror of
https://github.com/ansible/awx.git
synced 2026-01-11 10:00:01 -03:30
Disable remove button if row is being dragged
Disable remove button if row is being dragged. Also, disable drag button there is just one item selected. closes: https://github.com/ansible/awx/issues/10548
This commit is contained in:
parent
bc8e19b51d
commit
fb64df21c5
@ -90,7 +90,7 @@ function InstanceGroupsLookup({
|
||||
<br />
|
||||
<Trans>
|
||||
Note: The order in which these are selected sets the execution
|
||||
precedence.
|
||||
precedence. Select more than one to enable drag.
|
||||
</Trans>
|
||||
</>
|
||||
}
|
||||
|
||||
@ -25,10 +25,12 @@ const RemoveActionSection = styled(DataListAction)`
|
||||
function DraggableSelectedList({ selected, onRemove, onRowDrag }) {
|
||||
const [liveText, setLiveText] = useState('');
|
||||
const [id, setId] = useState('');
|
||||
const [isDragging, setIsDragging] = useState(false);
|
||||
|
||||
const onDragStart = newId => {
|
||||
setId(newId);
|
||||
setLiveText(t`Dragging started for item id: ${newId}.`);
|
||||
setIsDragging(true);
|
||||
};
|
||||
|
||||
const onDragMove = (oldIndex, newIndex) => {
|
||||
@ -39,6 +41,7 @@ function DraggableSelectedList({ selected, onRemove, onRowDrag }) {
|
||||
|
||||
const onDragCancel = () => {
|
||||
setLiveText(t`Dragging cancelled. List is unchanged.`);
|
||||
setIsDragging(false);
|
||||
};
|
||||
|
||||
const onDragFinish = newItemOrder => {
|
||||
@ -46,6 +49,7 @@ function DraggableSelectedList({ selected, onRemove, onRowDrag }) {
|
||||
selected.find(i => i.name === item)
|
||||
);
|
||||
onRowDrag(selectedItems);
|
||||
setIsDragging(false);
|
||||
};
|
||||
|
||||
const removeItem = item => {
|
||||
@ -56,7 +60,8 @@ function DraggableSelectedList({ selected, onRemove, onRowDrag }) {
|
||||
return null;
|
||||
}
|
||||
|
||||
const orderedList = selected.map(item => item.name);
|
||||
const orderedList = selected.map(item => item?.name);
|
||||
|
||||
return (
|
||||
<>
|
||||
<DataList
|
||||
@ -83,6 +88,7 @@ function DraggableSelectedList({ selected, onRemove, onRowDrag }) {
|
||||
cancel the drag operation.`}
|
||||
aria-pressed="false"
|
||||
data-cy={`reorder-${label}`}
|
||||
isDisabled={selected.length === 1}
|
||||
/>
|
||||
</DataListControl>
|
||||
<DataListItemCells
|
||||
@ -98,6 +104,7 @@ function DraggableSelectedList({ selected, onRemove, onRowDrag }) {
|
||||
variant="plain"
|
||||
aria-label={t`Remove`}
|
||||
ouiaId={`draggable-list-remove-${label}`}
|
||||
isDisabled={isDragging}
|
||||
>
|
||||
<TimesIcon />
|
||||
</Button>
|
||||
|
||||
@ -1,4 +1,5 @@
|
||||
import React from 'react';
|
||||
import { act } from 'react-dom/test-utils';
|
||||
import { mountWithContexts } from '../../../testUtils/enzymeHelpers';
|
||||
import DraggableSelectedList from './DraggableSelectedList';
|
||||
|
||||
@ -64,6 +65,11 @@ describe('<DraggableSelectedList />', () => {
|
||||
wrapper = mountWithContexts(
|
||||
<DraggableSelectedList selected={mockSelected} onRemove={onRemove} />
|
||||
);
|
||||
expect(
|
||||
wrapper
|
||||
.find('DataListDragButton[aria-label="Reorder"]')
|
||||
.prop('isDisabled')
|
||||
).toBe(true);
|
||||
wrapper
|
||||
.find('DataListItem[id="foo"] Button[aria-label="Remove"]')
|
||||
.simulate('click');
|
||||
@ -72,4 +78,69 @@ describe('<DraggableSelectedList />', () => {
|
||||
name: 'foo',
|
||||
});
|
||||
});
|
||||
|
||||
test('should disable remove button when dragging item', () => {
|
||||
const mockSelected = [
|
||||
{
|
||||
id: 1,
|
||||
name: 'foo',
|
||||
},
|
||||
{
|
||||
id: 2,
|
||||
name: 'bar',
|
||||
},
|
||||
];
|
||||
wrapper = mountWithContexts(
|
||||
<DraggableSelectedList
|
||||
selected={mockSelected}
|
||||
onRemove={() => {}}
|
||||
onRowDrag={() => {}}
|
||||
/>
|
||||
);
|
||||
|
||||
expect(
|
||||
wrapper
|
||||
.find('Button[aria-label="Remove"]')
|
||||
.at(0)
|
||||
.prop('isDisabled')
|
||||
).toBe(false);
|
||||
expect(
|
||||
wrapper
|
||||
.find('Button[aria-label="Remove"]')
|
||||
.at(1)
|
||||
.prop('isDisabled')
|
||||
).toBe(false);
|
||||
act(() => {
|
||||
wrapper.find('DataList').prop('onDragStart')();
|
||||
});
|
||||
wrapper.update();
|
||||
expect(
|
||||
wrapper
|
||||
.find('Button[aria-label="Remove"]')
|
||||
.at(0)
|
||||
.prop('isDisabled')
|
||||
).toBe(true);
|
||||
expect(
|
||||
wrapper
|
||||
.find('Button[aria-label="Remove"]')
|
||||
.at(1)
|
||||
.prop('isDisabled')
|
||||
).toBe(true);
|
||||
act(() => {
|
||||
wrapper.find('DataList').prop('onDragCancel')();
|
||||
});
|
||||
wrapper.update();
|
||||
expect(
|
||||
wrapper
|
||||
.find('Button[aria-label="Remove"]')
|
||||
.at(0)
|
||||
.prop('isDisabled')
|
||||
).toBe(false);
|
||||
expect(
|
||||
wrapper
|
||||
.find('Button[aria-label="Remove"]')
|
||||
.at(1)
|
||||
.prop('isDisabled')
|
||||
).toBe(false);
|
||||
});
|
||||
});
|
||||
|
||||
@ -115,7 +115,7 @@ function OrganizationFormFields({
|
||||
<br />
|
||||
<Trans>
|
||||
Note: The order of these credentials sets precedence for the sync
|
||||
and lookup of the content.
|
||||
and lookup of the content. Select more than one to enable drag.
|
||||
</Trans>
|
||||
</>
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user