]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-15901 Make SelectList component more accessible
authorWouter Admiraal <wouter.admiraal@sonarsource.com>
Wed, 19 Jan 2022 13:26:49 +0000 (14:26 +0100)
committersonartech <sonartech@sonarsource.com>
Thu, 20 Jan 2022 20:02:44 +0000 (20:02 +0000)
server/sonar-web/src/main/js/components/controls/SelectListListElement.tsx
server/sonar-web/src/main/js/components/controls/__tests__/SelectListListElement-test.tsx
server/sonar-web/src/main/js/components/controls/__tests__/__snapshots__/SelectListListElement-test.tsx.snap

index a3d3aac73f2670a7961535356f48ffde41b701d4..d839989e1012cf14af77e01d6b6807b8cc285fad 100644 (file)
@@ -27,7 +27,7 @@ interface Props {
   element: string;
   onSelect: (element: string) => Promise<void>;
   onUnselect: (element: string) => Promise<void>;
-  renderElement: (element: string) => React.ReactNode;
+  renderElement: (element: string) => React.ReactNode | [React.ReactNode, React.ReactNode];
   selected: boolean;
 }
 
@@ -60,23 +60,28 @@ export default class SelectListListElement extends React.PureComponent<Props, St
   };
 
   render() {
+    let item = this.props.renderElement(this.props.element);
+    let extra;
+    if (Array.isArray(item)) {
+      extra = item[1];
+      item = item[0];
+    }
     return (
       <li
-        className={classNames({
+        className={classNames('display-flex-center', {
           'select-list-list-disabled': this.props.disabled
         })}>
         <Checkbox
           checked={this.props.selected}
-          className={classNames('select-list-list-checkbox display-flex-center', {
+          className={classNames('select-list-list-checkbox flex-1', {
             active: this.props.active
           })}
           disabled={this.props.disabled}
           loading={this.state.loading}
           onCheck={this.handleCheck}>
-          <span className="little-spacer-left flex-1">
-            {this.props.renderElement(this.props.element)}
-          </span>
+          <span className="little-spacer-left">{item}</span>
         </Checkbox>
+        {extra && <span className="select-list-list-extra">{extra}</span>}
       </li>
     );
   }
index ca127222e0440a18b0943efba04f769240738f91..e2e060f40ad368ea8d2f4cf8d753dbe3d63bd574 100644 (file)
@@ -22,26 +22,36 @@ import * as React from 'react';
 import { waitAndUpdate } from '../../../helpers/testUtils';
 import SelectListListElement from '../SelectListListElement';
 
-const listElement = (
-  <SelectListListElement
-    element="foo"
-    key="foo"
-    onSelect={jest.fn(() => Promise.resolve())}
-    onUnselect={jest.fn(() => Promise.resolve())}
-    renderElement={(foo: string) => foo}
-    selected={false}
-  />
-);
-
 it('should display a loader when checking', async () => {
-  const wrapper = shallow<SelectListListElement>(listElement);
-  expect(wrapper).toMatchSnapshot();
+  const wrapper = shallowRender();
+  expect(wrapper).toMatchSnapshot('default');
   expect(wrapper.state().loading).toBe(false);
 
-  (wrapper.instance() as SelectListListElement).handleCheck(true);
+  wrapper.instance().handleCheck(true);
   expect(wrapper.state().loading).toBe(true);
-  expect(wrapper).toMatchSnapshot();
+  expect(wrapper).toMatchSnapshot('loading');
 
   await waitAndUpdate(wrapper);
   expect(wrapper.state().loading).toBe(false);
 });
+
+it('should correctly handle a render callback that returns 2 elements', () => {
+  const wrapper = shallowRender({
+    renderElement: (foo: string) => [foo, 'extra info']
+  });
+  expect(wrapper.find('.select-list-list-extra').exists()).toBe(true);
+});
+
+function shallowRender(props: Partial<SelectListListElement['props']> = {}) {
+  return shallow<SelectListListElement>(
+    <SelectListListElement
+      element="foo"
+      key="foo"
+      onSelect={jest.fn(() => Promise.resolve())}
+      onUnselect={jest.fn(() => Promise.resolve())}
+      renderElement={(foo: string) => foo}
+      selected={false}
+      {...props}
+    />
+  );
+}
index 0b05a479c5c52d5b6399eef5f196f337286a9e98..9acb0969df19ab64f9b221e9935476469605844b 100644 (file)
@@ -1,18 +1,18 @@
 // Jest Snapshot v1, https://goo.gl/fbAQLP
 
-exports[`should display a loader when checking 1`] = `
+exports[`should display a loader when checking: default 1`] = `
 <li
-  className=""
+  className="display-flex-center"
 >
   <Checkbox
     checked={false}
-    className="select-list-list-checkbox display-flex-center"
+    className="select-list-list-checkbox flex-1"
     loading={false}
     onCheck={[Function]}
     thirdState={false}
   >
     <span
-      className="little-spacer-left flex-1"
+      className="little-spacer-left"
     >
       foo
     </span>
@@ -20,19 +20,19 @@ exports[`should display a loader when checking 1`] = `
 </li>
 `;
 
-exports[`should display a loader when checking 2`] = `
+exports[`should display a loader when checking: loading 1`] = `
 <li
-  className=""
+  className="display-flex-center"
 >
   <Checkbox
     checked={false}
-    className="select-list-list-checkbox display-flex-center"
+    className="select-list-list-checkbox flex-1"
     loading={true}
     onCheck={[Function]}
     thirdState={false}
   >
     <span
-      className="little-spacer-left flex-1"
+      className="little-spacer-left"
     >
       foo
     </span>