@json-editor/json-editor 1.3.5 → 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 (436) 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 +63 -9
  8. package/CHANGELOG.md +1152 -0
  9. package/CONTRIBUTING.md +44 -5
  10. package/Makefile +26 -0
  11. package/README.md +765 -138
  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 -11013
  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 +161 -0
  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 +606 -423
  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 +156 -0
  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 +385 -306
  61. package/src/editor.js +761 -520
  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 +108 -86
  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 +190 -0
  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 +1209 -1007
  93. package/src/editors/radio.js +128 -0
  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 -426
  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 -264
  141. package/src/themes/bootstrap3.css +53 -0
  142. package/src/themes/bootstrap3.css.js +3 -0
  143. package/src/themes/bootstrap3.js +356 -259
  144. package/src/themes/bootstrap4.css +89 -0
  145. package/src/themes/bootstrap4.css.js +3 -0
  146. package/src/themes/bootstrap4.js +744 -234
  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 +539 -465
  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 -166
  156. package/src/themes/materialize.js +263 -291
  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 +914 -551
  165. package/src/validators/ip-validator.js +51 -0
  166. package/tests/Dockerfile +3 -0
  167. package/tests/README.md +27 -6
  168. package/tests/codeceptjs/codecept.json +29 -5
  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 -68
  174. package/tests/codeceptjs/editors/advanced_test.js +12 -10
  175. package/tests/codeceptjs/editors/array_any_of_test.js +50 -0
  176. package/tests/codeceptjs/editors/array_test.js +935 -677
  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 -8
  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 -71
  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 -9
  187. package/tests/codeceptjs/editors/number_test.js +75 -67
  188. package/tests/codeceptjs/editors/object_test.js +337 -28
  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 -16
  195. package/tests/codeceptjs/editors/select_test.js +46 -23
  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 +108 -101
  199. package/tests/codeceptjs/editors/table-confirm-delete_test.js +60 -55
  200. package/tests/codeceptjs/editors/tabs_test.js +14 -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 +23 -17
  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 +54 -0
  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 +308 -0
  301. package/tests/pages/grid.html +281 -0
  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 +261 -0
  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 -226
  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/docs/demo.html +0 -646
  430. package/src/class.js +0 -68
  431. package/src/editors/rating.js +0 -152
  432. package/src/ie9.js +0 -51
  433. package/src/intro.js +0 -23
  434. package/src/jquery.js +0 -64
  435. package/src/outro.js +0 -2
  436. package/src/themes/jsoneditor.barebones-theme.js +0 -60
