@oat-sa/tao-core-ui 1.64.1 → 1.64.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/LICENSE +339 -339
- package/README.md +22 -22
- package/dist/actionbar.js +92 -92
- package/dist/adder.js +109 -109
- package/dist/animable/absorbable/absorbable.js +29 -29
- package/dist/animable/absorbable/css/absorb.css +7 -7
- package/dist/animable/absorbable/css/absorb.css.map +1 -1
- package/dist/animable/pulsable/css/pulse.css +7 -7
- package/dist/animable/pulsable/css/pulse.css.map +1 -1
- package/dist/animable/pulsable/pulsable.js +23 -23
- package/dist/areaBroker.js +51 -51
- package/dist/autocomplete/css/autocomplete.css +7 -7
- package/dist/autocomplete/css/autocomplete.css.map +1 -1
- package/dist/autocomplete.js +384 -384
- package/dist/autoscroll.js +22 -22
- package/dist/badge/badge.js +35 -35
- package/dist/badge/css/badge.css +7 -7
- package/dist/badge/css/badge.css.map +1 -1
- package/dist/breadcrumbs/css/breadcrumbs.css +7 -7
- package/dist/breadcrumbs/css/breadcrumbs.css.map +1 -1
- package/dist/breadcrumbs.js +57 -57
- package/dist/btngrouper.js +64 -64
- package/dist/bulkActionPopup/css/bulkActionPopup.css +7 -7
- package/dist/bulkActionPopup/css/bulkActionPopup.css.map +1 -1
- package/dist/bulkActionPopup.js +91 -91
- package/dist/button.js +89 -89
- package/dist/calculator/css/calculator.css +10 -10
- package/dist/calculator/css/calculator.css.map +1 -1
- package/dist/calculator.js +51 -51
- package/dist/cascadingComboBox.js +34 -34
- package/dist/ckeditor/ckConfigurator.js +49 -49
- package/dist/ckeditor/dtdHandler.js +110 -110
- package/dist/class/css/selector.css +7 -7
- package/dist/class/css/selector.css.map +1 -1
- package/dist/class/selector.js +98 -98
- package/dist/component/alignable.js +81 -81
- package/dist/component/containable.js +37 -37
- package/dist/component/css/components.css +7 -7
- package/dist/component/css/components.css.map +1 -1
- package/dist/component/css/windowComponent.css +7 -7
- package/dist/component/css/windowComponent.css.map +1 -1
- package/dist/component/draggable.js +25 -25
- package/dist/component/placeable.js +70 -70
- package/dist/component/resizable.js +61 -61
- package/dist/component/stackable.js +20 -20
- package/dist/component/windowed.js +46 -46
- package/dist/component.js +140 -140
- package/dist/container.js +76 -76
- package/dist/contextualPopup/css/contextualPopup.css +7 -7
- package/dist/contextualPopup/css/contextualPopup.css.map +1 -1
- package/dist/contextualPopup.js +100 -100
- package/dist/dashboard/css/dashboard.css +7 -7
- package/dist/dashboard/css/dashboard.css.map +1 -1
- package/dist/dashboard.js +62 -62
- package/dist/datalist/css/datalist.css +7 -7
- package/dist/datalist/css/datalist.css.map +1 -1
- package/dist/datalist.js +147 -147
- package/dist/datatable/css/datatable.css +7 -7
- package/dist/datatable/css/datatable.css.map +1 -1
- package/dist/datatable/filterStrategy/filterStrategy.js +27 -27
- package/dist/datatable/filterStrategy/multiple.js +25 -25
- package/dist/datatable/filterStrategy/single.js +25 -25
- package/dist/datatable.js +377 -377
- package/dist/dateRange/css/dateRange.css +7 -7
- package/dist/dateRange/css/dateRange.css.map +1 -1
- package/dist/dateRange/dateRange.js +97 -97
- package/dist/datetime/css/picker.css +7 -7
- package/dist/datetime/css/picker.css.map +1 -1
- package/dist/datetime/picker.js +161 -161
- package/dist/deleter.js +79 -79
- package/dist/destination/css/selector.css +7 -7
- package/dist/destination/css/selector.css.map +1 -1
- package/dist/destination/selector.js +52 -52
- package/dist/dialog/alert.js +26 -26
- package/dist/dialog/confirm.js +27 -27
- package/dist/dialog/confirmDelete.js +31 -31
- package/dist/dialog.js +141 -141
- package/dist/disabler.js +90 -90
- package/dist/documentViewer/css/documentViewer.css +7 -7
- package/dist/documentViewer/css/documentViewer.css.map +1 -1
- package/dist/documentViewer/providers/pdfViewer/fallback/viewer.js +30 -30
- package/dist/documentViewer/providers/pdfViewer/pdfjs/areaBroker.js +25 -25
- package/dist/documentViewer/providers/pdfViewer/pdfjs/findBar.js +120 -120
- package/dist/documentViewer/providers/pdfViewer/pdfjs/pageView.js +89 -89
- package/dist/documentViewer/providers/pdfViewer/pdfjs/pagesManager.js +52 -52
- package/dist/documentViewer/providers/pdfViewer/pdfjs/searchEngine.js +112 -112
- package/dist/documentViewer/providers/pdfViewer/pdfjs/textManager.js +67 -67
- package/dist/documentViewer/providers/pdfViewer/pdfjs/viewer.js +81 -81
- package/dist/documentViewer/providers/pdfViewer/pdfjs/wrapper.js +111 -111
- package/dist/documentViewer/providers/pdfViewer.js +29 -29
- package/dist/documentViewer/viewerFactory.js +71 -71
- package/dist/documentViewer.js +86 -86
- package/dist/dropdown/css/dropdown.css +7 -7
- package/dist/dropdown/css/dropdown.css.map +1 -1
- package/dist/dropdown.js +84 -84
- package/dist/durationer.js +58 -58
- package/dist/dynamicComponent/css/dynamicComponent.css +7 -7
- package/dist/dynamicComponent/css/dynamicComponent.css.map +1 -1
- package/dist/dynamicComponent.js +103 -103
- package/dist/feedback.js +84 -84
- package/dist/figure/FigureStateActive.js +111 -111
- package/dist/filesender.js +26 -26
- package/dist/filter.js +34 -34
- package/dist/form/css/dropdownForm.css +7 -7
- package/dist/form/css/dropdownForm.css.map +1 -1
- package/dist/form/css/form.css +7 -7
- package/dist/form/css/form.css.map +1 -1
- package/dist/form/dropdownForm.js +99 -99
- package/dist/form/form.js +248 -248
- package/dist/form/simpleForm.js +71 -71
- package/dist/form/validator/css/validator.css +7 -7
- package/dist/form/validator/css/validator.css.map +1 -1
- package/dist/form/validator/renderer.js +52 -52
- package/dist/form/validator/validator.js +103 -103
- package/dist/form/widget/css/widget.css +7 -7
- package/dist/form/widget/css/widget.css.map +1 -1
- package/dist/form/widget/definitions.js +24 -24
- package/dist/form/widget/loader.js +16 -16
- package/dist/form/widget/providers/checkBox.js +62 -62
- package/dist/form/widget/providers/comboBox.js +46 -46
- package/dist/form/widget/providers/default.js +35 -35
- package/dist/form/widget/providers/hidden.js +37 -37
- package/dist/form/widget/providers/hiddenBox.js +58 -58
- package/dist/form/widget/providers/radioBox.js +57 -57
- package/dist/form/widget/providers/textArea.js +35 -35
- package/dist/form/widget/providers/textBox.js +34 -34
- package/dist/form/widget/widget.js +141 -141
- package/dist/form.js +10 -10
- package/dist/formValidator/formValidator.js +61 -61
- package/dist/formValidator/highlighters/highlighter.js +41 -41
- package/dist/formValidator/highlighters/message.js +29 -29
- package/dist/formValidator/highlighters/tooltip.js +32 -32
- package/dist/generis/form/css/form.css +7 -7
- package/dist/generis/form/css/form.css.map +1 -1
- package/dist/generis/form/form.js +73 -73
- package/dist/generis/validator/css/validator.css +7 -7
- package/dist/generis/validator/css/validator.css.map +1 -1
- package/dist/generis/validator/validator.js +38 -38
- package/dist/generis/widget/checkBox/checkBox.js +39 -39
- package/dist/generis/widget/comboBox/comboBox.js +32 -32
- package/dist/generis/widget/css/widget.css +7 -7
- package/dist/generis/widget/css/widget.css.map +1 -1
- package/dist/generis/widget/hiddenBox/hiddenBox.js +40 -40
- package/dist/generis/widget/loader.js +20 -20
- package/dist/generis/widget/textBox/textBox.js +27 -27
- package/dist/generis/widget/widget.js +47 -47
- package/dist/groupedComboBox.js +36 -36
- package/dist/groupvalidator.js +19 -19
- package/dist/hider.js +41 -41
- package/dist/highlighter.js +278 -278
- package/dist/image/ImgStateActive/extractLabel.js +20 -20
- package/dist/image/ImgStateActive/helper.js +16 -16
- package/dist/image/ImgStateActive/initHelper.js +85 -85
- package/dist/image/ImgStateActive/initMediaEditor.js +48 -48
- package/dist/image/ImgStateActive/mediaSizer.js +32 -32
- package/dist/image/ImgStateActive.js +104 -104
- package/dist/incrementer.js +58 -58
- package/dist/inplacer.js +87 -87
- package/dist/interactUtils.js +42 -42
- package/dist/itemButtonList/css/item-button-list.css +23 -23
- package/dist/itemButtonList/css/item-button-list.css.map +1 -1
- package/dist/itemButtonList.js +102 -102
- package/dist/keyNavigation/navigableDomElement.js +76 -76
- package/dist/keyNavigation/navigator.js +158 -158
- package/dist/listbox/css/listbox.css +7 -7
- package/dist/listbox/css/listbox.css.map +1 -1
- package/dist/listbox.js +84 -84
- package/dist/liststyler.js +57 -57
- package/dist/loadingButton/css/button.css +7 -7
- package/dist/loadingButton/css/button.css.map +1 -1
- package/dist/loadingButton/loadingButton.js +35 -35
- package/dist/lock.js +112 -112
- package/dist/login/login.js +87 -87
- package/dist/maths/calculator/basicCalculator.js +50 -50
- package/dist/maths/calculator/calculatorComponent.js +29 -29
- package/dist/maths/calculator/core/areaBroker.js +25 -25
- package/dist/maths/calculator/core/board.js +300 -300
- package/dist/maths/calculator/core/expression.js +98 -98
- package/dist/maths/calculator/core/labels.js +16 -16
- package/dist/maths/calculator/core/plugin.js +19 -19
- package/dist/maths/calculator/core/terms.js +26 -26
- package/dist/maths/calculator/core/tokenizer.js +98 -98
- package/dist/maths/calculator/core/tokens.js +75 -75
- package/dist/maths/calculator/css/calculator.css +7 -7
- package/dist/maths/calculator/css/calculator.css.map +1 -1
- package/dist/maths/calculator/defaultCalculator.js +23 -23
- package/dist/maths/calculator/plugins/core/degrad.js +22 -22
- package/dist/maths/calculator/plugins/core/history.js +45 -45
- package/dist/maths/calculator/plugins/core/remind.js +22 -22
- package/dist/maths/calculator/plugins/core/stepNavigation.js +31 -31
- package/dist/maths/calculator/plugins/keyboard/templateKeyboard/templateKeyboard.js +48 -48
- package/dist/maths/calculator/plugins/modifiers/pow10.js +35 -35
- package/dist/maths/calculator/plugins/modifiers/sign.js +90 -90
- package/dist/maths/calculator/plugins/screen/simpleScreen/simpleScreen.js +47 -47
- package/dist/maths/calculator/pluginsLoader.js +21 -21
- package/dist/maths/calculator/scientificCalculator.js +78 -78
- package/dist/mediaEditor/mediaEditorComponent.js +51 -51
- package/dist/mediaEditor/plugins/mediaAlignment/helper.js +16 -16
- package/dist/mediaEditor/plugins/mediaAlignment/mediaAlignmentComponent.js +47 -47
- package/dist/mediaEditor/plugins/mediaAlignment/style.css +7 -7
- package/dist/mediaEditor/plugins/mediaDimension/helper.js +70 -70
- package/dist/mediaEditor/plugins/mediaDimension/mediaDimensionComponent.js +140 -140
- package/dist/mediaEditor/plugins/mediaDimension/style.css +141 -141
- package/dist/mediaplayer/css/player.css +7 -7
- package/dist/mediaplayer/css/player.css.map +1 -1
- package/dist/mediaplayer/players/html5.js +52 -52
- package/dist/mediaplayer/players/youtube.js +39 -39
- package/dist/mediaplayer/players.js +18 -18
- package/dist/mediaplayer/support.js +55 -55
- package/dist/mediaplayer/utils/reminder.js +100 -100
- package/dist/mediaplayer/utils/timeObserver.js +92 -92
- package/dist/mediaplayer/youtubeManager.js +51 -51
- package/dist/mediaplayer.js +447 -447
- package/dist/mediasizer.js +122 -122
- package/dist/modal.js +87 -87
- package/dist/movableComponent.js +35 -35
- package/dist/pageSizeSelector.js +31 -31
- package/dist/pageStatus.js +33 -33
- package/dist/pagination/css/pagination.css +7 -7
- package/dist/pagination/css/pagination.css.map +1 -1
- package/dist/pagination/paginationStrategy.js +23 -23
- package/dist/pagination/providers/pages.js +24 -24
- package/dist/pagination/providers/simple.js +22 -22
- package/dist/pagination.js +45 -45
- package/dist/previewer.js +67 -67
- package/dist/progressbar.js +58 -58
- package/dist/propertySelector/css/propertySelector.css +7 -7
- package/dist/propertySelector/css/propertySelector.css.map +1 -1
- package/dist/propertySelector/propertySelector.js +86 -86
- package/dist/report.js +73 -73
- package/dist/resource/css/selector.css +7 -7
- package/dist/resource/css/selector.css.map +1 -1
- package/dist/resource/filters.js +60 -60
- package/dist/resource/list.js +53 -53
- package/dist/resource/selectable.js +92 -92
- package/dist/resource/selector.js +182 -182
- package/dist/resource/tree.js +91 -91
- package/dist/resourcemgr/css/resourcemgr.css +7 -7
- package/dist/resourcemgr/css/resourcemgr.css.map +1 -1
- package/dist/resourcemgr/fileBrowser.js +75 -75
- package/dist/resourcemgr/fileSelector.js +45 -45
- package/dist/resourcemgr/util/updatePermissions.js +4 -4
- package/dist/resourcemgr.js +49 -49
- package/dist/scroller.js +26 -26
- package/dist/searchModal/advancedSearch.js +155 -155
- package/dist/searchModal/css/advancedSearch.css +7 -7
- package/dist/searchModal/css/advancedSearch.css.map +1 -1
- package/dist/searchModal/css/searchModal.css +7 -7
- package/dist/searchModal/css/searchModal.css.map +1 -1
- package/dist/searchModal.js +134 -134
- package/dist/selecter.js +6 -6
- package/dist/stacker.js +43 -43
- package/dist/switch/css/switch.css +7 -7
- package/dist/switch/css/switch.css.map +1 -1
- package/dist/switch/switch.js +62 -62
- package/dist/tableModel.js +33 -33
- package/dist/tabs/css/tabs.css +12 -12
- package/dist/tabs/css/tabs.css.map +1 -1
- package/dist/tabs.js +220 -220
- package/dist/taskQueue/css/taskQueue.css +7 -7
- package/dist/taskQueue/css/taskQueue.css.map +1 -1
- package/dist/taskQueue/status.js +59 -59
- package/dist/taskQueue/table.js +54 -54
- package/dist/taskQueue/taskQueue.js +18 -18
- package/dist/taskQueue/taskQueueModel.js +102 -102
- package/dist/taskQueue.js +47 -47
- package/dist/taskQueueButton/css/taskable.css +7 -7
- package/dist/taskQueueButton/css/taskable.css.map +1 -1
- package/dist/taskQueueButton/css/treeButton.css +7 -7
- package/dist/taskQueueButton/css/treeButton.css.map +1 -1
- package/dist/taskQueueButton/standardButton.js +39 -39
- package/dist/taskQueueButton/taskable.js +41 -41
- package/dist/taskQueueButton/treeButton.js +43 -43
- package/dist/themeLoader.js +75 -75
- package/dist/themes.js +84 -84
- package/dist/toggler.js +57 -57
- package/dist/tooltip.js +41 -41
- package/dist/tooltipster.js +17 -17
- package/dist/transformer.js +117 -117
- package/dist/tristateCheckboxGroup/css/tristateCheckboxGroup.css +7 -7
- package/dist/tristateCheckboxGroup/css/tristateCheckboxGroup.css.map +1 -1
- package/dist/tristateCheckboxGroup.js +62 -62
- package/dist/uploader.js +145 -145
- package/dist/validator/validators.js +48 -48
- package/dist/validator.js +23 -23
- package/dist/waitForMedia.js +33 -33
- package/dist/waitingDialog/css/waitingDialog.css +7 -7
- package/dist/waitingDialog/css/waitingDialog.css.map +1 -1
- package/dist/waitingDialog/waitingDialog.js +54 -54
- package/package.json +110 -110
- package/scss/basic.scss +16 -16
- package/scss/ckeditor/skins/tao/scss/inc/_ck-icons.scss +60 -60
- package/scss/ckeditor/skins/tao/scss/inc/_tao.scss +59 -59
- package/scss/font/tao/tao.svg +235 -235
- package/scss/inc/_base.scss +495 -495
- package/scss/inc/_bootstrap.scss +6 -6
- package/scss/inc/_buttons.scss +114 -114
- package/scss/inc/_colors.scss +93 -93
- package/scss/inc/_feedback.scss +154 -154
- package/scss/inc/_flex-grid.scss +15 -15
- package/scss/inc/_fonts.scss +4 -4
- package/scss/inc/_forms.scss +832 -832
- package/scss/inc/_functions.scss +283 -283
- package/scss/inc/_jquery.nouislider.scss +254 -254
- package/scss/inc/_normalize.scss +528 -528
- package/scss/inc/_report.scss +67 -67
- package/scss/inc/_secondary-properties.scss +89 -89
- package/scss/inc/_select2.scss +634 -634
- package/scss/inc/_toolbars.scss +155 -155
- package/scss/inc/_tooltip.scss +312 -312
- package/scss/inc/_variables.scss +21 -21
- package/scss/inc/base/_highlight.scss +5 -5
- package/scss/inc/base/_list-style.scss +58 -58
- package/scss/inc/base/_svg.scss +3 -3
- package/scss/inc/base/_table.scss +62 -62
- package/scss/inc/fonts/_source-sans-pro.scss +29 -29
- package/scss/inc/fonts/_tao-icon-classes.scss +227 -227
- package/scss/inc/fonts/_tao-icon-def.scss +12 -12
- package/scss/inc/fonts/_tao-icon-vars.scss +241 -241
- package/src/actionbar/tpl/main.tpl +8 -8
- package/src/actionbar.js +251 -251
- package/src/adder.js +250 -250
- package/src/animable/absorbable/absorbable.js +134 -134
- package/src/animable/absorbable/css/absorb.css +7 -7
- package/src/animable/absorbable/css/absorb.css.map +1 -1
- package/src/animable/absorbable/scss/absorb.scss +37 -37
- package/src/animable/pulsable/css/pulse.css +7 -7
- package/src/animable/pulsable/css/pulse.css.map +1 -1
- package/src/animable/pulsable/pulsable.js +90 -90
- package/src/animable/pulsable/scss/pulse.scss +22 -22
- package/src/areaBroker.js +160 -160
- package/src/autocomplete/css/autocomplete.css +7 -7
- package/src/autocomplete/css/autocomplete.css.map +1 -1
- package/src/autocomplete/scss/autocomplete.scss +37 -37
- package/src/autocomplete.js +1027 -1027
- package/src/autoscroll.js +57 -57
- package/src/badge/badge.js +119 -119
- package/src/badge/css/badge.css +7 -7
- package/src/badge/css/badge.css.map +1 -1
- package/src/badge/scss/badge.scss +92 -92
- package/src/badge/tpl/badge.tpl +4 -4
- package/src/breadcrumbs/css/breadcrumbs.css +7 -7
- package/src/breadcrumbs/css/breadcrumbs.css.map +1 -1
- package/src/breadcrumbs/scss/breadcrumbs.scss +52 -52
- package/src/breadcrumbs/tpl/breadcrumbs.tpl +20 -20
- package/src/breadcrumbs.js +99 -99
- package/src/btngrouper.js +213 -213
- package/src/bulkActionPopup/css/bulkActionPopup.css +7 -7
- package/src/bulkActionPopup/css/bulkActionPopup.css.map +1 -1
- package/src/bulkActionPopup/scss/bulkActionPopup.scss +63 -63
- package/src/bulkActionPopup/tpl/layout.tpl +76 -76
- package/src/bulkActionPopup/tpl/select.tpl +8 -8
- package/src/bulkActionPopup.js +274 -274
- package/src/button/tpl/button.tpl +4 -4
- package/src/button.js +135 -135
- package/src/calculator/css/calculator.css +10 -10
- package/src/calculator/css/calculator.css.map +1 -1
- package/src/calculator/scss/calculator.scss +139 -139
- package/src/calculator.js +188 -188
- package/src/cascadingComboBox.js +126 -126
- package/src/ckeditor/ckConfigurator.js +742 -742
- package/src/ckeditor/dtdHandler.js +1030 -1030
- package/src/class/css/selector.css +7 -7
- package/src/class/css/selector.css.map +1 -1
- package/src/class/scss/selector.scss +101 -101
- package/src/class/selector.js +329 -329
- package/src/class/tpl/listItem.tpl +9 -9
- package/src/class/tpl/selector.tpl +10 -10
- package/src/component/alignable.js +274 -274
- package/src/component/containable.js +122 -122
- package/src/component/css/components.css +7 -7
- package/src/component/css/components.css.map +1 -1
- package/src/component/css/windowComponent.css +7 -7
- package/src/component/css/windowComponent.css.map +1 -1
- package/src/component/draggable.js +104 -104
- package/src/component/placeable.js +233 -233
- package/src/component/resizable.js +195 -195
- package/src/component/scss/components.scss +507 -507
- package/src/component/scss/windowComponent.scss +62 -62
- package/src/component/stackable.js +67 -67
- package/src/component/tpl/window.tpl +7 -7
- package/src/component/windowed.js +206 -206
- package/src/component.js +401 -401
- package/src/container.js +200 -200
- package/src/contextualPopup/css/contextualPopup.css +7 -7
- package/src/contextualPopup/css/contextualPopup.css.map +1 -1
- package/src/contextualPopup/scss/contextualPopup.scss +78 -78
- package/src/contextualPopup/tpl/popup.tpl +10 -10
- package/src/contextualPopup.js +294 -294
- package/src/css/basic.css +104 -104
- package/src/css/basic.css.map +1 -1
- package/src/dashboard/css/dashboard.css +7 -7
- package/src/dashboard/css/dashboard.css.map +1 -1
- package/src/dashboard/scss/dashboard.scss +93 -93
- package/src/dashboard/tpl/dashboard.tpl +16 -16
- package/src/dashboard/tpl/dashboardMetricsList.tpl +15 -15
- package/src/dashboard.js +179 -179
- package/src/datalist/css/datalist.css +7 -7
- package/src/datalist/css/datalist.css.map +1 -1
- package/src/datalist/scss/datalist.scss +116 -116
- package/src/datalist/tpl/list.tpl +24 -24
- package/src/datalist/tpl/main.tpl +44 -44
- package/src/datalist.js +500 -500
- package/src/datatable/css/datatable.css +7 -7
- package/src/datatable/css/datatable.css.map +1 -1
- package/src/datatable/filterStrategy/filterStrategy.js +70 -70
- package/src/datatable/filterStrategy/multiple.js +126 -126
- package/src/datatable/filterStrategy/single.js +108 -108
- package/src/datatable/scss/datatable.scss +149 -149
- package/src/datatable/tpl/button.tpl +6 -6
- package/src/datatable/tpl/layout.tpl +158 -158
- package/src/datatable.js +1056 -1056
- package/src/dateRange/css/dateRange.css +7 -7
- package/src/dateRange/css/dateRange.css.map +1 -1
- package/src/dateRange/dateRange.js +341 -341
- package/src/dateRange/scss/dateRange.scss +7 -7
- package/src/dateRange/tpl/select.tpl +18 -18
- package/src/datetime/css/picker.css +7 -7
- package/src/datetime/css/picker.css.map +1 -1
- package/src/datetime/picker.js +576 -576
- package/src/datetime/scss/picker.scss +192 -192
- package/src/datetime/tpl/picker.tpl +18 -18
- package/src/deleter/undo.tpl +6 -6
- package/src/deleter.js +296 -296
- package/src/destination/css/selector.css +7 -7
- package/src/destination/css/selector.css.map +1 -1
- package/src/destination/scss/selector.scss +36 -36
- package/src/destination/selector.js +195 -195
- package/src/destination/tpl/selector.tpl +13 -13
- package/src/dialog/alert.js +70 -70
- package/src/dialog/confirm.js +85 -85
- package/src/dialog/confirmDelete.js +95 -95
- package/src/dialog/tpl/body.tpl +24 -24
- package/src/dialog/tpl/buttons.tpl +6 -6
- package/src/dialog/tpl/checkbox.tpl +5 -5
- package/src/dialog.js +517 -517
- package/src/disabler.js +230 -230
- package/src/documentViewer/css/documentViewer.css +7 -7
- package/src/documentViewer/css/documentViewer.css.map +1 -1
- package/src/documentViewer/providers/pdfViewer/fallback/viewer.js +69 -69
- package/src/documentViewer/providers/pdfViewer/pdfjs/areaBroker.js +41 -41
- package/src/documentViewer/providers/pdfViewer/pdfjs/findBar.js +475 -475
- package/src/documentViewer/providers/pdfViewer/pdfjs/findBar.tpl +20 -20
- package/src/documentViewer/providers/pdfViewer/pdfjs/match.tpl +1 -1
- package/src/documentViewer/providers/pdfViewer/pdfjs/page.tpl +4 -4
- package/src/documentViewer/providers/pdfViewer/pdfjs/pageView.js +318 -318
- package/src/documentViewer/providers/pdfViewer/pdfjs/pagesManager.js +167 -167
- package/src/documentViewer/providers/pdfViewer/pdfjs/searchEngine.js +451 -451
- package/src/documentViewer/providers/pdfViewer/pdfjs/textManager.js +252 -252
- package/src/documentViewer/providers/pdfViewer/pdfjs/viewer.js +299 -299
- package/src/documentViewer/providers/pdfViewer/pdfjs/viewer.tpl +16 -16
- package/src/documentViewer/providers/pdfViewer/pdfjs/wrapper.js +351 -351
- package/src/documentViewer/providers/pdfViewer.js +93 -93
- package/src/documentViewer/scss/documentViewer.scss +184 -184
- package/src/documentViewer/viewerFactory.js +191 -191
- package/src/documentViewer.js +238 -238
- package/src/dropdown/css/dropdown.css +7 -7
- package/src/dropdown/css/dropdown.css.map +1 -1
- package/src/dropdown/scss/dropdown.scss +99 -99
- package/src/dropdown/tpl/dropdown.tpl +8 -8
- package/src/dropdown/tpl/list-item.tpl +4 -4
- package/src/dropdown.js +255 -255
- package/src/durationer.js +220 -220
- package/src/dynamicComponent/css/dynamicComponent.css +7 -7
- package/src/dynamicComponent/css/dynamicComponent.css.map +1 -1
- package/src/dynamicComponent/scss/dynamicComponent.scss +98 -98
- package/src/dynamicComponent/tpl/layout.tpl +17 -17
- package/src/dynamicComponent.js +553 -553
- package/src/feedback/feedback.tpl +7 -7
- package/src/feedback.js +295 -295
- package/src/figure/FigureStateActive.js +184 -184
- package/src/filesender.js +112 -112
- package/src/filter/template.tpl +5 -5
- package/src/filter.js +129 -129
- package/src/form/css/dropdownForm.css +7 -7
- package/src/form/css/dropdownForm.css.map +1 -1
- package/src/form/css/form.css +7 -7
- package/src/form/css/form.css.map +1 -1
- package/src/form/dropdownForm.js +281 -281
- package/src/form/form.js +688 -688
- package/src/form/scss/dropdownForm.scss +60 -60
- package/src/form/scss/form.scss +25 -25
- package/src/form/simpleForm.js +125 -125
- package/src/form/tpl/dropdownForm.tpl +4 -4
- package/src/form/tpl/form.tpl +7 -7
- package/src/form/validator/css/validator.css +7 -7
- package/src/form/validator/css/validator.css.map +1 -1
- package/src/form/validator/renderer.js +118 -118
- package/src/form/validator/scss/validator.scss +14 -14
- package/src/form/validator/tpl/message.tpl +1 -1
- package/src/form/validator/tpl/validator.tpl +1 -1
- package/src/form/validator/validator.js +220 -220
- package/src/form/widget/css/widget.css +7 -7
- package/src/form/widget/css/widget.css.map +1 -1
- package/src/form/widget/definitions.js +51 -51
- package/src/form/widget/loader.js +40 -40
- package/src/form/widget/providers/checkBox.js +138 -138
- package/src/form/widget/providers/comboBox.js +63 -63
- package/src/form/widget/providers/default.js +90 -90
- package/src/form/widget/providers/hidden.js +62 -62
- package/src/form/widget/providers/hiddenBox.js +152 -152
- package/src/form/widget/providers/radioBox.js +99 -99
- package/src/form/widget/providers/textArea.js +52 -52
- package/src/form/widget/providers/textBox.js +48 -48
- package/src/form/widget/scss/widget.scss +55 -55
- package/src/form/widget/tpl/checkBox.tpl +25 -25
- package/src/form/widget/tpl/comboBox.tpl +13 -13
- package/src/form/widget/tpl/hidden.tpl +1 -1
- package/src/form/widget/tpl/hiddenBox.tpl +17 -17
- package/src/form/widget/tpl/label.tpl +6 -6
- package/src/form/widget/tpl/radioBox.tpl +25 -25
- package/src/form/widget/tpl/textArea.tpl +8 -8
- package/src/form/widget/tpl/widget.tpl +8 -8
- package/src/form/widget/widget.js +372 -372
- package/src/form.js +47 -47
- package/src/formValidator/formValidator.js +253 -253
- package/src/formValidator/highlighters/highlighter.js +103 -103
- package/src/formValidator/highlighters/message.js +68 -68
- package/src/formValidator/highlighters/tooltip.js +78 -78
- package/src/generis/form/css/form.css +7 -7
- package/src/generis/form/css/form.css.map +1 -1
- package/src/generis/form/form.js +239 -239
- package/src/generis/form/readme.md +70 -70
- package/src/generis/form/scss/form.scss +23 -23
- package/src/generis/form/tpl/form.tpl +16 -16
- package/src/generis/validator/css/validator.css +7 -7
- package/src/generis/validator/css/validator.css.map +1 -1
- package/src/generis/validator/readme.md +46 -46
- package/src/generis/validator/scss/validator.scss +13 -13
- package/src/generis/validator/validator.js +128 -128
- package/src/generis/widget/checkBox/checkBox.js +112 -112
- package/src/generis/widget/checkBox/checkBox.tpl +18 -18
- package/src/generis/widget/comboBox/comboBox.js +66 -66
- package/src/generis/widget/comboBox/comboBox.tpl +12 -12
- package/src/generis/widget/css/widget.css +7 -7
- package/src/generis/widget/css/widget.css.map +1 -1
- package/src/generis/widget/hiddenBox/hiddenBox.js +131 -131
- package/src/generis/widget/hiddenBox/hiddenBox.tpl +16 -16
- package/src/generis/widget/loader.js +49 -49
- package/src/generis/widget/readme.md +59 -59
- package/src/generis/widget/scss/widget.scss +61 -61
- package/src/generis/widget/textBox/textBox.js +64 -64
- package/src/generis/widget/textBox/textBox.tpl +7 -7
- package/src/generis/widget/widget.js +164 -164
- package/src/generis/widget/widget.tpl +5 -5
- package/src/groupedComboBox.js +99 -99
- package/src/groupvalidator.js +84 -84
- package/src/hider.js +88 -88
- package/src/highlighter.js +1192 -1192
- package/src/image/ImgStateActive/extractLabel.js +29 -29
- package/src/image/ImgStateActive/helper.js +36 -36
- package/src/image/ImgStateActive/initHelper.js +137 -137
- package/src/image/ImgStateActive/initMediaEditor.js +92 -92
- package/src/image/ImgStateActive/mediaSizer.js +63 -63
- package/src/image/ImgStateActive.js +115 -115
- package/src/incrementer.js +309 -309
- package/src/inplacer.js +315 -315
- package/src/interactUtils.js +140 -140
- package/src/itemButtonList/css/item-button-list.css +23 -23
- package/src/itemButtonList/css/item-button-list.css.map +1 -1
- package/src/itemButtonList/scss/item-button-list.scss +236 -236
- package/src/itemButtonList/tpl/itemButtonList.tpl +21 -21
- package/src/itemButtonList.js +274 -274
- package/src/keyNavigation/navigableDomElement.js +285 -285
- package/src/keyNavigation/navigator.js +535 -535
- package/src/listbox/css/listbox.css +7 -7
- package/src/listbox/css/listbox.css.map +1 -1
- package/src/listbox/scss/listbox.scss +116 -116
- package/src/listbox/tpl/list.tpl +14 -14
- package/src/listbox/tpl/main.tpl +9 -9
- package/src/listbox.js +252 -252
- package/src/liststyler.js +155 -155
- package/src/loadingButton/css/button.css +7 -7
- package/src/loadingButton/css/button.css.map +1 -1
- package/src/loadingButton/loadingButton.js +110 -110
- package/src/loadingButton/scss/button.scss +41 -41
- package/src/loadingButton/tpl/button.tpl +5 -5
- package/src/lock/lock.tpl +16 -16
- package/src/lock.js +393 -393
- package/src/login/login.js +317 -317
- package/src/login/tpl/login.tpl +29 -29
- package/src/login/tpl/passwordReveal.tpl +7 -7
- package/src/maths/calculator/basicCalculator.js +55 -55
- package/src/maths/calculator/calculatorComponent.js +128 -128
- package/src/maths/calculator/core/areaBroker.js +38 -38
- package/src/maths/calculator/core/board.js +841 -841
- package/src/maths/calculator/core/expression.js +430 -430
- package/src/maths/calculator/core/labels.js +116 -116
- package/src/maths/calculator/core/plugin.js +40 -40
- package/src/maths/calculator/core/terms.js +459 -459
- package/src/maths/calculator/core/tokenizer.js +245 -245
- package/src/maths/calculator/core/tokens.js +178 -178
- package/src/maths/calculator/core/tpl/board.tpl +4 -4
- package/src/maths/calculator/css/calculator.css +7 -7
- package/src/maths/calculator/css/calculator.css.map +1 -1
- package/src/maths/calculator/defaultCalculator.js +66 -66
- package/src/maths/calculator/plugins/core/degrad.js +90 -90
- package/src/maths/calculator/plugins/core/history.js +166 -166
- package/src/maths/calculator/plugins/core/remind.js +96 -96
- package/src/maths/calculator/plugins/core/stepNavigation.js +175 -175
- package/src/maths/calculator/plugins/keyboard/templateKeyboard/defaultTemplate.tpl +36 -36
- package/src/maths/calculator/plugins/keyboard/templateKeyboard/templateKeyboard.js +91 -91
- package/src/maths/calculator/plugins/modifiers/pow10.js +143 -143
- package/src/maths/calculator/plugins/modifiers/sign.js +339 -339
- package/src/maths/calculator/plugins/screen/simpleScreen/defaultTemplate.tpl +3 -3
- package/src/maths/calculator/plugins/screen/simpleScreen/history.tpl +3 -3
- package/src/maths/calculator/plugins/screen/simpleScreen/simpleScreen.js +190 -190
- package/src/maths/calculator/pluginsLoader.js +46 -46
- package/src/maths/calculator/scientificCalculator.js +74 -74
- package/src/maths/calculator/scss/calculator.scss +396 -396
- package/src/maths/calculator/tpl/basicKeyboard.tpl +37 -37
- package/src/maths/calculator/tpl/basicScreen.tpl +2 -2
- package/src/maths/calculator/tpl/scientificKeyboard.tpl +61 -61
- package/src/maths/calculator/tpl/scientificScreen.tpl +3 -3
- package/src/mediaEditor/mediaEditorComponent.js +141 -141
- package/src/mediaEditor/plugins/mediaAlignment/helper.js +110 -110
- package/src/mediaEditor/plugins/mediaAlignment/mediaAlignmentComponent.js +99 -99
- package/src/mediaEditor/plugins/mediaAlignment/style.css +7 -7
- package/src/mediaEditor/plugins/mediaAlignment/tpl/mediaAlignment.tpl +25 -25
- package/src/mediaEditor/plugins/mediaDimension/helper.js +190 -190
- package/src/mediaEditor/plugins/mediaDimension/mediaDimensionComponent.js +561 -561
- package/src/mediaEditor/plugins/mediaDimension/style.css +141 -141
- package/src/mediaEditor/plugins/mediaDimension/tpl/mediaDimension.tpl +55 -55
- package/src/mediaEditor/tpl/editor.tpl +4 -4
- package/src/mediaplayer/css/player.css +7 -7
- package/src/mediaplayer/css/player.css.map +1 -1
- package/src/mediaplayer/players/html5.js +564 -564
- package/src/mediaplayer/players/youtube.js +323 -323
- package/src/mediaplayer/players.js +29 -29
- package/src/mediaplayer/readme.md +305 -305
- package/src/mediaplayer/scss/player.scss +569 -569
- package/src/mediaplayer/support.js +126 -126
- package/src/mediaplayer/tpl/audio.tpl +6 -6
- package/src/mediaplayer/tpl/player.tpl +37 -37
- package/src/mediaplayer/tpl/source.tpl +1 -1
- package/src/mediaplayer/tpl/video.tpl +6 -6
- package/src/mediaplayer/tpl/youtube.tpl +1 -1
- package/src/mediaplayer/utils/reminder.js +184 -184
- package/src/mediaplayer/utils/timeObserver.js +143 -143
- package/src/mediaplayer/youtubeManager.js +161 -161
- package/src/mediaplayer.js +1606 -1606
- package/src/mediasizer/mediasizer.tpl +55 -55
- package/src/mediasizer.js +635 -635
- package/src/modal.js +365 -365
- package/src/movableComponent.js +78 -78
- package/src/pageSizeSelector/tpl/pageSizeSelector.tpl +9 -9
- package/src/pageSizeSelector.js +106 -106
- package/src/pageStatus.js +147 -147
- package/src/pagination/css/pagination.css +7 -7
- package/src/pagination/css/pagination.css.map +1 -1
- package/src/pagination/paginationStrategy.js +53 -53
- package/src/pagination/providers/pages.js +161 -161
- package/src/pagination/providers/simple.js +74 -74
- package/src/pagination/providers/tpl/pages/page.tpl +1 -1
- package/src/pagination/providers/tpl/pages.tpl +8 -8
- package/src/pagination/providers/tpl/simple.tpl +7 -7
- package/src/pagination/scss/pagination.scss +111 -111
- package/src/pagination.js +237 -237
- package/src/previewer.js +300 -300
- package/src/progressbar.js +165 -165
- package/src/propertySelector/css/propertySelector.css +7 -7
- package/src/propertySelector/css/propertySelector.css.map +1 -1
- package/src/propertySelector/propertySelector.js +286 -286
- package/src/propertySelector/scss/propertySelector.scss +66 -66
- package/src/propertySelector/tpl/property-description.tpl +12 -12
- package/src/propertySelector/tpl/property-selector.tpl +6 -6
- package/src/report/feedback.tpl +11 -11
- package/src/report/layout.tpl +10 -10
- package/src/report.js +184 -184
- package/src/resource/css/selector.css +7 -7
- package/src/resource/css/selector.css.map +1 -1
- package/src/resource/filters.js +208 -208
- package/src/resource/list.js +200 -200
- package/src/resource/scss/_filters.scss +26 -26
- package/src/resource/scss/_resource-list.scss +107 -107
- package/src/resource/scss/_resource-tree.scss +205 -205
- package/src/resource/scss/selector.scss +187 -187
- package/src/resource/selectable.js +322 -322
- package/src/resource/selector.js +871 -871
- package/src/resource/tpl/filters.tpl +2 -2
- package/src/resource/tpl/list.tpl +7 -7
- package/src/resource/tpl/listNode.tpl +4 -4
- package/src/resource/tpl/selector.tpl +46 -46
- package/src/resource/tpl/tree.tpl +4 -4
- package/src/resource/tpl/treeNode.tpl +30 -30
- package/src/resource/tree.js +398 -398
- package/src/resourcemgr/css/resourcemgr.css +7 -7
- package/src/resourcemgr/css/resourcemgr.css.map +1 -1
- package/src/resourcemgr/fileBrowser.js +381 -381
- package/src/resourcemgr/filePreview.js +73 -73
- package/src/resourcemgr/fileSelector.js +322 -322
- package/src/resourcemgr/scss/resourcemgr.scss +254 -254
- package/src/resourcemgr/tpl/fileSelect.tpl +39 -39
- package/src/resourcemgr/tpl/folder.tpl +11 -11
- package/src/resourcemgr/tpl/layout.tpl +84 -84
- package/src/resourcemgr/tpl/rootFolder.tpl +13 -13
- package/src/resourcemgr/util/updatePermissions.js +53 -53
- package/src/resourcemgr.js +216 -216
- package/src/scroller.js +94 -94
- package/src/scss/basic.scss +16 -16
- package/src/searchModal/advancedSearch.js +638 -638
- package/src/searchModal/css/advancedSearch.css +7 -7
- package/src/searchModal/css/advancedSearch.css.map +1 -1
- package/src/searchModal/css/searchModal.css +7 -7
- package/src/searchModal/css/searchModal.css.map +1 -1
- package/src/searchModal/scss/advancedSearch.scss +171 -171
- package/src/searchModal/scss/searchModal.scss +393 -393
- package/src/searchModal/tpl/advanced-search.tpl +9 -9
- package/src/searchModal/tpl/info-message.tpl +3 -3
- package/src/searchModal/tpl/invalid-criteria-warning.tpl +10 -10
- package/src/searchModal/tpl/layout.tpl +27 -27
- package/src/searchModal/tpl/list-checkbox-criterion.tpl +17 -17
- package/src/searchModal/tpl/list-select-criterion.tpl +12 -12
- package/src/searchModal/tpl/text-criterion.tpl +11 -11
- package/src/searchModal.js +760 -760
- package/src/selecter.js +43 -43
- package/src/stacker.js +133 -133
- package/src/switch/css/switch.css +7 -7
- package/src/switch/css/switch.css.map +1 -1
- package/src/switch/scss/switch.scss +83 -83
- package/src/switch/switch.js +195 -195
- package/src/switch/tpl/switch.tpl +7 -7
- package/src/tableModel.js +112 -112
- package/src/tabs/css/tabs.css +12 -12
- package/src/tabs/css/tabs.css.map +1 -1
- package/src/tabs/scss/tabs.scss +50 -50
- package/src/tabs/tpl/panel.tpl +3 -3
- package/src/tabs/tpl/tabs.tpl +10 -10
- package/src/tabs.js +528 -528
- package/src/taskQueue/css/taskQueue.css +7 -7
- package/src/taskQueue/css/taskQueue.css.map +1 -1
- package/src/taskQueue/scss/taskQueue.scss +47 -47
- package/src/taskQueue/status.js +228 -228
- package/src/taskQueue/table.js +350 -350
- package/src/taskQueue/taskQueue.js +33 -33
- package/src/taskQueue/taskQueueModel.js +548 -548
- package/src/taskQueue/tpl/statusMessage.tpl +7 -7
- package/src/taskQueue.js +216 -216
- package/src/taskQueueButton/css/taskable.css +7 -7
- package/src/taskQueueButton/css/taskable.css.map +1 -1
- package/src/taskQueueButton/css/treeButton.css +7 -7
- package/src/taskQueueButton/css/treeButton.css.map +1 -1
- package/src/taskQueueButton/scss/taskable.scss +4 -4
- package/src/taskQueueButton/scss/treeButton.scss +34 -34
- package/src/taskQueueButton/standardButton.js +108 -108
- package/src/taskQueueButton/taskable.js +202 -202
- package/src/taskQueueButton/tpl/report.tpl +5 -5
- package/src/taskQueueButton/tpl/treeButton.tpl +6 -6
- package/src/taskQueueButton/treeButton.js +108 -108
- package/src/themeLoader.js +252 -252
- package/src/themes.js +162 -162
- package/src/toggler.js +200 -200
- package/src/tooltip/default.tpl +3 -3
- package/src/tooltip.js +160 -160
- package/src/tooltipster.js +25 -25
- package/src/transformer.js +327 -327
- package/src/tristateCheckboxGroup/css/tristateCheckboxGroup.css +7 -7
- package/src/tristateCheckboxGroup/css/tristateCheckboxGroup.css.map +1 -1
- package/src/tristateCheckboxGroup/scss/tristateCheckboxGroup.scss +15 -15
- package/src/tristateCheckboxGroup/tpl/li.tpl +6 -6
- package/src/tristateCheckboxGroup.js +207 -207
- package/src/uploader/fileEntry.tpl +6 -6
- package/src/uploader/uploader.tpl +32 -32
- package/src/uploader.js +594 -594
- package/src/validator/Report.js +10 -10
- package/src/validator/Validator.js +108 -108
- package/src/validator/validators.js +217 -217
- package/src/validator.js +262 -262
- package/src/waitForMedia.js +82 -82
- package/src/waitingDialog/css/waitingDialog.css +7 -7
- package/src/waitingDialog/css/waitingDialog.css.map +1 -1
- package/src/waitingDialog/scss/waitingDialog.scss +34 -34
- package/src/waitingDialog/waitingDialog.js +240 -240
|
@@ -1,841 +1,841 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* This program is free software; you can redistribute it and/or
|
|
3
|
-
* modify it under the terms of the GNU General Public License
|
|
4
|
-
* as published by the Free Software Foundation; under version 2
|
|
5
|
-
* of the License (non-upgradable).
|
|
6
|
-
*
|
|
7
|
-
* This program is distributed in the hope that it will be useful,
|
|
8
|
-
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
9
|
-
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
10
|
-
* GNU General Public License for more details.
|
|
11
|
-
*
|
|
12
|
-
* You should have received a copy of the GNU General Public License
|
|
13
|
-
* along with this program; if not, write to the Free Software
|
|
14
|
-
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
15
|
-
*
|
|
16
|
-
* Copyright (c) 2018-2019 Open Assessment Technologies SA ;
|
|
17
|
-
*/
|
|
18
|
-
/**
|
|
19
|
-
* Defines the base component that will host the calculator UI and link it to the engine.
|
|
20
|
-
* @author Jean-Sébastien Conan <jean-sebastien@taotesting.com>
|
|
21
|
-
*/
|
|
22
|
-
|
|
23
|
-
import _ from 'lodash';
|
|
24
|
-
import __ from 'i18n';
|
|
25
|
-
|
|
26
|
-
import collections from 'core/collections';
|
|
27
|
-
import componentFactory from 'ui/component';
|
|
28
|
-
import areaBrokerFactory from 'ui/maths/calculator/core/areaBroker';
|
|
29
|
-
import registeredTerms from 'ui/maths/calculator/core/terms';
|
|
30
|
-
import tokensHelper from 'ui/maths/calculator/core/tokens';
|
|
31
|
-
import expressionHelper from 'ui/maths/calculator/core/expression';
|
|
32
|
-
import tokenizerFactory from 'ui/maths/calculator/core/tokenizer';
|
|
33
|
-
import mathsEvaluatorFactory from 'util/mathsEvaluator';
|
|
34
|
-
import boardTpl from 'ui/maths/calculator/core/tpl/board';
|
|
35
|
-
|
|
36
|
-
/**
|
|
37
|
-
* Default config values
|
|
38
|
-
* @type {Object}
|
|
39
|
-
*/
|
|
40
|
-
var defaultConfig = {
|
|
41
|
-
expression: '',
|
|
42
|
-
position: 0
|
|
43
|
-
};
|
|
44
|
-
|
|
45
|
-
/**
|
|
46
|
-
* Name of the variable that contains the last result
|
|
47
|
-
* @type {String}
|
|
48
|
-
*/
|
|
49
|
-
var lastResultVariableName = registeredTerms.ANS.value;
|
|
50
|
-
|
|
51
|
-
/**
|
|
52
|
-
* Regex that matches the prefixed function operators
|
|
53
|
-
* @type {RegExp}
|
|
54
|
-
*/
|
|
55
|
-
var rePrefixedTerm = /^@[a-zA-Z_]\w*$/;
|
|
56
|
-
|
|
57
|
-
/**
|
|
58
|
-
* The internal namespace for built-in events listeners
|
|
59
|
-
* @type {String}
|
|
60
|
-
*/
|
|
61
|
-
var ns = 'calculator';
|
|
62
|
-
|
|
63
|
-
/**
|
|
64
|
-
* Build the basic UI for a calculator
|
|
65
|
-
* @param {jQuery|HTMLElement|String} $container
|
|
66
|
-
* @param {Function[]} pluginFactories
|
|
67
|
-
* @param {Object} [config]
|
|
68
|
-
* @param {String} [config.expression=''] - The initial expression
|
|
69
|
-
* @param {Number} [config.position=0] - The initial position in the expression
|
|
70
|
-
* @param {Object} [config.maths] - Optional config for the maths evaluator (@see util/mathsEvaluator)
|
|
71
|
-
* @param {Object} [config.plugins] - Optional config for each plugins
|
|
72
|
-
* @returns {calculator}
|
|
73
|
-
*/
|
|
74
|
-
function calculatorBoardFactory($container, pluginFactories, config) {
|
|
75
|
-
/**
|
|
76
|
-
* Maths expression parser.
|
|
77
|
-
* @type {Function}
|
|
78
|
-
*/
|
|
79
|
-
var mathsEvaluator;
|
|
80
|
-
|
|
81
|
-
/**
|
|
82
|
-
* Keep the area broker instance
|
|
83
|
-
* @see ui/maths/calculator/areaBroker
|
|
84
|
-
*/
|
|
85
|
-
var areaBroker;
|
|
86
|
-
|
|
87
|
-
/**
|
|
88
|
-
* @type {Object} the registered plugins
|
|
89
|
-
*/
|
|
90
|
-
var plugins = {};
|
|
91
|
-
|
|
92
|
-
/**
|
|
93
|
-
* The current expression
|
|
94
|
-
* @type {String}
|
|
95
|
-
*/
|
|
96
|
-
var expression = '';
|
|
97
|
-
|
|
98
|
-
/**
|
|
99
|
-
* A list of variables that can be used in the expression
|
|
100
|
-
* @type {Map}
|
|
101
|
-
*/
|
|
102
|
-
var variables = new collections.Map();
|
|
103
|
-
|
|
104
|
-
/**
|
|
105
|
-
* A list of registered commands that can be used inside the calculator
|
|
106
|
-
* @type {Map}
|
|
107
|
-
*/
|
|
108
|
-
var commands = new collections.Map();
|
|
109
|
-
|
|
110
|
-
/**
|
|
111
|
-
* The current position in the current expression (i.e. the position of the caret)
|
|
112
|
-
* @type {Number}
|
|
113
|
-
*/
|
|
114
|
-
var position = 0;
|
|
115
|
-
|
|
116
|
-
/**
|
|
117
|
-
* The tokenizer utilized to split down the expression
|
|
118
|
-
* @type {calculatorTokenizer}
|
|
119
|
-
*/
|
|
120
|
-
var tokenizer = tokenizerFactory();
|
|
121
|
-
|
|
122
|
-
/**
|
|
123
|
-
* The list of tokens extracted from the expression
|
|
124
|
-
* @type {Array|null}
|
|
125
|
-
*/
|
|
126
|
-
var tokens = null;
|
|
127
|
-
|
|
128
|
-
/**
|
|
129
|
-
*
|
|
130
|
-
* @type {Object}
|
|
131
|
-
*/
|
|
132
|
-
var calculatorApi = {
|
|
133
|
-
/**
|
|
134
|
-
* Returns the current expression
|
|
135
|
-
* @returns {String}
|
|
136
|
-
*/
|
|
137
|
-
getExpression: function getExpression() {
|
|
138
|
-
return expression;
|
|
139
|
-
},
|
|
140
|
-
|
|
141
|
-
/**
|
|
142
|
-
* Changes the current expression
|
|
143
|
-
* @param {String} expr
|
|
144
|
-
* @returns {calculator}
|
|
145
|
-
* @fires expressionchange after the expression has been changed
|
|
146
|
-
*/
|
|
147
|
-
setExpression: function setExpression(expr) {
|
|
148
|
-
expression = String(expr || '');
|
|
149
|
-
tokens = null;
|
|
150
|
-
/**
|
|
151
|
-
* @event expressionchange
|
|
152
|
-
* @param {String} expression
|
|
153
|
-
*/
|
|
154
|
-
this.trigger('expressionchange', expression);
|
|
155
|
-
return this;
|
|
156
|
-
},
|
|
157
|
-
|
|
158
|
-
/**
|
|
159
|
-
* Gets the current position inside the expression
|
|
160
|
-
* @returns {Number}
|
|
161
|
-
*/
|
|
162
|
-
getPosition: function getPosition() {
|
|
163
|
-
return position;
|
|
164
|
-
},
|
|
165
|
-
|
|
166
|
-
/**
|
|
167
|
-
* Sets the current position inside the expression
|
|
168
|
-
* @param {Number|String} pos
|
|
169
|
-
* @returns {calculator}
|
|
170
|
-
* @fires positionchange after the position has been changed
|
|
171
|
-
*/
|
|
172
|
-
setPosition: function setPosition(pos) {
|
|
173
|
-
position = Math.max(0, Math.min(parseInt(pos, 10) || 0, expression.length));
|
|
174
|
-
/**
|
|
175
|
-
* @event positionchange
|
|
176
|
-
* @param {Number} position
|
|
177
|
-
*/
|
|
178
|
-
this.trigger('positionchange', position);
|
|
179
|
-
return this;
|
|
180
|
-
},
|
|
181
|
-
|
|
182
|
-
/**
|
|
183
|
-
* Gets the tokens from the current expression
|
|
184
|
-
* @returns {token[]}
|
|
185
|
-
*/
|
|
186
|
-
getTokens: function getTokens() {
|
|
187
|
-
if (tokens === null) {
|
|
188
|
-
tokens = tokenizer.tokenize(expression);
|
|
189
|
-
}
|
|
190
|
-
return tokens;
|
|
191
|
-
},
|
|
192
|
-
|
|
193
|
-
/**
|
|
194
|
-
* Gets the token at the current position from the current expression
|
|
195
|
-
* @returns {token|null} Returns the token at the current position, or null if none
|
|
196
|
-
*/
|
|
197
|
-
getToken: function getToken() {
|
|
198
|
-
var tokensList = this.getTokens();
|
|
199
|
-
var index = this.getTokenIndex();
|
|
200
|
-
return tokensList[index] || null;
|
|
201
|
-
},
|
|
202
|
-
|
|
203
|
-
/**
|
|
204
|
-
* Gets token index from the current position in the expression.
|
|
205
|
-
* @returns {Number} Returns the index of the token at the current position.
|
|
206
|
-
*/
|
|
207
|
-
getTokenIndex: function getTokenIndex() {
|
|
208
|
-
var index = 0;
|
|
209
|
-
_.forEach(this.getTokens(), function(token, idx) {
|
|
210
|
-
if (position >= token.offset) {
|
|
211
|
-
index = idx;
|
|
212
|
-
}
|
|
213
|
-
});
|
|
214
|
-
return index;
|
|
215
|
-
},
|
|
216
|
-
|
|
217
|
-
/**
|
|
218
|
-
* Gets access to the tokenizer
|
|
219
|
-
* @returns {calculatorTokenizer}
|
|
220
|
-
*/
|
|
221
|
-
getTokenizer: function getTokenizer() {
|
|
222
|
-
return tokenizer;
|
|
223
|
-
},
|
|
224
|
-
|
|
225
|
-
/**
|
|
226
|
-
* Gets a variable defined for the expression.
|
|
227
|
-
* @param {String} name - The variable name
|
|
228
|
-
* @returns {mathsExpression} The value. Can be another expression.
|
|
229
|
-
*/
|
|
230
|
-
getVariable: function getVariable(name) {
|
|
231
|
-
return variables.get(name);
|
|
232
|
-
},
|
|
233
|
-
|
|
234
|
-
/**
|
|
235
|
-
* Checks if a variable is registered
|
|
236
|
-
* @param {String} name
|
|
237
|
-
* @returns {Boolean}
|
|
238
|
-
*/
|
|
239
|
-
hasVariable: function hasVariable(name) {
|
|
240
|
-
return variables.has(name);
|
|
241
|
-
},
|
|
242
|
-
|
|
243
|
-
/**
|
|
244
|
-
* Sets a variable that can be used by the expression.
|
|
245
|
-
* @param {String} name - The variable name
|
|
246
|
-
* @param {String|Number|mathsExpression} value - The value. Can be another expression.
|
|
247
|
-
* @returns {calculator}
|
|
248
|
-
* @fires variableadd after the variable has been set
|
|
249
|
-
*/
|
|
250
|
-
setVariable: function setVariable(name, value) {
|
|
251
|
-
var errValue;
|
|
252
|
-
try {
|
|
253
|
-
value = mathsEvaluator(value);
|
|
254
|
-
} catch (err) {
|
|
255
|
-
errValue = (value && value.expression) || value;
|
|
256
|
-
value = mathsEvaluator('0');
|
|
257
|
-
value.expression = errValue;
|
|
258
|
-
}
|
|
259
|
-
variables.set(name, value);
|
|
260
|
-
/**
|
|
261
|
-
* @event variableadd
|
|
262
|
-
* @param {String} name
|
|
263
|
-
* @param {String} value
|
|
264
|
-
*/
|
|
265
|
-
this.trigger('variableadd', name, value);
|
|
266
|
-
return this;
|
|
267
|
-
},
|
|
268
|
-
|
|
269
|
-
/**
|
|
270
|
-
* Deletes a variable defined for the expression.
|
|
271
|
-
* @param {String} name - The variable name
|
|
272
|
-
* @returns {calculator}
|
|
273
|
-
* @fires variabledelete after the variable has been deleted
|
|
274
|
-
*/
|
|
275
|
-
deleteVariable: function deleteVariable(name) {
|
|
276
|
-
variables.delete(name);
|
|
277
|
-
/**
|
|
278
|
-
* @event variabledelete
|
|
279
|
-
* @param {String} name
|
|
280
|
-
*/
|
|
281
|
-
this.trigger('variabledelete', name);
|
|
282
|
-
return this;
|
|
283
|
-
},
|
|
284
|
-
|
|
285
|
-
/**
|
|
286
|
-
* Gets the list of variables defined for the expression.
|
|
287
|
-
* @returns {Object} The list of defined variables.
|
|
288
|
-
*/
|
|
289
|
-
getVariables: function getVariables() {
|
|
290
|
-
var defs = {};
|
|
291
|
-
variables.forEach(function(value, name) {
|
|
292
|
-
defs[name] = value;
|
|
293
|
-
});
|
|
294
|
-
return defs;
|
|
295
|
-
},
|
|
296
|
-
|
|
297
|
-
/**
|
|
298
|
-
* Sets a list of variables that can be used by the expression.
|
|
299
|
-
* @param {Object} defs - A list variables to set.
|
|
300
|
-
* @returns {calculator}
|
|
301
|
-
* @fires variableadd after each variable has been set
|
|
302
|
-
*/
|
|
303
|
-
setVariables: function setVariables(defs) {
|
|
304
|
-
var self = this;
|
|
305
|
-
_.forEach(defs, function(value, name) {
|
|
306
|
-
self.setVariable(name, value);
|
|
307
|
-
});
|
|
308
|
-
return this;
|
|
309
|
-
},
|
|
310
|
-
|
|
311
|
-
/**
|
|
312
|
-
* Deletes all variables defined for the expression.
|
|
313
|
-
* @returns {calculator}
|
|
314
|
-
* @fires variabledelete after the variables has been deleted
|
|
315
|
-
*/
|
|
316
|
-
deleteVariables: function deleteVariables() {
|
|
317
|
-
variables.clear();
|
|
318
|
-
/**
|
|
319
|
-
* @event variabledelete
|
|
320
|
-
* @param {null} name
|
|
321
|
-
*/
|
|
322
|
-
this.trigger('variabledelete', null);
|
|
323
|
-
this.setLastResult('0');
|
|
324
|
-
return this;
|
|
325
|
-
},
|
|
326
|
-
|
|
327
|
-
/**
|
|
328
|
-
* Sets the value of the last result
|
|
329
|
-
* @param {String|Number|mathsExpression} [result='0']
|
|
330
|
-
* @returns {calculator}
|
|
331
|
-
*/
|
|
332
|
-
setLastResult: function setLastResult(result) {
|
|
333
|
-
if (!result || expressionHelper.containsError(result)) {
|
|
334
|
-
result = '0';
|
|
335
|
-
}
|
|
336
|
-
this.setVariable(lastResultVariableName, result);
|
|
337
|
-
return this;
|
|
338
|
-
},
|
|
339
|
-
|
|
340
|
-
/**
|
|
341
|
-
* Gets the value of the last result
|
|
342
|
-
* @returns {mathsExpression}
|
|
343
|
-
*/
|
|
344
|
-
getLastResult: function getLastResult() {
|
|
345
|
-
return this.getVariable(lastResultVariableName);
|
|
346
|
-
},
|
|
347
|
-
|
|
348
|
-
/**
|
|
349
|
-
* Registers a command
|
|
350
|
-
* @param {String} name
|
|
351
|
-
* @param {String} [label]
|
|
352
|
-
* @param {String} [description]
|
|
353
|
-
* @returns {calculator}
|
|
354
|
-
* @fires commandadd after the command has been set
|
|
355
|
-
*/
|
|
356
|
-
setCommand: function setCommand(name, label, description) {
|
|
357
|
-
commands.set(name, {
|
|
358
|
-
name: name,
|
|
359
|
-
label: label,
|
|
360
|
-
description: description
|
|
361
|
-
});
|
|
362
|
-
/**
|
|
363
|
-
* @event commandadd
|
|
364
|
-
* @param {String} name
|
|
365
|
-
*/
|
|
366
|
-
this.trigger('commandadd', name);
|
|
367
|
-
return this;
|
|
368
|
-
},
|
|
369
|
-
|
|
370
|
-
/**
|
|
371
|
-
* Gets the definition of a registered command
|
|
372
|
-
* @returns {Object} The registered command
|
|
373
|
-
*/
|
|
374
|
-
getCommand: function getCommand(name) {
|
|
375
|
-
return commands.get(name);
|
|
376
|
-
},
|
|
377
|
-
|
|
378
|
-
/**
|
|
379
|
-
* Gets the list of registered commands
|
|
380
|
-
* @returns {Object} The list of registered commands
|
|
381
|
-
*/
|
|
382
|
-
getCommands: function getCommands() {
|
|
383
|
-
var defs = {};
|
|
384
|
-
commands.forEach(function(value, name) {
|
|
385
|
-
defs[name] = value;
|
|
386
|
-
});
|
|
387
|
-
return defs;
|
|
388
|
-
},
|
|
389
|
-
|
|
390
|
-
/**
|
|
391
|
-
* Checks if a command is registered
|
|
392
|
-
* @param {String} name
|
|
393
|
-
* @returns {Boolean}
|
|
394
|
-
*/
|
|
395
|
-
hasCommand: function hasCommand(name) {
|
|
396
|
-
return commands.has(name);
|
|
397
|
-
},
|
|
398
|
-
|
|
399
|
-
/**
|
|
400
|
-
* Delete a registered command
|
|
401
|
-
* @param {String} name
|
|
402
|
-
* @returns {calculator}
|
|
403
|
-
* @fires commanddelete after the command has been deleted
|
|
404
|
-
*/
|
|
405
|
-
deleteCommand: function deleteCommand(name) {
|
|
406
|
-
commands.delete(name);
|
|
407
|
-
/**
|
|
408
|
-
* @event commanddelete
|
|
409
|
-
* @param {String} name
|
|
410
|
-
*/
|
|
411
|
-
this.trigger('commanddelete', name);
|
|
412
|
-
return this;
|
|
413
|
-
},
|
|
414
|
-
|
|
415
|
-
/**
|
|
416
|
-
* Inserts a term in the expression at the current position
|
|
417
|
-
* @param {String} name - The name of the term to insert
|
|
418
|
-
* @param {Object} term - The definition of the term to insert
|
|
419
|
-
* @returns {calculator}
|
|
420
|
-
* @fires termerror if the term to add is invalid
|
|
421
|
-
* @fires termadd when the term has been added
|
|
422
|
-
* @fires termadd-<name> when the term has been added
|
|
423
|
-
*/
|
|
424
|
-
addTerm: function addTerm(name, term) {
|
|
425
|
-
var tokensList = this.getTokens();
|
|
426
|
-
var index = this.getTokenIndex();
|
|
427
|
-
var currentToken = tokensList[index];
|
|
428
|
-
var nextToken = tokensList[index + 1];
|
|
429
|
-
var isIdentifier, needsSpace, value;
|
|
430
|
-
|
|
431
|
-
// checks if the aforementioned token requires space around
|
|
432
|
-
function tokenNeedsSpace(token) {
|
|
433
|
-
return tokensHelper.isIdentifier(token) || (isIdentifier && !tokensHelper.isSeparator(token));
|
|
434
|
-
}
|
|
435
|
-
|
|
436
|
-
if (!_.isPlainObject(term) || 'undefined' === typeof term.value) {
|
|
437
|
-
/**
|
|
438
|
-
* @event termerror
|
|
439
|
-
* @param {TypeError} err
|
|
440
|
-
*/
|
|
441
|
-
return this.trigger('termerror', new TypeError('Invalid term: ' + name));
|
|
442
|
-
}
|
|
443
|
-
|
|
444
|
-
value = term.value;
|
|
445
|
-
|
|
446
|
-
// will replace the current term if:
|
|
447
|
-
// - it is a 0, and the term to add is not an operator nor a dot
|
|
448
|
-
// - it is the last result, and the term to add is not an operator
|
|
449
|
-
if (
|
|
450
|
-
!tokensHelper.isOperator(term.type) &&
|
|
451
|
-
!rePrefixedTerm.test(term.value) &&
|
|
452
|
-
tokensList.length === 1 &&
|
|
453
|
-
((currentToken.type === 'NUM0' && name !== 'DOT') || currentToken.type === 'ANS')
|
|
454
|
-
) {
|
|
455
|
-
this.replace(value);
|
|
456
|
-
} else {
|
|
457
|
-
// simply add the term, with potentially spaces around
|
|
458
|
-
if (expression && !tokensHelper.isSeparator(term.type)) {
|
|
459
|
-
isIdentifier = tokensHelper.isIdentifier(term.type);
|
|
460
|
-
needsSpace = tokenNeedsSpace(currentToken);
|
|
461
|
-
|
|
462
|
-
// prepend space when either the term to add or the previous term is an identifier
|
|
463
|
-
if (position && needsSpace) {
|
|
464
|
-
value = ' ' + value;
|
|
465
|
-
}
|
|
466
|
-
|
|
467
|
-
// append space when either the term to add or the next term is an identifier
|
|
468
|
-
if ((!position && needsSpace) || (position < expression.length && tokenNeedsSpace(nextToken))) {
|
|
469
|
-
value += ' ';
|
|
470
|
-
}
|
|
471
|
-
}
|
|
472
|
-
|
|
473
|
-
this.insert(value);
|
|
474
|
-
}
|
|
475
|
-
|
|
476
|
-
/**
|
|
477
|
-
* @event termadd
|
|
478
|
-
* @param {String} name - The name of the added term
|
|
479
|
-
* @param {Object} term - The descriptor of the added term
|
|
480
|
-
*/
|
|
481
|
-
this.trigger('termadd', name, term);
|
|
482
|
-
|
|
483
|
-
/**
|
|
484
|
-
* @event termadd-<name>
|
|
485
|
-
* @param {Object} term - The descriptor of the added term
|
|
486
|
-
*/
|
|
487
|
-
this.trigger('termadd-' + name, term);
|
|
488
|
-
|
|
489
|
-
return this;
|
|
490
|
-
},
|
|
491
|
-
|
|
492
|
-
/**
|
|
493
|
-
* Inserts a term in the expression at the current position
|
|
494
|
-
* @param {String} name - The name of the term to insert
|
|
495
|
-
* @returns {calculator}
|
|
496
|
-
* @fires termerror if the term to add is invalid
|
|
497
|
-
* @fires termadd when the term has been added
|
|
498
|
-
*/
|
|
499
|
-
useTerm: function useTerm(name) {
|
|
500
|
-
var term;
|
|
501
|
-
if (rePrefixedTerm.test(name)) {
|
|
502
|
-
name = name.substring(1);
|
|
503
|
-
term = _.clone(registeredTerms[name]);
|
|
504
|
-
term.value = '@' + term.value;
|
|
505
|
-
} else {
|
|
506
|
-
term = registeredTerms[name];
|
|
507
|
-
}
|
|
508
|
-
|
|
509
|
-
if ('undefined' === typeof term) {
|
|
510
|
-
/**
|
|
511
|
-
* @event termerror
|
|
512
|
-
* @param {TypeError} err
|
|
513
|
-
*/
|
|
514
|
-
return this.trigger('termerror', new TypeError('Invalid term: ' + name));
|
|
515
|
-
}
|
|
516
|
-
|
|
517
|
-
return this.addTerm(name, term);
|
|
518
|
-
},
|
|
519
|
-
|
|
520
|
-
/**
|
|
521
|
-
* Inserts a list of terms in the expression at the current position
|
|
522
|
-
* @param {String|String[]} names - The names of the terms to insert.
|
|
523
|
-
* Could be either an array of names or a list separated by spaces.
|
|
524
|
-
* @returns {calculator}
|
|
525
|
-
* @fires termerror if a term to add is invalid
|
|
526
|
-
* @fires termadd when a term has been added
|
|
527
|
-
*/
|
|
528
|
-
useTerms: function useTerms(names) {
|
|
529
|
-
if ('string' === typeof names) {
|
|
530
|
-
names = names.split(/\s+/);
|
|
531
|
-
}
|
|
532
|
-
|
|
533
|
-
_.forEach(names, this.useTerm.bind(this));
|
|
534
|
-
|
|
535
|
-
return this;
|
|
536
|
-
},
|
|
537
|
-
|
|
538
|
-
/**
|
|
539
|
-
* Inserts a variable as a term in the expression at the current position
|
|
540
|
-
* @param {String} name - The name of the variable to insert
|
|
541
|
-
* @returns {calculator}
|
|
542
|
-
* @fires termerror if the term to add is invalid
|
|
543
|
-
* @fires termadd when the term has been added
|
|
544
|
-
*/
|
|
545
|
-
useVariable: function useVariable(name) {
|
|
546
|
-
if (!variables.has(name)) {
|
|
547
|
-
/**
|
|
548
|
-
* @event termerror
|
|
549
|
-
* @param {TypeError} err
|
|
550
|
-
*/
|
|
551
|
-
return this.trigger('termerror', new TypeError('Invalid variable: ' + name));
|
|
552
|
-
}
|
|
553
|
-
|
|
554
|
-
return this.addTerm('VAR_' + name.toUpperCase(), {
|
|
555
|
-
label: name,
|
|
556
|
-
value: name,
|
|
557
|
-
type: 'variable',
|
|
558
|
-
description: __('Variable %s', name)
|
|
559
|
-
});
|
|
560
|
-
},
|
|
561
|
-
|
|
562
|
-
/**
|
|
563
|
-
* Calls a command
|
|
564
|
-
* @param {String} name - The name of the called command
|
|
565
|
-
* @param {*} ... - additional params for the command
|
|
566
|
-
* @returns {calculator}
|
|
567
|
-
* @fires command with the name and the parameters of the command
|
|
568
|
-
* @fires command-<name> with the parameters of the command
|
|
569
|
-
* @fires commanderror if the command is invalid
|
|
570
|
-
*/
|
|
571
|
-
useCommand: function useCommand(name) {
|
|
572
|
-
if (!commands.has(name)) {
|
|
573
|
-
/**
|
|
574
|
-
* @event commanderror
|
|
575
|
-
* @param {TypeError} err
|
|
576
|
-
*/
|
|
577
|
-
return this.trigger('commanderror', new TypeError('Invalid command: ' + name));
|
|
578
|
-
}
|
|
579
|
-
|
|
580
|
-
/**
|
|
581
|
-
* @event command
|
|
582
|
-
* @param {String} name - The name of the called command
|
|
583
|
-
* @param {*} ... - additional params for the command
|
|
584
|
-
*/
|
|
585
|
-
this.trigger.apply(this, ['command'].concat([].slice.call(arguments)));
|
|
586
|
-
|
|
587
|
-
/**
|
|
588
|
-
* @event command-<name>
|
|
589
|
-
* @param {*} ... - additional params for the command
|
|
590
|
-
*/
|
|
591
|
-
this.trigger.apply(this, ['command-' + name].concat([].slice.call(arguments, 1)));
|
|
592
|
-
|
|
593
|
-
return this;
|
|
594
|
-
},
|
|
595
|
-
|
|
596
|
-
/**
|
|
597
|
-
* Replaces the expression and move the cursor at the end.
|
|
598
|
-
* @param {String} newExpression - The new expression to set
|
|
599
|
-
* @param {Number|String} [newPosition=newExpression.length] - The new position to set
|
|
600
|
-
* @returns {calculator}
|
|
601
|
-
* @fires replace after the expression has been replaced
|
|
602
|
-
*/
|
|
603
|
-
replace: function replace(newExpression, newPosition) {
|
|
604
|
-
var oldExpression = expression;
|
|
605
|
-
var oldPosition = position;
|
|
606
|
-
|
|
607
|
-
this.setExpression(newExpression).setPosition(
|
|
608
|
-
'undefined' !== typeof newPosition ? newPosition : expression.length
|
|
609
|
-
);
|
|
610
|
-
|
|
611
|
-
/**
|
|
612
|
-
* @event replace
|
|
613
|
-
* @param {String} expression - the replaced expression
|
|
614
|
-
* @param {Number} position - the replaced position
|
|
615
|
-
*/
|
|
616
|
-
this.trigger('replace', oldExpression, oldPosition);
|
|
617
|
-
|
|
618
|
-
return this;
|
|
619
|
-
},
|
|
620
|
-
|
|
621
|
-
/**
|
|
622
|
-
* Inserts a sub-expression in the current expression and move the cursor.
|
|
623
|
-
* @param {String} subExpression - The sub-expression to insert
|
|
624
|
-
* @returns {calculator}
|
|
625
|
-
* @fires insert after the expression has been inserted
|
|
626
|
-
*/
|
|
627
|
-
insert: function insert(subExpression) {
|
|
628
|
-
var oldExpression = expression;
|
|
629
|
-
var oldPosition = position;
|
|
630
|
-
|
|
631
|
-
this.setExpression(
|
|
632
|
-
expression.substr(0, position) + subExpression + expression.substr(position)
|
|
633
|
-
).setPosition(position + subExpression.length);
|
|
634
|
-
|
|
635
|
-
/**
|
|
636
|
-
* @event insert
|
|
637
|
-
* @param {String} expression - the replaced expression
|
|
638
|
-
* @param {Number} position - the replaced position
|
|
639
|
-
*/
|
|
640
|
-
this.trigger('insert', oldExpression, oldPosition);
|
|
641
|
-
|
|
642
|
-
return this;
|
|
643
|
-
},
|
|
644
|
-
|
|
645
|
-
/**
|
|
646
|
-
* Clears the expression
|
|
647
|
-
* @returns {calculator}
|
|
648
|
-
* @fires clear after the expression has been cleared
|
|
649
|
-
*/
|
|
650
|
-
clear: function clear() {
|
|
651
|
-
this.setExpression('').setPosition(0);
|
|
652
|
-
|
|
653
|
-
/**
|
|
654
|
-
* @event clear
|
|
655
|
-
*/
|
|
656
|
-
this.trigger('clear');
|
|
657
|
-
|
|
658
|
-
return this;
|
|
659
|
-
},
|
|
660
|
-
|
|
661
|
-
/**
|
|
662
|
-
* Evaluates the current expression
|
|
663
|
-
* @returns {mathsExpression|null}
|
|
664
|
-
* @fires evaluate when the expression has been evaluated
|
|
665
|
-
* @fires syntaxerror when the expression contains an error
|
|
666
|
-
*/
|
|
667
|
-
evaluate: function evaluate() {
|
|
668
|
-
var result = null;
|
|
669
|
-
try {
|
|
670
|
-
if (expression.trim()) {
|
|
671
|
-
result = mathsEvaluator(expression, _.mapValues(this.getVariables(), 'result'));
|
|
672
|
-
} else {
|
|
673
|
-
result = mathsEvaluator('0');
|
|
674
|
-
}
|
|
675
|
-
|
|
676
|
-
/**
|
|
677
|
-
* @event evaluate
|
|
678
|
-
* @param {mathsExpression} result
|
|
679
|
-
*/
|
|
680
|
-
this.trigger('evaluate', result);
|
|
681
|
-
} catch (e) {
|
|
682
|
-
/**
|
|
683
|
-
* @event syntaxerror
|
|
684
|
-
* @param {Error} err
|
|
685
|
-
*/
|
|
686
|
-
this.trigger('syntaxerror', e);
|
|
687
|
-
}
|
|
688
|
-
return result;
|
|
689
|
-
},
|
|
690
|
-
|
|
691
|
-
/**
|
|
692
|
-
* Runs a method in all plugins
|
|
693
|
-
*
|
|
694
|
-
* @param {String} method - the method to run
|
|
695
|
-
* @returns {Promise} once that resolve when all plugins are done
|
|
696
|
-
*/
|
|
697
|
-
runPlugins: function runPlugins(method) {
|
|
698
|
-
var execStack = [];
|
|
699
|
-
|
|
700
|
-
_.forEach(plugins, function(plugin) {
|
|
701
|
-
if (_.isFunction(plugin[method])) {
|
|
702
|
-
execStack.push(plugin[method]());
|
|
703
|
-
}
|
|
704
|
-
});
|
|
705
|
-
|
|
706
|
-
return Promise.all(execStack);
|
|
707
|
-
},
|
|
708
|
-
|
|
709
|
-
/**
|
|
710
|
-
* Gets the calculator plugins
|
|
711
|
-
* @returns {Array} the plugins
|
|
712
|
-
*/
|
|
713
|
-
getPlugins: function getPlugins() {
|
|
714
|
-
return _.toArray(plugins);
|
|
715
|
-
},
|
|
716
|
-
|
|
717
|
-
/**
|
|
718
|
-
* Gets a plugin
|
|
719
|
-
* @param {String} name - the plugin name
|
|
720
|
-
* @returns {plugin} the plugin
|
|
721
|
-
*/
|
|
722
|
-
getPlugin: function getPlugin(name) {
|
|
723
|
-
return plugins[name];
|
|
724
|
-
},
|
|
725
|
-
|
|
726
|
-
/**
|
|
727
|
-
* Gets access to the areaBroker
|
|
728
|
-
* @returns {areaBroker}
|
|
729
|
-
*/
|
|
730
|
-
getAreaBroker: function getAreaBroker() {
|
|
731
|
-
return areaBroker;
|
|
732
|
-
},
|
|
733
|
-
|
|
734
|
-
/**
|
|
735
|
-
* Setups the maths evaluator
|
|
736
|
-
* @returns {calculator}
|
|
737
|
-
*/
|
|
738
|
-
setupMathsEvaluator: function setupMathsEvaluator() {
|
|
739
|
-
mathsEvaluator = mathsEvaluatorFactory(this.getConfig().maths);
|
|
740
|
-
return this;
|
|
741
|
-
},
|
|
742
|
-
|
|
743
|
-
/**
|
|
744
|
-
* Gets access to the mathsEvaluator
|
|
745
|
-
* @returns {Function}
|
|
746
|
-
*/
|
|
747
|
-
getMathsEvaluator: function getMathsEvaluator() {
|
|
748
|
-
return mathsEvaluator;
|
|
749
|
-
}
|
|
750
|
-
};
|
|
751
|
-
|
|
752
|
-
/**
|
|
753
|
-
* @typedef {component} calculator
|
|
754
|
-
*/
|
|
755
|
-
var calculator = componentFactory(calculatorApi, defaultConfig)
|
|
756
|
-
.setTemplate(boardTpl)
|
|
757
|
-
.before('init', function() {
|
|
758
|
-
this.setupMathsEvaluator();
|
|
759
|
-
this.setLastResult('0');
|
|
760
|
-
if (this.config.expression) {
|
|
761
|
-
this.setExpression(this.config.expression);
|
|
762
|
-
}
|
|
763
|
-
if (this.config.position) {
|
|
764
|
-
this.setPosition(this.config.position);
|
|
765
|
-
}
|
|
766
|
-
|
|
767
|
-
// built-in commands
|
|
768
|
-
this.setCommand('clear', __('Clear'), __('Clear expression'))
|
|
769
|
-
.setCommand('clearAll', __('Clear All'), __('Clear all data'))
|
|
770
|
-
.setCommand('execute', __('Execute'), __('Compute the expression'))
|
|
771
|
-
.setCommand('var', __('Variable'), __('Use a variable'))
|
|
772
|
-
.setCommand('term', __('Term'), __('Use a term'))
|
|
773
|
-
.on('command-term', this.useTerms.bind(this))
|
|
774
|
-
.on('command-var', this.useVariable.bind(this))
|
|
775
|
-
.on('command-execute', this.evaluate.bind(this))
|
|
776
|
-
.on('command-clearAll', this.deleteVariables.bind(this))
|
|
777
|
-
.on('command-clear command-clearAll', this.clear.bind(this));
|
|
778
|
-
})
|
|
779
|
-
.after('evaluate', function(result) {
|
|
780
|
-
this.setLastResult(result);
|
|
781
|
-
})
|
|
782
|
-
.after('init', function() {
|
|
783
|
-
this.render($container);
|
|
784
|
-
})
|
|
785
|
-
.before('render', function() {
|
|
786
|
-
var self = this;
|
|
787
|
-
var pluginsConfig = this.getConfig().plugins || {};
|
|
788
|
-
var $element = this.getElement();
|
|
789
|
-
|
|
790
|
-
areaBroker = areaBrokerFactory($element, {
|
|
791
|
-
screen: $element.find('.screen'), // where the expressions and their result are rendered
|
|
792
|
-
input: $element.find('.input'), // where the expressions are input
|
|
793
|
-
keyboard: $element.find('.keyboard') // the keyboard area that should provide a way to interact with the calculator
|
|
794
|
-
});
|
|
795
|
-
|
|
796
|
-
_.forEach(pluginFactories, function(pluginFactory) {
|
|
797
|
-
var plugin = pluginFactory(self, self.getAreaBroker());
|
|
798
|
-
var pluginName = plugin.getName();
|
|
799
|
-
if (pluginsConfig[pluginName]) {
|
|
800
|
-
plugin.setConfig(pluginsConfig[pluginName]);
|
|
801
|
-
}
|
|
802
|
-
plugins[plugin.getName()] = plugin;
|
|
803
|
-
});
|
|
804
|
-
|
|
805
|
-
return this.runPlugins('install')
|
|
806
|
-
.then(function() {
|
|
807
|
-
return self.runPlugins('init');
|
|
808
|
-
})
|
|
809
|
-
.then(function() {
|
|
810
|
-
return self.runPlugins('render');
|
|
811
|
-
})
|
|
812
|
-
.then(function() {
|
|
813
|
-
/**
|
|
814
|
-
* @event ready
|
|
815
|
-
*/
|
|
816
|
-
self.trigger('ready');
|
|
817
|
-
})
|
|
818
|
-
.catch(function(err) {
|
|
819
|
-
self.trigger('error', err);
|
|
820
|
-
});
|
|
821
|
-
})
|
|
822
|
-
.on('destroy', function() {
|
|
823
|
-
var self = this;
|
|
824
|
-
return this.runPlugins('destroy').then(function() {
|
|
825
|
-
self.off('.' + ns);
|
|
826
|
-
tokenizer = null;
|
|
827
|
-
areaBroker = null;
|
|
828
|
-
mathsEvaluator = null;
|
|
829
|
-
variables.clear();
|
|
830
|
-
plugins = {};
|
|
831
|
-
});
|
|
832
|
-
});
|
|
833
|
-
|
|
834
|
-
_.defer(function() {
|
|
835
|
-
calculator.init(config);
|
|
836
|
-
});
|
|
837
|
-
|
|
838
|
-
return calculator;
|
|
839
|
-
}
|
|
840
|
-
|
|
841
|
-
export default calculatorBoardFactory;
|
|
1
|
+
/**
|
|
2
|
+
* This program is free software; you can redistribute it and/or
|
|
3
|
+
* modify it under the terms of the GNU General Public License
|
|
4
|
+
* as published by the Free Software Foundation; under version 2
|
|
5
|
+
* of the License (non-upgradable).
|
|
6
|
+
*
|
|
7
|
+
* This program is distributed in the hope that it will be useful,
|
|
8
|
+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
9
|
+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
10
|
+
* GNU General Public License for more details.
|
|
11
|
+
*
|
|
12
|
+
* You should have received a copy of the GNU General Public License
|
|
13
|
+
* along with this program; if not, write to the Free Software
|
|
14
|
+
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
15
|
+
*
|
|
16
|
+
* Copyright (c) 2018-2019 Open Assessment Technologies SA ;
|
|
17
|
+
*/
|
|
18
|
+
/**
|
|
19
|
+
* Defines the base component that will host the calculator UI and link it to the engine.
|
|
20
|
+
* @author Jean-Sébastien Conan <jean-sebastien@taotesting.com>
|
|
21
|
+
*/
|
|
22
|
+
|
|
23
|
+
import _ from 'lodash';
|
|
24
|
+
import __ from 'i18n';
|
|
25
|
+
|
|
26
|
+
import collections from 'core/collections';
|
|
27
|
+
import componentFactory from 'ui/component';
|
|
28
|
+
import areaBrokerFactory from 'ui/maths/calculator/core/areaBroker';
|
|
29
|
+
import registeredTerms from 'ui/maths/calculator/core/terms';
|
|
30
|
+
import tokensHelper from 'ui/maths/calculator/core/tokens';
|
|
31
|
+
import expressionHelper from 'ui/maths/calculator/core/expression';
|
|
32
|
+
import tokenizerFactory from 'ui/maths/calculator/core/tokenizer';
|
|
33
|
+
import mathsEvaluatorFactory from 'util/mathsEvaluator';
|
|
34
|
+
import boardTpl from 'ui/maths/calculator/core/tpl/board';
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Default config values
|
|
38
|
+
* @type {Object}
|
|
39
|
+
*/
|
|
40
|
+
var defaultConfig = {
|
|
41
|
+
expression: '',
|
|
42
|
+
position: 0
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Name of the variable that contains the last result
|
|
47
|
+
* @type {String}
|
|
48
|
+
*/
|
|
49
|
+
var lastResultVariableName = registeredTerms.ANS.value;
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Regex that matches the prefixed function operators
|
|
53
|
+
* @type {RegExp}
|
|
54
|
+
*/
|
|
55
|
+
var rePrefixedTerm = /^@[a-zA-Z_]\w*$/;
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* The internal namespace for built-in events listeners
|
|
59
|
+
* @type {String}
|
|
60
|
+
*/
|
|
61
|
+
var ns = 'calculator';
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Build the basic UI for a calculator
|
|
65
|
+
* @param {jQuery|HTMLElement|String} $container
|
|
66
|
+
* @param {Function[]} pluginFactories
|
|
67
|
+
* @param {Object} [config]
|
|
68
|
+
* @param {String} [config.expression=''] - The initial expression
|
|
69
|
+
* @param {Number} [config.position=0] - The initial position in the expression
|
|
70
|
+
* @param {Object} [config.maths] - Optional config for the maths evaluator (@see util/mathsEvaluator)
|
|
71
|
+
* @param {Object} [config.plugins] - Optional config for each plugins
|
|
72
|
+
* @returns {calculator}
|
|
73
|
+
*/
|
|
74
|
+
function calculatorBoardFactory($container, pluginFactories, config) {
|
|
75
|
+
/**
|
|
76
|
+
* Maths expression parser.
|
|
77
|
+
* @type {Function}
|
|
78
|
+
*/
|
|
79
|
+
var mathsEvaluator;
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Keep the area broker instance
|
|
83
|
+
* @see ui/maths/calculator/areaBroker
|
|
84
|
+
*/
|
|
85
|
+
var areaBroker;
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* @type {Object} the registered plugins
|
|
89
|
+
*/
|
|
90
|
+
var plugins = {};
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* The current expression
|
|
94
|
+
* @type {String}
|
|
95
|
+
*/
|
|
96
|
+
var expression = '';
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* A list of variables that can be used in the expression
|
|
100
|
+
* @type {Map}
|
|
101
|
+
*/
|
|
102
|
+
var variables = new collections.Map();
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* A list of registered commands that can be used inside the calculator
|
|
106
|
+
* @type {Map}
|
|
107
|
+
*/
|
|
108
|
+
var commands = new collections.Map();
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* The current position in the current expression (i.e. the position of the caret)
|
|
112
|
+
* @type {Number}
|
|
113
|
+
*/
|
|
114
|
+
var position = 0;
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* The tokenizer utilized to split down the expression
|
|
118
|
+
* @type {calculatorTokenizer}
|
|
119
|
+
*/
|
|
120
|
+
var tokenizer = tokenizerFactory();
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* The list of tokens extracted from the expression
|
|
124
|
+
* @type {Array|null}
|
|
125
|
+
*/
|
|
126
|
+
var tokens = null;
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
*
|
|
130
|
+
* @type {Object}
|
|
131
|
+
*/
|
|
132
|
+
var calculatorApi = {
|
|
133
|
+
/**
|
|
134
|
+
* Returns the current expression
|
|
135
|
+
* @returns {String}
|
|
136
|
+
*/
|
|
137
|
+
getExpression: function getExpression() {
|
|
138
|
+
return expression;
|
|
139
|
+
},
|
|
140
|
+
|
|
141
|
+
/**
|
|
142
|
+
* Changes the current expression
|
|
143
|
+
* @param {String} expr
|
|
144
|
+
* @returns {calculator}
|
|
145
|
+
* @fires expressionchange after the expression has been changed
|
|
146
|
+
*/
|
|
147
|
+
setExpression: function setExpression(expr) {
|
|
148
|
+
expression = String(expr || '');
|
|
149
|
+
tokens = null;
|
|
150
|
+
/**
|
|
151
|
+
* @event expressionchange
|
|
152
|
+
* @param {String} expression
|
|
153
|
+
*/
|
|
154
|
+
this.trigger('expressionchange', expression);
|
|
155
|
+
return this;
|
|
156
|
+
},
|
|
157
|
+
|
|
158
|
+
/**
|
|
159
|
+
* Gets the current position inside the expression
|
|
160
|
+
* @returns {Number}
|
|
161
|
+
*/
|
|
162
|
+
getPosition: function getPosition() {
|
|
163
|
+
return position;
|
|
164
|
+
},
|
|
165
|
+
|
|
166
|
+
/**
|
|
167
|
+
* Sets the current position inside the expression
|
|
168
|
+
* @param {Number|String} pos
|
|
169
|
+
* @returns {calculator}
|
|
170
|
+
* @fires positionchange after the position has been changed
|
|
171
|
+
*/
|
|
172
|
+
setPosition: function setPosition(pos) {
|
|
173
|
+
position = Math.max(0, Math.min(parseInt(pos, 10) || 0, expression.length));
|
|
174
|
+
/**
|
|
175
|
+
* @event positionchange
|
|
176
|
+
* @param {Number} position
|
|
177
|
+
*/
|
|
178
|
+
this.trigger('positionchange', position);
|
|
179
|
+
return this;
|
|
180
|
+
},
|
|
181
|
+
|
|
182
|
+
/**
|
|
183
|
+
* Gets the tokens from the current expression
|
|
184
|
+
* @returns {token[]}
|
|
185
|
+
*/
|
|
186
|
+
getTokens: function getTokens() {
|
|
187
|
+
if (tokens === null) {
|
|
188
|
+
tokens = tokenizer.tokenize(expression);
|
|
189
|
+
}
|
|
190
|
+
return tokens;
|
|
191
|
+
},
|
|
192
|
+
|
|
193
|
+
/**
|
|
194
|
+
* Gets the token at the current position from the current expression
|
|
195
|
+
* @returns {token|null} Returns the token at the current position, or null if none
|
|
196
|
+
*/
|
|
197
|
+
getToken: function getToken() {
|
|
198
|
+
var tokensList = this.getTokens();
|
|
199
|
+
var index = this.getTokenIndex();
|
|
200
|
+
return tokensList[index] || null;
|
|
201
|
+
},
|
|
202
|
+
|
|
203
|
+
/**
|
|
204
|
+
* Gets token index from the current position in the expression.
|
|
205
|
+
* @returns {Number} Returns the index of the token at the current position.
|
|
206
|
+
*/
|
|
207
|
+
getTokenIndex: function getTokenIndex() {
|
|
208
|
+
var index = 0;
|
|
209
|
+
_.forEach(this.getTokens(), function(token, idx) {
|
|
210
|
+
if (position >= token.offset) {
|
|
211
|
+
index = idx;
|
|
212
|
+
}
|
|
213
|
+
});
|
|
214
|
+
return index;
|
|
215
|
+
},
|
|
216
|
+
|
|
217
|
+
/**
|
|
218
|
+
* Gets access to the tokenizer
|
|
219
|
+
* @returns {calculatorTokenizer}
|
|
220
|
+
*/
|
|
221
|
+
getTokenizer: function getTokenizer() {
|
|
222
|
+
return tokenizer;
|
|
223
|
+
},
|
|
224
|
+
|
|
225
|
+
/**
|
|
226
|
+
* Gets a variable defined for the expression.
|
|
227
|
+
* @param {String} name - The variable name
|
|
228
|
+
* @returns {mathsExpression} The value. Can be another expression.
|
|
229
|
+
*/
|
|
230
|
+
getVariable: function getVariable(name) {
|
|
231
|
+
return variables.get(name);
|
|
232
|
+
},
|
|
233
|
+
|
|
234
|
+
/**
|
|
235
|
+
* Checks if a variable is registered
|
|
236
|
+
* @param {String} name
|
|
237
|
+
* @returns {Boolean}
|
|
238
|
+
*/
|
|
239
|
+
hasVariable: function hasVariable(name) {
|
|
240
|
+
return variables.has(name);
|
|
241
|
+
},
|
|
242
|
+
|
|
243
|
+
/**
|
|
244
|
+
* Sets a variable that can be used by the expression.
|
|
245
|
+
* @param {String} name - The variable name
|
|
246
|
+
* @param {String|Number|mathsExpression} value - The value. Can be another expression.
|
|
247
|
+
* @returns {calculator}
|
|
248
|
+
* @fires variableadd after the variable has been set
|
|
249
|
+
*/
|
|
250
|
+
setVariable: function setVariable(name, value) {
|
|
251
|
+
var errValue;
|
|
252
|
+
try {
|
|
253
|
+
value = mathsEvaluator(value);
|
|
254
|
+
} catch (err) {
|
|
255
|
+
errValue = (value && value.expression) || value;
|
|
256
|
+
value = mathsEvaluator('0');
|
|
257
|
+
value.expression = errValue;
|
|
258
|
+
}
|
|
259
|
+
variables.set(name, value);
|
|
260
|
+
/**
|
|
261
|
+
* @event variableadd
|
|
262
|
+
* @param {String} name
|
|
263
|
+
* @param {String} value
|
|
264
|
+
*/
|
|
265
|
+
this.trigger('variableadd', name, value);
|
|
266
|
+
return this;
|
|
267
|
+
},
|
|
268
|
+
|
|
269
|
+
/**
|
|
270
|
+
* Deletes a variable defined for the expression.
|
|
271
|
+
* @param {String} name - The variable name
|
|
272
|
+
* @returns {calculator}
|
|
273
|
+
* @fires variabledelete after the variable has been deleted
|
|
274
|
+
*/
|
|
275
|
+
deleteVariable: function deleteVariable(name) {
|
|
276
|
+
variables.delete(name);
|
|
277
|
+
/**
|
|
278
|
+
* @event variabledelete
|
|
279
|
+
* @param {String} name
|
|
280
|
+
*/
|
|
281
|
+
this.trigger('variabledelete', name);
|
|
282
|
+
return this;
|
|
283
|
+
},
|
|
284
|
+
|
|
285
|
+
/**
|
|
286
|
+
* Gets the list of variables defined for the expression.
|
|
287
|
+
* @returns {Object} The list of defined variables.
|
|
288
|
+
*/
|
|
289
|
+
getVariables: function getVariables() {
|
|
290
|
+
var defs = {};
|
|
291
|
+
variables.forEach(function(value, name) {
|
|
292
|
+
defs[name] = value;
|
|
293
|
+
});
|
|
294
|
+
return defs;
|
|
295
|
+
},
|
|
296
|
+
|
|
297
|
+
/**
|
|
298
|
+
* Sets a list of variables that can be used by the expression.
|
|
299
|
+
* @param {Object} defs - A list variables to set.
|
|
300
|
+
* @returns {calculator}
|
|
301
|
+
* @fires variableadd after each variable has been set
|
|
302
|
+
*/
|
|
303
|
+
setVariables: function setVariables(defs) {
|
|
304
|
+
var self = this;
|
|
305
|
+
_.forEach(defs, function(value, name) {
|
|
306
|
+
self.setVariable(name, value);
|
|
307
|
+
});
|
|
308
|
+
return this;
|
|
309
|
+
},
|
|
310
|
+
|
|
311
|
+
/**
|
|
312
|
+
* Deletes all variables defined for the expression.
|
|
313
|
+
* @returns {calculator}
|
|
314
|
+
* @fires variabledelete after the variables has been deleted
|
|
315
|
+
*/
|
|
316
|
+
deleteVariables: function deleteVariables() {
|
|
317
|
+
variables.clear();
|
|
318
|
+
/**
|
|
319
|
+
* @event variabledelete
|
|
320
|
+
* @param {null} name
|
|
321
|
+
*/
|
|
322
|
+
this.trigger('variabledelete', null);
|
|
323
|
+
this.setLastResult('0');
|
|
324
|
+
return this;
|
|
325
|
+
},
|
|
326
|
+
|
|
327
|
+
/**
|
|
328
|
+
* Sets the value of the last result
|
|
329
|
+
* @param {String|Number|mathsExpression} [result='0']
|
|
330
|
+
* @returns {calculator}
|
|
331
|
+
*/
|
|
332
|
+
setLastResult: function setLastResult(result) {
|
|
333
|
+
if (!result || expressionHelper.containsError(result)) {
|
|
334
|
+
result = '0';
|
|
335
|
+
}
|
|
336
|
+
this.setVariable(lastResultVariableName, result);
|
|
337
|
+
return this;
|
|
338
|
+
},
|
|
339
|
+
|
|
340
|
+
/**
|
|
341
|
+
* Gets the value of the last result
|
|
342
|
+
* @returns {mathsExpression}
|
|
343
|
+
*/
|
|
344
|
+
getLastResult: function getLastResult() {
|
|
345
|
+
return this.getVariable(lastResultVariableName);
|
|
346
|
+
},
|
|
347
|
+
|
|
348
|
+
/**
|
|
349
|
+
* Registers a command
|
|
350
|
+
* @param {String} name
|
|
351
|
+
* @param {String} [label]
|
|
352
|
+
* @param {String} [description]
|
|
353
|
+
* @returns {calculator}
|
|
354
|
+
* @fires commandadd after the command has been set
|
|
355
|
+
*/
|
|
356
|
+
setCommand: function setCommand(name, label, description) {
|
|
357
|
+
commands.set(name, {
|
|
358
|
+
name: name,
|
|
359
|
+
label: label,
|
|
360
|
+
description: description
|
|
361
|
+
});
|
|
362
|
+
/**
|
|
363
|
+
* @event commandadd
|
|
364
|
+
* @param {String} name
|
|
365
|
+
*/
|
|
366
|
+
this.trigger('commandadd', name);
|
|
367
|
+
return this;
|
|
368
|
+
},
|
|
369
|
+
|
|
370
|
+
/**
|
|
371
|
+
* Gets the definition of a registered command
|
|
372
|
+
* @returns {Object} The registered command
|
|
373
|
+
*/
|
|
374
|
+
getCommand: function getCommand(name) {
|
|
375
|
+
return commands.get(name);
|
|
376
|
+
},
|
|
377
|
+
|
|
378
|
+
/**
|
|
379
|
+
* Gets the list of registered commands
|
|
380
|
+
* @returns {Object} The list of registered commands
|
|
381
|
+
*/
|
|
382
|
+
getCommands: function getCommands() {
|
|
383
|
+
var defs = {};
|
|
384
|
+
commands.forEach(function(value, name) {
|
|
385
|
+
defs[name] = value;
|
|
386
|
+
});
|
|
387
|
+
return defs;
|
|
388
|
+
},
|
|
389
|
+
|
|
390
|
+
/**
|
|
391
|
+
* Checks if a command is registered
|
|
392
|
+
* @param {String} name
|
|
393
|
+
* @returns {Boolean}
|
|
394
|
+
*/
|
|
395
|
+
hasCommand: function hasCommand(name) {
|
|
396
|
+
return commands.has(name);
|
|
397
|
+
},
|
|
398
|
+
|
|
399
|
+
/**
|
|
400
|
+
* Delete a registered command
|
|
401
|
+
* @param {String} name
|
|
402
|
+
* @returns {calculator}
|
|
403
|
+
* @fires commanddelete after the command has been deleted
|
|
404
|
+
*/
|
|
405
|
+
deleteCommand: function deleteCommand(name) {
|
|
406
|
+
commands.delete(name);
|
|
407
|
+
/**
|
|
408
|
+
* @event commanddelete
|
|
409
|
+
* @param {String} name
|
|
410
|
+
*/
|
|
411
|
+
this.trigger('commanddelete', name);
|
|
412
|
+
return this;
|
|
413
|
+
},
|
|
414
|
+
|
|
415
|
+
/**
|
|
416
|
+
* Inserts a term in the expression at the current position
|
|
417
|
+
* @param {String} name - The name of the term to insert
|
|
418
|
+
* @param {Object} term - The definition of the term to insert
|
|
419
|
+
* @returns {calculator}
|
|
420
|
+
* @fires termerror if the term to add is invalid
|
|
421
|
+
* @fires termadd when the term has been added
|
|
422
|
+
* @fires termadd-<name> when the term has been added
|
|
423
|
+
*/
|
|
424
|
+
addTerm: function addTerm(name, term) {
|
|
425
|
+
var tokensList = this.getTokens();
|
|
426
|
+
var index = this.getTokenIndex();
|
|
427
|
+
var currentToken = tokensList[index];
|
|
428
|
+
var nextToken = tokensList[index + 1];
|
|
429
|
+
var isIdentifier, needsSpace, value;
|
|
430
|
+
|
|
431
|
+
// checks if the aforementioned token requires space around
|
|
432
|
+
function tokenNeedsSpace(token) {
|
|
433
|
+
return tokensHelper.isIdentifier(token) || (isIdentifier && !tokensHelper.isSeparator(token));
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
if (!_.isPlainObject(term) || 'undefined' === typeof term.value) {
|
|
437
|
+
/**
|
|
438
|
+
* @event termerror
|
|
439
|
+
* @param {TypeError} err
|
|
440
|
+
*/
|
|
441
|
+
return this.trigger('termerror', new TypeError('Invalid term: ' + name));
|
|
442
|
+
}
|
|
443
|
+
|
|
444
|
+
value = term.value;
|
|
445
|
+
|
|
446
|
+
// will replace the current term if:
|
|
447
|
+
// - it is a 0, and the term to add is not an operator nor a dot
|
|
448
|
+
// - it is the last result, and the term to add is not an operator
|
|
449
|
+
if (
|
|
450
|
+
!tokensHelper.isOperator(term.type) &&
|
|
451
|
+
!rePrefixedTerm.test(term.value) &&
|
|
452
|
+
tokensList.length === 1 &&
|
|
453
|
+
((currentToken.type === 'NUM0' && name !== 'DOT') || currentToken.type === 'ANS')
|
|
454
|
+
) {
|
|
455
|
+
this.replace(value);
|
|
456
|
+
} else {
|
|
457
|
+
// simply add the term, with potentially spaces around
|
|
458
|
+
if (expression && !tokensHelper.isSeparator(term.type)) {
|
|
459
|
+
isIdentifier = tokensHelper.isIdentifier(term.type);
|
|
460
|
+
needsSpace = tokenNeedsSpace(currentToken);
|
|
461
|
+
|
|
462
|
+
// prepend space when either the term to add or the previous term is an identifier
|
|
463
|
+
if (position && needsSpace) {
|
|
464
|
+
value = ' ' + value;
|
|
465
|
+
}
|
|
466
|
+
|
|
467
|
+
// append space when either the term to add or the next term is an identifier
|
|
468
|
+
if ((!position && needsSpace) || (position < expression.length && tokenNeedsSpace(nextToken))) {
|
|
469
|
+
value += ' ';
|
|
470
|
+
}
|
|
471
|
+
}
|
|
472
|
+
|
|
473
|
+
this.insert(value);
|
|
474
|
+
}
|
|
475
|
+
|
|
476
|
+
/**
|
|
477
|
+
* @event termadd
|
|
478
|
+
* @param {String} name - The name of the added term
|
|
479
|
+
* @param {Object} term - The descriptor of the added term
|
|
480
|
+
*/
|
|
481
|
+
this.trigger('termadd', name, term);
|
|
482
|
+
|
|
483
|
+
/**
|
|
484
|
+
* @event termadd-<name>
|
|
485
|
+
* @param {Object} term - The descriptor of the added term
|
|
486
|
+
*/
|
|
487
|
+
this.trigger('termadd-' + name, term);
|
|
488
|
+
|
|
489
|
+
return this;
|
|
490
|
+
},
|
|
491
|
+
|
|
492
|
+
/**
|
|
493
|
+
* Inserts a term in the expression at the current position
|
|
494
|
+
* @param {String} name - The name of the term to insert
|
|
495
|
+
* @returns {calculator}
|
|
496
|
+
* @fires termerror if the term to add is invalid
|
|
497
|
+
* @fires termadd when the term has been added
|
|
498
|
+
*/
|
|
499
|
+
useTerm: function useTerm(name) {
|
|
500
|
+
var term;
|
|
501
|
+
if (rePrefixedTerm.test(name)) {
|
|
502
|
+
name = name.substring(1);
|
|
503
|
+
term = _.clone(registeredTerms[name]);
|
|
504
|
+
term.value = '@' + term.value;
|
|
505
|
+
} else {
|
|
506
|
+
term = registeredTerms[name];
|
|
507
|
+
}
|
|
508
|
+
|
|
509
|
+
if ('undefined' === typeof term) {
|
|
510
|
+
/**
|
|
511
|
+
* @event termerror
|
|
512
|
+
* @param {TypeError} err
|
|
513
|
+
*/
|
|
514
|
+
return this.trigger('termerror', new TypeError('Invalid term: ' + name));
|
|
515
|
+
}
|
|
516
|
+
|
|
517
|
+
return this.addTerm(name, term);
|
|
518
|
+
},
|
|
519
|
+
|
|
520
|
+
/**
|
|
521
|
+
* Inserts a list of terms in the expression at the current position
|
|
522
|
+
* @param {String|String[]} names - The names of the terms to insert.
|
|
523
|
+
* Could be either an array of names or a list separated by spaces.
|
|
524
|
+
* @returns {calculator}
|
|
525
|
+
* @fires termerror if a term to add is invalid
|
|
526
|
+
* @fires termadd when a term has been added
|
|
527
|
+
*/
|
|
528
|
+
useTerms: function useTerms(names) {
|
|
529
|
+
if ('string' === typeof names) {
|
|
530
|
+
names = names.split(/\s+/);
|
|
531
|
+
}
|
|
532
|
+
|
|
533
|
+
_.forEach(names, this.useTerm.bind(this));
|
|
534
|
+
|
|
535
|
+
return this;
|
|
536
|
+
},
|
|
537
|
+
|
|
538
|
+
/**
|
|
539
|
+
* Inserts a variable as a term in the expression at the current position
|
|
540
|
+
* @param {String} name - The name of the variable to insert
|
|
541
|
+
* @returns {calculator}
|
|
542
|
+
* @fires termerror if the term to add is invalid
|
|
543
|
+
* @fires termadd when the term has been added
|
|
544
|
+
*/
|
|
545
|
+
useVariable: function useVariable(name) {
|
|
546
|
+
if (!variables.has(name)) {
|
|
547
|
+
/**
|
|
548
|
+
* @event termerror
|
|
549
|
+
* @param {TypeError} err
|
|
550
|
+
*/
|
|
551
|
+
return this.trigger('termerror', new TypeError('Invalid variable: ' + name));
|
|
552
|
+
}
|
|
553
|
+
|
|
554
|
+
return this.addTerm('VAR_' + name.toUpperCase(), {
|
|
555
|
+
label: name,
|
|
556
|
+
value: name,
|
|
557
|
+
type: 'variable',
|
|
558
|
+
description: __('Variable %s', name)
|
|
559
|
+
});
|
|
560
|
+
},
|
|
561
|
+
|
|
562
|
+
/**
|
|
563
|
+
* Calls a command
|
|
564
|
+
* @param {String} name - The name of the called command
|
|
565
|
+
* @param {*} ... - additional params for the command
|
|
566
|
+
* @returns {calculator}
|
|
567
|
+
* @fires command with the name and the parameters of the command
|
|
568
|
+
* @fires command-<name> with the parameters of the command
|
|
569
|
+
* @fires commanderror if the command is invalid
|
|
570
|
+
*/
|
|
571
|
+
useCommand: function useCommand(name) {
|
|
572
|
+
if (!commands.has(name)) {
|
|
573
|
+
/**
|
|
574
|
+
* @event commanderror
|
|
575
|
+
* @param {TypeError} err
|
|
576
|
+
*/
|
|
577
|
+
return this.trigger('commanderror', new TypeError('Invalid command: ' + name));
|
|
578
|
+
}
|
|
579
|
+
|
|
580
|
+
/**
|
|
581
|
+
* @event command
|
|
582
|
+
* @param {String} name - The name of the called command
|
|
583
|
+
* @param {*} ... - additional params for the command
|
|
584
|
+
*/
|
|
585
|
+
this.trigger.apply(this, ['command'].concat([].slice.call(arguments)));
|
|
586
|
+
|
|
587
|
+
/**
|
|
588
|
+
* @event command-<name>
|
|
589
|
+
* @param {*} ... - additional params for the command
|
|
590
|
+
*/
|
|
591
|
+
this.trigger.apply(this, ['command-' + name].concat([].slice.call(arguments, 1)));
|
|
592
|
+
|
|
593
|
+
return this;
|
|
594
|
+
},
|
|
595
|
+
|
|
596
|
+
/**
|
|
597
|
+
* Replaces the expression and move the cursor at the end.
|
|
598
|
+
* @param {String} newExpression - The new expression to set
|
|
599
|
+
* @param {Number|String} [newPosition=newExpression.length] - The new position to set
|
|
600
|
+
* @returns {calculator}
|
|
601
|
+
* @fires replace after the expression has been replaced
|
|
602
|
+
*/
|
|
603
|
+
replace: function replace(newExpression, newPosition) {
|
|
604
|
+
var oldExpression = expression;
|
|
605
|
+
var oldPosition = position;
|
|
606
|
+
|
|
607
|
+
this.setExpression(newExpression).setPosition(
|
|
608
|
+
'undefined' !== typeof newPosition ? newPosition : expression.length
|
|
609
|
+
);
|
|
610
|
+
|
|
611
|
+
/**
|
|
612
|
+
* @event replace
|
|
613
|
+
* @param {String} expression - the replaced expression
|
|
614
|
+
* @param {Number} position - the replaced position
|
|
615
|
+
*/
|
|
616
|
+
this.trigger('replace', oldExpression, oldPosition);
|
|
617
|
+
|
|
618
|
+
return this;
|
|
619
|
+
},
|
|
620
|
+
|
|
621
|
+
/**
|
|
622
|
+
* Inserts a sub-expression in the current expression and move the cursor.
|
|
623
|
+
* @param {String} subExpression - The sub-expression to insert
|
|
624
|
+
* @returns {calculator}
|
|
625
|
+
* @fires insert after the expression has been inserted
|
|
626
|
+
*/
|
|
627
|
+
insert: function insert(subExpression) {
|
|
628
|
+
var oldExpression = expression;
|
|
629
|
+
var oldPosition = position;
|
|
630
|
+
|
|
631
|
+
this.setExpression(
|
|
632
|
+
expression.substr(0, position) + subExpression + expression.substr(position)
|
|
633
|
+
).setPosition(position + subExpression.length);
|
|
634
|
+
|
|
635
|
+
/**
|
|
636
|
+
* @event insert
|
|
637
|
+
* @param {String} expression - the replaced expression
|
|
638
|
+
* @param {Number} position - the replaced position
|
|
639
|
+
*/
|
|
640
|
+
this.trigger('insert', oldExpression, oldPosition);
|
|
641
|
+
|
|
642
|
+
return this;
|
|
643
|
+
},
|
|
644
|
+
|
|
645
|
+
/**
|
|
646
|
+
* Clears the expression
|
|
647
|
+
* @returns {calculator}
|
|
648
|
+
* @fires clear after the expression has been cleared
|
|
649
|
+
*/
|
|
650
|
+
clear: function clear() {
|
|
651
|
+
this.setExpression('').setPosition(0);
|
|
652
|
+
|
|
653
|
+
/**
|
|
654
|
+
* @event clear
|
|
655
|
+
*/
|
|
656
|
+
this.trigger('clear');
|
|
657
|
+
|
|
658
|
+
return this;
|
|
659
|
+
},
|
|
660
|
+
|
|
661
|
+
/**
|
|
662
|
+
* Evaluates the current expression
|
|
663
|
+
* @returns {mathsExpression|null}
|
|
664
|
+
* @fires evaluate when the expression has been evaluated
|
|
665
|
+
* @fires syntaxerror when the expression contains an error
|
|
666
|
+
*/
|
|
667
|
+
evaluate: function evaluate() {
|
|
668
|
+
var result = null;
|
|
669
|
+
try {
|
|
670
|
+
if (expression.trim()) {
|
|
671
|
+
result = mathsEvaluator(expression, _.mapValues(this.getVariables(), 'result'));
|
|
672
|
+
} else {
|
|
673
|
+
result = mathsEvaluator('0');
|
|
674
|
+
}
|
|
675
|
+
|
|
676
|
+
/**
|
|
677
|
+
* @event evaluate
|
|
678
|
+
* @param {mathsExpression} result
|
|
679
|
+
*/
|
|
680
|
+
this.trigger('evaluate', result);
|
|
681
|
+
} catch (e) {
|
|
682
|
+
/**
|
|
683
|
+
* @event syntaxerror
|
|
684
|
+
* @param {Error} err
|
|
685
|
+
*/
|
|
686
|
+
this.trigger('syntaxerror', e);
|
|
687
|
+
}
|
|
688
|
+
return result;
|
|
689
|
+
},
|
|
690
|
+
|
|
691
|
+
/**
|
|
692
|
+
* Runs a method in all plugins
|
|
693
|
+
*
|
|
694
|
+
* @param {String} method - the method to run
|
|
695
|
+
* @returns {Promise} once that resolve when all plugins are done
|
|
696
|
+
*/
|
|
697
|
+
runPlugins: function runPlugins(method) {
|
|
698
|
+
var execStack = [];
|
|
699
|
+
|
|
700
|
+
_.forEach(plugins, function(plugin) {
|
|
701
|
+
if (_.isFunction(plugin[method])) {
|
|
702
|
+
execStack.push(plugin[method]());
|
|
703
|
+
}
|
|
704
|
+
});
|
|
705
|
+
|
|
706
|
+
return Promise.all(execStack);
|
|
707
|
+
},
|
|
708
|
+
|
|
709
|
+
/**
|
|
710
|
+
* Gets the calculator plugins
|
|
711
|
+
* @returns {Array} the plugins
|
|
712
|
+
*/
|
|
713
|
+
getPlugins: function getPlugins() {
|
|
714
|
+
return _.toArray(plugins);
|
|
715
|
+
},
|
|
716
|
+
|
|
717
|
+
/**
|
|
718
|
+
* Gets a plugin
|
|
719
|
+
* @param {String} name - the plugin name
|
|
720
|
+
* @returns {plugin} the plugin
|
|
721
|
+
*/
|
|
722
|
+
getPlugin: function getPlugin(name) {
|
|
723
|
+
return plugins[name];
|
|
724
|
+
},
|
|
725
|
+
|
|
726
|
+
/**
|
|
727
|
+
* Gets access to the areaBroker
|
|
728
|
+
* @returns {areaBroker}
|
|
729
|
+
*/
|
|
730
|
+
getAreaBroker: function getAreaBroker() {
|
|
731
|
+
return areaBroker;
|
|
732
|
+
},
|
|
733
|
+
|
|
734
|
+
/**
|
|
735
|
+
* Setups the maths evaluator
|
|
736
|
+
* @returns {calculator}
|
|
737
|
+
*/
|
|
738
|
+
setupMathsEvaluator: function setupMathsEvaluator() {
|
|
739
|
+
mathsEvaluator = mathsEvaluatorFactory(this.getConfig().maths);
|
|
740
|
+
return this;
|
|
741
|
+
},
|
|
742
|
+
|
|
743
|
+
/**
|
|
744
|
+
* Gets access to the mathsEvaluator
|
|
745
|
+
* @returns {Function}
|
|
746
|
+
*/
|
|
747
|
+
getMathsEvaluator: function getMathsEvaluator() {
|
|
748
|
+
return mathsEvaluator;
|
|
749
|
+
}
|
|
750
|
+
};
|
|
751
|
+
|
|
752
|
+
/**
|
|
753
|
+
* @typedef {component} calculator
|
|
754
|
+
*/
|
|
755
|
+
var calculator = componentFactory(calculatorApi, defaultConfig)
|
|
756
|
+
.setTemplate(boardTpl)
|
|
757
|
+
.before('init', function() {
|
|
758
|
+
this.setupMathsEvaluator();
|
|
759
|
+
this.setLastResult('0');
|
|
760
|
+
if (this.config.expression) {
|
|
761
|
+
this.setExpression(this.config.expression);
|
|
762
|
+
}
|
|
763
|
+
if (this.config.position) {
|
|
764
|
+
this.setPosition(this.config.position);
|
|
765
|
+
}
|
|
766
|
+
|
|
767
|
+
// built-in commands
|
|
768
|
+
this.setCommand('clear', __('Clear'), __('Clear expression'))
|
|
769
|
+
.setCommand('clearAll', __('Clear All'), __('Clear all data'))
|
|
770
|
+
.setCommand('execute', __('Execute'), __('Compute the expression'))
|
|
771
|
+
.setCommand('var', __('Variable'), __('Use a variable'))
|
|
772
|
+
.setCommand('term', __('Term'), __('Use a term'))
|
|
773
|
+
.on('command-term', this.useTerms.bind(this))
|
|
774
|
+
.on('command-var', this.useVariable.bind(this))
|
|
775
|
+
.on('command-execute', this.evaluate.bind(this))
|
|
776
|
+
.on('command-clearAll', this.deleteVariables.bind(this))
|
|
777
|
+
.on('command-clear command-clearAll', this.clear.bind(this));
|
|
778
|
+
})
|
|
779
|
+
.after('evaluate', function(result) {
|
|
780
|
+
this.setLastResult(result);
|
|
781
|
+
})
|
|
782
|
+
.after('init', function() {
|
|
783
|
+
this.render($container);
|
|
784
|
+
})
|
|
785
|
+
.before('render', function() {
|
|
786
|
+
var self = this;
|
|
787
|
+
var pluginsConfig = this.getConfig().plugins || {};
|
|
788
|
+
var $element = this.getElement();
|
|
789
|
+
|
|
790
|
+
areaBroker = areaBrokerFactory($element, {
|
|
791
|
+
screen: $element.find('.screen'), // where the expressions and their result are rendered
|
|
792
|
+
input: $element.find('.input'), // where the expressions are input
|
|
793
|
+
keyboard: $element.find('.keyboard') // the keyboard area that should provide a way to interact with the calculator
|
|
794
|
+
});
|
|
795
|
+
|
|
796
|
+
_.forEach(pluginFactories, function(pluginFactory) {
|
|
797
|
+
var plugin = pluginFactory(self, self.getAreaBroker());
|
|
798
|
+
var pluginName = plugin.getName();
|
|
799
|
+
if (pluginsConfig[pluginName]) {
|
|
800
|
+
plugin.setConfig(pluginsConfig[pluginName]);
|
|
801
|
+
}
|
|
802
|
+
plugins[plugin.getName()] = plugin;
|
|
803
|
+
});
|
|
804
|
+
|
|
805
|
+
return this.runPlugins('install')
|
|
806
|
+
.then(function() {
|
|
807
|
+
return self.runPlugins('init');
|
|
808
|
+
})
|
|
809
|
+
.then(function() {
|
|
810
|
+
return self.runPlugins('render');
|
|
811
|
+
})
|
|
812
|
+
.then(function() {
|
|
813
|
+
/**
|
|
814
|
+
* @event ready
|
|
815
|
+
*/
|
|
816
|
+
self.trigger('ready');
|
|
817
|
+
})
|
|
818
|
+
.catch(function(err) {
|
|
819
|
+
self.trigger('error', err);
|
|
820
|
+
});
|
|
821
|
+
})
|
|
822
|
+
.on('destroy', function() {
|
|
823
|
+
var self = this;
|
|
824
|
+
return this.runPlugins('destroy').then(function() {
|
|
825
|
+
self.off('.' + ns);
|
|
826
|
+
tokenizer = null;
|
|
827
|
+
areaBroker = null;
|
|
828
|
+
mathsEvaluator = null;
|
|
829
|
+
variables.clear();
|
|
830
|
+
plugins = {};
|
|
831
|
+
});
|
|
832
|
+
});
|
|
833
|
+
|
|
834
|
+
_.defer(function() {
|
|
835
|
+
calculator.init(config);
|
|
836
|
+
});
|
|
837
|
+
|
|
838
|
+
return calculator;
|
|
839
|
+
}
|
|
840
|
+
|
|
841
|
+
export default calculatorBoardFactory;
|