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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (435) hide show
  1. package/.claude/settings.local.json +8 -0
  2. package/.env +2 -0
  3. package/.env-dist +2 -0
  4. package/.eslintrc +10 -0
  5. package/.github/PULL_REQUEST_TEMPLATE.md +9 -0
  6. package/.github/workflows/build.yml +70 -0
  7. package/.travis.yml +62 -16
  8. package/CHANGELOG.md +483 -113
  9. package/CONTRIBUTING.md +43 -4
  10. package/Makefile +26 -0
  11. package/README.md +632 -121
  12. package/README_ADDON.md +577 -0
  13. package/UPGRADING.md +46 -0
  14. package/build/CssToJson.js +55 -0
  15. package/codecept.conf.js +35 -0
  16. package/config/.eslintrc +7 -0
  17. package/config/codeceptjs_helpers.js +146 -0
  18. package/config/helpers.js +10 -0
  19. package/config/karma.conf.js +89 -0
  20. package/config/readme.md +31 -0
  21. package/config/webpack.common.js +71 -0
  22. package/config/webpack.dev.js +15 -0
  23. package/config/webpack.nonmin.js +19 -0
  24. package/config/webpack.prod.js +24 -0
  25. package/dist/jsoneditor.js +2 -11550
  26. package/dist/jsoneditor.js.LICENSE.txt +15 -0
  27. package/dist/nonmin/jsoneditor.js +31392 -0
  28. package/dist/nonmin/jsoneditor.js.map +1 -0
  29. package/docs/basic.html +2 -2
  30. package/docs/basic_person.json +2 -1
  31. package/docs/choices.html +86 -0
  32. package/docs/cleave.html +11 -19
  33. package/docs/colorpicker.html +194 -0
  34. package/docs/css_integration.html +56 -54
  35. package/docs/custom-editor.html +92 -0
  36. package/docs/datetime.html +48 -21
  37. package/docs/describedby.html +42 -35
  38. package/docs/enumsource.html +67 -0
  39. package/docs/form-submission.html +162 -0
  40. package/docs/imask.html +192 -0
  41. package/docs/index.html +600 -582
  42. package/docs/materialize_css.html +1 -1
  43. package/docs/meta-schema.html +793 -0
  44. package/docs/meta_schema.json +446 -400
  45. package/docs/polyfills/assign.js +29 -0
  46. package/docs/radio.html +9 -17
  47. package/docs/recursive.html +15 -17
  48. package/docs/scripts/ajv-validator.js +8695 -0
  49. package/docs/select2.html +15 -9
  50. package/docs/selectize.html +11 -9
  51. package/docs/signature.html +12 -11
  52. package/docs/starrating.html +5 -17
  53. package/docs/upload.html +33 -23
  54. package/docs/uuid.html +70 -0
  55. package/docs/wysiwyg.html +14 -7
  56. package/jasmine.json +11 -0
  57. package/package.json +74 -25
  58. package/release-notes.md +90 -0
  59. package/src/core.js +411 -611
  60. package/src/defaults.js +381 -327
  61. package/src/editor.js +733 -544
  62. package/src/editors/ace.js +90 -0
  63. package/src/editors/array/choices.js +104 -0
  64. package/src/editors/array/select2.js +112 -0
  65. package/src/editors/array/selectize.js +107 -130
  66. package/src/editors/array.css +9 -0
  67. package/src/editors/array.css.js +3 -0
  68. package/src/editors/array.js +812 -695
  69. package/src/editors/autocomplete.js +59 -0
  70. package/src/editors/base64.js +148 -129
  71. package/src/editors/button.js +104 -0
  72. package/src/editors/checkbox.js +111 -76
  73. package/src/editors/choices.css +3 -0
  74. package/src/editors/choices.css.js +3 -0
  75. package/src/editors/choices.js +71 -0
  76. package/src/editors/colorpicker.js +105 -0
  77. package/src/editors/datetime.js +93 -79
  78. package/src/editors/describedby.js +141 -125
  79. package/src/editors/enum.js +131 -116
  80. package/src/editors/hidden.js +100 -86
  81. package/src/editors/index.js +81 -0
  82. package/src/editors/info.js +28 -0
  83. package/src/editors/integer.js +21 -8
  84. package/src/editors/ip.js +36 -0
  85. package/src/editors/jodit.js +66 -0
  86. package/src/editors/multiple.js +380 -241
  87. package/src/editors/multiselect.js +207 -207
  88. package/src/editors/null.js +15 -11
  89. package/src/editors/number.js +39 -30
  90. package/src/editors/object.css +41 -0
  91. package/src/editors/object.css.js +3 -0
  92. package/src/editors/object.js +1190 -1068
  93. package/src/editors/radio.js +117 -101
  94. package/src/editors/sceditor.js +74 -0
  95. package/src/editors/select.js +318 -342
  96. package/src/editors/select2.js +112 -0
  97. package/src/editors/selectize.js +89 -338
  98. package/src/editors/signature.js +100 -104
  99. package/src/editors/simplemde.js +103 -0
  100. package/src/{styles → editors}/starrating.css +11 -2
  101. package/src/editors/starrating.css.js +3 -0
  102. package/src/editors/starrating.js +126 -95
  103. package/src/editors/stepper.js +27 -0
  104. package/src/editors/string.js +352 -426
  105. package/src/editors/table.js +486 -410
  106. package/src/editors/upload.js +297 -131
  107. package/src/editors/uuid.js +49 -0
  108. package/src/iconlib.js +22 -27
  109. package/src/iconlibs/bootstrap.js +28 -0
  110. package/src/iconlibs/bootstrap2.js +28 -17
  111. package/src/iconlibs/bootstrap3.js +28 -17
  112. package/src/iconlibs/fontawesome3.js +28 -17
  113. package/src/iconlibs/fontawesome4.js +28 -18
  114. package/src/iconlibs/fontawesome5.js +28 -18
  115. package/src/iconlibs/foundation2.js +24 -17
  116. package/src/iconlibs/foundation3.js +28 -17
  117. package/src/iconlibs/index.js +27 -0
  118. package/src/iconlibs/jqueryui.js +28 -17
  119. package/src/iconlibs/materialicons.js +49 -44
  120. package/src/iconlibs/openiconic.js +28 -0
  121. package/src/iconlibs/spectre.js +28 -0
  122. package/src/resolvers.js +135 -0
  123. package/src/schemaloader.js +639 -0
  124. package/src/style.css +157 -0
  125. package/src/style.css.js +3 -0
  126. package/src/templates/default.js +46 -51
  127. package/src/templates/ejs.js +8 -10
  128. package/src/templates/handlebars.js +1 -3
  129. package/src/templates/hogan.js +7 -9
  130. package/src/templates/index.js +21 -0
  131. package/src/templates/lodash.js +6 -8
  132. package/src/templates/markup.js +6 -8
  133. package/src/templates/mustache.js +6 -8
  134. package/src/templates/swig.js +1 -3
  135. package/src/templates/underscore.js +6 -8
  136. package/src/theme.js +717 -433
  137. package/src/themes/barebones.css +35 -0
  138. package/src/themes/barebones.css.js +3 -0
  139. package/src/themes/barebones.js +31 -0
  140. package/src/themes/bootstrap2.js +302 -265
  141. package/src/themes/bootstrap3.css +53 -0
  142. package/src/themes/bootstrap3.css.js +3 -0
  143. package/src/themes/bootstrap3.js +355 -262
  144. package/src/themes/bootstrap4.css +89 -0
  145. package/src/themes/bootstrap4.css.js +3 -0
  146. package/src/themes/bootstrap4.js +743 -237
  147. package/src/themes/bootstrap5.css +97 -0
  148. package/src/themes/bootstrap5.css.js +3 -0
  149. package/src/themes/bootstrap5.js +687 -0
  150. package/src/themes/foundation.js +535 -472
  151. package/src/themes/html.css +60 -0
  152. package/src/themes/html.css.js +3 -0
  153. package/src/themes/html.js +69 -82
  154. package/src/themes/index.js +29 -0
  155. package/src/themes/jqueryui.js +181 -167
  156. package/src/themes/materialize.js +263 -292
  157. package/src/themes/spectre.css +208 -0
  158. package/src/themes/spectre.css.js +3 -0
  159. package/src/themes/spectre.js +443 -0
  160. package/src/themes/tailwind.css +303 -0
  161. package/src/themes/tailwind.css.js +3 -0
  162. package/src/themes/tailwind.js +469 -0
  163. package/src/utilities.js +127 -68
  164. package/src/validator.js +909 -565
  165. package/src/validators/ip-validator.js +51 -0
  166. package/tests/Dockerfile +3 -0
  167. package/tests/README.md +25 -5
  168. package/tests/codeceptjs/codecept.json +9 -2
  169. package/tests/codeceptjs/constrains/contains_test.js +37 -0
  170. package/tests/codeceptjs/constrains/dependentRequired_test.js +33 -0
  171. package/tests/codeceptjs/constrains/dependentSchemas_test.js +16 -0
  172. package/tests/codeceptjs/constrains/if-then-else_test.js +186 -0
  173. package/tests/codeceptjs/core_test.js +534 -63
  174. package/tests/codeceptjs/editors/advanced_test.js +12 -9
  175. package/tests/codeceptjs/editors/array_any_of_test.js +50 -0
  176. package/tests/codeceptjs/editors/array_test.js +923 -657
  177. package/tests/codeceptjs/editors/autocomplete_test.js +15 -0
  178. package/tests/codeceptjs/editors/button_test.js +50 -0
  179. package/tests/codeceptjs/editors/checkbox_test.js +21 -6
  180. package/tests/codeceptjs/editors/colorpicker_test.js +29 -0
  181. package/tests/codeceptjs/editors/datetime_test.js +33 -0
  182. package/tests/codeceptjs/editors/inheritance_test.js +10 -0
  183. package/tests/codeceptjs/editors/integer_test.js +82 -64
  184. package/tests/codeceptjs/editors/jodit_test.js +23 -0
  185. package/tests/codeceptjs/editors/multiple_test.js +27 -0
  186. package/tests/codeceptjs/editors/multiselect_test.js +6 -7
  187. package/tests/codeceptjs/editors/number_test.js +75 -60
  188. package/tests/codeceptjs/editors/object_test.js +322 -80
  189. package/tests/codeceptjs/editors/option-no_default_values_test.js +42 -0
  190. package/tests/codeceptjs/editors/programmatic-changes_test.js +20 -0
  191. package/tests/codeceptjs/editors/purify_test.js +26 -0
  192. package/tests/codeceptjs/editors/radio_test.js +9 -0
  193. package/tests/codeceptjs/editors/range_test.js +10 -0
  194. package/tests/codeceptjs/editors/rating_test.js +10 -10
  195. package/tests/codeceptjs/editors/select_test.js +47 -18
  196. package/tests/codeceptjs/editors/starrating_test.js +15 -0
  197. package/tests/codeceptjs/editors/stepper_test.js +37 -0
  198. package/tests/codeceptjs/editors/string_test.js +107 -91
  199. package/tests/codeceptjs/editors/table-confirm-delete_test.js +60 -54
  200. package/tests/codeceptjs/editors/tabs_test.js +15 -11
  201. package/tests/codeceptjs/editors/uuid_test.js +48 -0
  202. package/tests/codeceptjs/editors/validation_test.js +13 -9
  203. package/tests/codeceptjs/issues/issue-gh-1133_test.js +9 -0
  204. package/tests/codeceptjs/issues/issue-gh-1158-2_test.js +10 -0
  205. package/tests/codeceptjs/issues/issue-gh-1158_test.js +8 -0
  206. package/tests/codeceptjs/issues/issue-gh-1164_test.js +9 -0
  207. package/tests/codeceptjs/issues/issue-gh-1171_test.js +11 -0
  208. package/tests/codeceptjs/issues/issue-gh-1211_test.js +17 -0
  209. package/tests/codeceptjs/issues/issue-gh-1257_test.js +11 -0
  210. package/tests/codeceptjs/issues/issue-gh-1272_test.js +21 -0
  211. package/tests/codeceptjs/issues/issue-gh-1330_test.js +8 -0
  212. package/tests/codeceptjs/issues/issue-gh-1338_test.js +18 -0
  213. package/tests/codeceptjs/issues/issue-gh-1347_test.js +8 -0
  214. package/tests/codeceptjs/issues/issue-gh-1364_test.js +13 -0
  215. package/tests/codeceptjs/issues/issue-gh-1367_test.js +11 -0
  216. package/tests/codeceptjs/issues/issue-gh-1383_test.js +9 -0
  217. package/tests/codeceptjs/issues/issue-gh-1384_test.js +9 -0
  218. package/tests/codeceptjs/issues/issue-gh-1410_test.js +13 -0
  219. package/tests/codeceptjs/issues/issue-gh-1422_test.js +9 -0
  220. package/tests/codeceptjs/issues/issue-gh-1431_test.js +12 -0
  221. package/tests/codeceptjs/issues/issue-gh-1439_test.js +12 -0
  222. package/tests/codeceptjs/issues/issue-gh-1452_test.js +10 -0
  223. package/tests/codeceptjs/issues/issue-gh-1453_test.js +18 -0
  224. package/tests/codeceptjs/issues/issue-gh-1461_test.js +14 -0
  225. package/tests/codeceptjs/issues/issue-gh-1463_test.js +9 -0
  226. package/tests/codeceptjs/issues/issue-gh-1471_test.js +17 -0
  227. package/tests/codeceptjs/issues/issue-gh-1485_test.js +13 -0
  228. package/tests/codeceptjs/issues/issue-gh-1491_test.js +9 -0
  229. package/tests/codeceptjs/issues/issue-gh-1525_test.js +9 -0
  230. package/tests/codeceptjs/issues/issue-gh-1536_test.js +12 -0
  231. package/tests/codeceptjs/issues/issue-gh-1538_test.js +10 -0
  232. package/tests/codeceptjs/issues/issue-gh-1541_test.js +8 -0
  233. package/tests/codeceptjs/issues/issue-gh-1559_test.js +15 -0
  234. package/tests/codeceptjs/issues/issue-gh-1562_test.js +12 -0
  235. package/tests/codeceptjs/issues/issue-gh-1586_test.js +15 -0
  236. package/tests/codeceptjs/issues/issue-gh-1636_test.js +9 -0
  237. package/tests/codeceptjs/issues/issue-gh-795_test.js +13 -0
  238. package/tests/codeceptjs/issues/issue-gh-810_test.js +52 -0
  239. package/tests/codeceptjs/issues/issue-gh-812_test.js +25 -0
  240. package/tests/codeceptjs/meta-schema_test.js +85 -0
  241. package/tests/codeceptjs/schemaloader_test.js +14 -0
  242. package/tests/codeceptjs/steps.d.ts +13 -0
  243. package/tests/codeceptjs/steps_file.js +4 -4
  244. package/tests/codeceptjs/test-config.js +3 -0
  245. package/tests/codeceptjs/themes_test.js +564 -0
  246. package/tests/docker-compose-local.yml +5 -0
  247. package/tests/docker-compose.yml +11 -19
  248. package/tests/fixtures/basic_person.json +2 -1
  249. package/tests/fixtures/definitions.json +22 -0
  250. package/tests/fixtures/nested_object.json +26 -0
  251. package/tests/fixtures/properties.json +20 -0
  252. package/tests/fixtures/some_types.json +32 -0
  253. package/tests/fixtures/validation.json +1347 -0
  254. package/tests/pages/_demo.html +475 -0
  255. package/tests/pages/advanced.html +1 -1
  256. package/tests/pages/anyof-2.html +91 -0
  257. package/tests/pages/anyof.html +82 -0
  258. package/tests/pages/array-anyof.html +145 -0
  259. package/tests/pages/array-checkboxes-infotext.html +55 -0
  260. package/tests/pages/array-checkboxes.html +5 -2
  261. package/tests/pages/array-choices.html +48 -0
  262. package/tests/pages/array-events-table.html +70 -0
  263. package/tests/pages/array-events.html +75 -0
  264. package/tests/pages/array-header-template.html +60 -0
  265. package/tests/pages/array-integers.html +5 -2
  266. package/tests/pages/array-multiselects.html +5 -2
  267. package/tests/pages/array-nested-arrays.html +5 -2
  268. package/tests/pages/array-numbers.html +5 -2
  269. package/tests/pages/array-objects.html +5 -2
  270. package/tests/pages/array-ratings.html +5 -2
  271. package/tests/pages/array-selectize-create.html +63 -0
  272. package/tests/pages/array-selectize.html +10 -8
  273. package/tests/pages/array-selects.html +5 -2
  274. package/tests/pages/array-strings.html +5 -2
  275. package/tests/pages/array-table-responsive.html +66 -0
  276. package/tests/pages/array-unique-items-sort.html +81 -0
  277. package/tests/pages/array.html +5 -2
  278. package/tests/pages/assets/autocomplete.css +1 -0
  279. package/tests/pages/assets/autocomplete.min.js +1 -0
  280. package/tests/pages/assets/pages.css +130 -0
  281. package/tests/pages/autocomplete.html +72 -0
  282. package/tests/pages/button-callbacks.html +79 -0
  283. package/tests/pages/button-icons.html +39 -0
  284. package/tests/pages/button_state_mode_1.html +35 -0
  285. package/tests/pages/button_state_mode_2.html +36 -0
  286. package/tests/pages/checkbox-labels.html +116 -0
  287. package/tests/pages/colorpicker-no-3rd-party.html +45 -0
  288. package/tests/pages/colorpicker-use-vanilla-picker.html +52 -0
  289. package/tests/pages/container-attributes.html +51 -0
  290. package/tests/pages/contains.html +39 -0
  291. package/tests/pages/core.html +14 -7
  292. package/tests/pages/datetime.html +78 -0
  293. package/tests/pages/dependentRequired.html +72 -0
  294. package/tests/pages/dependentSchemas.html +53 -0
  295. package/tests/pages/disable-button-in-object-editors.html +57 -0
  296. package/tests/pages/editor-show-validation-errors.html +54 -0
  297. package/tests/pages/enforce-const.html +168 -0
  298. package/tests/pages/error-messages.html +48 -0
  299. package/tests/pages/form-name.html +111 -0
  300. package/tests/pages/grid-strict.html +10 -13
  301. package/tests/pages/grid.html +4 -7
  302. package/tests/pages/if-else.html +58 -0
  303. package/tests/pages/if-then-else-allOf.html +118 -0
  304. package/tests/pages/if-then-else-disable-fields.html +70 -0
  305. package/tests/pages/if-then-else.html +65 -0
  306. package/tests/pages/if-then.html +58 -0
  307. package/tests/pages/inheritance.html +80 -0
  308. package/tests/pages/integer.html +17 -10
  309. package/tests/pages/issues/_template.html +50 -0
  310. package/tests/pages/issues/issue-gh-1133.html +64 -0
  311. package/tests/pages/issues/issue-gh-1158-2.html +189 -0
  312. package/tests/pages/issues/issue-gh-1158.html +50 -0
  313. package/tests/pages/issues/issue-gh-1164.html +71 -0
  314. package/tests/pages/issues/issue-gh-1165.html +63 -0
  315. package/tests/pages/issues/issue-gh-1165.json +8 -0
  316. package/tests/pages/issues/issue-gh-1171.html +39 -0
  317. package/tests/pages/issues/issue-gh-1211.html +1022 -0
  318. package/tests/pages/issues/issue-gh-1233-failing.html +46 -0
  319. package/tests/pages/issues/issue-gh-1233-passing.html +49 -0
  320. package/tests/pages/issues/issue-gh-1257.html +77 -0
  321. package/tests/pages/issues/issue-gh-1272.html +167 -0
  322. package/tests/pages/issues/issue-gh-1330.html +52 -0
  323. package/tests/pages/issues/issue-gh-1338.html +74 -0
  324. package/tests/pages/issues/issue-gh-1347.html +142 -0
  325. package/tests/pages/issues/issue-gh-1364.html +64 -0
  326. package/tests/pages/issues/issue-gh-1367.html +49 -0
  327. package/tests/pages/issues/issue-gh-1383.html +31 -0
  328. package/tests/pages/issues/issue-gh-1383.json +14 -0
  329. package/tests/pages/issues/issue-gh-1384.html +31 -0
  330. package/tests/pages/issues/issue-gh-1384.json +36 -0
  331. package/tests/pages/issues/issue-gh-1410.html +57 -0
  332. package/tests/pages/issues/issue-gh-1422.html +68 -0
  333. package/tests/pages/issues/issue-gh-1431.html +49 -0
  334. package/tests/pages/issues/issue-gh-1439.html +69 -0
  335. package/tests/pages/issues/issue-gh-1452.html +98 -0
  336. package/tests/pages/issues/issue-gh-1453.html +45 -0
  337. package/tests/pages/issues/issue-gh-1461.html +55 -0
  338. package/tests/pages/issues/issue-gh-1463.html +41 -0
  339. package/tests/pages/issues/issue-gh-1466.html +63 -0
  340. package/tests/pages/issues/issue-gh-1471.html +49 -0
  341. package/tests/pages/issues/issue-gh-1485.html +59 -0
  342. package/tests/pages/issues/issue-gh-1491.html +59 -0
  343. package/tests/pages/issues/issue-gh-1525.html +62 -0
  344. package/tests/pages/issues/issue-gh-1536.html +55 -0
  345. package/tests/pages/issues/issue-gh-1538.html +56 -0
  346. package/tests/pages/issues/issue-gh-1541.html +51 -0
  347. package/tests/pages/issues/issue-gh-1541.json +9 -0
  348. package/tests/pages/issues/issue-gh-1559.html +68 -0
  349. package/tests/pages/issues/issue-gh-1562.html +170 -0
  350. package/tests/pages/issues/issue-gh-1586.html +48 -0
  351. package/tests/pages/issues/issue-gh-1636.html +52 -0
  352. package/tests/pages/issues/issue-gh-795.html +58 -0
  353. package/tests/pages/issues/issue-gh-810.html +149 -0
  354. package/tests/pages/issues/issue-gh-812.html +113 -0
  355. package/tests/pages/issues/issue-gh-823-meta-schema.html +35 -0
  356. package/tests/pages/issues/issue-gh-848.html +81 -0
  357. package/tests/pages/keep_only_existing_values.html +81 -0
  358. package/tests/pages/load-events.html +61 -0
  359. package/tests/pages/maxContains.html +40 -0
  360. package/tests/pages/meta-schema.html +793 -0
  361. package/tests/pages/meta_schema.json +740 -0
  362. package/tests/pages/minContains.html +40 -0
  363. package/tests/pages/number.html +53 -6
  364. package/tests/pages/object-case-sensitive-property-search-false.html +42 -0
  365. package/tests/pages/object-case-sensitive-property-search-true.html +42 -0
  366. package/tests/pages/object-no-additional-properties.html +68 -0
  367. package/tests/pages/object-no-duplicated-id.html +70 -0
  368. package/tests/pages/object-required-properties.html +56 -20
  369. package/tests/pages/object-show-opt-in.html +111 -0
  370. package/tests/pages/object-with-dependencies-array.html +58 -0
  371. package/tests/pages/object-with-dependencies.html +62 -0
  372. package/tests/pages/object.html +5 -3
  373. package/tests/pages/oneof-2.html +91 -0
  374. package/tests/pages/oneof.html +105 -0
  375. package/tests/pages/opt-in-widget.html +134 -0
  376. package/tests/pages/option-dependencies.html +107 -0
  377. package/tests/pages/option-no_default_values.html +60 -0
  378. package/tests/pages/per-editor-options.html +44 -0
  379. package/tests/pages/placeholder-options.html +57 -0
  380. package/tests/pages/programmatic-changes.html +121 -0
  381. package/tests/pages/prompt-paste-max-length-reached.html +51 -0
  382. package/tests/pages/purify.html +66 -0
  383. package/tests/pages/range.html +62 -0
  384. package/tests/pages/read-only.html +60 -8
  385. package/tests/pages/ready.html +44 -0
  386. package/tests/pages/references.html +168 -0
  387. package/tests/pages/remove-false-properties.html +85 -0
  388. package/tests/pages/select-values.html +91 -0
  389. package/tests/pages/select.html +4 -3
  390. package/tests/pages/show-validation-errors.html +73 -0
  391. package/tests/pages/starrating.html +86 -0
  392. package/tests/pages/stepper-manual.html +59 -0
  393. package/tests/pages/stepper.html +61 -0
  394. package/tests/pages/string-ace-editor.html +7 -3
  395. package/tests/pages/string-cleave.html +48 -0
  396. package/tests/pages/string-custom-attributes.html +9 -6
  397. package/tests/pages/string-formats.html +54 -0
  398. package/tests/pages/string-formats2.html +59 -0
  399. package/tests/pages/{array-move-events.html → string-jodit-editor.html} +21 -29
  400. package/tests/pages/string-sceditor.html +9 -7
  401. package/tests/pages/string-simplemde-editor.html +83 -0
  402. package/tests/pages/switcher-option.html +69 -0
  403. package/tests/pages/table.html +4 -2
  404. package/tests/pages/tabs.html +1 -1
  405. package/tests/pages/themes.html +517 -0
  406. package/tests/pages/title-hidden.html +75 -0
  407. package/tests/pages/translate-property.html +248 -0
  408. package/tests/pages/urn.html +98 -0
  409. package/tests/pages/use-name-attributes.html +207 -0
  410. package/tests/pages/uuid.html +113 -0
  411. package/tests/pages/validation-messages.json +705 -0
  412. package/tests/pages/validation.html +20 -730
  413. package/tests/unit/.eslintrc +8 -0
  414. package/tests/unit/core.spec.js +320 -0
  415. package/tests/unit/defaults.spec.js +40 -0
  416. package/tests/unit/editor.spec.js +172 -0
  417. package/tests/unit/editors/array.spec.js +87 -0
  418. package/tests/unit/editors/object.spec.js +81 -0
  419. package/tests/unit/editors/table.spec.js +93 -0
  420. package/tests/unit/readme.md +35 -0
  421. package/tests/unit/schemaloader.spec.js +576 -0
  422. package/tests/unit/validator.spec.js +104 -0
  423. package/tests/unit/validators/ip-validator.spec.js +62 -0
  424. package/Gruntfile.js +0 -228
  425. package/dist/css/jsoneditor.min.css +0 -1
  426. package/dist/jsoneditor.js.map +0 -1
  427. package/dist/jsoneditor.min.js +0 -19
  428. package/dist/jsoneditor.min.js.map +0 -1
  429. package/src/class.js +0 -68
  430. package/src/editors/rating.js +0 -152
  431. package/src/ie9.js +0 -51
  432. package/src/intro.js +0 -23
  433. package/src/jquery.js +0 -64
  434. package/src/outro.js +0 -2
  435. package/src/themes/jsoneditor.barebones-theme.js +0 -60
