@json-editor/json-editor 1.4.0-beta.0 → 1.17.0

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 (435) hide show
  1. package/.claude/settings.local.json +8 -0
  2. package/.env +2 -0
  3. package/.env-dist +2 -0
  4. package/.eslintrc +10 -0
  5. package/.github/PULL_REQUEST_TEMPLATE.md +9 -0
  6. package/.github/workflows/build.yml +70 -0
  7. package/.travis.yml +62 -16
  8. package/CHANGELOG.md +483 -113
  9. package/CONTRIBUTING.md +43 -4
  10. package/Makefile +26 -0
  11. package/README.md +632 -121
  12. package/README_ADDON.md +577 -0
  13. package/UPGRADING.md +46 -0
  14. package/build/CssToJson.js +55 -0
  15. package/codecept.conf.js +35 -0
  16. package/config/.eslintrc +7 -0
  17. package/config/codeceptjs_helpers.js +146 -0
  18. package/config/helpers.js +10 -0
  19. package/config/karma.conf.js +89 -0
  20. package/config/readme.md +31 -0
  21. package/config/webpack.common.js +71 -0
  22. package/config/webpack.dev.js +15 -0
  23. package/config/webpack.nonmin.js +19 -0
  24. package/config/webpack.prod.js +24 -0
  25. package/dist/jsoneditor.js +2 -11550
  26. package/dist/jsoneditor.js.LICENSE.txt +15 -0
  27. package/dist/nonmin/jsoneditor.js +31392 -0
  28. package/dist/nonmin/jsoneditor.js.map +1 -0
  29. package/docs/basic.html +2 -2
  30. package/docs/basic_person.json +2 -1
  31. package/docs/choices.html +86 -0
  32. package/docs/cleave.html +11 -19
  33. package/docs/colorpicker.html +194 -0
  34. package/docs/css_integration.html +56 -54
  35. package/docs/custom-editor.html +92 -0
  36. package/docs/datetime.html +48 -21
  37. package/docs/describedby.html +42 -35
  38. package/docs/enumsource.html +67 -0
  39. package/docs/form-submission.html +162 -0
  40. package/docs/imask.html +192 -0
  41. package/docs/index.html +600 -582
  42. package/docs/materialize_css.html +1 -1
  43. package/docs/meta-schema.html +793 -0
  44. package/docs/meta_schema.json +446 -400
  45. package/docs/polyfills/assign.js +29 -0
  46. package/docs/radio.html +9 -17
  47. package/docs/recursive.html +15 -17
  48. package/docs/scripts/ajv-validator.js +8695 -0
  49. package/docs/select2.html +15 -9
  50. package/docs/selectize.html +11 -9
  51. package/docs/signature.html +12 -11
  52. package/docs/starrating.html +5 -17
  53. package/docs/upload.html +33 -23
  54. package/docs/uuid.html +70 -0
  55. package/docs/wysiwyg.html +14 -7
  56. package/jasmine.json +11 -0
  57. package/package.json +74 -25
  58. package/release-notes.md +90 -0
  59. package/src/core.js +411 -611
  60. package/src/defaults.js +381 -327
  61. package/src/editor.js +733 -544
  62. package/src/editors/ace.js +90 -0
  63. package/src/editors/array/choices.js +104 -0
  64. package/src/editors/array/select2.js +112 -0
  65. package/src/editors/array/selectize.js +107 -130
  66. package/src/editors/array.css +9 -0
  67. package/src/editors/array.css.js +3 -0
  68. package/src/editors/array.js +812 -695
  69. package/src/editors/autocomplete.js +59 -0
  70. package/src/editors/base64.js +148 -129
  71. package/src/editors/button.js +104 -0
  72. package/src/editors/checkbox.js +111 -76
  73. package/src/editors/choices.css +3 -0
  74. package/src/editors/choices.css.js +3 -0
  75. package/src/editors/choices.js +71 -0
  76. package/src/editors/colorpicker.js +105 -0
  77. package/src/editors/datetime.js +93 -79
  78. package/src/editors/describedby.js +141 -125
  79. package/src/editors/enum.js +131 -116
  80. package/src/editors/hidden.js +100 -86
  81. package/src/editors/index.js +81 -0
  82. package/src/editors/info.js +28 -0
  83. package/src/editors/integer.js +21 -8
  84. package/src/editors/ip.js +36 -0
  85. package/src/editors/jodit.js +66 -0
  86. package/src/editors/multiple.js +380 -241
  87. package/src/editors/multiselect.js +207 -207
  88. package/src/editors/null.js +15 -11
  89. package/src/editors/number.js +39 -30
  90. package/src/editors/object.css +41 -0
  91. package/src/editors/object.css.js +3 -0
  92. package/src/editors/object.js +1190 -1068
  93. package/src/editors/radio.js +117 -101
  94. package/src/editors/sceditor.js +74 -0
  95. package/src/editors/select.js +318 -342
  96. package/src/editors/select2.js +112 -0
  97. package/src/editors/selectize.js +89 -338
  98. package/src/editors/signature.js +100 -104
  99. package/src/editors/simplemde.js +103 -0
  100. package/src/{styles → editors}/starrating.css +11 -2
  101. package/src/editors/starrating.css.js +3 -0
  102. package/src/editors/starrating.js +126 -95
  103. package/src/editors/stepper.js +27 -0
  104. package/src/editors/string.js +352 -426
  105. package/src/editors/table.js +486 -410
  106. package/src/editors/upload.js +297 -131
  107. package/src/editors/uuid.js +49 -0
  108. package/src/iconlib.js +22 -27
  109. package/src/iconlibs/bootstrap.js +28 -0
  110. package/src/iconlibs/bootstrap2.js +28 -17
  111. package/src/iconlibs/bootstrap3.js +28 -17
  112. package/src/iconlibs/fontawesome3.js +28 -17
  113. package/src/iconlibs/fontawesome4.js +28 -18
  114. package/src/iconlibs/fontawesome5.js +28 -18
  115. package/src/iconlibs/foundation2.js +24 -17
  116. package/src/iconlibs/foundation3.js +28 -17
  117. package/src/iconlibs/index.js +27 -0
  118. package/src/iconlibs/jqueryui.js +28 -17
  119. package/src/iconlibs/materialicons.js +49 -44
  120. package/src/iconlibs/openiconic.js +28 -0
  121. package/src/iconlibs/spectre.js +28 -0
  122. package/src/resolvers.js +135 -0
  123. package/src/schemaloader.js +639 -0
  124. package/src/style.css +157 -0
  125. package/src/style.css.js +3 -0
  126. package/src/templates/default.js +46 -51
  127. package/src/templates/ejs.js +8 -10
  128. package/src/templates/handlebars.js +1 -3
  129. package/src/templates/hogan.js +7 -9
  130. package/src/templates/index.js +21 -0
  131. package/src/templates/lodash.js +6 -8
  132. package/src/templates/markup.js +6 -8
  133. package/src/templates/mustache.js +6 -8
  134. package/src/templates/swig.js +1 -3
  135. package/src/templates/underscore.js +6 -8
  136. package/src/theme.js +717 -433
  137. package/src/themes/barebones.css +35 -0
  138. package/src/themes/barebones.css.js +3 -0
  139. package/src/themes/barebones.js +31 -0
  140. package/src/themes/bootstrap2.js +302 -265
  141. package/src/themes/bootstrap3.css +53 -0
  142. package/src/themes/bootstrap3.css.js +3 -0
  143. package/src/themes/bootstrap3.js +355 -262
  144. package/src/themes/bootstrap4.css +89 -0
  145. package/src/themes/bootstrap4.css.js +3 -0
  146. package/src/themes/bootstrap4.js +743 -237
  147. package/src/themes/bootstrap5.css +97 -0
  148. package/src/themes/bootstrap5.css.js +3 -0
  149. package/src/themes/bootstrap5.js +687 -0
  150. package/src/themes/foundation.js +535 -472
  151. package/src/themes/html.css +60 -0
  152. package/src/themes/html.css.js +3 -0
  153. package/src/themes/html.js +69 -82
  154. package/src/themes/index.js +29 -0
  155. package/src/themes/jqueryui.js +181 -167
  156. package/src/themes/materialize.js +263 -292
  157. package/src/themes/spectre.css +208 -0
  158. package/src/themes/spectre.css.js +3 -0
  159. package/src/themes/spectre.js +443 -0
  160. package/src/themes/tailwind.css +303 -0
  161. package/src/themes/tailwind.css.js +3 -0
  162. package/src/themes/tailwind.js +469 -0
  163. package/src/utilities.js +127 -68
  164. package/src/validator.js +909 -565
  165. package/src/validators/ip-validator.js +51 -0
  166. package/tests/Dockerfile +3 -0
  167. package/tests/README.md +25 -5
  168. package/tests/codeceptjs/codecept.json +9 -2
  169. package/tests/codeceptjs/constrains/contains_test.js +37 -0
  170. package/tests/codeceptjs/constrains/dependentRequired_test.js +33 -0
  171. package/tests/codeceptjs/constrains/dependentSchemas_test.js +16 -0
  172. package/tests/codeceptjs/constrains/if-then-else_test.js +186 -0
  173. package/tests/codeceptjs/core_test.js +534 -63
  174. package/tests/codeceptjs/editors/advanced_test.js +12 -9
  175. package/tests/codeceptjs/editors/array_any_of_test.js +50 -0
  176. package/tests/codeceptjs/editors/array_test.js +923 -657
  177. package/tests/codeceptjs/editors/autocomplete_test.js +15 -0
  178. package/tests/codeceptjs/editors/button_test.js +50 -0
  179. package/tests/codeceptjs/editors/checkbox_test.js +21 -6
  180. package/tests/codeceptjs/editors/colorpicker_test.js +29 -0
  181. package/tests/codeceptjs/editors/datetime_test.js +33 -0
  182. package/tests/codeceptjs/editors/inheritance_test.js +10 -0
  183. package/tests/codeceptjs/editors/integer_test.js +82 -64
  184. package/tests/codeceptjs/editors/jodit_test.js +23 -0
  185. package/tests/codeceptjs/editors/multiple_test.js +27 -0
  186. package/tests/codeceptjs/editors/multiselect_test.js +6 -7
  187. package/tests/codeceptjs/editors/number_test.js +75 -60
  188. package/tests/codeceptjs/editors/object_test.js +322 -80
  189. package/tests/codeceptjs/editors/option-no_default_values_test.js +42 -0
  190. package/tests/codeceptjs/editors/programmatic-changes_test.js +20 -0
  191. package/tests/codeceptjs/editors/purify_test.js +26 -0
  192. package/tests/codeceptjs/editors/radio_test.js +9 -0
  193. package/tests/codeceptjs/editors/range_test.js +10 -0
  194. package/tests/codeceptjs/editors/rating_test.js +10 -10
  195. package/tests/codeceptjs/editors/select_test.js +47 -18
  196. package/tests/codeceptjs/editors/starrating_test.js +15 -0
  197. package/tests/codeceptjs/editors/stepper_test.js +37 -0
  198. package/tests/codeceptjs/editors/string_test.js +107 -91
  199. package/tests/codeceptjs/editors/table-confirm-delete_test.js +60 -54
  200. package/tests/codeceptjs/editors/tabs_test.js +15 -11
  201. package/tests/codeceptjs/editors/uuid_test.js +48 -0
  202. package/tests/codeceptjs/editors/validation_test.js +13 -9
  203. package/tests/codeceptjs/issues/issue-gh-1133_test.js +9 -0
  204. package/tests/codeceptjs/issues/issue-gh-1158-2_test.js +10 -0
  205. package/tests/codeceptjs/issues/issue-gh-1158_test.js +8 -0
  206. package/tests/codeceptjs/issues/issue-gh-1164_test.js +9 -0
  207. package/tests/codeceptjs/issues/issue-gh-1171_test.js +11 -0
  208. package/tests/codeceptjs/issues/issue-gh-1211_test.js +17 -0
  209. package/tests/codeceptjs/issues/issue-gh-1257_test.js +11 -0
  210. package/tests/codeceptjs/issues/issue-gh-1272_test.js +21 -0
  211. package/tests/codeceptjs/issues/issue-gh-1330_test.js +8 -0
  212. package/tests/codeceptjs/issues/issue-gh-1338_test.js +18 -0
  213. package/tests/codeceptjs/issues/issue-gh-1347_test.js +8 -0
  214. package/tests/codeceptjs/issues/issue-gh-1364_test.js +13 -0
  215. package/tests/codeceptjs/issues/issue-gh-1367_test.js +11 -0
  216. package/tests/codeceptjs/issues/issue-gh-1383_test.js +9 -0
  217. package/tests/codeceptjs/issues/issue-gh-1384_test.js +9 -0
  218. package/tests/codeceptjs/issues/issue-gh-1410_test.js +13 -0
  219. package/tests/codeceptjs/issues/issue-gh-1422_test.js +9 -0
  220. package/tests/codeceptjs/issues/issue-gh-1431_test.js +12 -0
  221. package/tests/codeceptjs/issues/issue-gh-1439_test.js +12 -0
  222. package/tests/codeceptjs/issues/issue-gh-1452_test.js +10 -0
  223. package/tests/codeceptjs/issues/issue-gh-1453_test.js +18 -0
  224. package/tests/codeceptjs/issues/issue-gh-1461_test.js +14 -0
  225. package/tests/codeceptjs/issues/issue-gh-1463_test.js +9 -0
  226. package/tests/codeceptjs/issues/issue-gh-1471_test.js +17 -0
  227. package/tests/codeceptjs/issues/issue-gh-1485_test.js +13 -0
  228. package/tests/codeceptjs/issues/issue-gh-1491_test.js +9 -0
  229. package/tests/codeceptjs/issues/issue-gh-1525_test.js +9 -0
  230. package/tests/codeceptjs/issues/issue-gh-1536_test.js +12 -0
  231. package/tests/codeceptjs/issues/issue-gh-1538_test.js +10 -0
  232. package/tests/codeceptjs/issues/issue-gh-1541_test.js +8 -0
  233. package/tests/codeceptjs/issues/issue-gh-1559_test.js +15 -0
  234. package/tests/codeceptjs/issues/issue-gh-1562_test.js +12 -0
  235. package/tests/codeceptjs/issues/issue-gh-1586_test.js +15 -0
  236. package/tests/codeceptjs/issues/issue-gh-1636_test.js +9 -0
  237. package/tests/codeceptjs/issues/issue-gh-795_test.js +13 -0
  238. package/tests/codeceptjs/issues/issue-gh-810_test.js +52 -0
  239. package/tests/codeceptjs/issues/issue-gh-812_test.js +25 -0
  240. package/tests/codeceptjs/meta-schema_test.js +85 -0
  241. package/tests/codeceptjs/schemaloader_test.js +14 -0
  242. package/tests/codeceptjs/steps.d.ts +13 -0
  243. package/tests/codeceptjs/steps_file.js +4 -4
  244. package/tests/codeceptjs/test-config.js +3 -0
  245. package/tests/codeceptjs/themes_test.js +564 -0
  246. package/tests/docker-compose-local.yml +5 -0
  247. package/tests/docker-compose.yml +11 -19
  248. package/tests/fixtures/basic_person.json +2 -1
  249. package/tests/fixtures/definitions.json +22 -0
  250. package/tests/fixtures/nested_object.json +26 -0
  251. package/tests/fixtures/properties.json +20 -0
  252. package/tests/fixtures/some_types.json +32 -0
  253. package/tests/fixtures/validation.json +1347 -0
  254. package/tests/pages/_demo.html +475 -0
  255. package/tests/pages/advanced.html +1 -1
  256. package/tests/pages/anyof-2.html +91 -0
  257. package/tests/pages/anyof.html +82 -0
  258. package/tests/pages/array-anyof.html +145 -0
  259. package/tests/pages/array-checkboxes-infotext.html +55 -0
  260. package/tests/pages/array-checkboxes.html +5 -2
  261. package/tests/pages/array-choices.html +48 -0
  262. package/tests/pages/array-events-table.html +70 -0
  263. package/tests/pages/array-events.html +75 -0
  264. package/tests/pages/array-header-template.html +60 -0
  265. package/tests/pages/array-integers.html +5 -2
  266. package/tests/pages/array-multiselects.html +5 -2
  267. package/tests/pages/array-nested-arrays.html +5 -2
  268. package/tests/pages/array-numbers.html +5 -2
  269. package/tests/pages/array-objects.html +5 -2
  270. package/tests/pages/array-ratings.html +5 -2
  271. package/tests/pages/array-selectize-create.html +63 -0
  272. package/tests/pages/array-selectize.html +10 -8
  273. package/tests/pages/array-selects.html +5 -2
  274. package/tests/pages/array-strings.html +5 -2
  275. package/tests/pages/array-table-responsive.html +66 -0
  276. package/tests/pages/array-unique-items-sort.html +81 -0
  277. package/tests/pages/array.html +5 -2
  278. package/tests/pages/assets/autocomplete.css +1 -0
  279. package/tests/pages/assets/autocomplete.min.js +1 -0
  280. package/tests/pages/assets/pages.css +130 -0
  281. package/tests/pages/autocomplete.html +72 -0
  282. package/tests/pages/button-callbacks.html +79 -0
  283. package/tests/pages/button-icons.html +39 -0
  284. package/tests/pages/button_state_mode_1.html +35 -0
  285. package/tests/pages/button_state_mode_2.html +36 -0
  286. package/tests/pages/checkbox-labels.html +116 -0
  287. package/tests/pages/colorpicker-no-3rd-party.html +45 -0
  288. package/tests/pages/colorpicker-use-vanilla-picker.html +52 -0
  289. package/tests/pages/container-attributes.html +51 -0
  290. package/tests/pages/contains.html +39 -0
  291. package/tests/pages/core.html +14 -7
  292. package/tests/pages/datetime.html +78 -0
  293. package/tests/pages/dependentRequired.html +72 -0
  294. package/tests/pages/dependentSchemas.html +53 -0
  295. package/tests/pages/disable-button-in-object-editors.html +57 -0
  296. package/tests/pages/editor-show-validation-errors.html +54 -0
  297. package/tests/pages/enforce-const.html +168 -0
  298. package/tests/pages/error-messages.html +48 -0
  299. package/tests/pages/form-name.html +111 -0
  300. package/tests/pages/grid-strict.html +10 -13
  301. package/tests/pages/grid.html +4 -7
  302. package/tests/pages/if-else.html +58 -0
  303. package/tests/pages/if-then-else-allOf.html +118 -0
  304. package/tests/pages/if-then-else-disable-fields.html +70 -0
  305. package/tests/pages/if-then-else.html +65 -0
  306. package/tests/pages/if-then.html +58 -0
  307. package/tests/pages/inheritance.html +80 -0
  308. package/tests/pages/integer.html +17 -10
  309. package/tests/pages/issues/_template.html +50 -0
  310. package/tests/pages/issues/issue-gh-1133.html +64 -0
  311. package/tests/pages/issues/issue-gh-1158-2.html +189 -0
  312. package/tests/pages/issues/issue-gh-1158.html +50 -0
  313. package/tests/pages/issues/issue-gh-1164.html +71 -0
  314. package/tests/pages/issues/issue-gh-1165.html +63 -0
  315. package/tests/pages/issues/issue-gh-1165.json +8 -0
  316. package/tests/pages/issues/issue-gh-1171.html +39 -0
  317. package/tests/pages/issues/issue-gh-1211.html +1022 -0
  318. package/tests/pages/issues/issue-gh-1233-failing.html +46 -0
  319. package/tests/pages/issues/issue-gh-1233-passing.html +49 -0
  320. package/tests/pages/issues/issue-gh-1257.html +77 -0
  321. package/tests/pages/issues/issue-gh-1272.html +167 -0
  322. package/tests/pages/issues/issue-gh-1330.html +52 -0
  323. package/tests/pages/issues/issue-gh-1338.html +74 -0
  324. package/tests/pages/issues/issue-gh-1347.html +142 -0
  325. package/tests/pages/issues/issue-gh-1364.html +64 -0
  326. package/tests/pages/issues/issue-gh-1367.html +49 -0
  327. package/tests/pages/issues/issue-gh-1383.html +31 -0
  328. package/tests/pages/issues/issue-gh-1383.json +14 -0
  329. package/tests/pages/issues/issue-gh-1384.html +31 -0
  330. package/tests/pages/issues/issue-gh-1384.json +36 -0
  331. package/tests/pages/issues/issue-gh-1410.html +57 -0
  332. package/tests/pages/issues/issue-gh-1422.html +68 -0
  333. package/tests/pages/issues/issue-gh-1431.html +49 -0
  334. package/tests/pages/issues/issue-gh-1439.html +69 -0
  335. package/tests/pages/issues/issue-gh-1452.html +98 -0
  336. package/tests/pages/issues/issue-gh-1453.html +45 -0
  337. package/tests/pages/issues/issue-gh-1461.html +55 -0
  338. package/tests/pages/issues/issue-gh-1463.html +41 -0
  339. package/tests/pages/issues/issue-gh-1466.html +63 -0
  340. package/tests/pages/issues/issue-gh-1471.html +49 -0
  341. package/tests/pages/issues/issue-gh-1485.html +59 -0
  342. package/tests/pages/issues/issue-gh-1491.html +59 -0
  343. package/tests/pages/issues/issue-gh-1525.html +62 -0
  344. package/tests/pages/issues/issue-gh-1536.html +55 -0
  345. package/tests/pages/issues/issue-gh-1538.html +56 -0
  346. package/tests/pages/issues/issue-gh-1541.html +51 -0
  347. package/tests/pages/issues/issue-gh-1541.json +9 -0
  348. package/tests/pages/issues/issue-gh-1559.html +68 -0
  349. package/tests/pages/issues/issue-gh-1562.html +170 -0
  350. package/tests/pages/issues/issue-gh-1586.html +48 -0
  351. package/tests/pages/issues/issue-gh-1636.html +52 -0
  352. package/tests/pages/issues/issue-gh-795.html +58 -0
  353. package/tests/pages/issues/issue-gh-810.html +149 -0
  354. package/tests/pages/issues/issue-gh-812.html +113 -0
  355. package/tests/pages/issues/issue-gh-823-meta-schema.html +35 -0
  356. package/tests/pages/issues/issue-gh-848.html +81 -0
  357. package/tests/pages/keep_only_existing_values.html +81 -0
  358. package/tests/pages/load-events.html +61 -0
  359. package/tests/pages/maxContains.html +40 -0
  360. package/tests/pages/meta-schema.html +793 -0
  361. package/tests/pages/meta_schema.json +740 -0
  362. package/tests/pages/minContains.html +40 -0
  363. package/tests/pages/number.html +53 -6
  364. package/tests/pages/object-case-sensitive-property-search-false.html +42 -0
  365. package/tests/pages/object-case-sensitive-property-search-true.html +42 -0
  366. package/tests/pages/object-no-additional-properties.html +68 -0
  367. package/tests/pages/object-no-duplicated-id.html +70 -0
  368. package/tests/pages/object-required-properties.html +56 -20
  369. package/tests/pages/object-show-opt-in.html +111 -0
  370. package/tests/pages/object-with-dependencies-array.html +58 -0
  371. package/tests/pages/object-with-dependencies.html +62 -0
  372. package/tests/pages/object.html +5 -3
  373. package/tests/pages/oneof-2.html +91 -0
  374. package/tests/pages/oneof.html +105 -0
  375. package/tests/pages/opt-in-widget.html +134 -0
  376. package/tests/pages/option-dependencies.html +107 -0
  377. package/tests/pages/option-no_default_values.html +60 -0
  378. package/tests/pages/per-editor-options.html +44 -0
  379. package/tests/pages/placeholder-options.html +57 -0
  380. package/tests/pages/programmatic-changes.html +121 -0
  381. package/tests/pages/prompt-paste-max-length-reached.html +51 -0
  382. package/tests/pages/purify.html +66 -0
  383. package/tests/pages/range.html +62 -0
  384. package/tests/pages/read-only.html +60 -8
  385. package/tests/pages/ready.html +44 -0
  386. package/tests/pages/references.html +168 -0
  387. package/tests/pages/remove-false-properties.html +85 -0
  388. package/tests/pages/select-values.html +91 -0
  389. package/tests/pages/select.html +4 -3
  390. package/tests/pages/show-validation-errors.html +73 -0
  391. package/tests/pages/starrating.html +86 -0
  392. package/tests/pages/stepper-manual.html +59 -0
  393. package/tests/pages/stepper.html +61 -0
  394. package/tests/pages/string-ace-editor.html +7 -3
  395. package/tests/pages/string-cleave.html +48 -0
  396. package/tests/pages/string-custom-attributes.html +9 -6
  397. package/tests/pages/string-formats.html +54 -0
  398. package/tests/pages/string-formats2.html +59 -0
  399. package/tests/pages/{array-move-events.html → string-jodit-editor.html} +21 -29
  400. package/tests/pages/string-sceditor.html +9 -7
  401. package/tests/pages/string-simplemde-editor.html +83 -0
  402. package/tests/pages/switcher-option.html +69 -0
  403. package/tests/pages/table.html +4 -2
  404. package/tests/pages/tabs.html +1 -1
  405. package/tests/pages/themes.html +517 -0
  406. package/tests/pages/title-hidden.html +75 -0
  407. package/tests/pages/translate-property.html +248 -0
  408. package/tests/pages/urn.html +98 -0
  409. package/tests/pages/use-name-attributes.html +207 -0
  410. package/tests/pages/uuid.html +113 -0
  411. package/tests/pages/validation-messages.json +705 -0
  412. package/tests/pages/validation.html +20 -730
  413. package/tests/unit/.eslintrc +8 -0
  414. package/tests/unit/core.spec.js +320 -0
  415. package/tests/unit/defaults.spec.js +40 -0
  416. package/tests/unit/editor.spec.js +172 -0
  417. package/tests/unit/editors/array.spec.js +87 -0
  418. package/tests/unit/editors/object.spec.js +81 -0
  419. package/tests/unit/editors/table.spec.js +93 -0
  420. package/tests/unit/readme.md +35 -0
  421. package/tests/unit/schemaloader.spec.js +576 -0
  422. package/tests/unit/validator.spec.js +104 -0
  423. package/tests/unit/validators/ip-validator.spec.js +62 -0
  424. package/Gruntfile.js +0 -228
  425. package/dist/css/jsoneditor.min.css +0 -1
  426. package/dist/jsoneditor.js.map +0 -1
  427. package/dist/jsoneditor.min.js +0 -19
  428. package/dist/jsoneditor.min.js.map +0 -1
  429. package/src/class.js +0 -68
  430. package/src/editors/rating.js +0 -152
  431. package/src/ie9.js +0 -51
  432. package/src/intro.js +0 -23
  433. package/src/jquery.js +0 -64
  434. package/src/outro.js +0 -2
  435. package/src/themes/jsoneditor.barebones-theme.js +0 -60
