diff --git a/src/App.js b/src/App.js index 6b7e0d8..c689580 100644 --- a/src/App.js +++ b/src/App.js @@ -21,6 +21,7 @@ class App extends Component { this.state.gridData = this.state.treeViewData; this.menuStateChange = this.menuStateChange.bind(this); this.onStatusChecked = this.onStatusChecked.bind(this); + this.state.toggleState = this.state.testResults?.reporterOptions?.expandResults; } getStatusList() { return statusList; @@ -230,6 +231,10 @@ class App extends Component { }); }; + onExpandToggle = toggleState => { + this.setState({ toggleState: toggleState }); + }; + render() { return (
@@ -248,12 +253,11 @@ class App extends Component { />
); diff --git a/src/App.test.js b/src/App.test.js index 5af7ac5..b417ed4 100644 --- a/src/App.test.js +++ b/src/App.test.js @@ -1,4 +1,3 @@ -import '@testing-library/jest-dom'; import React from 'react'; import App from './App'; import { render, fireEvent } from '@testing-library/react'; @@ -69,8 +68,11 @@ describe('Tree click', () => { container.querySelector('.sidenav').classList.contains('open'), ).toEqual(true); const elem = container.querySelectorAll('.nodeTitle'); + expect(container.querySelectorAll('.tabs')).toHaveLength(12); + expect(container.querySelectorAll('.tab-content')).toHaveLength(12); fireEvent.click(elem[1]); - expect(container.querySelector('.main')).toMatchSnapshot(); + expect(container.querySelectorAll('.tabs')).toHaveLength(11); + expect(container.querySelectorAll('.tab-content')).toHaveLength(11); }); }); @@ -90,3 +92,16 @@ describe('Status filter', () => { expect(container.querySelectorAll('.tab-content').length).toEqual(40); }); }); +describe('Toggle Button', () => { + test('Should fire event', () => { + window.resultData = data; + const { container } = render(); + expect( + container.querySelectorAll('.togglerCheckBox:checked'), + ).toHaveLength(0); + fireEvent.click(container.querySelector('#toggleButton')); + expect( + container.querySelectorAll('.togglerCheckBox:checked'), + ).toHaveLength(12); + }); +}); diff --git a/src/Components/FilterToggler/FilterToggler.css b/src/Components/FilterToggler/FilterToggler.css new file mode 100644 index 0000000..2584fd1 --- /dev/null +++ b/src/Components/FilterToggler/FilterToggler.css @@ -0,0 +1,3 @@ +.filterWrapper { + display: inline-block; +} diff --git a/src/Components/FilterToggler/FilterToggler.js b/src/Components/FilterToggler/FilterToggler.js index b100787..72881bb 100644 --- a/src/Components/FilterToggler/FilterToggler.js +++ b/src/Components/FilterToggler/FilterToggler.js @@ -1,6 +1,7 @@ import React from 'react'; import CheckBox from './CheckBox'; import PropTypes from 'prop-types'; +import './FilterToggler.css'; export default class FilterToggler extends React.Component { constructor(props) { super(props); @@ -35,7 +36,7 @@ export default class FilterToggler extends React.Component { render() { if (this.props.statusList && this.props.statusList.length > 0) { return ( -
+

Filter:{' '} {this.state.statusList.map(status => { diff --git a/src/Components/Grid/TabContent.js b/src/Components/Grid/TabContent.js index 5d32636..3cbfbed 100644 --- a/src/Components/Grid/TabContent.js +++ b/src/Components/Grid/TabContent.js @@ -19,6 +19,7 @@ class TabContent extends Component { expandResults={this.props.expandResults} item={this.props.item} onShowModel={this.props.onShowModel} + key={`${this.props.item.id}${this.props.expandResults}`} /> ); } else { diff --git a/src/Components/Main/Main.js b/src/Components/Main/Main.js index 00f2076..cfee203 100644 --- a/src/Components/Main/Main.js +++ b/src/Components/Main/Main.js @@ -7,6 +7,7 @@ import Modal from './../Modal/Modal'; import PropTypes from 'prop-types'; import Information from '../Information/Information'; import FilterToggler from '../FilterToggler/FilterToggler'; +import { ToggleButton } from '../ToggleButton/ToggleButton'; class Main extends Component { constructor(props) { @@ -59,15 +60,23 @@ class Main extends Component { this.setState({ showModel: true }); this.setState({ modelData: item }); } + render() { return (

- +
+ + +
*, +.checkbox-switch > *:after, +.checkbox-switch > *:before { + box-sizing: border-box; +} + +.checkbox-switch { + margin: 0; + padding: 0; + border: 0; + margin-bottom: 2.2652rem; +} +.checkbox-switch:after { + content: ''; + display: table; + clear: both; +} +.checkbox-switch .checkbox-right { + float: right; + padding-top: 12px; +} +.checkbox-switch legend { + margin: 0; + padding: 0; + display: block; + font-weight: 600; + font-size: 1.2rem; + line-height: 1.3rem; + margin-bottom: 1.618rem; +} +.checkbox-switch legend.legend-left { + margin: 0 1.618rem 0 0; + float: left; +} +.checkbox-switch input[type='checkbox'] + label { + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + line-height: 1.3rem; +} +@media screen and (max-width: 614px) { + .checkbox-switch input[type='checkbox'] + label { + padding-bottom: 5px; + } +} +.checkbox-switch input[type='checkbox'] + label:before { + width: 2.3rem; + height: 1.3rem; + content: '•'; + -webkit-transition: all 0.2s ease; + transition: all 0.2s ease; + text-align: left; + font-size: 2.5rem; + line-height: 0.9rem; + float: left; + overflow: hidden; + color: black; + border: 0.1949902505rem solid black; + border-radius: 0.65rem; + margin: auto 0; + border-color: gray; + background: gray; + color: white; +} + +@media screen and (min-width: 25rem) { + .checkbox-switch input[type='checkbox'] + label:before { + margin-right: 0.5rem; + } +} +.checkbox-switch input[type='checkbox'] + label:after { + display: none; +} +@media screen and (min-width: 25rem) { + .checkbox-switch input[type='checkbox'] + label:after { + width: 1.75rem; + display: inline-block; + } +} +.checkbox-switch input[type='checkbox']:checked + label:before { + border-color: #1a252f; + background: #1a252f; + text-align: right; + color: white; +} + +.checkbox-switch { + font-size: 16px; + line-height: 1.618; + color: black; +} +@media screen and (min-width: 25rem) { + .checkbox-switch { + font-size: 18px; + } +} diff --git a/src/Components/ToggleButton/ToggleButton.js b/src/Components/ToggleButton/ToggleButton.js new file mode 100644 index 0000000..833bfe6 --- /dev/null +++ b/src/Components/ToggleButton/ToggleButton.js @@ -0,0 +1,35 @@ +import React, { useState } from 'react'; +import './ToggleButton.css'; +import PropTypes from 'prop-types'; +export const ToggleButton = ({ checkedText, onToggle, toggleState }) => { + const [toggle, setToggle] = useState(toggleState ?? false); + function toggleButton() { + if (!toggle) { + setToggle(true); + onToggle(true); + } else { + setToggle(false); + onToggle(false); + } + } + return ( + + toggleButton()} + /> + + + ); +}; +ToggleButton.propTypes = { + onToggle: PropTypes.func.isRequired, + checkedText: PropTypes.string, + toggleState: PropTypes.bool, +}; +export default ToggleButton; diff --git a/src/Components/ToggleButton/ToggleButton.test.js b/src/Components/ToggleButton/ToggleButton.test.js new file mode 100644 index 0000000..531af54 --- /dev/null +++ b/src/Components/ToggleButton/ToggleButton.test.js @@ -0,0 +1,49 @@ +import React from 'react'; +import ToggleButton from './ToggleButton'; +import { render, fireEvent } from '@testing-library/react'; +describe('Toggle button dom', () => { + test('Should contain intial value', () => { + const { container } = render( + , + ); + expect(container.querySelector('label')).toHaveTextContent('Expand'); + expect(container.querySelector('input')).not.toBeChecked(); + }); +}); +describe('Toggle button fire event', () => { + test('Should toggle', () => { + const { container } = render( + , + ); + fireEvent.click(container.querySelector('input')); + expect(container.querySelector('input')).toBeChecked(); + fireEvent.click(container.querySelector('input')); + expect(container.querySelector('input')).not.toBeChecked(); + }); + + test('Should toggle', () => { + const mockCallback = jest.fn(); + const { container } = render( + , + ); + fireEvent.click(container.querySelector('input')); + expect(mockCallback).toBeCalledTimes(1); + expect(mockCallback).toBeCalledWith(true); + mockCallback.mockReset(); + fireEvent.click(container.querySelector('input')); + expect(mockCallback).toBeCalledTimes(1); + expect(mockCallback).toBeCalledWith(false); + }); +}); diff --git a/src/Components/TreeView/ParentNode.js b/src/Components/TreeView/ParentNode.js index 20e0575..e173546 100644 --- a/src/Components/TreeView/ParentNode.js +++ b/src/Components/TreeView/ParentNode.js @@ -6,8 +6,6 @@ export default class ParentNode extends Component { super(props); this.state = { item: this.props.item, - caretClass: this.props.expandMenuItems ? 'caret-down' : '', - nestedClass: this.props.expandMenuItems ? 'active' : '', }; } onTreeCaretClick(e) { @@ -17,11 +15,19 @@ export default class ParentNode extends Component { e.target.classList.toggle('caret-down'); } + getCaretClassName() { + return this.props.expandMenuItems ? 'caret-down' : ''; + } + + getNestedClassName() { + return this.props.expandMenuItems ? 'active' : ''; + } + render() { return (
  • { return this.onTreeCaretClick(event); }} @@ -34,7 +40,7 @@ export default class ParentNode extends Component { > {this.props.item.title} -
      +
        -
        - - - 7 - - - Passed - - - - - 0 - - - Pending - - - - - 2 - - - Failed - - - - - 9 - - - Total - - - - - 0 - - - Todo - - -
        -
        -
        - Start Time -
        -
        -
        - Interupted -
        -
        - No -
        -
        -
        -

        - Filter: - - - - - -

        -
        -
        -
        - Test case -
        -
        - Result -
        -
        - Time -
        -
        - Additonal information -
        -
        -
        - - -
        -
        - - -
        -
        - - -
        -
        - should pass -
        -
        - - - - - - passed -
        -
        - 2 ms -
        -
        -
        - - - - - - - Info -
        -
        -
        - - -
        -
        - - -
        -
        - should pass -
        -
        - - - - - - passed -
        -
        -
        -
        - - - - - - - Info -
        -
        -
        -
        -
        -
        -
        - - -
        -
        - - -
        -
        - should pass -
        -
        - - - - - - passed -
        -
        -
        -
        - - - - - - - Info -
        -
        -
        - should fail -
        -
        - - - - - - failed -
        -
        - 110 ms -
        -
        -
        - - - - - - - Info -
        -
        -
        -
        -
        -
        -
        - - -
        -
        - should be around -
        -
        - - - - - - passed -
        -
        -
        -
        - - - - - - - Info -
        -
        -
        - - -
        -
        - should pass -
        -
        - - - - - - passed -
        -
        -
        -
        - - - - - - - Info -
        -
        -
        - should fail -
        -
        - - - - - - failed -
        -
        -
        -
        - - - - - - - Info -
        -
        -
        -
        -
        - should be around too -
        -
        - - - - - - passed -
        -
        -
        -
        - - - - - - - Info -
        -
        -
        -
        -
        - - -
        -
        - - -
        -
        - should pass -
        -
        - - - - - - passed -
        -
        -
        -
        - - - - - - - Info -
        -
        -
        -
        -
        -
        -
        -
        -
        -
        -
        -
        -
        -`;