@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,690 @@
1
+ import { AbstractTheme } from '../theme.js'
2
+ import rules from './bootstrap4.css.js'
3
+ import { trigger } from '../utilities'
4
+
5
+ /* Theme config options that allows changing various aspects of the output */
6
+ const options = {
7
+ disable_theme_rules: false,
8
+ input_size: 'normal', /* Size of input and select elements. "small", "normal", "large" */
9
+ custom_forms: false, /* use twbs custom form stylings */
10
+ object_indent: true, /* Indent nested object elements (use nested .card layout) */
11
+ object_background: 'bg-light', /* Bootstrap 4 card background modifier class (https://getbootstrap.com/docs/4.1/getting-started/introduction/) */
12
+ object_text: '', /* Bootstrap 4 card tect color modifier class (https://getbootstrap.com/docs/4.1/getting-started/introduction/) */
13
+ table_border: false, /* Add border to array "table" row and cells */
14
+ table_zebrastyle: false, /* Add "zebra style" to array "table" rows */
15
+ tooltip: 'bootstrap' /* how to display tooltips (infoText). Can be `browser` for native `title`, `css` for simple CSS Styling, or `bootstrap` for TWBS/Popper.js handling */
16
+ }
17
+
18
+ export class bootstrap4Theme extends AbstractTheme {
19
+ constructor (jsoneditor) {
20
+ super(jsoneditor, options)
21
+ }
22
+
23
+ getSelectInput (options, multiple) {
24
+ const el = super.getSelectInput(options)
25
+ el.classList.add('form-control')
26
+
27
+ if (this.options.custom_forms === false) {
28
+ if (this.options.input_size === 'small') el.classList.add('form-control-sm')
29
+ if (this.options.input_size === 'large') el.classList.add('form-control-lg')
30
+ } else {
31
+ el.classList.remove('form-control')
32
+ el.classList.add('custom-select')
33
+ if (this.options.input_size === 'small') el.classList.add('custom-select-sm')
34
+ if (this.options.input_size === 'large') el.classList.add('custom-select-lg')
35
+ }
36
+
37
+ return el
38
+ }
39
+
40
+ getContainer () {
41
+ const el = document.createElement('div')
42
+ if (!this.options.object_indent) el.classList.add('je-noindent')
43
+ return el
44
+ }
45
+
46
+ setGridColumnSize (el, size, offset) {
47
+ el.classList.add(`col-md-${size}`)
48
+
49
+ if (offset) {
50
+ el.classList.add(`offset-md-${offset}`)
51
+ }
52
+ }
53
+
54
+ afterInputReady (input) {
55
+ if (input.controlgroup) return
56
+
57
+ /* set id/for */
58
+ /* is not working for: [type=file], [type=checkbox] */
59
+ const id = input.name
60
+ input.id = id
61
+ /* 2x parentNode, b/c range input has an <div> wrapper */
62
+ const label = input.parentNode.parentNode.getElementsByTagName('label')[0]
63
+ if (label) {
64
+ label.htmlFor = id
65
+ }
66
+
67
+ input.controlgroup = this.closest(input, '.form-group')
68
+ }
69
+
70
+ getTextareaInput () {
71
+ const el = document.createElement('textarea')
72
+ el.classList.add('form-control')
73
+ if (this.options.input_size === 'small') el.classList.add('form-control-sm')
74
+ if (this.options.input_size === 'large') el.classList.add('form-control-lg')
75
+ return el
76
+ }
77
+
78
+ getRangeInput (min, max, step) {
79
+ const el = super.getRangeInput(min, max, step)
80
+
81
+ if (this.options.custom_forms === true) {
82
+ el.classList.remove('form-control')
83
+ el.classList.add('custom-range')
84
+ }
85
+
86
+ return el
87
+ }
88
+
89
+ getStepperButtons (input) {
90
+ const inputGroup = document.createElement('div')
91
+ const prepend = document.createElement('div')
92
+ const append = document.createElement('div')
93
+
94
+ const minusBtn = document.createElement('button')
95
+ minusBtn.setAttribute('type', 'button')
96
+
97
+ const plusBtn = document.createElement('button')
98
+ plusBtn.setAttribute('type', 'button')
99
+
100
+ inputGroup.appendChild(prepend)
101
+ inputGroup.appendChild(input)
102
+ inputGroup.appendChild(append)
103
+ prepend.appendChild(minusBtn)
104
+ append.appendChild(plusBtn)
105
+
106
+ inputGroup.classList.add('input-group')
107
+ prepend.classList.add('input-group-prepend')
108
+ append.classList.add('input-group-append')
109
+ minusBtn.classList.add('btn')
110
+ minusBtn.classList.add('btn-secondary')
111
+ minusBtn.classList.add('stepper-down')
112
+ plusBtn.classList.add('btn')
113
+ plusBtn.classList.add('btn-secondary')
114
+ plusBtn.classList.add('stepper-up')
115
+
116
+ const readonly = input.getAttribute('readonly')
117
+
118
+ if (readonly) {
119
+ minusBtn.setAttribute('disabled', true)
120
+ plusBtn.setAttribute('disabled', true)
121
+ }
122
+
123
+ minusBtn.textContent = '-'
124
+ plusBtn.textContent = '+'
125
+
126
+ const initialize = (input, min) => {
127
+ if (min) {
128
+ input.value = Number(min)
129
+ } else {
130
+ input.value = Number(input.value)
131
+ }
132
+ input.setAttribute('initialized', '1')
133
+ }
134
+
135
+ const min = input.getAttribute('min')
136
+ const max = input.getAttribute('max')
137
+
138
+ minusBtn.addEventListener('click', () => {
139
+ if (!input.getAttribute('initialized')) {
140
+ initialize(input, min)
141
+ } else if (min) {
142
+ if (Number(input.value) > Number(min)) {
143
+ input.stepDown()
144
+ }
145
+ } else {
146
+ input.stepDown()
147
+ }
148
+ trigger(input, 'change')
149
+ })
150
+
151
+ plusBtn.addEventListener('click', () => {
152
+ if (!input.getAttribute('initialized')) {
153
+ initialize(input, min)
154
+ } else if (max) {
155
+ if (Number(input.value) < Number(max)) {
156
+ input.stepUp()
157
+ }
158
+ } else {
159
+ input.stepUp()
160
+ }
161
+ trigger(input, 'change')
162
+ })
163
+
164
+ return inputGroup
165
+ }
166
+
167
+ getFormInputField (type) {
168
+ const el = super.getFormInputField(type)
169
+ if (type !== 'checkbox' && type !== 'radio' && type !== 'file') {
170
+ el.classList.add('form-control')
171
+ if (this.options.input_size === 'small') el.classList.add('form-control-sm')
172
+ if (this.options.input_size === 'large') el.classList.add('form-control-lg')
173
+ }
174
+
175
+ if (type === 'file') {
176
+ /* custom_form is not used on files, would be a bit ticky since we need more */
177
+ /* markup. Also it contains language strings which would need be translateable? */
178
+ /* and most of all, w/o JavaScript teh name of the file can't be displayed. */
179
+ el.classList.add('form-control-file')
180
+ }
181
+
182
+ return el
183
+ }
184
+
185
+ getFormControl (label, input, description, infoText) {
186
+ const group = document.createElement('div')
187
+ group.classList.add('form-group')
188
+
189
+ if (label && (input.type === 'checkbox' || input.type === 'radio')) {
190
+ const check = document.createElement('div')
191
+
192
+ if (this.options.custom_forms === false) {
193
+ check.classList.add('form-check')
194
+ input.classList.add('form-check-input')
195
+ label.classList.add('form-check-label')
196
+ } else {
197
+ check.classList.add('custom-control')
198
+ input.classList.add('custom-control-input')
199
+ label.classList.add('custom-control-label')
200
+
201
+ if (input.type === 'checkbox') {
202
+ check.classList.add('custom-checkbox')
203
+ } else {
204
+ check.classList.add('custom-radio')
205
+ }
206
+ }
207
+
208
+ const unique = (Date.now() * Math.random()).toFixed(0)
209
+ input.setAttribute('id', unique)
210
+ label.setAttribute('for', unique)
211
+
212
+ check.appendChild(input)
213
+ check.appendChild(label)
214
+ if (infoText) check.appendChild(infoText)
215
+
216
+ group.appendChild(check)
217
+ } else {
218
+ if (label) {
219
+ group.appendChild(label)
220
+
221
+ if (infoText) group.appendChild(infoText)
222
+ }
223
+
224
+ group.appendChild(input)
225
+ }
226
+
227
+ if (description) {
228
+ group.appendChild(description)
229
+ }
230
+
231
+ return group
232
+ }
233
+
234
+ getInfoButton (text) {
235
+ const button = document.createElement('button') /* shoud be a <button> but no fitting tbws style... */
236
+ button.type = 'button'
237
+ button.classList.add('ml-3', 'jsoneditor-twbs4-text-button')
238
+ button.setAttribute('data-toggle', 'tooltip')
239
+ button.setAttribute('data-placement', 'auto')
240
+ button.title = text
241
+
242
+ const icon = document.createTextNode('ⓘ')
243
+ button.appendChild(icon)
244
+
245
+ if (this.options.tooltip === 'bootstrap') {
246
+ if (window.jQuery && window.jQuery().tooltip) {
247
+ window.jQuery(button).tooltip()
248
+ } else {
249
+ // eslint-disable-next-line no-console
250
+ console.warn('Could not find popper jQuery plugin of Bootstrap.')
251
+ }
252
+ } else if (this.options.tooltip === 'css') {
253
+ button.classList.add('je-tooltip')
254
+ } /* else -> nothing todo for native [title] handling */
255
+
256
+ return button
257
+ }
258
+
259
+ /**
260
+ * Generates a checkbox...
261
+ *
262
+ * Overwriten from master theme to get rid of inline styles.
263
+ */
264
+ getCheckbox () {
265
+ const el = this.getFormInputField('checkbox')
266
+ return el
267
+ }
268
+
269
+ /**
270
+ * Multiple checkboxes in a row.
271
+ *
272
+ */
273
+ getMultiCheckboxHolder (controls, label, description, infoText) {
274
+ const el = document.createElement('div')
275
+ el.classList.add('form-group')
276
+
277
+ if (label) {
278
+ el.appendChild(label)
279
+
280
+ if (infoText) {
281
+ label.appendChild(infoText)
282
+ }
283
+ }
284
+
285
+ /* for inline view we need an container so it doesnt wrap in the "row" of the <label> */
286
+ const container = document.createElement('div')
287
+
288
+ Object.values(controls).forEach(c => {
289
+ /* controls are already parsed by getFormControl() so they have an .form-group */
290
+ /* wrapper we need to get rid of... */
291
+ const ctrl = c.firstChild
292
+
293
+ /* we don't know if this should be an normal / compact view */
294
+ /* if (this.options.custom_forms === false) {
295
+ ctrl.classList.add('form-check-inline')
296
+ } else {
297
+ ctrl.classList.add('custom-control-inline')
298
+ } */
299
+ container.appendChild(ctrl)
300
+ })
301
+
302
+ el.appendChild(container)
303
+
304
+ if (description) el.appendChild(description)
305
+
306
+ return el
307
+ }
308
+
309
+ /**
310
+ * Single radio element
311
+ */
312
+ getFormRadio (attributes) {
313
+ const el = this.getFormInputField('radio')
314
+
315
+ for (const key in attributes) {
316
+ el.setAttribute(key, attributes[key])
317
+ }
318
+
319
+ if (this.options.custom_forms === false) {
320
+ el.classList.add('form-check-input')
321
+ } else {
322
+ el.classList.add('custom-control-input')
323
+ }
324
+
325
+ return el
326
+ }
327
+
328
+ /**
329
+ * Add the <label> for the single radio from getFormRadio()
330
+ *
331
+ */
332
+ getFormRadioLabel (text, req) {
333
+ const el = document.createElement('label')
334
+
335
+ if (this.options.custom_forms === false) {
336
+ el.classList.add('form-check-label')
337
+ } else {
338
+ el.classList.add('custom-control-label')
339
+ }
340
+
341
+ el.appendChild(document.createTextNode(text))
342
+ return el
343
+ }
344
+
345
+ /**
346
+ * Stack the radios from getFormRadio()/getFormRadioLabel()
347
+ *
348
+ */
349
+ getFormRadioControl (label, input, compact) {
350
+ const el = document.createElement('div')
351
+
352
+ if (this.options.custom_forms === false) {
353
+ el.classList.add('form-check')
354
+ } else {
355
+ el.classList.add('custom-control', 'custom-radio')
356
+ }
357
+
358
+ el.appendChild(input)
359
+ el.appendChild(label)
360
+
361
+ if (compact) {
362
+ if (this.options.custom_forms === false) {
363
+ el.classList.add('form-check-inline')
364
+ } else {
365
+ el.classList.add('custom-control-inline')
366
+ }
367
+ }
368
+
369
+ return el
370
+ }
371
+
372
+ getIndentedPanel () {
373
+ const el = document.createElement('div')
374
+ el.classList.add('card', 'card-body', 'mb-3')
375
+
376
+ if (this.options.object_background) {
377
+ el.classList.add(this.options.object_background)
378
+ }
379
+
380
+ if (this.options.object_text) {
381
+ el.classList.add(this.options.object_text)
382
+ }
383
+
384
+ /* for better twbs card styling we should be able to return a nested div */
385
+
386
+ return el
387
+ }
388
+
389
+ getFormInputDescription (text) {
390
+ const el = document.createElement('small')
391
+ el.classList.add('form-text')
392
+
393
+ if (window.DOMPurify) {
394
+ el.innerHTML = window.DOMPurify.sanitize(text)
395
+ } else {
396
+ el.textContent = this.cleanText(text)
397
+ }
398
+
399
+ return el
400
+ }
401
+
402
+ getHeader (text, pathDepth) {
403
+ /* var cardHeader = document.createElement('div') */
404
+ /* cardHeader.classList.add('card-header') */
405
+
406
+ const el = document.createElement('h3')
407
+ el.classList.add('card-title')
408
+
409
+ if (typeof text === 'string') {
410
+ el.textContent = text
411
+ } else {
412
+ el.appendChild(text)
413
+ }
414
+
415
+ el.style.display = 'inline-block'
416
+
417
+ /* cardHeader.appendChild(el) */
418
+
419
+ return el
420
+ }
421
+
422
+ getHeaderButtonHolder () {
423
+ const el = this.getButtonHolder()
424
+
425
+ return el
426
+ }
427
+
428
+ getButtonHolder () {
429
+ const el = document.createElement('span')
430
+ el.classList.add('btn-group')
431
+ return el
432
+ }
433
+
434
+ getFormButtonHolder (buttonAlign) {
435
+ const el = this.getButtonHolder()
436
+ el.classList.add('d-block')
437
+
438
+ if (buttonAlign === 'center') el.classList.add('text-center')
439
+ else if (buttonAlign === 'right') el.classList.add('text-right')
440
+
441
+ return el
442
+ }
443
+
444
+ getButton (text, icon, title) {
445
+ const el = super.getButton(text, icon, title)
446
+ el.classList.add('btn', 'btn-secondary', 'btn-sm')
447
+ return el
448
+ }
449
+
450
+ getTableContainer () {
451
+ const el = super.getTableContainer()
452
+ el.classList.add('table-responsive')
453
+ return el
454
+ }
455
+
456
+ getTable () {
457
+ const el = document.createElement('table')
458
+ el.classList.add('table', 'table-sm')
459
+
460
+ if (this.options.table_border) {
461
+ el.classList.add('table-bordered')
462
+ }
463
+
464
+ if (this.options.table_zebrastyle) {
465
+ el.classList.add('table-striped')
466
+ }
467
+
468
+ return el
469
+ }
470
+
471
+ getErrorMessage (text) {
472
+ const el = document.createElement('div')
473
+ el.classList.add('alert', 'alert-danger')
474
+ el.setAttribute('role', 'alert')
475
+ el.appendChild(document.createTextNode(text))
476
+ return el
477
+ }
478
+
479
+ /**
480
+ * input validation on <input>
481
+ */
482
+ addInputError (input, text) {
483
+ if (!input.controlgroup) return
484
+
485
+ input.controlgroup.classList.add('is-invalid')
486
+
487
+ if (!input.errmsg) {
488
+ input.errmsg = document.createElement('p')
489
+ input.errmsg.classList.add('invalid-feedback')
490
+ input.controlgroup.appendChild(input.errmsg)
491
+ input.errmsg.style.display = 'block'
492
+ }
493
+
494
+ input.errmsg.style.display = 'block'
495
+ input.errmsg.textContent = text
496
+ }
497
+
498
+ removeInputError (input) {
499
+ if (!input.errmsg) return
500
+ input.errmsg.style.display = 'none'
501
+ input.controlgroup.classList.remove('is-invalid')
502
+ }
503
+
504
+ getTabHolder (propertyName) {
505
+ const el = document.createElement('div')
506
+ const pName = (typeof propertyName === 'undefined') ? '' : propertyName
507
+ el.innerHTML = `<div class='col-md-2' id='${pName}'><ul class='nav flex-column nav-pills'></ul></div><div class='col-md-10'><div class='tab-content' id='${pName}'></div></div>`
508
+ el.classList.add('row')
509
+ return el
510
+ }
511
+
512
+ addTab (holder, tab) {
513
+ holder.children[0].children[0].appendChild(tab)
514
+ }
515
+
516
+ getTabContentHolder (tabHolder) {
517
+ return tabHolder.children[1].children[0]
518
+ }
519
+
520
+ getTopTabHolder (propertyName) {
521
+ const pName = (typeof propertyName === 'undefined') ? '' : propertyName
522
+
523
+ const el = document.createElement('div')
524
+ el.classList.add('card')
525
+
526
+ el.innerHTML = `<div class='card-header'><ul class='nav nav-tabs card-header-tabs' id='${pName}'></ul></div><div class='card-body'><div class='tab-content' id='${pName}'></div></div>`
527
+
528
+ return el
529
+ }
530
+
531
+ getTab (text, tabId) {
532
+ const liel = document.createElement('li')
533
+ liel.classList.add('nav-item')
534
+
535
+ const ael = document.createElement('a')
536
+ ael.classList.add('nav-link')
537
+ ael.setAttribute('href', `#${tabId}`)
538
+ ael.setAttribute('data-toggle', 'tab')
539
+ ael.appendChild(text)
540
+
541
+ liel.appendChild(ael)
542
+
543
+ return liel
544
+ }
545
+
546
+ getTopTab (text, tabId) {
547
+ const el = document.createElement('li')
548
+ el.classList.add('nav-item')
549
+
550
+ const a = document.createElement('a')
551
+ a.classList.add('nav-link')
552
+ a.setAttribute('href', `#${tabId}`)
553
+ a.setAttribute('data-toggle', 'tab')
554
+ a.appendChild(text)
555
+
556
+ el.appendChild(a)
557
+
558
+ return el
559
+ }
560
+
561
+ getTabContent () {
562
+ const el = document.createElement('div')
563
+ el.classList.add('tab-pane')
564
+ el.setAttribute('role', 'tabpanel')
565
+ return el
566
+ }
567
+
568
+ getTopTabContent () {
569
+ const el = document.createElement('div')
570
+ el.classList.add('tab-pane')
571
+ el.setAttribute('role', 'tabpanel')
572
+ return el
573
+ }
574
+
575
+ markTabActive (row) {
576
+ row.tab.firstChild.classList.add('active')
577
+
578
+ if (typeof row.rowPane !== 'undefined') {
579
+ row.rowPane.classList.add('active')
580
+ } else {
581
+ row.container.classList.add('active')
582
+ }
583
+ }
584
+
585
+ markTabInactive (row) {
586
+ row.tab.firstChild.classList.remove('active')
587
+
588
+ if (typeof row.rowPane !== 'undefined') {
589
+ row.rowPane.classList.remove('active')
590
+ } else {
591
+ row.container.classList.remove('active')
592
+ }
593
+ }
594
+
595
+ insertBasicTopTab (tab, newTabsHolder) {
596
+ newTabsHolder.children[0].children[0].insertBefore(tab, newTabsHolder.children[0].children[0].firstChild)
597
+ }
598
+
599
+ addTopTab (holder, tab) {
600
+ holder.children[0].children[0].appendChild(tab)
601
+ }
602
+
603
+ getTopTabContentHolder (tabHolder) {
604
+ return tabHolder.children[1].children[0]
605
+ }
606
+
607
+ getFirstTab (holder) {
608
+ return holder.firstChild.firstChild.firstChild
609
+ }
610
+
611
+ getProgressBar () {
612
+ const min = 0
613
+ const max = 100
614
+ const start = 0
615
+
616
+ const container = document.createElement('div')
617
+ container.classList.add('progress')
618
+
619
+ const bar = document.createElement('div')
620
+ bar.classList.add('progress-bar')
621
+ bar.setAttribute('role', 'progressbar')
622
+ bar.setAttribute('aria-valuenow', start)
623
+ bar.setAttribute('aria-valuemin', min)
624
+ bar.setAttribute('aria-valuenax', max)
625
+ bar.innerHTML = `${start}%`
626
+ container.appendChild(bar)
627
+
628
+ return container
629
+ }
630
+
631
+ updateProgressBar (progressBar, progress) {
632
+ if (!progressBar) return
633
+
634
+ const bar = progressBar.firstChild
635
+ const percentage = `${progress}%`
636
+ bar.setAttribute('aria-valuenow', progress)
637
+ bar.style.width = percentage
638
+ bar.innerHTML = percentage
639
+ }
640
+
641
+ updateProgressBarUnknown (progressBar) {
642
+ if (!progressBar) return
643
+
644
+ const bar = progressBar.firstChild
645
+ progressBar.classList.add('progress', 'progress-striped', 'active')
646
+ bar.removeAttribute('aria-valuenow')
647
+ bar.style.width = '100%'
648
+ bar.innerHTML = ''
649
+ }
650
+
651
+ getBlockLink () {
652
+ const link = document.createElement('a')
653
+ link.classList.add('mb-3', 'd-inline-block')
654
+ return link
655
+ }
656
+
657
+ /**
658
+ * Link after successfull upload
659
+ */
660
+ getLinksHolder () {
661
+ const el = document.createElement('div')
662
+ return el
663
+ }
664
+
665
+ getInputGroup (input, buttons) {
666
+ if (!input) return
667
+
668
+ const inputGroupContainer = document.createElement('div')
669
+ inputGroupContainer.classList.add('input-group')
670
+
671
+ inputGroupContainer.appendChild(input)
672
+
673
+ const inputGroup = document.createElement('div')
674
+ inputGroup.classList.add('input-group-append')
675
+ inputGroupContainer.appendChild(inputGroup)
676
+
677
+ for (let i = 0; i < buttons.length; i++) {
678
+ /* this uses the getButton() wrapper, so we have to remove the panel/ctrl spacing for this case */
679
+ buttons[i].classList.remove('mr-2', 'btn-secondary')
680
+ buttons[i].classList.add('btn-outline-secondary')
681
+
682
+ inputGroup.appendChild(buttons[i])
683
+ }
684
+
685
+ return inputGroupContainer
686
+ }
687
+ }
688
+
689
+ /* Custom stylesheet rules. format: "selector" : "CSS rules" */
690
+ bootstrap4Theme.rules = rules
@@ -0,0 +1,3 @@
1
+ /* eslint-disable */
2
+ export default {".form-group":"margin-bottom:1rem",".form-text":"display:block",".jsoneditor-twbs5-text-button":"background:none;padding:0;border:0;color:currentColor","td > .form-group":"margin-bottom:0",".json-editor-btn-upload":"margin-top:1rem",".je-noindent .card":"padding:0;border:0",".je-tooltip:hover::before":"display:block;position:absolute;font-size:0.8em;color:%23fff;border-radius:0.2em;content:attr(title);background-color:%23000;margin-top:-2.5em;padding:0.3em",".je-tooltip:hover::after":"display:block;position:absolute;font-size:0.8em;color:%23fff",".select2-container--default .select2-selection--single":"height:calc(1.5em%20%2B%200.75rem%20%2B%202px)",".select2-container--default .select2-selection--single .select2-selection__arrow":"height:calc(1.5em%20%2B%200.75rem%20%2B%202px)",".select2-container--default .select2-selection--single .select2-selection__rendered":"line-height:calc(1.5em%20%2B%200.75rem%20%2B%202px)",".selectize-control.form-control":"padding:0",".selectize-dropdown.form-control":"padding:0;height:auto",".je-upload-preview img":"float:left;margin:0%200.5rem%200.5rem%200;max-width:100%25;max-height:5rem",".je-dropzone":"position:relative;margin:0.5rem%200;border:2px%20dashed%20black;width:100%25;height:60px;background:teal;transition:all%200.5s",".je-dropzone:before":"position:absolute;content:attr(data-text);color:rgba(0%2C%200%2C%200%2C%200.6);left:50%25;top:50%25;transform:translate(-50%25%2C%20-50%25)",".je-dropzone.valid-dropzone":"background:green",".je-dropzone.invalid-dropzone":"background:red"}
3
+ /* eslint-enable */