@wirenboard/json-editor 2.5.3-wb13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (283) hide show
  1. package/.env-dist +2 -0
  2. package/.eslintrc +7 -0
  3. package/.gitattributes +1 -0
  4. package/.github/PULL_REQUEST_TEMPLATE.md +9 -0
  5. package/.github/issue_template +25 -0
  6. package/.github/workflows/build.yml +58 -0
  7. package/.travis.yml +70 -0
  8. package/CHANGELOG.md +915 -0
  9. package/CONTRIBUTING.md +92 -0
  10. package/LICENSE +20 -0
  11. package/Makefile +26 -0
  12. package/README.md +1646 -0
  13. package/README_ADDON.md +573 -0
  14. package/UPGRADING.md +46 -0
  15. package/build/CssToJson.js +55 -0
  16. package/codecept.conf.js +35 -0
  17. package/config/.eslintrc +7 -0
  18. package/config/codeceptjs_helpers.js +139 -0
  19. package/config/helpers.js +10 -0
  20. package/config/karma.conf.js +93 -0
  21. package/config/readme.md +31 -0
  22. package/config/webpack.common.js +75 -0
  23. package/config/webpack.dev.js +15 -0
  24. package/config/webpack.nonmin.js +19 -0
  25. package/config/webpack.prod.js +25 -0
  26. package/dist/jsoneditor.js +14 -0
  27. package/dist/nonmin/jsoneditor.js +29097 -0
  28. package/dist/nonmin/jsoneditor.js.map +1 -0
  29. package/docs/ace_editor.html +56 -0
  30. package/docs/advanced.html +136 -0
  31. package/docs/basic.html +63 -0
  32. package/docs/basic_person.json +26 -0
  33. package/docs/choices.html +86 -0
  34. package/docs/cleave.html +132 -0
  35. package/docs/colorpicker.html +194 -0
  36. package/docs/css_integration.html +135 -0
  37. package/docs/datetime.html +305 -0
  38. package/docs/describedby.html +161 -0
  39. package/docs/enumsource.html +67 -0
  40. package/docs/images/categoriesDemo.png +0 -0
  41. package/docs/images/inheritance_tree.png +0 -0
  42. package/docs/images/jsoneditor.png +0 -0
  43. package/docs/imask.html +192 -0
  44. package/docs/index.html +579 -0
  45. package/docs/materialize_css.html +164 -0
  46. package/docs/meta_schema.json +705 -0
  47. package/docs/multiple_upload_base64.html +65 -0
  48. package/docs/person.json +73 -0
  49. package/docs/polyfills/assign.js +29 -0
  50. package/docs/radio.html +156 -0
  51. package/docs/recursive.html +170 -0
  52. package/docs/select2.html +99 -0
  53. package/docs/selectize.html +100 -0
  54. package/docs/signature.html +42 -0
  55. package/docs/starrating.html +137 -0
  56. package/docs/upload.html +131 -0
  57. package/docs/uuid.html +70 -0
  58. package/docs/wysiwyg.html +56 -0
  59. package/jasmine.json +11 -0
  60. package/json-editor-json-editor-2.5.3-wb13.tgz +0 -0
  61. package/package.json +100 -0
  62. package/release-notes.md +88 -0
  63. package/src/core.js +412 -0
  64. package/src/defaults.js +402 -0
  65. package/src/editor.js +707 -0
  66. package/src/editors/ace.js +89 -0
  67. package/src/editors/array/choices.js +103 -0
  68. package/src/editors/array/select2.js +110 -0
  69. package/src/editors/array/selectize.js +103 -0
  70. package/src/editors/array.css +9 -0
  71. package/src/editors/array.css.js +3 -0
  72. package/src/editors/array.js +818 -0
  73. package/src/editors/autocomplete.js +58 -0
  74. package/src/editors/base64.js +157 -0
  75. package/src/editors/button.js +97 -0
  76. package/src/editors/checkbox.js +95 -0
  77. package/src/editors/choices.css +3 -0
  78. package/src/editors/choices.css.js +3 -0
  79. package/src/editors/choices.js +69 -0
  80. package/src/editors/colorpicker.js +103 -0
  81. package/src/editors/datetime.js +141 -0
  82. package/src/editors/describedby.js +188 -0
  83. package/src/editors/enum.js +136 -0
  84. package/src/editors/hidden.js +127 -0
  85. package/src/editors/index.js +81 -0
  86. package/src/editors/info.js +20 -0
  87. package/src/editors/integer.js +19 -0
  88. package/src/editors/ip.js +36 -0
  89. package/src/editors/jodit.js +64 -0
  90. package/src/editors/multiple.js +409 -0
  91. package/src/editors/multiselect.js +218 -0
  92. package/src/editors/null.js +18 -0
  93. package/src/editors/number.js +51 -0
  94. package/src/editors/object.css +41 -0
  95. package/src/editors/object.css.js +3 -0
  96. package/src/editors/object.js +1290 -0
  97. package/src/editors/radio.js +111 -0
  98. package/src/editors/sceditor.js +72 -0
  99. package/src/editors/select.js +370 -0
  100. package/src/editors/select2.js +110 -0
  101. package/src/editors/selectize.js +112 -0
  102. package/src/editors/signature.js +113 -0
  103. package/src/editors/simplemde.js +100 -0
  104. package/src/editors/starrating.css +52 -0
  105. package/src/editors/starrating.css.js +3 -0
  106. package/src/editors/starrating.js +135 -0
  107. package/src/editors/stepper.js +27 -0
  108. package/src/editors/string.js +372 -0
  109. package/src/editors/table.js +516 -0
  110. package/src/editors/upload.js +321 -0
  111. package/src/editors/uuid.js +56 -0
  112. package/src/iconlib.js +24 -0
  113. package/src/iconlibs/bootstrap2.js +28 -0
  114. package/src/iconlibs/bootstrap3.js +28 -0
  115. package/src/iconlibs/fontawesome3.js +28 -0
  116. package/src/iconlibs/fontawesome4.js +28 -0
  117. package/src/iconlibs/fontawesome5.js +28 -0
  118. package/src/iconlibs/foundation2.js +24 -0
  119. package/src/iconlibs/foundation3.js +28 -0
  120. package/src/iconlibs/index.js +25 -0
  121. package/src/iconlibs/jqueryui.js +28 -0
  122. package/src/iconlibs/materialicons.js +49 -0
  123. package/src/iconlibs/openiconic.js +28 -0
  124. package/src/iconlibs/spectre.js +28 -0
  125. package/src/resolvers.js +128 -0
  126. package/src/schemaloader.js +408 -0
  127. package/src/style.css +150 -0
  128. package/src/style.css.js +3 -0
  129. package/src/templates/default.js +52 -0
  130. package/src/templates/ejs.js +13 -0
  131. package/src/templates/handlebars.js +1 -0
  132. package/src/templates/hogan.js +10 -0
  133. package/src/templates/index.js +21 -0
  134. package/src/templates/lodash.js +9 -0
  135. package/src/templates/markup.js +9 -0
  136. package/src/templates/mustache.js +9 -0
  137. package/src/templates/swig.js +1 -0
  138. package/src/templates/underscore.js +9 -0
  139. package/src/theme.js +659 -0
  140. package/src/themes/barebones.css +35 -0
  141. package/src/themes/barebones.css.js +3 -0
  142. package/src/themes/barebones.js +28 -0
  143. package/src/themes/bootstrap2.js +319 -0
  144. package/src/themes/bootstrap3.css +0 -0
  145. package/src/themes/bootstrap3.css.js +3 -0
  146. package/src/themes/bootstrap3.js +315 -0
  147. package/src/themes/bootstrap4.css +89 -0
  148. package/src/themes/bootstrap4.css.js +3 -0
  149. package/src/themes/bootstrap4.js +690 -0
  150. package/src/themes/bootstrap5.css.js +3 -0
  151. package/src/themes/foundation.js +569 -0
  152. package/src/themes/html.css +60 -0
  153. package/src/themes/html.css.js +3 -0
  154. package/src/themes/html.js +71 -0
  155. package/src/themes/index.js +28 -0
  156. package/src/themes/jqueryui.js +198 -0
  157. package/src/themes/materialize.js +426 -0
  158. package/src/themes/spectre.css +208 -0
  159. package/src/themes/spectre.css.js +3 -0
  160. package/src/themes/spectre.js +406 -0
  161. package/src/themes/tailwind.css +249 -0
  162. package/src/themes/tailwind.css.js +3 -0
  163. package/src/themes/tailwind.js +443 -0
  164. package/src/utilities.js +138 -0
  165. package/src/validator.js +877 -0
  166. package/src/validators/ip-validator.js +51 -0
  167. package/tests/Dockerfile +3 -0
  168. package/tests/README.md +48 -0
  169. package/tests/codeceptjs/codecept.json +42 -0
  170. package/tests/codeceptjs/constrains/if-then-else_test.js +143 -0
  171. package/tests/codeceptjs/core_test.js +217 -0
  172. package/tests/codeceptjs/editors/advanced_test.js +13 -0
  173. package/tests/codeceptjs/editors/array_any_of_test.js +50 -0
  174. package/tests/codeceptjs/editors/array_test.js +900 -0
  175. package/tests/codeceptjs/editors/button_test.js +35 -0
  176. package/tests/codeceptjs/editors/checkbox_test.js +21 -0
  177. package/tests/codeceptjs/editors/colorpicker_test.js +27 -0
  178. package/tests/codeceptjs/editors/datetime_test.js +33 -0
  179. package/tests/codeceptjs/editors/inheritance_test.js +11 -0
  180. package/tests/codeceptjs/editors/integer_test.js +84 -0
  181. package/tests/codeceptjs/editors/issues/issue-gh-812_test.js +32 -0
  182. package/tests/codeceptjs/editors/jodit_test.js +24 -0
  183. package/tests/codeceptjs/editors/multiselect_test.js +8 -0
  184. package/tests/codeceptjs/editors/number_test.js +82 -0
  185. package/tests/codeceptjs/editors/object_test.js +204 -0
  186. package/tests/codeceptjs/editors/option-no_default_values_test.js +42 -0
  187. package/tests/codeceptjs/editors/programmatic-changes_test.js +20 -0
  188. package/tests/codeceptjs/editors/radio_test.js +10 -0
  189. package/tests/codeceptjs/editors/rating_test.js +13 -0
  190. package/tests/codeceptjs/editors/select_test.js +22 -0
  191. package/tests/codeceptjs/editors/stepper_test.js +27 -0
  192. package/tests/codeceptjs/editors/string_test.js +118 -0
  193. package/tests/codeceptjs/editors/table-confirm-delete_test.js +67 -0
  194. package/tests/codeceptjs/editors/tabs_test.js +14 -0
  195. package/tests/codeceptjs/editors/uuid_test.js +21 -0
  196. package/tests/codeceptjs/editors/validation_test.js +14 -0
  197. package/tests/codeceptjs/meta-schema_test.js +17 -0
  198. package/tests/codeceptjs/schemaloader_test.js +13 -0
  199. package/tests/codeceptjs/steps.d.ts +13 -0
  200. package/tests/codeceptjs/steps_file.js +12 -0
  201. package/tests/codeceptjs/themes_test.js +519 -0
  202. package/tests/docker-compose.yml +34 -0
  203. package/tests/fixtures/basic_person.json +26 -0
  204. package/tests/fixtures/nested_object.json +26 -0
  205. package/tests/fixtures/person.json +55 -0
  206. package/tests/fixtures/recursive.json +8 -0
  207. package/tests/fixtures/some_types.json +32 -0
  208. package/tests/fixtures/string.json +3 -0
  209. package/tests/fixtures/validation.json +1140 -0
  210. package/tests/pages/_demo.html +475 -0
  211. package/tests/pages/advanced.html +137 -0
  212. package/tests/pages/anyof.html +80 -0
  213. package/tests/pages/array-anyof.html +142 -0
  214. package/tests/pages/array-checkboxes.html +41 -0
  215. package/tests/pages/array-choices.html +45 -0
  216. package/tests/pages/array-integers.html +37 -0
  217. package/tests/pages/array-move-events.html +61 -0
  218. package/tests/pages/array-multiselects.html +42 -0
  219. package/tests/pages/array-nested-arrays.html +40 -0
  220. package/tests/pages/array-numbers.html +37 -0
  221. package/tests/pages/array-objects.html +42 -0
  222. package/tests/pages/array-ratings.html +40 -0
  223. package/tests/pages/array-selectize.html +51 -0
  224. package/tests/pages/array-selects.html +36 -0
  225. package/tests/pages/array-strings.html +36 -0
  226. package/tests/pages/array.html +42 -0
  227. package/tests/pages/assets/pages.css +130 -0
  228. package/tests/pages/button-callbacks.html +77 -0
  229. package/tests/pages/checkbox-labels.html +114 -0
  230. package/tests/pages/colorpicker-no-3rd-party.html +43 -0
  231. package/tests/pages/colorpicker-use-vanilla-picker.html +50 -0
  232. package/tests/pages/core.html +118 -0
  233. package/tests/pages/datetime.html +76 -0
  234. package/tests/pages/form-name.html +108 -0
  235. package/tests/pages/grid-strict.html +311 -0
  236. package/tests/pages/grid.html +284 -0
  237. package/tests/pages/if-then-else-allOf.html +117 -0
  238. package/tests/pages/inheritance.html +76 -0
  239. package/tests/pages/integer.html +68 -0
  240. package/tests/pages/issues/_template.html +50 -0
  241. package/tests/pages/issues/issue-gh-812.html +110 -0
  242. package/tests/pages/issues/issue-gh-823-meta-schema.html +35 -0
  243. package/tests/pages/issues/issue-gh-848.html +81 -0
  244. package/tests/pages/meta_schema.json +705 -0
  245. package/tests/pages/number.html +89 -0
  246. package/tests/pages/object-no-additional-properties.html +65 -0
  247. package/tests/pages/object-no-duplicated-id.html +68 -0
  248. package/tests/pages/object-required-properties.html +236 -0
  249. package/tests/pages/object-with-dependencies-array.html +46 -0
  250. package/tests/pages/object-with-dependencies.html +60 -0
  251. package/tests/pages/object.html +79 -0
  252. package/tests/pages/oneof.html +103 -0
  253. package/tests/pages/option-no_default_values.html +58 -0
  254. package/tests/pages/programmatic-changes.html +120 -0
  255. package/tests/pages/read-only.html +105 -0
  256. package/tests/pages/select.html +41 -0
  257. package/tests/pages/stepper.html +59 -0
  258. package/tests/pages/string-ace-editor.html +52 -0
  259. package/tests/pages/string-cleave.html +46 -0
  260. package/tests/pages/string-custom-attributes.html +62 -0
  261. package/tests/pages/string-formats.html +52 -0
  262. package/tests/pages/string-formats2.html +57 -0
  263. package/tests/pages/string-jodit-editor.html +49 -0
  264. package/tests/pages/string-sceditor.html +62 -0
  265. package/tests/pages/table-move-events.html +56 -0
  266. package/tests/pages/table.html +46 -0
  267. package/tests/pages/tabs.html +131 -0
  268. package/tests/pages/themes.html +527 -0
  269. package/tests/pages/translate-property.html +247 -0
  270. package/tests/pages/urn.html +93 -0
  271. package/tests/pages/uuid.html +72 -0
  272. package/tests/pages/validation.html +99 -0
  273. package/tests/unit/.eslintrc +8 -0
  274. package/tests/unit/core.spec.js +309 -0
  275. package/tests/unit/defaults.spec.js +40 -0
  276. package/tests/unit/editor.spec.js +160 -0
  277. package/tests/unit/editors/array.spec.js +86 -0
  278. package/tests/unit/editors/object.spec.js +79 -0
  279. package/tests/unit/editors/table.spec.js +91 -0
  280. package/tests/unit/readme.md +35 -0
  281. package/tests/unit/schemaloader.spec.js +498 -0
  282. package/tests/unit/validator.spec.js +94 -0
  283. package/tests/unit/validators/ip-validator.spec.js +62 -0
