@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,89 @@
1
+ import { StringEditor } from './string.js'
2
+ import { extend } from '../utilities.js'
3
+
4
+ export class AceEditor extends StringEditor {
5
+ setValue (value, initial, fromTemplate) {
6
+ const res = super.setValue(value, initial, fromTemplate)
7
+ if (res !== undefined && res.changed && this.ace_editor_instance) {
8
+ this.ace_editor_instance.setValue(res.value)
9
+ this.ace_editor_instance.session.getSelection().clearSelection()
10
+ this.ace_editor_instance.resize()
11
+ }
12
+ }
13
+
14
+ build () {
15
+ this.options.format = 'textarea' /* Force format into "textarea" */
16
+ super.build()
17
+ this.input_type = this.schema.format /* Restore original format */
18
+ this.input.setAttribute('data-schemaformat', this.input_type)
19
+ }
20
+
21
+ afterInputReady () {
22
+ let options
23
+
24
+ if (window.ace) {
25
+ let mode = this.input_type
26
+ /* aliases for c/cpp */
27
+ if (mode === 'cpp' || mode === 'c++' || mode === 'c') mode = 'c_cpp'
28
+
29
+ /* Get options, either global options from "this.defaults.options.ace" or */
30
+ /* single property options from schema "options.ace" */
31
+ options = this.expandCallbacks('ace', extend({}, {
32
+ selectionStyle: 'text',
33
+ minLines: 30,
34
+ maxLines: 30
35
+ }, this.defaults.options.ace || {}, this.options.ace || {}, {
36
+ mode: `ace/mode/${mode}`
37
+ }))
38
+
39
+ this.ace_container = document.createElement('div')
40
+ this.ace_container.style.width = '100%'
41
+ this.ace_container.style.position = 'relative'
42
+ /* this.ace_container.style.height = '400px'; */
43
+ this.input.parentNode.insertBefore(this.ace_container, this.input)
44
+ this.input.style.display = 'none'
45
+
46
+ this.ace_editor_instance = window.ace.edit(this.ace_container, options)
47
+
48
+ this.ace_editor_instance.setValue(this.getValue())
49
+ this.ace_editor_instance.session.getSelection().clearSelection()
50
+ this.ace_editor_instance.resize()
51
+
52
+ if (this.schema.readOnly || this.schema.readonly || this.schema.template) {
53
+ this.ace_editor_instance.setReadOnly(true)
54
+ }
55
+
56
+ /* Listen for changes */
57
+ this.ace_editor_instance.on('change', () => {
58
+ this.input.value = this.ace_editor_instance.getValue()
59
+ this.refreshValue()
60
+ this.is_dirty = true
61
+ this.onChange(true)
62
+ })
63
+
64
+ this.theme.afterInputReady(this.input)
65
+ } else super.afterInputReady() /* Library not loaded, so just treat this as a string */
66
+ }
67
+
68
+ getNumColumns () {
69
+ return 6
70
+ }
71
+
72
+ enable () {
73
+ if (!this.always_disabled && this.ace_editor_instance) this.ace_editor_instance.setReadOnly(false)
74
+ super.enable()
75
+ }
76
+
77
+ disable (alwaysDisabled) {
78
+ if (this.ace_editor_instance) this.ace_editor_instance.setReadOnly(true)
79
+ super.disable(alwaysDisabled)
80
+ }
81
+
82
+ destroy () {
83
+ if (this.ace_editor_instance) {
84
+ this.ace_editor_instance.destroy()
85
+ this.ace_editor_instance = null
86
+ }
87
+ super.destroy()
88
+ }
89
+ }
@@ -0,0 +1,103 @@
1
+ import { MultiSelectEditor } from '../multiselect.js'
2
+ import { extend } from '../../utilities.js'
3
+
4
+ export class ArrayChoicesEditor extends MultiSelectEditor {
5
+ setValue (value, initial) {
6
+ if (this.choices_instance) {
7
+ /* Make sure we are dealing with an array of strings so we can check for strict equality */
8
+ value = [].concat(value).map(e => `${e}`)
9
+
10
+ this.updateValue(value) /* Sets this.value to sanitized value */
11
+
12
+ this.choices_instance.removeActiveItems() /* Remove existing selection */
13
+ this.choices_instance.setChoiceByValue(this.value) /* Set new selection */
14
+
15
+ this.onChange(true)
16
+ } else super.setValue(value, initial)
17
+ }
18
+
19
+ afterInputReady () {
20
+ if (window.Choices && !this.choices_instance) {
21
+ /* Get options, either global options from "this.defaults.options.choices" or */
22
+ /* single property options from schema "options.choices" */
23
+ const options = this.expandCallbacks('choices', extend({}, {
24
+ removeItems: true,
25
+ removeItemButton: true
26
+ }, this.defaults.options.choices || {}, this.options.choices || {}, {
27
+ addItems: true,
28
+ editItems: false,
29
+ duplicateItemsAllowed: false
30
+ }))
31
+
32
+ /* New items are allowed if option "addItems" is true and items type is "string" */
33
+ /* this.newEnumAllowed = options.addItems = !!options.addItems && this.schema.items && this.schema.items.type == 'string'; */
34
+
35
+ /* Choices doesn't support adding new items to select type input */
36
+ this.newEnumAllowed = false
37
+
38
+ this.choices_instance = new window.Choices(this.input, options)
39
+
40
+ /* Remove change handler set in parent class (src/multiselect.js) */
41
+ this.control.removeEventListener('change', this.multiselectChangeHandler)
42
+
43
+ /* Create a new change handler */
44
+ this.multiselectChangeHandler = e => {
45
+ const value = this.choices_instance.getValue(true)
46
+ this.updateValue(value)
47
+ this.onChange(true)
48
+ }
49
+ this.control.addEventListener('change', this.multiselectChangeHandler, false)
50
+ }
51
+ super.afterInputReady()
52
+ }
53
+
54
+ updateValue (value) {
55
+ value = [].concat(value)
56
+ let changed = false; const newValue = []
57
+ for (let i = 0; i < value.length; i++) {
58
+ if (!this.select_values[`${value[i]}`]) {
59
+ changed = true
60
+ if (this.newEnumAllowed) {
61
+ if (!this.addNewOption(value[i])) continue
62
+ } else continue
63
+ }
64
+ const sanitized = this.sanitize(this.select_values[value[i]])
65
+ newValue.push(sanitized)
66
+ if (sanitized !== value[i]) changed = true
67
+ }
68
+ this.value = newValue
69
+
70
+ return changed
71
+ }
72
+
73
+ addNewOption (value) {
74
+ /* Add new value and label */
75
+ this.option_keys.push(`${value}`)
76
+ this.option_titles.push(`${value}`)
77
+ this.select_values[`${value}`] = value
78
+ /* Update Schema enum to prevent triggering "Value must be one of the enumerated values" */
79
+ this.schema.items.enum.push(value)
80
+ /* Add new value and label to choices */
81
+ this.choices_instance.setChoices([{ value: `${value}`, label: `${value}` }], 'value', 'label', false)
82
+
83
+ return true
84
+ }
85
+
86
+ enable () {
87
+ if (!this.always_disabled && this.choices_instance) this.choices_instance.enable()
88
+ super.enable()
89
+ }
90
+
91
+ disable (alwaysDisabled) {
92
+ if (this.choices_instance) this.choices_instance.disable()
93
+ super.disable(alwaysDisabled)
94
+ }
95
+
96
+ destroy () {
97
+ if (this.choices_instance) {
98
+ this.choices_instance.destroy()
99
+ this.choices_instance = null
100
+ }
101
+ super.destroy()
102
+ }
103
+ }
@@ -0,0 +1,110 @@
1
+ import { MultiSelectEditor } from '../multiselect.js'
2
+ import { extend, hasOwnProperty } from '../../utilities.js'
3
+
4
+ export class ArraySelect2Editor extends MultiSelectEditor {
5
+ setValue (value, initial) {
6
+ if (this.select2_instance) {
7
+ /* Make sure we are dealing with an array of strings so we can check for strict equality */
8
+ value = [].concat(value).map(e => `${e}`)
9
+
10
+ this.updateValue(value) /* Sets this.value to sanitized value */
11
+
12
+ if (this.select2v4) this.select2_instance.val(this.value).change()
13
+ else this.select2_instance.select2('val', this.value)
14
+
15
+ this.onChange(true)
16
+ } else super.setValue(value, initial)
17
+ }
18
+
19
+ afterInputReady () {
20
+ let options
21
+
22
+ if (window.jQuery && window.jQuery.fn && window.jQuery.fn.select2 && !this.select2_instance) {
23
+ /* Get options, either global options from "this.defaults.options.select2" or */
24
+ /* single property options from schema "options.select2" */
25
+ options = this.expandCallbacks('select2', extend({}, {
26
+ tags: true,
27
+ width: '100%'
28
+ }, this.defaults.options.select2 || {}, this.options.select2 || {}))
29
+
30
+ /* New items are allowed if option "tags" is true and items type is "string" */
31
+ this.newEnumAllowed = options.tags = !!options.tags && this.schema.items && this.schema.items.type === 'string'
32
+
33
+ this.select2_instance = window.jQuery(this.input).select2(options)
34
+ this.select2v4 = hasOwnProperty(this.select2_instance.select2, 'amd')
35
+
36
+ this.selectChangeHandler = () => {
37
+ const value = this.select2v4 ? this.select2_instance.val() : this.select2_instance.select2('val')
38
+ this.updateValue(value)
39
+ this.onChange(true)
40
+ }
41
+
42
+ /* Add event handler. */
43
+ /* Note: Must use the "on()" method and not addEventListener() */
44
+ this.select2_instance.on('select2-blur', this.selectChangeHandler)
45
+ this.select2_instance.on('change', this.selectChangeHandler)
46
+ }
47
+ super.afterInputReady()
48
+ }
49
+
50
+ updateValue (value) {
51
+ value = [].concat(value)
52
+ let changed = false; const newValue = []
53
+ for (let i = 0; i < value.length; i++) {
54
+ /* if (!this.select_options[value[i]+'']) { */
55
+ if (!this.select_values[`${value[i]}`]) {
56
+ changed = true
57
+ if (this.newEnumAllowed) {
58
+ if (!this.addNewOption(value[i])) continue
59
+ } else continue
60
+ }
61
+ const sanitized = this.sanitize(this.select_values[value[i]])
62
+ newValue.push(sanitized)
63
+ if (sanitized !== value[i]) changed = true
64
+ }
65
+ this.value = newValue
66
+
67
+ return changed
68
+ }
69
+
70
+ addNewOption (value) {
71
+ /* Add new value and label */
72
+ this.option_keys.push(`${value}`)
73
+ this.option_titles.push(`${value}`)
74
+ this.select_values[`${value}`] = value
75
+ /* Update Schema enum to prevent triggering "Value must be one of the enumerated values" */
76
+ this.schema.items.enum.push(value)
77
+
78
+ const optionTag = this.input.querySelector(`option[value="${value}"]`)
79
+ /* Remove data attribute to make option tag permanent. (user input) */
80
+ if (optionTag) optionTag.removeAttribute('data-select2-tag')
81
+ /* Create new option tag (setValue) */
82
+ else this.input.appendChild(new Option(value, value, false, false)).trigger('change')
83
+
84
+ return true
85
+ }
86
+
87
+ enable () {
88
+ if (!this.always_disabled && this.select2_instance) {
89
+ if (this.select2v4) this.select2_instance.prop('disabled', false)
90
+ else this.select2_instance.select2('enable', true)
91
+ }
92
+ super.enable()
93
+ }
94
+
95
+ disable (alwaysDisabled) {
96
+ if (this.select2_instance) {
97
+ if (this.select2v4) this.select2_instance.prop('disabled', true)
98
+ else this.select2_instance.select2('enable', false)
99
+ }
100
+ super.disable()
101
+ }
102
+
103
+ destroy () {
104
+ if (this.select2_instance) {
105
+ this.select2_instance.select2('destroy')
106
+ this.select2_instance = null
107
+ }
108
+ super.destroy()
109
+ }
110
+ }
@@ -0,0 +1,103 @@
1
+ import { MultiSelectEditor } from '../multiselect.js'
2
+ import { extend } from '../../utilities.js'
3
+
4
+ export class ArraySelectizeEditor extends MultiSelectEditor {
5
+ setValue (value, initial) {
6
+ if (this.selectize_instance) {
7
+ /* Make sure we are dealing with an array of strings so we can check for strict equality */
8
+ value = [].concat(value).map(e => `${e}`)
9
+
10
+ this.updateValue(value) /* Sets this.value to sanitized value */
11
+
12
+ this.selectize_instance.setValue(this.value)
13
+
14
+ this.onChange(true)
15
+ } else super.setValue(value, initial)
16
+ }
17
+
18
+ afterInputReady () {
19
+ let options
20
+
21
+ if (window.jQuery && window.jQuery.fn && window.jQuery.fn.selectize && !this.selectize_instance) {
22
+ /* Get options, either global options from "this.defaults.options.selectize" or */
23
+ /* single property options from schema "options.selectize" */
24
+ options = this.expandCallbacks('selectize', extend({}, {
25
+ plugins: ['remove_button'],
26
+ delimiter: false,
27
+ createOnBlur: true,
28
+ create: true
29
+ }, this.defaults.options.selectize || {}, this.options.selectize || {}))
30
+
31
+ /* New items are allowed if option "create" is true and items type is "string" */
32
+ this.newEnumAllowed = options.create = !!options.create && this.schema.items && this.schema.items.type === 'string'
33
+
34
+ this.selectize_instance = (window.jQuery(this.input).selectize(options))[0].selectize
35
+
36
+ /* Remove change handler set in parent class (src/multiselect.js) */
37
+ this.control.removeEventListener('change', this.multiselectChangeHandler)
38
+
39
+ /* Create a new change handler */
40
+ this.multiselectChangeHandler = e => {
41
+ const value = this.selectize_instance.getValue()
42
+ this.updateValue(value)
43
+ this.onChange(true)
44
+ }
45
+
46
+ /* Add new event handler. */
47
+ /* Note: Must use the "on()" method and not addEventListener() */
48
+ this.selectize_instance.on('change', this.multiselectChangeHandler)
49
+ }
50
+ super.afterInputReady()
51
+ }
52
+
53
+ updateValue (value) {
54
+ value = [].concat(value)
55
+ let changed = false; const newValue = []
56
+ for (let i = 0; i < value.length; i++) {
57
+ /* if (!this.select_options[value[i]+'']) { */
58
+ if (!this.select_values[`${value[i]}`]) {
59
+ changed = true
60
+ if (this.newEnumAllowed) {
61
+ if (!this.addNewOption(value[i])) continue
62
+ } else continue
63
+ }
64
+ const sanitized = this.sanitize(this.select_values[value[i]])
65
+ newValue.push(sanitized)
66
+ if (sanitized !== value[i]) changed = true
67
+ }
68
+ this.value = newValue
69
+
70
+ return changed
71
+ }
72
+
73
+ addNewOption (value) {
74
+ /* Add new value and label */
75
+ this.option_keys.push(`${value}`)
76
+ this.option_titles.push(`${value}`)
77
+ this.select_values[`${value}`] = value
78
+ /* Update Schema enum to prevent triggering "Value must be one of the enumerated values" */
79
+ this.schema.items.enum.push(value)
80
+ /* Add new value and label to selectize */
81
+ this.selectize_instance.addOption({ text: value, value })
82
+
83
+ return true
84
+ }
85
+
86
+ enable () {
87
+ if (!this.always_disabled && this.selectize_instance) this.selectize_instance.unlock()
88
+ super.enable()
89
+ }
90
+
91
+ disable (alwaysDisabled) {
92
+ if (this.selectize_instance) this.selectize_instance.lock()
93
+ super.disable(alwaysDisabled)
94
+ }
95
+
96
+ destroy () {
97
+ if (this.selectize_instance) {
98
+ this.selectize_instance.destroy()
99
+ this.selectize_instance = null
100
+ }
101
+ super.destroy()
102
+ }
103
+ }
@@ -0,0 +1,9 @@
1
+ .json-editor-btntype-toggle {
2
+ margin: 0 10px 0 0;
3
+ }
4
+
5
+ .je-array-control-btn {
6
+ width: 100%;
7
+ text-align: left;
8
+ margin-bottom: 3px
9
+ }
@@ -0,0 +1,3 @@
1
+ /* eslint-disable */
2
+ export default {".json-editor-btntype-toggle":"margin:0%2010px%200%200",".je-array-control-btn":"width:100%25;text-align:left;margin-bottom:3px"}
3
+ /* eslint-enable */