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.
Files changed (263) hide show
  1. package/api/Connections.js +36 -0
  2. package/api/connections.txt +1 -0
  3. package/api/index.js +78 -0
  4. package/babel.config.js +12 -0
  5. package/cli/launchApp.js +0 -0
  6. package/cli/runTest.js +0 -0
  7. package/cli/utils/cli.js +48 -0
  8. package/cli/utils/init.js +17 -0
  9. package/cli/utils/log.js +11 -0
  10. package/package.json +6 -3
  11. package/plugin/SystemViewModule.js +97 -0
  12. package/plugin/getAllTest.js +21 -0
  13. package/plugin/index.js +40 -0
  14. package/src/App.css +38 -0
  15. package/src/App.js +30 -0
  16. package/src/ServiceContext.js +9 -0
  17. package/src/assets/arrow.png +0 -0
  18. package/src/assets/check.svg +1 -0
  19. package/src/assets/clear.png +0 -0
  20. package/src/assets/edit.png +0 -0
  21. package/src/assets/error.svg +1 -0
  22. package/src/assets/eval-icon.svg +10 -0
  23. package/src/assets/expand-arrow.svg +41 -0
  24. package/src/assets/expand-button.svg +41 -0
  25. package/src/assets/fonts/FontsFree-Net-SFMono-Regular.ttf +0 -0
  26. package/src/assets/fonts/Malkor-Regular.ttf +0 -0
  27. package/src/assets/iconfinder-icon (1).svg +14 -0
  28. package/src/assets/iconfinder-icon.svg +14 -0
  29. package/src/assets/icons-save-60.png +0 -0
  30. package/src/assets/loading.gif +0 -0
  31. package/src/assets/missing-doc.png +0 -0
  32. package/src/assets/saved-doc.png +0 -0
  33. package/src/assets/sysly.png +0 -0
  34. package/src/assets/test-icon.svg +10 -0
  35. package/src/assets/test-missing.png +0 -0
  36. package/src/assets/test-saved.png +0 -0
  37. package/src/assets/x.svg +1 -0
  38. package/src/atoms/Button/Button.js +20 -0
  39. package/src/atoms/Button/Button.test.js +27 -0
  40. package/src/atoms/Button/__snapshots__/Button.test.js.snap +9 -0
  41. package/src/atoms/Button/styles.scss +35 -0
  42. package/src/atoms/Count/index.js +10 -0
  43. package/src/atoms/Count/styles.scss +25 -0
  44. package/src/atoms/DataTable/DataTable.js +27 -0
  45. package/src/atoms/DataTable/DataTable.test.js +55 -0
  46. package/src/atoms/DataTable/__snapshots__/DataTable.test.js.snap +36 -0
  47. package/src/atoms/DataTable/styles.scss +28 -0
  48. package/src/atoms/DescriptionBox/DescriptionBox.js +24 -0
  49. package/src/atoms/DescriptionBox/DescriptionBox.test.js +36 -0
  50. package/src/atoms/DescriptionBox/__snapshots__/DescriptionBox.test.js.snap +14 -0
  51. package/src/atoms/DescriptionBox/styles.scss +24 -0
  52. package/src/atoms/DescriptionText/DescriptionText.js +12 -0
  53. package/src/atoms/DescriptionText/DescriptionText.test.js +22 -0
  54. package/src/atoms/DescriptionText/styles.scss +10 -0
  55. package/src/atoms/DocsIcon/DocsIcon.js +20 -0
  56. package/src/atoms/DocsIcon/DocsIcon.test.js +23 -0
  57. package/src/atoms/DocsIcon/styles.scss +7 -0
  58. package/src/atoms/ExpandableIcon/ExpandableIcon.js +30 -0
  59. package/src/atoms/ExpandableIcon/ExpandableIcon.test.js +18 -0
  60. package/src/atoms/ExpandableIcon/styles.scss +5 -0
  61. package/src/atoms/JsonTextBox/JsonTextBox.js +61 -0
  62. package/src/atoms/JsonTextBox/JsonTextBox.test.js +0 -0
  63. package/src/atoms/JsonTextBox/styles.scss +41 -0
  64. package/src/atoms/Link/Link.js +17 -0
  65. package/src/atoms/Link/Link.test.js +33 -0
  66. package/src/atoms/Link/styles.scss +8 -0
  67. package/src/atoms/List/List.js +8 -0
  68. package/src/atoms/List/List.test.js +26 -0
  69. package/src/atoms/List/styles.scss +9 -0
  70. package/src/atoms/Markdown/Markdown.js +48 -0
  71. package/src/atoms/Markdown/styles.scss +414 -0
  72. package/src/atoms/RunTestIcon/index.js +41 -0
  73. package/src/atoms/RunTestIcon/styles.scss +16 -0
  74. package/src/atoms/SaveIcon/SaveIcon.js +6 -0
  75. package/src/atoms/SaveIcon/styles.scss +3 -0
  76. package/src/atoms/Selector/Selector.js +28 -0
  77. package/src/atoms/Selector/Selector.test.js +0 -0
  78. package/src/atoms/Selector/styles.scss +1 -0
  79. package/src/atoms/StatusIndicator/StatusIndicator.js +16 -0
  80. package/src/atoms/StatusIndicator/styles.scss +33 -0
  81. package/src/atoms/TestsIcon/TestsIcon.js +17 -0
  82. package/src/atoms/TestsIcon/TestsIcon.test.js +18 -0
  83. package/src/atoms/TestsIcon/styles.scss +0 -0
  84. package/src/atoms/Text/Text.js +8 -0
  85. package/src/atoms/Text/Text.test.js +21 -0
  86. package/src/atoms/Text/styles.scss +0 -0
  87. package/src/atoms/Textbox/Textbox.js +33 -0
  88. package/src/atoms/Textbox/Textbox.test.js +23 -0
  89. package/src/atoms/Textbox/styles.scss +14 -0
  90. package/src/atoms/Title/Title.js +12 -0
  91. package/src/atoms/Title/Title.test.js +0 -0
  92. package/src/atoms/Title/styles.scss +6 -0
  93. package/src/atoms/Toggle/Toggle.js +13 -0
  94. package/src/atoms/Toggle/Toggle.test.js +0 -0
  95. package/src/atoms/Toggle/styles.scss +62 -0
  96. package/src/atoms/TypeSelector/TypeSelector.js +28 -0
  97. package/src/atoms/TypeSelector/TypeSelector.test.js +0 -0
  98. package/src/atoms/TypeSelector/styles.scss +9 -0
  99. package/src/index.css +20 -0
  100. package/src/index.js +24 -0
  101. package/src/logo.svg +7 -0
  102. package/src/molecules/Args/Args.js +302 -0
  103. package/src/molecules/Args/Args.test.js +0 -0
  104. package/src/molecules/Args/styles.scss +166 -0
  105. package/src/molecules/AutoCompleteBox/AutoCompleteBox.js +101 -0
  106. package/src/molecules/AutoCompleteBox/AutoCompleteBox.test.js +0 -0
  107. package/src/molecules/AutoCompleteBox/styles.scss +35 -0
  108. package/src/molecules/DataTableForm/DataTableForm.js +167 -0
  109. package/src/molecules/DataTableForm/DataTableForm.test.js +0 -0
  110. package/src/molecules/DataTableForm/styles.scss +51 -0
  111. package/src/molecules/EditBox/EditBox.js +49 -0
  112. package/src/molecules/EditBox/EditBox.test.js +0 -0
  113. package/src/molecules/EditBox/styles.scss +38 -0
  114. package/src/molecules/ExpandableList/ExpandableList.js +26 -0
  115. package/src/molecules/ExpandableList/ExpandableList.test.js +33 -0
  116. package/src/molecules/ExpandableList/styles.scss +18 -0
  117. package/src/molecules/ExpandableSection/ExpandableSection.js +36 -0
  118. package/src/molecules/ExpandableSection/ExpandableSection.test.js +0 -0
  119. package/src/molecules/ExpandableSection/styles.scss +22 -0
  120. package/src/molecules/ServerModulesList/ServerModulesList.js +75 -0
  121. package/src/molecules/ServerModulesList/styles.scss +28 -0
  122. package/src/molecules/TargetSelector/TargetSelector.js +34 -0
  123. package/src/molecules/TargetSelector/TargetSelector.test.js +0 -0
  124. package/src/molecules/TargetSelector/styles.scss +0 -0
  125. package/src/molecules/TestCaption/TestCaption.js +26 -0
  126. package/src/molecules/TestCaption/TestCaption.test.js +0 -0
  127. package/src/molecules/TestCaption/styles.scss +40 -0
  128. package/src/molecules/TestSummary/index.js +212 -0
  129. package/src/molecules/TestSummary/styles.scss +83 -0
  130. package/src/molecules/TextWith2Links/TextWith2Links.js +10 -0
  131. package/src/molecules/TextWith2Links/styles.scss +0 -0
  132. package/src/molecules/ValidationInput/ValidationInput.js +64 -0
  133. package/src/molecules/ValidationInput/ValidationInput.test.js +0 -0
  134. package/src/molecules/ValidationInput/ValidationMessages.js +178 -0
  135. package/src/molecules/ValidationInput/ValidationOptions.js +113 -0
  136. package/src/molecules/ValidationInput/styles.scss +74 -0
  137. package/src/molecules/ValidationInput/validator.js +244 -0
  138. package/src/organisms/Documentation/Documentation.js +128 -0
  139. package/src/organisms/Documentation/Documentation.test.js +0 -0
  140. package/src/organisms/Documentation/styles.scss +22 -0
  141. package/src/organisms/MultiTestSection/MultiTestSection.js +85 -0
  142. package/src/organisms/MultiTestSection/MultiTestSection.test.js +0 -0
  143. package/src/organisms/MultiTestSection/styles.scss +22 -0
  144. package/src/organisms/SavedTests/SavedTests.js +209 -0
  145. package/src/organisms/SavedTests/SavedTests.test.js +0 -0
  146. package/src/organisms/SavedTests/styles.scss +76 -0
  147. package/src/organisms/SavedTests/transformTests.js +51 -0
  148. package/src/organisms/ScratchPad/ScratchPad.js +128 -0
  149. package/src/organisms/ScratchPad/ScratchPad.test.js +0 -0
  150. package/src/organisms/ScratchPad/styles.scss +100 -0
  151. package/src/organisms/SystemNavigator/SystemNavigator.js +148 -0
  152. package/src/organisms/SystemNavigator/SystemNavigator.test.js +24 -0
  153. package/src/organisms/SystemNavigator/styles.scss +38 -0
  154. package/src/organisms/TestContainer/TestContainer.js +72 -0
  155. package/src/organisms/TestContainer/TestContainer.test.js +0 -0
  156. package/src/organisms/TestContainer/styles.scss +20 -0
  157. package/src/organisms/TestPanel/AfterTest/AfterTest.js +16 -0
  158. package/src/organisms/TestPanel/AfterTest/AfterTest.test.js +0 -0
  159. package/src/organisms/TestPanel/AfterTest/styles.scss +0 -0
  160. package/src/organisms/TestPanel/BeforeTest/BeforeTest.js +16 -0
  161. package/src/organisms/TestPanel/BeforeTest/BeforeTest.test.js +0 -0
  162. package/src/organisms/TestPanel/BeforeTest/styles.scss +0 -0
  163. package/src/organisms/TestPanel/Evaluations.js +369 -0
  164. package/src/organisms/TestPanel/EventsTest/EventsTest.js +19 -0
  165. package/src/organisms/TestPanel/EventsTest/styles.scss +0 -0
  166. package/src/organisms/TestPanel/MainTest/MainTest.js +20 -0
  167. package/src/organisms/TestPanel/MainTest/MainTest.test.js +0 -0
  168. package/src/organisms/TestPanel/MainTest/styles.scss +143 -0
  169. package/src/organisms/TestPanel/TestPanel.js +170 -0
  170. package/src/organisms/TestPanel/TestPanel.test.js +0 -0
  171. package/src/organisms/TestPanel/components/Argument.class.js +94 -0
  172. package/src/organisms/TestPanel/components/FullTestController.js +78 -0
  173. package/src/organisms/TestPanel/components/Test.class.js +162 -0
  174. package/src/organisms/TestPanel/components/TestController.class.js +135 -0
  175. package/src/organisms/TestPanel/components/test-helpers.js +109 -0
  176. package/src/organisms/TestPanel/styles.scss +45 -0
  177. package/src/pages/SystemView/SystemView.js +68 -0
  178. package/src/pages/SystemView/styles.scss +81 -0
  179. package/src/reportWebVitals.js +13 -0
  180. package/src/sass/bootstrap/_alert.scss +51 -0
  181. package/src/sass/bootstrap/_badge.scss +47 -0
  182. package/src/sass/bootstrap/_breadcrumb.scss +38 -0
  183. package/src/sass/bootstrap/_button-group.scss +166 -0
  184. package/src/sass/bootstrap/_buttons.scss +143 -0
  185. package/src/sass/bootstrap/_card.scss +270 -0
  186. package/src/sass/bootstrap/_carousel.scss +191 -0
  187. package/src/sass/bootstrap/_close.scss +34 -0
  188. package/src/sass/bootstrap/_code.scss +56 -0
  189. package/src/sass/bootstrap/_custom-forms.scss +297 -0
  190. package/src/sass/bootstrap/_dropdown.scss +131 -0
  191. package/src/sass/bootstrap/_forms.scss +333 -0
  192. package/src/sass/bootstrap/_functions.scss +86 -0
  193. package/src/sass/bootstrap/_grid.scss +52 -0
  194. package/src/sass/bootstrap/_images.scss +42 -0
  195. package/src/sass/bootstrap/_input-group.scss +159 -0
  196. package/src/sass/bootstrap/_jumbotron.scss +16 -0
  197. package/src/sass/bootstrap/_list-group.scss +115 -0
  198. package/src/sass/bootstrap/_media.scss +8 -0
  199. package/src/sass/bootstrap/_mixins.scss +42 -0
  200. package/src/sass/bootstrap/_modal.scss +168 -0
  201. package/src/sass/bootstrap/_nav.scss +118 -0
  202. package/src/sass/bootstrap/_navbar.scss +311 -0
  203. package/src/sass/bootstrap/_pagination.scss +77 -0
  204. package/src/sass/bootstrap/_popover.scss +183 -0
  205. package/src/sass/bootstrap/_print.scss +124 -0
  206. package/src/sass/bootstrap/_progress.scss +33 -0
  207. package/src/sass/bootstrap/_reboot.scss +482 -0
  208. package/src/sass/bootstrap/_root.scss +19 -0
  209. package/src/sass/bootstrap/_tables.scss +180 -0
  210. package/src/sass/bootstrap/_tooltip.scss +115 -0
  211. package/src/sass/bootstrap/_transitions.scss +36 -0
  212. package/src/sass/bootstrap/_type.scss +125 -0
  213. package/src/sass/bootstrap/_utilities.scss +14 -0
  214. package/src/sass/bootstrap/_variables.scss +894 -0
  215. package/src/sass/bootstrap/bootstrap-grid.scss +32 -0
  216. package/src/sass/bootstrap/bootstrap-reboot.scss +12 -0
  217. package/src/sass/bootstrap/bootstrap.scss +42 -0
  218. package/src/sass/bootstrap/mixins/_alert.scss +13 -0
  219. package/src/sass/bootstrap/mixins/_background-variant.scss +21 -0
  220. package/src/sass/bootstrap/mixins/_badge.scss +12 -0
  221. package/src/sass/bootstrap/mixins/_border-radius.scss +35 -0
  222. package/src/sass/bootstrap/mixins/_box-shadow.scss +5 -0
  223. package/src/sass/bootstrap/mixins/_breakpoints.scss +123 -0
  224. package/src/sass/bootstrap/mixins/_buttons.scss +109 -0
  225. package/src/sass/bootstrap/mixins/_caret.scss +65 -0
  226. package/src/sass/bootstrap/mixins/_clearfix.scss +7 -0
  227. package/src/sass/bootstrap/mixins/_float.scss +11 -0
  228. package/src/sass/bootstrap/mixins/_forms.scss +137 -0
  229. package/src/sass/bootstrap/mixins/_gradients.scss +45 -0
  230. package/src/sass/bootstrap/mixins/_grid-framework.scss +67 -0
  231. package/src/sass/bootstrap/mixins/_grid.scss +52 -0
  232. package/src/sass/bootstrap/mixins/_hover.scss +39 -0
  233. package/src/sass/bootstrap/mixins/_image.scss +36 -0
  234. package/src/sass/bootstrap/mixins/_list-group.scss +21 -0
  235. package/src/sass/bootstrap/mixins/_lists.scss +7 -0
  236. package/src/sass/bootstrap/mixins/_nav-divider.scss +10 -0
  237. package/src/sass/bootstrap/mixins/_navbar-align.scss +10 -0
  238. package/src/sass/bootstrap/mixins/_pagination.scss +22 -0
  239. package/src/sass/bootstrap/mixins/_reset-text.scss +17 -0
  240. package/src/sass/bootstrap/mixins/_resize.scss +6 -0
  241. package/src/sass/bootstrap/mixins/_screen-reader.scss +35 -0
  242. package/src/sass/bootstrap/mixins/_size.scss +6 -0
  243. package/src/sass/bootstrap/mixins/_table-row.scss +30 -0
  244. package/src/sass/bootstrap/mixins/_text-emphasis.scss +14 -0
  245. package/src/sass/bootstrap/mixins/_text-hide.scss +9 -0
  246. package/src/sass/bootstrap/mixins/_text-truncate.scss +8 -0
  247. package/src/sass/bootstrap/mixins/_transition.scss +9 -0
  248. package/src/sass/bootstrap/mixins/_visibility.scss +7 -0
  249. package/src/sass/bootstrap/utilities/_align.scss +8 -0
  250. package/src/sass/bootstrap/utilities/_background.scss +19 -0
  251. package/src/sass/bootstrap/utilities/_borders.scss +59 -0
  252. package/src/sass/bootstrap/utilities/_clearfix.scss +3 -0
  253. package/src/sass/bootstrap/utilities/_display.scss +38 -0
  254. package/src/sass/bootstrap/utilities/_embed.scss +52 -0
  255. package/src/sass/bootstrap/utilities/_flex.scss +46 -0
  256. package/src/sass/bootstrap/utilities/_float.scss +9 -0
  257. package/src/sass/bootstrap/utilities/_position.scss +36 -0
  258. package/src/sass/bootstrap/utilities/_screenreaders.scss +11 -0
  259. package/src/sass/bootstrap/utilities/_sizing.scss +12 -0
  260. package/src/sass/bootstrap/utilities/_spacing.scss +51 -0
  261. package/src/sass/bootstrap/utilities/_text.scss +52 -0
  262. package/src/sass/bootstrap/utilities/_visibility.scss +11 -0
  263. 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,9 @@
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`<Button/> should match snapshot 1`] = `
4
+ <button
5
+ className="button"
6
+ >
7
+ test
8
+ </button>
9
+ `;
@@ -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,12 @@
1
+ import React from "react";
2
+ import "./styles.scss";
3
+
4
+ const DescriptionBox = ({ text }) => {
5
+ return (
6
+ <div className="description-text">
7
+ <p className="description-text__text">{text}</p>
8
+ </div>
9
+ );
10
+ };
11
+
12
+ export default DescriptionBox;
@@ -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,10 @@
1
+ .description-text {
2
+ &__text {
3
+ text-align: left;
4
+ color: white;
5
+ background: #3f495d;
6
+ padding: 12px;
7
+ margin: 6px 0px;
8
+ border-radius: 8px;
9
+ }
10
+ }
@@ -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,7 @@
1
+ .doc-icon {
2
+ display: inline-flex;
3
+ vertical-align: middle;
4
+ img {
5
+ width: 20px;
6
+ }
7
+ }
@@ -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
+ &#9660;
18
+ </span>
19
+ ) : (
20
+ <span
21
+ style={{ color, fontSize }}
22
+ onClick={onClick}
23
+ className={`expandable-icon ${className}`}
24
+ >
25
+ &#x25BA;
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,5 @@
1
+ .expandable-icon {
2
+ font-size: 11px;
3
+ font-family: sans-serif;
4
+ cursor: pointer;
5
+ }
@@ -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;