@@ -0,0 +1,475 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8"/>
5
+ <title>JSON Editor Interactive Example</title>
6
+ <script src="../../dist/nonmin/jsoneditor.js"></script>
7
+ <script src="https://cdn.jsdelivr.net/npm/lz-string@1.4.4/libs/lz-string.min.js"></script>
8
+ <link rel='stylesheet' id='theme-link'>
9
+ <link rel='stylesheet' id='iconlib-link'>
10
+ </head>
11
+ <body>
12
+ <div class='container grid-xl'>
13
+ <div class="row columns md:flex">
14
+ <div class='col-8 col-md-8 w-8/12'>
15
+ <h1>Editor</h1>
16
+ <p>Below is the editor generated from the JSON Schema.</p>
17
+ <div id="json-editor-form"></div>
18
+ </div>
19
+ <div class='col-4 col-md-4 w-4/12'>
20
+ <div>
21
+ <a class="btn btn-primary" id="direct-link" title="preserves schema, value, and options">Direct Link</a>
22
+ <a class="btn btn-secondary" href="?" title="reload editor with default example settings">reset</a>
23
+ </div>
24
+ <h2>JSON Output</h2>
25
+ <p>You can also make changes to the JSON here and set the value in the editor by clicking "Update Form"</p>
26
+ <label for="output-textarea"></label>
27
+ <button class='btn btn-primary btn-block' id='setvalue'>Update Form</button>
28
+ <textarea id='output-textarea' rows="15" style="width: 100%; font-family: monospace;"
29
+ class='form-control'></textarea>
30
+ <h2>Validation</h2>
31
+ <label for="validate-textarea">This will update whenever the form changes to show validation errors if there
32
+ are any.</label><br>
33
+ <textarea id='validate-textarea' readonly disabled class='form-control'></textarea>
34
+ <h2>Options</h2>
35
+ <div>
36
+ <label for="boolean-options-select">Boolean options</label><br>
37
+ <select multiple size="15" id="boolean-options-select" class="form-control browser-default">
38
+ <option value='required_by_default'>Object properties required by default</option>
39
+ <option value='display_required_only'>Only show required properties by default</option>
40
+ <option value='remove_empty_properties'>Remove empty properties</option>
41
+ <option value='show_opt_in'>Show optional properties (with checkbox)</option>
42
+ <option value='no_additional_properties'>No additional object properties</option>
43
+ <option value='ajax'>Allow loading schemas via Ajax</option>
44
+ <option value='disable_edit_json'>Disable "Edit JSON" buttons</option>
45
+ <option value='disable_collapse'>Disable collapse buttons</option>
46
+ <option value='disable_properties'>Disable properties buttons</option>
47
+ <option value='disable_array_add'>Disable array add buttons</option>
48
+ <option value='disable_array_reorder'>Disable array move buttons</option>
49
+ <option value='disable_array_delete'>Disable array delete buttons</option>
50
+ <option value='enable_array_copy'>Add copy buttons to arrays</option>
51
+ <option value='array_controls_top'>Array controls will be displayed at top of list</option>
52
+ <option value='disable_array_delete_all_rows'>Disable array delete all rows buttons</option>
53
+ <option value='disable_array_delete_last_row'>Disable array delete last row buttons</option>
54
+ </select>
55
+ </div>
56
+ <div>
57
+ <label for="theme-select">theme</label><br>
58
+ <select id='theme-select' name="theme" class='form-control browser-default'>
59
+ <option value='barebones'>Barebones</option>
60
+ <option value='bootstrap4'>Bootstrap 4</option>
61
+ <option value='html'>HTML</option>
62
+ <option value='spectre'>Spectre</option>
63
+ <option value='tailwind'>Tailwind</option>
64
+ </select>
65
+ </div>
66
+ <div>
67
+ <label for="iconlib-select">iconlib</label><br>
68
+ <select id='iconlib-select' name="iconlib" class='form-control browser-default'>
69
+ <option value='fontawesome3'>fontawesome 3</option>
70
+ <option value='fontawesome4'>fontawesome 4</option>
71
+ <option value='fontawesome5'>fontawesome 5</option>
72
+ <option value='jqueryui'>jQuery UI</option>
73
+ <option value='openiconic'>Open Iconic</option>
74
+ <option value='spectre'>Spectre</option>
75
+ </select>
76
+ </div>
77
+ <div>
78
+ <label for="object-layout-select">Object Layout</label><br>
79
+ <select id='object-layout-select' class='form-control browser-default'>
80
+ <option value='normal'>normal</option>
81
+ <option value='grid'>grid</option>
82
+ </select>
83
+ </div>
84
+ <div>
85
+ <label for="show-errors-select">Show Errors</label><br>
86
+ <select id='show-errors-select' class='form-control browser-default'>
87
+ <option value='interaction'>On Interaction</option>
88
+ <option value='change'>On Field Change</option>
89
+ <option value='always'>Always</option>
90
+ <option value='never'>Never</option>
91
+ </select>
92
+ </div>
93
+ <div>
94
+ <label for="lib-select"
95
+ title="It's recommended that you click the Direct Link after changing these options">Include
96
+ External Library</label><br>
97
+ <select multiple size="10" id='lib-select' class='form-control browser-default'
98
+ title="It's reccomended that you click the Direct Link after changing these options">
99
+ <option value='ace_editor'>Ace Editor</option>
100
+ <option value='choices'>Choices</option>
101
+ <option value='sceditor'>SCEditor</option>
102
+ <option value='simplemde'>SimpleMDE</option>
103
+ <option value='select2'>Select2</option>
104
+ <option value='selectize'>Selectize</option>
105
+ <option value='flatpickr'>Flatpickr</option>
106
+ <option value='signature_pad'>Signature Pad</option>
107
+ <option value='mathjs'>Math.js</option>
108
+ <option value='cleavejs'>Cleave.js</option>
109
+ </select>
110
+ </div>
111
+ </div>
112
+ </div>
113
+ <div class="row columns md:flex">
114
+ <div class='col-12 col-md-12 w-12/12'>
115
+ <h2>Schema</h2>
116
+ <label for="schema-textarea">You can change the schema and see how the generated form looks. After you make
117
+ changes, click "Update Schema"</label>
118
+ <button class='btn btn-primary btn-block' id='setschema'>Update Schema</button>
119
+ <textarea id='schema-textarea' rows="30" style="width: 100%; font-family: monospace;"
120
+ class='form-control'></textarea>
121
+ </div>
122
+ </div>
123
+ </div>
124
+ <script>
125
+
126
+ const defaultSchema = {}
127
+
128
+ // parse url -> merge options -> refreshUI() -> initJsoneditor() -> direct link
129
+
130
+ /* ------------------------------------------------------------------- data */
131
+
132
+ let data = {}
133
+
134
+ let defaultOptions = {
135
+ iconlib: 'fontawesome5',
136
+ object_layout: 'normal',
137
+ schema: defaultSchema,
138
+ show_errors: 'interaction',
139
+ theme: 'bootstrap4'
140
+ }
141
+
142
+ let jsoneditor = null
143
+ let directLink = document.querySelector('#direct-link')
144
+
145
+ const booleanOptionsSelect = document.querySelector('#boolean-options-select')
146
+ const head = document.getElementsByTagName('head')[0]
147
+ const iconlibSelect = document.querySelector('#iconlib-select')
148
+ const iconlibLink = document.querySelector('#iconlib-link')
149
+ const libSelect = document.querySelector('#lib-select')
150
+ const jsonEditorForm = document.querySelector('#json-editor-form')
151
+ const objectLayoutSelect = document.querySelector('#object-layout-select')
152
+ const outputTextarea = document.querySelector('#output-textarea')
153
+ const schemaTextarea = document.querySelector('#schema-textarea')
154
+ const setSchema = document.querySelector('#setschema')
155
+ const setValue = document.querySelector('#setvalue')
156
+ const showErrorsSelect = document.querySelector('#show-errors-select')
157
+ const themeSelect = document.querySelector('#theme-select')
158
+ const themeLink = document.querySelector('#theme-link')
159
+ const validateTextarea = document.querySelector('#validate-textarea')
160
+
161
+ /* -------------------------------------------------------------- parse url */
162
+
163
+ const parseUrl = () => {
164
+ const url = window.location.search
165
+ const queryParamsString = url.substring(1, url.length)
166
+ const queryParams = queryParamsString.split('&')
167
+
168
+ if (queryParamsString.length) {
169
+ queryParams.forEach((queryParam) => {
170
+ const splittedParam = queryParam.split('=')
171
+ const param = splittedParam[0]
172
+ const value = splittedParam[1]
173
+
174
+ // data query param
175
+ if (param === 'data') {
176
+ // compress schema and value
177
+ try {
178
+ data = JSON.parse(LZString.decompressFromBase64(value))
179
+ } catch (reason) {
180
+ }
181
+ }
182
+ })
183
+ }
184
+
185
+ mergeOptions()
186
+ }
187
+
188
+ /* ----------------------------------------------------------- mergeOptions */
189
+
190
+ const mergeOptions = () => {
191
+ data.options = Object.assign(defaultOptions, data.options)
192
+ refreshUI()
193
+ }
194
+
195
+ /* -------------------------------------------------------------- refreshUI */
196
+
197
+ const refreshUI = () => {
198
+ // schema
199
+ schemaTextarea.value = JSON.stringify(data.options.schema, null, 2)
200
+
201
+ // theme
202
+ const themeMap = {
203
+ barebones: '',
204
+ bootstrap4: 'https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css',
205
+ html: '',
206
+ spectre: 'https://unpkg.com/spectre.css/dist/spectre.min.css',
207
+ tailwind: 'https://unpkg.com/tailwindcss@^1.0/dist/tailwind.min.css'
208
+ }
209
+ themeLink.href = themeMap[data.options.theme]
210
+ themeSelect.value = data.options.theme
211
+
212
+ // iconlLib
213
+ const iconLibMap = {
214
+ fontawesome3: 'https://cdnjs.cloudflare.com/ajax/libs/font-awesome/3.2.1/css/font-awesome.css',
215
+ fontawesome4: 'https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.0.3/css/font-awesome.css',
216
+ fontawesome5: 'https://use.fontawesome.com/releases/v5.6.1/css/all.css',
217
+ jqueryui: 'https://code.jquery.com/ui/1.10.3/themes/south-street/jquery-ui.css',
218
+ openiconic: 'https://cdnjs.cloudflare.com/ajax/libs/open-iconic/1.1.1/font/css/open-iconic.min.css',
219
+ spectre: 'https://unpkg.com/spectre.css/dist/spectre-icons.min.css'
220
+ }
221
+ iconlibLink.href = iconLibMap[data.options.iconlib]
222
+ iconlibSelect.value = data.options.iconlib
223
+
224
+ // object_layout
225
+ objectLayoutSelect.value = data.options.object_layout
226
+
227
+ // show_errors
228
+ showErrorsSelect.value = data.options.show_errors
229
+
230
+ // boolean values
231
+ let booleanOptions = booleanOptionsSelect.children
232
+ for (let i = 0; i < booleanOptions.length; i++) {
233
+ const booleanValue = booleanOptions[i]
234
+ if (data.options[booleanValue.value]) {
235
+ booleanValue.selected = true
236
+ }
237
+ }
238
+
239
+ // libs
240
+ let libMapping = {
241
+ ace_editor: {
242
+ js: [
243
+ 'https://cdn.jsdelivr.net/npm/ace-editor-builds@1.2.4/src-min-noconflict/ace.js'
244
+ ],
245
+ css: []
246
+ },
247
+ choices: {
248
+ js: [
249
+ 'https://cdn.jsdelivr.net/npm/choices.js/public/assets/scripts/choices.min.js'
250
+ ],
251
+ css: [
252
+ 'https://cdn.jsdelivr.net/npm/choices.js/public/assets/styles/choices.min.css'
253
+ ]
254
+ },
255
+ cleavejs: {
256
+ js: [
257
+ 'https://cdn.jsdelivr.net/npm/cleave.js@1.4.7/dist/cleave.min.js'
258
+ ],
259
+ css: []
260
+ },
261
+ sceditor: {
262
+ js: [
263
+ 'https://cdn.jsdelivr.net/npm/jquery@3.3.1/dist/jquery.min.js',
264
+ 'https://cdn.jsdelivr.net/npm/sceditor@2.1.3/minified/sceditor.min.js',
265
+ 'https://cdn.jsdelivr.net/npm/sceditor@2.1.3/minified/formats/bbcode.js',
266
+ 'https://cdn.jsdelivr.net/npm/sceditor@2.1.3/minified/formats/xhtml.js'
267
+ ],
268
+ css: [
269
+ 'https://cdn.jsdelivr.net/npm/sceditor@2.1.3/minified/themes/default.min.css'
270
+ ]
271
+ },
272
+ simplemde: {
273
+ js: [
274
+ 'https://cdn.jsdelivr.net/simplemde/latest/simplemde.min.js'
275
+ ],
276
+ css: [
277
+ 'https://cdn.jsdelivr.net/simplemde/latest/simplemde.min.css'
278
+ ]
279
+ },
280
+ select2: {
281
+ js: [
282
+ 'https://cdn.jsdelivr.net/npm/jquery@3.3.1/dist/jquery.min.js',
283
+ 'https://cdn.jsdelivr.net/npm/select2@4.0.6-rc.1/dist/js/select2.min.js'
284
+ ],
285
+ css: [
286
+ 'https://cdn.jsdelivr.net/npm/select2@4.0.6-rc.1/dist/css/select2.min.css'
287
+ ]
288
+ },
289
+ selectize: {
290
+ js: [
291
+ 'https://cdn.jsdelivr.net/npm/selectize@0.12.6/dist/js/standalone/selectize.min.js'
292
+ ],
293
+ css: [
294
+ 'https://cdn.jsdelivr.net/npm/selectize@0.12.6/dist/css/selectize.min.css',
295
+ 'https://cdn.jsdelivr.net/npm/selectize@0.12.6/dist/css/selectize.default.min.css'
296
+ ]
297
+ },
298
+ flatpickr: {
299
+ js: [
300
+ 'https://cdn.jsdelivr.net/npm/flatpickr'
301
+ ],
302
+ css: [
303
+ 'https://cdn.jsdelivr.net/npm/flatpickr/dist/flatpickr.min.css'
304
+ ]
305
+ },
306
+ signature_pad: {
307
+ js: [
308
+ 'https://cdn.jsdelivr.net/npm/signature_pad@2.3.2/dist/signature_pad.min.js'
309
+ ],
310
+ css: []
311
+ },
312
+ mathjs: {
313
+ js: [
314
+ 'https://cdn.jsdelivr.net/npm/mathjs@5.3.1/dist/math.min.js'
315
+ ],
316
+ css: []
317
+ },
318
+ }
319
+
320
+ if (data.selectedLibs || data.unselectedLibs) {
321
+
322
+ let booleanOptions = booleanOptionsSelect.children
323
+ for (let i = 0; i < booleanOptions.length; i++) {
324
+ const booleanValue = booleanOptions[i]
325
+ if (data.options[booleanValue.value]) {
326
+ booleanValue.selected = true
327
+ }
328
+ }
329
+
330
+ const libSelectChildren = libSelect.children
331
+ for (let i = 0; i < libSelectChildren.length; i++) {
332
+ const child = libSelectChildren[i]
333
+ child.selected = data.selectedLibs.includes(child.value)
334
+ }
335
+
336
+ // remove libraries
337
+ data.unselectedLibs.forEach((selectedLib) => {
338
+ const concat = libMapping[selectedLib].js.concat(libMapping[selectedLib].css)
339
+ concat.forEach(() => {
340
+ const className = '.external_' + selectedLib
341
+ const toRemove = head.querySelector(className)
342
+ if (toRemove) {
343
+ toRemove.parentNode.removeChild(toRemove)
344
+ }
345
+ })
346
+ })
347
+
348
+ // add libraries
349
+ data.selectedLibs.forEach((selectedLib) => {
350
+ // add js
351
+ libMapping[selectedLib].js.forEach((js) => {
352
+ let scriptElement = document.createElement('script')
353
+ scriptElement.type = 'text/javascript'
354
+ scriptElement.src = js
355
+ scriptElement.async = false
356
+ scriptElement.classList.add('external_' + selectedLib)
357
+ head.appendChild(scriptElement)
358
+ })
359
+ // add css
360
+ libMapping[selectedLib].css.forEach((css) => {
361
+ const linkElement = document.createElement('link')
362
+ linkElement.setAttribute('rel', 'stylesheet')
363
+ linkElement.setAttribute('type', 'text/css')
364
+ linkElement.setAttribute('href', css)
365
+ linkElement.classList.add('external_' + selectedLib)
366
+ head.appendChild(linkElement)
367
+ })
368
+ })
369
+ }
370
+
371
+ initJsoneditor()
372
+ }
373
+
374
+ /* --------------------------------------------------------- initJsoneditor */
375
+
376
+ const initJsoneditor = () => {
377
+ // destroy old JSONEditor instance if exists
378
+ if (jsoneditor) {
379
+ jsoneditor.destroy()
380
+ }
381
+
382
+ // new instance of JSONEditor
383
+ jsoneditor = new window.JSONEditor(jsonEditorForm, data.options)
384
+
385
+ // listen for changes
386
+ jsoneditor.on('change', function () {
387
+ // output
388
+ let json = jsoneditor.getValue()
389
+ outputTextarea.value = JSON.stringify(json, null, 2)
390
+
391
+ // validate
392
+ let validationErrors = jsoneditor.validate()
393
+ if (validationErrors.length) {
394
+ validateTextarea.value = JSON.stringify(validationErrors, null, 2)
395
+ } else {
396
+ validateTextarea.value = 'valid'
397
+ }
398
+ })
399
+ updateDirectLink()
400
+ }
401
+
402
+ /* ------------------------------------------------------- updateDirectLink */
403
+
404
+ const updateDirectLink = () => {
405
+ let url = window.location.href.replace(/\?.*/, '')
406
+ url += '?data='
407
+ url += LZString.compressToBase64(JSON.stringify(data))
408
+ directLink.href = url
409
+ }
410
+
411
+ /* -------------------------------------------------------- event listeners */
412
+
413
+ setValue.addEventListener('click', function () {
414
+ jsoneditor.setValue(JSON.parse(outputTextarea.value))
415
+ })
416
+
417
+ setSchema.addEventListener('click', function () {
418
+ try {
419
+ data.options.schema = JSON.parse(schemaTextarea.value)
420
+ } catch (e) {
421
+ alert('Invalid Schema: ' + e.message)
422
+ return
423
+ }
424
+ refreshUI()
425
+ })
426
+
427
+ themeSelect.addEventListener('change', function () {
428
+ data.options.theme = this.value || ''
429
+ refreshUI()
430
+ })
431
+
432
+ iconlibSelect.addEventListener('change', function () {
433
+ data.options.iconlib = this.value || ''
434
+ refreshUI()
435
+ })
436
+
437
+ objectLayoutSelect.addEventListener('change', function () {
438
+ data.options.object_layout = this.value || ''
439
+ refreshUI()
440
+ })
441
+
442
+ showErrorsSelect.addEventListener('change', function () {
443
+ data.options.show_errors = this.value || ''
444
+ refreshUI()
445
+ })
446
+
447
+ booleanOptionsSelect.addEventListener('change', function () {
448
+ let booleanOptions = this.children
449
+ for (let i = 0; i < booleanOptions.length; i++) {
450
+ data.options[booleanOptions[i].value] = booleanOptions[i].selected
451
+ }
452
+ refreshUI()
453
+ })
454
+
455
+ libSelect.addEventListener('change', function () {
456
+ data.selectedLibs = []
457
+ data.unselectedLibs = []
458
+
459
+ const libs = this.children
460
+
461
+ for (let i = 0; i < libs.length; i++) {
462
+ if (libs[i].selected) {
463
+ data.selectedLibs.push(libs[i].value)
464
+ } else {
465
+ data.unselectedLibs.push(libs[i].value)
466
+ }
467
+ }
468
+ refreshUI()
469
+ })
470
+
471
+ parseUrl()
472
+
473
+ </script>
474
+ </body>
475
+ </html>
@@ -0,0 +1,137 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta charset="utf-8" />
5
+ <title>Advanced JSON Editor Example</title>
6
+
7
+ <script src="../../dist/jsoneditor.js"></script>
8
+ </head>
9
+ <body>
10
+ <h1>Advanced JSON Editor Example</h1>
11
+
12
+ <p>This example demonstrates the following:</p>
13
+ <ul>
14
+ <li>Loading external schemas via ajax (using $ref)</li>
15
+ <li>Setting the editor's value from javascript (try the Restore to Default button)</li>
16
+ <li>Validating the editor's contents (try setting name to an empty string)</li>
17
+ <li>Macro templates (try changing the city or state fields and watch the citystate field update automatically)</li>
18
+ <li>Enabling and disabling editor fields</li>
19
+ </ul>
20
+
21
+ <button id='submit'>Submit (console.log)</button>
22
+ <button id='restore'>Restore to Default</button>
23
+ <button id='enable_disable'>Disable/Enable Form</button>
24
+ <span id='valid_indicator'></span>
25
+
26
+ <div id='editor_holder'></div>
27
+
28
+ <script>
29
+ // This is the starting value for the editor
30
+ // We will use this to seed the initial editor
31
+ // and to provide a "Restore to Default" button.
32
+ var starting_value = [
33
+ {
34
+ name: "John Smith",
35
+ age: 35,
36
+ gender: "male",
37
+ location: {
38
+ city: "San Francisco",
39
+ state: "California",
40
+ citystate: ""
41
+ },
42
+ pets: [
43
+ {
44
+ name: "Spot",
45
+ type: "dog",
46
+ fixed: true
47
+ },
48
+ {
49
+ name: "Whiskers",
50
+ type: "cat",
51
+ fixed: false
52
+ }
53
+ ]
54
+ }
55
+ ];
56
+
57
+ // Initialize the editor
58
+ var editor = new JSONEditor(document.getElementById('editor_holder'),{
59
+ // Enable fetching schemas via ajax
60
+ ajax: true,
61
+
62
+ // The schema for the editor
63
+ schema: {
64
+ type: "array",
65
+ title: "People",
66
+ format: "tabs",
67
+ items: {
68
+ title: "Person",
69
+ headerTemplate: "{{i}} - {{self.name}}",
70
+ oneOf: [
71
+ {
72
+ $ref: "../fixtures/basic_person.json",
73
+ title: "Basic Person"
74
+ },
75
+ {
76
+ $ref: "../fixtures/person.json",
77
+ title: "Complex Person"
78
+ }
79
+ ]
80
+ }
81
+ },
82
+
83
+ // Seed the form with a starting value
84
+ startval: starting_value,
85
+
86
+ // Disable additional properties
87
+ no_additional_properties: true,
88
+
89
+ // Require all properties by default
90
+ required_by_default: true
91
+ });
92
+
93
+ // Hook up the submit button to log to the console
94
+ document.getElementById('submit').addEventListener('click',function() {
95
+ // Get the value from the editor
96
+ console.log(editor.getValue());
97
+ });
98
+
99
+ // Hook up the Restore to Default button
100
+ document.getElementById('restore').addEventListener('click',function() {
101
+ editor.setValue(starting_value);
102
+ });
103
+
104
+ // Hook up the enable/disable button
105
+ document.getElementById('enable_disable').addEventListener('click',function() {
106
+ // Enable form
107
+ if(!editor.isEnabled()) {
108
+ editor.enable();
109
+ }
110
+ // Disable form
111
+ else {
112
+ editor.disable();
113
+ }
114
+ });
115
+
116
+ // Hook up the validation indicator to update its
117
+ // status whenever the editor changes
118
+ editor.on('change',function() {
119
+ // Get an array of errors from the validator
120
+ var errors = editor.validate();
121
+
122
+ var indicator = document.getElementById('valid_indicator');
123
+
124
+ // Not valid
125
+ if(errors.length) {
126
+ indicator.style.color = 'red';
127
+ indicator.textContent = "not valid";
128
+ }
129
+ // Valid
130
+ else {
131
+ indicator.style.color = 'green';
132
+ indicator.textContent = "valid";
133
+ }
134
+ });
135
+ </script>
136
+ </body>
137
+ </html>
@@ -0,0 +1,80 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta charset="utf-8"/>
5
+ <title>oneOf</title>
6
+ <link rel="stylesheet" id="theme-link" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css">
7
+ <link rel="stylesheet" id="iconlib-link" href="https://use.fontawesome.com/releases/v5.6.1/css/all.css">
8
+ <script src="../../dist/jsoneditor.js"></script>
9
+ </head>
10
+ <body>
11
+
12
+ <div class="container">
13
+ <textarea class="value form-control" rows="10"></textarea>
14
+ <button class='get-value'>Get Value</button>
15
+ <button class='set-value'>Set Value</button>
16
+ <div class='json-editor-container'></div>
17
+ </div>
18
+
19
+
20
+ <script>
21
+ var jsonEditorContainer = document.querySelector('.json-editor-container');
22
+ var value = document.querySelector('.value');
23
+
24
+ var schema = {
25
+ "title": "Person",
26
+ "type": "object",
27
+ "required": [
28
+ "age"
29
+ ],
30
+ "properties": {
31
+ "age": {
32
+ "anyOf": [
33
+ {
34
+ "type": "number",
35
+ "title": "Value, number"
36
+ },
37
+ {
38
+ "type": "string",
39
+ "title": "Value, string",
40
+ "minLength": 1
41
+ },
42
+ {
43
+ "type": "null",
44
+ "title": "Value, null"
45
+ }
46
+ ]
47
+ }
48
+ }
49
+ }
50
+
51
+ var editor = new JSONEditor(jsonEditorContainer, {
52
+ schema: schema,
53
+ theme: 'bootstrap4',
54
+ show_errors: 'always',
55
+ iconlib: 'fontawesome5',
56
+ object_layout: 'normal',
57
+ disable_collapse: true,
58
+ disable_edit_json: true,
59
+ disable_properties: true,
60
+ use_default_values: false,
61
+ required_by_default: true,
62
+ disable_array_reorder: true,
63
+ disable_array_delete_all_rows: true,
64
+ disable_array_delete_last_row: true,
65
+ keep_oneof_values: false
66
+ });
67
+
68
+ document.querySelector('.get-value').addEventListener('click', function () {
69
+ value.value = JSON.stringify(editor.getValue());
70
+ console.log(editor.getValue());
71
+ });
72
+
73
+ document.querySelector('.set-value').addEventListener('click', function () {
74
+ editor.setValue({number_range: 2})
75
+ });
76
+
77
+ </script>
78
+
79
+ </body>
80
+ </html>