@@ -1,63 +1,534 @@
1
- var assert = require('assert');
2
-
3
- Feature('core');
4
-
5
- Scenario('should Disable and enable entire form', async (I) => {
6
- I.amOnPage('core.html');
7
- I.seeElement('[data-schemapath="root.name"] input');
8
- I.seeElement('[data-schemapath="root.age"] input');
9
- I.click('disable');
10
- I.seeElement('[data-schemapath="root.age"] input:disabled');
11
- I.seeElement('[data-schemapath="root.name"] input:disabled');
12
- I.click('enable');
13
- I.seeElement('[data-schemapath="root.age"] input:not(:disabled)');
14
- I.seeElement('[data-schemapath="root.name"] input:not(:disabled)');
15
- });
16
-
17
- Scenario('should Disable and enable part of the form', async (I) => {
18
- I.amOnPage('core.html');
19
- I.seeElement('[data-schemapath="root.name"] input');
20
- I.seeElement('[data-schemapath="root.age"] input');
21
- I.click('disable part');
22
- I.seeElement('[data-schemapath="root.name"] input:disabled');
23
- I.click('enable part');
24
- I.seeElement('[data-schemapath="root.name"] input:not(:disabled)');
25
- });
26
-
27
- Scenario('should destroy', async (I) => {
28
- I.amOnPage('core.html');
29
- I.seeElement('[data-schemapath="root"]');
30
- I.click('destroy');
31
- I.dontSeeElement('[data-schemapath="root"]');
32
- });
33
-
34
- Scenario('should set and get form value', async (I) => {
35
- I.amOnPage('core.html');
36
- I.click('.get-value');
37
- assert.equal(await I.grabValueFrom('.value'), '{"age":18,"name":"Francesco Avizzano"}');
38
- I.click('.set-value');
39
- I.click('.get-value');
40
- assert.equal(await I.grabValueFrom('.value'), '{"age":40,"name":"John Smith"}');
41
- });
42
-
43
- Scenario('should set and get individual values', async (I) => {
44
- I.amOnPage('core.html');
45
- I.click('.get-individual-value');
46
- assert.equal(await I.grabValueFrom('.value'), '"Francesco Avizzano"');
47
- I.click('.set-individual-value');
48
- assert.equal(await I.grabValueFrom('.value'), '"john kaminski"');
49
- });
50
-
51
- Scenario('should watch a specific field for changes', async (I) => {
52
- I.amOnPage('core.html');
53
- I.dontSeeElement('.name-changed');
54
- I.click('.set-individual-value');
55
- I.seeElement('.name-changed');
56
- });
57
-
58
- Scenario('should watch form for changes @optional', async (I) => {
59
- I.amOnPage('core.html');
60
- I.dontSeeElement('.form-changed');
61
- I.click('.set-value');
62
- I.seeElement('.form-changed');
63
- });
1
+ /* global Feature Scenario */
2
+
3
+ const assert = require('assert')
4
+ const { DEFAULT_WAIT_TIME } = require('./test-config')
5
+
6
+ Feature('core')
7
+
8
+ Scenario('should use switch toggles for opt-in inputs @opt-in-widget', async ({ I }) => {
9
+ I.amOnPage('opt-in-widget.html')
10
+ I.waitForElement('.je-ready')
11
+ I.waitForValue('#value', '{}')
12
+ I.click('[data-schemapath="root.address"] .switch-slider')
13
+ I.click('[data-schemapath="root.email"] .switch-slider')
14
+ I.click('[data-schemapath="root.password"] .switch-slider')
15
+ I.click('[data-schemapath="root.name"] .switch-slider')
16
+ I.click('[data-schemapath="root.gender"] .switch-slider')
17
+ I.click('[data-schemapath="root.pets"] .switch-slider')
18
+ I.click('[data-schemapath="root.agree"] .switch-slider')
19
+ I.click('[data-schemapath="root.address.street"] .switch-slider')
20
+ I.click('[data-schemapath="root.address.number"] .switch-slider')
21
+ I.waitForValue('#value', '{"email":"","password":"","name":"Random-223","gender":"Male","address":{"street":"","number":""},"pets":[{"type":"dog","name":"Walter"}],"agree":false}')
22
+ })
23
+
24
+ Scenario('should show all validation errors on demand @editor-show-validation-errors', async ({ I }) => {
25
+ I.amOnPage('editor-show-validation-errors.html')
26
+ I.waitForElement('.je-ready')
27
+ I.dontSee('Value must be the constant value')
28
+ I.dontSee('Value must be at least 4 characters long')
29
+ I.dontSee('Value must be at least 4')
30
+ I.click('#show-validation-errors')
31
+ I.waitForText('Value must be the constant value')
32
+ I.waitForText('Value must be at least 4 characters long')
33
+ I.waitForText('Value must be at least 4')
34
+ })
35
+
36
+ Scenario('should enforce const @enforce_const', async ({ I }) => {
37
+ I.amOnPage('enforce-const.html')
38
+ I.waitForElement('.je-ready')
39
+ I.waitForValue('#value', '{"string":"Alice","integer":5,"number":5.5,"string-enum":"Bob","boolean":true,"boolean-checkbox":true,"boolean-choices":true,"object":{"name":"Alice"},"array":[{"name":"Alice"},{"name":"Bob"}],"array-table":[{"name":"Alice"},{"name":"Bob"}],"array-tabs":[{"name":"Alice"},{"name":"Bob"}],"array-of-strings":["Alice","Bob"],"array-enum":["Carl","Dennis"],"object-enum":{"name":"Bob"}}')
40
+ })
41
+
42
+ Scenario('should hide titles @titleHidden', async ({ I }) => {
43
+ I.amOnPage('title-hidden.html')
44
+ I.waitForElement('.je-ready')
45
+ I.waitForText('root', DEFAULT_WAIT_TIME, '.sr-only')
46
+ I.waitForText('boolean', DEFAULT_WAIT_TIME, '.sr-only')
47
+ I.waitForText('integer', DEFAULT_WAIT_TIME, '.sr-only')
48
+ I.waitForText('number', DEFAULT_WAIT_TIME, '.sr-only')
49
+ I.waitForText('string', DEFAULT_WAIT_TIME, '.sr-only')
50
+ I.waitForText('array', DEFAULT_WAIT_TIME, '.sr-only')
51
+ })
52
+
53
+ Scenario('should show validation errors based on "show_errors" setting @showValidationErrors', async ({ I }) => {
54
+ I.amOnPage('show-validation-errors.html')
55
+ I.waitForElement('.je-ready')
56
+ I.dontSee('Value must be the constant value.')
57
+ I.dontSee('Value must be the constant value.')
58
+ I.dontSee('Value must be the constant value.')
59
+
60
+ // set invalid values through interaction
61
+ I.checkOption('[name="root[boolean-checkbox]"]')
62
+ I.selectOption('[name="root[boolean-select]"]', '1')
63
+ I.selectOption('[name="root[boolean-choices]"]', '1')
64
+ I.uncheckOption('[name="root[boolean-checkbox]"]')
65
+ I.selectOption('[name="root[boolean-select]"]', 'false')
66
+ I.selectOption('[name="root[boolean-choices]"]', 'false')
67
+ I.waitForText('Value must be the constant value.', DEFAULT_WAIT_TIME, '[data-schemapath="root.boolean-checkbox"] .invalid-feedback')
68
+ I.waitForText('Value must be the constant value.', DEFAULT_WAIT_TIME, '[data-schemapath="root.boolean-select"] .invalid-feedback')
69
+ I.waitForText('Value must be the constant value.', DEFAULT_WAIT_TIME, '[data-schemapath="root.boolean-choices"] .invalid-feedback')
70
+
71
+ // set valid values through interaction
72
+ I.checkOption('[name="root[boolean-checkbox]"]')
73
+ I.selectOption('[name="root[boolean-select]"]', '1')
74
+ I.selectOption('[name="root[boolean-choices]"]', '1')
75
+ I.dontSee('Value must be the constant value.')
76
+ I.dontSee('Value must be the constant value.')
77
+ I.dontSee('Value must be the constant value.')
78
+
79
+ // set invalid values with setValue
80
+ I.click('#set-invalid-values')
81
+ I.waitForText('Value must be the constant value.', DEFAULT_WAIT_TIME, '[data-schemapath="root.boolean-checkbox"] .invalid-feedback')
82
+ I.waitForText('Value must be the constant value.', DEFAULT_WAIT_TIME, '[data-schemapath="root.boolean-select"] .invalid-feedback')
83
+ I.waitForText('Value must be the constant value.', DEFAULT_WAIT_TIME, '[data-schemapath="root.boolean-choices"] .invalid-feedback')
84
+
85
+ // set valid values with setValue
86
+ I.click('#set-valid-values')
87
+ I.waitForInvisible('[data-schemapath="root.boolean-checkbox"] .invalid-feedback')
88
+ I.waitForInvisible('[data-schemapath="root.boolean-select"] .invalid-feedback')
89
+ I.waitForInvisible('[data-schemapath="root.boolean-choices"] .invalid-feedback')
90
+ })
91
+
92
+ Scenario('should listen to @load-events', async ({ I }) => {
93
+ I.amOnPage('load-events.html')
94
+ I.waitForElement('.je-ready')
95
+ I.waitForText('/tests/pages/../fixtures/basic_person.json')
96
+ I.waitForText('{"title":"Person","type":"object","id":"person","properties":{"name":{"type":"string","description":"First and Last name","minLength":4},"age":{"type":"integer","default":21,"minimum":18,"maximum":99},"gender":{"type":"string","enum":["male","female","other"]}}}')
97
+ I.waitForText('/tests/pages/../fixtures/person.json')
98
+ I.waitForText('{"$ref":"../fixtures/basic_person.json","properties":{"location":{"type":"object","title":"Location","properties":{"city":{"type":"string"},"state":{"type":"string"},"citystate":{"type":"string","description":"This is generated automatically from the previous two fields","template":"{{city}}, {{state}}","watch":{"city":"person.location.city","state":"person.location.state"}}}},"pets":{"type":"array","format":"table","title":"Pets","uniqueItems":true,"items":{"type":"object","properties":{"type":{"type":"string","enum":["cat","dog","bird","reptile","other"],"default":"dog"},"name":{"type":"string"},"fixed":{"type":"boolean","title":"spayed / neutered"}}}}}}')
99
+ I.waitForText('All schemas loaded')
100
+ })
101
+
102
+ Scenario('should set per-editor options @per-editor-options', async ({ I }) => {
103
+ I.amOnPage('per-editor-options.html')
104
+ I.waitForElement('.je-ready')
105
+ I.waitForElement('[title="Expand"]')
106
+ I.dontSeeElement('[title="Collapse"]')
107
+ I.dontSeeElement('.card')
108
+ })
109
+
110
+ Scenario('should set container attributes @container-attributes', async ({ I }) => {
111
+ I.amOnPage('container-attributes.html')
112
+ I.waitForElement('.je-ready')
113
+ I.waitForElement('.container-class')
114
+ I.dontSeeElement('[data-schematype="blank"]')
115
+ I.dontSeeElement('[data-schemapath="blank"]')
116
+ I.dontSeeElement('[data-schemaid="blank"]')
117
+ })
118
+
119
+ Scenario('should not set inputs name attributes @use-name-attributes', async ({ I }) => {
120
+ I.amOnPage('use-name-attributes.html')
121
+ I.waitForElement('.je-ready')
122
+ I.dontSeeElement('[name]')
123
+ })
124
+
125
+ Scenario('should have class je-ready when ready @core @ready', async ({ I }) => {
126
+ I.amOnPage('ready.html')
127
+ I.waitForElement('.je-ready')
128
+ })
129
+
130
+ Scenario('should Disable and enable entire form', async ({ I }) => {
131
+ I.amOnPage('core.html')
132
+ I.seeElement('[data-schemapath="root.name"] input')
133
+ I.seeElement('[data-schemapath="root.age"] input')
134
+ I.click('disable')
135
+ I.seeElement('[data-schemapath="root.age"] input:disabled')
136
+ I.seeElement('[data-schemapath="root.name"] input:disabled')
137
+ I.click('enable')
138
+ I.seeElement('[data-schemapath="root.age"] input:not(:disabled)')
139
+ I.seeElement('[data-schemapath="root.name"] input:not(:disabled)')
140
+ })
141
+
142
+ Scenario('should Disable and enable part of the form', async ({ I }) => {
143
+ I.amOnPage('core.html')
144
+ I.seeElement('[data-schemapath="root.name"] input')
145
+ I.seeElement('[data-schemapath="root.age"] input')
146
+ I.click('disable part')
147
+ I.seeElement('[data-schemapath="root.name"] input:disabled')
148
+ I.click('enable part')
149
+ I.seeElement('[data-schemapath="root.name"] input:not(:disabled)')
150
+ })
151
+
152
+ Scenario('should destroy', async ({ I }) => {
153
+ I.amOnPage('core.html')
154
+ I.seeElement('[data-schemapath="root"]')
155
+ I.click('destroy')
156
+ I.dontSeeElement('[data-schemapath="root"]')
157
+ })
158
+
159
+ Scenario('should set and get form value', async ({ I }) => {
160
+ I.amOnPage('core.html')
161
+ I.click('.get-value')
162
+ I.waitForValue('.value', '{"age":18,"name":"Francesco Avizzano"}')
163
+ I.click('.set-value')
164
+ I.click('.get-value')
165
+ I.waitForValue('.value', '{"age":40,"name":"John Smith"}')
166
+ })
167
+
168
+ Scenario('should set and get individual values', async ({ I }) => {
169
+ I.amOnPage('core.html')
170
+ I.click('.get-individual-value')
171
+ I.waitForValue('.value', '"Francesco Avizzano"')
172
+ I.click('.set-individual-value')
173
+ I.waitForValue('.value', '"john kaminski"')
174
+ })
175
+
176
+ Scenario('should watch a specific field for changes @core @change', async ({ I }) => {
177
+ I.amOnPage('core.html')
178
+ I.dontSeeElement('.name-changed')
179
+ I.click('.set-individual-value')
180
+ I.waitForElement('.name-changed')
181
+ })
182
+
183
+ Scenario('should watch form for changes @core @change', async ({ I }) => {
184
+ I.amOnPage('core.html')
185
+ I.dontSeeElement('.form-changed')
186
+ I.click('.set-value')
187
+ I.waitForElement('.form-changed')
188
+ })
189
+
190
+ Scenario('should change the form if form_name_root option is set @core', async ({ I }) => {
191
+ I.amOnPage('form-name.html')
192
+ I.see('Value must be one of the enumerated values', '.invalid-feedback')
193
+ I.seeElement('[data-schemapath="form_1"]')
194
+ I.seeElement('[data-schemapath="form_2"]')
195
+ I.seeElement('[name="form_1"]')
196
+ I.seeElement('[name="form_2"]')
197
+ I.seeElement('[id="form_1[0]"]')
198
+ I.seeElement('[id="form_1[1]"]')
199
+ I.seeElement('[id="form_1[2]"]')
200
+ I.seeElement('[id="form_2[0]"]')
201
+ I.seeElement('[id="form_2[1]"]')
202
+ I.seeElement('[id="form_2[2]"]')
203
+ I.seeElement('[for="form_1[0]"]')
204
+ I.seeElement('[for="form_1[1]"]')
205
+ I.seeElement('[for="form_1[2]"]')
206
+ I.seeElement('[for="form_2[0]"]')
207
+ I.seeElement('[for="form_2[1]"]')
208
+ I.seeElement('[for="form_2[2]"]')
209
+ I.click('[for="form_1[0]"]')
210
+ I.click('[for="form_2[1]"]')
211
+ I.dontSee('Value must be one of the enumerated values', '.invalid-feedback')
212
+ I.click('#get-value-form-1')
213
+ I.waitForValue('#value-form-1', '"yes"')
214
+ I.click('#get-value-form-2')
215
+ I.waitForValue('#value-form-2', '"no"')
216
+ })
217
+
218
+ Scenario('should validate against oneOf schemas and display single oneOf and editors error messages @core @oneof', async ({ I }) => {
219
+ I.amOnPage('oneof.html')
220
+ I.waitForElement('.je-ready')
221
+ I.waitForText('Object is missing the required property \'p4\'', DEFAULT_WAIT_TIME, '.alert-danger')
222
+ I.waitForText('Value must validate against exactly one of the provided schemas. It currently validates against 0 of the schemas.', DEFAULT_WAIT_TIME, '.alert-danger')
223
+ I.waitForText('Object is missing the required property \'p1\'', DEFAULT_WAIT_TIME, '.alert-danger')
224
+ I.waitForText('Object is missing the required property \'p2\'', DEFAULT_WAIT_TIME, '.alert-danger')
225
+ I.waitForText('Property must be set.', DEFAULT_WAIT_TIME, '[data-schemapath="root.p4"] .invalid-feedback')
226
+ I.waitForText('Property must be set.', DEFAULT_WAIT_TIME, '[data-schemapath="root.p5.p1"] .invalid-feedback')
227
+ I.waitForText('Property must be set.', DEFAULT_WAIT_TIME, '[data-schemapath="root.p5.p2"] .invalid-feedback')
228
+ I.fillField('root[p4]', 'to')
229
+ I.fillField('root[p5][p1]', 'to')
230
+ I.fillField('root[p5][p2]', 'to')
231
+ I.click('Get Value')
232
+ I.wait(3)
233
+ I.dontSee('Object is missing the required property \'p4\'', '.alert-danger')
234
+ I.dontSee('Object is missing the required property \'p1\'', '.alert-danger')
235
+ I.dontSee('Object is missing the required property \'p2\'', '.alert-danger')
236
+ I.waitForText('Value must be at least 4 characters long.', DEFAULT_WAIT_TIME, '[data-schemapath="root.p4"] .invalid-feedback')
237
+ I.waitForText('Value must be at least 4 characters long.', DEFAULT_WAIT_TIME, '[data-schemapath="root.p5.p1"] .invalid-feedback')
238
+ I.waitForText('Value must be at least 4 characters long.', DEFAULT_WAIT_TIME, '[data-schemapath="root.p5.p2"] .invalid-feedback')
239
+ I.fillField('root[p4]', 'todo')
240
+ I.fillField('root[p5][p1]', 'todo')
241
+ I.fillField('root[p5][p2]', 'todo')
242
+ I.click('Get Value')
243
+ I.wait(3)
244
+ I.dontSee('Value must be at least 4 characters long.', '[data-schemapath="root.p4"] .invalid-feedback')
245
+ I.dontSee('Value must be at least 4 characters long.', '[data-schemapath="root.p5.p1"] .invalid-feedback')
246
+ I.dontSee('Value must be at least 4 characters long.', '[data-schemapath="root.p5.p2"] .invalid-feedback')
247
+ })
248
+
249
+ Scenario('should validate against anyOf schemas and display single anyOf and editors error messages @core @anyof', async ({ I }) => {
250
+ I.amOnPage('anyof.html')
251
+ I.waitForElement('.je-ready')
252
+ I.waitForElement('.alert-danger')
253
+ I.selectOption('.je-switcher', 'Value, number')
254
+ I.waitForElement('.alert-danger')
255
+ I.selectOption('.je-switcher', 'Value, null')
256
+ I.waitForElement('.alert-danger')
257
+ I.selectOption('.je-switcher', 'Value, string')
258
+ I.waitForText('Object is missing the required property \'age\'', DEFAULT_WAIT_TIME, '.alert-danger')
259
+ I.waitForText('Property must be set.', DEFAULT_WAIT_TIME, '[data-schemapath="root.age"] .invalid-feedback')
260
+ I.fillField('root[age]', 'to')
261
+ I.click('Get Value')
262
+ I.wait(3)
263
+ I.dontSee('Object is missing the required property \'age\'', '.alert-danger')
264
+ I.dontSee('Property must be set.', '[data-schemapath="root.age"] .invalid-feedback')
265
+ })
266
+
267
+ Scenario('should keep only existent values @core @anyof @keep_only_existing_values', async ({ I }) => {
268
+ I.amOnPage('keep_only_existing_values.html')
269
+ I.waitForElement('.je-ready')
270
+ I.waitForValue('#value', '{"name":"Afred","surname":"hitchcock","zip":"12345"}')
271
+ I.selectOption('.je-switcher', 'object 2')
272
+ I.waitForValue('#value', '{"name":"Afred","surname":"hitchcock","other_zip":""}')
273
+ })
274
+
275
+ Scenario('should display anyOf and oneOf error messages in the correct places @848', async ({ I }) => {
276
+ I.amOnPage('issues/issue-gh-848.html')
277
+ I.selectOption('.je-switcher', 'Value, string')
278
+ I.waitForElement('[data-schemapath="root.list"] .invalid-feedback', DEFAULT_WAIT_TIME)
279
+ I.dontSeeElement('[data-schemapath="root.list_group"] .invalid-feedback', DEFAULT_WAIT_TIME)
280
+ })
281
+
282
+ Scenario('Should switch between all json 7 data types in @oneof and display error messages for each one @core', async ({ I }) => {
283
+ I.amOnPage('oneof-2.html')
284
+ I.waitForElement('.je-ready')
285
+
286
+ I.selectOption('.je-switcher', 'Value, string')
287
+ I.waitForValue('#value', '{"test":""}')
288
+ I.waitForText('Value must validate against exactly one of the provided schemas.')
289
+ I.waitForText('Value must be the constant value')
290
+
291
+ I.selectOption('.je-switcher', 'Value, boolean')
292
+ I.waitForValue('#value', '{"test":false}')
293
+ I.waitForText('Value must validate against exactly one of the provided schemas.')
294
+ I.waitForText('Value must be the constant value')
295
+
296
+ I.selectOption('.je-switcher', 'Value, array')
297
+ I.waitForValue('#value', '{"test":[]}')
298
+ I.waitForText('Value must validate against exactly one of the provided schemas.')
299
+ I.waitForText('Value must be the constant value')
300
+
301
+ I.selectOption('.je-switcher', 'Value, object')
302
+ I.waitForValue('#value', '{"test":{}}')
303
+ I.waitForText('Value must validate against exactly one of the provided schemas.')
304
+ I.waitForText('Value must be the constant value')
305
+ I.waitForText('Object is missing the required property \'test\'')
306
+
307
+ I.selectOption('.je-switcher', 'Value, number')
308
+ I.waitForValue('#value', '{"test":0}')
309
+ I.waitForText('Value must validate against exactly one of the provided schemas.')
310
+ I.waitForText('Value must be the constant value')
311
+
312
+ I.selectOption('.je-switcher', 'Value, integer')
313
+ I.waitForValue('#value', '{"test":0}')
314
+ I.waitForText('Value must validate against exactly one of the provided schemas.')
315
+ I.waitForText('Value must be the constant value')
316
+
317
+ I.selectOption('.je-switcher', 'Value, null')
318
+ I.waitForValue('#value', '{"test":null}')
319
+ })
320
+
321
+ Scenario('Should switch between all json 7 data types in @anyof and display error messages for each one @core', ({ I }) => {
322
+ I.amOnPage('anyof-2.html')
323
+ I.waitForElement('.je-ready')
324
+
325
+ I.waitForValue('#value', '{"test":""}')
326
+ I.waitForText('Value must validate against at least one of the provided schemas')
327
+
328
+ I.selectOption('.je-switcher', 'Value, boolean')
329
+ I.waitForValue('#value', '{"test":false}')
330
+ I.waitForText('Value must validate against at least one of the provided schemas')
331
+
332
+ I.selectOption('.je-switcher', 'Value, array')
333
+ I.waitForValue('#value', '{"test":[]}')
334
+ I.waitForText('Value must validate against at least one of the provided schemas')
335
+
336
+ I.selectOption('.je-switcher', 'Value, object')
337
+ I.waitForValue('#value', '{"test":{}}')
338
+ I.waitForText('Value must validate against at least one of the provided schemas')
339
+
340
+ I.selectOption('.je-switcher', 'Value, number')
341
+ I.waitForValue('#value', '{"test":0}')
342
+ I.waitForText('Value must validate against at least one of the provided schemas')
343
+
344
+ I.selectOption('.je-switcher', 'Value, integer')
345
+ I.waitForValue('#value', '{"test":0}')
346
+ I.waitForText('Value must validate against at least one of the provided schemas')
347
+
348
+ I.selectOption('.je-switcher', 'Value, null')
349
+ I.waitForValue('#value', '{"test":null}')
350
+ })
351
+
352
+ Scenario('should validate against oneOf schemas and display single oneOf and editors error messages @core @translate-property', async ({ I }) => {
353
+ I.amOnPage('translate-property.html?lang=en')
354
+ I.waitForText('Object Title')
355
+ I.waitForText('Object Description')
356
+ I.waitForText('Boolean Title')
357
+ I.waitForText('Boolean Description')
358
+ I.seeInSource('Boolean Info Text')
359
+ I.waitForText('String Title')
360
+ I.waitForText('String Description')
361
+ I.seeInSource('String Info Text')
362
+ I.waitForText('String Radio Title')
363
+ I.waitForText('String Radio Description')
364
+ I.seeInSource('String Radio Info Text')
365
+ I.waitForText('Integer Title')
366
+ I.waitForText('Integer Description')
367
+ I.seeInSource('Integer Info Text')
368
+ I.waitForText('Number Title')
369
+ I.waitForText('Number Description')
370
+ I.seeInSource('Number Info Text')
371
+ I.waitForText('Array Title')
372
+ I.waitForText('Array Description')
373
+ I.seeInSource('Array Info Text')
374
+ I.waitForText('Array Tabs Title')
375
+ I.waitForText('Array Tabs Description')
376
+ I.seeInSource('Array Tabs Info Text')
377
+ I.waitForText('Array Table Title')
378
+ I.waitForText('Array Table Description')
379
+ I.seeInSource('Array Table Info Text')
380
+ I.waitForText('Signature Title')
381
+ I.waitForText('Signature Description')
382
+ I.seeInSource('Signature Info Text')
383
+ I.waitForText('Rating Title')
384
+ I.waitForText('Rating Description')
385
+ I.seeInSource('Rating Info Text')
386
+
387
+ I.amOnPage('translate-property.html?lang=de')
388
+ I.waitForText('Object Title (but in german)')
389
+ I.waitForText('Object Description (but in german)')
390
+ I.waitForText('Boolean Title (but in german)')
391
+ I.waitForText('Boolean Description (but in german)')
392
+ I.seeInSource('Boolean Info Text (but in german)')
393
+ I.waitForText('String Title (but in german)')
394
+ I.waitForText('String Description (but in german)')
395
+ I.seeInSource('String Info Text (but in german)')
396
+ I.waitForText('String Radio Title (but in german)')
397
+ I.waitForText('String Radio Description (but in german)')
398
+ I.seeInSource('String Radio Info Text (but in german)')
399
+ I.waitForText('Integer Title (but in german)')
400
+ I.waitForText('Integer Description (but in german)')
401
+ I.seeInSource('Integer Info Text (but in german)')
402
+ I.waitForText('Number Title (but in german)')
403
+ I.waitForText('Number Description (but in german)')
404
+ I.seeInSource('Number Info Text (but in german)')
405
+ I.waitForText('Array Title (but in german)')
406
+ I.waitForText('Array Description (but in german)')
407
+ I.seeInSource('Array Info Text (but in german)')
408
+ I.waitForText('Array Tabs Title (but in german)')
409
+ I.waitForText('Array Tabs Description (but in german)')
410
+ I.seeInSource('Array Tabs Info Text (but in german)')
411
+ I.waitForText('Array Table Title (but in german)')
412
+ I.waitForText('Array Table Description (but in german)')
413
+ I.seeInSource('Array Table Info Text (but in german)')
414
+ I.waitForText('Signature Title (but in german)')
415
+ I.waitForText('Signature Description (but in german)')
416
+ I.seeInSource('Signature Info Text (but in german)')
417
+ I.waitForText('Rating Title (but in german)')
418
+ I.waitForText('Rating Description (but in german)')
419
+ I.seeInSource('Rating Info Text (but in german)')
420
+ })
421
+
422
+ Scenario('should load internal schema definitions, external schema definitions and external schema properties @core @references', async ({ I }) => {
423
+ I.amOnPage('references.html')
424
+ I.waitForText('References JSON Editor Example')
425
+
426
+ // internal schema definitions
427
+ I.waitForElement('[data-schemapath="root.external"]')
428
+ I.waitForElement('[data-schemapath="root.orgid"]')
429
+
430
+ // external schema definitions
431
+ I.click('Add Person')
432
+ I.waitForElement('[data-schemapath="root.people.0.name"]')
433
+ I.waitForElement('[data-schemapath="root.people.0.age"]')
434
+ I.waitForElement('[data-schemapath="root.people.0.gender"]')
435
+ I.selectOption('.je-switcher', 'Complex Person')
436
+ I.waitForElement('[data-schemapath="root.people.0.location.city"]')
437
+ I.waitForElement('[data-schemapath="root.people.0.location.state"]')
438
+ I.waitForElement('[data-schemapath="root.people.0.location.citystate"]')
439
+
440
+ // external schema properties
441
+ I.waitForElement('[data-schemapath="root.link.street_address"]')
442
+
443
+ const currentUrl = await I.grabCurrentUrl()
444
+ const currentPath = currentUrl.replace('references.html', '')
445
+
446
+ // Ensures that external schemas were stored in cache. (This does not assert that the loader actually fetched them from cache.)
447
+ const schemaPaths = [
448
+ '../fixtures/string.json',
449
+ '../fixtures/definitions.json',
450
+ '../fixtures/basic_person.json',
451
+ '../fixtures/person.json'
452
+ ]
453
+ for (const path of schemaPaths) {
454
+ const key = 'je-cache::' + currentPath + path
455
+
456
+ const item = await I.executeScript(function (storageKey) {
457
+ return window.localStorage.getItem(storageKey)
458
+ }, key)
459
+ const itemDecoded = JSON.parse(item)
460
+ assert.strictEqual(itemDecoded.cacheBuster, 'abc123')
461
+ assert(itemDecoded, 'Cached schema found')
462
+ }
463
+ })
464
+
465
+ Scenario('should override error messages if specified in schema options @core @errors-messages', async ({ I }) => {
466
+ I.amOnPage('error-messages.html')
467
+ I.waitForText('Error Messages')
468
+
469
+ I.waitForText('CUSTOM EN: Value required')
470
+ I.waitForText('CUSTOM EN: Value must be the constant value')
471
+ I.waitForText('CUSTOM EN: Value must be at least 6 characters long')
472
+ I.waitForText('CUSTOM EN: Value must be at most 6 characters long')
473
+ I.waitForText('CUSTOM EN: Value must validate against at least one of the provided schemas')
474
+ I.waitForText('CUSTOM EN: Value must validate against exactly one of the provided schemas. It currently validates against 0 of the schemas')
475
+ I.waitForText('CUSTOM EN: Value must be one of the provided types')
476
+ I.waitForText('CUSTOM EN: Value must not be one of the provided disallowed types')
477
+ I.waitForText('CUSTOM EN: Value must not be of type string')
478
+ I.waitForText('CUSTOM EN: Value must be of type integer')
479
+ I.waitForText('CUSTOM EN: Value must not validate against the provided schema')
480
+ I.waitForText('CUSTOM EN: Date must be greater than 1 January 1970')
481
+ I.waitForText('CUSTOM EN: Value must match the pattern ^[a-zA-Z0-9_]+$')
482
+ I.waitForText('CUSTOM EN: Value must be a multiple of 5')
483
+ I.waitForText('CUSTOM EN: Value must be at least 5')
484
+ I.waitForText('CUSTOM EN: Value must be greater than 5')
485
+ I.waitForText('CUSTOM EN: Value must be less than 10')
486
+ I.waitForText('CUSTOM EN: Value must be less than 15')
487
+ I.waitForText('CUSTOM EN: Object must have at least 1 properties')
488
+ I.waitForText('CUSTOM EN: Object must have at most 1 properties')
489
+ I.waitForText('CUSTOM EN: Object is missing the required property \'name\'')
490
+ I.waitForText('CUSTOM EN: Unsupported propertyName UNSOPPORTED')
491
+ I.waitForText('CUSTOM EN: Property name fullname cannot match invalid pattern')
492
+ I.waitForText('CUSTOM EN: Property name fullname cannot match invalid enum')
493
+ I.waitForText('CUSTOM EN: Property name fullname cannot match invalid maxLength')
494
+ I.waitForText('CUSTOM EN: Property name fullname exceeds maxLength')
495
+ I.waitForText('CUSTOM EN: Property name pets does not match pattern')
496
+ I.waitForText('CUSTOM EN: Property name $pets does not match pattern')
497
+ I.waitForText('CUSTOM EN: Property name pets does not match the const value')
498
+ I.waitForText('CUSTOM EN: Property name pets does not match any enum values')
499
+ I.waitForText('CUSTOM EN: Array must have unique items')
500
+
501
+ I.click('Switch to ES')
502
+
503
+ I.waitForText('CUSTOM ES: Value required')
504
+ I.waitForText('CUSTOM ES: Value must be the constant value')
505
+ I.waitForText('CUSTOM ES: Value must be at least 6 characters long')
506
+ I.waitForText('CUSTOM ES: Value must be at most 6 characters long')
507
+ I.waitForText('CUSTOM ES: Value must validate against at least one of the provided schemas')
508
+ I.waitForText('CUSTOM ES: Value must validate against exactly one of the provided schemas. It currently validates against 0 of the schemas')
509
+ I.waitForText('CUSTOM ES: Value must be one of the provided types')
510
+ I.waitForText('CUSTOM ES: Value must not be one of the provided disallowed types')
511
+ I.waitForText('CUSTOM ES: Value must not be of type string')
512
+ I.waitForText('CUSTOM ES: Value must be of type integer')
513
+ I.waitForText('CUSTOM ES: Value must not validate against the provided schema')
514
+ I.waitForText('CUSTOM ES: Date must be greater than 1 January 1970')
515
+ I.waitForText('CUSTOM ES: Value must match the pattern ^[a-zA-Z0-9_]+$')
516
+ I.waitForText('CUSTOM ES: Value must be a multiple of 5')
517
+ I.waitForText('CUSTOM ES: Value must be at least 5')
518
+ I.waitForText('CUSTOM ES: Value must be greater than 5')
519
+ I.waitForText('CUSTOM ES: Value must be less than 10')
520
+ I.waitForText('CUSTOM ES: Value must be less than 15')
521
+ I.waitForText('CUSTOM ES: Object must have at least 1 properties')
522
+ I.waitForText('CUSTOM ES: Object must have at most 1 properties')
523
+ I.waitForText('CUSTOM ES: Object is missing the required property \'name\'')
524
+ I.waitForText('CUSTOM ES: Unsupported propertyName UNSOPPORTED')
525
+ I.waitForText('CUSTOM ES: Property name fullname cannot match invalid pattern')
526
+ I.waitForText('CUSTOM ES: Property name fullname cannot match invalid enum')
527
+ I.waitForText('CUSTOM ES: Property name fullname cannot match invalid maxLength')
528
+ I.waitForText('CUSTOM ES: Property name fullname exceeds maxLength')
529
+ I.waitForText('CUSTOM ES: Property name pets does not match pattern')
530
+ I.waitForText('CUSTOM ES: Property name $pets does not match pattern')
531
+ I.waitForText('CUSTOM ES: Property name pets does not match the const value')
532
+ I.waitForText('CUSTOM ES: Property name pets does not match any enum values')
533
+ I.waitForText('CUSTOM ES: Array must have unique items')
534
+ })
@@ -1,11 +1,14 @@
1
+ /* global Feature Scenario */
1
2
 
2
- Feature('Advanced Editor');
3
+ Feature('Advanced Editor @advance-editor')
3
4
 
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.click('.json-editor-btn-delete');
11
- });
5
+ Scenario('test validation & delete', ({ I }) => {
6
+ I.amOnPage('advanced.html')
7
+ I.retry({ retries: 5, minTimeout: 500 }).seeElement('#valid_indicator')
8
+ I.see('valid', '#valid_indicator')
9
+ I.fillField('root[0][location][city]', 'Stuttgart')
10
+ I.waitForValue("[name='root[0][location][city]']", 'Stuttgart')
11
+ I.amAcceptingPopups()
12
+ I.click('.json-editor-btntype-deletelast')
13
+ I.acceptPopup()
14
+ })