@wirenboard/json-editor 2.5.3-wb13

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 (283) hide show
  1. package/.env-dist +2 -0
  2. package/.eslintrc +7 -0
  3. package/.gitattributes +1 -0
  4. package/.github/PULL_REQUEST_TEMPLATE.md +9 -0
  5. package/.github/issue_template +25 -0
  6. package/.github/workflows/build.yml +58 -0
  7. package/.travis.yml +70 -0
  8. package/CHANGELOG.md +915 -0
  9. package/CONTRIBUTING.md +92 -0
  10. package/LICENSE +20 -0
  11. package/Makefile +26 -0
  12. package/README.md +1646 -0
  13. package/README_ADDON.md +573 -0
  14. package/UPGRADING.md +46 -0
  15. package/build/CssToJson.js +55 -0
  16. package/codecept.conf.js +35 -0
  17. package/config/.eslintrc +7 -0
  18. package/config/codeceptjs_helpers.js +139 -0
  19. package/config/helpers.js +10 -0
  20. package/config/karma.conf.js +93 -0
  21. package/config/readme.md +31 -0
  22. package/config/webpack.common.js +75 -0
  23. package/config/webpack.dev.js +15 -0
  24. package/config/webpack.nonmin.js +19 -0
  25. package/config/webpack.prod.js +25 -0
  26. package/dist/jsoneditor.js +14 -0
  27. package/dist/nonmin/jsoneditor.js +29097 -0
  28. package/dist/nonmin/jsoneditor.js.map +1 -0
  29. package/docs/ace_editor.html +56 -0
  30. package/docs/advanced.html +136 -0
  31. package/docs/basic.html +63 -0
  32. package/docs/basic_person.json +26 -0
  33. package/docs/choices.html +86 -0
  34. package/docs/cleave.html +132 -0
  35. package/docs/colorpicker.html +194 -0
  36. package/docs/css_integration.html +135 -0
  37. package/docs/datetime.html +305 -0
  38. package/docs/describedby.html +161 -0
  39. package/docs/enumsource.html +67 -0
  40. package/docs/images/categoriesDemo.png +0 -0
  41. package/docs/images/inheritance_tree.png +0 -0
  42. package/docs/images/jsoneditor.png +0 -0
  43. package/docs/imask.html +192 -0
  44. package/docs/index.html +579 -0
  45. package/docs/materialize_css.html +164 -0
  46. package/docs/meta_schema.json +705 -0
  47. package/docs/multiple_upload_base64.html +65 -0
  48. package/docs/person.json +73 -0
  49. package/docs/polyfills/assign.js +29 -0
  50. package/docs/radio.html +156 -0
  51. package/docs/recursive.html +170 -0
  52. package/docs/select2.html +99 -0
  53. package/docs/selectize.html +100 -0
  54. package/docs/signature.html +42 -0
  55. package/docs/starrating.html +137 -0
  56. package/docs/upload.html +131 -0
  57. package/docs/uuid.html +70 -0
  58. package/docs/wysiwyg.html +56 -0
  59. package/jasmine.json +11 -0
  60. package/json-editor-json-editor-2.5.3-wb13.tgz +0 -0
  61. package/package.json +100 -0
  62. package/release-notes.md +88 -0
  63. package/src/core.js +412 -0
  64. package/src/defaults.js +402 -0
  65. package/src/editor.js +707 -0
  66. package/src/editors/ace.js +89 -0
  67. package/src/editors/array/choices.js +103 -0
  68. package/src/editors/array/select2.js +110 -0
  69. package/src/editors/array/selectize.js +103 -0
  70. package/src/editors/array.css +9 -0
  71. package/src/editors/array.css.js +3 -0
  72. package/src/editors/array.js +818 -0
  73. package/src/editors/autocomplete.js +58 -0
  74. package/src/editors/base64.js +157 -0
  75. package/src/editors/button.js +97 -0
  76. package/src/editors/checkbox.js +95 -0
  77. package/src/editors/choices.css +3 -0
  78. package/src/editors/choices.css.js +3 -0
  79. package/src/editors/choices.js +69 -0
  80. package/src/editors/colorpicker.js +103 -0
  81. package/src/editors/datetime.js +141 -0
  82. package/src/editors/describedby.js +188 -0
  83. package/src/editors/enum.js +136 -0
  84. package/src/editors/hidden.js +127 -0
  85. package/src/editors/index.js +81 -0
  86. package/src/editors/info.js +20 -0
  87. package/src/editors/integer.js +19 -0
  88. package/src/editors/ip.js +36 -0
  89. package/src/editors/jodit.js +64 -0
  90. package/src/editors/multiple.js +409 -0
  91. package/src/editors/multiselect.js +218 -0
  92. package/src/editors/null.js +18 -0
  93. package/src/editors/number.js +51 -0
  94. package/src/editors/object.css +41 -0
  95. package/src/editors/object.css.js +3 -0
  96. package/src/editors/object.js +1290 -0
  97. package/src/editors/radio.js +111 -0
  98. package/src/editors/sceditor.js +72 -0
  99. package/src/editors/select.js +370 -0
  100. package/src/editors/select2.js +110 -0
  101. package/src/editors/selectize.js +112 -0
  102. package/src/editors/signature.js +113 -0
  103. package/src/editors/simplemde.js +100 -0
  104. package/src/editors/starrating.css +52 -0
  105. package/src/editors/starrating.css.js +3 -0
  106. package/src/editors/starrating.js +135 -0
  107. package/src/editors/stepper.js +27 -0
  108. package/src/editors/string.js +372 -0
  109. package/src/editors/table.js +516 -0
  110. package/src/editors/upload.js +321 -0
  111. package/src/editors/uuid.js +56 -0
  112. package/src/iconlib.js +24 -0
  113. package/src/iconlibs/bootstrap2.js +28 -0
  114. package/src/iconlibs/bootstrap3.js +28 -0
  115. package/src/iconlibs/fontawesome3.js +28 -0
  116. package/src/iconlibs/fontawesome4.js +28 -0
  117. package/src/iconlibs/fontawesome5.js +28 -0
  118. package/src/iconlibs/foundation2.js +24 -0
  119. package/src/iconlibs/foundation3.js +28 -0
  120. package/src/iconlibs/index.js +25 -0
  121. package/src/iconlibs/jqueryui.js +28 -0
  122. package/src/iconlibs/materialicons.js +49 -0
  123. package/src/iconlibs/openiconic.js +28 -0
  124. package/src/iconlibs/spectre.js +28 -0
  125. package/src/resolvers.js +128 -0
  126. package/src/schemaloader.js +408 -0
  127. package/src/style.css +150 -0
  128. package/src/style.css.js +3 -0
  129. package/src/templates/default.js +52 -0
  130. package/src/templates/ejs.js +13 -0
  131. package/src/templates/handlebars.js +1 -0
  132. package/src/templates/hogan.js +10 -0
  133. package/src/templates/index.js +21 -0
  134. package/src/templates/lodash.js +9 -0
  135. package/src/templates/markup.js +9 -0
  136. package/src/templates/mustache.js +9 -0
  137. package/src/templates/swig.js +1 -0
  138. package/src/templates/underscore.js +9 -0
  139. package/src/theme.js +659 -0
  140. package/src/themes/barebones.css +35 -0
  141. package/src/themes/barebones.css.js +3 -0
  142. package/src/themes/barebones.js +28 -0
  143. package/src/themes/bootstrap2.js +319 -0
  144. package/src/themes/bootstrap3.css +0 -0
  145. package/src/themes/bootstrap3.css.js +3 -0
  146. package/src/themes/bootstrap3.js +315 -0
  147. package/src/themes/bootstrap4.css +89 -0
  148. package/src/themes/bootstrap4.css.js +3 -0
  149. package/src/themes/bootstrap4.js +690 -0
  150. package/src/themes/bootstrap5.css.js +3 -0
  151. package/src/themes/foundation.js +569 -0
  152. package/src/themes/html.css +60 -0
  153. package/src/themes/html.css.js +3 -0
  154. package/src/themes/html.js +71 -0
  155. package/src/themes/index.js +28 -0
  156. package/src/themes/jqueryui.js +198 -0
  157. package/src/themes/materialize.js +426 -0
  158. package/src/themes/spectre.css +208 -0
  159. package/src/themes/spectre.css.js +3 -0
  160. package/src/themes/spectre.js +406 -0
  161. package/src/themes/tailwind.css +249 -0
  162. package/src/themes/tailwind.css.js +3 -0
  163. package/src/themes/tailwind.js +443 -0
  164. package/src/utilities.js +138 -0
  165. package/src/validator.js +877 -0
  166. package/src/validators/ip-validator.js +51 -0
  167. package/tests/Dockerfile +3 -0
  168. package/tests/README.md +48 -0
  169. package/tests/codeceptjs/codecept.json +42 -0
  170. package/tests/codeceptjs/constrains/if-then-else_test.js +143 -0
  171. package/tests/codeceptjs/core_test.js +217 -0
  172. package/tests/codeceptjs/editors/advanced_test.js +13 -0
  173. package/tests/codeceptjs/editors/array_any_of_test.js +50 -0
  174. package/tests/codeceptjs/editors/array_test.js +900 -0
  175. package/tests/codeceptjs/editors/button_test.js +35 -0
  176. package/tests/codeceptjs/editors/checkbox_test.js +21 -0
  177. package/tests/codeceptjs/editors/colorpicker_test.js +27 -0
  178. package/tests/codeceptjs/editors/datetime_test.js +33 -0
  179. package/tests/codeceptjs/editors/inheritance_test.js +11 -0
  180. package/tests/codeceptjs/editors/integer_test.js +84 -0
  181. package/tests/codeceptjs/editors/issues/issue-gh-812_test.js +32 -0
  182. package/tests/codeceptjs/editors/jodit_test.js +24 -0
  183. package/tests/codeceptjs/editors/multiselect_test.js +8 -0
  184. package/tests/codeceptjs/editors/number_test.js +82 -0
  185. package/tests/codeceptjs/editors/object_test.js +204 -0
  186. package/tests/codeceptjs/editors/option-no_default_values_test.js +42 -0
  187. package/tests/codeceptjs/editors/programmatic-changes_test.js +20 -0
  188. package/tests/codeceptjs/editors/radio_test.js +10 -0
  189. package/tests/codeceptjs/editors/rating_test.js +13 -0
  190. package/tests/codeceptjs/editors/select_test.js +22 -0
  191. package/tests/codeceptjs/editors/stepper_test.js +27 -0
  192. package/tests/codeceptjs/editors/string_test.js +118 -0
  193. package/tests/codeceptjs/editors/table-confirm-delete_test.js +67 -0
  194. package/tests/codeceptjs/editors/tabs_test.js +14 -0
  195. package/tests/codeceptjs/editors/uuid_test.js +21 -0
  196. package/tests/codeceptjs/editors/validation_test.js +14 -0
  197. package/tests/codeceptjs/meta-schema_test.js +17 -0
  198. package/tests/codeceptjs/schemaloader_test.js +13 -0
  199. package/tests/codeceptjs/steps.d.ts +13 -0
  200. package/tests/codeceptjs/steps_file.js +12 -0
  201. package/tests/codeceptjs/themes_test.js +519 -0
  202. package/tests/docker-compose.yml +34 -0
  203. package/tests/fixtures/basic_person.json +26 -0
  204. package/tests/fixtures/nested_object.json +26 -0
  205. package/tests/fixtures/person.json +55 -0
  206. package/tests/fixtures/recursive.json +8 -0
  207. package/tests/fixtures/some_types.json +32 -0
  208. package/tests/fixtures/string.json +3 -0
  209. package/tests/fixtures/validation.json +1140 -0
  210. package/tests/pages/_demo.html +475 -0
  211. package/tests/pages/advanced.html +137 -0
  212. package/tests/pages/anyof.html +80 -0
  213. package/tests/pages/array-anyof.html +142 -0
  214. package/tests/pages/array-checkboxes.html +41 -0
  215. package/tests/pages/array-choices.html +45 -0
  216. package/tests/pages/array-integers.html +37 -0
  217. package/tests/pages/array-move-events.html +61 -0
  218. package/tests/pages/array-multiselects.html +42 -0
  219. package/tests/pages/array-nested-arrays.html +40 -0
  220. package/tests/pages/array-numbers.html +37 -0
  221. package/tests/pages/array-objects.html +42 -0
  222. package/tests/pages/array-ratings.html +40 -0
  223. package/tests/pages/array-selectize.html +51 -0
  224. package/tests/pages/array-selects.html +36 -0
  225. package/tests/pages/array-strings.html +36 -0
  226. package/tests/pages/array.html +42 -0
  227. package/tests/pages/assets/pages.css +130 -0
  228. package/tests/pages/button-callbacks.html +77 -0
  229. package/tests/pages/checkbox-labels.html +114 -0
  230. package/tests/pages/colorpicker-no-3rd-party.html +43 -0
  231. package/tests/pages/colorpicker-use-vanilla-picker.html +50 -0
  232. package/tests/pages/core.html +118 -0
  233. package/tests/pages/datetime.html +76 -0
  234. package/tests/pages/form-name.html +108 -0
  235. package/tests/pages/grid-strict.html +311 -0
  236. package/tests/pages/grid.html +284 -0
  237. package/tests/pages/if-then-else-allOf.html +117 -0
  238. package/tests/pages/inheritance.html +76 -0
  239. package/tests/pages/integer.html +68 -0
  240. package/tests/pages/issues/_template.html +50 -0
  241. package/tests/pages/issues/issue-gh-812.html +110 -0
  242. package/tests/pages/issues/issue-gh-823-meta-schema.html +35 -0
  243. package/tests/pages/issues/issue-gh-848.html +81 -0
  244. package/tests/pages/meta_schema.json +705 -0
  245. package/tests/pages/number.html +89 -0
  246. package/tests/pages/object-no-additional-properties.html +65 -0
  247. package/tests/pages/object-no-duplicated-id.html +68 -0
  248. package/tests/pages/object-required-properties.html +236 -0
  249. package/tests/pages/object-with-dependencies-array.html +46 -0
  250. package/tests/pages/object-with-dependencies.html +60 -0
  251. package/tests/pages/object.html +79 -0
  252. package/tests/pages/oneof.html +103 -0
  253. package/tests/pages/option-no_default_values.html +58 -0
  254. package/tests/pages/programmatic-changes.html +120 -0
  255. package/tests/pages/read-only.html +105 -0
  256. package/tests/pages/select.html +41 -0
  257. package/tests/pages/stepper.html +59 -0
  258. package/tests/pages/string-ace-editor.html +52 -0
  259. package/tests/pages/string-cleave.html +46 -0
  260. package/tests/pages/string-custom-attributes.html +62 -0
  261. package/tests/pages/string-formats.html +52 -0
  262. package/tests/pages/string-formats2.html +57 -0
  263. package/tests/pages/string-jodit-editor.html +49 -0
  264. package/tests/pages/string-sceditor.html +62 -0
  265. package/tests/pages/table-move-events.html +56 -0
  266. package/tests/pages/table.html +46 -0
  267. package/tests/pages/tabs.html +131 -0
  268. package/tests/pages/themes.html +527 -0
  269. package/tests/pages/translate-property.html +247 -0
  270. package/tests/pages/urn.html +93 -0
  271. package/tests/pages/uuid.html +72 -0
  272. package/tests/pages/validation.html +99 -0
  273. package/tests/unit/.eslintrc +8 -0
  274. package/tests/unit/core.spec.js +309 -0
  275. package/tests/unit/defaults.spec.js +40 -0
  276. package/tests/unit/editor.spec.js +160 -0
  277. package/tests/unit/editors/array.spec.js +86 -0
  278. package/tests/unit/editors/object.spec.js +79 -0
  279. package/tests/unit/editors/table.spec.js +91 -0
  280. package/tests/unit/readme.md +35 -0
  281. package/tests/unit/schemaloader.spec.js +498 -0
  282. package/tests/unit/validator.spec.js +94 -0
  283. package/tests/unit/validators/ip-validator.spec.js +62 -0
