@oat-sa/tao-core-ui 1.58.1 → 1.58.2
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.
- package/dist/actionbar.js +386 -395
- package/dist/adder.js +21 -19
- package/dist/animable/absorbable/absorbable.js +204 -213
- package/dist/animable/absorbable/css/absorb.css +1 -0
- package/dist/animable/absorbable/css/absorb.css.map +1 -1
- package/dist/animable/pulsable/pulsable.js +168 -177
- package/dist/autocomplete/css/autocomplete.css +1 -0
- package/dist/autocomplete/css/autocomplete.css.map +1 -1
- package/dist/autocomplete.js +68 -66
- package/dist/badge/badge.js +188 -197
- package/dist/badge/css/badge.css +1 -0
- package/dist/badge/css/badge.css.map +1 -1
- package/dist/breadcrumbs.js +275 -284
- package/dist/btngrouper.js +5 -5
- package/dist/bulkActionPopup.js +490 -495
- package/dist/button.js +283 -291
- package/dist/cascadingComboBox.js +249 -258
- package/dist/ckeditor/ckConfigurator.js +26 -19
- package/dist/ckeditor/dtdHandler.js +11 -9
- package/dist/class/selector.js +441 -450
- package/dist/component/resizable.js +1 -1
- package/dist/component/windowed.js +285 -294
- package/dist/component.js +419 -428
- package/dist/contextualPopup.js +417 -426
- package/dist/dashboard.js +300 -309
- package/dist/datalist.js +753 -762
- package/dist/datatable/filterStrategy/multiple.js +1 -1
- package/dist/datatable/filterStrategy/single.js +1 -1
- package/dist/datatable.js +1527 -1550
- package/dist/dateRange/dateRange.js +393 -402
- package/dist/datetime/picker.js +665 -672
- package/dist/deleter.js +368 -377
- package/dist/destination/selector.js +286 -295
- package/dist/dialog/alert.js +3 -3
- package/dist/dialog/confirm.js +1 -1
- package/dist/dialog/confirmDelete.js +216 -225
- package/dist/dialog.js +650 -654
- package/dist/disabler.js +8 -8
- package/dist/documentViewer/providers/pdfViewer/fallback/viewer.js +166 -175
- package/dist/documentViewer/providers/pdfViewer/pdfjs/findBar.js +518 -527
- package/dist/documentViewer/providers/pdfViewer/pdfjs/pageView.js +380 -389
- package/dist/documentViewer/providers/pdfViewer/pdfjs/searchEngine.js +539 -548
- package/dist/documentViewer/providers/pdfViewer/pdfjs/viewer.js +369 -378
- package/dist/documentViewer/providers/pdfViewer.js +184 -193
- package/dist/documentViewer.js +292 -301
- package/dist/dropdown.js +383 -392
- package/dist/durationer.js +5 -5
- package/dist/dynamicComponent.js +597 -598
- package/dist/feedback.js +356 -362
- package/dist/figure/FigureStateActive.js +117 -108
- package/dist/filesender.js +2 -2
- package/dist/filter.js +230 -239
- package/dist/form/dropdownForm.js +355 -357
- package/dist/form/form.js +919 -690
- package/dist/form/simpleForm.js +1 -1
- package/dist/form/validator/renderer.js +233 -235
- package/dist/form/validator/validator.js +257 -189
- package/dist/form/widget/definitions.js +1 -1
- package/dist/form/widget/providers/checkBox.js +254 -259
- package/dist/form/widget/providers/comboBox.js +187 -192
- package/dist/form/widget/providers/default.js +8 -9
- package/dist/form/widget/providers/hidden.js +170 -179
- package/dist/form/widget/providers/hiddenBox.js +262 -267
- package/dist/form/widget/providers/radioBox.js +216 -225
- package/dist/form/widget/providers/textArea.js +187 -196
- package/dist/form/widget/providers/textBox.js +2 -3
- package/dist/form/widget/widget.js +473 -475
- package/dist/formValidator/formValidator.js +1 -1
- package/dist/formValidator/highlighters/message.js +1 -1
- package/dist/generis/form/form.js +314 -323
- package/dist/generis/validator/validator.js +209 -218
- package/dist/generis/widget/checkBox/checkBox.js +218 -227
- package/dist/generis/widget/comboBox/comboBox.js +179 -188
- package/dist/generis/widget/hiddenBox/hiddenBox.js +220 -229
- package/dist/generis/widget/textBox/textBox.js +169 -178
- package/dist/generis/widget/widget.js +246 -255
- package/dist/groupedComboBox.js +222 -231
- package/dist/groupvalidator.js +2 -2
- package/dist/highlighter.js +967 -958
- package/dist/image/ImgStateActive/helper.js +7 -5
- package/dist/image/ImgStateActive/initHelper.js +49 -43
- package/dist/image/ImgStateActive/initMediaEditor.js +24 -20
- package/dist/image/ImgStateActive/mediaSizer.js +14 -12
- package/dist/image/ImgStateActive.js +72 -70
- package/dist/incrementer.js +6 -6
- package/dist/inplacer.js +6 -6
- package/dist/itemButtonList/css/item-button-list.css +1 -0
- package/dist/itemButtonList/css/item-button-list.css.map +1 -1
- package/dist/itemButtonList.js +439 -435
- package/dist/keyNavigation/navigableDomElement.js +51 -38
- package/dist/keyNavigation/navigator.js +85 -70
- package/dist/listbox.js +460 -469
- package/dist/liststyler.js +8 -8
- package/dist/loadingButton/loadingButton.js +209 -218
- package/dist/lock.js +476 -485
- package/dist/login/login.js +475 -484
- package/dist/maths/calculator/basicCalculator.js +235 -244
- package/dist/maths/calculator/calculatorComponent.js +3 -3
- package/dist/maths/calculator/core/board.js +772 -781
- package/dist/maths/calculator/core/expression.js +476 -485
- package/dist/maths/calculator/core/labels.js +228 -237
- package/dist/maths/calculator/core/tokenizer.js +1 -1
- package/dist/maths/calculator/core/tokens.js +163 -170
- package/dist/maths/calculator/plugins/keyboard/templateKeyboard/templateKeyboard.js +244 -253
- package/dist/maths/calculator/plugins/screen/simpleScreen/simpleScreen.js +279 -288
- package/dist/maths/calculator/scientificCalculator.js +327 -336
- package/dist/mediaEditor/mediaEditorComponent.js +238 -245
- package/dist/mediaEditor/plugins/mediaAlignment/helper.js +7 -7
- package/dist/mediaEditor/plugins/mediaAlignment/mediaAlignmentComponent.js +229 -235
- package/dist/mediaEditor/plugins/mediaDimension/mediaDimensionComponent.js +580 -589
- package/dist/mediaplayer/players/html5.js +666 -675
- package/dist/mediaplayer/players/youtube.js +419 -424
- package/dist/mediaplayer/support.js +11 -10
- package/dist/mediaplayer/utils/reminder.js +14 -13
- package/dist/mediaplayer/utils/timeObserver.js +10 -11
- package/dist/mediaplayer/youtubeManager.js +164 -145
- package/dist/mediaplayer.js +1565 -1520
- package/dist/mediasizer.js +669 -678
- package/dist/modal.js +10 -17
- package/dist/pageSizeSelector.js +219 -228
- package/dist/pagination/providers/pages.js +280 -289
- package/dist/pagination/providers/simple.js +192 -201
- package/dist/previewer.js +30 -30
- package/dist/progressbar.js +4 -4
- package/dist/report.js +347 -356
- package/dist/resource/filters.js +271 -280
- package/dist/resource/list.js +1264 -1273
- package/dist/resource/selector.js +865 -874
- package/dist/resource/tree.js +1483 -1492
- package/dist/resourcemgr/fileBrowser.js +564 -569
- package/dist/resourcemgr/filePreview.js +16 -16
- package/dist/resourcemgr/fileSelector.js +515 -524
- package/dist/resourcemgr/util/updatePermissions.js +2 -2
- package/dist/resourcemgr.js +306 -315
- package/dist/searchModal/advancedSearch.js +796 -767
- package/dist/searchModal.js +114 -91
- package/dist/switch/switch.js +298 -307
- package/dist/tabs.js +598 -575
- package/dist/taskQueue/status.js +312 -321
- package/dist/taskQueue/table.js +375 -384
- package/dist/taskQueue/taskQueueModel.js +488 -472
- package/dist/taskQueueButton/taskable.js +264 -273
- package/dist/taskQueueButton/treeButton.js +189 -198
- package/dist/themeLoader.js +24 -23
- package/dist/themes.js +1 -1
- package/dist/toggler.js +3 -3
- package/dist/tooltip.js +295 -304
- package/dist/transformer.js +2 -2
- package/dist/tristateCheckboxGroup.js +311 -320
- package/dist/uploader.js +687 -696
- package/dist/validator/Report.js +1 -1
- package/dist/validator/Validator.js +3 -3
- package/dist/validator/validators.js +9 -9
- package/dist/validator.js +240 -230
- package/dist/waitForMedia.js +1 -1
- package/package.json +3 -3
- package/src/animable/absorbable/css/absorb.css +1 -0
- package/src/animable/absorbable/css/absorb.css.map +1 -1
- package/src/autocomplete/css/autocomplete.css +1 -0
- package/src/autocomplete/css/autocomplete.css.map +1 -1
- package/src/badge/css/badge.css +1 -0
- package/src/badge/css/badge.css.map +1 -1
- package/src/ckeditor/ckConfigurator.js +4 -0
- package/src/itemButtonList/css/item-button-list.css +1 -0
- package/src/itemButtonList/css/item-button-list.css.map +1 -1
- package/src/.DS_Store +0 -0
- package/src/css/basic.css +0 -7826
- package/src/css/basic.css.map +0 -1
- package/src/css/ckeditor/skins/tao/css/dialog.css +0 -950
- package/src/css/ckeditor/skins/tao/css/dialog.css.map +0 -1
- package/src/css/ckeditor/skins/tao/css/editor.css +0 -1850
- package/src/css/ckeditor/skins/tao/css/editor.css.map +0 -1
- package/src/scss/.DS_Store +0 -0
- package/src/scss/basic.scss +0 -16
- package/src/scss/ckeditor/skins/tao/scss/dialog.scss +0 -763
- package/src/scss/ckeditor/skins/tao/scss/editor.scss +0 -111
- package/src/scss/ckeditor/skins/tao/scss/inc/_ck-icons.scss +0 -59
- package/src/scss/ckeditor/skins/tao/scss/inc/_colorpanel.scss +0 -118
- package/src/scss/ckeditor/skins/tao/scss/inc/_elementspath.scss +0 -69
- package/src/scss/ckeditor/skins/tao/scss/inc/_mainui.scss +0 -194
- package/src/scss/ckeditor/skins/tao/scss/inc/_menu.scss +0 -181
- package/src/scss/ckeditor/skins/tao/scss/inc/_panel.scss +0 -200
- package/src/scss/ckeditor/skins/tao/scss/inc/_presets.scss +0 -32
- package/src/scss/ckeditor/skins/tao/scss/inc/_reset.scss +0 -101
- package/src/scss/ckeditor/skins/tao/scss/inc/_richcombo.scss +0 -213
- package/src/scss/ckeditor/skins/tao/scss/inc/_tao.scss +0 -59
- package/src/scss/ckeditor/skins/tao/scss/inc/_toolbar.scss +0 -301
- package/src/scss/font/source-sans-pro/source-sans-pro-italic.eot +0 -0
- package/src/scss/font/source-sans-pro/source-sans-pro-italic.eot.b64 +0 -1
- package/src/scss/font/source-sans-pro/source-sans-pro-italic.woff +0 -0
- package/src/scss/font/source-sans-pro/source-sans-pro-italic.woff.b64 +0 -1
- package/src/scss/font/source-sans-pro/source-sans-pro-regular.eot +0 -0
- package/src/scss/font/source-sans-pro/source-sans-pro-regular.eot.b64 +0 -1
- package/src/scss/font/source-sans-pro/source-sans-pro-regular.woff +0 -0
- package/src/scss/font/source-sans-pro/source-sans-pro-regular.woff.b64 +0 -1
- package/src/scss/font/source-sans-pro/source-sans-pro-semibold-italic.eot +0 -0
- package/src/scss/font/source-sans-pro/source-sans-pro-semibold-italic.eot.b64 +0 -1
- package/src/scss/font/source-sans-pro/source-sans-pro-semibold-italic.woff +0 -0
- package/src/scss/font/source-sans-pro/source-sans-pro-semibold-italic.woff.b64 +0 -1
- package/src/scss/font/source-sans-pro/source-sans-pro-semibold.eot +0 -0
- package/src/scss/font/source-sans-pro/source-sans-pro-semibold.eot.b64 +0 -1
- package/src/scss/font/source-sans-pro/source-sans-pro-semibold.woff +0 -0
- package/src/scss/font/source-sans-pro/source-sans-pro-semibold.woff.b64 +0 -1
- package/src/scss/font/tao/tao.eot +0 -0
- package/src/scss/font/tao/tao.svg +0 -235
- package/src/scss/font/tao/tao.ttf +0 -0
- package/src/scss/font/tao/tao.woff +0 -0
- package/src/scss/inc/_base.scss +0 -496
- package/src/scss/inc/_bootstrap.scss +0 -6
- package/src/scss/inc/_buttons.scss +0 -114
- package/src/scss/inc/_colors.scss +0 -88
- package/src/scss/inc/_feedback.scss +0 -150
- package/src/scss/inc/_flex-grid.scss +0 -15
- package/src/scss/inc/_fonts.scss +0 -4
- package/src/scss/inc/_forms.scss +0 -827
- package/src/scss/inc/_functions.scss +0 -283
- package/src/scss/inc/_grid.scss +0 -66
- package/src/scss/inc/_jquery.nouislider.scss +0 -254
- package/src/scss/inc/_normalize.scss +0 -528
- package/src/scss/inc/_report.scss +0 -68
- package/src/scss/inc/_secondary-properties.scss +0 -89
- package/src/scss/inc/_select2.scss +0 -634
- package/src/scss/inc/_toolbars.scss +0 -155
- package/src/scss/inc/_tooltip.scss +0 -312
- package/src/scss/inc/_variables.scss +0 -21
- package/src/scss/inc/base/_highlight.scss +0 -5
- package/src/scss/inc/base/_list-style.scss +0 -59
- package/src/scss/inc/base/_svg.scss +0 -3
- package/src/scss/inc/base/_table.scss +0 -63
- package/src/scss/inc/fonts/_source-sans-pro.scss +0 -29
- package/src/scss/inc/fonts/_tao-icon-classes.scss +0 -226
- package/src/scss/inc/fonts/_tao-icon-def.scss +0 -12
- package/src/scss/inc/fonts/_tao-icon-vars.scss +0 -240
package/dist/switch/switch.js
CHANGED
|
@@ -1,355 +1,346 @@
|
|
|
1
1
|
define(['jquery', 'lodash', 'i18n', 'ui/component', 'lib/uuid', 'handlebars', 'lib/dompurify/purify', 'css!ui/switch/css/switch.css'], function ($$1, _, __, component, uuid, Handlebars, DOMPurify, switch_css) { 'use strict';
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
3
|
+
$$1 = $$1 && Object.prototype.hasOwnProperty.call($$1, 'default') ? $$1['default'] : $$1;
|
|
4
|
+
_ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;
|
|
5
|
+
__ = __ && Object.prototype.hasOwnProperty.call(__, 'default') ? __['default'] : __;
|
|
6
|
+
component = component && Object.prototype.hasOwnProperty.call(component, 'default') ? component['default'] : component;
|
|
7
|
+
uuid = uuid && Object.prototype.hasOwnProperty.call(uuid, 'default') ? uuid['default'] : uuid;
|
|
8
|
+
Handlebars = Handlebars && Object.prototype.hasOwnProperty.call(Handlebars, 'default') ? Handlebars['default'] : Handlebars;
|
|
9
|
+
DOMPurify = DOMPurify && Object.prototype.hasOwnProperty.call(DOMPurify, 'default') ? DOMPurify['default'] : DOMPurify;
|
|
10
|
+
|
|
11
|
+
function _typeof(obj) {
|
|
12
|
+
"@babel/helpers - typeof";
|
|
13
|
+
|
|
14
|
+
return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) {
|
|
15
|
+
return typeof obj;
|
|
16
|
+
} : function (obj) {
|
|
17
|
+
return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;
|
|
18
|
+
}, _typeof(obj);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
function Helpers0 (hb) {
|
|
22
|
+
//register a i18n helper
|
|
23
|
+
hb.registerHelper('__', function (key) {
|
|
24
|
+
return __(key);
|
|
25
|
+
});
|
|
11
26
|
/**
|
|
12
|
-
*
|
|
13
|
-
* modify it under the terms of the GNU General Public License
|
|
14
|
-
* as published by the Free Software Foundation; under version 2
|
|
15
|
-
* of the License (non-upgradable).
|
|
16
|
-
*
|
|
17
|
-
* This program is distributed in the hope that it will be useful,
|
|
18
|
-
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
19
|
-
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
20
|
-
* GNU General Public License for more details.
|
|
21
|
-
*
|
|
22
|
-
* You should have received a copy of the GNU General Public License
|
|
23
|
-
* along with this program; if not, write to the Free Software
|
|
24
|
-
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
25
|
-
*
|
|
26
|
-
* Copyright (c) 2013-2019 (original work) Open Assessment Technologies SA (under the project TAO-PRODUCT);
|
|
27
|
+
* Register dompurify helper
|
|
27
28
|
*
|
|
29
|
+
* https://github.com/cure53/DOMPurify
|
|
30
|
+
* with config SAFE_FOR_TEMPLATES: true
|
|
31
|
+
* to make output safe for template systems
|
|
32
|
+
*/
|
|
33
|
+
|
|
34
|
+
hb.registerHelper('dompurify', function (context) {
|
|
35
|
+
return DOMPurify.sanitize(context);
|
|
36
|
+
});
|
|
37
|
+
/**
|
|
38
|
+
* Register join helper
|
|
28
39
|
*
|
|
40
|
+
* Example :
|
|
41
|
+
* var values = {a:v1, b:v2, c:v3};
|
|
42
|
+
* Using {{{join attributes '=' ' ' '"'}}} will return : a="v1" b="v2" c="v3"
|
|
43
|
+
* Using {{{join values null ' or ' '*'}}} will return : *v1* or *v2* or *v3*
|
|
29
44
|
*/
|
|
30
|
-
function Helpers0 (hb) {
|
|
31
|
-
//register a i18n helper
|
|
32
|
-
hb.registerHelper('__', function (key) {
|
|
33
|
-
return __(key);
|
|
34
|
-
});
|
|
35
|
-
/**
|
|
36
|
-
* Register dompurify helper
|
|
37
|
-
*
|
|
38
|
-
* https://github.com/cure53/DOMPurify
|
|
39
|
-
* with config SAFE_FOR_TEMPLATES: true
|
|
40
|
-
* to make output safe for template systems
|
|
41
|
-
*/
|
|
42
45
|
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
*
|
|
49
|
-
* Example :
|
|
50
|
-
* var values = {a:v1, b:v2, c:v3};
|
|
51
|
-
* Using {{{join attributes '=' ' ' '"'}}} will return : a="v1" b="v2" c="v3"
|
|
52
|
-
* Using {{{join values null ' or ' '*'}}} will return : *v1* or *v2* or *v3*
|
|
53
|
-
*/
|
|
46
|
+
hb.registerHelper('join', function (arr, keyValueGlue, fragmentGlue, wrapper) {
|
|
47
|
+
var fragments = [];
|
|
48
|
+
keyValueGlue = typeof keyValueGlue === 'string' ? keyValueGlue : undefined;
|
|
49
|
+
fragmentGlue = typeof fragmentGlue === 'string' ? fragmentGlue : ' ';
|
|
50
|
+
wrapper = typeof wrapper === 'string' ? wrapper : '"';
|
|
54
51
|
|
|
55
|
-
|
|
56
|
-
var
|
|
57
|
-
keyValueGlue = typeof keyValueGlue === 'string' ? keyValueGlue : undefined;
|
|
58
|
-
fragmentGlue = typeof fragmentGlue === 'string' ? fragmentGlue : ' ';
|
|
59
|
-
wrapper = typeof wrapper === 'string' ? wrapper : '"';
|
|
60
|
-
|
|
61
|
-
_.forIn(arr, function (value, key) {
|
|
62
|
-
var fragment = '';
|
|
63
|
-
|
|
64
|
-
if (value !== null || value !== undefined) {
|
|
65
|
-
if (typeof value === 'boolean') {
|
|
66
|
-
value = value ? 'true' : 'false';
|
|
67
|
-
} else if (typeof value === 'object') {
|
|
68
|
-
value = _.values(value).join(' ');
|
|
69
|
-
}
|
|
70
|
-
} else {
|
|
71
|
-
value = '';
|
|
72
|
-
}
|
|
52
|
+
_.forIn(arr, function (value, key) {
|
|
53
|
+
var fragment = '';
|
|
73
54
|
|
|
74
|
-
|
|
75
|
-
|
|
55
|
+
if (value !== null || value !== undefined) {
|
|
56
|
+
if (typeof value === 'boolean') {
|
|
57
|
+
value = value ? 'true' : 'false';
|
|
58
|
+
} else if (_typeof(value) === 'object') {
|
|
59
|
+
value = _.values(value).join(' ');
|
|
76
60
|
}
|
|
61
|
+
} else {
|
|
62
|
+
value = '';
|
|
63
|
+
}
|
|
77
64
|
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
});
|
|
81
|
-
|
|
82
|
-
return fragments.join(fragmentGlue);
|
|
83
|
-
}); //register a classic "for loop" helper
|
|
84
|
-
//it also adds a local variable "i" as the index in each iteration loop
|
|
85
|
-
|
|
86
|
-
hb.registerHelper('for', function (startIndex, stopIndex, increment, options) {
|
|
87
|
-
var ret = '';
|
|
88
|
-
startIndex = parseInt(startIndex);
|
|
89
|
-
stopIndex = parseInt(stopIndex);
|
|
90
|
-
increment = parseInt(increment);
|
|
91
|
-
|
|
92
|
-
for (var i = startIndex; i < stopIndex; i += increment) {
|
|
93
|
-
ret += options.fn(_.extend({}, this, {
|
|
94
|
-
i: i
|
|
95
|
-
}));
|
|
65
|
+
if (keyValueGlue !== undefined) {
|
|
66
|
+
fragment += key + keyValueGlue;
|
|
96
67
|
}
|
|
97
68
|
|
|
98
|
-
|
|
69
|
+
fragment += wrapper + value + wrapper;
|
|
70
|
+
fragments.push(fragment);
|
|
99
71
|
});
|
|
100
|
-
hb.registerHelper('equal', function (var1, var2, options) {
|
|
101
|
-
if (var1 == var2) {
|
|
102
|
-
return options.fn(this);
|
|
103
|
-
} else {
|
|
104
|
-
return options.inverse(this);
|
|
105
|
-
}
|
|
106
|
-
}); // register a "get property" helper
|
|
107
|
-
// it gets the named property from the provided context
|
|
108
72
|
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
// it checks if value is in array
|
|
73
|
+
return fragments.join(fragmentGlue);
|
|
74
|
+
}); //register a classic "for loop" helper
|
|
75
|
+
//it also adds a local variable "i" as the index in each iteration loop
|
|
113
76
|
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
}
|
|
77
|
+
hb.registerHelper('for', function (startIndex, stopIndex, increment, options) {
|
|
78
|
+
var ret = '';
|
|
79
|
+
startIndex = parseInt(startIndex);
|
|
80
|
+
stopIndex = parseInt(stopIndex);
|
|
81
|
+
increment = parseInt(increment);
|
|
120
82
|
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
var Template = Handlebars.template(function (Handlebars,depth0,helpers,partials,data) {
|
|
126
|
-
this.compilerInfo = [4,'>= 1.0.0'];
|
|
127
|
-
helpers = this.merge(helpers, Handlebars.helpers); data = data || {};
|
|
128
|
-
var buffer = "", stack1, helper, self=this, functionType="function", escapeExpression=this.escapeExpression;
|
|
129
|
-
|
|
130
|
-
function program1(depth0,data) {
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
return "monostyle";
|
|
83
|
+
for (var i = startIndex; i < stopIndex; i += increment) {
|
|
84
|
+
ret += options.fn(_.extend({}, this, {
|
|
85
|
+
i: i
|
|
86
|
+
}));
|
|
134
87
|
}
|
|
135
88
|
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
89
|
+
return ret;
|
|
90
|
+
});
|
|
91
|
+
hb.registerHelper('equal', function (var1, var2, options) {
|
|
92
|
+
if (var1 == var2) {
|
|
93
|
+
return options.fn(this);
|
|
94
|
+
} else {
|
|
95
|
+
return options.inverse(this);
|
|
140
96
|
}
|
|
97
|
+
}); // register a "get property" helper
|
|
98
|
+
// it gets the named property from the provided context
|
|
99
|
+
|
|
100
|
+
hb.registerHelper('property', function (name, context) {
|
|
101
|
+
return context[name] || '';
|
|
102
|
+
}); // register an 'includes' helper
|
|
103
|
+
// it checks if value is in array
|
|
141
104
|
|
|
142
|
-
function
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
return "active";
|
|
105
|
+
hb.registerHelper('includes', function (haystack, needle, options) {
|
|
106
|
+
if (_.contains(haystack, needle)) {
|
|
107
|
+
return options.fn(this);
|
|
146
108
|
}
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
if (!Helpers0.__initialized) {
|
|
113
|
+
Helpers0(Handlebars);
|
|
114
|
+
Helpers0.__initialized = true;
|
|
115
|
+
}
|
|
116
|
+
var Template = Handlebars.template(function (Handlebars,depth0,helpers,partials,data) {
|
|
117
|
+
this.compilerInfo = [4,'>= 1.0.0'];
|
|
118
|
+
helpers = this.merge(helpers, Handlebars.helpers); data = data || {};
|
|
119
|
+
var buffer = "", stack1, helper, self=this, functionType="function", escapeExpression=this.escapeExpression;
|
|
120
|
+
|
|
121
|
+
function program1(depth0,data) {
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
return "monostyle";
|
|
125
|
+
}
|
|
147
126
|
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
if (helper = helpers.title) { stack1 = helper.call(depth0, {hash:{},data:data}); }
|
|
153
|
-
else { helper = (depth0 && depth0.title); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }
|
|
154
|
-
buffer += escapeExpression(stack1)
|
|
155
|
-
+ "\">\n <input type=\"checkbox\" name=\"";
|
|
156
|
-
if (helper = helpers.name) { stack1 = helper.call(depth0, {hash:{},data:data}); }
|
|
157
|
-
else { helper = (depth0 && depth0.name); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }
|
|
158
|
-
buffer += escapeExpression(stack1)
|
|
159
|
-
+ "\" ";
|
|
160
|
-
stack1 = helpers['if'].call(depth0, ((stack1 = (depth0 && depth0.on)),stack1 == null || stack1 === false ? stack1 : stack1.active), {hash:{},inverse:self.noop,fn:self.program(3, program3, data),data:data});
|
|
161
|
-
if(stack1 || stack1 === 0) { buffer += stack1; }
|
|
162
|
-
buffer += ">\n <label>\n <span class=\"off ";
|
|
163
|
-
stack1 = helpers['if'].call(depth0, ((stack1 = (depth0 && depth0.off)),stack1 == null || stack1 === false ? stack1 : stack1.active), {hash:{},inverse:self.noop,fn:self.program(5, program5, data),data:data});
|
|
164
|
-
if(stack1 || stack1 === 0) { buffer += stack1; }
|
|
165
|
-
buffer += "\">"
|
|
166
|
-
+ escapeExpression(((stack1 = ((stack1 = (depth0 && depth0.off)),stack1 == null || stack1 === false ? stack1 : stack1.label)),typeof stack1 === functionType ? stack1.apply(depth0) : stack1))
|
|
167
|
-
+ "</span>\n <span class=\"on ";
|
|
168
|
-
stack1 = helpers['if'].call(depth0, ((stack1 = (depth0 && depth0.on)),stack1 == null || stack1 === false ? stack1 : stack1.active), {hash:{},inverse:self.noop,fn:self.program(5, program5, data),data:data});
|
|
169
|
-
if(stack1 || stack1 === 0) { buffer += stack1; }
|
|
170
|
-
buffer += "\">"
|
|
171
|
-
+ escapeExpression(((stack1 = ((stack1 = (depth0 && depth0.on)),stack1 == null || stack1 === false ? stack1 : stack1.label)),typeof stack1 === functionType ? stack1.apply(depth0) : stack1))
|
|
172
|
-
+ "</span>\n </label>\n</div>\n";
|
|
173
|
-
return buffer;
|
|
174
|
-
});
|
|
175
|
-
function switchTpl(data, options, asString) {
|
|
176
|
-
var html = Template(data, options);
|
|
177
|
-
return (asString || true) ? html : $(html);
|
|
127
|
+
function program3(depth0,data) {
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
return "checked";
|
|
178
131
|
}
|
|
179
132
|
|
|
133
|
+
function program5(depth0,data) {
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
return "active";
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
buffer += "<div class=\"switch ";
|
|
140
|
+
stack1 = helpers['if'].call(depth0, (depth0 && depth0.monoStyle), {hash:{},inverse:self.noop,fn:self.program(1, program1, data),data:data});
|
|
141
|
+
if(stack1 || stack1 === 0) { buffer += stack1; }
|
|
142
|
+
buffer += "\" title=\"";
|
|
143
|
+
if (helper = helpers.title) { stack1 = helper.call(depth0, {hash:{},data:data}); }
|
|
144
|
+
else { helper = (depth0 && depth0.title); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }
|
|
145
|
+
buffer += escapeExpression(stack1)
|
|
146
|
+
+ "\">\n <input type=\"checkbox\" name=\"";
|
|
147
|
+
if (helper = helpers.name) { stack1 = helper.call(depth0, {hash:{},data:data}); }
|
|
148
|
+
else { helper = (depth0 && depth0.name); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }
|
|
149
|
+
buffer += escapeExpression(stack1)
|
|
150
|
+
+ "\" ";
|
|
151
|
+
stack1 = helpers['if'].call(depth0, ((stack1 = (depth0 && depth0.on)),stack1 == null || stack1 === false ? stack1 : stack1.active), {hash:{},inverse:self.noop,fn:self.program(3, program3, data),data:data});
|
|
152
|
+
if(stack1 || stack1 === 0) { buffer += stack1; }
|
|
153
|
+
buffer += ">\n <label>\n <span class=\"off ";
|
|
154
|
+
stack1 = helpers['if'].call(depth0, ((stack1 = (depth0 && depth0.off)),stack1 == null || stack1 === false ? stack1 : stack1.active), {hash:{},inverse:self.noop,fn:self.program(5, program5, data),data:data});
|
|
155
|
+
if(stack1 || stack1 === 0) { buffer += stack1; }
|
|
156
|
+
buffer += "\">"
|
|
157
|
+
+ escapeExpression(((stack1 = ((stack1 = (depth0 && depth0.off)),stack1 == null || stack1 === false ? stack1 : stack1.label)),typeof stack1 === functionType ? stack1.apply(depth0) : stack1))
|
|
158
|
+
+ "</span>\n <span class=\"on ";
|
|
159
|
+
stack1 = helpers['if'].call(depth0, ((stack1 = (depth0 && depth0.on)),stack1 == null || stack1 === false ? stack1 : stack1.active), {hash:{},inverse:self.noop,fn:self.program(5, program5, data),data:data});
|
|
160
|
+
if(stack1 || stack1 === 0) { buffer += stack1; }
|
|
161
|
+
buffer += "\">"
|
|
162
|
+
+ escapeExpression(((stack1 = ((stack1 = (depth0 && depth0.on)),stack1 == null || stack1 === false ? stack1 : stack1.label)),typeof stack1 === functionType ? stack1.apply(depth0) : stack1))
|
|
163
|
+
+ "</span>\n </label>\n</div>\n";
|
|
164
|
+
return buffer;
|
|
165
|
+
});
|
|
166
|
+
function switchTpl(data, options, asString) {
|
|
167
|
+
var html = Template(data, options);
|
|
168
|
+
return (asString || true) ? html : $(html);
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
/**
|
|
172
|
+
* This program is free software; you can redistribute it and/or
|
|
173
|
+
* modify it under the terms of the GNU General Public License
|
|
174
|
+
* as published by the Free Software Foundation; under version 2
|
|
175
|
+
* of the License (non-upgradable).
|
|
176
|
+
*
|
|
177
|
+
* This program is distributed in the hope that it will be useful,
|
|
178
|
+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
179
|
+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
180
|
+
* GNU General Public License for more details.
|
|
181
|
+
*
|
|
182
|
+
* You should have received a copy of the GNU General Public License
|
|
183
|
+
* along with this program; if not, write to the Free Software
|
|
184
|
+
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
185
|
+
*
|
|
186
|
+
* Copyright (c) 2017-2019 (original work) Open Assessment Technologies SA ;
|
|
187
|
+
*/
|
|
188
|
+
var states = {
|
|
189
|
+
on: 'on',
|
|
190
|
+
off: 'off'
|
|
191
|
+
};
|
|
192
|
+
var defaultConfig = {
|
|
193
|
+
on: {
|
|
194
|
+
label: __('On')
|
|
195
|
+
},
|
|
196
|
+
off: {
|
|
197
|
+
label: __('Off'),
|
|
198
|
+
active: true
|
|
199
|
+
},
|
|
200
|
+
title: ''
|
|
201
|
+
};
|
|
202
|
+
/**
|
|
203
|
+
* The factory that creates a switch component
|
|
204
|
+
*
|
|
205
|
+
* @param {jQueryElement} $container - where to append the component
|
|
206
|
+
* @param {Object} config - the component config
|
|
207
|
+
* @param {Object} [config.on] - the on config
|
|
208
|
+
* @param {String} [config.on.label] - the on button label
|
|
209
|
+
* @param {Boolean} [config.on.active = false] - the default state
|
|
210
|
+
* @param {Object} [config.off] - the off config
|
|
211
|
+
* @param {String} [config.off.label] - the off button label
|
|
212
|
+
* @param {Boolean} [config.off.active = true] - the default state
|
|
213
|
+
* @param {String} [config.title] - the component title tooltip
|
|
214
|
+
* @param {String} [config.name] - the component name (used by the element)
|
|
215
|
+
* @param {Boolean} [config.monoStyle] - true if the styling should match for off & on
|
|
216
|
+
* @returns {switchComponent} the component
|
|
217
|
+
*/
|
|
218
|
+
|
|
219
|
+
function switchFactory($container, config) {
|
|
220
|
+
var onElt;
|
|
221
|
+
var offElt;
|
|
180
222
|
/**
|
|
181
|
-
*
|
|
182
|
-
* modify it under the terms of the GNU General Public License
|
|
183
|
-
* as published by the Free Software Foundation; under version 2
|
|
184
|
-
* of the License (non-upgradable).
|
|
185
|
-
*
|
|
186
|
-
* This program is distributed in the hope that it will be useful,
|
|
187
|
-
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
188
|
-
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
189
|
-
* GNU General Public License for more details.
|
|
190
|
-
*
|
|
191
|
-
* You should have received a copy of the GNU General Public License
|
|
192
|
-
* along with this program; if not, write to the Free Software
|
|
193
|
-
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
194
|
-
*
|
|
195
|
-
* Copyright (c) 2017-2019 (original work) Open Assessment Technologies SA ;
|
|
223
|
+
* The component API
|
|
196
224
|
*/
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
225
|
+
|
|
226
|
+
var api = {
|
|
227
|
+
/**
|
|
228
|
+
* Retrieve the component name
|
|
229
|
+
* @returns {String} it's name
|
|
230
|
+
*/
|
|
231
|
+
getName: function getName() {
|
|
232
|
+
return this.config.name;
|
|
204
233
|
},
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
234
|
+
|
|
235
|
+
/**
|
|
236
|
+
* Is the switch on ?
|
|
237
|
+
* @returns {Boolean}
|
|
238
|
+
*/
|
|
239
|
+
isOn: function isOn() {
|
|
240
|
+
return this.is(states.on);
|
|
208
241
|
},
|
|
209
|
-
title: ''
|
|
210
|
-
};
|
|
211
|
-
/**
|
|
212
|
-
* The factory that creates a switch component
|
|
213
|
-
*
|
|
214
|
-
* @param {jQueryElement} $container - where to append the component
|
|
215
|
-
* @param {Object} config - the component config
|
|
216
|
-
* @param {Object} [config.on] - the on config
|
|
217
|
-
* @param {String} [config.on.label] - the on button label
|
|
218
|
-
* @param {Boolean} [config.on.active = false] - the default state
|
|
219
|
-
* @param {Object} [config.off] - the off config
|
|
220
|
-
* @param {String} [config.off.label] - the off button label
|
|
221
|
-
* @param {Boolean} [config.off.active = true] - the default state
|
|
222
|
-
* @param {String} [config.title] - the component title tooltip
|
|
223
|
-
* @param {String} [config.name] - the component name (used by the element)
|
|
224
|
-
* @param {Boolean} [config.monoStyle] - true if the styling should match for off & on
|
|
225
|
-
* @returns {switchComponent} the component
|
|
226
|
-
*/
|
|
227
242
|
|
|
228
|
-
function switchFactory($container, config) {
|
|
229
|
-
var onElt;
|
|
230
|
-
var offElt;
|
|
231
243
|
/**
|
|
232
|
-
*
|
|
244
|
+
* Is the switch off ?
|
|
245
|
+
* @returns {Boolean}
|
|
233
246
|
*/
|
|
247
|
+
isOff: function isOff() {
|
|
248
|
+
return !this.is(states.on);
|
|
249
|
+
},
|
|
234
250
|
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
* Is the switch on ?
|
|
246
|
-
* @returns {Boolean}
|
|
247
|
-
*/
|
|
248
|
-
isOn: function isOn() {
|
|
249
|
-
return this.is(states.on);
|
|
250
|
-
},
|
|
251
|
-
|
|
252
|
-
/**
|
|
253
|
-
* Is the switch off ?
|
|
254
|
-
* @returns {Boolean}
|
|
255
|
-
*/
|
|
256
|
-
isOff: function isOff() {
|
|
257
|
-
return !this.is(states.on);
|
|
258
|
-
},
|
|
259
|
-
|
|
260
|
-
/**
|
|
261
|
-
* Switch On (if not yet on)
|
|
262
|
-
* @returns {switchComponent} chains
|
|
263
|
-
* @fires switchComponent#change
|
|
264
|
-
* @fires switchComponent#on
|
|
265
|
-
*/
|
|
266
|
-
setOn: function setOn() {
|
|
267
|
-
if (!this.isOn()) {
|
|
268
|
-
this.setState(states.on, true);
|
|
269
|
-
}
|
|
251
|
+
/**
|
|
252
|
+
* Switch On (if not yet on)
|
|
253
|
+
* @returns {switchComponent} chains
|
|
254
|
+
* @fires switchComponent#change
|
|
255
|
+
* @fires switchComponent#on
|
|
256
|
+
*/
|
|
257
|
+
setOn: function setOn() {
|
|
258
|
+
if (!this.isOn()) {
|
|
259
|
+
this.setState(states.on, true);
|
|
260
|
+
}
|
|
270
261
|
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
262
|
+
if (this.is('rendered')) {
|
|
263
|
+
offElt.removeClass('active');
|
|
264
|
+
onElt.addClass('active');
|
|
265
|
+
this.trigger('change', states.on).trigger(states.on);
|
|
266
|
+
}
|
|
276
267
|
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
/**
|
|
281
|
-
* Switch Off (if not yet off)
|
|
282
|
-
* @returns {switchComponent} chains
|
|
283
|
-
* @fires switchComponent#change
|
|
284
|
-
* @fires switchComponent#off
|
|
285
|
-
*/
|
|
286
|
-
setOff: function setOff() {
|
|
287
|
-
if (!this.isOff()) {
|
|
288
|
-
this.setState(states.on, false);
|
|
289
|
-
}
|
|
268
|
+
return this;
|
|
269
|
+
},
|
|
290
270
|
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
271
|
+
/**
|
|
272
|
+
* Switch Off (if not yet off)
|
|
273
|
+
* @returns {switchComponent} chains
|
|
274
|
+
* @fires switchComponent#change
|
|
275
|
+
* @fires switchComponent#off
|
|
276
|
+
*/
|
|
277
|
+
setOff: function setOff() {
|
|
278
|
+
if (!this.isOff()) {
|
|
279
|
+
this.setState(states.on, false);
|
|
280
|
+
}
|
|
296
281
|
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
* Toggle on/off
|
|
302
|
-
* @returns {switchComponent} chains
|
|
303
|
-
*/
|
|
304
|
-
toggle: function toggle() {
|
|
305
|
-
return this.isOn() ? this.setOff() : this.setOn();
|
|
306
|
-
},
|
|
307
|
-
|
|
308
|
-
/**
|
|
309
|
-
* Get the value
|
|
310
|
-
* @returns {String} on/off
|
|
311
|
-
*/
|
|
312
|
-
getValue: function getValue() {
|
|
313
|
-
return this.is(states.on) ? states.on : states.off;
|
|
282
|
+
if (this.is('rendered')) {
|
|
283
|
+
onElt.removeClass('active');
|
|
284
|
+
offElt.addClass('active');
|
|
285
|
+
this.trigger('change', states.off).trigger(states.off);
|
|
314
286
|
}
|
|
315
|
-
};
|
|
316
|
-
var switchComponent = component(api, defaultConfig).setTemplate(switchTpl).on('init', function () {
|
|
317
|
-
//generates a name if none
|
|
318
|
-
if (!this.config.name) {
|
|
319
|
-
this.config.name = 'switch-' + uuid();
|
|
320
|
-
} //keeps defaults values if overridden
|
|
321
287
|
|
|
288
|
+
return this;
|
|
289
|
+
},
|
|
322
290
|
|
|
323
|
-
|
|
324
|
-
|
|
291
|
+
/**
|
|
292
|
+
* Toggle on/off
|
|
293
|
+
* @returns {switchComponent} chains
|
|
294
|
+
*/
|
|
295
|
+
toggle: function toggle() {
|
|
296
|
+
return this.isOn() ? this.setOff() : this.setOn();
|
|
297
|
+
},
|
|
325
298
|
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
299
|
+
/**
|
|
300
|
+
* Get the value
|
|
301
|
+
* @returns {String} on/off
|
|
302
|
+
*/
|
|
303
|
+
getValue: function getValue() {
|
|
304
|
+
return this.is(states.on) ? states.on : states.off;
|
|
305
|
+
}
|
|
306
|
+
};
|
|
307
|
+
var switchComponent = component(api, defaultConfig).setTemplate(switchTpl).on('init', function () {
|
|
308
|
+
//generates a name if none
|
|
309
|
+
if (!this.config.name) {
|
|
310
|
+
this.config.name = 'switch-' + uuid();
|
|
311
|
+
} //keeps defaults values if overridden
|
|
332
312
|
|
|
333
|
-
this.render($container);
|
|
334
|
-
}).on('render', function () {
|
|
335
|
-
var self = this;
|
|
336
|
-
var $component = this.getElement();
|
|
337
|
-
onElt = $$1('.' + states.on, $component);
|
|
338
|
-
offElt = $$1('.' + states.off, $component); //switch
|
|
339
|
-
|
|
340
|
-
$$1(':checkbox', $component).on('change', function (e) {
|
|
341
|
-
e.preventDefault();
|
|
342
|
-
self.toggle();
|
|
343
|
-
});
|
|
344
|
-
});
|
|
345
313
|
|
|
346
|
-
_.
|
|
347
|
-
|
|
314
|
+
this.config.on = _.defaults(this.config.on, defaultConfig.on);
|
|
315
|
+
this.config.off = _.defaults(this.config.off, defaultConfig.off); //initial state
|
|
316
|
+
|
|
317
|
+
if (this.config.on.active === true) {
|
|
318
|
+
this.config.off.active = false;
|
|
319
|
+
this.setOn();
|
|
320
|
+
} else {
|
|
321
|
+
this.setOff();
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
this.render($container);
|
|
325
|
+
}).on('render', function () {
|
|
326
|
+
var self = this;
|
|
327
|
+
var $component = this.getElement();
|
|
328
|
+
onElt = $$1('.' + states.on, $component);
|
|
329
|
+
offElt = $$1('.' + states.off, $component); //switch
|
|
330
|
+
|
|
331
|
+
$$1(':checkbox', $component).on('change', function (e) {
|
|
332
|
+
e.preventDefault();
|
|
333
|
+
self.toggle();
|
|
348
334
|
});
|
|
335
|
+
});
|
|
349
336
|
|
|
350
|
-
|
|
351
|
-
|
|
337
|
+
_.defer(function () {
|
|
338
|
+
switchComponent.init(config);
|
|
339
|
+
});
|
|
340
|
+
|
|
341
|
+
return switchComponent;
|
|
342
|
+
}
|
|
352
343
|
|
|
353
|
-
|
|
344
|
+
return switchFactory;
|
|
354
345
|
|
|
355
346
|
});
|