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 --//