@@ -0,0 +1,51 @@
1
+ /* Implements ipv4, ipv6 and hostname format validations as per https://tools.ietf.org/html/draft-fge-json-schema-validation-00#section-7.3.4 */
2
+ const validateIpv4 = (value) => {
3
+ const parts = value.split('.')
4
+ if (parts.length !== 4) {
5
+ throw new Error('error_ipv4')
6
+ }
7
+ parts.forEach((part) => {
8
+ if (isNaN(+part) || +part < 0 || +part > 255) {
9
+ throw new Error('error_ipv4')
10
+ }
11
+ })
12
+ }
13
+
14
+ const validateIpv6 = (value) => {
15
+ if (!value.match(
16
+ '^(?:(?:(?:[a-fA-F0-9]{1,4}:){6}|(?=(?:[a-fA-F0-9]{0,4}:){2,6}(?:[0-9]{1,3}.){3}[0-9]{1,3}$)(([0-9a-fA-F]{1,4}:){1,5}|:)((:[0-9a-fA-F]{1,4}){1,5}:|:)|::(?:[a-fA-F0-9]{1,4}:){5})(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9]).){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])|(?:[a-fA-F0-9]{1,4}:){7}[a-fA-F0-9]{1,4}|(?=(?:[a-fA-F0-9]{0,4}:){0,7}[a-fA-F0-9]{0,4}$)(([0-9a-fA-F]{1,4}:){1,7}|:)((:[0-9a-fA-F]{1,4}){1,7}|:)|(?:[a-fA-F0-9]{1,4}:){7}:|:(:[a-fA-F0-9]{1,4}){7})$'
17
+ )) {
18
+ throw new Error('error_ipv6')
19
+ }
20
+ }
21
+
22
+ const validateHostname = (value) => {
23
+ if (!value.match(
24
+ '(?=^.{4,253}$)(^((?!-)[a-zA-Z0-9-]{0,62}[a-zA-Z0-9].)+[a-zA-Z]{2,63}$)'
25
+ )) {
26
+ throw new Error('error_hostname')
27
+ }
28
+ }
29
+
30
+ export function ipValidator (schema, value, path, translate) {
31
+ try {
32
+ switch (schema.format) {
33
+ case 'ipv4':
34
+ validateIpv4(value)
35
+ break
36
+ case 'ipv6':
37
+ validateIpv6(value)
38
+ break
39
+ case 'hostname':
40
+ validateHostname(value)
41
+ break
42
+ }
43
+ return []
44
+ } catch (err) {
45
+ return [{
46
+ path,
47
+ property: 'format',
48
+ message: translate(err.message)
49
+ }]
50
+ }
51
+ }
@@ -0,0 +1,3 @@
1
+ FROM node:12
2
+
3
+ ENV PATH=/repo/node_modules/.bin:$PATH
@@ -0,0 +1,48 @@
1
+ # Testing
2
+
3
+ ## With Docker
4
+
5
+ Configure Docker environment:
6
+
7
+ ```
8
+ cp .env-dist .env
9
+ ```
10
+
11
+ Install `node_modules` and start stack:
12
+ ```
13
+ docker-compose run --rm node npm install
14
+ docker-compose up -d
15
+ ```
16
+
17
+ - Webserver URL: http://127.0.0.1:9100/
18
+ - Selenium Firefox Browser URL: vnc://127.0.0.1:9059/
19
+ - Selenium Chrome Browser URL: vnc://127.0.0.1:9060/
20
+
21
+ ```
22
+ docker-compose exec node bash
23
+
24
+ $ npm run build
25
+ $ cd tests/codeceptjs
26
+ $ codeceptjs run
27
+ ```
28
+
29
+ Tests whose `Scenario` string contains the tag `@optional` will be ignored by the automated build process.
30
+
31
+
32
+ ### Development
33
+
34
+ To watch changes, eg. while development or fixing code you can run
35
+
36
+ ```
37
+ docker-compose run --rm node bash
38
+
39
+ $ npm start
40
+ ```
41
+
42
+ which effectively runs the Webpack development server in your project
43
+
44
+
45
+ ### References
46
+
47
+ - CodeceptJS - https://codecept.io
48
+ - Webdriver configuration - http://webdriver.io/guide/getstarted/configuration.html
@@ -0,0 +1,42 @@
1
+ {
2
+ "tests": "./**/*_test.js",
3
+ "timeout": 10000,
4
+ "output": "./output",
5
+ "plugins": {
6
+ "pauseOnFail": {}
7
+ },
8
+ "helpers": {
9
+ "WebDriver": {
10
+ "url": "http://node:9001/tests/pages/",
11
+ "browser": "firefox",
12
+ "restart": false,
13
+ "host": "firefox",
14
+ "smartWait": 5000
15
+ },
16
+ "customHelpers": {
17
+ "require": "./../../config/codeceptjs_helpers.js"
18
+ }
19
+ },
20
+ "include": {
21
+ "I": "./steps_file.js"
22
+ },
23
+ "bootstrap": false,
24
+ "mocha": {},
25
+ "name": "codeceptjs",
26
+ "multiple": {
27
+ "parallel": {
28
+ "chunks": 2
29
+ },
30
+ "basic": {
31
+ "browsers": [
32
+ "firefox",
33
+ {
34
+ "url": "http://node:9001/tests/pages/",
35
+ "browser": "chrome",
36
+ "host": "chrome",
37
+ "restart": false
38
+ }
39
+ ]
40
+ }
41
+ }
42
+ }
@@ -0,0 +1,143 @@
1
+ /* global Feature Scenario */
2
+
3
+ Feature('if-then-else')
4
+
5
+ Scenario('validate agaist allOf of if schemas @if-then-else', async ({ I }) => {
6
+ I.amOnPage('if-then-else-allOf.html')
7
+ I.waitForElement('.je-ready')
8
+
9
+ I.selectOption('[name="root[country]"]', 'United States of America')
10
+ I.waitForText('Value must match the pattern [0-9]{5}(-[0-9]{4})?.')
11
+
12
+ I.selectOption('[name="root[country]"]', 'Canada')
13
+ I.waitForText('Value must match the pattern [A-Z][0-9][A-Z] [0-9][A-Z][0-9].')
14
+
15
+ I.selectOption('[name="root[country]"]', 'Netherlands')
16
+ I.waitForText('Value must match the pattern [0-9]{4} [A-Z]{2}.')
17
+
18
+ I.fillField('#value', JSON.stringify({
19
+ street_address: '1600 Pennsylvania Avenue NW',
20
+ country: 'United States of America',
21
+ postal_code: '20500'
22
+ }))
23
+ I.click('#set-value')
24
+ I.dontSee('.invalid-feedback')
25
+
26
+ I.fillField('#value', JSON.stringify({
27
+ street_address: '1600 Pennsylvania Avenue NW',
28
+ postal_code: '20500'
29
+ }))
30
+ I.click('#set-value')
31
+ I.dontSee('.invalid-feedback')
32
+
33
+ I.fillField('#value', JSON.stringify({
34
+ street_address: '24 Sussex Drive',
35
+ country: 'Canada',
36
+ postal_code: 'K1M 1M4'
37
+ }))
38
+ I.click('#set-value')
39
+ I.dontSee('.invalid-feedback')
40
+
41
+ I.fillField('#value', JSON.stringify({
42
+ street_address: 'Adriaan Goekooplaan',
43
+ country: 'Netherlands',
44
+ postal_code: '2517 JX'
45
+ }))
46
+ I.click('#set-value')
47
+ I.dontSee('.invalid-feedback')
48
+
49
+ I.fillField('#value', JSON.stringify({
50
+ street_address: '24 Sussex Drive',
51
+ country: 'Canada',
52
+ postal_code: '10000'
53
+ }))
54
+ I.click('#set-value')
55
+ I.waitForText('Value must match the pattern [A-Z][0-9][A-Z] [0-9][A-Z][0-9].')
56
+ I.waitForElement('.invalid-feedback')
57
+
58
+ I.fillField('#value', JSON.stringify({
59
+ street_address: '1600 Pennsylvania Avenue NW',
60
+ postal_code: 'K1M 1M4'
61
+ }))
62
+ I.click('#set-value')
63
+ I.waitForElement('.invalid-feedback')
64
+ })
65
+
66
+ Scenario('validate agaist if-then-else @if-then-else', async ({ I }) => {
67
+ I.amOnPage('if-then-else.html')
68
+ I.waitForElement('.je-ready')
69
+
70
+ I.selectOption('[name="root[country]"]', 'America')
71
+ I.fillField('[name="root[postal_code]"]', 'K1M 1M4')
72
+ I.pressKey('Tab')
73
+ I.waitForElement('.invalid-feedback')
74
+ I.waitForText('Value must match the pattern [0-9]{5}(-[0-9]{4})?.')
75
+
76
+ I.selectOption('[name="root[country]"]', 'Canada')
77
+ I.fillField('[name="root[postal_code]"]', '10000')
78
+ I.pressKey('Tab')
79
+ I.waitForElement('.invalid-feedback')
80
+ I.waitForText('Value must match the pattern [A-Z][0-9][A-Z] [0-9][A-Z][0-9].')
81
+
82
+ I.selectOption('[name="root[country]"]', 'America')
83
+ I.fillField('[name="root[postal_code]"]', '10000')
84
+ I.pressKey('Tab')
85
+ I.dontSee('.invalid-feedback')
86
+
87
+ I.selectOption('[name="root[country]"]', 'Canada')
88
+ I.fillField('[name="root[postal_code]"]', 'K1M 1M4')
89
+ I.pressKey('Tab')
90
+ I.dontSee('.invalid-feedback')
91
+ })
92
+
93
+ Scenario('validate agaist if-then @if-then-else', async ({ I }) => {
94
+ I.amOnPage('if-then.html')
95
+ I.waitForElement('.je-ready')
96
+
97
+ I.selectOption('[name="root[country]"]', 'America')
98
+ I.fillField('[name="root[postal_code]"]', 'K1M 1M4')
99
+ I.pressKey('Tab')
100
+ I.waitForElement('.invalid-feedback')
101
+ I.waitForText('Value must match the pattern [0-9]{5}(-[0-9]{4})?.')
102
+
103
+ I.selectOption('[name="root[country]"]', 'Canada')
104
+ I.fillField('[name="root[postal_code]"]', '10000')
105
+ I.pressKey('Tab')
106
+ I.dontSee('.invalid-feedback')
107
+
108
+ I.selectOption('[name="root[country]"]', 'America')
109
+ I.fillField('[name="root[postal_code]"]', '10000')
110
+ I.pressKey('Tab')
111
+ I.dontSee('.invalid-feedback')
112
+
113
+ I.selectOption('[name="root[country]"]', 'Canada')
114
+ I.fillField('[name="root[postal_code]"]', 'K1M 1M4')
115
+ I.pressKey('Tab')
116
+ I.dontSee('.invalid-feedback')
117
+ })
118
+
119
+ Scenario('validate agaist if-else @if-then-else', async ({ I }) => {
120
+ I.amOnPage('if-else.html')
121
+ I.waitForElement('.je-ready')
122
+
123
+ I.selectOption('[name="root[country]"]', 'America')
124
+ I.fillField('[name="root[postal_code]"]', 'K1M 1M4')
125
+ I.pressKey('Tab')
126
+ I.dontSee('.invalid-feedback')
127
+
128
+ I.selectOption('[name="root[country]"]', 'Canada')
129
+ I.fillField('[name="root[postal_code]"]', '10000')
130
+ I.pressKey('Tab')
131
+ I.waitForElement('.invalid-feedback')
132
+ I.waitForText('Value must match the pattern [A-Z][0-9][A-Z] [0-9][A-Z][0-9].')
133
+
134
+ I.selectOption('[name="root[country]"]', 'America')
135
+ I.fillField('[name="root[postal_code]"]', '10000')
136
+ I.pressKey('Tab')
137
+ I.dontSee('.invalid-feedback')
138
+
139
+ I.selectOption('[name="root[country]"]', 'Canada')
140
+ I.fillField('[name="root[postal_code]"]', 'K1M 1M4')
141
+ I.pressKey('Tab')
142
+ I.dontSee('.invalid-feedback')
143
+ })
@@ -0,0 +1,217 @@
1
+ /* global Feature Scenario */
2
+
3
+ var assert = require('assert')
4
+
5
+ Feature('core')
6
+
7
+ Scenario('should Disable and enable entire form', async (I) => {
8
+ I.amOnPage('core.html')
9
+ I.seeElement('[data-schemapath="root.name"] input')
10
+ I.seeElement('[data-schemapath="root.age"] input')
11
+ I.click('disable')
12
+ I.seeElement('[data-schemapath="root.age"] input:disabled')
13
+ I.seeElement('[data-schemapath="root.name"] input:disabled')
14
+ I.click('enable')
15
+ I.seeElement('[data-schemapath="root.age"] input:not(:disabled)')
16
+ I.seeElement('[data-schemapath="root.name"] input:not(:disabled)')
17
+ })
18
+
19
+ Scenario('should Disable and enable part of the form', async (I) => {
20
+ I.amOnPage('core.html')
21
+ I.seeElement('[data-schemapath="root.name"] input')
22
+ I.seeElement('[data-schemapath="root.age"] input')
23
+ I.click('disable part')
24
+ I.seeElement('[data-schemapath="root.name"] input:disabled')
25
+ I.click('enable part')
26
+ I.seeElement('[data-schemapath="root.name"] input:not(:disabled)')
27
+ })
28
+
29
+ Scenario('should destroy', async (I) => {
30
+ I.amOnPage('core.html')
31
+ I.seeElement('[data-schemapath="root"]')
32
+ I.click('destroy')
33
+ I.dontSeeElement('[data-schemapath="root"]')
34
+ })
35
+
36
+ Scenario('should set and get form value', async (I) => {
37
+ I.amOnPage('core.html')
38
+ I.click('.get-value')
39
+ assert.equal(await I.grabValueFrom('.value'), '{"age":18,"name":"Francesco Avizzano"}')
40
+ I.click('.set-value')
41
+ I.click('.get-value')
42
+ assert.equal(await I.grabValueFrom('.value'), '{"age":40,"name":"John Smith"}')
43
+ })
44
+
45
+ Scenario('should set and get individual values', async (I) => {
46
+ I.amOnPage('core.html')
47
+ I.click('.get-individual-value')
48
+ assert.equal(await I.grabValueFrom('.value'), '"Francesco Avizzano"')
49
+ I.click('.set-individual-value')
50
+ assert.equal(await I.grabValueFrom('.value'), '"john kaminski"')
51
+ })
52
+
53
+ Scenario('should watch a specific field for changes', async (I) => {
54
+ I.amOnPage('core.html')
55
+ I.dontSeeElement('.name-changed')
56
+ I.click('.set-individual-value')
57
+ I.seeElement('.name-changed')
58
+ })
59
+
60
+ Scenario('should watch form for changes', async (I) => {
61
+ I.amOnPage('core.html')
62
+ I.dontSeeElement('.form-changed')
63
+ I.click('.set-value')
64
+ I.seeElement('.form-changed')
65
+ })
66
+
67
+ Scenario('should change the form if form_name_root option is set @core', async (I) => {
68
+ I.amOnPage('form-name.html')
69
+ I.see('Property must be set.', '.invalid-feedback')
70
+ I.seeElement('[data-schemapath="form_1"]')
71
+ I.seeElement('[data-schemapath="form_2"]')
72
+ I.seeElement('[name="form_1"]')
73
+ I.seeElement('[name="form_2"]')
74
+ I.seeElement('[id="form_1[0]"]')
75
+ I.seeElement('[id="form_1[1]"]')
76
+ I.seeElement('[id="form_1[2]"]')
77
+ I.seeElement('[id="form_2[0]"]')
78
+ I.seeElement('[id="form_2[1]"]')
79
+ I.seeElement('[id="form_2[2]"]')
80
+ I.seeElement('[for="form_1[0]"]')
81
+ I.seeElement('[for="form_1[1]"]')
82
+ I.seeElement('[for="form_1[2]"]')
83
+ I.seeElement('[for="form_2[0]"]')
84
+ I.seeElement('[for="form_2[1]"]')
85
+ I.seeElement('[for="form_2[2]"]')
86
+ I.click('[for="form_1[0]"]')
87
+ I.click('[for="form_2[1]"]')
88
+ I.dontSee('Property must be set.', '.invalid-feedback')
89
+ I.click('#get-value-form-1')
90
+ assert.equal(await I.grabValueFrom('#value-form-1'), '"yes"')
91
+ I.click('#get-value-form-2')
92
+ assert.equal(await I.grabValueFrom('#value-form-2'), '"no"')
93
+ })
94
+
95
+ Scenario('should validate against oneOf schemas and display single oneOf and editors error messages @core @oneof', async (I) => {
96
+ I.amOnPage('oneof.html')
97
+ I.waitForText('Object is missing the required property \'p4\'', '.alert-danger')
98
+ I.waitForText('Value must validate against exactly one of the provided schemas. It currently validates against 0 of the schemas.', '.alert-danger')
99
+ I.waitForText('Object is missing the required property \'p1\'', '.alert-danger')
100
+ I.waitForText('Object is missing the required property \'p2\'', '.alert-danger')
101
+ I.waitForText('Property must be set.', '[data-schemapath="root.p4"] .invalid-feedback')
102
+ I.waitForText('Property must be set.', '[data-schemapath="root.p5.p1"] .invalid-feedback')
103
+ I.waitForText('Property must be set.', '[data-schemapath="root.p5.p2"] .invalid-feedback')
104
+ I.fillField('root[p4]', 'to')
105
+ I.fillField('root[p5][p1]', 'to')
106
+ I.fillField('root[p5][p2]', 'to')
107
+ I.click('Get Value')
108
+ I.wait(3)
109
+ I.dontSee('Object is missing the required property \'p4\'', '.alert-danger')
110
+ I.dontSee('Object is missing the required property \'p1\'', '.alert-danger')
111
+ I.dontSee('Object is missing the required property \'p2\'', '.alert-danger')
112
+ I.waitForText('Value must be at least 4 characters long.', '[data-schemapath="root.p4"] .invalid-feedback')
113
+ I.waitForText('Value must be at least 4 characters long.', '[data-schemapath="root.p5.p1"] .invalid-feedback')
114
+ I.waitForText('Value must be at least 4 characters long.', '[data-schemapath="root.p5.p2"] .invalid-feedback')
115
+ I.fillField('root[p4]', 'todo')
116
+ I.fillField('root[p5][p1]', 'todo')
117
+ I.fillField('root[p5][p2]', 'todo')
118
+ I.click('Get Value')
119
+ I.wait(3)
120
+ I.dontSee('Value must be at least 4 characters long.', '[data-schemapath="root.p4"] .invalid-feedback')
121
+ I.dontSee('Value must be at least 4 characters long.', '[data-schemapath="root.p5.p1"] .invalid-feedback')
122
+ I.dontSee('Value must be at least 4 characters long.', '[data-schemapath="root.p5.p2"] .invalid-feedback')
123
+ })
124
+
125
+ Scenario('should validate against anyOf schemas and display single anyOf and editors error messages @core @anyof', async (I) => {
126
+ I.amOnPage('anyof.html')
127
+ I.dontSeeElement('.alert-danger')
128
+ I.selectOption('.je-switcher', 'Value, number')
129
+ I.dontSeeElement('.alert-danger')
130
+ I.selectOption('.je-switcher', 'Value, null')
131
+ I.dontSeeElement('.alert-danger')
132
+ I.selectOption('.je-switcher', 'Value, string')
133
+ I.waitForText('Object is missing the required property \'age\'', '.alert-danger')
134
+ I.waitForText('Property must be set.', '[data-schemapath="root.age"] .invalid-feedback')
135
+ I.fillField('root[age]', 'to')
136
+ I.click('Get Value')
137
+ I.wait(3)
138
+ I.dontSee('Object is missing the required property \'age\'', '.alert-danger')
139
+ I.dontSee('Property must be set.', '[data-schemapath="root.age"] .invalid-feedback')
140
+ })
141
+
142
+ Scenario('should display anyOf and oneOf error messages in the correct places @848', async (I) => {
143
+ I.amOnPage('issues/issue-gh-848.html')
144
+ I.selectOption('.je-switcher', 'Value, string')
145
+ I.waitForElement('[data-schemapath="root.list"] .invalid-feedback', 5)
146
+ I.dontSeeElement('[data-schemapath="root.list_group"] .invalid-feedback', 5)
147
+ })
148
+
149
+ Scenario('should validate against oneOf schemas and display single oneOf and editors error messages @core @translate-property', async (I) => {
150
+ I.amOnPage('translate-property.html?lang=en')
151
+ I.waitForText('Object Title')
152
+ I.waitForText('Object Description')
153
+ I.waitForText('Boolean Title')
154
+ I.waitForText('Boolean Description')
155
+ I.seeInSource('Boolean Info Text')
156
+ I.waitForText('String Title')
157
+ I.waitForText('String Description')
158
+ I.seeInSource('String Info Text')
159
+ I.waitForText('String Radio Title')
160
+ I.waitForText('String Radio Description')
161
+ I.seeInSource('String Radio Info Text')
162
+ I.waitForText('Integer Title')
163
+ I.waitForText('Integer Description')
164
+ I.seeInSource('Integer Info Text')
165
+ I.waitForText('Number Title')
166
+ I.waitForText('Number Description')
167
+ I.seeInSource('Number Info Text')
168
+ I.waitForText('Array Title')
169
+ I.waitForText('Array Description')
170
+ I.seeInSource('Array Info Text')
171
+ I.waitForText('Array Tabs Title')
172
+ I.waitForText('Array Tabs Description')
173
+ I.seeInSource('Array Tabs Info Text')
174
+ I.waitForText('Array Table Title')
175
+ I.waitForText('Array Table Description')
176
+ I.seeInSource('Array Table Info Text')
177
+ I.waitForText('Signature Title')
178
+ I.waitForText('Signature Description')
179
+ I.seeInSource('Signature Info Text')
180
+ I.waitForText('Rating Title')
181
+ I.waitForText('Rating Description')
182
+ I.seeInSource('Rating Info Text')
183
+
184
+ I.amOnPage('translate-property.html?lang=de')
185
+ I.waitForText('Object Title (but in german)')
186
+ I.waitForText('Object Description (but in german)')
187
+ I.waitForText('Boolean Title (but in german)')
188
+ I.waitForText('Boolean Description (but in german)')
189
+ I.seeInSource('Boolean Info Text (but in german)')
190
+ I.waitForText('String Title (but in german)')
191
+ I.waitForText('String Description (but in german)')
192
+ I.seeInSource('String Info Text (but in german)')
193
+ I.waitForText('String Radio Title (but in german)')
194
+ I.waitForText('String Radio Description (but in german)')
195
+ I.seeInSource('String Radio Info Text (but in german)')
196
+ I.waitForText('Integer Title (but in german)')
197
+ I.waitForText('Integer Description (but in german)')
198
+ I.seeInSource('Integer Info Text (but in german)')
199
+ I.waitForText('Number Title (but in german)')
200
+ I.waitForText('Number Description (but in german)')
201
+ I.seeInSource('Number Info Text (but in german)')
202
+ I.waitForText('Array Title (but in german)')
203
+ I.waitForText('Array Description (but in german)')
204
+ I.seeInSource('Array Info Text (but in german)')
205
+ I.waitForText('Array Tabs Title (but in german)')
206
+ I.waitForText('Array Tabs Description (but in german)')
207
+ I.seeInSource('Array Tabs Info Text (but in german)')
208
+ I.waitForText('Array Table Title (but in german)')
209
+ I.waitForText('Array Table Description (but in german)')
210
+ I.seeInSource('Array Table Info Text (but in german)')
211
+ I.waitForText('Signature Title (but in german)')
212
+ I.waitForText('Signature Description (but in german)')
213
+ I.seeInSource('Signature Info Text (but in german)')
214
+ I.waitForText('Rating Title (but in german)')
215
+ I.waitForText('Rating Description (but in german)')
216
+ I.seeInSource('Rating Info Text (but in german)')
217
+ })
@@ -0,0 +1,13 @@
1
+
2
+ Feature('Advanced Editor');
3
+
4
+ Scenario('test validation & delete', (I) => {
5
+ I.amOnPage('advanced.html');
6
+ I.seeElement('#valid_indicator');
7
+ I.see('valid', '#valid_indicator');
8
+ I.fillField('root[0][location][city]', 'Stuttgart');
9
+ I.waitForValue("[name='root[0][location][city]']", 'Stuttgart');
10
+ I.amAcceptingPopups();
11
+ I.click('.json-editor-btntype-deletelast');
12
+ I.acceptPopup();
13
+ });
@@ -0,0 +1,50 @@
1
+ var assert = require('assert');
2
+
3
+ Feature('anyof in array');
4
+
5
+ Scenario('should have correct initial value', async (I) => {
6
+ I.amOnPage('array-anyof.html');
7
+ I.click('.get-value');
8
+ assert.equal(await I.grabValueFrom('.debug'), '{"correct":"","items":[]}');
9
+ });
10
+
11
+ Scenario('should show errors @optional', async (I) => {
12
+ I.amOnPage('array-anyof.html');
13
+ I.seeElement('[data-schemapath="root"]');
14
+ I.seeElement('[data-schemapath="root.items"]');
15
+
16
+ I.click('.get-value');
17
+ value = await I.grabValueFrom('.debug');
18
+ assert.equal(value, '{"correct":"","items":[]}');
19
+
20
+ I.fillField('root[correct]', 'a');
21
+ assert.equal(await I.dontSee('Value must match the pattern ^[a-zA-Z0-9_]+$.'), true, 'should show warning');
22
+
23
+ I.fillField('root[correct]', 'a!');
24
+ assert.equal(await I.seeInField('root[correct]', 'a!'), true, 'fillField failed');
25
+ assert.equal(await I.see('Value must match the pattern ^[a-zA-Z0-9_]+$.'), true, 'should show warning');
26
+
27
+ I.clearField('root[correct]');
28
+ I.seeInField('root[correct]', '');
29
+ assert.equal(await I.see('Value must match the pattern ^[a-zA-Z0-9_]+$.'), true, "should show warning");
30
+
31
+ I.fillField('root[correct]', 'a');
32
+ I.dontSee('Value must match the pattern ^[a-zA-Z0-9_]+$.');
33
+
34
+ I.click('.json-editor-btntype-add');
35
+ I.click('.get-value');
36
+ value = await I.grabValueFrom('.debug');
37
+ assert.equal(value, '{"correct":"a","items":[{"handler":"aaa","id":"","___a":""}]}');
38
+
39
+ I.fillField('root[items][0][id]', 'a');
40
+ I.dontSee('Value must match the pattern ^[a-zA-Z0-9_]+$.');
41
+
42
+ I.clearField('root[items][0][id]');
43
+ I.seeInField('root[items][0][id]', '');
44
+ // todo still not work
45
+ assert.equal(await I.see('Value must match the pattern ^[a-zA-Z0-9_]+$.'), true, 'should show warning');
46
+
47
+ I.fillField('root[items][0][id]', 'a!');
48
+ I.see('Value must match the pattern ^[a-zA-Z0-9_]+$.');
49
+
50
+ });