@@ -1,478 +1,404 @@
1
- JSONEditor.defaults.editors.string = JSONEditor.AbstractEditor.extend({
2
- register: function() {
3
- this._super();
4
- if(!this.input) return;
5
- this.input.setAttribute('name',this.formname);
6
- },
7
- unregister: function() {
8
- this._super();
9
- if(!this.input) return;
10
- this.input.removeAttribute('name');
11
- },
12
- setValue: function(value,initial,from_template) {
13
- var self = this;
14
-
15
- if(this.template && !from_template) {
16
- return;
17
- }
18
-
19
- if(value === null || typeof value === 'undefined') value = "";
20
- else if(typeof value === "object") value = JSON.stringify(value);
21
- else if(typeof value !== "string") value = ""+value;
22
-
23
- if(value === this.serialized) return;
24
-
25
- // Sanitize value before setting it
26
- var sanitized = this.sanitize(value);
27
-
28
- if(this.input.value === sanitized) {
29
- return;
30
- }
1
+ import { AbstractEditor } from '../editor.js'
2
+ import { extend } from '../utilities.js'
31
3
 
32
- this.input.value = sanitized;
33
-
34
- // If using SCEditor, update the WYSIWYG
35
- if(this.sceditor_instance) {
36
- this.sceditor_instance.val(sanitized);
4
+ export class StringEditor extends AbstractEditor {
5
+ register () {
6
+ super.register()
7
+ if (!this.input) return
8
+ if (this.jsoneditor.options.use_name_attributes) {
9
+ this.input.setAttribute('name', this.formname)
37
10
  }
38
- else if(this.SimpleMDE) {
39
- this.SimpleMDE.value(sanitized);
11
+ }
12
+
13
+ unregister () {
14
+ super.unregister()
15
+ if (!this.input) return
16
+ this.input.removeAttribute('name')
17
+ this.input.removeAttribute('aria-label')
18
+ }
19
+
20
+ setValue (value, initial, fromTemplate) {
21
+ value = this.purify(value)
22
+ value = this.applyConstFilter(value)
23
+
24
+ if (this.template && !fromTemplate) return
25
+
26
+ if (!this.shouldBeUnset() && (value === null || typeof value === 'undefined')) value = ''
27
+ else if (typeof value === 'object') value = JSON.stringify(value)
28
+ else if (!this.shouldBeUnset() && (typeof value !== 'string')) value = `${value}`
29
+
30
+ if (value === this.serialized) return
31
+
32
+ /* Sanitize value before setting it */
33
+ const sanitized = this.sanitize(value)
34
+
35
+ if (this.input.value === sanitized) return
36
+
37
+ this.setValueToInputField(sanitized)
38
+
39
+ if (this.format === 'range') {
40
+ const output = this.control.querySelector('output')
41
+ if (output) {
42
+ output.value = sanitized
43
+ }
40
44
  }
41
- else if(this.ace_editor) {
42
- this.ace_editor.setValue(sanitized);
43
- this.ace_editor.session.getSelection().clearSelection();
44
- this.ace_editor.resize();
45
+
46
+ const changed = fromTemplate || this.getValue() !== value
47
+
48
+ this.refreshValue()
49
+
50
+ if (initial) this.is_dirty = false
51
+ else if (this.jsoneditor.options.show_errors === 'change') this.is_dirty = true
52
+
53
+ if (this.adjust_height) this.adjust_height(this.input)
54
+
55
+ /* Bubble this setValue to parents if the value changed */
56
+ if (changed) {
57
+ this.onChange(true, fromTemplate)
45
58
  }
46
-
47
- var changed = from_template || this.getValue() !== value;
48
-
49
- this.refreshValue();
50
-
51
- if(initial) this.is_dirty = false;
52
- else if(this.jsoneditor.options.show_errors === "change") this.is_dirty = true;
53
-
54
- if(this.adjust_height) this.adjust_height(this.input);
55
-
56
- // Bubble this setValue to parents if the value changed
57
- this.onChange(changed);
58
- },
59
- getNumColumns: function() {
60
- var min = Math.ceil(Math.max(this.getTitle().length,this.schema.maxLength||0,this.schema.minLength||0)/5);
61
- var num;
62
-
63
- if(this.input_type === 'textarea') num = 6;
64
- else if(['text','email'].indexOf(this.input_type) >= 0) num = 4;
65
- else num = 2;
66
-
67
- return Math.min(12,Math.max(min,num));
68
- },
69
- build: function() {
70
- var self = this, i;
71
- if(!this.options.compact) this.header = this.label = this.theme.getFormInputLabel(this.getTitle());
72
- if(this.schema.description) this.description = this.theme.getFormInputDescription(this.schema.description);
73
- if(this.options.infoText) this.infoButton = this.theme.getInfoButton(this.options.infoText);
74
-
75
- this.format = this.schema.format;
76
- if(!this.format && this.schema.media && this.schema.media.type) {
77
- this.format = this.schema.media.type.replace(/(^(application|text)\/(x-)?(script\.)?)|(-source$)/g,'');
59
+
60
+ /* Return object with changed state and sanitized value for use in editors that extend this */
61
+ return { changed, value: sanitized }
62
+ }
63
+
64
+ setValueToInputField (value) {
65
+ this.input.value = value === undefined ? '' : value
66
+ }
67
+
68
+ getNumColumns () {
69
+ const min = Math.ceil(Math.max(this.getTitle().length, this.schema.maxLength || 0, this.schema.minLength || 0) / 5)
70
+ let num
71
+
72
+ if (this.input_type === 'textarea') num = 6
73
+ else if (['text', 'email'].includes(this.input_type)) num = 4
74
+ else num = 2
75
+
76
+ return Math.min(12, Math.max(min, num))
77
+ }
78
+
79
+ build () {
80
+ if (!this.options.compact) this.header = this.label = this.theme.getFormInputLabel(this.getTitle(), this.isRequired())
81
+ if (this.schema.description) this.description = this.theme.getFormInputDescription(this.translateProperty(this.schema.description))
82
+ if (this.options.infoText) this.infoButton = this.theme.getInfoButton(this.translateProperty(this.options.infoText))
83
+
84
+ this.format = this.schema.format
85
+ if (!this.format && this.schema.media && this.schema.media.type) {
86
+ this.format = this.schema.media.type.replace(/(^(application|text)\/(x-)?(script\.)?)|(-source$)/g, '')
78
87
  }
79
- if(!this.format && this.options.default_format) {
80
- this.format = this.options.default_format;
88
+ if (!this.format && this.options.default_format) {
89
+ this.format = this.options.default_format
81
90
  }
82
- if(this.options.format) {
83
- this.format = this.options.format;
91
+ if (this.options.format) {
92
+ this.format = this.options.format
84
93
  }
85
94
 
86
- // Specific format
87
- if(this.format) {
88
- // Text Area
89
- if(this.format === 'textarea') {
90
- this.input_type = 'textarea';
91
- this.input = this.theme.getTextareaInput();
92
- }
93
- // Range Input
94
- else if(this.format === 'range') {
95
- this.input_type = 'range';
96
- var min = this.schema.minimum || 0;
97
- var max = this.schema.maximum || Math.max(100,min+1);
98
- var step = 1;
99
- if(this.schema.multipleOf) {
100
- if(min%this.schema.multipleOf) min = Math.ceil(min/this.schema.multipleOf)*this.schema.multipleOf;
101
- if(max%this.schema.multipleOf) max = Math.floor(max/this.schema.multipleOf)*this.schema.multipleOf;
102
- step = this.schema.multipleOf;
95
+ /* Specific format */
96
+ if (this.format) {
97
+ /* Text Area */
98
+ if (this.format === 'textarea') {
99
+ this.input_type = 'textarea'
100
+ this.input = this.theme.getTextareaInput()
101
+ /* Range Input */
102
+ } else if (this.format === 'range') {
103
+ this.input_type = 'range'
104
+ let min = this.schema.minimum || 0
105
+ let max = this.schema.maximum || Math.max(100, min + 1)
106
+ let step = 1
107
+ if (this.schema.multipleOf) {
108
+ if (min % this.schema.multipleOf) min = Math.ceil(min / this.schema.multipleOf) * this.schema.multipleOf
109
+ if (max % this.schema.multipleOf) max = Math.floor(max / this.schema.multipleOf) * this.schema.multipleOf
110
+ step = this.schema.multipleOf
103
111
  }
104
112
 
105
- this.input = this.theme.getRangeInput(min,max,step);
106
- }
107
- // Source Code
108
- else if([
109
- 'actionscript',
110
- 'batchfile',
111
- 'bbcode',
112
- 'c',
113
- 'c++',
114
- 'cpp',
115
- 'coffee',
116
- 'csharp',
117
- 'css',
118
- 'dart',
119
- 'django',
120
- 'ejs',
121
- 'erlang',
122
- 'golang',
123
- 'groovy',
124
- 'handlebars',
125
- 'haskell',
126
- 'haxe',
127
- 'html',
128
- 'ini',
129
- 'jade',
130
- 'java',
131
- 'javascript',
132
- 'json',
133
- 'less',
134
- 'lisp',
135
- 'lua',
136
- 'makefile',
137
- 'markdown',
138
- 'matlab',
139
- 'mysql',
140
- 'objectivec',
141
- 'pascal',
142
- 'perl',
143
- 'pgsql',
144
- 'php',
145
- 'python',
146
- 'r',
147
- 'ruby',
148
- 'sass',
149
- 'scala',
150
- 'scss',
151
- 'smarty',
152
- 'sql',
153
- 'sqlserver',
154
- 'stylus',
155
- 'svg',
156
- 'twig',
157
- 'vbscript',
158
- 'xml',
159
- 'yaml'
160
- ].indexOf(this.format) >= 0
161
- ) {
162
- this.input_type = this.format;
163
- this.source_code = true;
164
-
165
- this.input = this.theme.getTextareaInput();
166
- }
167
- // HTML5 Input type
168
- else {
169
- this.input_type = this.format;
170
- this.input = this.theme.getFormInputField(this.input_type);
113
+ this.input = this.theme.getRangeInput(min, max, step, this.description, this.formname)
114
+ this.input.setAttribute('id', this.formname)
115
+ /* HTML5 Input type */
116
+ } else {
117
+ this.input_type = 'text'
118
+ if (['button', 'checkbox', 'color', 'date', 'datetime-local', 'email', 'file', 'hidden', 'image', 'month', 'number', 'password', 'radio', 'reset', 'search', 'submit', 'tel', 'text', 'time', 'url', 'week'].includes(this.format)) {
119
+ this.input_type = this.format
120
+ }
121
+ this.input = this.theme.getFormInputField(this.input_type)
171
122
  }
172
- }
173
- // Normal text input
174
- else {
175
- this.input_type = 'text';
176
- this.input = this.theme.getFormInputField(this.input_type);
177
- }
178
-
179
- // minLength, maxLength, and pattern
180
- if(typeof this.schema.maxLength !== "undefined") this.input.setAttribute('maxlength',this.schema.maxLength);
181
- if(typeof this.schema.pattern !== "undefined") this.input.setAttribute('pattern',this.schema.pattern);
182
- else if(typeof this.schema.minLength !== "undefined") this.input.setAttribute('pattern','.{'+this.schema.minLength+',}');
183
-
184
- if(this.options.compact) {
185
- this.container.classList.add('compact');
186
- }
187
- else {
188
- if(this.options.input_width) this.input.style.width = this.options.input_width;
123
+ /* Normal text input */
124
+ } else {
125
+ this.input_type = 'text'
126
+ this.input = this.theme.getFormInputField(this.input_type)
189
127
  }
190
128
 
191
- if(this.schema.readOnly || this.schema.readonly || this.schema.template) {
192
- this.always_disabled = true;
193
- this.input.setAttribute('readonly', 'true');
129
+ /* minLength, maxLength, and pattern */
130
+ if (typeof this.schema.maxLength !== 'undefined') this.input.setAttribute('maxlength', this.schema.maxLength)
131
+ if (typeof this.schema.pattern !== 'undefined') this.input.setAttribute('pattern', this.schema.pattern)
132
+ else if (typeof this.schema.minLength !== 'undefined') this.input.setAttribute('pattern', `.{${this.schema.minLength},}`)
133
+
134
+ if (this.options.compact) {
135
+ this.container.classList.add('compact')
136
+ } else if (this.options.input_width) this.input.style.width = this.options.input_width
137
+
138
+ if (this.schema.readOnly || this.schema.readonly || this.schema.template) {
139
+ this.disable(true)
140
+ this.input.setAttribute('readonly', 'true')
194
141
  }
195
142
 
196
- // Set custom attributes on input element. Parameter is array of protected keys. Empty array if none.
197
- this.setInputAttributes(['maxlength', 'pattern', 'readonly', 'min', 'max', 'step']);
143
+ /* Set custom attributes on input element. Parameter is array of protected keys. Empty array if none. */
144
+ this.setInputAttributes(['maxlength', 'pattern', 'readonly', 'min', 'max', 'step'])
198
145
 
199
146
  this.input
200
- .addEventListener('change',function(e) {
201
- e.preventDefault();
202
- e.stopPropagation();
203
-
204
- // Don't allow changing if this field is a template
205
- if(self.schema.template) {
206
- this.value = self.value;
207
- return;
147
+ .addEventListener('change', e => {
148
+ e.preventDefault()
149
+ e.stopPropagation()
150
+
151
+ /* Don't allow changing if this field is a template */
152
+ if (this.schema.template) {
153
+ e.currentTarget.value = this.value
154
+ return
208
155
  }
209
156
 
210
- var val = this.value;
211
-
212
- // sanitize value
213
- var sanitized = self.sanitize(val);
214
- if(val !== sanitized) {
215
- this.value = sanitized;
157
+ const val = e.currentTarget.value
158
+
159
+ /* sanitize value */
160
+ const sanitized = this.sanitize(val)
161
+ if (val !== sanitized) {
162
+ e.currentTarget.value = sanitized
216
163
  }
217
-
218
- self.is_dirty = true;
219
-
220
- self.refreshValue();
221
- self.onChange(true);
222
- });
223
-
224
- if(this.options.input_height) this.input.style.height = this.options.input_height;
225
- if(this.options.expand_height) {
226
- this.adjust_height = function(el) {
227
- if(!el) return;
228
- var i, ch=el.offsetHeight;
229
- // Input too short
230
- if(el.offsetHeight < el.scrollHeight) {
231
- i=0;
232
- while(el.offsetHeight < el.scrollHeight+3) {
233
- if(i>100) break;
234
- i++;
235
- ch++;
236
- el.style.height = ch+'px';
164
+
165
+ this.is_dirty = true
166
+
167
+ this.refreshValue()
168
+ this.onChange(true)
169
+ })
170
+
171
+ if (this.options.input_height) this.input.style.height = this.options.input_height
172
+ if (this.options.expand_height) {
173
+ this.adjust_height = (el) => {
174
+ if (!el) return
175
+ let i; let ch = el.offsetHeight
176
+ /* Input too short */
177
+ if (el.offsetHeight < el.scrollHeight) {
178
+ i = 0
179
+ while (el.offsetHeight < el.scrollHeight + 3) {
180
+ if (i > 100) break
181
+ i++
182
+ ch++
183
+ el.style.height = `${ch}px`
237
184
  }
238
- }
239
- else {
240
- i=0;
241
- while(el.offsetHeight >= el.scrollHeight+3) {
242
- if(i>100) break;
243
- i++;
244
- ch--;
245
- el.style.height = ch+'px';
185
+ } else {
186
+ i = 0
187
+ while (el.offsetHeight >= el.scrollHeight + 3) {
188
+ if (i > 100) break
189
+ i++
190
+ ch--
191
+ el.style.height = `${ch}px`
246
192
  }
247
- el.style.height = (ch+1)+'px';
193
+ el.style.height = `${ch + 1}px`
248
194
  }
249
- };
250
-
251
- this.input.addEventListener('keyup',function(e) {
252
- self.adjust_height(this);
253
- });
254
- this.input.addEventListener('change',function(e) {
255
- self.adjust_height(this);
256
- });
257
- this.adjust_height();
195
+ }
196
+
197
+ this.input.addEventListener('keyup', e => {
198
+ this.adjust_height(e.currentTarget)
199
+ })
200
+ this.input.addEventListener('change', e => {
201
+ this.adjust_height(e.currentTarget)
202
+ })
203
+ this.adjust_height()
258
204
  }
259
205
 
260
- if(this.format) this.input.setAttribute('data-schemaformat',this.format);
261
-
262
- this.control = this.theme.getFormControl(this.label, this.input, this.description, this.infoButton);
263
-
264
- // output element to display the range value when it changes or have default.
265
- if(this.format === 'range') {
266
- var output = document.createElement('output');
267
- output.setAttribute('class', 'range-output');
268
- this.control.appendChild(output);
269
- output.value = this.schema.default || Math.max(this.schema.minimum || 0, 0);
270
- this.input.addEventListener('change', function () {
271
- output.value = self.input.value;
272
- });
273
- this.input.addEventListener('input', function () {
274
- output.value = self.input.value;
275
- });
206
+ const promptPasteMaxLengthReached = this.options.prompt_paste_max_length_reached ?? this.jsoneditor.options.prompt_paste_max_length_reached
207
+ const hasMaxLength = typeof this.schema.maxLength !== 'undefined'
208
+
209
+ if (promptPasteMaxLengthReached && hasMaxLength) {
210
+ this.input.addEventListener('paste', (event) => {
211
+ const paste = (event.clipboardData || window.clipboardData).getData('text')
212
+ const length = (paste.length + this.input.value.length)
213
+
214
+ if (length > this.schema.maxLength) {
215
+ alert(this.translate('paste_max_length_reached', [this.schema.maxLength]))
216
+ }
217
+ })
276
218
  }
277
219
 
278
- this.container.appendChild(this.control);
279
-
280
- // Any special formatting that needs to happen after the input is added to the dom
281
- window.requestAnimationFrame(function() {
282
- // Skip in case the input is only a temporary editor,
283
- // otherwise, in the case of an ace_editor creation,
284
- // it will generate an error trying to append it to the missing parentNode
285
- if(self.input.parentNode) self.afterInputReady();
286
- if(self.adjust_height) self.adjust_height(self.input);
287
- });
288
-
289
- // Compile and store the template
290
- if(this.schema.template) {
291
- this.template = this.jsoneditor.compileTemplate(this.schema.template, this.template_engine);
292
- this.refreshValue();
220
+ if (this.format) this.input.setAttribute('data-schemaformat', this.format)
221
+
222
+ let { input } = this
223
+ if (this.format === 'range') {
224
+ input = this.theme.getRangeControl(this.input, this.theme.getRangeOutput(this.input, this.schema.default || Math.max(this.schema.minimum || 0, 0)))
293
225
  }
294
- else {
295
- this.refreshValue();
226
+
227
+ this.control = this.theme.getFormControl(this.label, input, this.description, this.infoButton, this.formname)
228
+ this.container.appendChild(this.control)
229
+
230
+ /* Any special formatting that needs to happen after the input is added to the dom */
231
+ window.requestAnimationFrame(() => {
232
+ /* Skip in case the input is only a temporary editor, */
233
+ /* otherwise, in the case of an ace_editor creation, */
234
+ /* it will generate an error trying to append it to the missing parentNode */
235
+ if (this.input.parentNode) this.afterInputReady()
236
+ if (this.adjust_height) this.adjust_height(this.input)
237
+ if (this.format === 'range') {
238
+ const output = this.control.querySelector('output')
239
+ output.value = this.input.value
240
+ }
241
+ })
242
+
243
+ /* Compile and store the template */
244
+ if (this.schema.template) {
245
+ const callback = this.expandCallbacks('template', { template: this.schema.template })
246
+ if (typeof callback.template === 'function') this.template = callback.template
247
+ else this.template = this.jsoneditor.compileTemplate(this.schema.template, this.template_engine)
248
+ this.refreshValue()
249
+ } else {
250
+ this.refreshValue()
296
251
  }
297
- },
298
- postBuild: function() {
299
- this._super();
300
- // Enable cleave.js support if library is loaded and config is available
301
- if (window.Cleave && this.schema.options && typeof this.schema.options.cleave == 'object') {
302
- this.cleave = new window.Cleave(this.input, this.schema.options.cleave);
252
+ }
253
+
254
+ setupCleave (el) {
255
+ /* Enable cleave.js support if library is loaded and config is available */
256
+ const options = this.expandCallbacks('cleave', extend({}, this.defaults.options.cleave || {}, this.options.cleave || {}))
257
+ if (typeof options === 'object' && Object.keys(options).length > 0) {
258
+ this.cleave_instance = new window.Cleave(el, options)
303
259
  }
304
- },
305
- enable: function() {
306
- if(!this.always_disabled) {
307
- this.input.disabled = false;
308
- // TODO: WYSIWYG and Markdown editors
309
- this._super();
260
+ }
261
+
262
+ setupImask (el) {
263
+ /* Enable imask.js support if library is loaded and config is available */
264
+ const options = this.expandCallbacks('imask', extend({}, this.defaults.options.imask || {}, this.options.imask || {}))
265
+ if (typeof options === 'object' && Object.keys(options).length > 0) {
266
+ this.imask_instance = window.IMask(el, this.ajustIMaskOptions(options))
310
267
  }
311
- },
312
- disable: function(always_disabled) {
313
- if(always_disabled) this.always_disabled = true;
314
- this.input.disabled = true;
315
- // TODO: WYSIWYG and Markdown editors
316
- this._super();
317
- },
318
- afterInputReady: function() {
319
- var self = this, options;
320
-
321
- // Code editor
322
- if(this.source_code) {
323
- // WYSIWYG html and bbcode editor
324
- if(this.options.wysiwyg &&
325
- ['html','bbcode'].indexOf(this.input_type) >= 0 &&
326
- window.jQuery && window.jQuery.fn && window.jQuery.fn.sceditor
327
- ) {
328
- options = $extend({},{
329
- plugins: self.input_type==='html'? 'xhtml' : 'bbcode',
330
- emoticonsEnabled: false,
331
- width: '100%',
332
- height: 300
333
- },JSONEditor.plugins.sceditor,self.options.sceditor_options||{});
334
-
335
- window.jQuery(self.input).sceditor(options);
336
-
337
- self.sceditor_instance = window.jQuery(self.input).sceditor('instance');
338
-
339
- self.sceditor_instance.blur(function() {
340
- // Get editor's value
341
- var val = window.jQuery("<div>"+self.sceditor_instance.val()+"</div>");
342
- // Remove sceditor spans/divs
343
- window.jQuery('#sceditor-start-marker,#sceditor-end-marker,.sceditor-nlf',val).remove();
344
- // Set the value and update
345
- self.input.value = val.html();
346
- self.value = self.input.value;
347
- self.is_dirty = true;
348
- self.onChange(true);
349
- });
268
+ }
269
+
270
+ ajustIMaskOptions (obj) {
271
+ /* iMask config format is not JSON friendly, so function and regex based mask */
272
+ /* properties have to be adjusted from string to the correct format */
273
+ Object.keys(obj).forEach(prop => {
274
+ if (obj[prop] === Object(obj[prop])) obj[prop] = this.ajustIMaskOptions(obj[prop])
275
+ else if (prop === 'mask') {
276
+ if (obj[prop].substr(0, 6) === 'regex:') {
277
+ const regExMatch = obj[prop].match(/^regex:\/(.*)\/([gimsuy]*)$/)
278
+ if (regExMatch !== null) {
279
+ try {
280
+ obj[prop] = new RegExp(regExMatch[1], regExMatch[2])
281
+ } catch (e) { }
282
+ }
283
+ } else obj[prop] = this.getGlobalPropertyFromString(obj[prop])
350
284
  }
351
- // SimpleMDE for markdown (if it's loaded)
352
- else if (this.input_type === 'markdown' && window.SimpleMDE) {
353
- options = $extend({},JSONEditor.plugins.SimpleMDE,{
354
- element: this.input
355
- });
356
-
357
- this.SimpleMDE = new window.SimpleMDE((options));
358
-
359
- this.SimpleMDE.codemirror.on("change",function() {
360
- self.value = self.SimpleMDE.value();
361
- self.is_dirty = true;
362
- self.onChange(true);
363
- });
285
+ })
286
+ return obj
287
+ }
288
+
289
+ getGlobalPropertyFromString (strValue) {
290
+ if (!strValue.includes('.')) {
291
+ if (typeof window[strValue] !== 'undefined') {
292
+ return window[strValue]
364
293
  }
365
- // ACE editor for everything else
366
- else if(window.ace) {
367
- var mode = this.input_type;
368
- // aliases for c/cpp
369
- if(mode === 'cpp' || mode === 'c++' || mode === 'c') {
370
- mode = 'c_cpp';
371
- }
372
-
373
- this.ace_container = document.createElement('div');
374
- this.ace_container.style.width = '100%';
375
- this.ace_container.style.position = 'relative';
376
- this.ace_container.style.height = '400px';
377
- this.input.parentNode.insertBefore(this.ace_container,this.input);
378
- this.input.style.display = 'none';
379
- this.ace_editor = window.ace.edit(this.ace_container);
380
-
381
- var aceOptions = this.schema.options && this.schema.options.ace;
382
- if (aceOptions) {
383
- this.ace_editor.setOptions(aceOptions);
384
- }
294
+ } else {
295
+ const arrParts = strValue.split('.')
296
+ const obj = arrParts[0]
297
+ const prop = arrParts[1]
385
298
 
386
- this.ace_editor.setValue(this.getValue());
387
- this.ace_editor.session.getSelection().clearSelection();
388
- this.ace_editor.resize();
389
-
390
- // The theme
391
- if(JSONEditor.plugins.ace.theme) this.ace_editor.setTheme('ace/theme/'+JSONEditor.plugins.ace.theme);
392
- // The mode
393
- this.ace_editor.getSession().setMode('ace/mode/' + this.schema.format);
394
-
395
- // Listen for changes
396
- this.ace_editor.on('change',function() {
397
- var val = self.ace_editor.getValue();
398
- self.input.value = val;
399
- self.refreshValue();
400
- self.is_dirty = true;
401
- self.onChange(true);
402
- });
299
+ if (typeof window[obj] !== 'undefined' && typeof window[obj][prop] !== 'undefined') {
300
+ return window[obj][prop]
403
301
  }
404
302
  }
405
-
406
- self.theme.afterInputReady(self.input);
407
- },
408
- refreshValue: function() {
409
- this.value = this.input.value;
410
- if(typeof this.value !== "string") this.value = '';
411
- this.serialized = this.value;
412
- },
413
- destroy: function() {
414
- // If using SCEditor, destroy the editor instance
415
- if(this.sceditor_instance) {
416
- this.sceditor_instance.destroy();
417
- }
418
- else if(this.SimpleMDE) {
419
- this.SimpleMDE.toTextArea();
420
- this.SimpleMDE = null;
303
+ /* just a string */
304
+ return strValue
305
+ }
306
+
307
+ shouldBeUnset () {
308
+ return !this.jsoneditor.options.use_default_values && !this.is_dirty
309
+ }
310
+
311
+ getValue () {
312
+ const hasValueSet = !!(this.input && this.input.value)
313
+
314
+ if (this.shouldBeUnset() && !hasValueSet) {
315
+ return undefined
421
316
  }
422
- else if(this.ace_editor) {
423
- this.ace_editor.destroy();
317
+ if (this.imask_instance && this.dependenciesFulfilled && this.options.imask.returnUnmasked) {
318
+ return this.imask_instance.unmaskedValue
319
+ } return super.getValue()
320
+ }
321
+
322
+ enable () {
323
+ if (!this.always_disabled) {
324
+ this.input.disabled = false
325
+ super.enable()
424
326
  }
425
- if (this.cleave) {
426
- this.cleave.destroy();
327
+ }
328
+
329
+ disable (alwaysDisabled) {
330
+ if (alwaysDisabled) this.always_disabled = true
331
+ this.input.disabled = true
332
+ super.disable()
333
+ }
334
+
335
+ afterInputReady () {
336
+ this.theme.afterInputReady(this.input)
337
+ if (window.Cleave && !this.cleave_instance) this.setupCleave(this.input)
338
+ else if (window.IMask && !this.imask_instance) this.setupImask(this.input)
339
+ }
340
+
341
+ refreshValue () {
342
+ if (!this.input) {
343
+ return
427
344
  }
345
+ this.value = this.input.value
346
+ if (typeof this.value !== 'string' && !this.shouldBeUnset()) this.value = ''
347
+ this.serialized = this.value
348
+ }
349
+
350
+ destroy () {
351
+ if (this.cleave_instance) this.cleave_instance.destroy()
352
+ if (this.imask_instance) this.imask_instance.destroy()
428
353
 
429
- this.template = null;
430
- if(this.input && this.input.parentNode) this.input.parentNode.removeChild(this.input);
431
- if(this.label && this.label.parentNode) this.label.parentNode.removeChild(this.label);
432
- if(this.description && this.description.parentNode) this.description.parentNode.removeChild(this.description);
354
+ this.template = null
355
+ if (this.input && this.input.parentNode) this.input.parentNode.removeChild(this.input)
356
+ if (this.label && this.label.parentNode) this.label.parentNode.removeChild(this.label)
357
+ if (this.description && this.description.parentNode) this.description.parentNode.removeChild(this.description)
358
+
359
+ super.destroy()
360
+ }
433
361
 
434
- this._super();
435
- },
436
362
  /**
437
363
  * This is overridden in derivative editors
438
364
  */
439
- sanitize: function(value) {
440
- return value;
441
- },
365
+ sanitize (value) {
366
+ value = this.purify(value)
367
+ return value
368
+ }
369
+
442
370
  /**
443
371
  * Re-calculates the value if needed
444
372
  */
445
- onWatchedFieldChange: function() {
446
- var self = this, vars, j;
447
-
448
- // If this editor needs to be rendered by a macro template
449
- if(this.template) {
450
- vars = this.getWatchedFieldValues();
451
- this.setValue(this.template(vars),false,true);
373
+ onWatchedFieldChange () {
374
+ let vars
375
+
376
+ /* If this editor needs to be rendered by a macro template */
377
+ if (this.template) {
378
+ vars = this.getWatchedFieldValues()
379
+ this.setValue(this.template(vars), false, true)
452
380
  }
453
-
454
- this._super();
455
- },
456
- showValidationErrors: function(errors) {
457
- var self = this;
458
-
459
- if(this.jsoneditor.options.show_errors === "always") {}
460
- else if(!this.is_dirty && this.previous_error_setting===this.jsoneditor.options.show_errors) return;
461
-
462
- this.previous_error_setting = this.jsoneditor.options.show_errors;
463
-
464
- var messages = [];
465
- $each(errors,function(i,error) {
466
- if(error.path === self.path) {
467
- messages.push(error.message);
468
- }
469
- });
470
381
 
471
- if(messages.length) {
472
- this.theme.addInputError(this.input, messages.join('. ')+'.');
382
+ super.onWatchedFieldChange()
383
+ }
384
+
385
+ showValidationErrors (errors) {
386
+ if (this.jsoneditor.options.show_errors === 'always') { } else if (!this.is_dirty && this.previous_error_setting === this.jsoneditor.options.show_errors) return
387
+
388
+ this.previous_error_setting = this.jsoneditor.options.show_errors
389
+
390
+ const addMessage = (messages, error) => {
391
+ if (error.path === this.path) {
392
+ messages.push(error.message)
393
+ }
394
+ return messages
473
395
  }
474
- else {
475
- this.theme.removeInputError(this.input);
396
+ const messages = errors.reduce(addMessage, [])
397
+
398
+ if (messages.length) {
399
+ this.theme.addInputError(this.input, `${messages.join('. ')}.`)
400
+ } else {
401
+ this.theme.removeInputError(this.input)
476
402
  }
477
403
  }
478
- });
404
+ }