@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/dashboard.js
CHANGED
|
@@ -1,341 +1,332 @@
|
|
|
1
1
|
define(['i18n', 'lodash', 'ui/component', 'handlebars', 'lib/dompurify/purify', 'css!ui/dashboard/css/dashboard.css'], function (__, _, component, Handlebars, DOMPurify, dashboard_css) { 'use strict';
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
3
|
+
__ = __ && Object.prototype.hasOwnProperty.call(__, 'default') ? __['default'] : __;
|
|
4
|
+
_ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;
|
|
5
|
+
component = component && Object.prototype.hasOwnProperty.call(component, 'default') ? component['default'] : component;
|
|
6
|
+
Handlebars = Handlebars && Object.prototype.hasOwnProperty.call(Handlebars, 'default') ? Handlebars['default'] : Handlebars;
|
|
7
|
+
DOMPurify = DOMPurify && Object.prototype.hasOwnProperty.call(DOMPurify, 'default') ? DOMPurify['default'] : DOMPurify;
|
|
8
|
+
|
|
9
|
+
function _typeof(obj) {
|
|
10
|
+
"@babel/helpers - typeof";
|
|
11
|
+
|
|
12
|
+
return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) {
|
|
13
|
+
return typeof obj;
|
|
14
|
+
} : function (obj) {
|
|
15
|
+
return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;
|
|
16
|
+
}, _typeof(obj);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
function Helpers0 (hb) {
|
|
20
|
+
//register a i18n helper
|
|
21
|
+
hb.registerHelper('__', function (key) {
|
|
22
|
+
return __(key);
|
|
23
|
+
});
|
|
9
24
|
/**
|
|
10
|
-
*
|
|
11
|
-
* modify it under the terms of the GNU General Public License
|
|
12
|
-
* as published by the Free Software Foundation; under version 2
|
|
13
|
-
* of the License (non-upgradable).
|
|
14
|
-
*
|
|
15
|
-
* This program is distributed in the hope that it will be useful,
|
|
16
|
-
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
17
|
-
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
18
|
-
* GNU General Public License for more details.
|
|
19
|
-
*
|
|
20
|
-
* You should have received a copy of the GNU General Public License
|
|
21
|
-
* along with this program; if not, write to the Free Software
|
|
22
|
-
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
23
|
-
*
|
|
24
|
-
* Copyright (c) 2013-2019 (original work) Open Assessment Technologies SA (under the project TAO-PRODUCT);
|
|
25
|
+
* Register dompurify helper
|
|
25
26
|
*
|
|
27
|
+
* https://github.com/cure53/DOMPurify
|
|
28
|
+
* with config SAFE_FOR_TEMPLATES: true
|
|
29
|
+
* to make output safe for template systems
|
|
30
|
+
*/
|
|
31
|
+
|
|
32
|
+
hb.registerHelper('dompurify', function (context) {
|
|
33
|
+
return DOMPurify.sanitize(context);
|
|
34
|
+
});
|
|
35
|
+
/**
|
|
36
|
+
* Register join helper
|
|
26
37
|
*
|
|
38
|
+
* Example :
|
|
39
|
+
* var values = {a:v1, b:v2, c:v3};
|
|
40
|
+
* Using {{{join attributes '=' ' ' '"'}}} will return : a="v1" b="v2" c="v3"
|
|
41
|
+
* Using {{{join values null ' or ' '*'}}} will return : *v1* or *v2* or *v3*
|
|
27
42
|
*/
|
|
28
|
-
function Helpers0 (hb) {
|
|
29
|
-
//register a i18n helper
|
|
30
|
-
hb.registerHelper('__', function (key) {
|
|
31
|
-
return __(key);
|
|
32
|
-
});
|
|
33
|
-
/**
|
|
34
|
-
* Register dompurify helper
|
|
35
|
-
*
|
|
36
|
-
* https://github.com/cure53/DOMPurify
|
|
37
|
-
* with config SAFE_FOR_TEMPLATES: true
|
|
38
|
-
* to make output safe for template systems
|
|
39
|
-
*/
|
|
40
43
|
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
*
|
|
47
|
-
* Example :
|
|
48
|
-
* var values = {a:v1, b:v2, c:v3};
|
|
49
|
-
* Using {{{join attributes '=' ' ' '"'}}} will return : a="v1" b="v2" c="v3"
|
|
50
|
-
* Using {{{join values null ' or ' '*'}}} will return : *v1* or *v2* or *v3*
|
|
51
|
-
*/
|
|
44
|
+
hb.registerHelper('join', function (arr, keyValueGlue, fragmentGlue, wrapper) {
|
|
45
|
+
var fragments = [];
|
|
46
|
+
keyValueGlue = typeof keyValueGlue === 'string' ? keyValueGlue : undefined;
|
|
47
|
+
fragmentGlue = typeof fragmentGlue === 'string' ? fragmentGlue : ' ';
|
|
48
|
+
wrapper = typeof wrapper === 'string' ? wrapper : '"';
|
|
52
49
|
|
|
53
|
-
|
|
54
|
-
var
|
|
55
|
-
keyValueGlue = typeof keyValueGlue === 'string' ? keyValueGlue : undefined;
|
|
56
|
-
fragmentGlue = typeof fragmentGlue === 'string' ? fragmentGlue : ' ';
|
|
57
|
-
wrapper = typeof wrapper === 'string' ? wrapper : '"';
|
|
58
|
-
|
|
59
|
-
_.forIn(arr, function (value, key) {
|
|
60
|
-
var fragment = '';
|
|
61
|
-
|
|
62
|
-
if (value !== null || value !== undefined) {
|
|
63
|
-
if (typeof value === 'boolean') {
|
|
64
|
-
value = value ? 'true' : 'false';
|
|
65
|
-
} else if (typeof value === 'object') {
|
|
66
|
-
value = _.values(value).join(' ');
|
|
67
|
-
}
|
|
68
|
-
} else {
|
|
69
|
-
value = '';
|
|
70
|
-
}
|
|
50
|
+
_.forIn(arr, function (value, key) {
|
|
51
|
+
var fragment = '';
|
|
71
52
|
|
|
72
|
-
|
|
73
|
-
|
|
53
|
+
if (value !== null || value !== undefined) {
|
|
54
|
+
if (typeof value === 'boolean') {
|
|
55
|
+
value = value ? 'true' : 'false';
|
|
56
|
+
} else if (_typeof(value) === 'object') {
|
|
57
|
+
value = _.values(value).join(' ');
|
|
74
58
|
}
|
|
75
|
-
|
|
76
|
-
fragment += wrapper + value + wrapper;
|
|
77
|
-
fragments.push(fragment);
|
|
78
|
-
});
|
|
79
|
-
|
|
80
|
-
return fragments.join(fragmentGlue);
|
|
81
|
-
}); //register a classic "for loop" helper
|
|
82
|
-
//it also adds a local variable "i" as the index in each iteration loop
|
|
83
|
-
|
|
84
|
-
hb.registerHelper('for', function (startIndex, stopIndex, increment, options) {
|
|
85
|
-
var ret = '';
|
|
86
|
-
startIndex = parseInt(startIndex);
|
|
87
|
-
stopIndex = parseInt(stopIndex);
|
|
88
|
-
increment = parseInt(increment);
|
|
89
|
-
|
|
90
|
-
for (var i = startIndex; i < stopIndex; i += increment) {
|
|
91
|
-
ret += options.fn(_.extend({}, this, {
|
|
92
|
-
i: i
|
|
93
|
-
}));
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
return ret;
|
|
97
|
-
});
|
|
98
|
-
hb.registerHelper('equal', function (var1, var2, options) {
|
|
99
|
-
if (var1 == var2) {
|
|
100
|
-
return options.fn(this);
|
|
101
59
|
} else {
|
|
102
|
-
|
|
60
|
+
value = '';
|
|
103
61
|
}
|
|
104
|
-
}); // register a "get property" helper
|
|
105
|
-
// it gets the named property from the provided context
|
|
106
62
|
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
}); // register an 'includes' helper
|
|
110
|
-
// it checks if value is in array
|
|
111
|
-
|
|
112
|
-
hb.registerHelper('includes', function (haystack, needle, options) {
|
|
113
|
-
if (_.contains(haystack, needle)) {
|
|
114
|
-
return options.fn(this);
|
|
63
|
+
if (keyValueGlue !== undefined) {
|
|
64
|
+
fragment += key + keyValueGlue;
|
|
115
65
|
}
|
|
116
|
-
});
|
|
117
|
-
}
|
|
118
66
|
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
Helpers0.__initialized = true;
|
|
122
|
-
}
|
|
123
|
-
var Template = Handlebars.template(function (Handlebars,depth0,helpers,partials,data) {
|
|
124
|
-
this.compilerInfo = [4,'>= 1.0.0'];
|
|
125
|
-
helpers = this.merge(helpers, Handlebars.helpers); data = data || {};
|
|
126
|
-
var buffer = "", stack1, helper, functionType="function", escapeExpression=this.escapeExpression;
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
buffer += "<div class=\"readiness-dashboard-container\">\n <h3 class=\"dashboard-header\">";
|
|
130
|
-
if (helper = helpers.headerText) { stack1 = helper.call(depth0, {hash:{},data:data}); }
|
|
131
|
-
else { helper = (depth0 && depth0.headerText); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }
|
|
132
|
-
buffer += escapeExpression(stack1)
|
|
133
|
-
+ "</h3>\n <section>\n <div class=\"dashboard-loading\" style=\"display: none;\">\n <p class=\"dashboard-text\">\n ";
|
|
134
|
-
if (helper = helpers.loadingText) { stack1 = helper.call(depth0, {hash:{},data:data}); }
|
|
135
|
-
else { helper = (depth0 && depth0.loadingText); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }
|
|
136
|
-
buffer += escapeExpression(stack1)
|
|
137
|
-
+ "\n </p>\n </div>\n <div class=\"dashboard-metrics_container\"></div>\n <div class=\"dashboard-warning\" style=\"display: none;\">\n <p class=\"dashboard-text\">\n ";
|
|
138
|
-
if (helper = helpers.warningText) { stack1 = helper.call(depth0, {hash:{},data:data}); }
|
|
139
|
-
else { helper = (depth0 && depth0.warningText); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }
|
|
140
|
-
buffer += escapeExpression(stack1)
|
|
141
|
-
+ "\n </p>\n </div>\n </section>\n</div>\n";
|
|
142
|
-
return buffer;
|
|
67
|
+
fragment += wrapper + value + wrapper;
|
|
68
|
+
fragments.push(fragment);
|
|
143
69
|
});
|
|
144
|
-
function dashboardTpl(data, options, asString) {
|
|
145
|
-
var html = Template(data, options);
|
|
146
|
-
return (asString || true) ? html : $(html);
|
|
147
|
-
}
|
|
148
70
|
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
else { helper = (depth0 && depth0.title); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }
|
|
164
|
-
buffer += escapeExpression(stack1)
|
|
165
|
-
+ "</h4>\n <div class=\"dashboard-metric_score-container\">\n <div class=\"dashboard-metric_score score-";
|
|
166
|
-
if (helper = helpers.state) { stack1 = helper.call(depth0, {hash:{},data:data}); }
|
|
167
|
-
else { helper = (depth0 && depth0.state); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }
|
|
168
|
-
buffer += escapeExpression(stack1)
|
|
169
|
-
+ "\" style=\"width: ";
|
|
170
|
-
if (helper = helpers.score) { stack1 = helper.call(depth0, {hash:{},data:data}); }
|
|
171
|
-
else { helper = (depth0 && depth0.score); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }
|
|
172
|
-
buffer += escapeExpression(stack1)
|
|
173
|
-
+ "%;\"></div>\n </div>\n <ul class=\"dashboard-metric_info\">\n ";
|
|
174
|
-
stack1 = helpers.each.call(depth0, (depth0 && depth0.info), {hash:{},inverse:self.noop,fn:self.program(2, program2, data),data:data});
|
|
175
|
-
if(stack1 || stack1 === 0) { buffer += stack1; }
|
|
176
|
-
buffer += "\n </ul>\n </li>\n ";
|
|
177
|
-
return buffer;
|
|
71
|
+
return fragments.join(fragmentGlue);
|
|
72
|
+
}); //register a classic "for loop" helper
|
|
73
|
+
//it also adds a local variable "i" as the index in each iteration loop
|
|
74
|
+
|
|
75
|
+
hb.registerHelper('for', function (startIndex, stopIndex, increment, options) {
|
|
76
|
+
var ret = '';
|
|
77
|
+
startIndex = parseInt(startIndex);
|
|
78
|
+
stopIndex = parseInt(stopIndex);
|
|
79
|
+
increment = parseInt(increment);
|
|
80
|
+
|
|
81
|
+
for (var i = startIndex; i < stopIndex; i += increment) {
|
|
82
|
+
ret += options.fn(_.extend({}, this, {
|
|
83
|
+
i: i
|
|
84
|
+
}));
|
|
178
85
|
}
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
if (
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
return buffer;
|
|
86
|
+
|
|
87
|
+
return ret;
|
|
88
|
+
});
|
|
89
|
+
hb.registerHelper('equal', function (var1, var2, options) {
|
|
90
|
+
if (var1 == var2) {
|
|
91
|
+
return options.fn(this);
|
|
92
|
+
} else {
|
|
93
|
+
return options.inverse(this);
|
|
188
94
|
}
|
|
95
|
+
}); // register a "get property" helper
|
|
96
|
+
// it gets the named property from the provided context
|
|
189
97
|
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
if(
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
98
|
+
hb.registerHelper('property', function (name, context) {
|
|
99
|
+
return context[name] || '';
|
|
100
|
+
}); // register an 'includes' helper
|
|
101
|
+
// it checks if value is in array
|
|
102
|
+
|
|
103
|
+
hb.registerHelper('includes', function (haystack, needle, options) {
|
|
104
|
+
if (_.contains(haystack, needle)) {
|
|
105
|
+
return options.fn(this);
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
if (!Helpers0.__initialized) {
|
|
111
|
+
Helpers0(Handlebars);
|
|
112
|
+
Helpers0.__initialized = true;
|
|
113
|
+
}
|
|
114
|
+
var Template = Handlebars.template(function (Handlebars,depth0,helpers,partials,data) {
|
|
115
|
+
this.compilerInfo = [4,'>= 1.0.0'];
|
|
116
|
+
helpers = this.merge(helpers, Handlebars.helpers); data = data || {};
|
|
117
|
+
var buffer = "", stack1, helper, functionType="function", escapeExpression=this.escapeExpression;
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
buffer += "<div class=\"readiness-dashboard-container\">\n <h3 class=\"dashboard-header\">";
|
|
121
|
+
if (helper = helpers.headerText) { stack1 = helper.call(depth0, {hash:{},data:data}); }
|
|
122
|
+
else { helper = (depth0 && depth0.headerText); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }
|
|
123
|
+
buffer += escapeExpression(stack1)
|
|
124
|
+
+ "</h3>\n <section>\n <div class=\"dashboard-loading\" style=\"display: none;\">\n <p class=\"dashboard-text\">\n ";
|
|
125
|
+
if (helper = helpers.loadingText) { stack1 = helper.call(depth0, {hash:{},data:data}); }
|
|
126
|
+
else { helper = (depth0 && depth0.loadingText); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }
|
|
127
|
+
buffer += escapeExpression(stack1)
|
|
128
|
+
+ "\n </p>\n </div>\n <div class=\"dashboard-metrics_container\"></div>\n <div class=\"dashboard-warning\" style=\"display: none;\">\n <p class=\"dashboard-text\">\n ";
|
|
129
|
+
if (helper = helpers.warningText) { stack1 = helper.call(depth0, {hash:{},data:data}); }
|
|
130
|
+
else { helper = (depth0 && depth0.warningText); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }
|
|
131
|
+
buffer += escapeExpression(stack1)
|
|
132
|
+
+ "\n </p>\n </div>\n </section>\n</div>\n";
|
|
133
|
+
return buffer;
|
|
134
|
+
});
|
|
135
|
+
function dashboardTpl(data, options, asString) {
|
|
136
|
+
var html = Template(data, options);
|
|
137
|
+
return (asString || true) ? html : $(html);
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
if (!Helpers0.__initialized) {
|
|
141
|
+
Helpers0(Handlebars);
|
|
142
|
+
Helpers0.__initialized = true;
|
|
143
|
+
}
|
|
144
|
+
var Template$1 = Handlebars.template(function (Handlebars,depth0,helpers,partials,data) {
|
|
145
|
+
this.compilerInfo = [4,'>= 1.0.0'];
|
|
146
|
+
helpers = this.merge(helpers, Handlebars.helpers); data = data || {};
|
|
147
|
+
var buffer = "", stack1, helper, functionType="function", escapeExpression=this.escapeExpression, self=this;
|
|
148
|
+
|
|
149
|
+
function program1(depth0,data) {
|
|
150
|
+
|
|
151
|
+
var buffer = "", stack1, helper;
|
|
152
|
+
buffer += "\n <li class=\"dashboard-metric\">\n <h4 class=\"dashboard-metric_title\">";
|
|
153
|
+
if (helper = helpers.title) { stack1 = helper.call(depth0, {hash:{},data:data}); }
|
|
154
|
+
else { helper = (depth0 && depth0.title); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }
|
|
155
|
+
buffer += escapeExpression(stack1)
|
|
156
|
+
+ "</h4>\n <div class=\"dashboard-metric_score-container\">\n <div class=\"dashboard-metric_score score-";
|
|
157
|
+
if (helper = helpers.state) { stack1 = helper.call(depth0, {hash:{},data:data}); }
|
|
158
|
+
else { helper = (depth0 && depth0.state); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }
|
|
159
|
+
buffer += escapeExpression(stack1)
|
|
160
|
+
+ "\" style=\"width: ";
|
|
161
|
+
if (helper = helpers.score) { stack1 = helper.call(depth0, {hash:{},data:data}); }
|
|
162
|
+
else { helper = (depth0 && depth0.score); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }
|
|
163
|
+
buffer += escapeExpression(stack1)
|
|
164
|
+
+ "%;\"></div>\n </div>\n <ul class=\"dashboard-metric_info\">\n ";
|
|
165
|
+
stack1 = helpers.each.call(depth0, (depth0 && depth0.info), {hash:{},inverse:self.noop,fn:self.program(2, program2, data),data:data});
|
|
166
|
+
if(stack1 || stack1 === 0) { buffer += stack1; }
|
|
167
|
+
buffer += "\n </ul>\n </li>\n ";
|
|
168
|
+
return buffer;
|
|
169
|
+
}
|
|
170
|
+
function program2(depth0,data) {
|
|
171
|
+
|
|
172
|
+
var buffer = "", stack1, helper;
|
|
173
|
+
buffer += "\n <li class=\"dashboard-metric_info-item\">";
|
|
174
|
+
if (helper = helpers.text) { stack1 = helper.call(depth0, {hash:{},data:data}); }
|
|
175
|
+
else { helper = (depth0 && depth0.text); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }
|
|
176
|
+
buffer += escapeExpression(stack1)
|
|
177
|
+
+ "</li>\n ";
|
|
178
|
+
return buffer;
|
|
203
179
|
}
|
|
204
180
|
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
181
|
+
buffer += "<ul class=\"dashboard-metrics_list ";
|
|
182
|
+
if (helper = helpers.layoutType) { stack1 = helper.call(depth0, {hash:{},data:data}); }
|
|
183
|
+
else { helper = (depth0 && depth0.layoutType); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }
|
|
184
|
+
buffer += escapeExpression(stack1)
|
|
185
|
+
+ "\">\n ";
|
|
186
|
+
stack1 = helpers.each.call(depth0, (depth0 && depth0.data), {hash:{},inverse:self.noop,fn:self.program(1, program1, data),data:data});
|
|
187
|
+
if(stack1 || stack1 === 0) { buffer += stack1; }
|
|
188
|
+
buffer += "\n</ul>\n";
|
|
189
|
+
return buffer;
|
|
190
|
+
});
|
|
191
|
+
function metricsListTpl(data, options, asString) {
|
|
192
|
+
var html = Template$1(data, options);
|
|
193
|
+
return (asString || true) ? html : $(html);
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
/**
|
|
197
|
+
* This program is free software; you can redistribute it and/or
|
|
198
|
+
* modify it under the terms of the GNU General Public License
|
|
199
|
+
* as published by the Free Software Foundation; under version 2
|
|
200
|
+
* of the License (non-upgradable).
|
|
201
|
+
*
|
|
202
|
+
* This program is distributed in the hope that it will be useful,
|
|
203
|
+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
204
|
+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
205
|
+
* GNU General Public License for more details.
|
|
206
|
+
*
|
|
207
|
+
* You should have received a copy of the GNU General Public License
|
|
208
|
+
* along with this program; if not, write to the Free Software
|
|
209
|
+
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
210
|
+
*
|
|
211
|
+
* Copyright (c) 2019 (original work) Open Assessment Technologies SA ;
|
|
212
|
+
*/
|
|
213
|
+
var defaults = {
|
|
214
|
+
headerText: __('Outlook on the next Synchronization'),
|
|
215
|
+
loadingText: __('Creating report ...'),
|
|
216
|
+
warningText: __('Please contact your system administrator.'),
|
|
217
|
+
loading: false,
|
|
218
|
+
// should display loading screen
|
|
219
|
+
data: [],
|
|
220
|
+
// metricts that should be displayed
|
|
221
|
+
scoreState: {
|
|
222
|
+
// score borders of different metrics states
|
|
223
|
+
error: 32,
|
|
224
|
+
warn: 65
|
|
225
|
+
},
|
|
226
|
+
layoutType: 'tiles'
|
|
227
|
+
};
|
|
228
|
+
/**
|
|
229
|
+
* Dashboard component to display metricts in pass/fail way
|
|
230
|
+
*
|
|
231
|
+
* @param {Object} $container
|
|
232
|
+
* @param {Object} config
|
|
233
|
+
* @param {String} [config.headerText]
|
|
234
|
+
* @param {String} [config.loadingText]
|
|
235
|
+
* @param {String} [config.warningText]
|
|
236
|
+
* @param {Boolean} [config.loading] - should display loading screen
|
|
237
|
+
* @param {string} [config.layoutType] - Type of the component layout. Possible values: 'tiles'|'list'
|
|
238
|
+
* @param {Array} [config.data] - metricts that should be displayed
|
|
239
|
+
* @param {String} data[].title - metric title
|
|
240
|
+
* @param {Number} data[].score - metric score
|
|
241
|
+
* @param {Array} data[].info - array of info labels
|
|
242
|
+
* @returns {readinessDashboard}
|
|
243
|
+
*/
|
|
244
|
+
|
|
245
|
+
function dashboardFactory(config) {
|
|
246
|
+
var specs = {
|
|
247
|
+
/**
|
|
248
|
+
* Clear dashboard
|
|
249
|
+
*/
|
|
250
|
+
clearDashboard: function clearDashboard() {
|
|
251
|
+
this.getElement().find('.dashboard-metrics_container').empty();
|
|
252
|
+
this.toggleWarningMessage(false);
|
|
234
253
|
},
|
|
235
|
-
layoutType: 'tiles'
|
|
236
|
-
};
|
|
237
|
-
/**
|
|
238
|
-
* Dashboard component to display metricts in pass/fail way
|
|
239
|
-
*
|
|
240
|
-
* @param {Object} $container
|
|
241
|
-
* @param {Object} config
|
|
242
|
-
* @param {String} [config.headerText]
|
|
243
|
-
* @param {String} [config.loadingText]
|
|
244
|
-
* @param {String} [config.warningText]
|
|
245
|
-
* @param {Boolean} [config.loading] - should display loading screen
|
|
246
|
-
* @param {string} [config.layoutType] - Type of the component layout. Possible values: 'tiles'|'list'
|
|
247
|
-
* @param {Array} [config.data] - metricts that should be displayed
|
|
248
|
-
* @param {String} data[].title - metric title
|
|
249
|
-
* @param {Number} data[].score - metric score
|
|
250
|
-
* @param {Array} data[].info - array of info labels
|
|
251
|
-
* @returns {readinessDashboard}
|
|
252
|
-
*/
|
|
253
254
|
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
this.toggleWarningMessage(false);
|
|
262
|
-
},
|
|
263
|
-
|
|
264
|
-
/**
|
|
265
|
-
* Return metric check state according to it socre
|
|
266
|
-
*
|
|
267
|
-
* @param {Number} socre - metric score
|
|
268
|
-
*/
|
|
269
|
-
mapScoreToState: function mapScoreToState(score) {
|
|
270
|
-
var scoreState = this.config.scoreState;
|
|
271
|
-
|
|
272
|
-
if (score > scoreState.warn) {
|
|
273
|
-
return 'success';
|
|
274
|
-
} else if (score > scoreState.error) {
|
|
275
|
-
return 'warn';
|
|
276
|
-
}
|
|
255
|
+
/**
|
|
256
|
+
* Return metric check state according to it socre
|
|
257
|
+
*
|
|
258
|
+
* @param {Number} socre - metric score
|
|
259
|
+
*/
|
|
260
|
+
mapScoreToState: function mapScoreToState(score) {
|
|
261
|
+
var scoreState = this.config.scoreState;
|
|
277
262
|
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
}
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
toggleLoadingBar: function toggleLoadingBar(display) {
|
|
314
|
-
this.getElement().find('.dashboard-loading').toggle(display);
|
|
315
|
-
},
|
|
316
|
-
|
|
317
|
-
/**
|
|
318
|
-
* Toggle warning message
|
|
319
|
-
*/
|
|
320
|
-
toggleWarningMessage: function toggleWarningMessage(display) {
|
|
321
|
-
this.getElement().find('.dashboard-warning').toggle(display);
|
|
263
|
+
if (score > scoreState.warn) {
|
|
264
|
+
return 'success';
|
|
265
|
+
} else if (score > scoreState.error) {
|
|
266
|
+
return 'warn';
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
return 'error';
|
|
270
|
+
},
|
|
271
|
+
|
|
272
|
+
/**
|
|
273
|
+
* Render list of provided metircs
|
|
274
|
+
*
|
|
275
|
+
* @param {Array} data - metrics data
|
|
276
|
+
* @param {String} data[].title - metric title
|
|
277
|
+
* @param {Number} data[].score - metric score
|
|
278
|
+
* @param {Array} data[].info - array of info labels
|
|
279
|
+
*/
|
|
280
|
+
renderMetrics: function renderMetrics(data) {
|
|
281
|
+
var $component = this.getElement();
|
|
282
|
+
var $listContainer = $component.find('.dashboard-metrics_container');
|
|
283
|
+
var self = this;
|
|
284
|
+
|
|
285
|
+
if (data && data.length) {
|
|
286
|
+
_.forEach(data, function (item) {
|
|
287
|
+
item.state = self.mapScoreToState(item.score);
|
|
288
|
+
});
|
|
289
|
+
|
|
290
|
+
this.toggleWarningMessage(_.some(data, function (item) {
|
|
291
|
+
return item.score <= self.config.scoreState.warn;
|
|
292
|
+
}));
|
|
293
|
+
var $metricsList = $(metricsListTpl({
|
|
294
|
+
data: data,
|
|
295
|
+
layoutType: self.config.layoutType
|
|
296
|
+
}));
|
|
297
|
+
$listContainer.append($metricsList);
|
|
322
298
|
}
|
|
323
|
-
}
|
|
299
|
+
},
|
|
300
|
+
|
|
324
301
|
/**
|
|
325
|
-
*
|
|
302
|
+
* Toggle loading bar
|
|
326
303
|
*/
|
|
304
|
+
toggleLoadingBar: function toggleLoadingBar(display) {
|
|
305
|
+
this.getElement().find('.dashboard-loading').toggle(display);
|
|
306
|
+
},
|
|
327
307
|
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
308
|
+
/**
|
|
309
|
+
* Toggle warning message
|
|
310
|
+
*/
|
|
311
|
+
toggleWarningMessage: function toggleWarningMessage(display) {
|
|
312
|
+
this.getElement().find('.dashboard-warning').toggle(display);
|
|
313
|
+
}
|
|
314
|
+
};
|
|
315
|
+
/**
|
|
316
|
+
* @typedef {dashboard}
|
|
317
|
+
*/
|
|
318
|
+
|
|
319
|
+
return component(specs, defaults).setTemplate(dashboardTpl).on('init', function () {
|
|
320
|
+
this.setState('loading', this.config.loading);
|
|
321
|
+
}).on('render', function () {
|
|
322
|
+
if (!this.is('loading')) {
|
|
323
|
+
this.renderMetrics(this.config.data);
|
|
324
|
+
} else {
|
|
325
|
+
this.toggleLoadingBar(true);
|
|
326
|
+
}
|
|
327
|
+
}).init(config);
|
|
328
|
+
}
|
|
338
329
|
|
|
339
|
-
|
|
330
|
+
return dashboardFactory;
|
|
340
331
|
|
|
341
332
|
});
|