@qtoggle/qui 0.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (202) hide show
  1. package/.eslintignore +2 -0
  2. package/.eslintrc.json +492 -0
  3. package/.github/ISSUE_TEMPLATE/bug_report.md +33 -0
  4. package/.github/ISSUE_TEMPLATE/feature_request.md +23 -0
  5. package/.github/ISSUE_TEMPLATE/improvement_proposal.md +20 -0
  6. package/.github/workflows/main.yml +74 -0
  7. package/.pre-commit-config.yaml +8 -0
  8. package/LICENSE.txt +177 -0
  9. package/README.md +4 -0
  10. package/font/dejavusans-bold.woff +0 -0
  11. package/font/dejavusans-bolditalic.woff +0 -0
  12. package/font/dejavusans-italic.woff +0 -0
  13. package/font/dejavusans-regular.woff +0 -0
  14. package/img/qui-icons.svg +1937 -0
  15. package/js/base/base.js +47 -0
  16. package/js/base/condition-variable.js +92 -0
  17. package/js/base/errors.js +36 -0
  18. package/js/base/i18n.js +20 -0
  19. package/js/base/mixwith.js +135 -0
  20. package/js/base/require-js-compat.js +78 -0
  21. package/js/base/signal.js +91 -0
  22. package/js/base/singleton.js +66 -0
  23. package/js/base/timer.js +126 -0
  24. package/js/config.js +184 -0
  25. package/js/forms/common-fields/check-field.js +42 -0
  26. package/js/forms/common-fields/choice-buttons-field.js +30 -0
  27. package/js/forms/common-fields/color-combo-field.js +37 -0
  28. package/js/forms/common-fields/combo-field.js +108 -0
  29. package/js/forms/common-fields/common-fields.js +23 -0
  30. package/js/forms/common-fields/composite-field.js +132 -0
  31. package/js/forms/common-fields/custom-html-field.js +51 -0
  32. package/js/forms/common-fields/email-field.js +30 -0
  33. package/js/forms/common-fields/file-picker-field.js +46 -0
  34. package/js/forms/common-fields/jquery-ui-field.js +111 -0
  35. package/js/forms/common-fields/labels-field.js +69 -0
  36. package/js/forms/common-fields/numeric-field.js +39 -0
  37. package/js/forms/common-fields/password-field.js +28 -0
  38. package/js/forms/common-fields/phone-field.js +26 -0
  39. package/js/forms/common-fields/progress-disk-field.js +69 -0
  40. package/js/forms/common-fields/push-button-field.js +138 -0
  41. package/js/forms/common-fields/slider-field.js +51 -0
  42. package/js/forms/common-fields/text-area-field.js +34 -0
  43. package/js/forms/common-fields/text-field.js +89 -0
  44. package/js/forms/common-fields/up-down-field.js +85 -0
  45. package/js/forms/common-forms/common-forms.js +16 -0
  46. package/js/forms/common-forms/options-form.js +77 -0
  47. package/js/forms/common-forms/page-form.js +115 -0
  48. package/js/forms/form-button.js +202 -0
  49. package/js/forms/form-field.js +1183 -0
  50. package/js/forms/form.js +1181 -0
  51. package/js/forms/forms.js +68 -0
  52. package/js/global-glass.js +100 -0
  53. package/js/icons/default-stock.js +173 -0
  54. package/js/icons/icon.js +64 -0
  55. package/js/icons/icons.js +16 -0
  56. package/js/icons/multi-state-sprites-icon.js +362 -0
  57. package/js/icons/stock-icon.js +219 -0
  58. package/js/icons/stock.js +98 -0
  59. package/js/icons/stocks.js +57 -0
  60. package/js/index.js +232 -0
  61. package/js/lib/jquery.longpress.js +79 -0
  62. package/js/lib/jquery.module.js +4 -0
  63. package/js/lib/logger.module.js +4 -0
  64. package/js/lib/pep.module.js +4 -0
  65. package/js/lists/common-items/common-items.js +5 -0
  66. package/js/lists/common-items/icon-label-list-item.js +86 -0
  67. package/js/lists/common-lists/common-lists.js +5 -0
  68. package/js/lists/common-lists/page-list.js +53 -0
  69. package/js/lists/list-item.js +147 -0
  70. package/js/lists/list.js +636 -0
  71. package/js/lists/lists.js +26 -0
  72. package/js/main-ui/main-ui.js +64 -0
  73. package/js/main-ui/menu-bar.js +144 -0
  74. package/js/main-ui/options-bar.js +181 -0
  75. package/js/main-ui/status.js +185 -0
  76. package/js/main-ui/top-bar.js +59 -0
  77. package/js/messages/common-message-forms/common-message-forms.js +7 -0
  78. package/js/messages/common-message-forms/confirm-message-form.js +81 -0
  79. package/js/messages/common-message-forms/simple-message-form.js +67 -0
  80. package/js/messages/common-message-forms/sticky-simple-message-form.js +27 -0
  81. package/js/messages/message-form.js +107 -0
  82. package/js/messages/messages.js +21 -0
  83. package/js/messages/sticky-modal-page.js +98 -0
  84. package/js/messages/sticky-modal-progress-message.js +27 -0
  85. package/js/messages/toast.js +164 -0
  86. package/js/navigation.js +654 -0
  87. package/js/pages/breadcrumbs.js +124 -0
  88. package/js/pages/common-pages/common-pages.js +6 -0
  89. package/js/pages/common-pages/modal-progress-page.js +83 -0
  90. package/js/pages/common-pages/structured-page.js +46 -0
  91. package/js/pages/page.js +1018 -0
  92. package/js/pages/pages-context.js +154 -0
  93. package/js/pages/pages.js +252 -0
  94. package/js/pwa.js +337 -0
  95. package/js/sections/section.js +612 -0
  96. package/js/sections/sections.js +300 -0
  97. package/js/tables/common-cells/common-cells.js +7 -0
  98. package/js/tables/common-cells/icon-label-table-cell.js +68 -0
  99. package/js/tables/common-cells/push-button-table-cell.js +133 -0
  100. package/js/tables/common-cells/simple-table-cell.js +37 -0
  101. package/js/tables/common-tables/common-tables.js +5 -0
  102. package/js/tables/common-tables/page-table.js +55 -0
  103. package/js/tables/table-cell.js +198 -0
  104. package/js/tables/table-row.js +126 -0
  105. package/js/tables/table.js +492 -0
  106. package/js/tables/tables.js +36 -0
  107. package/js/theme.js +304 -0
  108. package/js/utils/ajax.js +126 -0
  109. package/js/utils/array.js +194 -0
  110. package/js/utils/colors.js +445 -0
  111. package/js/utils/cookies.js +65 -0
  112. package/js/utils/crypto.js +439 -0
  113. package/js/utils/css.js +234 -0
  114. package/js/utils/date.js +300 -0
  115. package/js/utils/files.js +27 -0
  116. package/js/utils/gestures.js +165 -0
  117. package/js/utils/html.js +76 -0
  118. package/js/utils/misc.js +81 -0
  119. package/js/utils/object.js +324 -0
  120. package/js/utils/promise.js +49 -0
  121. package/js/utils/string.js +192 -0
  122. package/js/utils/url.js +187 -0
  123. package/js/utils/utils.js +3 -0
  124. package/js/utils/visibility-manager.js +211 -0
  125. package/js/views/common-views/common-views.js +7 -0
  126. package/js/views/common-views/icon-label-view.js +210 -0
  127. package/js/views/common-views/progress-view.js +89 -0
  128. package/js/views/common-views/structured-view.js +368 -0
  129. package/js/views/view.js +467 -0
  130. package/js/views/views.js +3 -0
  131. package/js/widgets/base-widget.js +23 -0
  132. package/js/widgets/common-widgets/check-button.js +109 -0
  133. package/js/widgets/common-widgets/choice-buttons.js +322 -0
  134. package/js/widgets/common-widgets/color-combo.js +104 -0
  135. package/js/widgets/common-widgets/combo.js +645 -0
  136. package/js/widgets/common-widgets/common-widgets.js +17 -0
  137. package/js/widgets/common-widgets/email-input.js +7 -0
  138. package/js/widgets/common-widgets/file-picker.js +133 -0
  139. package/js/widgets/common-widgets/labels.js +132 -0
  140. package/js/widgets/common-widgets/numeric-input.js +49 -0
  141. package/js/widgets/common-widgets/password-input.js +91 -0
  142. package/js/widgets/common-widgets/phone-input.js +7 -0
  143. package/js/widgets/common-widgets/progress-disk.js +174 -0
  144. package/js/widgets/common-widgets/push-button.js +155 -0
  145. package/js/widgets/common-widgets/slider.js +455 -0
  146. package/js/widgets/common-widgets/text-area.js +52 -0
  147. package/js/widgets/common-widgets/text-input.js +174 -0
  148. package/js/widgets/common-widgets/up-down.js +351 -0
  149. package/js/widgets/widgets.js +57 -0
  150. package/js/window.js +557 -0
  151. package/jsdoc.conf.json +20 -0
  152. package/less/base.less +123 -0
  153. package/less/forms/common-fields.less +101 -0
  154. package/less/forms/common-forms.less +5 -0
  155. package/less/forms/form-button.less +21 -0
  156. package/less/forms/form-field.less +266 -0
  157. package/less/forms/form.less +131 -0
  158. package/less/global-glass.less +64 -0
  159. package/less/icon-label-view.less +82 -0
  160. package/less/icons.less +144 -0
  161. package/less/lists.less +105 -0
  162. package/less/main-ui.less +328 -0
  163. package/less/messages.less +189 -0
  164. package/less/no-effects.less +24 -0
  165. package/less/pages/breadcrumbs.less +98 -0
  166. package/less/pages/common-pages.less +36 -0
  167. package/less/pages/page.less +70 -0
  168. package/less/progress-view.less +51 -0
  169. package/less/stock-icons.less +43 -0
  170. package/less/structured-view.less +245 -0
  171. package/less/tables.less +84 -0
  172. package/less/theme-dark.less +133 -0
  173. package/less/theme-light.less +132 -0
  174. package/less/theme.less +419 -0
  175. package/less/visibility-manager.less +11 -0
  176. package/less/widgets/check-button.less +96 -0
  177. package/less/widgets/choice-buttons.less +160 -0
  178. package/less/widgets/color-combo.less +33 -0
  179. package/less/widgets/combo.less +230 -0
  180. package/less/widgets/common-buttons.less +120 -0
  181. package/less/widgets/common.less +24 -0
  182. package/less/widgets/input.less +258 -0
  183. package/less/widgets/labels.less +81 -0
  184. package/less/widgets/progress-disk.less +70 -0
  185. package/less/widgets/slider.less +199 -0
  186. package/less/widgets/updown.less +115 -0
  187. package/less/widgets/various.less +36 -0
  188. package/package.json +47 -0
  189. package/pyproject.toml +45 -0
  190. package/qui/__init__.py +110 -0
  191. package/qui/constants.py +1 -0
  192. package/qui/exceptions.py +2 -0
  193. package/qui/j2template.py +71 -0
  194. package/qui/settings.py +60 -0
  195. package/qui/templates/manifest.json +25 -0
  196. package/qui/templates/qui.html +126 -0
  197. package/qui/templates/service-worker.js +188 -0
  198. package/qui/web/__init__.py +0 -0
  199. package/qui/web/tornado.py +220 -0
  200. package/scripts/postinstall.sh +10 -0
  201. package/webpack/webpack-adjust-css-urls-loader.js +36 -0
  202. package/webpack/webpack-common.js +384 -0