@@ -1,778 +1,1036 @@
1
- var assert = require('assert');
2
- var i;
3
-
4
- Feature('array');
5
-
6
- Scenario('should have correct initial value', async (I) => {
7
- I.amOnPage('array.html');
8
- I.click('.get-value');
9
- value = await I.grabValueFrom('.debug');
10
- assert.equal(value, '[]');
11
- });
12
-
13
- Scenario('should array editing triggers', async (I) => {
14
- I.amOnPage('array-move-events.html');
15
- I.seeElement('[data-schemapath="root.0"]');
16
- I.seeElement('[data-schemapath="root.1"]');
17
- I.click('.get-value');
18
- value = await I.grabValueFrom('.debug');
19
- assert.equal(value, '["A","B"]');
20
-
21
- I.click('.json-editor-btn-moveup');
22
- I.seeInPopup('moveRow');
23
- I.acceptPopup();
24
- I.click('.get-value');
25
- value = await I.grabValueFrom('.debug');
26
- assert.equal(value, '["B","A"]');
27
-
28
- I.click('.json-editor-btn-movedown');
29
- I.seeInPopup('moveRow');
30
- I.acceptPopup();
31
- I.click('.get-value');
32
- value = await I.grabValueFrom('.debug');
33
- assert.equal(value, '["A","B"]');
34
-
35
- I.click('.json-editor-btntype-add');
36
- I.seeInPopup('addRow');
37
- I.acceptPopup();
38
- I.click('.get-value');
39
- value = await I.grabValueFrom('.debug');
40
- assert.equal(value, '["A","B",""]');
41
-
42
- I.click('.json-editor-btntype-deletelast');
43
- I.seeInPopup('Are you sure you want to remove this node?');
44
- I.acceptPopup();
45
- I.seeInPopup('deleteRow');
46
- I.acceptPopup();
47
- I.click('.get-value');
48
- value = await I.grabValueFrom('.debug');
49
- assert.equal(value, '["A","B"]');
50
-
51
- I.click('.json-editor-btntype-deleteall');
52
- I.seeInPopup('Are you sure you want to remove this node?');
53
- I.acceptPopup();
54
- I.seeInPopup('deleteAllRows');
55
- I.acceptPopup();
56
- I.click('.get-value');
57
- value = await I.grabValueFrom('.debug');
58
- assert.equal(value, '[]');
59
- });
60
-
61
- Scenario('should work well with string editors', async (I) => {
62
- I.amOnPage('array-strings.html');
63
- I.click('Add String');
64
- I.click('Add String');
65
- I.click('Add String');
66
- I.click('Add String');
67
- I.click('Add String');
68
- I.seeElement('[name="root[0]"]');
69
- I.seeElement('[name="root[1]"]');
70
- I.seeElement('[name="root[2]"]');
71
- I.seeElement('[name="root[3]"]');
72
- I.seeElement('[name="root[4]"]');
73
- I.fillField('[name="root[0]"]', "1");
74
- I.fillField('[name="root[1]"]', "2");
75
- I.fillField('[name="root[2]"]', "3");
76
- I.fillField('[name="root[3]"]', "4");
77
- I.fillField('[name="root[4]"]', "5");
78
- I.click('.get-value');
79
- value = await I.grabValueFrom('.debug');
80
- assert.equal(value, '["1","2","3","4","5"]');
1
+ /* global Feature Scenario */
2
+
3
+ const { DEFAULT_WAIT_TIME } = require('../test-config')
4
+
5
+ Feature('array')
6
+
7
+ Scenario('should be readonly if specified and not disabled @readOnly', async ({ I }) => {
8
+ I.amOnPage('read-only.html')
9
+ I.waitForElement('.je-ready', DEFAULT_WAIT_TIME)
10
+ I.seeDisabledAttribute('[name="root[array][0]"]')
11
+ I.seeDisabledAttribute('[name="root[array][1]"]')
12
+ })
13
+
14
+ Scenario('Should display properties enum titles in items headerTemplate @headerTemplate', async ({ I }) => {
15
+ I.amOnPage('array-header-template.html')
16
+ I.waitForElement('.je-ready', DEFAULT_WAIT_TIME)
17
+ I.waitForText('Dog', DEFAULT_WAIT_TIME, '.nav-link span')
18
+ I.waitForText('Cat', DEFAULT_WAIT_TIME, '.nav-link span')
19
+ })
20
+
21
+ Scenario('Should set buttons states correctly @button_state_mode', async ({ I }) => {
22
+ I.amOnPage('button_state_mode_1.html')
23
+ I.waitForElement('.je-ready', DEFAULT_WAIT_TIME)
24
+ I.waitForElement('.json-editor-btntype-add', DEFAULT_WAIT_TIME)
25
+ I.waitForElement('.json-editor-btn-movedown', DEFAULT_WAIT_TIME)
26
+ I.waitForElement('.json-editor-btn-moveup', DEFAULT_WAIT_TIME)
27
+ I.dontSeeElement('.json-editor-btntype-delete')
28
+ I.dontSeeElement('.json-editor-btntype-deletelast')
29
+ I.dontSeeElement('.json-editor-btntype-deleteall')
30
+ I.click('.json-editor-btntype-add')
31
+ I.waitForElement('.json-editor-btntype-delete')
32
+ I.waitForElement('.json-editor-btntype-deletelast')
33
+ I.waitForElement('.json-editor-btntype-deleteall')
34
+
35
+ I.amOnPage('button_state_mode_2.html')
36
+ I.waitForElement('.je-ready', DEFAULT_WAIT_TIME)
37
+ I.waitForElement('.json-editor-btntype-add', DEFAULT_WAIT_TIME)
38
+ I.waitForElement('.json-editor-btn-movedown', DEFAULT_WAIT_TIME)
39
+ I.waitForElement('.json-editor-btn-moveup', DEFAULT_WAIT_TIME)
40
+ I.waitForElement('.json-editor-btntype-delete', DEFAULT_WAIT_TIME)
41
+ I.waitForElement('.json-editor-btntype-deletelast', DEFAULT_WAIT_TIME)
42
+ I.seeDisabledAttribute('.json-editor-btntype-delete')
43
+ I.seeDisabledAttribute('.json-editor-btntype-deletelast')
44
+ I.seeDisabledAttribute('.json-editor-btntype-deleteall')
45
+ I.click('.json-editor-btntype-add')
46
+ I.dontSeeDisabledAttribute('.json-editor-btntype-delete')
47
+ I.dontSeeDisabledAttribute('.json-editor-btntype-deletelast')
48
+ I.dontSeeDisabledAttribute('.json-editor-btntype-deleteall')
49
+ })
50
+
51
+ Scenario('should have correct initial value', async ({ I }) => {
52
+ I.amOnPage('array.html')
53
+ I.click('.get-value')
54
+ I.waitForValue('.debug', '[]')
55
+ })
56
+
57
+ Scenario('unique items arrays sorting @unique-itmes-sorting', async ({ I }) => {
58
+ I.amOnPage('array-unique-items-sort.html')
59
+ I.waitForElement('.je-ready', DEFAULT_WAIT_TIME)
60
+ I.click('[data-schemapath="root.items"] .form-control:nth-of-type(1)')
61
+ I.click('.get-value')
62
+ I.waitForValue('.debug', '{"items":["01"]}')
63
+ I.click('[data-schemapath="root.items"] .form-control:nth-of-type(2)')
64
+ I.click('.get-value')
65
+ I.waitForValue('.debug', '{"items":["01","02"]}')
66
+ I.click('[data-schemapath="root.items"] .form-control:nth-of-type(3)')
67
+ I.click('.get-value')
68
+ I.waitForValue('.debug', '{"items":["01","02","03"]}')
69
+ I.click('[data-schemapath="root.items"] .form-control:nth-of-type(4)')
70
+ I.click('.get-value')
71
+ I.waitForValue('.debug', '{"items":["01","02","03","04"]}')
72
+ I.click('[data-schemapath="root.items"] .form-control:nth-of-type(5)')
73
+ I.click('.get-value')
74
+ I.waitForValue('.debug', '{"items":["01","02","03","04","05"]}')
75
+ I.click('[data-schemapath="root.items"] .form-control:nth-of-type(6)')
76
+ I.click('.get-value')
77
+ I.waitForValue('.debug', '{"items":["01","02","03","04","05","06"]}')
78
+ I.click('[data-schemapath="root.items"] .form-control:nth-of-type(7)')
79
+ I.click('.get-value')
80
+ I.waitForValue('.debug', '{"items":["01","02","03","04","05","06","07"]}')
81
+ I.click('[data-schemapath="root.items"] .form-control:nth-of-type(8)')
82
+ I.click('.get-value')
83
+ I.waitForValue('.debug', '{"items":["01","02","03","04","05","06","07","08"]}')
84
+ I.click('[data-schemapath="root.items"] .form-control:nth-of-type(9)')
85
+ I.click('.get-value')
86
+ I.waitForValue('.debug', '{"items":["01","02","03","04","05","06","07","08","09"]}')
87
+ I.click('[data-schemapath="root.items"] .form-control:nth-of-type(10)')
88
+ I.click('.get-value')
89
+ I.waitForValue('.debug', '{"items":["01","02","03","04","05","06","07","08","09","10"]}')
90
+ I.click('[data-schemapath="root.items"] .form-control:nth-of-type(11)')
91
+ I.click('.get-value')
92
+ I.waitForValue('.debug', '{"items":["01","02","03","04","05","06","07","08","09","10","11"]}')
93
+ I.click('[data-schemapath="root.items"] .form-control:nth-of-type(12)')
94
+ I.click('.get-value')
95
+ I.waitForValue('.debug', '{"items":["01","02","03","04","05","06","07","08","09","10","11","12"]}')
96
+ I.click('[data-schemapath="root.items"] .form-control:nth-of-type(13)')
97
+ I.click('.get-value')
98
+ I.waitForValue('.debug', '{"items":["01","02","03","04","05","06","07","08","09","10","11","12","13"]}')
99
+ I.click('[data-schemapath="root.items"] .form-control:nth-of-type(14)')
100
+ I.click('.get-value')
101
+ I.waitForValue('.debug', '{"items":["01","02","03","04","05","06","07","08","09","10","11","12","13","14"]}')
102
+ I.click('[data-schemapath="root.items"] .form-control:nth-of-type(15)')
103
+ I.click('.get-value')
104
+ I.waitForValue('.debug', '{"items":["01","02","03","04","05","06","07","08","09","10","11","12","13","14","15"]}')
105
+ })
106
+
107
+ Scenario('should array editor events (table) @array-events', async ({ I }) => {
108
+ I.amOnPage('array-events-table.html')
109
+ I.seeElement('[data-schemapath="root.0"]')
110
+ I.seeElement('[data-schemapath="root.1"]')
111
+ I.seeElement('[data-schemapath="root.2"]')
112
+ I.seeElement('[data-schemapath="root.3"]')
113
+ I.seeElement('[data-schemapath="root.4"]')
114
+ I.click('.get-value')
115
+ I.waitForValue('.debug', '["A","B","C","D","E"]')
116
+
117
+ I.amAcceptingPopups()
118
+ I.click('//button[contains(@class, "json-editor-btn-moveup") and @data-i="1"]')
119
+ I.retry({ retries: 5, minTimeout: 500 }).seeInPopup('moveRow')
120
+ I.acceptPopup()
121
+ I.click('.get-value')
122
+ I.waitForValue('.debug', '["B","A","C","D","E"]')
123
+
124
+ I.amAcceptingPopups()
125
+ I.click('//button[contains(@class, "json-editor-btn-movedown") and @data-i="1"]')
126
+ I.retry({ retries: 5, minTimeout: 500 }).seeInPopup('moveRow')
127
+ I.acceptPopup()
128
+ I.click('.get-value')
129
+ I.waitForValue('.debug', '["B","C","A","D","E"]')
130
+
131
+ I.amAcceptingPopups()
132
+ I.click('//button[contains(@class, "json-editor-btn-copy") and @data-i="2"]')
133
+ I.retry({ retries: 5, minTimeout: 500 }).seeInPopup('copyRow')
134
+ I.acceptPopup()
135
+ I.click('.get-value')
136
+ I.waitForValue('.debug', '["B","C","A","A","D","E"]')
137
+
138
+ I.amAcceptingPopups()
139
+ I.click('.json-editor-btntype-add')
140
+ I.retry({ retries: 5, minTimeout: 500 }).seeInPopup('addRow')
141
+ I.acceptPopup()
142
+ I.click('.get-value')
143
+ I.waitForValue('.debug', '["B","C","A","A","D","E",""]')
144
+
145
+ // This test will fail when using Puppeteer due to the way Puppeteer handles popups.
146
+ // Puppeteer apparently only sees the text in the last popup, so it doesn't see the
147
+ // 'Are you sure you want to remove this item?' popup text.
148
+ // ToDo: Change test so instead of using popup for test values like 'deleteRow', use a
149
+ // form field. Similar to the '.debug' field.
150
+ I.amAcceptingPopups()
151
+ I.click('.json-editor-btntype-deletelast')
152
+ I.retry({ retries: 5, minTimeout: 500 }).seeInPopup('Are you sure you want to remove this item?')
153
+ I.acceptPopup()
154
+ I.amAcceptingPopups()
155
+ I.retry({ retries: 5, minTimeout: 500 }).seeInPopup('deleteRow')
156
+ I.acceptPopup()
157
+ I.click('.get-value')
158
+ I.waitForValue('.debug', '["B","C","A","A","D","E"]')
159
+
160
+ // This test will fail when using Puppeteer due to the way Puppeteer handles popups.
161
+ I.amAcceptingPopups()
162
+ I.click('.json-editor-btntype-deleteall')
163
+ I.retry({ retries: 5, minTimeout: 500 }).seeInPopup('Are you sure you want to remove this item?')
164
+ I.acceptPopup()
165
+ I.amAcceptingPopups()
166
+ I.retry({ retries: 5, minTimeout: 500 }).seeInPopup('deleteAllRows')
167
+ I.acceptPopup()
168
+ I.click('.get-value')
169
+ I.waitForValue('.debug', '[]')
170
+ })
171
+
172
+ Scenario('should array editor events @array-events', async ({ I }) => {
173
+ I.amOnPage('array-events.html')
174
+ I.seeElement('[data-schemapath="root.0"]')
175
+ I.seeElement('[data-schemapath="root.1"]')
176
+ I.click('.get-value')
177
+ I.waitForValue('.debug', '["A","B"]')
178
+
179
+ I.click('.json-editor-btn-moveup')
180
+ I.waitForValue('#action1', 'moveRow')
181
+ I.click('.get-value')
182
+ I.waitForValue('.debug', '["B","A"]')
183
+
184
+ I.click('.json-editor-btn-movedown')
185
+ I.waitForValue('#action1', 'moveRow')
186
+ I.click('.get-value')
187
+ I.waitForValue('.debug', '["A","B"]')
188
+
189
+ I.click('.json-editor-btntype-add')
190
+ I.waitForValue('#action1', 'addRow')
191
+ I.click('.get-value')
192
+ I.waitForValue('.debug', '["A","B",""]')
193
+
194
+ I.click('.json-editor-btntype-copy')
195
+ I.waitForValue('#action2', 'copyRow')
196
+ I.click('.get-value')
197
+ I.waitForValue('.debug', '["A","B","","A"]')
198
+
199
+ I.amAcceptingPopups()
200
+ I.click('.json-editor-btntype-deletelast')
201
+ I.seeInPopup('Are you sure you want to remove this item?')
202
+ I.acceptPopup()
203
+ I.waitForValue('#action1', 'deleteRow')
204
+ I.click('.get-value')
205
+ I.waitForValue('.debug', '["A","B",""]')
206
+
207
+ I.amAcceptingPopups()
208
+ I.click('.json-editor-btntype-deleteall')
209
+ I.seeInPopup('Are you sure you want to remove this item?')
210
+ I.acceptPopup()
211
+ I.waitForValue('#action1', 'deleteAllRows')
212
+ I.click('.get-value')
213
+ I.waitForValue('.debug', '[]')
214
+ })
215
+
216
+ Scenario('should work well with string editors', async ({ I }) => {
217
+ I.amOnPage('array-strings.html')
218
+ I.click('Add String')
219
+ I.click('Add String')
220
+ I.click('Add String')
221
+ I.click('Add String')
222
+ I.click('Add String')
223
+ I.seeElement('[name="root[0]"]')
224
+ I.seeElement('[name="root[1]"]')
225
+ I.seeElement('[name="root[2]"]')
226
+ I.seeElement('[name="root[3]"]')
227
+ I.seeElement('[name="root[4]"]')
228
+ I.fillField('[name="root[0]"]', '1')
229
+ I.fillField('[name="root[1]"]', '2')
230
+ I.fillField('[name="root[2]"]', '3')
231
+ I.fillField('[name="root[3]"]', '4')
232
+ I.fillField('[name="root[4]"]', '5')
233
+ I.click('.get-value')
234
+ I.waitForValue('.debug', '["1","2","3","4","5"]')
81
235
 
82
236
  // shuffle
83
- I.click('.moveup[data-i="4"]');
84
- I.click('.moveup[data-i="2"]');
85
- I.click('.moveup[data-i="1"]');
86
- I.click('.get-value');
87
- value = await I.grabValueFrom('.debug');
88
- assert.equal(value, '["3","1","2","5","4"]');
237
+ I.click('.moveup[data-i="4"]')
238
+ I.click('.moveup[data-i="2"]')
239
+ I.click('.moveup[data-i="1"]')
240
+ I.click('.get-value')
241
+ I.waitForValue('.debug', '["3","1","2","5","4"]')
89
242
 
90
243
  // delete single
91
- I.see('String 5');
92
- I.click('[data-schemapath="root.4"] .delete');
93
- I.seeInPopup('Are you sure you want to remove this node?');
94
- I.cancelPopup();
95
- I.see('String 5');
96
- I.click('[data-schemapath="root.4"] .delete');
97
- I.seeInPopup('Are you sure you want to remove this node?');
98
- I.acceptPopup();
99
- I.dontSee('String 5');
244
+ I.see('String 5')
245
+ I.amCancellingPopups()
246
+ I.click('[data-schemapath="root.4"] .delete')
247
+ I.seeInPopup('Are you sure you want to remove this item?')
248
+ I.cancelPopup()
249
+ I.see('String 5')
250
+ I.amAcceptingPopups()
251
+ I.click('[data-schemapath="root.4"] .delete')
252
+ I.seeInPopup('Are you sure you want to remove this item?')
253
+ I.acceptPopup()
254
+ I.dontSee('String 5')
100
255
 
101
256
  // delete last
102
- I.see('String 4');
103
- I.click('Delete Last String');
104
- I.seeInPopup('Are you sure you want to remove this node?');
105
- I.cancelPopup();
106
- I.see('String 4');
107
- I.click('Delete Last String');
108
- I.seeInPopup('Are you sure you want to remove this node?');
109
- I.acceptPopup();
110
- I.dontSee('String 4');
257
+ I.see('String 4')
258
+ I.amCancellingPopups()
259
+ I.click('Delete Last String')
260
+ I.seeInPopup('Are you sure you want to remove this item?')
261
+ I.cancelPopup()
262
+ I.see('String 4')
263
+ I.amAcceptingPopups()
264
+ I.click('Delete Last String')
265
+ I.seeInPopup('Are you sure you want to remove this item?')
266
+ I.acceptPopup()
267
+ I.dontSee('String 4')
111
268
 
112
269
  // delete all
113
- I.see('String 1');
114
- I.see('String 2');
115
- I.see('String 3');
116
- I.click('Delete All');
117
- I.seeInPopup('Are you sure you want to remove this node?');
118
- I.cancelPopup();
119
- I.see('String 1');
120
- I.see('String 2');
121
- I.see('String 3');
122
- I.click('Delete All');
123
- I.seeInPopup('Are you sure you want to remove this node?');
124
- I.acceptPopup();
125
- I.dontSee('String 1');
126
- I.dontSee('String 2');
127
- I.dontSee('String 3');
128
- });
129
-
130
- Scenario('should work well with number editors', async (I) => {
131
- I.amOnPage('array-numbers.html');
132
- I.click('Add Number');
133
- I.click('Add Number');
134
- I.click('Add Number');
135
- I.click('Add Number');
136
- I.click('Add Number');
137
- I.seeElement('[name="root[0]"]');
138
- I.seeElement('[name="root[1]"]');
139
- I.seeElement('[name="root[2]"]');
140
- I.seeElement('[name="root[3]"]');
141
- I.seeElement('[name="root[4]"]');
142
- I.fillField('[name="root[0]"]', "1");
143
- I.fillField('[name="root[1]"]', "2");
144
- I.fillField('[name="root[2]"]', "3");
145
- I.fillField('[name="root[3]"]', "4");
146
- I.fillField('[name="root[4]"]', "5");
147
- I.click('.get-value');
148
- value = await I.grabValueFrom('.debug');
149
- assert.equal(value, '[1,2,3,4,5]');
270
+ I.see('String 1')
271
+ I.see('String 2')
272
+ I.see('String 3')
273
+ I.amCancellingPopups()
274
+ I.click('Delete All')
275
+ I.seeInPopup('Are you sure you want to remove this item?')
276
+ I.cancelPopup()
277
+ I.see('String 1')
278
+ I.see('String 2')
279
+ I.see('String 3')
280
+ I.amAcceptingPopups()
281
+ I.click('Delete All')
282
+ I.seeInPopup('Are you sure you want to remove this item?')
283
+ I.acceptPopup()
284
+ I.dontSee('String 1')
285
+ I.dontSee('String 2')
286
+ I.dontSee('String 3')
287
+ })
288
+
289
+ Scenario('should work well with number editors', async ({ I }) => {
290
+ I.amOnPage('array-numbers.html')
291
+ I.click('Add Number')
292
+ I.click('Add Number')
293
+ I.click('Add Number')
294
+ I.click('Add Number')
295
+ I.click('Add Number')
296
+ I.seeElement('[name="root[0]"]')
297
+ I.seeElement('[name="root[1]"]')
298
+ I.seeElement('[name="root[2]"]')
299
+ I.seeElement('[name="root[3]"]')
300
+ I.seeElement('[name="root[4]"]')
301
+ I.fillField('[name="root[0]"]', '1')
302
+ I.fillField('[name="root[1]"]', '2')
303
+ I.fillField('[name="root[2]"]', '3')
304
+ I.fillField('[name="root[3]"]', '4')
305
+ I.fillField('[name="root[4]"]', '5')
306
+ I.click('.get-value')
307
+ I.waitForValue('.debug', '[1,2,3,4,5]')
150
308
 
151
309
  // shuffle
152
- I.click('.moveup[data-i="4"]');
153
- I.click('.moveup[data-i="2"]');
154
- I.click('.moveup[data-i="1"]');
155
- I.click('.get-value');
156
- value = await I.grabValueFrom('.debug');
157
- assert.equal(value, '[3,1,2,5,4]');
310
+ I.click('.moveup[data-i="4"]')
311
+ I.click('.moveup[data-i="2"]')
312
+ I.click('.moveup[data-i="1"]')
313
+ I.click('.get-value')
314
+ I.waitForValue('.debug', '[3,1,2,5,4]')
158
315
 
159
316
  // delete single
160
- I.see('Number 5');
161
- I.click('[data-schemapath="root.4"] .delete');
162
- I.seeInPopup('Are you sure you want to remove this node?');
163
- I.cancelPopup();
164
- I.see('Number 5');
165
- I.click('[data-schemapath="root.4"] .delete');
166
- I.seeInPopup('Are you sure you want to remove this node?');
167
- I.acceptPopup();
168
- I.dontSee('Number 5');
317
+ I.see('Number 5')
318
+ I.amCancellingPopups()
319
+ I.click('[data-schemapath="root.4"] .delete')
320
+ I.seeInPopup('Are you sure you want to remove this item?')
321
+ I.cancelPopup()
322
+ I.see('Number 5')
323
+ I.amAcceptingPopups()
324
+ I.click('[data-schemapath="root.4"] .delete')
325
+ I.seeInPopup('Are you sure you want to remove this item?')
326
+ I.acceptPopup()
327
+ I.dontSee('Number 5')
169
328
 
170
329
  // delete last
171
- I.see('Number 4');
172
- I.click('Delete Last Number');
173
- I.seeInPopup('Are you sure you want to remove this node?');
174
- I.cancelPopup();
175
- I.see('Number 4');
176
- I.click('Delete Last Number');
177
- I.seeInPopup('Are you sure you want to remove this node?');
178
- I.acceptPopup();
179
- I.dontSee('Number 4');
330
+ I.see('Number 4')
331
+ I.amCancellingPopups()
332
+ I.click('Delete Last Number')
333
+ I.seeInPopup('Are you sure you want to remove this item?')
334
+ I.cancelPopup()
335
+ I.see('Number 4')
336
+ I.amAcceptingPopups()
337
+ I.click('Delete Last Number')
338
+ I.seeInPopup('Are you sure you want to remove this item?')
339
+ I.acceptPopup()
340
+ I.dontSee('Number 4')
180
341
 
181
342
  // delete all
182
- I.see('Number 1');
183
- I.see('Number 2');
184
- I.see('Number 3');
185
- I.click('Delete All');
186
- I.seeInPopup('Are you sure you want to remove this node?');
187
- I.cancelPopup();
188
- I.see('Number 1');
189
- I.see('Number 2');
190
- I.see('Number 3');
191
- I.click('Delete All');
192
- I.seeInPopup('Are you sure you want to remove this node?');
193
- I.acceptPopup();
194
- I.dontSee('Number 1');
195
- I.dontSee('Number 2');
196
- I.dontSee('Number 3');
197
- });
198
-
199
- Scenario('should work well with integer editors', async (I) => {
200
- I.amOnPage('array-integers.html');
201
- I.click('Add Integer');
202
- I.click('Add Integer');
203
- I.click('Add Integer');
204
- I.click('Add Integer');
205
- I.click('Add Integer');
206
- I.seeElement('[name="root[0]"]');
207
- I.seeElement('[name="root[1]"]');
208
- I.seeElement('[name="root[2]"]');
209
- I.seeElement('[name="root[3]"]');
210
- I.seeElement('[name="root[4]"]');
211
- I.fillField('[name="root[0]"]', "1");
212
- I.fillField('[name="root[1]"]', "2");
213
- I.fillField('[name="root[2]"]', "3");
214
- I.fillField('[name="root[3]"]', "4");
215
- I.fillField('[name="root[4]"]', "5");
216
- I.click('.get-value');
217
- value = await I.grabValueFrom('.debug');
218
- assert.equal(value, '[1,2,3,4,5]');
343
+ I.see('Number 1')
344
+ I.see('Number 2')
345
+ I.see('Number 3')
346
+ I.amCancellingPopups()
347
+ I.click('Delete All')
348
+ I.seeInPopup('Are you sure you want to remove this item?')
349
+ I.cancelPopup()
350
+ I.see('Number 1')
351
+ I.see('Number 2')
352
+ I.see('Number 3')
353
+ I.amAcceptingPopups()
354
+ I.click('Delete All')
355
+ I.seeInPopup('Are you sure you want to remove this item?')
356
+ I.acceptPopup()
357
+ I.dontSee('Number 1')
358
+ I.dontSee('Number 2')
359
+ I.dontSee('Number 3')
360
+ })
361
+
362
+ Scenario('should work well with integer editors', async ({ I }) => {
363
+ I.amOnPage('array-integers.html')
364
+ I.click('Add Integer')
365
+ I.click('Add Integer')
366
+ I.click('Add Integer')
367
+ I.click('Add Integer')
368
+ I.click('Add Integer')
369
+ I.seeElement('[name="root[0]"]')
370
+ I.seeElement('[name="root[1]"]')
371
+ I.seeElement('[name="root[2]"]')
372
+ I.seeElement('[name="root[3]"]')
373
+ I.seeElement('[name="root[4]"]')
374
+ I.fillField('[name="root[0]"]', '1')
375
+ I.fillField('[name="root[1]"]', '2')
376
+ I.fillField('[name="root[2]"]', '3')
377
+ I.fillField('[name="root[3]"]', '4')
378
+ I.fillField('[name="root[4]"]', '5')
379
+ I.click('.get-value')
380
+ I.waitForValue('.debug', '[1,2,3,4,5]')
219
381
 
220
382
  // shuffle
221
- I.click('.moveup[data-i="4"]');
222
- I.click('.moveup[data-i="2"]');
223
- I.click('.moveup[data-i="1"]');
224
- I.click('.get-value');
225
- value = await I.grabValueFrom('.debug');
226
- assert.equal(value, '[3,1,2,5,4]');
383
+ I.click('.moveup[data-i="4"]')
384
+ I.click('.moveup[data-i="2"]')
385
+ I.click('.moveup[data-i="1"]')
386
+ I.click('.get-value')
387
+ I.waitForValue('.debug', '[3,1,2,5,4]')
227
388
 
228
389
  // delete single
229
- I.see('Integer 5');
230
- I.click('[data-schemapath="root.4"] .delete');
231
- I.seeInPopup('Are you sure you want to remove this node?');
232
- I.cancelPopup();
233
- I.see('Integer 5');
234
- I.click('[data-schemapath="root.4"] .delete');
235
- I.seeInPopup('Are you sure you want to remove this node?');
236
- I.acceptPopup();
237
- I.dontSee('Integer 5');
390
+ I.see('Integer 5')
391
+ I.amCancellingPopups()
392
+ I.click('[data-schemapath="root.4"] .delete')
393
+ I.seeInPopup('Are you sure you want to remove this item?')
394
+ I.cancelPopup()
395
+ I.see('Integer 5')
396
+ I.amAcceptingPopups()
397
+ I.click('[data-schemapath="root.4"] .delete')
398
+ I.seeInPopup('Are you sure you want to remove this item?')
399
+ I.acceptPopup()
400
+ I.dontSee('Integer 5')
238
401
 
239
402
  // delete last
240
- I.see('Integer 4');
241
- I.click('Delete Last Integer');
242
- I.seeInPopup('Are you sure you want to remove this node?');
243
- I.cancelPopup();
244
- I.see('Integer 4');
245
- I.click('Delete Last Integer');
246
- I.seeInPopup('Are you sure you want to remove this node?');
247
- I.acceptPopup();
248
- I.dontSee('Integer 4');
403
+ I.see('Integer 4')
404
+ I.amCancellingPopups()
405
+ I.click('Delete Last Integer')
406
+ I.seeInPopup('Are you sure you want to remove this item?')
407
+ I.cancelPopup()
408
+ I.see('Integer 4')
409
+ I.amAcceptingPopups()
410
+ I.click('Delete Last Integer')
411
+ I.seeInPopup('Are you sure you want to remove this item?')
412
+ I.acceptPopup()
413
+ I.dontSee('Integer 4')
249
414
 
250
415
  // delete all
251
- I.see('Integer 1');
252
- I.see('Integer 2');
253
- I.see('Integer 3');
254
- I.click('Delete All');
255
- I.seeInPopup('Are you sure you want to remove this node?');
256
- I.cancelPopup();
257
- I.see('Integer 1');
258
- I.see('Integer 2');
259
- I.see('Integer 3');
260
- I.click('Delete All');
261
- I.seeInPopup('Are you sure you want to remove this node?');
262
- I.acceptPopup();
263
- I.dontSee('Integer 1');
264
- I.dontSee('Integer 2');
265
- I.dontSee('Integer 3');
266
- });
267
-
268
- Scenario('should work well with select editors', async (I) => {
269
- I.amOnPage('array-selects.html');
270
- I.click('Add Select');
271
- I.click('Add Select');
272
- I.seeElement('[name="root[0]"]');
273
- I.seeElement('[name="root[1]"]');
274
- I.selectOption('[name="root[0]"]', "true");
275
- I.selectOption('[name="root[1]"]', "false");
276
- I.click('.get-value');
277
- value = await I.grabValueFrom('.debug');
278
- assert.equal(value, '[true,false]');
416
+ I.see('Integer 1')
417
+ I.see('Integer 2')
418
+ I.see('Integer 3')
419
+ I.amCancellingPopups()
420
+ I.click('Delete All')
421
+ I.seeInPopup('Are you sure you want to remove this item?')
422
+ I.cancelPopup()
423
+ I.see('Integer 1')
424
+ I.see('Integer 2')
425
+ I.see('Integer 3')
426
+ I.amAcceptingPopups()
427
+ I.click('Delete All')
428
+ I.seeInPopup('Are you sure you want to remove this item?')
429
+ I.acceptPopup()
430
+ I.dontSee('Integer 1')
431
+ I.dontSee('Integer 2')
432
+ I.dontSee('Integer 3')
433
+ })
434
+
435
+ Scenario('should work well with select editors', async ({ I }) => {
436
+ I.amOnPage('array-selects.html')
437
+ I.click('Add Select')
438
+ I.click('Add Select')
439
+ I.seeElement('[name="root[0]"]')
440
+ I.seeElement('[name="root[1]"]')
441
+ I.selectOption('[name="root[0]"]', 'true')
442
+ I.selectOption('[name="root[1]"]', 'false')
443
+ I.click('.get-value')
444
+ I.waitForValue('.debug', '[true,false]')
279
445
 
280
446
  // shuffle
281
- I.click('.moveup[data-i="1"]');
282
- I.click('.get-value');
283
- value = await I.grabValueFrom('.debug');
284
- assert.equal(value, '[false,true]');
447
+ I.click('.moveup[data-i="1"]')
448
+ I.click('.get-value')
449
+ I.waitForValue('.debug', '[false,true]')
285
450
 
286
451
  // delete single
287
- I.click('Add Select');
288
- I.click('Add Select');
289
- I.click('Add Select');
290
- I.see('Select 5');
291
- I.click('[data-schemapath="root.4"] .delete');
292
- I.seeInPopup('Are you sure you want to remove this node?');
293
- I.cancelPopup();
294
- I.see('Select 5');
295
- I.click('[data-schemapath="root.4"] .delete');
296
- I.seeInPopup('Are you sure you want to remove this node?');
297
- I.acceptPopup();
298
- I.dontSee('Select 5');
452
+ I.click('Add Select')
453
+ I.click('Add Select')
454
+ I.click('Add Select')
455
+ I.see('Select 5')
456
+ I.amCancellingPopups()
457
+ I.click('[data-schemapath="root.4"] .delete')
458
+ I.seeInPopup('Are you sure you want to remove this item?')
459
+ I.cancelPopup()
460
+ I.see('Select 5')
461
+ I.amAcceptingPopups()
462
+ I.click('[data-schemapath="root.4"] .delete')
463
+ I.seeInPopup('Are you sure you want to remove this item?')
464
+ I.acceptPopup()
465
+ I.dontSee('Select 5')
299
466
 
300
467
  // delete last
301
- I.see('Select 4');
302
- I.click('Delete Last Select');
303
- I.seeInPopup('Are you sure you want to remove this node?');
304
- I.cancelPopup();
305
- I.see('Select 4');
306
- I.click('Delete Last Select');
307
- I.seeInPopup('Are you sure you want to remove this node?');
308
- I.acceptPopup();
309
- I.dontSee('Select 4');
468
+ I.see('Select 4')
469
+ I.amCancellingPopups()
470
+ I.click('Delete Last Select')
471
+ I.seeInPopup('Are you sure you want to remove this item?')
472
+ I.cancelPopup()
473
+ I.see('Select 4')
474
+ I.amAcceptingPopups()
475
+ I.click('Delete Last Select')
476
+ I.seeInPopup('Are you sure you want to remove this item?')
477
+ I.acceptPopup()
478
+ I.dontSee('Select 4')
310
479
 
311
480
  // delete all
312
- I.see('Select 1');
313
- I.see('Select 2');
314
- I.see('Select 3');
315
- I.click('Delete All');
316
- I.seeInPopup('Are you sure you want to remove this node?');
317
- I.cancelPopup();
318
- I.see('Select 1');
319
- I.see('Select 2');
320
- I.see('Select 3');
321
- I.click('Delete All');
322
- I.seeInPopup('Are you sure you want to remove this node?');
323
- I.acceptPopup();
324
- I.dontSee('Select 1');
325
- I.dontSee('Select 2');
326
- I.dontSee('Select 3');
327
- });
328
-
329
- Scenario('should work well with checkbox editors', async (I) => {
330
- I.amOnPage('array-checkboxes.html');
331
- I.click('Add Checkbox');
332
- I.click('Add Checkbox');
333
- I.click('Add Checkbox');
334
- I.click('Add Checkbox');
335
- I.click('Add Checkbox');
336
- I.seeElement('[data-schemapath="root.0"]');
337
- I.seeElement('[data-schemapath="root.1"]');
338
- I.seeElement('[data-schemapath="root.2"]');
339
- I.seeElement('[data-schemapath="root.3"]');
340
- I.seeElement('[data-schemapath="root.4"]');
341
- I.checkOption('1', '[data-schemapath="root.0"]');
342
- I.checkOption('2', '[data-schemapath="root.1"]');
343
- I.checkOption('3', '[data-schemapath="root.2"]');
344
- I.checkOption('4', '[data-schemapath="root.3"]');
345
- I.checkOption('5', '[data-schemapath="root.4"]');
346
- I.click('.get-value');
347
- value = await I.grabValueFrom('.debug');
348
- assert.equal(value, '[["1"],["2"],["3"],["4"],["5"]]');
481
+ I.see('Select 1')
482
+ I.see('Select 2')
483
+ I.see('Select 3')
484
+ I.amCancellingPopups()
485
+ I.click('Delete All')
486
+ I.seeInPopup('Are you sure you want to remove this item?')
487
+ I.cancelPopup()
488
+ I.see('Select 1')
489
+ I.see('Select 2')
490
+ I.see('Select 3')
491
+ I.amAcceptingPopups()
492
+ I.click('Delete All')
493
+ I.seeInPopup('Are you sure you want to remove this item?')
494
+ I.acceptPopup()
495
+ I.dontSee('Select 1')
496
+ I.dontSee('Select 2')
497
+ I.dontSee('Select 3')
498
+ })
499
+
500
+ Scenario('should work well with checkbox editors', async ({ I }) => {
501
+ I.amOnPage('array-checkboxes.html')
502
+ I.click('Add Checkbox')
503
+ I.click('Add Checkbox')
504
+ I.click('Add Checkbox')
505
+ I.click('Add Checkbox')
506
+ I.click('Add Checkbox')
507
+ I.seeElement('[data-schemapath="root.0"]')
508
+ I.seeElement('[data-schemapath="root.1"]')
509
+ I.seeElement('[data-schemapath="root.2"]')
510
+ I.seeElement('[data-schemapath="root.3"]')
511
+ I.seeElement('[data-schemapath="root.4"]')
512
+ I.checkOption('1', '[data-schemapath="root.0"]')
513
+ I.checkOption('2', '[data-schemapath="root.1"]')
514
+ I.checkOption('3', '[data-schemapath="root.2"]')
515
+ I.checkOption('4', '[data-schemapath="root.3"]')
516
+ I.checkOption('5', '[data-schemapath="root.4"]')
517
+ I.click('.get-value')
518
+ I.waitForValue('.debug', '[["1"],["2"],["3"],["4"],["5"]]')
349
519
 
350
520
  // shuffle
351
- I.click('.moveup[data-i="4"]');
352
- I.click('.moveup[data-i="2"]');
353
- I.click('.moveup[data-i="1"]');
354
- I.click('.get-value');
355
- value = await I.grabValueFrom('.debug');
356
- assert.equal(value, '[["3"],["1"],["2"],["5"],["4"]]');
521
+ I.click('.moveup[data-i="4"]')
522
+ I.click('.moveup[data-i="2"]')
523
+ I.click('.moveup[data-i="1"]')
524
+ I.click('.get-value')
525
+ I.waitForValue('.debug', '[["3"],["1"],["2"],["5"],["4"]]')
357
526
 
358
527
  // delete single
359
- I.see('Checkbox 5');
360
- I.click('[data-schemapath="root.4"] .delete');
361
- I.seeInPopup('Are you sure you want to remove this node?');
362
- I.cancelPopup();
363
- I.see('Checkbox 5');
364
- I.click('[data-schemapath="root.4"] .delete');
365
- I.seeInPopup('Are you sure you want to remove this node?');
366
- I.acceptPopup();
367
- I.dontSee('Checkbox 5');
528
+ I.see('Checkbox 5')
529
+ I.amCancellingPopups()
530
+ I.click('[data-schemapath="root.4"] .delete')
531
+ I.seeInPopup('Are you sure you want to remove this item?')
532
+ I.cancelPopup()
533
+ I.see('Checkbox 5')
534
+ I.amAcceptingPopups()
535
+ I.click('[data-schemapath="root.4"] .delete')
536
+ I.seeInPopup('Are you sure you want to remove this item?')
537
+ I.acceptPopup()
538
+ I.dontSee('Checkbox 5')
368
539
 
369
540
  // delete last
370
- I.see('Checkbox 4');
371
- I.click('Delete Last Checkbox');
372
- I.seeInPopup('Are you sure you want to remove this node?');
373
- I.cancelPopup();
374
- I.see('Checkbox 4');
375
- I.click('Delete Last Checkbox');
376
- I.seeInPopup('Are you sure you want to remove this node?');
377
- I.acceptPopup();
378
- I.dontSee('Checkbox 4');
541
+ I.see('Checkbox 4')
542
+ I.amCancellingPopups()
543
+ I.click('Delete Last Checkbox')
544
+ I.seeInPopup('Are you sure you want to remove this item?')
545
+ I.cancelPopup()
546
+ I.see('Checkbox 4')
547
+ I.amAcceptingPopups()
548
+ I.click('Delete Last Checkbox')
549
+ I.seeInPopup('Are you sure you want to remove this item?')
550
+ I.acceptPopup()
551
+ I.dontSee('Checkbox 4')
379
552
 
380
553
  // delete all
381
- I.see('Checkbox 1');
382
- I.see('Checkbox 2');
383
- I.see('Checkbox 3');
384
- I.click('Delete All');
385
- I.seeInPopup('Are you sure you want to remove this node?');
386
- I.cancelPopup();
387
- I.see('Checkbox 1');
388
- I.see('Checkbox 2');
389
- I.see('Checkbox 3');
390
- I.click('Delete All');
391
- I.seeInPopup('Are you sure you want to remove this node?');
392
- I.acceptPopup();
393
- I.dontSee('Checkbox 1');
394
- I.dontSee('Checkbox 2');
395
- I.dontSee('Checkbox 3');
396
- });
397
-
398
- Scenario('should work well with rating editors', async (I) => {
399
- I.amOnPage('array-ratings.html');
400
- I.seeElement('[data-schemapath="root.0"]');
401
- I.seeElement('[data-schemapath="root.1"]');
402
- I.seeElement('[data-schemapath="root.2"]');
403
- I.seeElement('[data-schemapath="root.3"]');
404
- I.seeElement('[data-schemapath="root.4"]');
405
- I.click('.get-value');
406
- value = await I.grabValueFrom('.debug');
407
- assert.equal(value, '[1,2,3,4,5]');
554
+ I.see('Checkbox 1')
555
+ I.see('Checkbox 2')
556
+ I.see('Checkbox 3')
557
+ I.amCancellingPopups()
558
+ I.click('Delete All')
559
+ I.seeInPopup('Are you sure you want to remove this item?')
560
+ I.cancelPopup()
561
+ I.see('Checkbox 1')
562
+ I.see('Checkbox 2')
563
+ I.see('Checkbox 3')
564
+ I.amAcceptingPopups()
565
+ I.click('Delete All')
566
+ I.seeInPopup('Are you sure you want to remove this item?')
567
+ I.acceptPopup()
568
+ I.dontSee('Checkbox 1')
569
+ I.dontSee('Checkbox 2')
570
+ I.dontSee('Checkbox 3')
571
+ })
572
+
573
+ Scenario('should work well with checkbox editors with infoText', async ({ I }) => {
574
+ I.amOnPage('array-checkboxes-infotext.html')
575
+
576
+ function check (checkboxId, title, infoText) {
577
+ const label = '//label[@for="' + checkboxId + '"]'
578
+ I.see(title, label)
579
+ const infoTextIcon = label + '/span[@class="je-infobutton-icon"]'
580
+
581
+ if (infoText) {
582
+ I.seeElement(infoTextIcon)
583
+ I.moveCursorTo(infoTextIcon)
584
+ I.see(infoText, label + '//span[@class="je-infobutton-tooltip"]')
585
+ } else {
586
+ I.dontSeeElement(infoTextIcon)
587
+ }
588
+ }
589
+
590
+ check('root0', 'old a')
591
+ check('root1', 'b')
592
+ check('root2', '3')
593
+ check('root3', '4', 'dd')
594
+ check('root4', 'e', 'ee')
595
+ })
596
+
597
+ Scenario('should work well with rating editors', async ({ I }) => {
598
+ I.amOnPage('array-ratings.html')
599
+ I.seeElement('[data-schemapath="root.0"]')
600
+ I.seeElement('[data-schemapath="root.1"]')
601
+ I.seeElement('[data-schemapath="root.2"]')
602
+ I.seeElement('[data-schemapath="root.3"]')
603
+ I.seeElement('[data-schemapath="root.4"]')
604
+ I.click('.get-value')
605
+ I.waitForValue('.debug', '[1,2,3,4,5]')
408
606
 
409
607
  // shuffle
410
- I.click('.moveup[data-i="4"]');
411
- I.click('.moveup[data-i="2"]');
412
- I.click('.moveup[data-i="1"]');
413
- I.click('.get-value');
414
- value = await I.grabValueFrom('.debug');
415
- assert.equal(value, '[3,1,2,5,4]');
608
+ I.click('.moveup[data-i="4"]')
609
+ I.click('.moveup[data-i="2"]')
610
+ I.click('.moveup[data-i="1"]')
611
+ I.click('.get-value')
612
+ I.waitForValue('.debug', '[3,1,2,5,4]')
416
613
 
417
614
  // delete single
418
- I.see('Rating 5');
419
- I.click('[data-schemapath="root.4"] .delete');
420
- I.seeInPopup('Are you sure you want to remove this node?');
421
- I.cancelPopup();
422
- I.see('Rating 5');
423
- I.click('[data-schemapath="root.4"] .delete');
424
- I.seeInPopup('Are you sure you want to remove this node?');
425
- I.acceptPopup();
426
- I.dontSee('Rating 5');
615
+ I.see('Rating 5')
616
+ I.amCancellingPopups()
617
+ I.click('[data-schemapath="root.4"] .delete')
618
+ I.seeInPopup('Are you sure you want to remove this item?')
619
+ I.cancelPopup()
620
+ I.see('Rating 5')
621
+ I.amAcceptingPopups()
622
+ I.click('[data-schemapath="root.4"] .delete')
623
+ I.seeInPopup('Are you sure you want to remove this item?')
624
+ I.acceptPopup()
625
+ I.dontSee('Rating 5')
427
626
 
428
627
  // delete last
429
- I.see('Rating 4');
430
- I.click('Delete Last Rating');
431
- I.seeInPopup('Are you sure you want to remove this node?');
432
- I.cancelPopup();
433
- I.see('Rating 4');
434
- I.click('Delete Last Rating');
435
- I.seeInPopup('Are you sure you want to remove this node?');
436
- I.acceptPopup();
437
- I.dontSee('Rating 4');
628
+ I.see('Rating 4')
629
+ I.amCancellingPopups()
630
+ I.click('Delete Last Rating')
631
+ I.seeInPopup('Are you sure you want to remove this item?')
632
+ I.cancelPopup()
633
+ I.see('Rating 4')
634
+ I.amAcceptingPopups()
635
+ I.click('Delete Last Rating')
636
+ I.seeInPopup('Are you sure you want to remove this item?')
637
+ I.acceptPopup()
638
+ I.dontSee('Rating 4')
438
639
 
439
640
  // delete all
440
- I.see('Rating 1');
441
- I.see('Rating 2');
442
- I.see('Rating 3');
443
- I.click('Delete All');
444
- I.seeInPopup('Are you sure you want to remove this node?');
445
- I.cancelPopup();
446
- I.see('Rating 1');
447
- I.see('Rating 2');
448
- I.see('Rating 3');
449
- I.click('Delete All');
450
- I.seeInPopup('Are you sure you want to remove this node?');
451
- I.acceptPopup();
452
- I.dontSee('Rating 1');
453
- I.dontSee('Rating 2');
454
- I.dontSee('Rating 3');
455
- });
456
-
457
- Scenario('should work well with multiselect editors', async (I) => {
458
- I.amOnPage('array-multiselects.html');
459
- I.click('Add Multiselect');
460
- I.click('Add Multiselect');
461
- I.click('Add Multiselect');
462
- I.click('Add Multiselect');
463
- I.click('Add Multiselect');
464
- I.seeElement('[data-schemapath="root.0"]');
465
- I.seeElement('[data-schemapath="root.1"]');
466
- I.seeElement('[data-schemapath="root.2"]');
467
- I.seeElement('[data-schemapath="root.3"]');
468
- I.seeElement('[data-schemapath="root.4"]');
469
- I.selectOption('[name="root[0]"]', "1");
470
- I.selectOption('[name="root[1]"]', "2");
471
- I.selectOption('[name="root[2]"]', "3");
472
- I.selectOption('[name="root[3]"]', "4");
473
- I.selectOption('[name="root[4]"]', "5");
474
- I.click('.get-value');
475
- value = await I.grabValueFrom('.debug');
476
- assert.equal(value, '[["1"],["2"],["3"],["4"],["5"]]');
641
+ I.see('Rating 1')
642
+ I.see('Rating 2')
643
+ I.see('Rating 3')
644
+ I.amCancellingPopups()
645
+ I.click('Delete All')
646
+ I.seeInPopup('Are you sure you want to remove this item?')
647
+ I.cancelPopup()
648
+ I.see('Rating 1')
649
+ I.see('Rating 2')
650
+ I.see('Rating 3')
651
+ I.amAcceptingPopups()
652
+ I.click('Delete All')
653
+ I.seeInPopup('Are you sure you want to remove this item?')
654
+ I.acceptPopup()
655
+ I.dontSee('Rating 1')
656
+ I.dontSee('Rating 2')
657
+ I.dontSee('Rating 3')
658
+ })
659
+
660
+ Scenario('should work well with multiselect editors', async ({ I }) => {
661
+ I.amOnPage('array-multiselects.html')
662
+ I.click('Add Multiselect')
663
+ I.click('Add Multiselect')
664
+ I.click('Add Multiselect')
665
+ I.click('Add Multiselect')
666
+ I.click('Add Multiselect')
667
+ I.seeElement('[data-schemapath="root.0"]')
668
+ I.seeElement('[data-schemapath="root.1"]')
669
+ I.seeElement('[data-schemapath="root.2"]')
670
+ I.seeElement('[data-schemapath="root.3"]')
671
+ I.seeElement('[data-schemapath="root.4"]')
672
+ I.selectOption('[name="root[0]"]', '1')
673
+ I.selectOption('[name="root[1]"]', '2')
674
+ I.selectOption('[name="root[2]"]', '3')
675
+ I.selectOption('[name="root[3]"]', '4')
676
+ I.selectOption('[name="root[4]"]', '5')
677
+ I.click('.get-value')
678
+ I.waitForValue('.debug', '[["1"],["2"],["3"],["4"],["5"]]')
477
679
 
478
680
  // shuffle
479
- I.click('.moveup[data-i="4"]');
480
- I.click('.moveup[data-i="2"]');
481
- I.click('.moveup[data-i="1"]');
482
- I.click('.get-value');
483
- value = await I.grabValueFrom('.debug');
484
- assert.equal(value, '[["3"],["1"],["2"],["5"],["4"]]');
681
+ I.click('.moveup[data-i="4"]')
682
+ I.click('.moveup[data-i="2"]')
683
+ I.click('.moveup[data-i="1"]')
684
+ I.click('.get-value')
685
+ I.waitForValue('.debug', '[["3"],["1"],["2"],["5"],["4"]]')
485
686
 
486
687
  // delete single
487
- I.see('Multiselect 5');
488
- I.click('[data-schemapath="root.4"] .delete');
489
- I.seeInPopup('Are you sure you want to remove this node?');
490
- I.cancelPopup();
491
- I.see('Multiselect 5');
492
- I.click('[data-schemapath="root.4"] .delete');
493
- I.seeInPopup('Are you sure you want to remove this node?');
494
- I.acceptPopup();
495
- I.dontSee('Multiselect 5');
688
+ I.see('Multiselect 5')
689
+ I.amCancellingPopups()
690
+ I.click('[data-schemapath="root.4"] .delete')
691
+ I.seeInPopup('Are you sure you want to remove this item?')
692
+ I.cancelPopup()
693
+ I.see('Multiselect 5')
694
+ I.amAcceptingPopups()
695
+ I.click('[data-schemapath="root.4"] .delete')
696
+ I.seeInPopup('Are you sure you want to remove this item?')
697
+ I.acceptPopup()
698
+ I.dontSee('Multiselect 5')
496
699
 
497
700
  // delete last
498
- I.see('Multiselect 4');
499
- I.click('Delete Last Multiselect');
500
- I.seeInPopup('Are you sure you want to remove this node?');
501
- I.cancelPopup();
502
- I.see('Multiselect 4');
503
- I.click('Delete Last Multiselect');
504
- I.seeInPopup('Are you sure you want to remove this node?');
505
- I.acceptPopup();
506
- I.dontSee('Multiselect 4');
701
+ I.see('Multiselect 4')
702
+ I.amCancellingPopups()
703
+ I.click('Delete Last Multiselect')
704
+ I.seeInPopup('Are you sure you want to remove this item?')
705
+ I.cancelPopup()
706
+ I.see('Multiselect 4')
707
+ I.click('Delete Last Multiselect')
708
+ I.seeInPopup('Are you sure you want to remove this item?')
709
+ I.acceptPopup()
710
+ I.dontSee('Multiselect 4')
507
711
 
508
712
  // delete all
509
- I.see('Multiselect 1');
510
- I.see('Multiselect 2');
511
- I.see('Multiselect 3');
512
- I.click('Delete All');
513
- I.seeInPopup('Are you sure you want to remove this node?');
514
- I.cancelPopup();
515
- I.see('Multiselect 1');
516
- I.see('Multiselect 2');
517
- I.see('Multiselect 3');
518
- I.click('Delete All');
519
- I.seeInPopup('Are you sure you want to remove this node?');
520
- I.acceptPopup();
521
- I.dontSee('Multiselect 1');
522
- I.dontSee('Multiselect 2');
523
- I.dontSee('Multiselect 3');
524
- });
525
-
526
- Scenario('should work well with object editors', async (I) => {
527
- I.amOnPage('array-objects.html');
528
- I.click('Add Object');
529
- I.click('Add Object');
530
- I.click('Add Object');
531
- I.click('Add Object');
532
- I.click('Add Object');
533
- I.seeElement('[name="root[0][property]"]');
534
- I.seeElement('[name="root[1][property]"]');
535
- I.seeElement('[name="root[2][property]"]');
536
- I.seeElement('[name="root[3][property]"]');
537
- I.seeElement('[name="root[4][property]"]');
538
- I.fillField('[name="root[0][property]"]', "1");
539
- I.fillField('[name="root[1][property]"]', "2");
540
- I.fillField('[name="root[2][property]"]', "3");
541
- I.fillField('[name="root[3][property]"]', "4");
542
- I.fillField('[name="root[4][property]"]', "5");
543
- I.click('.get-value');
544
- value = await I.grabValueFrom('.debug');
545
- assert.equal(value, '[{"property":"1"},{"property":"2"},{"property":"3"},{"property":"4"},{"property":"5"}]');
713
+ I.see('Multiselect 1')
714
+ I.see('Multiselect 2')
715
+ I.see('Multiselect 3')
716
+ I.amCancellingPopups()
717
+ I.click('Delete All')
718
+ I.seeInPopup('Are you sure you want to remove this item?')
719
+ I.cancelPopup()
720
+ I.see('Multiselect 1')
721
+ I.see('Multiselect 2')
722
+ I.see('Multiselect 3')
723
+ I.amAcceptingPopups()
724
+ I.click('Delete All')
725
+ I.seeInPopup('Are you sure you want to remove this item?')
726
+ I.acceptPopup()
727
+ I.dontSee('Multiselect 1')
728
+ I.dontSee('Multiselect 2')
729
+ I.dontSee('Multiselect 3')
730
+ })
731
+
732
+ Scenario('should work well with object editors', async ({ I }) => {
733
+ I.amOnPage('array-objects.html')
734
+ I.click('Add Object')
735
+ I.click('Add Object')
736
+ I.click('Add Object')
737
+ I.click('Add Object')
738
+ I.click('Add Object')
739
+ I.seeElement('[name="root[0][property]"]')
740
+ I.seeElement('[name="root[1][property]"]')
741
+ I.seeElement('[name="root[2][property]"]')
742
+ I.seeElement('[name="root[3][property]"]')
743
+ I.seeElement('[name="root[4][property]"]')
744
+ I.fillField('[name="root[0][property]"]', '1')
745
+ I.fillField('[name="root[1][property]"]', '2')
746
+ I.fillField('[name="root[2][property]"]', '3')
747
+ I.fillField('[name="root[3][property]"]', '4')
748
+ I.fillField('[name="root[4][property]"]', '5')
749
+ I.click('.get-value')
750
+ I.waitForValue('.debug', '[{"property":"1"},{"property":"2"},{"property":"3"},{"property":"4"},{"property":"5"}]')
546
751
 
547
752
  // shuffle
548
- I.click('.moveup[data-i="4"]');
549
- I.click('.moveup[data-i="2"]');
550
- I.click('.moveup[data-i="1"]');
551
- I.click('.get-value');
552
- value = await I.grabValueFrom('.debug');
553
- assert.equal(value, '[{"property":"3"},{"property":"1"},{"property":"2"},{"property":"5"},{"property":"4"}]');
753
+ I.click('.moveup[data-i="4"]')
754
+ I.click('.moveup[data-i="2"]')
755
+ I.click('.moveup[data-i="1"]')
756
+ I.click('.get-value')
757
+ I.waitForValue('.debug', '[{"property":"3"},{"property":"1"},{"property":"2"},{"property":"5"},{"property":"4"}]')
554
758
 
555
759
  // delete single
556
- I.see('Object 5');
557
- I.click('[data-schemapath="root.4"] .delete');
558
- I.seeInPopup('Are you sure you want to remove this node?');
559
- I.cancelPopup();
560
- I.see('Object 5');
561
- I.click('[data-schemapath="root.4"] .delete');
562
- I.seeInPopup('Are you sure you want to remove this node?');
563
- I.acceptPopup();
564
- I.dontSee('Object 5');
760
+ I.see('Object 5')
761
+ I.amCancellingPopups()
762
+ I.click('[data-schemapath="root.4"] .delete')
763
+ I.seeInPopup('Are you sure you want to remove this item?')
764
+ I.cancelPopup()
765
+ I.see('Object 5')
766
+ I.amAcceptingPopups()
767
+ I.click('[data-schemapath="root.4"] .delete')
768
+ I.seeInPopup('Are you sure you want to remove this item?')
769
+ I.acceptPopup()
770
+ I.dontSee('Object 5')
565
771
 
566
772
  // delete last
567
- I.see('Object 4');
568
- I.click('Delete Last Object');
569
- I.seeInPopup('Are you sure you want to remove this node?');
570
- I.cancelPopup();
571
- I.see('Object 4');
572
- I.click('Delete Last Object');
573
- I.seeInPopup('Are you sure you want to remove this node?');
574
- I.acceptPopup();
575
- I.dontSee('Object 4');
773
+ I.see('Object 4')
774
+ I.amCancellingPopups()
775
+ I.click('Delete Last Object')
776
+ I.seeInPopup('Are you sure you want to remove this item?')
777
+ I.cancelPopup()
778
+ I.see('Object 4')
779
+ I.amAcceptingPopups()
780
+ I.click('Delete Last Object')
781
+ I.seeInPopup('Are you sure you want to remove this item?')
782
+ I.acceptPopup()
783
+ I.dontSee('Object 4')
576
784
 
577
785
  // delete all
578
- I.see('Object 1');
579
- I.see('Object 2');
580
- I.see('Object 3');
581
- I.click('Delete All');
582
- I.seeInPopup('Are you sure you want to remove this node?');
583
- I.cancelPopup();
584
- I.see('Object 1');
585
- I.see('Object 2');
586
- I.see('Object 3');
587
- I.click('Delete All');
588
- I.seeInPopup('Are you sure you want to remove this node?');
589
- I.acceptPopup();
590
- I.dontSee('Object 1');
591
- I.dontSee('Object 2');
592
- I.dontSee('Object 3');
593
- });
594
-
595
- Scenario('should work well with nested array editors', async (I) => {
596
- I.amOnPage('array-nested-arrays.html');
597
- I.click('Add Array');
598
- I.click('Add Array');
599
- I.click('Add Array');
600
- I.click('Add Array');
601
- I.click('Add Array');
602
- I.seeElement('[data-schemapath="root.0"]');
603
- I.seeElement('[data-schemapath="root.1"]');
604
- I.seeElement('[data-schemapath="root.2"]');
605
- I.seeElement('[data-schemapath="root.3"]');
606
- I.seeElement('[data-schemapath="root.4"]');
607
- I.click('.get-value');
608
- value = await I.grabValueFrom('.debug');
609
- assert.equal(value, '[[],[],[],[],[]]');
786
+ I.see('Object 1')
787
+ I.see('Object 2')
788
+ I.see('Object 3')
789
+ I.amCancellingPopups()
790
+ I.click('Delete All')
791
+ I.seeInPopup('Are you sure you want to remove this item?')
792
+ I.cancelPopup()
793
+ I.see('Object 1')
794
+ I.see('Object 2')
795
+ I.see('Object 3')
796
+ I.amAcceptingPopups()
797
+ I.click('Delete All')
798
+ I.seeInPopup('Are you sure you want to remove this item?')
799
+ I.acceptPopup()
800
+ I.dontSee('Object 1')
801
+ I.dontSee('Object 2')
802
+ I.dontSee('Object 3')
803
+ })
804
+
805
+ Scenario('should work well with nested array editors', async ({ I }) => {
806
+ I.amOnPage('array-nested-arrays.html')
807
+ I.click('Add Array')
808
+ I.click('Add Array')
809
+ I.click('Add Array')
810
+ I.click('Add Array')
811
+ I.click('Add Array')
812
+ I.seeElement('[data-schemapath="root.0"]')
813
+ I.seeElement('[data-schemapath="root.1"]')
814
+ I.seeElement('[data-schemapath="root.2"]')
815
+ I.seeElement('[data-schemapath="root.3"]')
816
+ I.seeElement('[data-schemapath="root.4"]')
817
+ I.click('.get-value')
818
+ I.waitForValue('.debug', '[[],[],[],[],[]]')
610
819
 
611
820
  // adds one string editor in each first level array
612
- for (i = 0; i < 5; i++) {
613
- I.click('Add String', '[data-schemapath="root.' + i + '"]');
614
- I.fillField('[data-schemapath="root.' + i + '"] [name="root[' + i + '][0]"]', String(i + 1));
821
+ for (let i = 0; i < 5; i++) {
822
+ I.click('Add String', '[data-schemapath="root.' + i + '"]')
823
+ I.fillField('[data-schemapath="root.' + i + '"] [name="root[' + i + '][0]"]', String(i + 1))
615
824
  }
616
825
 
617
- I.click('.get-value');
618
- value = await I.grabValueFrom('.debug');
619
- assert.equal(value, '[["1"],["2"],["3"],["4"],["5"]]');
826
+ I.click('.get-value')
827
+ I.waitForValue('.debug', '[["1"],["2"],["3"],["4"],["5"]]')
620
828
 
621
829
  // shuffle
622
- I.click('.moveup[data-i="4"]');
623
- I.click('.moveup[data-i="2"]');
624
- I.click('.moveup[data-i="1"]');
625
- I.click('.get-value');
626
- value = await I.grabValueFrom('.debug');
627
- assert.equal(value, '[["3"],["1"],["2"],["5"],["4"]]');
830
+ I.click('.moveup[data-i="4"]')
831
+ I.click('.moveup[data-i="2"]')
832
+ I.click('.moveup[data-i="1"]')
833
+ I.click('.get-value')
834
+ I.waitForValue('.debug', '[["3"],["1"],["2"],["5"],["4"]]')
628
835
 
629
836
  // delete single
630
- I.see('Array 5');
631
- I.click('[data-schemapath="root.4"] .delete');
632
- I.seeInPopup('Are you sure you want to remove this node?');
633
- I.cancelPopup();
634
- I.see('Array 5');
635
- I.click('[data-schemapath="root.4"] .delete');
636
- I.seeInPopup('Are you sure you want to remove this node?');
637
- I.acceptPopup();
638
- I.dontSee('Array 5');
837
+ I.see('Array 5')
838
+ I.amCancellingPopups()
839
+ I.click('[data-schemapath="root.4"] .delete')
840
+ I.seeInPopup('Are you sure you want to remove this item?')
841
+ I.cancelPopup()
842
+ I.see('Array 5')
843
+ I.amAcceptingPopups()
844
+ I.click('[data-schemapath="root.4"] .delete')
845
+ I.seeInPopup('Are you sure you want to remove this item?')
846
+ I.acceptPopup()
847
+ I.dontSee('Array 5')
639
848
 
640
849
  // delete last
641
- I.see('Array 4');
642
- I.click('Delete Last Array');
643
- I.seeInPopup('Are you sure you want to remove this node?');
644
- I.cancelPopup();
645
- I.see('Array 4');
646
- I.click('Delete Last Array');
647
- I.seeInPopup('Are you sure you want to remove this node?');
648
- I.acceptPopup();
649
- I.dontSee('Array 4');
850
+ I.see('Array 4')
851
+ I.amCancellingPopups()
852
+ I.click('Delete Last Array')
853
+ I.seeInPopup('Are you sure you want to remove this item?')
854
+ I.cancelPopup()
855
+ I.see('Array 4')
856
+ I.amAcceptingPopups()
857
+ I.click('Delete Last Array')
858
+ I.seeInPopup('Are you sure you want to remove this item?')
859
+ I.acceptPopup()
860
+ I.dontSee('Array 4')
650
861
 
651
862
  // delete all
652
- I.see('Array 1');
653
- I.see('Array 2');
654
- I.see('Array 3');
863
+ I.see('Array 1')
864
+ I.see('Array 2')
865
+ I.see('Array 3')
655
866
  // there are hidden "Delete All" buttons right now and "I.click(Delete All)"
656
867
  // will attempt to click the first match. It fails because is hidden.
657
868
  // this is why i use this script. is more flexible.
658
- I.executeScript(function() {
659
- var e = document.querySelectorAll('.json-editor-btn-delete');
660
- e[e.length - 1].click();
661
- });
662
- I.seeInPopup('Are you sure you want to remove this node?');
663
- I.cancelPopup();
664
- I.see('Array 1');
665
- I.see('Array 2');
666
- I.see('Array 3');
667
- I.executeScript(function() {
668
- var e = document.querySelectorAll('.json-editor-btn-delete');
669
- e[e.length - 1].click();
670
- });
671
- I.seeInPopup('Are you sure you want to remove this node?');
672
- I.acceptPopup();
673
- I.dontSee('Array 1');
674
- I.dontSee('Array 2');
675
- I.dontSee('Array 3');
869
+ I.amCancellingPopups()
870
+ I.executeScript(function () {
871
+ const e = document.querySelectorAll('.json-editor-btn-delete')
872
+ e[e.length - 1].click()
873
+ })
874
+ I.seeInPopup('Are you sure you want to remove this item?')
875
+ I.cancelPopup()
876
+ I.see('Array 1')
877
+ I.see('Array 2')
878
+ I.see('Array 3')
879
+ I.amAcceptingPopups()
880
+ I.executeScript(function () {
881
+ const e = document.querySelectorAll('.json-editor-btn-delete')
882
+ e[e.length - 1].click()
883
+ })
884
+ I.seeInPopup('Are you sure you want to remove this item?')
885
+ I.acceptPopup()
886
+ I.dontSee('Array 1')
887
+ I.dontSee('Array 2')
888
+ I.dontSee('Array 3')
676
889
 
677
890
  // manipulate nested items
678
- I.amOnPage('array-nested-arrays.html');
679
- I.click('Add Array');
680
- I.click('Add Array');
681
- I.click('Add Array');
682
- I.click('Add Array');
683
- I.click('Add Array');
684
- I.seeElement('[data-schemapath="root.0"]');
685
- I.seeElement('[data-schemapath="root.1"]');
686
- I.seeElement('[data-schemapath="root.2"]');
687
- I.click('.get-value');
688
- value = await I.grabValueFrom('.debug');
689
- assert.equal(value, '[[],[],[],[],[]]');
891
+ I.amOnPage('array-nested-arrays.html')
892
+ I.click('Add Array')
893
+ I.click('Add Array')
894
+ I.click('Add Array')
895
+ I.click('Add Array')
896
+ I.click('Add Array')
897
+ I.seeElement('[data-schemapath="root.0"]')
898
+ I.seeElement('[data-schemapath="root.1"]')
899
+ I.seeElement('[data-schemapath="root.2"]')
900
+ I.click('.get-value')
901
+ I.waitForValue('.debug', '[[],[],[],[],[]]')
690
902
 
691
903
  // adds one string editor in each first level array
692
- for (i = 0; i < 5; i++) {
693
- I.click('Add String', '[data-schemapath="root.' + i + '"]');
694
- I.click('Add String', '[data-schemapath="root.' + i + '"]');
695
- I.click('Add String', '[data-schemapath="root.' + i + '"]');
696
- I.click('Add String', '[data-schemapath="root.' + i + '"]');
697
- I.click('Add String', '[data-schemapath="root.' + i + '"]');
698
- I.fillField('[data-schemapath="root.' + i + '"] [name="root[' + i + '][0]"]', "1");
699
- I.fillField('[data-schemapath="root.' + i + '"] [name="root[' + i + '][1]"]', "2");
700
- I.fillField('[data-schemapath="root.' + i + '"] [name="root[' + i + '][2]"]', "3");
701
- I.fillField('[data-schemapath="root.' + i + '"] [name="root[' + i + '][3]"]', "4");
702
- I.fillField('[data-schemapath="root.' + i + '"] [name="root[' + i + '][4]"]', "5");
904
+ for (let i = 0; i < 5; i++) {
905
+ I.click('Add String', '[data-schemapath="root.' + i + '"]')
906
+ I.click('Add String', '[data-schemapath="root.' + i + '"]')
907
+ I.click('Add String', '[data-schemapath="root.' + i + '"]')
908
+ I.click('Add String', '[data-schemapath="root.' + i + '"]')
909
+ I.click('Add String', '[data-schemapath="root.' + i + '"]')
910
+ I.fillField('[data-schemapath="root.' + i + '"] [name="root[' + i + '][0]"]', '1')
911
+ I.fillField('[data-schemapath="root.' + i + '"] [name="root[' + i + '][1]"]', '2')
912
+ I.fillField('[data-schemapath="root.' + i + '"] [name="root[' + i + '][2]"]', '3')
913
+ I.fillField('[data-schemapath="root.' + i + '"] [name="root[' + i + '][3]"]', '4')
914
+ I.fillField('[data-schemapath="root.' + i + '"] [name="root[' + i + '][4]"]', '5')
703
915
  }
704
916
 
705
- I.click('.get-value');
706
- value = await I.grabValueFrom('.debug');
707
- assert.equal(value, '[["1","2","3","4","5"],["1","2","3","4","5"],["1","2","3","4","5"],["1","2","3","4","5"],["1","2","3","4","5"]]');
917
+ I.click('.get-value')
918
+ I.waitForValue('.debug', '[["1","2","3","4","5"],["1","2","3","4","5"],["1","2","3","4","5"],["1","2","3","4","5"],["1","2","3","4","5"]]')
708
919
 
709
920
  // shuffle every strings array
710
- for (i = 0; i < 5; i++) {
711
- I.click('[data-schemapath="root.' + i + '.4"] .moveup');
712
- I.click('[data-schemapath="root.' + i + '.2"] .moveup');
713
- I.click('[data-schemapath="root.' + i + '.1"] .moveup');
921
+ for (let i = 0; i < 5; i++) {
922
+ I.click('[data-schemapath="root.' + i + '.4"] .moveup')
923
+ I.click('[data-schemapath="root.' + i + '.2"] .moveup')
924
+ I.click('[data-schemapath="root.' + i + '.1"] .moveup')
714
925
  }
715
926
 
716
- I.click('.get-value');
717
- value = await I.grabValueFrom('.debug');
718
- assert.equal(value, '[["3","1","2","5","4"],["3","1","2","5","4"],["3","1","2","5","4"],["3","1","2","5","4"],["3","1","2","5","4"]]');
927
+ I.click('.get-value')
928
+ I.waitForValue('.debug', '[["3","1","2","5","4"],["3","1","2","5","4"],["3","1","2","5","4"],["3","1","2","5","4"],["3","1","2","5","4"]]')
719
929
 
720
930
  // delete single (fifth) element from every string array
721
- for (i = 0; i < 5; i++) {
722
- I.see('String 5', '[data-schemapath="root.' + i + '"]');
723
- I.click('[data-schemapath="root.' + i + '.4"] .delete');
724
- I.seeInPopup('Are you sure you want to remove this node?');
725
- I.cancelPopup();
726
- I.see('String 5', '[data-schemapath="root.' + i + '"]');
727
- I.click('[data-schemapath="root.' + i + '.4"] .delete');
728
- I.seeInPopup('Are you sure you want to remove this node?');
729
- I.acceptPopup();
730
- I.dontSee('String 5', '[data-schemapath="root.' + i + '"]');
931
+ for (let i = 0; i < 5; i++) {
932
+ I.see('String 5', '[data-schemapath="root.' + i + '"]')
933
+ I.amCancellingPopups()
934
+ I.click('[data-schemapath="root.' + i + '.4"] .delete')
935
+ I.seeInPopup('Are you sure you want to remove this item?')
936
+ I.cancelPopup()
937
+ I.see('String 5', '[data-schemapath="root.' + i + '"]')
938
+ I.amAcceptingPopups()
939
+ I.click('[data-schemapath="root.' + i + '.4"] .delete')
940
+ I.seeInPopup('Are you sure you want to remove this item?')
941
+ I.acceptPopup()
942
+ I.dontSee('String 5', '[data-schemapath="root.' + i + '"]')
731
943
  }
732
944
 
733
- I.click('.get-value');
734
- value = await I.grabValueFrom('.debug');
735
- assert.equal(value, '[["3","1","2","5"],["3","1","2","5"],["3","1","2","5"],["3","1","2","5"],["3","1","2","5"]]');
945
+ I.click('.get-value')
946
+ I.waitForValue('.debug', '[["3","1","2","5"],["3","1","2","5"],["3","1","2","5"],["3","1","2","5"],["3","1","2","5"]]')
736
947
 
737
948
  // delete last (fourth) element from every string array
738
- for (i = 0; i < 5; i++) {
739
- I.see('String 4', '[data-schemapath="root.' + i + '"]');
740
- I.click('Delete Last String', '[data-schemapath="root.' + i + '"]');
741
- I.seeInPopup('Are you sure you want to remove this node?');
742
- I.cancelPopup();
743
- I.see('String 4', '[data-schemapath="root.' + i + '"]');
744
- I.click('Delete Last String', '[data-schemapath="root.' + i + '"]');
745
- I.seeInPopup('Are you sure you want to remove this node?');
746
- I.acceptPopup();
747
- I.dontSee('String 4', '[data-schemapath="root.' + i + '"]');
949
+ for (let i = 0; i < 5; i++) {
950
+ I.see('String 4', '[data-schemapath="root.' + i + '"]')
951
+ I.amCancellingPopups()
952
+ I.click('Delete Last String', '[data-schemapath="root.' + i + '"]')
953
+ I.seeInPopup('Are you sure you want to remove this item?')
954
+ I.cancelPopup()
955
+ I.see('String 4', '[data-schemapath="root.' + i + '"]')
956
+ I.amAcceptingPopups()
957
+ I.click('Delete Last String', '[data-schemapath="root.' + i + '"]')
958
+ I.seeInPopup('Are you sure you want to remove this item?')
959
+ I.acceptPopup()
960
+ I.dontSee('String 4', '[data-schemapath="root.' + i + '"]')
748
961
  }
749
962
 
750
- I.click('.get-value');
751
- value = await I.grabValueFrom('.debug');
752
- assert.equal(value, '[["3","1","2"],["3","1","2"],["3","1","2"],["3","1","2"],["3","1","2"]]');
963
+ I.click('.get-value')
964
+ I.waitForValue('.debug', '[["3","1","2"],["3","1","2"],["3","1","2"],["3","1","2"],["3","1","2"]]')
753
965
 
754
966
  // delete last (fourth) element from every string array
755
- for (i = 0; i < 5; i++) {
756
- I.see('String 1', '[data-schemapath="root.' + i + '"]');
757
- I.see('String 2', '[data-schemapath="root.' + i + '"]');
758
- I.see('String 3', '[data-schemapath="root.' + i + '"]');
759
- I.click('Delete All', '[data-schemapath="root.' + i + '"]');
760
- I.seeInPopup('Are you sure you want to remove this node?');
761
- I.cancelPopup();
762
- I.see('String 1', '[data-schemapath="root.' + i + '"]');
763
- I.see('String 2', '[data-schemapath="root.' + i + '"]');
764
- I.see('String 3', '[data-schemapath="root.' + i + '"]');
765
- I.click('Delete All', '[data-schemapath="root.' + i + '"]');
766
- I.seeInPopup('Are you sure you want to remove this node?');
767
- I.acceptPopup();
768
- I.dontSee('String 1', '[data-schemapath="root.' + i + '"]');
769
- I.dontSee('String 2', '[data-schemapath="root.' + i + '"]');
770
- I.dontSee('String 3', '[data-schemapath="root.' + i + '"]');
967
+ for (let i = 0; i < 5; i++) {
968
+ I.see('String 1', '[data-schemapath="root.' + i + '"]')
969
+ I.see('String 2', '[data-schemapath="root.' + i + '"]')
970
+ I.see('String 3', '[data-schemapath="root.' + i + '"]')
971
+ I.amCancellingPopups()
972
+ I.click('Delete All', '[data-schemapath="root.' + i + '"]')
973
+ I.seeInPopup('Are you sure you want to remove this item?')
974
+ I.cancelPopup()
975
+ I.see('String 1', '[data-schemapath="root.' + i + '"]')
976
+ I.see('String 2', '[data-schemapath="root.' + i + '"]')
977
+ I.see('String 3', '[data-schemapath="root.' + i + '"]')
978
+ I.amAcceptingPopups()
979
+ I.click('Delete All', '[data-schemapath="root.' + i + '"]')
980
+ I.seeInPopup('Are you sure you want to remove this item?')
981
+ I.acceptPopup()
982
+ I.dontSee('String 1', '[data-schemapath="root.' + i + '"]')
983
+ I.dontSee('String 2', '[data-schemapath="root.' + i + '"]')
984
+ I.dontSee('String 3', '[data-schemapath="root.' + i + '"]')
771
985
  }
772
986
 
773
- I.click('.get-value');
774
- value = await I.grabValueFrom('.debug');
775
- assert.equal(value, '[[],[],[],[],[]]');
776
-
777
- });
778
-
987
+ I.click('.get-value')
988
+ I.waitForValue('.debug', '[[],[],[],[],[]]')
989
+ })
990
+
991
+ Scenario('should work well with selectize multiselect editors', async ({ I }) => {
992
+ I.amOnPage('array-selectize.html')
993
+ I.click('Add item')
994
+ await I.seeElement('[data-schemapath="root.0"]')
995
+ I.click('Add item')
996
+ await I.seeElement('[data-schemapath="root.1"]')
997
+ I.click('.get-value')
998
+ I.waitForValue('.debug', '[["1","2"],["1","2"]]')
999
+
1000
+ // every selected item has remove button
1001
+ I.seeElement('[data-schemapath="root.0"] .selectize-input [data-value="1"] a.remove')
1002
+ I.seeElement('[data-schemapath="root.0"] .selectize-input [data-value="2"] a.remove')
1003
+ I.seeElement('[data-schemapath="root.1"] .selectize-input [data-value="1"] a.remove')
1004
+ I.seeElement('[data-schemapath="root.1"] .selectize-input [data-value="2"] a.remove')
1005
+
1006
+ // could not add values
1007
+ I.fillField('[data-schemapath="root.1"] input[type="text"]', '123')
1008
+ I.dontSeeElement('.create.active')
1009
+
1010
+ // selectize dropdown is filled with enum values
1011
+ I.click('[data-schemapath="root.0"] .selectize-input')
1012
+ I.seeElement('[data-schemapath="root.0"] .selectize-dropdown-content [data-value="3"]')
1013
+ I.seeElement('[data-schemapath="root.0"] .selectize-dropdown-content [data-value="4"]')
1014
+ })
1015
+
1016
+ Scenario('should be possible to add items to selectize array @selectize-add', async ({ I }) => {
1017
+ I.amOnPage('array-selectize-create.html')
1018
+ I.click('.selectize-input')
1019
+ I.pressKey('g')
1020
+ I.pressKey('Enter')
1021
+ I.pressKey('r')
1022
+ I.pressKey('Enter')
1023
+ I.pressKey('e')
1024
+ I.pressKey('Enter')
1025
+ I.pressKey('a')
1026
+ I.pressKey('Enter')
1027
+ I.pressKey('t')
1028
+ I.pressKey('Enter')
1029
+ I.waitForValue('#value', '["g","r","e","a","t"]')
1030
+ })
1031
+
1032
+ Scenario('Tables should have a container parent that makes tables responsive @array-table', async ({ I }) => {
1033
+ I.amOnPage('array-table-responsive.html')
1034
+ I.waitForElement('.je-ready', DEFAULT_WAIT_TIME)
1035
+ I.waitForElement('.table-responsive')
1036
+ })