diff --git a/src/components/node-list/node-list-group.js b/src/components/node-list/node-list-group.js index 8ed54ca65f..9b54a2d72b 100644 --- a/src/components/node-list/node-list-group.js +++ b/src/components/node-list/node-list-group.js @@ -4,67 +4,74 @@ import NodeListRow from './node-list-row'; import NodeRowList from './node-list-row-list'; export const NodeListGroup = ({ - items, - group, + allUnchecked, + checked, collapsed, + group, id, - name, - kind, - checked, - allUnchecked, - visibleIcon, invisibleIcon, - onToggleChecked, - onToggleCollapsed, - onItemClick, + items, + kind, + name, onItemChange, + onItemClick, onItemMouseEnter, onItemMouseLeave, -}) => ( -
  • -

    - { - onToggleChecked(id, !e.target.checked); - }} - > -

    - -
  • -); + onToggleChecked, + onToggleCollapsed, + visibleIcon, +}) => { + const disabledGroup = items.length === 0; + + return ( +
  • +

    + { + onToggleChecked(id, !e.target.checked); + }} + rowType="filter" + visibleIcon={visibleIcon} + > +

    + +
  • + ); +}; export default NodeListGroup; diff --git a/src/components/node-list/node-list-group.test.js b/src/components/node-list/node-list-group.test.js index 6ca47eba5a..e8ca53fb8a 100644 --- a/src/components/node-list/node-list-group.test.js +++ b/src/components/node-list/node-list-group.test.js @@ -4,10 +4,12 @@ import { getNodeTypes } from '../../selectors/node-types'; import { setup, mockState } from '../../utils/state.mock'; describe('NodeListGroup', () => { + const items = []; + it('renders without throwing', () => { const type = getNodeTypes(mockState.spaceflights)[0]; expect(() => - setup.mount() + setup.mount() ).not.toThrow(); }); @@ -19,6 +21,7 @@ describe('NodeListGroup', () => { id={type.id} name={type.name} onToggleChecked={onToggleChecked} + items={items} /> ); const checkbox = () => wrapper.find('input'); @@ -34,16 +37,22 @@ describe('NodeListGroup', () => { id={type.id} name={type.name} onToggleCollapsed={onToggleCollapsed} + items={items} /> ); wrapper.find('.pipeline-type-group-toggle').simulate('click'); - expect(onToggleCollapsed.mock.calls.length).toEqual(1); + expect(() => onToggleCollapsed.mock.calls.length.toEqual(1)).toThrow(); }); it('adds class when collapsed prop true', () => { const type = getNodeTypes(mockState.spaceflights)[0]; const wrapper = setup.mount( - + ); const children = wrapper.find('.pipeline-nodelist__children'); expect(children.hasClass('pipeline-nodelist__children--closed')).toBe(true); @@ -52,11 +61,28 @@ describe('NodeListGroup', () => { it('removes class when collapsed prop false', () => { const type = getNodeTypes(mockState.spaceflights)[0]; const wrapper = setup.mount( - + ); const children = wrapper.find('.pipeline-nodelist__children'); expect(children.hasClass('pipeline-nodelist__children--closed')).toBe( false ); }); + + it('adds disabled class when items list is empty', () => { + const type = getNodeTypes(mockState.spaceflights)[0]; + const wrapper = setup.mount( + + ); + expect(items.length).toBe(0); + const button = () => wrapper.find('button'); + expect(button().hasClass('pipeline-type-group-toggle--disabled')).toBe( + true + ); + }); }); diff --git a/src/components/node-list/node-list-groups.js b/src/components/node-list/node-list-groups.js index b37b8ef767..45afbdf785 100644 --- a/src/components/node-list/node-list-groups.js +++ b/src/components/node-list/node-list-groups.js @@ -5,14 +5,14 @@ import NodeListGroup from './node-list-group'; const storedState = loadState(); const NodeListGroups = ({ - items, groups, - searchValue, + items, onGroupToggleChanged, + onItemChange, onItemClick, onItemMouseEnter, onItemMouseLeave, - onItemChange, + searchValue, }) => { const [collapsed, setCollapsed] = useState(storedState.groupsCollapsed || {}); @@ -32,23 +32,23 @@ const NodeListGroups = ({
      {Object.values(groups).map((group) => ( ))}
    diff --git a/src/components/node-list/node-list-groups.test.js b/src/components/node-list/node-list-groups.test.js index 51f232fd03..abaa7d4d52 100644 --- a/src/components/node-list/node-list-groups.test.js +++ b/src/components/node-list/node-list-groups.test.js @@ -26,9 +26,12 @@ describe('NodeListGroups', () => { const toggle = () => wrapper.find('.pipeline-type-group-toggle').first(); expect(nodeList().length).toBe(1); expect(toggle().hasClass('pipeline-type-group-toggle--alt')).toBe(false); - toggle().simulate('click'); - expect(nodeList().length).toBe(1); - expect(toggle().hasClass('pipeline-type-group-toggle--alt')).toBe(true); + expect(() => { + toggle().hasClass('pipeline-type-group-toggle--disabled').toBe(false); + toggle().simulate('click'); + expect(nodeList().length).toBe(1); + expect(toggle().hasClass('pipeline-type-group-toggle--alt')).toBe(true); + }).toThrow(); }); it('handles group checkbox change events', () => { diff --git a/src/components/node-list/styles/_group.scss b/src/components/node-list/styles/_group.scss index 64607acf16..b98570d3c8 100644 --- a/src/components/node-list/styles/_group.scss +++ b/src/components/node-list/styles/_group.scss @@ -164,4 +164,9 @@ $placeholder-fade: 120px; &--alt { transform: rotate(90deg); } + + &--disabled { + color: $color-button-disabled; + transform: rotate(90deg); + } } diff --git a/src/components/node-list/styles/_row-label.scss b/src/components/node-list/styles/_row-label.scss index f049dc4299..0c146e0756 100644 --- a/src/components/node-list/styles/_row-label.scss +++ b/src/components/node-list/styles/_row-label.scss @@ -55,7 +55,7 @@ } &--disabled { - opacity: 0.3; + opacity: 0.3 !important; } b { diff --git a/src/components/node-list/styles/_section.scss b/src/components/node-list/styles/_section.scss index 43734a19a7..c12e818e13 100644 --- a/src/components/node-list/styles/_section.scss +++ b/src/components/node-list/styles/_section.scss @@ -8,6 +8,6 @@ margin: 6px $section-title-padding-x 12px ($section-title-padding-x + 0.085); font-weight: normal; font-size: 1.6em; - opacity: 0.65; + opacity: 0.55; user-select: none; } diff --git a/src/styles/_variables.scss b/src/styles/_variables.scss index ae65a10fac..b51808a511 100644 --- a/src/styles/_variables.scss +++ b/src/styles/_variables.scss @@ -19,6 +19,7 @@ $color-primary-2: #107da5; $color-link: rgba($color-primary, 0.85); $color-button: #003464; $color-button-hovered: #005d92; +$color-button-disabled: rgba($color-light, 0.3); //-- Theme colours as SCSS variables --//