@@ -0,0 +1,322 @@
1
+
2
+ import $ from '$qui/lib/jquery.module.js'
3
+
4
+ import * as BaseWidget from '../base-widget.js' /* Needed */
5
+
6
+
7
+ $.widget('qui.choicebuttons', $.qui.basewidget, {
8
+
9
+ options: {
10
+ onClass: 'on',
11
+ choices: [],
12
+ readonly: false,
13
+ disabled: false
14
+ },
15
+
16
+ _create: function () {
17
+ let widget = this
18
+
19
+ this.element.addClass('qui-choice-buttons-container')
20
+
21
+ if (this.options.readonly) {
22
+ this.element.addClass('readonly')
23
+ }
24
+ if (this.options.disabled) {
25
+ this.element.addClass('disabled')
26
+ }
27
+ else {
28
+ this.element.attr('tabIndex', 0) /* Make the container focusable */
29
+ }
30
+
31
+ this.element.on('keydown', function (e) {
32
+ if (widget.options.readonly) {
33
+ return
34
+ }
35
+
36
+ let changed = false
37
+ let active, group, newButton, index
38
+
39
+ switch (e.which) {
40
+ case 38: /* Up */
41
+ active = widget._getButtons().filter(`.${widget.options.onClass}`)
42
+ group = active.parent()
43
+ if (group.index() > 0) {
44
+ group = group.prev()
45
+ index = active.index()
46
+ newButton = group.children(`div.qui-choice-button:eq(${index})`)
47
+ if (newButton.length) {
48
+ widget._setActive(newButton)
49
+ widget.element.trigger('change', newButton.data('index'))
50
+ return false
51
+ }
52
+ }
53
+
54
+ break
55
+
56
+ case 40: /* Down */
57
+ active = widget._getButtons().filter(`.${widget.options.onClass}`)
58
+ group = active.parent()
59
+ if (group.index() < widget.element.children().length - 1) {
60
+ group = group.next()
61
+ index = active.index()
62
+ newButton = group.children(`div.qui-choice-button:eq(${index})`)
63
+ if (newButton.length) {
64
+ widget._setActive(newButton)
65
+ widget.element.trigger('change', newButton.data('index'))
66
+ return false
67
+ }
68
+ }
69
+
70
+ break
71
+
72
+ case 37: /* Left */
73
+ active = widget._getButtons().filter(`.${widget.options.onClass}`)
74
+ if (!active.length) {
75
+ active = widget._getButtons().filter(':eq(1)')
76
+ }
77
+
78
+ index = active.index()
79
+ group = active.parent()
80
+ if (index > 0) {
81
+ newButton = group.children(`div.qui-choice-button:eq(${index - 1})`)
82
+ widget._setActive(newButton)
83
+ widget.element.trigger('change', newButton.data('index'))
84
+ return false
85
+ }
86
+
87
+ break
88
+
89
+ case 39: /* Right */
90
+ active = widget._getButtons().filter(`.${widget.options.onClass}`)
91
+ if (!active.length) {
92
+ active = widget._getButtons().filter(':eq(-2)')
93
+ }
94
+
95
+ index = active.index()
96
+ group = active.parent()
97
+ if (index < group.children('div.qui-choice-button').length - 1) {
98
+ newButton = group.children(`div.qui-choice-button:eq(${index + 1})`)
99
+ widget._setActive(newButton)
100
+ widget.element.trigger('change', newButton.data('index'))
101
+ return false
102
+ }
103
+
104
+ break
105
+
106
+ case 34: /* Page-down */
107
+ active = widget._getButtons().filter(`.${widget.options.onClass}`)
108
+ group = active.parent()
109
+ while (group.index() < widget.element.children().length - 1) {
110
+ group = group.next()
111
+ index = active.index()
112
+ newButton = group.children(`div.qui-choice-button:eq(${index})`)
113
+ if (newButton.length) {
114
+ widget._setActive(newButton)
115
+ changed = true
116
+ }
117
+ }
118
+
119
+ if (changed) {
120
+ widget.element.trigger('change', newButton.data('index'))
121
+ return false
122
+ }
123
+
124
+ break
125
+
126
+ case 33: /* Page-up */
127
+ active = widget._getButtons().filter(`.${widget.options.onClass}`)
128
+ group = active.parent()
129
+ while (group.index() > 0) {
130
+ group = group.prev()
131
+ index = active.index()
132
+ newButton = group.children(`div.qui-choice-button:eq(${index})`)
133
+ if (newButton.length) {
134
+ widget._setActive(newButton)
135
+ changed = true
136
+ }
137
+ }
138
+
139
+ if (changed) {
140
+ widget.element.trigger('change', newButton.data('index'))
141
+ return false
142
+ }
143
+
144
+ break
145
+
146
+ case 36: /* Home */
147
+ active = widget._getButtons().filter(`.${widget.options.onClass}`)
148
+ group = active.parent()
149
+ while ((index = active.index()) > 0) {
150
+ newButton = active = group.children(`div.qui-choice-button:eq(${index - 1})`)
151
+ widget._setActive(newButton)
152
+ changed = true
153
+ }
154
+
155
+ if (changed) {
156
+ widget.element.trigger('change', newButton.data('index'))
157
+ return false
158
+ }
159
+
160
+ break
161
+
162
+ case 35: /* End */
163
+ active = widget._getButtons().filter(`.${widget.options.onClass}`)
164
+ group = active.parent()
165
+ while ((index = active.index()) < group.children('div.qui-choice-button').length - 1) {
166
+ newButton = active = group.children(`div.qui-choice-button:eq(${index + 1})`)
167
+ widget._setActive(newButton)
168
+ changed = true
169
+ }
170
+
171
+ if (changed) {
172
+ widget.element.trigger('change', newButton.data('index'))
173
+ return false
174
+ }
175
+
176
+ break
177
+ }
178
+ })
179
+
180
+ this._installClickHandlers()
181
+ },
182
+
183
+ _getActive: function () {
184
+ let active = this._getButtons().filter(`.${this.options.onClass}`)
185
+ if (active.length) {
186
+ return active
187
+ }
188
+ else {
189
+ return null
190
+ }
191
+ },
192
+
193
+ _setActive: function (button) {
194
+ this._getButtons().removeClass(this.options.onClass)
195
+ if (button) {
196
+ button.addClass(this.options.onClass)
197
+ }
198
+ },
199
+
200
+ _installClickHandlers: function () {
201
+ let widget = this
202
+
203
+ this._getButtons().each(function (i) {
204
+ let button = $(this)
205
+
206
+ button.on('click', (function (i) {
207
+
208
+ return function () {
209
+ if (widget.options.readonly || widget.options.disabled) {
210
+ return
211
+ }
212
+
213
+ widget._setActive(button)
214
+ widget.element.trigger('change', i)
215
+ }
216
+
217
+ }(i)))
218
+ })
219
+ },
220
+
221
+ getValue: function () {
222
+ let activeButton = this._getActive()
223
+ if (!activeButton) {
224
+ return null
225
+ }
226
+
227
+ return activeButton.data('value')
228
+ },
229
+
230
+ setValue: function (value) {
231
+ this._setActive(null)
232
+ let widget = this
233
+ this._getButtons().each(function () {
234
+ if ($(this).data('value') === value) {
235
+ widget._setActive($(this))
236
+ return false
237
+ }
238
+ })
239
+ },
240
+
241
+ getSelectedIndex: function () {
242
+ let widget = this
243
+ let index = -1
244
+ this._getButtons().each(function (i) {
245
+ if ($(this).hasClass(widget.options.onClass)) {
246
+ index = i
247
+ }
248
+ })
249
+
250
+ return index
251
+ },
252
+
253
+ setSelectedIndex: function (index) {
254
+ this._getButtons().removeClass(this.options.onClass)
255
+ if (index >= 0) {
256
+ this._getButtons().eq(index).addClass(this.options.onClass)
257
+ }
258
+ },
259
+
260
+ _getButtons: function () {
261
+ if (!this._buttons) {
262
+ let widget = this
263
+ let choices = this.options.choices
264
+ if (choices.length) {
265
+ if (!Array.isArray(choices[0])) {
266
+ choices = [choices]
267
+ }
268
+
269
+ let index = 0
270
+ choices.forEach(function (subChoices) {
271
+ let group = $('<div></div>', {class: 'qui-choice-buttons-group-container'})
272
+ group.css('grid-template-columns', `repeat(${subChoices.length}, 1fr)`)
273
+ subChoices.forEach(function (choice) {
274
+ let button = $(
275
+ '<div></div>',
276
+ {class: 'qui-base-button qui-interactive-button qui-choice-button'}
277
+ )
278
+ button.html(choice.label)
279
+ button.data('value', choice.value)
280
+ button.data('index', index)
281
+ group.append(button)
282
+
283
+ index++
284
+ })
285
+
286
+ widget.element.append(group)
287
+ })
288
+ }
289
+
290
+ this._buttons = this.element.find('div.qui-choice-button')
291
+ }
292
+
293
+ return this._buttons
294
+ },
295
+
296
+ _setOption: function (key, value) {
297
+ this._super(key, value)
298
+
299
+ switch (key) {
300
+ case 'readonly':
301
+ this.element.toggleClass('readonly', value)
302
+ break
303
+
304
+ case 'choices':
305
+ this.element.html('')
306
+ this._buttons = null
307
+ this._installClickHandlers()
308
+ break
309
+
310
+ case 'disabled':
311
+ this.element.toggleClass('disabled', value)
312
+ if (value) {
313
+ this.element.removeAttr('tabIndex')
314
+ }
315
+ else {
316
+ this.element.attr('tabIndex', 0)
317
+ }
318
+ break
319
+ }
320
+ }
321
+
322
+ })
@@ -0,0 +1,104 @@
1
+ /* eslint-disable no-multi-spaces */
2
+
3
+ import $ from '$qui/lib/jquery.module.js'
4
+
5
+ import {gettext} from '$qui/base/i18n.js'
6
+ import * as Theme from '$qui/theme.js'
7
+ import * as Colors from '$qui/utils/colors.js'
8
+
9
+ import * as Combo from './combo.js' /* Needed */
10
+
11
+
12
+ $.widget('qui.colorcombo', $.qui.combo, {
13
+
14
+ STANDARD_COLORS: [
15
+ {name: 'darkgray', label: gettext('Dark Gray')},
16
+ {name: 'gray', label: gettext('Gray')},
17
+ {name: 'lightgray', label: gettext('Light Gray')},
18
+ {name: 'white', label: gettext('White')},
19
+ {name: 'blue', label: gettext('Blue')},
20
+ {name: 'magenta', label: gettext('Magenta')},
21
+ {name: 'red', label: gettext('Red')},
22
+ {name: 'orange', label: gettext('Orange')},
23
+ {name: 'yellow', label: gettext('Yellow')},
24
+ {name: 'green', label: gettext('Green')},
25
+ {name: 'cyan', label: gettext('Cyan')}
26
+ ],
27
+ THEME_COLORS: [
28
+ {name: 'background', label: gettext('Background Color')},
29
+ {name: 'foreground', label: gettext('Foreground Color')},
30
+ {name: 'border', label: gettext('Border Color')},
31
+ {name: 'disabled', label: gettext('Disabled Color')},
32
+ {name: 'interactive', label: gettext('Interactive Color')},
33
+ {name: 'highlight', label: gettext('Highlight Color')},
34
+ {name: 'danger', label: gettext('Danger Color')},
35
+ {name: 'warning', label: gettext('Warning Color')},
36
+ {name: 'info', label: gettext('Information Color')},
37
+ {name: 'error', label: gettext('Error Color')}
38
+ ],
39
+
40
+ options: {
41
+ includeStandard: true,
42
+ includeTheme: true,
43
+ customColors: []
44
+ },
45
+
46
+ makeChoices: function () {
47
+ let choices = []
48
+
49
+ if (this.options.includeStandard) {
50
+ choices = choices.concat(this.STANDARD_COLORS.map(function (colorInfo, i) {
51
+
52
+ let choice = this._choiceFromColor(`@${colorInfo.name}-color`, colorInfo.label)
53
+ if (i === 0) {
54
+ choice.separator = true
55
+ }
56
+
57
+ return choice
58
+
59
+ }, this))
60
+ }
61
+
62
+ if (this.options.includeTheme) {
63
+ choices = choices.concat(this.THEME_COLORS.map(function (colorInfo, i) {
64
+
65
+ let choice = this._choiceFromColor(`@${colorInfo.name}-color`, colorInfo.label)
66
+ if (i === 0) {
67
+ choice.separator = true
68
+ }
69
+
70
+ return choice
71
+
72
+ }, this))
73
+ }
74
+
75
+ return choices
76
+ },
77
+
78
+ _choiceFromThemeVar: function (name, text) {
79
+ return this._choiceFromColor(Theme.getVar(name), text)
80
+ },
81
+
82
+ _choiceFromColor: function (color, text) {
83
+ let value = color
84
+ if (!value.startsWith('@')) {
85
+ value = Colors.normalize(value)
86
+ }
87
+ else {
88
+ color = Theme.getVar(color.substring(1))
89
+ }
90
+
91
+ let labelDiv = $('<div></div>', {class: 'qui-color-combo-entry-label'})
92
+ let colorDiv = $('<div></div>', {class: 'qui-color-combo-entry-color', style: `background: ${color};`})
93
+ let textSpan = $('<span></span>', {class: 'qui-color-combo-entry-text'})
94
+ textSpan.text(text)
95
+
96
+ labelDiv.append(colorDiv).append(textSpan)
97
+
98
+ return {
99
+ value: value,
100
+ label: labelDiv
101
+ }
102
+ }
103
+
104
+ })