@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
@@ -0,0 +1,59 @@
1
+ import { StringEditor } from './string.js'
2
+ import { extend } from '../utilities.js'
3
+
4
+ export class AutocompleteEditor extends StringEditor {
5
+ postBuild () {
6
+ if (window.Autocomplete) {
7
+ /* create wrapper container */
8
+ this.autocomplete_wrapper = document.createElement('div')
9
+
10
+ /* insert wrapper after this.input in the DOM tree */
11
+ this.input.parentNode.insertBefore(this.autocomplete_wrapper, this.input.nextSibling)
12
+
13
+ /* move this.input into wrapper */
14
+ this.autocomplete_wrapper.appendChild(this.input)
15
+
16
+ /* create dropdown container */
17
+ this.autocomplete_dropdown = document.createElement('ul')
18
+
19
+ /* insert dropdown after this.input in the DOM tree */
20
+ this.input.parentNode.insertBefore(this.autocomplete_dropdown, this.input.nextSibling)
21
+ }
22
+ super.postBuild()
23
+ }
24
+
25
+ afterInputReady () {
26
+ let options
27
+
28
+ if (window.Autocomplete && !this.autocomplete_instance) {
29
+ /* Get options, either global options from "this.defaults.options.autocomplete" or */
30
+ /* single property options from schema "options.autocomplete" */
31
+ options = this.expandCallbacks('autocomplete', extend({}, {
32
+ search: (jseditor) => {
33
+ // eslint-disable-next-line no-console
34
+ console.log(`No "search" callback defined for autocomplete in property "${jseditor.key}"`)
35
+ return []
36
+ },
37
+ onSubmit: () => {
38
+ this.input.blur()
39
+ },
40
+ baseClass: 'autocomplete'
41
+ }, this.defaults.options.autocomplete || {}, this.options.autocomplete || {}))
42
+
43
+ this.autocomplete_wrapper.classList.add(options.baseClass)
44
+ this.autocomplete_dropdown.classList.add(`${options.baseClass}-result-list`)
45
+ this.autocomplete_instance = new window.Autocomplete(this.autocomplete_wrapper, options)
46
+ }
47
+ super.afterInputReady()
48
+ }
49
+
50
+ destroy () {
51
+ if (this.autocomplete_instance) {
52
+ if (this.input && this.input.parentNode) this.input.parentNode.removeChild(this.input)
53
+ if (this.autocomplete_dropdown && this.autocomplete_dropdown.parentNode) this.autocomplete_dropdown.parentNode.removeChild(this.autocomplete_dropdown)
54
+ if (this.autocomplete_wrapper && this.autocomplete_wrapper.parentNode) this.autocomplete_wrapper.parentNode.removeChild(this.autocomplete_wrapper)
55
+ this.autocomplete_instance = null
56
+ }
57
+ super.destroy()
58
+ }
59
+ }
@@ -1,152 +1,171 @@
1
- JSONEditor.defaults.editors.base64 = JSONEditor.AbstractEditor.extend({
2
- getNumColumns: function() {
3
- return 4;
4
- },
5
- setFileReaderListener: function (fr_multiple) {
6
- var self = this;
7
- fr_multiple.addEventListener("load", function(event) {
8
- if (self.count == self.current_item_index) {
9
- // Overwrite existing file by default, leave other properties unchanged
10
- self.value[self.count][self.key] = event.target.result;
1
+ import { AbstractEditor } from '../editor.js'
2
+
3
+ export class Base64Editor extends AbstractEditor {
4
+ getNumColumns () {
5
+ return 4
6
+ }
7
+
8
+ setFileReaderListener (frMultiple) {
9
+ frMultiple.addEventListener('load', (event) => {
10
+ if (this.count === this.current_item_index) {
11
+ /* Overwrite existing file by default, leave other properties unchanged */
12
+ this.value[this.count][this.key] = event.target.result
11
13
  } else {
12
- var temp_object = {};
13
- // Create empty object
14
- for (var key in self.parent.schema.properties) {
15
- temp_object[key] = "";
14
+ const tempObject = {}
15
+ /* Create empty object */
16
+ for (const key in this.parent.schema.properties) {
17
+ tempObject[key] = ''
16
18
  }
17
- // Set object media file
18
- temp_object[self.key] = event.target.result;
19
- self.value.splice(self.count, 0, temp_object); // insert new file object
19
+ /* Set object media file */
20
+ tempObject[this.key] = event.target.result
21
+ this.value.splice(this.count, 0, tempObject) /* insert new file object */
20
22
  }
21
23
 
22
- // Increment using the listener and not the 'for' loop as the listener will be processed asynchronously
23
- self.count += 1;
24
- // When all files have been processed, update the value of the editor
25
- if (self.count == (self.total+self.current_item_index)) {
26
- self.arrayEditor.setValue(self.value);
24
+ /* Increment using the listener and not the 'for' loop as the listener will be processed asynchronously */
25
+ this.count += 1
26
+ /* When all files have been processed, update the value of the editor */
27
+ if (this.count === (this.total + this.current_item_index)) {
28
+ this.arrayEditor.setValue(this.value)
27
29
  }
28
- });
29
- },
30
- build: function() {
31
- var self = this;
32
- this.title = this.header = this.label = this.theme.getFormInputLabel(this.getTitle());
33
- if(this.options.infoText) this.infoButton = this.theme.getInfoButton(this.options.infoText);
34
-
35
- // Input that holds the base64 string
36
- this.input = this.theme.getFormInputField('hidden');
37
- this.container.appendChild(this.input);
38
-
39
- // Don't show uploader if this is readonly
40
- if(!this.schema.readOnly && !this.schema.readonly) {
41
- if(!window.FileReader) throw "FileReader required for base64 editor";
42
-
43
- // File uploader
44
- this.uploader = this.theme.getFormInputField('file');
45
-
46
- // Set attribute of file input field to 'multiple' if:
47
- // 'multiple' key has been set to 'true' in the schema
48
- // and the parent object is of type 'object'
49
- // and the parent of the parent type has been set to 'array'
50
- if (self.schema.options && self.schema.options.multiple && self.schema.options.multiple == true && self.parent && self.parent.schema.type == 'object' && self.parent.parent && self.parent.parent.schema.type == 'array') {
51
- this.uploader.setAttribute('multiple', '');
30
+ })
31
+ }
32
+
33
+ build () {
34
+ if (!this.options.compact) this.title = this.header = this.label = this.theme.getFormInputLabel(this.getTitle(), this.isRequired())
35
+ if (this.options.infoText) this.infoButton = this.theme.getInfoButton(this.translateProperty(this.options.infoText))
36
+
37
+ /* Input that holds the base64 string */
38
+ this.input = this.theme.getFormInputField('hidden')
39
+ this.container.appendChild(this.input)
40
+
41
+ /* Don't show uploader if this is readonly */
42
+ if (!this.schema.readOnly && !this.schema.readonly) {
43
+ if (!window.FileReader) throw new Error('FileReader required for base64 editor')
44
+
45
+ /* File uploader */
46
+ this.uploader = this.theme.getFormInputField('file')
47
+ this.uploader.style.display = 'none'
48
+
49
+ /* Set attribute of file input field to 'multiple' if: */
50
+ /* 'multiple' key has been set to 'true' in the schema */
51
+ /* and the parent object is of type 'object' */
52
+ /* and the parent of the parent type has been set to 'array' */
53
+ if (this.schema.options && this.schema.options.multiple && this.schema.options.multiple === true && this.parent && this.parent.schema.type === 'object' && this.parent.parent && this.parent.parent.schema.type === 'array') {
54
+ this.uploader.setAttribute('multiple', '')
52
55
  }
53
56
 
54
- this.uploader.addEventListener('change',function(e) {
55
- e.preventDefault();
56
- e.stopPropagation();
57
-
58
- if(this.files && this.files.length) {
59
-
60
- // Check the amount of files uploaded.
61
- // If 1, use the regular upload, otherwise use the multiple upload method
62
- if (this.files.length>1 && self.schema.options && self.schema.options.multiple && self.schema.options.multiple == true && self.parent && self.parent.schema.type == 'object' && self.parent.parent && self.parent.parent.schema.type == 'array') {
63
-
64
- // Load editor of parent.parent to get the array
65
- self.arrayEditor = self.jsoneditor.getEditor(self.parent.parent.path);
66
- // Check the current value of this editor
67
- self.value = self.arrayEditor.getValue();
68
- // Set variables for amount of files, index of current array item and
69
- // count value containing current status of processed files
70
- self.total = this.files.length;
71
- self.current_item_index = parseInt(self.parent.key);
72
- self.count = self.current_item_index;
73
-
74
- for (var i = 0; i < self.total; i++) {
75
- var fr_multiple = new FileReader();
76
- self.setFileReaderListener(fr_multiple);
77
- fr_multiple.readAsDataURL(this.files[i]);
57
+ this.uploader.addEventListener('change', e => {
58
+ e.preventDefault()
59
+ e.stopPropagation()
60
+
61
+ if (e.currentTarget.files && e.currentTarget.files.length) {
62
+ /* Check the amount of files uploaded. */
63
+ /* If 1, use the regular upload, otherwise use the multiple upload method */
64
+ if (e.currentTarget.files.length > 1 && this.schema.options && this.schema.options.multiple && this.schema.options.multiple === true && this.parent && this.parent.schema.type === 'object' && this.parent.parent && this.parent.parent.schema.type === 'array') {
65
+ /* Load editor of parent.parent to get the array */
66
+ this.arrayEditor = this.jsoneditor.getEditor(this.parent.parent.path)
67
+ /* Check the current value of this editor */
68
+ this.value = this.arrayEditor.getValue()
69
+ /* Set variables for amount of files, index of current array item and */
70
+ /* count value containing current status of processed files */
71
+ this.total = e.currentTarget.files.length
72
+ this.current_item_index = parseInt(this.parent.key)
73
+ this.count = this.current_item_index
74
+
75
+ for (let i = 0; i < this.total; i++) {
76
+ const frMultiple = new FileReader()
77
+ this.setFileReaderListener(frMultiple)
78
+ frMultiple.readAsDataURL(e.currentTarget.files[i])
78
79
  }
79
80
  } else {
80
- var fr = new FileReader();
81
- fr.onload = function(evt) {
82
- self.value = evt.target.result;
83
- self.refreshPreview();
84
- self.onChange(true);
85
- fr = null;
86
- };
87
- fr.readAsDataURL(this.files[0]);
81
+ let fr = new FileReader()
82
+ fr.onload = (evt) => {
83
+ this.value = evt.target.result
84
+ this.refreshPreview()
85
+ this.onChange(true)
86
+ fr = null
87
+ }
88
+ fr.readAsDataURL(e.currentTarget.files[0])
88
89
  }
89
90
  }
90
- });
91
+ })
91
92
  }
92
93
 
93
- this.preview = this.theme.getFormInputDescription(this.schema.description);
94
- this.container.appendChild(this.preview);
94
+ this.preview = this.theme.getFormInputDescription(this.translateProperty(this.schema.description))
95
+ this.container.appendChild(this.preview)
95
96
 
96
- this.control = this.theme.getFormControl(this.label, this.uploader||this.input, this.preview, this.infoButton);
97
- this.container.appendChild(this.control);
98
- },
99
- refreshPreview: function() {
100
- if(this.last_preview === this.value) return;
101
- this.last_preview = this.value;
97
+ this.control = this.theme.getFormControl(this.label, this.uploader || this.input, this.preview, this.infoButton)
98
+ this.container.appendChild(this.control)
102
99
 
103
- this.preview.innerHTML = '';
100
+ const uploadButton = this.getButton('button_upload', 'upload', 'button_upload')
104
101
 
105
- if(!this.value) return;
102
+ uploadButton.addEventListener('click', () => {
103
+ this.uploader.click()
104
+ })
106
105
 
107
- var mime = this.value.match(/^data:([^;,]+)[;,]/);
108
- if(mime) mime = mime[1];
106
+ this.control.appendChild(uploadButton)
109
107
 
110
- if(!mime) {
111
- this.preview.innerHTML = '<em>Invalid data URI</em>';
112
- }
113
- else {
114
- this.preview.innerHTML = '<strong>Type:</strong> '+mime+', <strong>Size:</strong> '+Math.floor((this.value.length-this.value.split(',')[0].length-1)/1.33333)+' bytes';
115
- if(mime.substr(0,5)==="image") {
116
- this.preview.innerHTML += '<br>';
117
- var img = document.createElement('img');
118
- img.style.maxWidth = '100%';
119
- img.style.maxHeight = '100px';
120
- img.src = this.value;
121
- this.preview.appendChild(img);
108
+ /* Set custom attributes on input element. Parameter is array of protected keys. Empty array if none. */
109
+ this.setInputAttributes(['multiple'], uploadButton)
110
+ }
111
+
112
+ refreshPreview () {
113
+ if (this.last_preview === this.value) return
114
+ this.last_preview = this.value
115
+
116
+ this.preview.innerHTML = ''
117
+
118
+ if (!this.value) return
119
+
120
+ let mime = this.value.match(/^data:([^;,]+)[;,]/)
121
+ if (mime) mime = mime[1]
122
+
123
+ if (!mime) {
124
+ this.preview.innerHTML = '<em>Invalid data URI</em>'
125
+ } else {
126
+ this.preview.innerHTML = `<strong>Type:</strong> ${mime}, <strong>Size:</strong> ${Math.floor((this.value.length - this.value.split(',')[0].length - 1) / 1.33333)} bytes`
127
+ if (mime.substr(0, 5) === 'image') {
128
+ this.preview.innerHTML += '<br>'
129
+ const img = document.createElement('img')
130
+ img.style.maxWidth = '100%'
131
+ img.style.maxHeight = '100px'
132
+ img.src = this.value
133
+ this.preview.appendChild(img)
122
134
  }
123
135
  }
124
- },
125
- enable: function() {
126
- if(!this.always_disabled) {
127
- if(this.uploader) this.uploader.disabled = false;
128
- this._super();
136
+ }
137
+
138
+ enable () {
139
+ if (!this.always_disabled) {
140
+ if (this.uploader) this.uploader.disabled = false
141
+ super.enable()
129
142
  }
130
- },
131
- disable: function(always_disabled) {
132
- if(always_disabled) this.always_disabled = true;
133
- if(this.uploader) this.uploader.disabled = true;
134
- this._super();
135
- },
136
- setValue: function(val) {
137
- if(this.value !== val) {
138
- this.value = val;
139
- this.input.value = this.value;
140
- this.refreshPreview();
141
- this.onChange();
143
+ }
144
+
145
+ disable (alwaysDisabled) {
146
+ if (alwaysDisabled) this.always_disabled = true
147
+ if (this.uploader) this.uploader.disabled = true
148
+ super.disable()
149
+ }
150
+
151
+ setValue (val) {
152
+ val = this.applyConstFilter(val)
153
+
154
+ if (this.value !== val) {
155
+ if (this.schema.readOnly && this.schema.enum && !this.schema.enum.includes(val)) this.value = this.schema.enum[0]
156
+ else this.value = val
157
+ this.input.value = this.value
158
+ this.refreshPreview()
159
+ this.onChange()
142
160
  }
143
- },
144
- destroy: function() {
145
- if(this.preview && this.preview.parentNode) this.preview.parentNode.removeChild(this.preview);
146
- if(this.title && this.title.parentNode) this.title.parentNode.removeChild(this.title);
147
- if(this.input && this.input.parentNode) this.input.parentNode.removeChild(this.input);
148
- if(this.uploader && this.uploader.parentNode) this.uploader.parentNode.removeChild(this.uploader);
149
-
150
- this._super();
151
161
  }
152
- });
162
+
163
+ destroy () {
164
+ if (this.preview && this.preview.parentNode) this.preview.parentNode.removeChild(this.preview)
165
+ if (this.title && this.title.parentNode) this.title.parentNode.removeChild(this.title)
166
+ if (this.input && this.input.parentNode) this.input.parentNode.removeChild(this.input)
167
+ if (this.uploader && this.uploader.parentNode) this.uploader.parentNode.removeChild(this.uploader)
168
+
169
+ super.destroy()
170
+ }
171
+ }
@@ -0,0 +1,104 @@
1
+ /* Non-Active editor for displaying buttons in form */
2
+ import { AbstractEditor } from '../editor.js'
3
+ import { extend } from '../utilities.js'
4
+
5
+ export class ButtonEditor extends AbstractEditor {
6
+ constructor (options, defaults) {
7
+ super(options, defaults)
8
+ this.active = false
9
+ this.isUiOnly = true
10
+
11
+ /* Set field to required in schema otherwise it will not be displayed */
12
+ if (this.parent && this.parent.schema) {
13
+ if (Array.isArray(this.parent.schema.required)) {
14
+ if (!this.parent.schema.required.includes(this.key)) {
15
+ this.parent.schema.required.push(this.key)
16
+ }
17
+ } else {
18
+ this.parent.schema.required = [this.key]
19
+ }
20
+ }
21
+ }
22
+
23
+ build () {
24
+ this.options.compact = true
25
+
26
+ /* Get options, either global options from "this.defaults.options.button" or */
27
+ /* single property options from schema "options.button" */
28
+ const options = this.expandCallbacks('button', extend({}, {
29
+ icon: '',
30
+ validated: false,
31
+ align: 'left',
32
+ action: (jseditor, e) => {
33
+ window.alert(`No button action defined for "${jseditor.path}"`)
34
+ }
35
+ }, this.defaults.options.button || {}, this.options.button || {}))
36
+
37
+ const title = this.translateProperty(options.text || this.schema.title) || this.key
38
+
39
+ this.input = this.getButton(title, options.icon, title)
40
+
41
+ if (typeof options.action !== 'function') {
42
+ window.alert(`No button action defined for "${this.path}"`)
43
+ } else {
44
+ this.input.addEventListener('click', options.action, false)
45
+ }
46
+
47
+ if (this.schema.readOnly || this.schema.readonly || this.schema.template) {
48
+ this.disable(true)
49
+ this.input.setAttribute('readonly', 'true')
50
+ }
51
+
52
+ /* Set custom attributes on input element. Parameter is array of protected keys. Empty array if none. */
53
+ this.setInputAttributes(['readonly'])
54
+
55
+ this.control = this.theme.getFormButtonHolder(options.align)
56
+ this.control.appendChild(this.input)
57
+
58
+ this.container.appendChild(this.control)
59
+
60
+ this.changeHandler = () => {
61
+ if (this.jsoneditor.validate(this.jsoneditor.getValue()).length > 0) this.disable()
62
+ else this.enable()
63
+ }
64
+
65
+ /* Enable/disable the button depending on form validation */
66
+ if (options.validated) this.jsoneditor.on('change', this.changeHandler)
67
+ }
68
+
69
+ enable () {
70
+ if (!this.always_disabled) {
71
+ this.input.disabled = false
72
+ super.enable()
73
+ }
74
+ }
75
+
76
+ disable (alwaysDisabled) {
77
+ if (alwaysDisabled) this.always_disabled = true
78
+ this.input.disabled = true
79
+ super.disable()
80
+ }
81
+
82
+ getNumColumns () {
83
+ return 2
84
+ }
85
+
86
+ activate () {
87
+ this.active = false
88
+ this.enable()
89
+ }
90
+
91
+ deactivate () {
92
+ /* only non required properties can be deactivated. */
93
+ if (!this.isRequired()) {
94
+ this.active = false
95
+ this.disable()
96
+ }
97
+ }
98
+
99
+ destroy () {
100
+ this.jsoneditor.off('change', this.changeHandler)
101
+ this.changeHandler = null
102
+ super.destroy()
103
+ }
104
+ }