systemview 1.0.1 → 1.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/api/Connections.js +36 -0
- package/api/connections.txt +1 -0
- package/api/index.js +78 -0
- package/babel.config.js +12 -0
- package/cli/launchApp.js +0 -0
- package/cli/runTest.js +0 -0
- package/cli/utils/cli.js +48 -0
- package/cli/utils/init.js +17 -0
- package/cli/utils/log.js +11 -0
- package/package.json +6 -3
- package/plugin/SystemViewModule.js +97 -0
- package/plugin/getAllTest.js +21 -0
- package/plugin/index.js +40 -0
- package/src/App.css +38 -0
- package/src/App.js +30 -0
- package/src/ServiceContext.js +9 -0
- package/src/assets/arrow.png +0 -0
- package/src/assets/check.svg +1 -0
- package/src/assets/clear.png +0 -0
- package/src/assets/edit.png +0 -0
- package/src/assets/error.svg +1 -0
- package/src/assets/eval-icon.svg +10 -0
- package/src/assets/expand-arrow.svg +41 -0
- package/src/assets/expand-button.svg +41 -0
- package/src/assets/fonts/FontsFree-Net-SFMono-Regular.ttf +0 -0
- package/src/assets/fonts/Malkor-Regular.ttf +0 -0
- package/src/assets/iconfinder-icon (1).svg +14 -0
- package/src/assets/iconfinder-icon.svg +14 -0
- package/src/assets/icons-save-60.png +0 -0
- package/src/assets/loading.gif +0 -0
- package/src/assets/missing-doc.png +0 -0
- package/src/assets/saved-doc.png +0 -0
- package/src/assets/sysly.png +0 -0
- package/src/assets/test-icon.svg +10 -0
- package/src/assets/test-missing.png +0 -0
- package/src/assets/test-saved.png +0 -0
- package/src/assets/x.svg +1 -0
- package/src/atoms/Button/Button.js +20 -0
- package/src/atoms/Button/Button.test.js +27 -0
- package/src/atoms/Button/__snapshots__/Button.test.js.snap +9 -0
- package/src/atoms/Button/styles.scss +35 -0
- package/src/atoms/Count/index.js +10 -0
- package/src/atoms/Count/styles.scss +25 -0
- package/src/atoms/DataTable/DataTable.js +27 -0
- package/src/atoms/DataTable/DataTable.test.js +55 -0
- package/src/atoms/DataTable/__snapshots__/DataTable.test.js.snap +36 -0
- package/src/atoms/DataTable/styles.scss +28 -0
- package/src/atoms/DescriptionBox/DescriptionBox.js +24 -0
- package/src/atoms/DescriptionBox/DescriptionBox.test.js +36 -0
- package/src/atoms/DescriptionBox/__snapshots__/DescriptionBox.test.js.snap +14 -0
- package/src/atoms/DescriptionBox/styles.scss +24 -0
- package/src/atoms/DescriptionText/DescriptionText.js +12 -0
- package/src/atoms/DescriptionText/DescriptionText.test.js +22 -0
- package/src/atoms/DescriptionText/styles.scss +10 -0
- package/src/atoms/DocsIcon/DocsIcon.js +20 -0
- package/src/atoms/DocsIcon/DocsIcon.test.js +23 -0
- package/src/atoms/DocsIcon/styles.scss +7 -0
- package/src/atoms/ExpandableIcon/ExpandableIcon.js +30 -0
- package/src/atoms/ExpandableIcon/ExpandableIcon.test.js +18 -0
- package/src/atoms/ExpandableIcon/styles.scss +5 -0
- package/src/atoms/JsonTextBox/JsonTextBox.js +61 -0
- package/src/atoms/JsonTextBox/JsonTextBox.test.js +0 -0
- package/src/atoms/JsonTextBox/styles.scss +41 -0
- package/src/atoms/Link/Link.js +17 -0
- package/src/atoms/Link/Link.test.js +33 -0
- package/src/atoms/Link/styles.scss +8 -0
- package/src/atoms/List/List.js +8 -0
- package/src/atoms/List/List.test.js +26 -0
- package/src/atoms/List/styles.scss +9 -0
- package/src/atoms/Markdown/Markdown.js +48 -0
- package/src/atoms/Markdown/styles.scss +414 -0
- package/src/atoms/RunTestIcon/index.js +41 -0
- package/src/atoms/RunTestIcon/styles.scss +16 -0
- package/src/atoms/SaveIcon/SaveIcon.js +6 -0
- package/src/atoms/SaveIcon/styles.scss +3 -0
- package/src/atoms/Selector/Selector.js +28 -0
- package/src/atoms/Selector/Selector.test.js +0 -0
- package/src/atoms/Selector/styles.scss +1 -0
- package/src/atoms/StatusIndicator/StatusIndicator.js +16 -0
- package/src/atoms/StatusIndicator/styles.scss +33 -0
- package/src/atoms/TestsIcon/TestsIcon.js +17 -0
- package/src/atoms/TestsIcon/TestsIcon.test.js +18 -0
- package/src/atoms/TestsIcon/styles.scss +0 -0
- package/src/atoms/Text/Text.js +8 -0
- package/src/atoms/Text/Text.test.js +21 -0
- package/src/atoms/Text/styles.scss +0 -0
- package/src/atoms/Textbox/Textbox.js +33 -0
- package/src/atoms/Textbox/Textbox.test.js +23 -0
- package/src/atoms/Textbox/styles.scss +14 -0
- package/src/atoms/Title/Title.js +12 -0
- package/src/atoms/Title/Title.test.js +0 -0
- package/src/atoms/Title/styles.scss +6 -0
- package/src/atoms/Toggle/Toggle.js +13 -0
- package/src/atoms/Toggle/Toggle.test.js +0 -0
- package/src/atoms/Toggle/styles.scss +62 -0
- package/src/atoms/TypeSelector/TypeSelector.js +28 -0
- package/src/atoms/TypeSelector/TypeSelector.test.js +0 -0
- package/src/atoms/TypeSelector/styles.scss +9 -0
- package/src/index.css +20 -0
- package/src/index.js +24 -0
- package/src/logo.svg +7 -0
- package/src/molecules/Args/Args.js +302 -0
- package/src/molecules/Args/Args.test.js +0 -0
- package/src/molecules/Args/styles.scss +166 -0
- package/src/molecules/AutoCompleteBox/AutoCompleteBox.js +101 -0
- package/src/molecules/AutoCompleteBox/AutoCompleteBox.test.js +0 -0
- package/src/molecules/AutoCompleteBox/styles.scss +35 -0
- package/src/molecules/DataTableForm/DataTableForm.js +167 -0
- package/src/molecules/DataTableForm/DataTableForm.test.js +0 -0
- package/src/molecules/DataTableForm/styles.scss +51 -0
- package/src/molecules/EditBox/EditBox.js +49 -0
- package/src/molecules/EditBox/EditBox.test.js +0 -0
- package/src/molecules/EditBox/styles.scss +38 -0
- package/src/molecules/ExpandableList/ExpandableList.js +26 -0
- package/src/molecules/ExpandableList/ExpandableList.test.js +33 -0
- package/src/molecules/ExpandableList/styles.scss +18 -0
- package/src/molecules/ExpandableSection/ExpandableSection.js +36 -0
- package/src/molecules/ExpandableSection/ExpandableSection.test.js +0 -0
- package/src/molecules/ExpandableSection/styles.scss +22 -0
- package/src/molecules/ServerModulesList/ServerModulesList.js +75 -0
- package/src/molecules/ServerModulesList/styles.scss +28 -0
- package/src/molecules/TargetSelector/TargetSelector.js +34 -0
- package/src/molecules/TargetSelector/TargetSelector.test.js +0 -0
- package/src/molecules/TargetSelector/styles.scss +0 -0
- package/src/molecules/TestCaption/TestCaption.js +26 -0
- package/src/molecules/TestCaption/TestCaption.test.js +0 -0
- package/src/molecules/TestCaption/styles.scss +40 -0
- package/src/molecules/TestSummary/index.js +212 -0
- package/src/molecules/TestSummary/styles.scss +83 -0
- package/src/molecules/TextWith2Links/TextWith2Links.js +10 -0
- package/src/molecules/TextWith2Links/styles.scss +0 -0
- package/src/molecules/ValidationInput/ValidationInput.js +64 -0
- package/src/molecules/ValidationInput/ValidationInput.test.js +0 -0
- package/src/molecules/ValidationInput/ValidationMessages.js +178 -0
- package/src/molecules/ValidationInput/ValidationOptions.js +113 -0
- package/src/molecules/ValidationInput/styles.scss +74 -0
- package/src/molecules/ValidationInput/validator.js +244 -0
- package/src/organisms/Documentation/Documentation.js +128 -0
- package/src/organisms/Documentation/Documentation.test.js +0 -0
- package/src/organisms/Documentation/styles.scss +22 -0
- package/src/organisms/MultiTestSection/MultiTestSection.js +85 -0
- package/src/organisms/MultiTestSection/MultiTestSection.test.js +0 -0
- package/src/organisms/MultiTestSection/styles.scss +22 -0
- package/src/organisms/SavedTests/SavedTests.js +209 -0
- package/src/organisms/SavedTests/SavedTests.test.js +0 -0
- package/src/organisms/SavedTests/styles.scss +76 -0
- package/src/organisms/SavedTests/transformTests.js +51 -0
- package/src/organisms/ScratchPad/ScratchPad.js +128 -0
- package/src/organisms/ScratchPad/ScratchPad.test.js +0 -0
- package/src/organisms/ScratchPad/styles.scss +100 -0
- package/src/organisms/SystemNavigator/SystemNavigator.js +148 -0
- package/src/organisms/SystemNavigator/SystemNavigator.test.js +24 -0
- package/src/organisms/SystemNavigator/styles.scss +38 -0
- package/src/organisms/TestContainer/TestContainer.js +72 -0
- package/src/organisms/TestContainer/TestContainer.test.js +0 -0
- package/src/organisms/TestContainer/styles.scss +20 -0
- package/src/organisms/TestPanel/AfterTest/AfterTest.js +16 -0
- package/src/organisms/TestPanel/AfterTest/AfterTest.test.js +0 -0
- package/src/organisms/TestPanel/AfterTest/styles.scss +0 -0
- package/src/organisms/TestPanel/BeforeTest/BeforeTest.js +16 -0
- package/src/organisms/TestPanel/BeforeTest/BeforeTest.test.js +0 -0
- package/src/organisms/TestPanel/BeforeTest/styles.scss +0 -0
- package/src/organisms/TestPanel/Evaluations.js +369 -0
- package/src/organisms/TestPanel/EventsTest/EventsTest.js +19 -0
- package/src/organisms/TestPanel/EventsTest/styles.scss +0 -0
- package/src/organisms/TestPanel/MainTest/MainTest.js +20 -0
- package/src/organisms/TestPanel/MainTest/MainTest.test.js +0 -0
- package/src/organisms/TestPanel/MainTest/styles.scss +143 -0
- package/src/organisms/TestPanel/TestPanel.js +170 -0
- package/src/organisms/TestPanel/TestPanel.test.js +0 -0
- package/src/organisms/TestPanel/components/Argument.class.js +94 -0
- package/src/organisms/TestPanel/components/FullTestController.js +78 -0
- package/src/organisms/TestPanel/components/Test.class.js +162 -0
- package/src/organisms/TestPanel/components/TestController.class.js +135 -0
- package/src/organisms/TestPanel/components/test-helpers.js +109 -0
- package/src/organisms/TestPanel/styles.scss +45 -0
- package/src/pages/SystemView/SystemView.js +68 -0
- package/src/pages/SystemView/styles.scss +81 -0
- package/src/reportWebVitals.js +13 -0
- package/src/sass/bootstrap/_alert.scss +51 -0
- package/src/sass/bootstrap/_badge.scss +47 -0
- package/src/sass/bootstrap/_breadcrumb.scss +38 -0
- package/src/sass/bootstrap/_button-group.scss +166 -0
- package/src/sass/bootstrap/_buttons.scss +143 -0
- package/src/sass/bootstrap/_card.scss +270 -0
- package/src/sass/bootstrap/_carousel.scss +191 -0
- package/src/sass/bootstrap/_close.scss +34 -0
- package/src/sass/bootstrap/_code.scss +56 -0
- package/src/sass/bootstrap/_custom-forms.scss +297 -0
- package/src/sass/bootstrap/_dropdown.scss +131 -0
- package/src/sass/bootstrap/_forms.scss +333 -0
- package/src/sass/bootstrap/_functions.scss +86 -0
- package/src/sass/bootstrap/_grid.scss +52 -0
- package/src/sass/bootstrap/_images.scss +42 -0
- package/src/sass/bootstrap/_input-group.scss +159 -0
- package/src/sass/bootstrap/_jumbotron.scss +16 -0
- package/src/sass/bootstrap/_list-group.scss +115 -0
- package/src/sass/bootstrap/_media.scss +8 -0
- package/src/sass/bootstrap/_mixins.scss +42 -0
- package/src/sass/bootstrap/_modal.scss +168 -0
- package/src/sass/bootstrap/_nav.scss +118 -0
- package/src/sass/bootstrap/_navbar.scss +311 -0
- package/src/sass/bootstrap/_pagination.scss +77 -0
- package/src/sass/bootstrap/_popover.scss +183 -0
- package/src/sass/bootstrap/_print.scss +124 -0
- package/src/sass/bootstrap/_progress.scss +33 -0
- package/src/sass/bootstrap/_reboot.scss +482 -0
- package/src/sass/bootstrap/_root.scss +19 -0
- package/src/sass/bootstrap/_tables.scss +180 -0
- package/src/sass/bootstrap/_tooltip.scss +115 -0
- package/src/sass/bootstrap/_transitions.scss +36 -0
- package/src/sass/bootstrap/_type.scss +125 -0
- package/src/sass/bootstrap/_utilities.scss +14 -0
- package/src/sass/bootstrap/_variables.scss +894 -0
- package/src/sass/bootstrap/bootstrap-grid.scss +32 -0
- package/src/sass/bootstrap/bootstrap-reboot.scss +12 -0
- package/src/sass/bootstrap/bootstrap.scss +42 -0
- package/src/sass/bootstrap/mixins/_alert.scss +13 -0
- package/src/sass/bootstrap/mixins/_background-variant.scss +21 -0
- package/src/sass/bootstrap/mixins/_badge.scss +12 -0
- package/src/sass/bootstrap/mixins/_border-radius.scss +35 -0
- package/src/sass/bootstrap/mixins/_box-shadow.scss +5 -0
- package/src/sass/bootstrap/mixins/_breakpoints.scss +123 -0
- package/src/sass/bootstrap/mixins/_buttons.scss +109 -0
- package/src/sass/bootstrap/mixins/_caret.scss +65 -0
- package/src/sass/bootstrap/mixins/_clearfix.scss +7 -0
- package/src/sass/bootstrap/mixins/_float.scss +11 -0
- package/src/sass/bootstrap/mixins/_forms.scss +137 -0
- package/src/sass/bootstrap/mixins/_gradients.scss +45 -0
- package/src/sass/bootstrap/mixins/_grid-framework.scss +67 -0
- package/src/sass/bootstrap/mixins/_grid.scss +52 -0
- package/src/sass/bootstrap/mixins/_hover.scss +39 -0
- package/src/sass/bootstrap/mixins/_image.scss +36 -0
- package/src/sass/bootstrap/mixins/_list-group.scss +21 -0
- package/src/sass/bootstrap/mixins/_lists.scss +7 -0
- package/src/sass/bootstrap/mixins/_nav-divider.scss +10 -0
- package/src/sass/bootstrap/mixins/_navbar-align.scss +10 -0
- package/src/sass/bootstrap/mixins/_pagination.scss +22 -0
- package/src/sass/bootstrap/mixins/_reset-text.scss +17 -0
- package/src/sass/bootstrap/mixins/_resize.scss +6 -0
- package/src/sass/bootstrap/mixins/_screen-reader.scss +35 -0
- package/src/sass/bootstrap/mixins/_size.scss +6 -0
- package/src/sass/bootstrap/mixins/_table-row.scss +30 -0
- package/src/sass/bootstrap/mixins/_text-emphasis.scss +14 -0
- package/src/sass/bootstrap/mixins/_text-hide.scss +9 -0
- package/src/sass/bootstrap/mixins/_text-truncate.scss +8 -0
- package/src/sass/bootstrap/mixins/_transition.scss +9 -0
- package/src/sass/bootstrap/mixins/_visibility.scss +7 -0
- package/src/sass/bootstrap/utilities/_align.scss +8 -0
- package/src/sass/bootstrap/utilities/_background.scss +19 -0
- package/src/sass/bootstrap/utilities/_borders.scss +59 -0
- package/src/sass/bootstrap/utilities/_clearfix.scss +3 -0
- package/src/sass/bootstrap/utilities/_display.scss +38 -0
- package/src/sass/bootstrap/utilities/_embed.scss +52 -0
- package/src/sass/bootstrap/utilities/_flex.scss +46 -0
- package/src/sass/bootstrap/utilities/_float.scss +9 -0
- package/src/sass/bootstrap/utilities/_position.scss +36 -0
- package/src/sass/bootstrap/utilities/_screenreaders.scss +11 -0
- package/src/sass/bootstrap/utilities/_sizing.scss +12 -0
- package/src/sass/bootstrap/utilities/_spacing.scss +51 -0
- package/src/sass/bootstrap/utilities/_text.scss +52 -0
- package/src/sass/bootstrap/utilities/_visibility.scss +11 -0
- package/src/setupTests.js +5 -0
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import "./styles.scss";
|
|
3
|
+
import CLEAR_ICON from "../../assets/clear.png";
|
|
4
|
+
|
|
5
|
+
const Button = ({ children, submit }) => {
|
|
6
|
+
return (
|
|
7
|
+
<button className="button" onClick={submit}>
|
|
8
|
+
{children}
|
|
9
|
+
</button>
|
|
10
|
+
);
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
export function ClearButton({ onClick }) {
|
|
14
|
+
return (
|
|
15
|
+
<span className={`clear-button btn`} onClick={onClick}>
|
|
16
|
+
<img src={CLEAR_ICON} alt="clear" />
|
|
17
|
+
</span>
|
|
18
|
+
);
|
|
19
|
+
}
|
|
20
|
+
export default Button;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/* eslint-disable jest/valid-expect */
|
|
2
|
+
import React from "react";
|
|
3
|
+
import ReactDom from "react-dom";
|
|
4
|
+
import { render, cleanup } from "@testing-library/react";
|
|
5
|
+
import "@testing-library/jest-dom/extend-expect";
|
|
6
|
+
import renderer from "react-test-renderer";
|
|
7
|
+
import Button from "./Button";
|
|
8
|
+
|
|
9
|
+
afterEach(cleanup);
|
|
10
|
+
|
|
11
|
+
describe("<Button/>", () => {
|
|
12
|
+
it("renders without crashing", () => {
|
|
13
|
+
const div = document.createElement("div");
|
|
14
|
+
ReactDom.render(<Button />, div);
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
it("renders an <button></button> element with text and class button", () => {
|
|
18
|
+
const { getByRole } = render(<Button>test</Button>);
|
|
19
|
+
expect(getByRole("button")).toHaveTextContent("test");
|
|
20
|
+
expect(getByRole("button")).toHaveClass("button");
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
it("should match snapshot", () => {
|
|
24
|
+
const tree = renderer.create(<Button>test</Button>).toJSON();
|
|
25
|
+
expect(tree).toMatchSnapshot();
|
|
26
|
+
});
|
|
27
|
+
});
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
.button {
|
|
2
|
+
border: 1px solid;
|
|
3
|
+
background: linear-gradient(to bottom, #f9f9f9 5%, #e9e9e9 100%);
|
|
4
|
+
border-radius: 3px;
|
|
5
|
+
display: inline-block;
|
|
6
|
+
cursor: pointer;
|
|
7
|
+
color: #666666;
|
|
8
|
+
font-family: Arial;
|
|
9
|
+
font-size: 15px;
|
|
10
|
+
font-weight: bold;
|
|
11
|
+
padding: 6px 24px;
|
|
12
|
+
text-decoration: none;
|
|
13
|
+
text-shadow: 0px 1px 0px #ffffff;
|
|
14
|
+
margin: 4px 10px;
|
|
15
|
+
&:hover {
|
|
16
|
+
background: linear-gradient(to bottom, #e9e9e9 5%, #f9f9f9 100%);
|
|
17
|
+
background-color: #e9e9e9;
|
|
18
|
+
}
|
|
19
|
+
&:active {
|
|
20
|
+
position: relative;
|
|
21
|
+
top: 1px;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
.clear-button {
|
|
25
|
+
background: #607d8b;
|
|
26
|
+
padding: 0px 8px;
|
|
27
|
+
color: white;
|
|
28
|
+
border-radius: 17px;
|
|
29
|
+
font-weight: 600;
|
|
30
|
+
align-self: flex-end;
|
|
31
|
+
& > img {
|
|
32
|
+
width: 13px;
|
|
33
|
+
padding-top: 2px;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import "./styles.scss";
|
|
2
|
+
const CLASS_NAME = "count";
|
|
3
|
+
|
|
4
|
+
export default function Count({ count, stat, type }) {
|
|
5
|
+
return (
|
|
6
|
+
<span className={`${CLASS_NAME} ${CLASS_NAME}__${type}`}>
|
|
7
|
+
{count} {stat && <span className={`${CLASS_NAME}__stat`}>{stat}</span>}
|
|
8
|
+
</span>
|
|
9
|
+
);
|
|
10
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
.count {
|
|
2
|
+
background: gainsboro;
|
|
3
|
+
padding: 0px 9px;
|
|
4
|
+
border-radius: 12px;
|
|
5
|
+
font-size: 14px;
|
|
6
|
+
font-weight: bold;
|
|
7
|
+
color: #777777 !important;
|
|
8
|
+
margin-left: 5px;
|
|
9
|
+
display: inline-block;
|
|
10
|
+
&__stat {
|
|
11
|
+
padding: 3px 0;
|
|
12
|
+
display: inline-block;
|
|
13
|
+
}
|
|
14
|
+
&__error {
|
|
15
|
+
background: #ffc4b1;
|
|
16
|
+
color: #f44336 !important;
|
|
17
|
+
}
|
|
18
|
+
&__caution {
|
|
19
|
+
color: #bcb047 !important;
|
|
20
|
+
}
|
|
21
|
+
&__passed {
|
|
22
|
+
background: #6fc878;
|
|
23
|
+
color: #ffffff !important;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import "./styles.scss";
|
|
3
|
+
|
|
4
|
+
const DataTable = ({ headers = [], table = [], tableClassName }) => {
|
|
5
|
+
return (
|
|
6
|
+
<table className={`data-table ${tableClassName}`}>
|
|
7
|
+
<thead>
|
|
8
|
+
<tr>
|
|
9
|
+
{headers.map(({ name }, i) => (
|
|
10
|
+
<th key={i}>{name}</th>
|
|
11
|
+
))}
|
|
12
|
+
</tr>
|
|
13
|
+
</thead>
|
|
14
|
+
<tbody>
|
|
15
|
+
{table.map((row, i) => (
|
|
16
|
+
<tr key={i}>
|
|
17
|
+
{row.map((value, i) => (
|
|
18
|
+
<td key={i}>{value}</td>
|
|
19
|
+
))}
|
|
20
|
+
</tr>
|
|
21
|
+
))}
|
|
22
|
+
</tbody>
|
|
23
|
+
</table>
|
|
24
|
+
);
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
export default DataTable;
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/* eslint-disable jest/valid-expect */
|
|
2
|
+
import React from "react";
|
|
3
|
+
import ReactDom from "react-dom";
|
|
4
|
+
import { render, cleanup } from "@testing-library/react";
|
|
5
|
+
import "@testing-library/jest-dom/extend-expect";
|
|
6
|
+
import renderer from "react-test-renderer";
|
|
7
|
+
import DataTable from "./DataTable";
|
|
8
|
+
|
|
9
|
+
afterEach(cleanup);
|
|
10
|
+
|
|
11
|
+
describe("<DataTable/>", () => {
|
|
12
|
+
it("renders without crashing", () => {
|
|
13
|
+
const div = document.createElement("div");
|
|
14
|
+
ReactDom.render(<DataTable />, div);
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
it("renders an table element with text and class button", () => {
|
|
18
|
+
const { getByRole } = render(<DataTable />);
|
|
19
|
+
expect(getByRole("table")).toHaveClass("data-table");
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
it("renders content correctly", () => {
|
|
23
|
+
const headers = [{ name: "column 1" }, { name: "column 2" }];
|
|
24
|
+
const data = [
|
|
25
|
+
["r1c1", "r1c2"],
|
|
26
|
+
["r2c1", "r2c2"],
|
|
27
|
+
];
|
|
28
|
+
const { getByRole, getAllByRole } = render(
|
|
29
|
+
<DataTable tableClassName={"test"} headers={headers} table={data} />
|
|
30
|
+
);
|
|
31
|
+
|
|
32
|
+
expect(getByRole("table")).toHaveClass("data-table");
|
|
33
|
+
expect(getByRole("table")).toHaveClass("test");
|
|
34
|
+
expect(getAllByRole("columnheader")).toHaveLength(headers.length);
|
|
35
|
+
expect(getAllByRole("columnheader")[0]).toHaveTextContent(headers[0].name);
|
|
36
|
+
expect(getAllByRole("columnheader")[1]).toHaveTextContent(headers[1].name);
|
|
37
|
+
expect(getAllByRole("cell")).toHaveLength(data.length * headers.length);
|
|
38
|
+
expect(getAllByRole("cell")[0]).toHaveTextContent(data[0][0]);
|
|
39
|
+
expect(getAllByRole("cell")[1]).toHaveTextContent(data[0][1]);
|
|
40
|
+
expect(getAllByRole("cell")[2]).toHaveTextContent(data[1][0]);
|
|
41
|
+
expect(getAllByRole("cell")[3]).toHaveTextContent(data[1][1]);
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
it("should match snapshot", () => {
|
|
45
|
+
const headers = [{ name: "column 1" }, { name: "column 2" }];
|
|
46
|
+
const data = [
|
|
47
|
+
["r1c1", "r1c2"],
|
|
48
|
+
["r2c1", "r2c2"],
|
|
49
|
+
];
|
|
50
|
+
const tree = renderer
|
|
51
|
+
.create(<DataTable tableClassName={"test"} headers={headers} table={data} />)
|
|
52
|
+
.toJSON();
|
|
53
|
+
expect(tree).toMatchSnapshot();
|
|
54
|
+
});
|
|
55
|
+
});
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
|
2
|
+
|
|
3
|
+
exports[`<DataTable/> should match snapshot 1`] = `
|
|
4
|
+
<table
|
|
5
|
+
className="data-table test"
|
|
6
|
+
>
|
|
7
|
+
<thead>
|
|
8
|
+
<tr>
|
|
9
|
+
<th>
|
|
10
|
+
column 1
|
|
11
|
+
</th>
|
|
12
|
+
<th>
|
|
13
|
+
column 2
|
|
14
|
+
</th>
|
|
15
|
+
</tr>
|
|
16
|
+
</thead>
|
|
17
|
+
<tbody>
|
|
18
|
+
<tr>
|
|
19
|
+
<td>
|
|
20
|
+
r1c1
|
|
21
|
+
</td>
|
|
22
|
+
<td>
|
|
23
|
+
r1c2
|
|
24
|
+
</td>
|
|
25
|
+
</tr>
|
|
26
|
+
<tr>
|
|
27
|
+
<td>
|
|
28
|
+
r2c1
|
|
29
|
+
</td>
|
|
30
|
+
<td>
|
|
31
|
+
r2c2
|
|
32
|
+
</td>
|
|
33
|
+
</tr>
|
|
34
|
+
</tbody>
|
|
35
|
+
</table>
|
|
36
|
+
`;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
.data-table {
|
|
2
|
+
width: 100%;
|
|
3
|
+
margin: 5px 0;
|
|
4
|
+
background-color: #ffffff;
|
|
5
|
+
border-collapse: collapse;
|
|
6
|
+
color: #000000;
|
|
7
|
+
& td,
|
|
8
|
+
& th {
|
|
9
|
+
border-width: 1px;
|
|
10
|
+
border-color: #bfbfbe;
|
|
11
|
+
border-style: solid;
|
|
12
|
+
padding: 5px;
|
|
13
|
+
font-weight: 300;
|
|
14
|
+
}
|
|
15
|
+
& th {
|
|
16
|
+
font-weight: bold;
|
|
17
|
+
font-size: 15px;
|
|
18
|
+
color: #41937a;
|
|
19
|
+
padding: 6px;
|
|
20
|
+
}
|
|
21
|
+
& td {
|
|
22
|
+
font-family: monospace;
|
|
23
|
+
font-size: 14px;
|
|
24
|
+
}
|
|
25
|
+
& thead {
|
|
26
|
+
background-color: #dadada;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import "./styles.scss";
|
|
3
|
+
|
|
4
|
+
const DescriptionBox = ({ text, setValue }) => {
|
|
5
|
+
return (
|
|
6
|
+
<div className="description-box">
|
|
7
|
+
<textarea
|
|
8
|
+
className="description-box__textbox"
|
|
9
|
+
name="description-box"
|
|
10
|
+
id="description-box"
|
|
11
|
+
value={text}
|
|
12
|
+
onChange={
|
|
13
|
+
setValue
|
|
14
|
+
? (e) => {
|
|
15
|
+
setValue(e.target.value);
|
|
16
|
+
}
|
|
17
|
+
: null
|
|
18
|
+
}
|
|
19
|
+
></textarea>
|
|
20
|
+
</div>
|
|
21
|
+
);
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
export default DescriptionBox;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/* eslint-disable jest/valid-expect */
|
|
2
|
+
import React from "react";
|
|
3
|
+
import ReactDom from "react-dom";
|
|
4
|
+
import { render, cleanup, screen } from "@testing-library/react";
|
|
5
|
+
import userEvent from "@testing-library/user-event";
|
|
6
|
+
import "@testing-library/jest-dom/extend-expect";
|
|
7
|
+
import renderer from "react-test-renderer";
|
|
8
|
+
import DescriptionBox from "./DescriptionBox";
|
|
9
|
+
|
|
10
|
+
afterEach(cleanup);
|
|
11
|
+
|
|
12
|
+
describe("<DescriptionBox/>", () => {
|
|
13
|
+
it("renders without crashing", () => {
|
|
14
|
+
const div = document.createElement("div");
|
|
15
|
+
ReactDom.render(<DescriptionBox />, div);
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
it("apply text using the text prop", () => {
|
|
19
|
+
const { getByRole } = render(<DescriptionBox text={"test"} />);
|
|
20
|
+
expect(getByRole("textbox")).toHaveTextContent("test");
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
it("take text from user input", () => {
|
|
24
|
+
render(<DescriptionBox />);
|
|
25
|
+
|
|
26
|
+
screen.getByRole("textbox");
|
|
27
|
+
userEvent.type(screen.getByRole("textbox"), "user input");
|
|
28
|
+
|
|
29
|
+
expect(screen.getByRole("textbox")).toHaveValue("user input");
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
it("should match snapshot", () => {
|
|
33
|
+
const tree = renderer.create(<DescriptionBox />).toJSON();
|
|
34
|
+
expect(tree).toMatchSnapshot();
|
|
35
|
+
});
|
|
36
|
+
});
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
|
2
|
+
|
|
3
|
+
exports[`<DescriptionBox/> should match snapshot 1`] = `
|
|
4
|
+
<div
|
|
5
|
+
className="description-box"
|
|
6
|
+
>
|
|
7
|
+
<textarea
|
|
8
|
+
className="description-box__textbox"
|
|
9
|
+
id="description-box"
|
|
10
|
+
name="description-box"
|
|
11
|
+
onChange={null}
|
|
12
|
+
/>
|
|
13
|
+
</div>
|
|
14
|
+
`;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
.description-box {
|
|
2
|
+
width: 100%;
|
|
3
|
+
|
|
4
|
+
&__textbox {
|
|
5
|
+
min-width: 100%;
|
|
6
|
+
max-width: 100%;
|
|
7
|
+
min-height: 70vh;
|
|
8
|
+
background: white;
|
|
9
|
+
color: black;
|
|
10
|
+
font-size: 13px;
|
|
11
|
+
padding: 38px;
|
|
12
|
+
border-radius: 2px;
|
|
13
|
+
border: none;
|
|
14
|
+
outline: none;
|
|
15
|
+
resize: none;
|
|
16
|
+
// font-family: "SF Mono", "Ubuntu Mono", monospace;
|
|
17
|
+
font-size: 15px;
|
|
18
|
+
font-weight: 500;
|
|
19
|
+
|
|
20
|
+
// background: #3d8470;
|
|
21
|
+
// color: white;
|
|
22
|
+
border-bottom: 1px solid #07625a;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/* eslint-disable jest/valid-expect */
|
|
2
|
+
import React from "react";
|
|
3
|
+
import { expect } from "chai";
|
|
4
|
+
import { shallow, render } from "enzyme";
|
|
5
|
+
import Enzyme from "enzyme";
|
|
6
|
+
import Adapter from "enzyme-adapter-react-16";
|
|
7
|
+
import DescriptionText from "./DescriptionText";
|
|
8
|
+
|
|
9
|
+
Enzyme.configure({ adapter: new Adapter() });
|
|
10
|
+
|
|
11
|
+
describe("<DescriptionText/>", () => {
|
|
12
|
+
it("renders a p tag wrapped in a dive with class name description-text__text", () => {
|
|
13
|
+
const wrapper = shallow(<DescriptionText />);
|
|
14
|
+
expect(wrapper.find("div.description-text")).to.have.a.lengthOf(1);
|
|
15
|
+
expect(wrapper.find("p.description-text__text")).to.have.a.lengthOf(1);
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
it("use the tableClassName prop to add additional class name to table", () => {
|
|
19
|
+
const wrapper = shallow(<DescriptionText text={"test"} />);
|
|
20
|
+
expect(wrapper.find("p.description-text__text")).to.have.a.lengthOf(1);
|
|
21
|
+
});
|
|
22
|
+
});
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import "./styles.scss";
|
|
3
|
+
import savedDocImg from "../../assets/saved-doc.png";
|
|
4
|
+
import missingDocImg from "../../assets/missing-doc.png";
|
|
5
|
+
|
|
6
|
+
const DocIcon = ({ isSaved }) => {
|
|
7
|
+
return (
|
|
8
|
+
<>
|
|
9
|
+
<div className={`doc-icon`}>
|
|
10
|
+
<img
|
|
11
|
+
className={`doc-icon__img`}
|
|
12
|
+
src={isSaved ? savedDocImg : missingDocImg}
|
|
13
|
+
alt={isSaved ? "Saved Doc" : "Missing Doc"}
|
|
14
|
+
/>
|
|
15
|
+
</div>
|
|
16
|
+
</>
|
|
17
|
+
);
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
export default DocIcon;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/* eslint-disable jest/valid-expect */
|
|
2
|
+
import React from "react";
|
|
3
|
+
import ReactDom from "react-dom";
|
|
4
|
+
import { render, cleanup, screen } from "@testing-library/react";
|
|
5
|
+
import "@testing-library/jest-dom/extend-expect";
|
|
6
|
+
import DocsIcon from "./DocsIcon";
|
|
7
|
+
|
|
8
|
+
const SAVED_DOC_ICON = "saved-doc.png";
|
|
9
|
+
|
|
10
|
+
afterEach(cleanup);
|
|
11
|
+
jest.mock("../../assets/saved-doc.png", () => SAVED_DOC_ICON);
|
|
12
|
+
|
|
13
|
+
describe("<DocsIcon/>", () => {
|
|
14
|
+
it("renders without crashing", () => {
|
|
15
|
+
const div = document.createElement("div");
|
|
16
|
+
ReactDom.render(<DocsIcon />, div);
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
it("renders saved-doc image if isSaved prop is true", () => {
|
|
20
|
+
const { getByRole } = render(<DocsIcon isSaved={true} />);
|
|
21
|
+
expect(getByRole("img")).toHaveAttribute("src", SAVED_DOC_ICON);
|
|
22
|
+
});
|
|
23
|
+
});
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import "./styles.scss";
|
|
3
|
+
|
|
4
|
+
const ExpandIcon = ({
|
|
5
|
+
isOpen,
|
|
6
|
+
className = "",
|
|
7
|
+
onClick,
|
|
8
|
+
color = "black",
|
|
9
|
+
size: fontSize,
|
|
10
|
+
}) => {
|
|
11
|
+
return isOpen ? (
|
|
12
|
+
<span
|
|
13
|
+
style={{ color, fontSize }}
|
|
14
|
+
onClick={onClick}
|
|
15
|
+
className={`expandable-icon ${className}`}
|
|
16
|
+
>
|
|
17
|
+
▼
|
|
18
|
+
</span>
|
|
19
|
+
) : (
|
|
20
|
+
<span
|
|
21
|
+
style={{ color, fontSize }}
|
|
22
|
+
onClick={onClick}
|
|
23
|
+
className={`expandable-icon ${className}`}
|
|
24
|
+
>
|
|
25
|
+
►
|
|
26
|
+
</span>
|
|
27
|
+
);
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
export default ExpandIcon;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/* eslint-disable jest/valid-expect */
|
|
2
|
+
import React from "react";
|
|
3
|
+
|
|
4
|
+
import { expect } from "chai";
|
|
5
|
+
import { shallow } from "enzyme";
|
|
6
|
+
|
|
7
|
+
import ExpandableIcon from "./ExpandableIcon";
|
|
8
|
+
|
|
9
|
+
import Enzyme from "enzyme";
|
|
10
|
+
import Adapter from "enzyme-adapter-react-16";
|
|
11
|
+
Enzyme.configure({ adapter: new Adapter() });
|
|
12
|
+
|
|
13
|
+
describe("<ExpandableIcon/>", () => {
|
|
14
|
+
it("renders element with class expandable-list", () => {
|
|
15
|
+
const wrapper = shallow(<ExpandableIcon />);
|
|
16
|
+
expect(wrapper.find(".expandable-icon")).to.have.a.lengthOf(1);
|
|
17
|
+
});
|
|
18
|
+
});
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import React, { useState, useEffect } from "react";
|
|
2
|
+
import "./styles.scss";
|
|
3
|
+
|
|
4
|
+
const JsonTextBox = ({ obj, onSubmit, onCancel }) => {
|
|
5
|
+
const [prettyJson, setPrettyJson] = useState(JSON.stringify(obj, undefined, 2));
|
|
6
|
+
const [isJson, setIsJson] = useState(true);
|
|
7
|
+
const [json, setJson] = useState(obj);
|
|
8
|
+
|
|
9
|
+
const checkJsonString = (e) => {
|
|
10
|
+
const str = e.target.value;
|
|
11
|
+
setPrettyJson(str);
|
|
12
|
+
try {
|
|
13
|
+
JSON.parse(str);
|
|
14
|
+
} catch (e) {
|
|
15
|
+
setIsJson(false);
|
|
16
|
+
return false;
|
|
17
|
+
}
|
|
18
|
+
setIsJson(true);
|
|
19
|
+
setJson(JSON.parse(str));
|
|
20
|
+
return true;
|
|
21
|
+
};
|
|
22
|
+
const submit = () => {
|
|
23
|
+
if (isJson && typeof onSubmit === "function") onSubmit(json);
|
|
24
|
+
};
|
|
25
|
+
const cancel = () => {
|
|
26
|
+
setIsJson(false);
|
|
27
|
+
setJson(obj);
|
|
28
|
+
setPrettyJson(JSON.stringify(obj, undefined, 2));
|
|
29
|
+
if (typeof onCancel === "function") onCancel();
|
|
30
|
+
};
|
|
31
|
+
useEffect(() => {
|
|
32
|
+
setPrettyJson(JSON.stringify(obj, undefined, 2));
|
|
33
|
+
setIsJson(!!obj);
|
|
34
|
+
setJson(obj);
|
|
35
|
+
}, [obj]);
|
|
36
|
+
return (
|
|
37
|
+
<div className="json-text-box">
|
|
38
|
+
<div className="json-text-box__background-overlay"></div>
|
|
39
|
+
<textarea
|
|
40
|
+
className={`json-text-box__textbox json-text-box__textbox--is-json-${isJson}`}
|
|
41
|
+
name="json-text-box"
|
|
42
|
+
id="json-text-box"
|
|
43
|
+
value={prettyJson}
|
|
44
|
+
onChange={checkJsonString}
|
|
45
|
+
></textarea>
|
|
46
|
+
<div className="json-text-box__btn-container">
|
|
47
|
+
<span
|
|
48
|
+
onClick={submit}
|
|
49
|
+
className={`json-text-box__btn json-text-box__btn--is-json-${isJson}`}
|
|
50
|
+
>
|
|
51
|
+
{isJson ? "save" : "json"}
|
|
52
|
+
</span>
|
|
53
|
+
<span onClick={cancel} className={`json-text-box__btn json-text-box__btn--cancel`}>
|
|
54
|
+
x
|
|
55
|
+
</span>
|
|
56
|
+
</div>
|
|
57
|
+
</div>
|
|
58
|
+
);
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
export default JsonTextBox;
|
|
File without changes
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
.json-text-box {
|
|
2
|
+
position: relative;
|
|
3
|
+
&__textbox {
|
|
4
|
+
min-width: 100%;
|
|
5
|
+
max-width: 100%;
|
|
6
|
+
min-height: 100px;
|
|
7
|
+
border: 1px solid #8ea8eb;
|
|
8
|
+
margin-top: 6px;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
&__btn-container {
|
|
12
|
+
position: absolute;
|
|
13
|
+
right: 1px;
|
|
14
|
+
top: 9px;
|
|
15
|
+
}
|
|
16
|
+
&__btn {
|
|
17
|
+
padding: 2px 6px;
|
|
18
|
+
border-radius: 1px;
|
|
19
|
+
cursor: pointer;
|
|
20
|
+
margin-left: 4px;
|
|
21
|
+
font-family: system-ui;
|
|
22
|
+
font-weight: 500;
|
|
23
|
+
&:active {
|
|
24
|
+
position: relative;
|
|
25
|
+
top: 1px;
|
|
26
|
+
}
|
|
27
|
+
&--is-json-true {
|
|
28
|
+
background: #25d0a8;
|
|
29
|
+
color: white;
|
|
30
|
+
}
|
|
31
|
+
&--is-json-false {
|
|
32
|
+
background: #cfc2c2;
|
|
33
|
+
color: #8c3c3c;
|
|
34
|
+
text-decoration: line-through;
|
|
35
|
+
}
|
|
36
|
+
&--cancel {
|
|
37
|
+
background: #ff6b6b;
|
|
38
|
+
color: white;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import "./styles.scss";
|
|
3
|
+
import { Link } from "react-router-dom";
|
|
4
|
+
|
|
5
|
+
const myLink = ({ link, add_class, text, linkClick }) => {
|
|
6
|
+
const click = (e) => {
|
|
7
|
+
e.stopPropagation();
|
|
8
|
+
if (typeof linkClick === "function") linkClick();
|
|
9
|
+
};
|
|
10
|
+
return (
|
|
11
|
+
<Link className="link" to={link}>
|
|
12
|
+
{text}
|
|
13
|
+
</Link>
|
|
14
|
+
);
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
export default myLink;
|