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,166 @@
1
+ .args {
2
+ display: inline;
3
+ width: 100%;
4
+ &__add-btn {
5
+ padding: 0px 3px;
6
+ border-radius: 21px;
7
+ font-weight: bold;
8
+ color: #ffffff;
9
+ font-size: 16px;
10
+ margin: 0 5px;
11
+ line-height: 16px;
12
+ background: #5a77e5;
13
+ font-family: monospace;
14
+ }
15
+ &__data {
16
+ background: #cecee3;
17
+ margin: 2px;
18
+ border-radius: 7px;
19
+ padding: 11px;
20
+ position: relative;
21
+ &__delete-btn {
22
+ border-radius: 0px 7px 0px 0px !important;
23
+ top: 0px !important;
24
+ right: 0px !important;
25
+ padding: 0px 5px 1px 5px !important;
26
+ }
27
+ }
28
+
29
+ &__name {
30
+ white-space: nowrap;
31
+
32
+ &__text {
33
+ display: inline-block;
34
+ margin: 1px 0px;
35
+ // box-shadow: 1px 1px 1px #bdbdbd;
36
+ background: #5a77e5;
37
+ font-weight: bold;
38
+ color: white;
39
+ padding: 2px 10px;
40
+ border-radius: 100px;
41
+ cursor: pointer;
42
+ }
43
+ }
44
+ &__from-container {
45
+ display: flex;
46
+ /* justify-content: space-evenly; */
47
+ }
48
+
49
+ &__form {
50
+ &--is12 {
51
+ margin-top: 10px;
52
+ }
53
+ &__undefined {
54
+ color: #5a5a5a;
55
+ }
56
+ &__input {
57
+ background: none;
58
+ border: none;
59
+ border-bottom: 1px solid #9797d1;
60
+ font-family: monospace;
61
+ font-size: 14px;
62
+ &--number {
63
+ color: #9741ed;
64
+ font-weight: bold;
65
+ }
66
+ &--string,
67
+ &--target {
68
+ text-indent: 5px;
69
+ color: #cf5f2e;
70
+ min-height: 31px;
71
+ height: 31px;
72
+ min-width: 100%;
73
+ max-width: 100%;
74
+ max-height: 320px;
75
+ }
76
+ &--target {
77
+ font-weight: bold;
78
+ color: #009572;
79
+ }
80
+ &--date {
81
+ margin-top: 6px;
82
+ color: #9f4040;
83
+ }
84
+ }
85
+ &__value {
86
+ &--boolean {
87
+ &--true {
88
+ color: #2eab8c;
89
+ margin-right: 5px;
90
+ }
91
+ &--false {
92
+ color: #d52518;
93
+ }
94
+ position: relative;
95
+ top: 7px;
96
+ font-weight: bold;
97
+ }
98
+ }
99
+ }
100
+ &__quote {
101
+ color: #209cff;
102
+ font-size: 21px;
103
+ line-height: 1px;
104
+ }
105
+ &__type {
106
+ text-align: center;
107
+ }
108
+ &__name-display {
109
+ margin-right: 4px;
110
+ display: inline-block;
111
+ }
112
+ &__expand-btn {
113
+ color: #0035cf61;
114
+ text-shadow: 1px 1px 1px #cfcfcf;
115
+ }
116
+
117
+ &__add-json-btn {
118
+ padding: 2px 3px;
119
+ border-radius: 2px;
120
+ color: #0d8065;
121
+ position: absolute;
122
+ top: 6px;
123
+ right: 0;
124
+ &:hover {
125
+ text-decoration: underline;
126
+ }
127
+ }
128
+ &__json-txb {
129
+ &--show-false {
130
+ display: none !important;
131
+ }
132
+ }
133
+ &__value {
134
+ padding: 14px;
135
+ &--hide {
136
+ display: none;
137
+ }
138
+ &__number {
139
+ color: #9741ed;
140
+ font-weight: bold;
141
+ }
142
+ &__string {
143
+ color: #cf5f2e;
144
+ white-space: pre-line;
145
+ }
146
+ &__date {
147
+ color: #9f4040;
148
+ }
149
+ &__undefined {
150
+ color: #5a5a5a;
151
+ }
152
+ &__object {
153
+ // background: white;
154
+ padding: 0;
155
+ }
156
+ &__boolean {
157
+ font-weight: bold;
158
+ &--true {
159
+ color: #207844;
160
+ }
161
+ &--false {
162
+ color: #cf1515;
163
+ }
164
+ }
165
+ }
166
+ }
@@ -0,0 +1,101 @@
1
+ import { useState, useEffect } from "react";
2
+ import "./styles.scss";
3
+
4
+ const AutoCompleteBox = ({
5
+ suggestions,
6
+ value = "",
7
+ className,
8
+ onSubmit,
9
+ onChange,
10
+ onBlur,
11
+ disabled = false,
12
+ placeholder,
13
+ filterSuggestion = true,
14
+ requireSelection = true,
15
+ }) => {
16
+ const [filteredSuggestions, setFilteredSuggestions] = useState([]);
17
+ const [activeSuggestionIndex, setActiveSuggestionIndex] = useState(0);
18
+ const [showSuggestions, setShowSuggestions] = useState(false);
19
+ const [input, setInput] = useState(value);
20
+ useEffect(() => setInput(value), [value]);
21
+ const change = (e) => {
22
+ const userInput = e.target.value;
23
+
24
+ // Filter our suggestions that don't contain the user's input
25
+ const unLinked = filterSuggestion
26
+ ? suggestions.filter(
27
+ (suggestion) => suggestion.toLowerCase().indexOf(userInput.toLowerCase()) > -1
28
+ )
29
+ : suggestions;
30
+
31
+ setInput(e.target.value);
32
+ setFilteredSuggestions(unLinked);
33
+ setActiveSuggestionIndex(0);
34
+
35
+ if (
36
+ (!requireSelection && unLinked.indexOf(userInput) > -1) ||
37
+ (!requireSelection &&
38
+ unLinked.length <= 1 &&
39
+ userInput.length > (unLinked[0] || "").length)
40
+ )
41
+ setShowSuggestions(false);
42
+ else setShowSuggestions(true);
43
+ if (typeof onChange === "function") onChange(e.target.value);
44
+ };
45
+ const onClick = (e) => {
46
+ const text = e.target.innerText.substr(0, e.target.innerText.length);
47
+ if (typeof onSubmit === "function") onSubmit(text);
48
+ setFilteredSuggestions([]);
49
+ setInput(text);
50
+ setActiveSuggestionIndex(0);
51
+ setShowSuggestions(false);
52
+ };
53
+ const blur = (e) => {
54
+ typeof onBlur === "function" && onBlur(e.target.value);
55
+ };
56
+ const SuggestionsListComponent = () => {
57
+ return filteredSuggestions.length ? (
58
+ <div className="auto-complete__suggestions">
59
+ {filteredSuggestions.map((suggestion, index) => {
60
+ let className;
61
+ // Flag the active suggestion with a class
62
+
63
+ className =
64
+ index === activeSuggestionIndex
65
+ ? "auto-complete__suggestion auto-complete__suggestion--active"
66
+ : "auto-complete__suggestion ";
67
+
68
+ return (
69
+ <span className={className} key={suggestion} onClick={onClick}>
70
+ {suggestion}
71
+ </span>
72
+ );
73
+ })}
74
+ </div>
75
+ ) : (
76
+ <div className="auto-complete__suggestions">
77
+ <div className="auto-complete__suggestion auto-complete__suggestion--empty">
78
+ <em>no match</em>
79
+ </div>
80
+ </div>
81
+ );
82
+ };
83
+ const onKeyDown = () => {};
84
+ return (
85
+ <div className="auto-complete">
86
+ <input
87
+ className={className + " auto-complete__input"}
88
+ type="text"
89
+ onChange={change}
90
+ onKeyDown={onKeyDown}
91
+ onBlur={blur}
92
+ value={input}
93
+ disabled={disabled}
94
+ placeholder={placeholder}
95
+ />
96
+ {showSuggestions && input && <SuggestionsListComponent />}
97
+ </div>
98
+ );
99
+ };
100
+
101
+ export default AutoCompleteBox;
@@ -0,0 +1,35 @@
1
+ .auto-complete {
2
+ position: relative;
3
+ display: initial;
4
+ &__suggestions {
5
+ position: absolute;
6
+ top: 19px;
7
+ z-index: 1;
8
+ left: 0px;
9
+ display: grid;
10
+ // border: 1px solid #bcbfd1;
11
+ box-shadow: 1px 3px 4px #736c6c;
12
+ max-height: 365px;
13
+ overflow-y: auto;
14
+ font-family: monospace;
15
+ }
16
+ &__suggestion {
17
+ padding: 6px 7px;
18
+ display: inline-flex;
19
+ cursor: pointer;
20
+ background: white;
21
+ width: calc(300px + 1rem);
22
+ &--active,
23
+ &:hover:not(&--empty) {
24
+ color: #5960b6;
25
+ background-color: #cbcbff;
26
+ background-color: #dadaed;
27
+ color: #3f495d;
28
+ font-weight: 100;
29
+ font-weight: bold;
30
+ }
31
+ &--empty {
32
+ justify-content: center;
33
+ }
34
+ }
35
+ }
@@ -0,0 +1,167 @@
1
+ import React, { useState, useEffect } from "react";
2
+ import "./styles.scss";
3
+ import Textbox from "../../atoms/Textbox/Textbox";
4
+ import Toggle from "../../atoms/Toggle/Toggle";
5
+ import DataTable from "../../atoms/DataTable/DataTable";
6
+ import Selector from "../../atoms/Selector/Selector";
7
+ import EditBox from "../EditBox/EditBox";
8
+ import ParserMatrix from "textparsermatrix";
9
+
10
+ const MethodDataForm = ({ data, submit }) => {
11
+ const displayHeaders = [
12
+ { name: "Property" },
13
+ { name: "Type" },
14
+ { name: "Description" },
15
+ { name: "Default" },
16
+ { name: "Required" },
17
+ ];
18
+ const formHeaders = [...displayHeaders, { name: "" }];
19
+ const _options = [
20
+ "String",
21
+ "Date",
22
+ "Object",
23
+ "ObjectId",
24
+ "Number",
25
+ "Boolean",
26
+ "Array(ObjectIds)",
27
+ "Array(Objects)",
28
+ "Array(Strings)",
29
+ "Array(Numbers)",
30
+ "Array(Boolean)",
31
+ "Array(Misc)",
32
+ ];
33
+ const matrix = ParserMatrix([
34
+ { name: "name" },
35
+ { name: "data_type" },
36
+ { name: "description" },
37
+ { name: "default_value" },
38
+ { name: "required" },
39
+ ]);
40
+ matrix.addJson(data || [], {
41
+ beforeInsert: (rowData) => (rowData[4] = rowData[4] + ""),
42
+ });
43
+
44
+ const [dataTable, setTable] = useState(matrix.table);
45
+ const [formSubmitted, setFormSubmitted] = useState(false);
46
+ const addRow = () => setTable([...dataTable, ["", "Object", "", "", "false"]]);
47
+
48
+ const deleteRow = ([i]) => {
49
+ dataTable.splice(i, 1);
50
+ setTable([...dataTable]);
51
+ };
52
+ const updateCell = (row, col, e) => {
53
+ dataTable[row][col] = e.target.value;
54
+ setTable([...dataTable]);
55
+ };
56
+ const updateCheckboxCell = (row, col, event) => {
57
+ dataTable[row][col] = event.target.checked + "";
58
+ dataTable[row][col - 1] = event.target.checked ? "n/a" : "";
59
+ setTable([...dataTable]);
60
+ };
61
+ const formCanceled = () => {
62
+ setFormSubmitted(false);
63
+ setTable(matrix.table);
64
+ };
65
+
66
+ const formSubmit = (showForm) => {
67
+ setFormSubmitted(true);
68
+ matrix.table = dataTable;
69
+
70
+ //validate and change data types
71
+ for (let i = 0; i < matrix.table.length; i++) {
72
+ const currentRow = matrix.table[i];
73
+ if (
74
+ !/^(?![0-9])[a-zA-Z0-9$_]+$/.test(currentRow[0]) ||
75
+ !currentRow[1] ||
76
+ !currentRow[2] ||
77
+ !currentRow[3]
78
+ )
79
+ return alert("Please fix invalid or incomplete cells.");
80
+ currentRow[4] = /true/i.test(currentRow[4]);
81
+ }
82
+
83
+ submit(matrix.toJson());
84
+ showForm(false);
85
+ };
86
+ useEffect(() => setTable(matrix.table), [data]);
87
+ return (
88
+ <div style={{ width: "100%" }}>
89
+ <EditBox
90
+ mainObject={<DataTable table={dataTable} headers={displayHeaders} />}
91
+ hiddenForm={
92
+ <div>
93
+ <DataTable
94
+ tableClassName="data-table-form"
95
+ headers={formHeaders}
96
+ table={dataTable.map(
97
+ ([name, type, description, default_value, required], i) => {
98
+ const _required = /true/i.test(required);
99
+ return [
100
+ <Textbox
101
+ inputClassName={`data-table-form__input-validation--${
102
+ /^(?![0-9])[a-zA-Z0-9$_]+$/.test(name)
103
+ ? "complete"
104
+ : formSubmitted
105
+ ? "invalid"
106
+ : "incomplete"
107
+ }`}
108
+ text={name}
109
+ setValue={updateCell.bind(this, i, 0)}
110
+ />,
111
+ <Selector
112
+ options={_options}
113
+ selected_option={type}
114
+ onSelect={updateCell.bind(this, i, 1)}
115
+ className={`data-table-form__data-type-selector`}
116
+ />,
117
+ <textarea
118
+ value={description}
119
+ className={`data-table-form__description-text data-table-form__input-validation--${
120
+ description
121
+ ? "complete"
122
+ : formSubmitted
123
+ ? "invalid"
124
+ : "incomplete"
125
+ }`}
126
+ onChange={updateCell.bind(this, i, 2)}
127
+ />,
128
+ <Textbox
129
+ inputClassName={`data-table-form__input-validation--${
130
+ default_value
131
+ ? "complete"
132
+ : formSubmitted
133
+ ? "invalid"
134
+ : "incomplete"
135
+ }`}
136
+ text={default_value}
137
+ setValue={updateCell.bind(this, i, 3)}
138
+ disabled={_required}
139
+ />,
140
+ <Toggle
141
+ round={true}
142
+ isChecked={_required}
143
+ onChange={updateCheckboxCell.bind(this, i, 4)}
144
+ />,
145
+ <span
146
+ className="data-table-form__delete-button"
147
+ onClick={deleteRow.bind(this, [i])}
148
+ >
149
+ x
150
+ </span>,
151
+ ];
152
+ }
153
+ )}
154
+ />
155
+ <span className="data-table-form__add-button" href="#" onClick={addRow}>
156
+ +Prop
157
+ </span>
158
+ </div>
159
+ }
160
+ formSubmit={formSubmit}
161
+ onCancel={formCanceled}
162
+ />
163
+ </div>
164
+ );
165
+ };
166
+
167
+ export default MethodDataForm;
@@ -0,0 +1,51 @@
1
+ .data-table-form {
2
+ &__description-text {
3
+ margin: 0px;
4
+ min-height: 43px;
5
+ max-width: 391px;
6
+ min-width: 391px;
7
+ }
8
+
9
+ &__data-type-selector {
10
+ padding: 0.5rem;
11
+ }
12
+
13
+ &__delete-button {
14
+ font-family: sans-serif;
15
+ cursor: pointer;
16
+ border-radius: 61px;
17
+ padding: 0px 5px 1px 5px;
18
+
19
+ &:hover {
20
+ background: #ff6b6b;
21
+ color: white;
22
+ }
23
+
24
+ &:active {
25
+ position: relative;
26
+ top: 1px;
27
+ }
28
+ }
29
+ &__add-button {
30
+ cursor: pointer;
31
+ padding: 1px 9px;
32
+ line-height: 1;
33
+ border-radius: 21px;
34
+ font-weight: bold;
35
+ color: #0d8065;
36
+ font-size: 16px;
37
+ background: white;
38
+ border: 1px solid gainsboro;
39
+ border: 1px solid #bbd8ca;
40
+ &:active {
41
+ position: relative;
42
+ top: 1px;
43
+ }
44
+ }
45
+ &__input-validation {
46
+ &--invalid {
47
+ border: 1px solid salmon;
48
+ border-radius: 5px;
49
+ }
50
+ }
51
+ }
@@ -0,0 +1,49 @@
1
+ import React, { useState, useEffect } from "react";
2
+ import "./styles.scss";
3
+ import Button from "../../atoms/Button/Button";
4
+
5
+ const EditBox = ({
6
+ formSubmit,
7
+ mainObject,
8
+ hiddenForm,
9
+ onCancel,
10
+ open = false,
11
+ stateChange,
12
+ }) => {
13
+ const [editMode, setEditMode] = useState(open);
14
+ const editBoxClicked = () => setEditMode(true);
15
+ const cancelClicked = () => {
16
+ if (typeof onCancel === "function") onCancel();
17
+ setEditMode(false);
18
+ };
19
+
20
+ const saveClicked = () => {
21
+ formSubmit(setEditMode);
22
+ //setEditMode(false);
23
+ };
24
+ // useEffect(() => {
25
+ // setEditMode(false);
26
+ // }, [stateChange]);
27
+ return (
28
+ <div className={`edit-box edit-box--${editMode ? "edit" : "read"}`}>
29
+ <div
30
+ onClick={editBoxClicked}
31
+ className={`edit-box__main edit-box__main--${editMode ? "hidden" : "visible"}`}
32
+ >
33
+ {mainObject}
34
+ </div>
35
+ <div
36
+ className={`edit-box__form edit-box__form--${editMode ? "visible" : "hidden"}`}
37
+ >
38
+ <div className="row">{hiddenForm}</div>
39
+
40
+ <div className="edit-box__button">
41
+ <Button submit={saveClicked}>Save</Button>
42
+ <Button submit={cancelClicked}>Close</Button>
43
+ </div>
44
+ </div>
45
+ </div>
46
+ );
47
+ };
48
+
49
+ export default EditBox;
File without changes
@@ -0,0 +1,38 @@
1
+ .edit-box {
2
+ width: 100%;
3
+ border-radius: 13px;
4
+ background: white;
5
+ overflow: scroll;
6
+ max-height: 80vh;
7
+ border: 2px solid #f1f1f1;
8
+ &--read {
9
+ &:hover {
10
+ // border: 2px dashed #5960b6;
11
+ // border: 2px dashed gainsboro;
12
+ // border: 2px dashed #92a3d3;
13
+ border: 2px dashed #8b97ba;
14
+
15
+ cursor: pointer;
16
+ }
17
+ }
18
+ &__main {
19
+ border: 2px dashed transparent;
20
+ &--hidden {
21
+ display: none;
22
+ }
23
+ }
24
+
25
+ &__form {
26
+ &--hidden {
27
+ display: none;
28
+ }
29
+ }
30
+
31
+ &__button {
32
+ display: flex;
33
+ width: 100%;
34
+ flex-direction: row;
35
+ justify-content: flex-end;
36
+ padding: 6px 15px;
37
+ }
38
+ }
@@ -0,0 +1,26 @@
1
+ import React, { useState } from "react";
2
+ import "./styles.scss";
3
+ import List from "../../atoms/List/List";
4
+ import ExpandIcon from "../../atoms/ExpandableIcon/ExpandableIcon";
5
+
6
+ const ExpandableList = ({ children, title, open = false }) => {
7
+ const [isOpen, setState] = useState(open);
8
+
9
+ const expandClick = () => {
10
+ setState(!isOpen);
11
+ };
12
+ return (
13
+ <div className="expandable-list">
14
+ <div className="expandable-list__button">
15
+ <ExpandIcon isOpen={isOpen} onClick={expandClick} />
16
+ {title}
17
+ </div>
18
+
19
+ <div className={`expandable-list__items expandable-list__items--${!isOpen ? "hidden" : ""}`}>
20
+ <List>{children}</List>
21
+ </div>
22
+ </div>
23
+ );
24
+ };
25
+
26
+ export default ExpandableList;
@@ -0,0 +1,33 @@
1
+ /* eslint-disable jest/valid-expect */
2
+ import React from "react";
3
+ import { expect } from "chai";
4
+ import { shallow, render } from "enzyme";
5
+
6
+ import ExpandableList from "./ExpandableList";
7
+
8
+ import Enzyme from "enzyme";
9
+ import Adapter from "enzyme-adapter-react-16";
10
+
11
+ Enzyme.configure({ adapter: new Adapter() });
12
+
13
+ describe("<ExpandableList/>", () => {
14
+ it("renders a div with classname expandable-list", () => {
15
+ const wrapper = shallow(<ExpandableList />);
16
+ expect(wrapper.find("div.expandable-list").props().className).to.equal("expandable-list");
17
+ });
18
+
19
+ it("use the title prop to pass a string to .expandable-list__button class", () => {
20
+ const wrapper = render(<ExpandableList title="test" />);
21
+ expect(wrapper.find("div.expandable-list__button").text()).to.contain("test");
22
+ });
23
+
24
+ it("use wrap nested elements in .expandable-list-items container", () => {
25
+ const wrapper = render(
26
+ <ExpandableList>
27
+ <div className="test"></div>
28
+ <div className="test"></div>
29
+ </ExpandableList>
30
+ );
31
+ expect(wrapper.find("div.expandable-list__items test")).to.have.a.lengthOf(0);
32
+ });
33
+ });
@@ -0,0 +1,18 @@
1
+ .expandable-list {
2
+ text-indent: 10px;
3
+
4
+ &__items {
5
+ &--hidden {
6
+ display: none;
7
+ }
8
+ }
9
+ &__button {
10
+ text-align: left;
11
+ display: flex;
12
+ & > span,
13
+ a {
14
+ display: flex;
15
+ align-items: center;
16
+ }
17
+ }
18
+ }