@oat-sa/tao-core-ui 1.60.0 → 1.60.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 +17 -17
- package/dist/actionbar.js +105 -105
- package/dist/adder.js +109 -109
- package/dist/animable/absorbable/absorbable.js +42 -42
- 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 +36 -36
- 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 +400 -400
- package/dist/autoscroll.js +22 -22
- package/dist/badge/badge.js +48 -48
- 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 +70 -70
- 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 +104 -104
- package/dist/button.js +102 -102
- 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 +47 -47
- package/dist/ckeditor/ckConfigurator.js +48 -48
- 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 +111 -111
- 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 +59 -59
- package/dist/component.js +153 -153
- 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 +113 -113
- package/dist/dashboard/css/dashboard.css +7 -7
- package/dist/dashboard/css/dashboard.css.map +1 -1
- package/dist/dashboard.js +75 -75
- package/dist/datalist/css/datalist.css +7 -7
- package/dist/datalist/css/datalist.css.map +1 -1
- package/dist/datalist.js +160 -160
- 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 +374 -374
- package/dist/dateRange/css/dateRange.css +7 -7
- package/dist/dateRange/css/dateRange.css.map +1 -1
- package/dist/dateRange/dateRange.js +110 -110
- package/dist/datetime/css/picker.css +7 -7
- package/dist/datetime/css/picker.css.map +1 -1
- package/dist/datetime/picker.js +174 -174
- package/dist/deleter.js +92 -92
- package/dist/destination/css/selector.css +7 -7
- package/dist/destination/css/selector.css.map +1 -1
- package/dist/destination/selector.js +65 -65
- package/dist/dialog/alert.js +26 -26
- package/dist/dialog/confirm.js +27 -27
- package/dist/dialog/confirmDelete.js +44 -44
- package/dist/dialog.js +156 -156
- 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 +43 -43
- package/dist/documentViewer/providers/pdfViewer/pdfjs/areaBroker.js +25 -25
- package/dist/documentViewer/providers/pdfViewer/pdfjs/findBar.js +133 -133
- package/dist/documentViewer/providers/pdfViewer/pdfjs/pageView.js +102 -102
- package/dist/documentViewer/providers/pdfViewer/pdfjs/pagesManager.js +52 -52
- package/dist/documentViewer/providers/pdfViewer/pdfjs/searchEngine.js +125 -125
- package/dist/documentViewer/providers/pdfViewer/pdfjs/textManager.js +67 -67
- package/dist/documentViewer/providers/pdfViewer/pdfjs/viewer.js +94 -94
- package/dist/documentViewer/providers/pdfViewer/pdfjs/wrapper.js +111 -111
- package/dist/documentViewer/providers/pdfViewer.js +42 -42
- package/dist/documentViewer/viewerFactory.js +71 -71
- package/dist/documentViewer.js +99 -99
- package/dist/dropdown/css/dropdown.css +7 -7
- package/dist/dropdown/css/dropdown.css.map +1 -1
- package/dist/dropdown.js +97 -97
- 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 +116 -116
- package/dist/feedback.js +97 -97
- package/dist/figure/FigureStateActive.js +117 -117
- package/dist/filesender.js +26 -26
- package/dist/filter.js +47 -47
- 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 +112 -112
- package/dist/form/form.js +245 -245
- 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 +65 -65
- package/dist/form/validator/validator.js +87 -87
- 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 +75 -75
- package/dist/form/widget/providers/comboBox.js +59 -59
- package/dist/form/widget/providers/default.js +35 -35
- package/dist/form/widget/providers/hidden.js +50 -50
- package/dist/form/widget/providers/hiddenBox.js +71 -71
- package/dist/form/widget/providers/radioBox.js +70 -70
- package/dist/form/widget/providers/textArea.js +48 -48
- package/dist/form/widget/providers/textBox.js +34 -34
- package/dist/form/widget/widget.js +154 -154
- 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 +86 -86
- 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 +51 -51
- package/dist/generis/widget/checkBox/checkBox.js +52 -52
- package/dist/generis/widget/comboBox/comboBox.js +45 -45
- 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 +53 -53
- package/dist/generis/widget/loader.js +20 -20
- package/dist/generis/widget/textBox/textBox.js +40 -40
- package/dist/generis/widget/widget.js +60 -60
- package/dist/groupedComboBox.js +49 -49
- package/dist/groupvalidator.js +19 -19
- package/dist/hider.js +41 -41
- package/dist/highlighter.js +262 -262
- 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 +115 -115
- 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 +97 -97
- 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 +48 -48
- package/dist/lock.js +125 -125
- package/dist/login/login.js +100 -100
- package/dist/maths/calculator/basicCalculator.js +63 -63
- package/dist/maths/calculator/calculatorComponent.js +29 -29
- package/dist/maths/calculator/core/areaBroker.js +25 -25
- package/dist/maths/calculator/core/board.js +313 -313
- package/dist/maths/calculator/core/expression.js +111 -111
- package/dist/maths/calculator/core/labels.js +29 -29
- 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 +59 -59
- 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 +61 -61
- 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 +60 -60
- package/dist/maths/calculator/pluginsLoader.js +21 -21
- package/dist/maths/calculator/scientificCalculator.js +91 -91
- package/dist/mediaEditor/mediaEditorComponent.js +64 -64
- package/dist/mediaEditor/plugins/mediaAlignment/helper.js +16 -16
- package/dist/mediaEditor/plugins/mediaAlignment/mediaAlignmentComponent.js +60 -60
- 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 +153 -153
- package/dist/mediaEditor/plugins/mediaDimension/style.css +141 -141
- package/dist/mediaplayer/css/player.css +31 -7
- package/dist/mediaplayer/css/player.css.map +1 -1
- package/dist/mediaplayer/players/html5.js +65 -65
- package/dist/mediaplayer/players/youtube.js +52 -52
- 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 +35 -35
- package/dist/mediaplayer.js +460 -460
- package/dist/mediasizer.js +135 -135
- package/dist/modal.js +87 -87
- package/dist/movableComponent.js +35 -35
- package/dist/pageSizeSelector.js +44 -44
- 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 +37 -37
- package/dist/pagination/providers/simple.js +35 -35
- package/dist/pagination.js +45 -45
- package/dist/previewer.js +67 -67
- package/dist/progressbar.js +58 -58
- package/dist/report.js +86 -86
- package/dist/resource/css/selector.css +7 -7
- package/dist/resource/css/selector.css.map +1 -1
- package/dist/resource/filters.js +73 -73
- package/dist/resource/list.js +66 -66
- package/dist/resource/selectable.js +92 -92
- package/dist/resource/selector.js +195 -195
- package/dist/resource/tree.js +104 -104
- package/dist/resourcemgr/css/resourcemgr.css +7 -7
- package/dist/resourcemgr/css/resourcemgr.css.map +1 -1
- package/dist/resourcemgr/fileBrowser.js +88 -88
- package/dist/resourcemgr/fileSelector.js +58 -58
- package/dist/resourcemgr/util/updatePermissions.js +4 -4
- package/dist/resourcemgr.js +62 -62
- package/dist/scroller.js +26 -26
- package/dist/searchModal/advancedSearch.js +130 -130
- 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 +96 -96
- 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 +75 -75
- 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 +217 -217
- package/dist/taskQueue/css/taskQueue.css +7 -7
- package/dist/taskQueue/css/taskQueue.css.map +1 -1
- package/dist/taskQueue/status.js +72 -72
- package/dist/taskQueue/table.js +67 -67
- package/dist/taskQueue/taskQueue.js +18 -18
- package/dist/taskQueue/taskQueueModel.js +86 -86
- 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 +54 -54
- package/dist/taskQueueButton/treeButton.js +56 -56
- package/dist/themeLoader.js +75 -75
- package/dist/themes.js +84 -84
- package/dist/toggler.js +57 -57
- package/dist/tooltip.js +54 -54
- 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 +75 -75
- package/dist/uploader.js +158 -158
- package/dist/validator/validators.js +48 -48
- package/dist/validator.js +24 -24
- 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 +107 -107
- package/scss/basic.scss +16 -16
- package/scss/ckeditor/skins/tao/scss/inc/_ck-icons.scss +59 -59
- package/scss/ckeditor/skins/tao/scss/inc/_tao.scss +59 -59
- package/scss/font/tao/tao.svg +234 -234
- 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 +88 -88
- package/scss/inc/_feedback.scss +150 -150
- 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/_grid.scss +5 -3
- 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 +226 -226
- package/scss/inc/fonts/_tao-icon-def.scss +12 -12
- package/scss/inc/fonts/_tao-icon-vars.scss +240 -240
- 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 +1029 -1029
- 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 +736 -736
- 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 +297 -297
- 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 +184 -184
- 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 +146 -146
- 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 +222 -222
- 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 +554 -554
- package/src/feedback/feedback.tpl +7 -7
- package/src/feedback.js +295 -295
- package/src/figure/FigureStateActive.js +174 -174
- package/src/filesender.js +114 -114
- package/src/filter/template.tpl +5 -5
- package/src/filter.js +135 -135
- 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 +53 -53
- package/src/formValidator/formValidator.js +253 -253
- package/src/formValidator/highlighters/highlighter.js +102 -102
- package/src/formValidator/highlighters/message.js +70 -70
- 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 +67 -67
- 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 +132 -132
- 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 +65 -65
- 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 +1166 -1166
- 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 +319 -319
- package/src/inplacer.js +316 -316
- 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 +282 -282
- package/src/keyNavigation/navigator.js +543 -543
- 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 +251 -251
- 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 +395 -395
- package/src/login/login.js +322 -322
- 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 +191 -191
- 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 +62 -62
- 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 +189 -189
- 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 +31 -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 -540
- 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 +107 -107
- 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/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 +400 -400
- 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 +348 -348
- 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 +601 -601
- 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 +177 -177
- package/src/searchModal/scss/searchModal.scss +375 -375
- 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 +25 -25
- package/src/searchModal/tpl/list-checkbox-criterion.tpl +12 -12
- package/src/searchModal/tpl/list-select-criterion.tpl +6 -6
- package/src/searchModal/tpl/text-criterion.tpl +6 -6
- package/src/searchModal.js +496 -496
- 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 +218 -218
- 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 +109 -109
- 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 +220 -220
- package/src/validator.js +264 -264
- 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
package/src/searchModal.js
CHANGED
|
@@ -1,496 +1,496 @@
|
|
|
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) 2021 (original work) Open Assessment Technologies SA ;
|
|
17
|
-
*/
|
|
18
|
-
|
|
19
|
-
import $ from 'jquery';
|
|
20
|
-
import _ from 'lodash';
|
|
21
|
-
import __ from 'i18n';
|
|
22
|
-
import context from 'context';
|
|
23
|
-
import layoutTpl from 'ui/searchModal/tpl/layout';
|
|
24
|
-
import infoMessageTpl from 'ui/searchModal/tpl/info-message';
|
|
25
|
-
import 'ui/searchModal/css/searchModal.css';
|
|
26
|
-
import component from 'ui/component';
|
|
27
|
-
import 'ui/modal';
|
|
28
|
-
import 'ui/datatable';
|
|
29
|
-
import store from 'core/store';
|
|
30
|
-
import resourceSelectorFactory from 'ui/resource/selector';
|
|
31
|
-
import advancedSearchFactory from 'ui/searchModal/advancedSearch';
|
|
32
|
-
import request from 'core/dataProvider/request';
|
|
33
|
-
import urlUtil from 'util/url';
|
|
34
|
-
import 'select2';
|
|
35
|
-
import shortcutRegistry from 'util/shortcut/registry';
|
|
36
|
-
|
|
37
|
-
/**
|
|
38
|
-
* Creates a searchModal instance
|
|
39
|
-
*
|
|
40
|
-
* @param {object} config
|
|
41
|
-
* @param {object} config.renderTo - DOM element where component will be rendered to
|
|
42
|
-
* @param {string} config.criterias - Search criteria to be set on component creation
|
|
43
|
-
* @param {boolean} config.searchOnInit - if init search must be triggered or not (stored results are used instead)
|
|
44
|
-
* @param {string} config.url - search endpoint to be set on datatable
|
|
45
|
-
* @param {string} config.rootClassUri - Uri for the root class of current context, required to init the class filter
|
|
46
|
-
* @param {bool} config.hideResourceSelector - if resourceSelector must be hidden
|
|
47
|
-
* @param {string} config.placeholder - placeholder for input in template
|
|
48
|
-
* @returns {searchModal}
|
|
49
|
-
*/
|
|
50
|
-
export default function searchModalFactory(config) {
|
|
51
|
-
const defaults = {
|
|
52
|
-
renderTo: 'body',
|
|
53
|
-
criterias: {},
|
|
54
|
-
searchOnInit: true,
|
|
55
|
-
maxListSize: 5
|
|
56
|
-
};
|
|
57
|
-
// Private properties to be easily accessible by instance methods
|
|
58
|
-
let $container = null;
|
|
59
|
-
let $searchInput = null;
|
|
60
|
-
let $searchButton = null;
|
|
61
|
-
let $clearButton = null;
|
|
62
|
-
let running = false;
|
|
63
|
-
let searchStore = null;
|
|
64
|
-
let resourceSelector = null;
|
|
65
|
-
let $classFilterContainer = null;
|
|
66
|
-
let $classFilterInput = null;
|
|
67
|
-
let $classTreeContainer = null;
|
|
68
|
-
let advancedSearch = null;
|
|
69
|
-
|
|
70
|
-
// resorce selector
|
|
71
|
-
const isResourceSelector = !config.hideResourceSelector;
|
|
72
|
-
const rootClassUri = config.rootClassUri;
|
|
73
|
-
|
|
74
|
-
/**
|
|
75
|
-
* Creates search modal, inits template selectors, inits search store, and once is created triggers initial search
|
|
76
|
-
* rootClassUri is sent to advancedSearch factory for disabling in whitelisted sections
|
|
77
|
-
*/
|
|
78
|
-
function renderModal() {
|
|
79
|
-
const promises = [];
|
|
80
|
-
initModal();
|
|
81
|
-
initUiSelectors();
|
|
82
|
-
advancedSearch = advancedSearchFactory({
|
|
83
|
-
renderTo: $('.filters-container', $container),
|
|
84
|
-
advancedCriteria: instance.config.criterias.advancedCriteria,
|
|
85
|
-
rootClassUri: rootClassUri
|
|
86
|
-
});
|
|
87
|
-
promises.push(initClassFilter());
|
|
88
|
-
promises.push(initSearchStore());
|
|
89
|
-
Promise.all(promises)
|
|
90
|
-
.then(() => {
|
|
91
|
-
instance.trigger('ready');
|
|
92
|
-
$searchButton.trigger('click');
|
|
93
|
-
})
|
|
94
|
-
.catch(e => instance.trigger('error', e));
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
/**
|
|
98
|
-
* Removes search modal
|
|
99
|
-
*/
|
|
100
|
-
function destroyModal() {
|
|
101
|
-
$container.removeClass('modal').modal('destroy');
|
|
102
|
-
$('.modal-bg').remove();
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
// Creates new component
|
|
106
|
-
const instance = component({}, defaults)
|
|
107
|
-
.setTemplate(layoutTpl)
|
|
108
|
-
.on('render', renderModal)
|
|
109
|
-
.on('destroy', destroyModal);
|
|
110
|
-
|
|
111
|
-
/**
|
|
112
|
-
* Creates search modal
|
|
113
|
-
*/
|
|
114
|
-
function initModal() {
|
|
115
|
-
$container = instance.getElement();
|
|
116
|
-
$container
|
|
117
|
-
.addClass('modal')
|
|
118
|
-
.on('closed.modal', () => instance.destroy())
|
|
119
|
-
.modal({
|
|
120
|
-
disableEscape: false,
|
|
121
|
-
width: $(window).width(),
|
|
122
|
-
modalCloseClass: 'modal-close-left'
|
|
123
|
-
})
|
|
124
|
-
.focus();
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
/**
|
|
128
|
-
* Inits class filter selector
|
|
129
|
-
*/
|
|
130
|
-
function initClassFilter() {
|
|
131
|
-
return new Promise(resolve => {
|
|
132
|
-
if (!isResourceSelector) {
|
|
133
|
-
$classFilterContainer.hide();
|
|
134
|
-
return resolve();
|
|
135
|
-
}
|
|
136
|
-
const initialClassUri =
|
|
137
|
-
instance.config.criterias && instance.config.criterias.class
|
|
138
|
-
? instance.config.criterias.class
|
|
139
|
-
: rootClassUri;
|
|
140
|
-
resourceSelector = resourceSelectorFactory($('.class-tree', $container), {
|
|
141
|
-
//set up the inner resource selector
|
|
142
|
-
selectionMode: 'single',
|
|
143
|
-
selectClass: true,
|
|
144
|
-
classUri: rootClassUri,
|
|
145
|
-
showContext: false,
|
|
146
|
-
showSelection: false
|
|
147
|
-
});
|
|
148
|
-
|
|
149
|
-
// when a class query is triggered, update selector options with received resources
|
|
150
|
-
resourceSelector.on('query', params => {
|
|
151
|
-
const classOnlyParams = { ...params, classOnly: true };
|
|
152
|
-
const route = urlUtil.route('getAll', 'RestResource', 'tao');
|
|
153
|
-
request(route, classOnlyParams)
|
|
154
|
-
.then(response => {
|
|
155
|
-
if (
|
|
156
|
-
response.permissions &&
|
|
157
|
-
response.permissions.data &&
|
|
158
|
-
response.permissions.supportedRights &&
|
|
159
|
-
response.permissions.supportedRights.length > 0
|
|
160
|
-
) {
|
|
161
|
-
manageClassTreePermissions(response);
|
|
162
|
-
}
|
|
163
|
-
resourceSelector.update(response.resources, classOnlyParams);
|
|
164
|
-
})
|
|
165
|
-
.catch(e => instance.trigger('error', e));
|
|
166
|
-
});
|
|
167
|
-
|
|
168
|
-
/*
|
|
169
|
-
* the first time selector opions are updated the root class is selected. Promise is
|
|
170
|
-
* resolved so init process continues only when class input value has been set
|
|
171
|
-
*/
|
|
172
|
-
resourceSelector.on('update', () => {
|
|
173
|
-
resourceSelector.off('update');
|
|
174
|
-
|
|
175
|
-
resourceSelector.select(initialClassUri);
|
|
176
|
-
resolve();
|
|
177
|
-
});
|
|
178
|
-
|
|
179
|
-
// then new class is selected, set its label into class filter input and hide filter container, then request class properties
|
|
180
|
-
resourceSelector.on('change', selectedValue => {
|
|
181
|
-
/*
|
|
182
|
-
* on searchModal init we set manually the selector to the provided config.rootClassUri. When a selector
|
|
183
|
-
* is set manually Selector component execs @clearSelection which triggers a change event
|
|
184
|
-
* with an empty object as param. We catch this undesired behaviour here
|
|
185
|
-
*/
|
|
186
|
-
if (_.isEmpty(selectedValue)) {
|
|
187
|
-
return;
|
|
188
|
-
}
|
|
189
|
-
const classUri = _.map(selectedValue, 'classUri')[0];
|
|
190
|
-
const label = _.map(selectedValue, 'label')[0];
|
|
191
|
-
const uri = _.map(selectedValue, 'uri')[0];
|
|
192
|
-
const route = urlUtil.route('getWithMapping', 'ClassMetadata', 'tao', {
|
|
193
|
-
classUri,
|
|
194
|
-
maxListSize: instance.config.maxListSize
|
|
195
|
-
});
|
|
196
|
-
$classFilterInput.html(label);
|
|
197
|
-
$classFilterInput.data('uri', uri);
|
|
198
|
-
$classTreeContainer.hide();
|
|
199
|
-
advancedSearch
|
|
200
|
-
.updateCriteria(route)
|
|
201
|
-
.then(() => instance.trigger('criteriaListUpdated'))
|
|
202
|
-
.catch(e => instance.trigger('error', e));
|
|
203
|
-
});
|
|
204
|
-
|
|
205
|
-
setResourceSelectorUIBehaviour();
|
|
206
|
-
});
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
/**
|
|
210
|
-
* Loops through each class in received class tree and sets access mode to 'denied' on private classes
|
|
211
|
-
* so are disabled on class tree
|
|
212
|
-
* @param {object} classTree - class tree received by server, containing resources (classes) and permissions
|
|
213
|
-
*/
|
|
214
|
-
function manageClassTreePermissions(classTree) {
|
|
215
|
-
const disableBlockedClasses = function (resources) {
|
|
216
|
-
_.forEach(resources, (resource, index, array) => {
|
|
217
|
-
if (
|
|
218
|
-
classTree.permissions.data[resource.uri] &&
|
|
219
|
-
classTree.permissions.data[resource.uri].find(permission => permission === 'READ')
|
|
220
|
-
) {
|
|
221
|
-
if (resource.children) {
|
|
222
|
-
disableBlockedClasses(resource.children);
|
|
223
|
-
}
|
|
224
|
-
} else {
|
|
225
|
-
array[index].accessMode = 'denied';
|
|
226
|
-
}
|
|
227
|
-
});
|
|
228
|
-
};
|
|
229
|
-
disableBlockedClasses(classTree.resources);
|
|
230
|
-
}
|
|
231
|
-
|
|
232
|
-
/**
|
|
233
|
-
* Inits template selectors, buttons behaviour, scroll animation,
|
|
234
|
-
* and sets initial search query on search input
|
|
235
|
-
*/
|
|
236
|
-
function initUiSelectors() {
|
|
237
|
-
$searchButton = $('.btn-search', $container);
|
|
238
|
-
$clearButton = $('.btn-clear', $container);
|
|
239
|
-
$searchInput = $('.generic-search-input', $container);
|
|
240
|
-
$classFilterInput = $('.class-filter', $container);
|
|
241
|
-
$classTreeContainer = $('.class-tree', $container);
|
|
242
|
-
$classFilterContainer = $('.class-filter-container', $container);
|
|
243
|
-
|
|
244
|
-
$searchButton.on('click', search);
|
|
245
|
-
$clearButton.on('click', clear);
|
|
246
|
-
const shortcuts = shortcutRegistry($searchInput);
|
|
247
|
-
shortcuts.clear().add('enter', search);
|
|
248
|
-
$searchInput.val(
|
|
249
|
-
instance.config.criterias && instance.config.criterias.search ? instance.config.criterias.search : ''
|
|
250
|
-
);
|
|
251
|
-
}
|
|
252
|
-
|
|
253
|
-
/**
|
|
254
|
-
* Sets required listeners to properly manage resourceSelector visualization
|
|
255
|
-
*/
|
|
256
|
-
function setResourceSelectorUIBehaviour() {
|
|
257
|
-
$container.on('mousedown', () => {
|
|
258
|
-
$classTreeContainer.hide();
|
|
259
|
-
});
|
|
260
|
-
|
|
261
|
-
/**
|
|
262
|
-
* Pressing space, enter, esc, backspace
|
|
263
|
-
* on class filter input will toggle resource selector
|
|
264
|
-
*/
|
|
265
|
-
const shortcuts = shortcutRegistry($classFilterInput);
|
|
266
|
-
shortcuts.add('enter', () => $classTreeContainer.show());
|
|
267
|
-
shortcuts.add('space', () => $classTreeContainer.show());
|
|
268
|
-
shortcuts.add('backspace', () => $classTreeContainer.hide());
|
|
269
|
-
shortcuts.add('escape', () => $classTreeContainer.hide(), { propagate: false });
|
|
270
|
-
|
|
271
|
-
/**
|
|
272
|
-
* clicking on class filter container will toggle resource selector
|
|
273
|
-
*/
|
|
274
|
-
$classFilterContainer.on('click', e => {
|
|
275
|
-
$classTreeContainer.toggle();
|
|
276
|
-
});
|
|
277
|
-
|
|
278
|
-
/**
|
|
279
|
-
* clicking on class filter container will
|
|
280
|
-
* stopPropagation to prevent be closed
|
|
281
|
-
* by searchModal.mouseDown listener
|
|
282
|
-
*/
|
|
283
|
-
$classFilterContainer.on('mousedown', e => {
|
|
284
|
-
e.stopPropagation();
|
|
285
|
-
});
|
|
286
|
-
|
|
287
|
-
// clicking on resource selector will stopPropagation to prevent be closed by searchModal.mouseDown listener
|
|
288
|
-
$classTreeContainer.on('mousedown', e => {
|
|
289
|
-
e.stopPropagation();
|
|
290
|
-
});
|
|
291
|
-
}
|
|
292
|
-
|
|
293
|
-
/**
|
|
294
|
-
* Loads search store so it is accessible in the component
|
|
295
|
-
* @returns {Promise}
|
|
296
|
-
*/
|
|
297
|
-
function initSearchStore() {
|
|
298
|
-
return store('search')
|
|
299
|
-
.then(function (store) {
|
|
300
|
-
searchStore = store;
|
|
301
|
-
})
|
|
302
|
-
.catch(e => instance.trigger('error', e));
|
|
303
|
-
}
|
|
304
|
-
|
|
305
|
-
/**
|
|
306
|
-
* Request search results and manages its results
|
|
307
|
-
*/
|
|
308
|
-
function search() {
|
|
309
|
-
const query = buildComplexQuery();
|
|
310
|
-
const classFilterUri = isResourceSelector ? $classFilterInput.data('uri').trim() : rootClassUri;
|
|
311
|
-
|
|
312
|
-
//throttle and control to prevent sending too many requests
|
|
313
|
-
const searchHandler = _.throttle(query => {
|
|
314
|
-
if (running === false) {
|
|
315
|
-
running = true;
|
|
316
|
-
$.ajax({
|
|
317
|
-
url: instance.config.url,
|
|
318
|
-
type: 'POST',
|
|
319
|
-
data: { query: query, parentNode: classFilterUri, structure: context.shownStructure },
|
|
320
|
-
dataType: 'json'
|
|
321
|
-
})
|
|
322
|
-
.done(data => {
|
|
323
|
-
appendDefaultDatasetToDatatable(data.data)
|
|
324
|
-
.then(() => buildSearchResultsDatatable(data.data))
|
|
325
|
-
.catch(e => instance.trigger('error', e));
|
|
326
|
-
})
|
|
327
|
-
.always(() => (running = false));
|
|
328
|
-
}
|
|
329
|
-
}, 100);
|
|
330
|
-
|
|
331
|
-
searchHandler(query);
|
|
332
|
-
}
|
|
333
|
-
|
|
334
|
-
/**
|
|
335
|
-
* build final complex query appending every filter
|
|
336
|
-
*/
|
|
337
|
-
function buildComplexQuery() {
|
|
338
|
-
const $searchInputValue = $searchInput.val().trim();
|
|
339
|
-
|
|
340
|
-
let query = $searchInputValue;
|
|
341
|
-
query += advancedSearch.getAdvancedCriteriaQuery(query !== '');
|
|
342
|
-
|
|
343
|
-
return query;
|
|
344
|
-
}
|
|
345
|
-
|
|
346
|
-
/*
|
|
347
|
-
* If search on init is not required, extends data with stored dataset
|
|
348
|
-
* @param {object} data - search configuration including model and endpoint for datatable
|
|
349
|
-
* @returns {Promise}
|
|
350
|
-
*/
|
|
351
|
-
function appendDefaultDatasetToDatatable(data) {
|
|
352
|
-
return new Promise(function (resolve, reject) {
|
|
353
|
-
// If no search on init, get dataset from searchStore
|
|
354
|
-
if (instance.config.searchOnInit === false) {
|
|
355
|
-
searchStore
|
|
356
|
-
.getItem('results')
|
|
357
|
-
.then(storedSearchResults => {
|
|
358
|
-
instance.config.searchOnInit = true;
|
|
359
|
-
data.storedSearchResults = storedSearchResults;
|
|
360
|
-
resolve();
|
|
361
|
-
})
|
|
362
|
-
.catch(e => {
|
|
363
|
-
instance.trigger('error', e);
|
|
364
|
-
reject(new Error('Error appending default dataset from searchStore to datatable'));
|
|
365
|
-
});
|
|
366
|
-
} else {
|
|
367
|
-
resolve();
|
|
368
|
-
}
|
|
369
|
-
});
|
|
370
|
-
}
|
|
371
|
-
|
|
372
|
-
/**
|
|
373
|
-
* Creates a datatable with search results
|
|
374
|
-
* @param {object} data - search configuration including model and endpoint for datatable
|
|
375
|
-
*/
|
|
376
|
-
function buildSearchResultsDatatable(data) {
|
|
377
|
-
//update the section container
|
|
378
|
-
const $tableContainer = $('<div class="flex-container-full"></div>');
|
|
379
|
-
const section = $('.content-container', $container);
|
|
380
|
-
section.empty();
|
|
381
|
-
section.append($tableContainer);
|
|
382
|
-
$tableContainer.on('load.datatable', searchResultsLoaded);
|
|
383
|
-
|
|
384
|
-
//create datatable
|
|
385
|
-
$tableContainer.datatable(
|
|
386
|
-
{
|
|
387
|
-
url: data.url,
|
|
388
|
-
model: _.values(data.model),
|
|
389
|
-
labels: {
|
|
390
|
-
actions: ''
|
|
391
|
-
},
|
|
392
|
-
actions: [
|
|
393
|
-
{
|
|
394
|
-
id: 'go-to-item',
|
|
395
|
-
label: __('View'),
|
|
396
|
-
action: function openResource(uri, data) {
|
|
397
|
-
instance.trigger('refresh', uri, data);
|
|
398
|
-
instance.destroy();
|
|
399
|
-
}
|
|
400
|
-
}
|
|
401
|
-
],
|
|
402
|
-
params: {
|
|
403
|
-
params: data.params,
|
|
404
|
-
filters: data.filters,
|
|
405
|
-
rows: 20
|
|
406
|
-
}
|
|
407
|
-
},
|
|
408
|
-
data.storedSearchResults
|
|
409
|
-
);
|
|
410
|
-
}
|
|
411
|
-
|
|
412
|
-
/**
|
|
413
|
-
* Triggered on load.datatable event, it updates searchStore and manages possible exceptions
|
|
414
|
-
* @param {object} e - load.datatable event
|
|
415
|
-
* @param {object} dataset - datatable dataset
|
|
416
|
-
*/
|
|
417
|
-
function searchResultsLoaded(e, dataset) {
|
|
418
|
-
if (dataset.records === 0) {
|
|
419
|
-
replaceSearchResultsDatatableWithMessage('no-matches');
|
|
420
|
-
}
|
|
421
|
-
instance.trigger(`datatable-loaded`);
|
|
422
|
-
updateSearchStore({
|
|
423
|
-
action: 'update',
|
|
424
|
-
dataset,
|
|
425
|
-
context: context.shownStructure,
|
|
426
|
-
criterias: {
|
|
427
|
-
search: $searchInput.val(),
|
|
428
|
-
class: isResourceSelector ? _.map(resourceSelector.getSelection(), 'uri')[0] : rootClassUri,
|
|
429
|
-
advancedCriteria: advancedSearch.getState()
|
|
430
|
-
}
|
|
431
|
-
});
|
|
432
|
-
}
|
|
433
|
-
|
|
434
|
-
/**
|
|
435
|
-
* Updates searchStore. If action is 'clear', searchStore is claread. If not, received
|
|
436
|
-
* data is assigned to searchStore. Once all actions have been done,
|
|
437
|
-
* store-updated event is triggered
|
|
438
|
-
* @param {object} data - data to store
|
|
439
|
-
*/
|
|
440
|
-
function updateSearchStore(data) {
|
|
441
|
-
const promises = [];
|
|
442
|
-
if (data.action === 'clear') {
|
|
443
|
-
promises.push(searchStore.clear());
|
|
444
|
-
} else if (data.action === 'update') {
|
|
445
|
-
promises.push(searchStore.setItem('criterias', data.criterias));
|
|
446
|
-
promises.push(searchStore.setItem('context', data.context));
|
|
447
|
-
promises.push(
|
|
448
|
-
data.dataset.records === 0
|
|
449
|
-
? searchStore.removeItem('results')
|
|
450
|
-
: searchStore.setItem('results', data.dataset)
|
|
451
|
-
);
|
|
452
|
-
}
|
|
453
|
-
|
|
454
|
-
Promise.all(promises)
|
|
455
|
-
.then(() => instance.trigger(`store-updated`))
|
|
456
|
-
.catch(e => instance.trigger('error', e));
|
|
457
|
-
}
|
|
458
|
-
|
|
459
|
-
/**
|
|
460
|
-
* Clear search input, criteria and results from both, view and store.
|
|
461
|
-
* Also sets every criterion on criteriaState to unredered and
|
|
462
|
-
* undefined value
|
|
463
|
-
*/
|
|
464
|
-
function clear() {
|
|
465
|
-
$searchInput.val('');
|
|
466
|
-
advancedSearch.clear();
|
|
467
|
-
isResourceSelector && resourceSelector.select(rootClassUri);
|
|
468
|
-
replaceSearchResultsDatatableWithMessage('no-query');
|
|
469
|
-
updateSearchStore({ action: 'clear' });
|
|
470
|
-
}
|
|
471
|
-
|
|
472
|
-
/**
|
|
473
|
-
* Removes datatable container and displays a message instead
|
|
474
|
-
* @param {string} reason - reason why datatable is not rendered, to display appropiate message
|
|
475
|
-
*/
|
|
476
|
-
function replaceSearchResultsDatatableWithMessage(reason) {
|
|
477
|
-
const section = $('.content-container', $container);
|
|
478
|
-
section.empty();
|
|
479
|
-
let message = '';
|
|
480
|
-
let icon = '';
|
|
481
|
-
|
|
482
|
-
if (reason === 'no-query') {
|
|
483
|
-
message = __('Please define your search in the search panel.');
|
|
484
|
-
icon = 'icon-find';
|
|
485
|
-
} else if (reason === 'no-matches') {
|
|
486
|
-
message = __('No item found. Please try other search criteria.');
|
|
487
|
-
icon = 'icon-info';
|
|
488
|
-
}
|
|
489
|
-
|
|
490
|
-
const infoMessage = infoMessageTpl({ message, icon });
|
|
491
|
-
section.append(infoMessage);
|
|
492
|
-
}
|
|
493
|
-
|
|
494
|
-
// return initialized instance of searchModal
|
|
495
|
-
return instance.init(config);
|
|
496
|
-
}
|
|
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) 2021 (original work) Open Assessment Technologies SA ;
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
import $ from 'jquery';
|
|
20
|
+
import _ from 'lodash';
|
|
21
|
+
import __ from 'i18n';
|
|
22
|
+
import context from 'context';
|
|
23
|
+
import layoutTpl from 'ui/searchModal/tpl/layout';
|
|
24
|
+
import infoMessageTpl from 'ui/searchModal/tpl/info-message';
|
|
25
|
+
import 'ui/searchModal/css/searchModal.css';
|
|
26
|
+
import component from 'ui/component';
|
|
27
|
+
import 'ui/modal';
|
|
28
|
+
import 'ui/datatable';
|
|
29
|
+
import store from 'core/store';
|
|
30
|
+
import resourceSelectorFactory from 'ui/resource/selector';
|
|
31
|
+
import advancedSearchFactory from 'ui/searchModal/advancedSearch';
|
|
32
|
+
import request from 'core/dataProvider/request';
|
|
33
|
+
import urlUtil from 'util/url';
|
|
34
|
+
import 'select2';
|
|
35
|
+
import shortcutRegistry from 'util/shortcut/registry';
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Creates a searchModal instance
|
|
39
|
+
*
|
|
40
|
+
* @param {object} config
|
|
41
|
+
* @param {object} config.renderTo - DOM element where component will be rendered to
|
|
42
|
+
* @param {string} config.criterias - Search criteria to be set on component creation
|
|
43
|
+
* @param {boolean} config.searchOnInit - if init search must be triggered or not (stored results are used instead)
|
|
44
|
+
* @param {string} config.url - search endpoint to be set on datatable
|
|
45
|
+
* @param {string} config.rootClassUri - Uri for the root class of current context, required to init the class filter
|
|
46
|
+
* @param {bool} config.hideResourceSelector - if resourceSelector must be hidden
|
|
47
|
+
* @param {string} config.placeholder - placeholder for input in template
|
|
48
|
+
* @returns {searchModal}
|
|
49
|
+
*/
|
|
50
|
+
export default function searchModalFactory(config) {
|
|
51
|
+
const defaults = {
|
|
52
|
+
renderTo: 'body',
|
|
53
|
+
criterias: {},
|
|
54
|
+
searchOnInit: true,
|
|
55
|
+
maxListSize: 5
|
|
56
|
+
};
|
|
57
|
+
// Private properties to be easily accessible by instance methods
|
|
58
|
+
let $container = null;
|
|
59
|
+
let $searchInput = null;
|
|
60
|
+
let $searchButton = null;
|
|
61
|
+
let $clearButton = null;
|
|
62
|
+
let running = false;
|
|
63
|
+
let searchStore = null;
|
|
64
|
+
let resourceSelector = null;
|
|
65
|
+
let $classFilterContainer = null;
|
|
66
|
+
let $classFilterInput = null;
|
|
67
|
+
let $classTreeContainer = null;
|
|
68
|
+
let advancedSearch = null;
|
|
69
|
+
|
|
70
|
+
// resorce selector
|
|
71
|
+
const isResourceSelector = !config.hideResourceSelector;
|
|
72
|
+
const rootClassUri = config.rootClassUri;
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Creates search modal, inits template selectors, inits search store, and once is created triggers initial search
|
|
76
|
+
* rootClassUri is sent to advancedSearch factory for disabling in whitelisted sections
|
|
77
|
+
*/
|
|
78
|
+
function renderModal() {
|
|
79
|
+
const promises = [];
|
|
80
|
+
initModal();
|
|
81
|
+
initUiSelectors();
|
|
82
|
+
advancedSearch = advancedSearchFactory({
|
|
83
|
+
renderTo: $('.filters-container', $container),
|
|
84
|
+
advancedCriteria: instance.config.criterias.advancedCriteria,
|
|
85
|
+
rootClassUri: rootClassUri
|
|
86
|
+
});
|
|
87
|
+
promises.push(initClassFilter());
|
|
88
|
+
promises.push(initSearchStore());
|
|
89
|
+
Promise.all(promises)
|
|
90
|
+
.then(() => {
|
|
91
|
+
instance.trigger('ready');
|
|
92
|
+
$searchButton.trigger('click');
|
|
93
|
+
})
|
|
94
|
+
.catch(e => instance.trigger('error', e));
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Removes search modal
|
|
99
|
+
*/
|
|
100
|
+
function destroyModal() {
|
|
101
|
+
$container.removeClass('modal').modal('destroy');
|
|
102
|
+
$('.modal-bg').remove();
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// Creates new component
|
|
106
|
+
const instance = component({}, defaults)
|
|
107
|
+
.setTemplate(layoutTpl)
|
|
108
|
+
.on('render', renderModal)
|
|
109
|
+
.on('destroy', destroyModal);
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* Creates search modal
|
|
113
|
+
*/
|
|
114
|
+
function initModal() {
|
|
115
|
+
$container = instance.getElement();
|
|
116
|
+
$container
|
|
117
|
+
.addClass('modal')
|
|
118
|
+
.on('closed.modal', () => instance.destroy())
|
|
119
|
+
.modal({
|
|
120
|
+
disableEscape: false,
|
|
121
|
+
width: $(window).width(),
|
|
122
|
+
modalCloseClass: 'modal-close-left'
|
|
123
|
+
})
|
|
124
|
+
.focus();
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* Inits class filter selector
|
|
129
|
+
*/
|
|
130
|
+
function initClassFilter() {
|
|
131
|
+
return new Promise(resolve => {
|
|
132
|
+
if (!isResourceSelector) {
|
|
133
|
+
$classFilterContainer.hide();
|
|
134
|
+
return resolve();
|
|
135
|
+
}
|
|
136
|
+
const initialClassUri =
|
|
137
|
+
instance.config.criterias && instance.config.criterias.class
|
|
138
|
+
? instance.config.criterias.class
|
|
139
|
+
: rootClassUri;
|
|
140
|
+
resourceSelector = resourceSelectorFactory($('.class-tree', $container), {
|
|
141
|
+
//set up the inner resource selector
|
|
142
|
+
selectionMode: 'single',
|
|
143
|
+
selectClass: true,
|
|
144
|
+
classUri: rootClassUri,
|
|
145
|
+
showContext: false,
|
|
146
|
+
showSelection: false
|
|
147
|
+
});
|
|
148
|
+
|
|
149
|
+
// when a class query is triggered, update selector options with received resources
|
|
150
|
+
resourceSelector.on('query', params => {
|
|
151
|
+
const classOnlyParams = { ...params, classOnly: true };
|
|
152
|
+
const route = urlUtil.route('getAll', 'RestResource', 'tao');
|
|
153
|
+
request(route, classOnlyParams)
|
|
154
|
+
.then(response => {
|
|
155
|
+
if (
|
|
156
|
+
response.permissions &&
|
|
157
|
+
response.permissions.data &&
|
|
158
|
+
response.permissions.supportedRights &&
|
|
159
|
+
response.permissions.supportedRights.length > 0
|
|
160
|
+
) {
|
|
161
|
+
manageClassTreePermissions(response);
|
|
162
|
+
}
|
|
163
|
+
resourceSelector.update(response.resources, classOnlyParams);
|
|
164
|
+
})
|
|
165
|
+
.catch(e => instance.trigger('error', e));
|
|
166
|
+
});
|
|
167
|
+
|
|
168
|
+
/*
|
|
169
|
+
* the first time selector opions are updated the root class is selected. Promise is
|
|
170
|
+
* resolved so init process continues only when class input value has been set
|
|
171
|
+
*/
|
|
172
|
+
resourceSelector.on('update', () => {
|
|
173
|
+
resourceSelector.off('update');
|
|
174
|
+
|
|
175
|
+
resourceSelector.select(initialClassUri);
|
|
176
|
+
resolve();
|
|
177
|
+
});
|
|
178
|
+
|
|
179
|
+
// then new class is selected, set its label into class filter input and hide filter container, then request class properties
|
|
180
|
+
resourceSelector.on('change', selectedValue => {
|
|
181
|
+
/*
|
|
182
|
+
* on searchModal init we set manually the selector to the provided config.rootClassUri. When a selector
|
|
183
|
+
* is set manually Selector component execs @clearSelection which triggers a change event
|
|
184
|
+
* with an empty object as param. We catch this undesired behaviour here
|
|
185
|
+
*/
|
|
186
|
+
if (_.isEmpty(selectedValue)) {
|
|
187
|
+
return;
|
|
188
|
+
}
|
|
189
|
+
const classUri = _.map(selectedValue, 'classUri')[0];
|
|
190
|
+
const label = _.map(selectedValue, 'label')[0];
|
|
191
|
+
const uri = _.map(selectedValue, 'uri')[0];
|
|
192
|
+
const route = urlUtil.route('getWithMapping', 'ClassMetadata', 'tao', {
|
|
193
|
+
classUri,
|
|
194
|
+
maxListSize: instance.config.maxListSize
|
|
195
|
+
});
|
|
196
|
+
$classFilterInput.html(label);
|
|
197
|
+
$classFilterInput.data('uri', uri);
|
|
198
|
+
$classTreeContainer.hide();
|
|
199
|
+
advancedSearch
|
|
200
|
+
.updateCriteria(route)
|
|
201
|
+
.then(() => instance.trigger('criteriaListUpdated'))
|
|
202
|
+
.catch(e => instance.trigger('error', e));
|
|
203
|
+
});
|
|
204
|
+
|
|
205
|
+
setResourceSelectorUIBehaviour();
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
/**
|
|
210
|
+
* Loops through each class in received class tree and sets access mode to 'denied' on private classes
|
|
211
|
+
* so are disabled on class tree
|
|
212
|
+
* @param {object} classTree - class tree received by server, containing resources (classes) and permissions
|
|
213
|
+
*/
|
|
214
|
+
function manageClassTreePermissions(classTree) {
|
|
215
|
+
const disableBlockedClasses = function (resources) {
|
|
216
|
+
_.forEach(resources, (resource, index, array) => {
|
|
217
|
+
if (
|
|
218
|
+
classTree.permissions.data[resource.uri] &&
|
|
219
|
+
classTree.permissions.data[resource.uri].find(permission => permission === 'READ')
|
|
220
|
+
) {
|
|
221
|
+
if (resource.children) {
|
|
222
|
+
disableBlockedClasses(resource.children);
|
|
223
|
+
}
|
|
224
|
+
} else {
|
|
225
|
+
array[index].accessMode = 'denied';
|
|
226
|
+
}
|
|
227
|
+
});
|
|
228
|
+
};
|
|
229
|
+
disableBlockedClasses(classTree.resources);
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
/**
|
|
233
|
+
* Inits template selectors, buttons behaviour, scroll animation,
|
|
234
|
+
* and sets initial search query on search input
|
|
235
|
+
*/
|
|
236
|
+
function initUiSelectors() {
|
|
237
|
+
$searchButton = $('.btn-search', $container);
|
|
238
|
+
$clearButton = $('.btn-clear', $container);
|
|
239
|
+
$searchInput = $('.generic-search-input', $container);
|
|
240
|
+
$classFilterInput = $('.class-filter', $container);
|
|
241
|
+
$classTreeContainer = $('.class-tree', $container);
|
|
242
|
+
$classFilterContainer = $('.class-filter-container', $container);
|
|
243
|
+
|
|
244
|
+
$searchButton.on('click', search);
|
|
245
|
+
$clearButton.on('click', clear);
|
|
246
|
+
const shortcuts = shortcutRegistry($searchInput);
|
|
247
|
+
shortcuts.clear().add('enter', search);
|
|
248
|
+
$searchInput.val(
|
|
249
|
+
instance.config.criterias && instance.config.criterias.search ? instance.config.criterias.search : ''
|
|
250
|
+
);
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
/**
|
|
254
|
+
* Sets required listeners to properly manage resourceSelector visualization
|
|
255
|
+
*/
|
|
256
|
+
function setResourceSelectorUIBehaviour() {
|
|
257
|
+
$container.on('mousedown', () => {
|
|
258
|
+
$classTreeContainer.hide();
|
|
259
|
+
});
|
|
260
|
+
|
|
261
|
+
/**
|
|
262
|
+
* Pressing space, enter, esc, backspace
|
|
263
|
+
* on class filter input will toggle resource selector
|
|
264
|
+
*/
|
|
265
|
+
const shortcuts = shortcutRegistry($classFilterInput);
|
|
266
|
+
shortcuts.add('enter', () => $classTreeContainer.show());
|
|
267
|
+
shortcuts.add('space', () => $classTreeContainer.show());
|
|
268
|
+
shortcuts.add('backspace', () => $classTreeContainer.hide());
|
|
269
|
+
shortcuts.add('escape', () => $classTreeContainer.hide(), { propagate: false });
|
|
270
|
+
|
|
271
|
+
/**
|
|
272
|
+
* clicking on class filter container will toggle resource selector
|
|
273
|
+
*/
|
|
274
|
+
$classFilterContainer.on('click', e => {
|
|
275
|
+
$classTreeContainer.toggle();
|
|
276
|
+
});
|
|
277
|
+
|
|
278
|
+
/**
|
|
279
|
+
* clicking on class filter container will
|
|
280
|
+
* stopPropagation to prevent be closed
|
|
281
|
+
* by searchModal.mouseDown listener
|
|
282
|
+
*/
|
|
283
|
+
$classFilterContainer.on('mousedown', e => {
|
|
284
|
+
e.stopPropagation();
|
|
285
|
+
});
|
|
286
|
+
|
|
287
|
+
// clicking on resource selector will stopPropagation to prevent be closed by searchModal.mouseDown listener
|
|
288
|
+
$classTreeContainer.on('mousedown', e => {
|
|
289
|
+
e.stopPropagation();
|
|
290
|
+
});
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
/**
|
|
294
|
+
* Loads search store so it is accessible in the component
|
|
295
|
+
* @returns {Promise}
|
|
296
|
+
*/
|
|
297
|
+
function initSearchStore() {
|
|
298
|
+
return store('search')
|
|
299
|
+
.then(function (store) {
|
|
300
|
+
searchStore = store;
|
|
301
|
+
})
|
|
302
|
+
.catch(e => instance.trigger('error', e));
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
/**
|
|
306
|
+
* Request search results and manages its results
|
|
307
|
+
*/
|
|
308
|
+
function search() {
|
|
309
|
+
const query = buildComplexQuery();
|
|
310
|
+
const classFilterUri = isResourceSelector ? $classFilterInput.data('uri').trim() : rootClassUri;
|
|
311
|
+
|
|
312
|
+
//throttle and control to prevent sending too many requests
|
|
313
|
+
const searchHandler = _.throttle(query => {
|
|
314
|
+
if (running === false) {
|
|
315
|
+
running = true;
|
|
316
|
+
$.ajax({
|
|
317
|
+
url: instance.config.url,
|
|
318
|
+
type: 'POST',
|
|
319
|
+
data: { query: query, parentNode: classFilterUri, structure: context.shownStructure },
|
|
320
|
+
dataType: 'json'
|
|
321
|
+
})
|
|
322
|
+
.done(data => {
|
|
323
|
+
appendDefaultDatasetToDatatable(data.data)
|
|
324
|
+
.then(() => buildSearchResultsDatatable(data.data))
|
|
325
|
+
.catch(e => instance.trigger('error', e));
|
|
326
|
+
})
|
|
327
|
+
.always(() => (running = false));
|
|
328
|
+
}
|
|
329
|
+
}, 100);
|
|
330
|
+
|
|
331
|
+
searchHandler(query);
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
/**
|
|
335
|
+
* build final complex query appending every filter
|
|
336
|
+
*/
|
|
337
|
+
function buildComplexQuery() {
|
|
338
|
+
const $searchInputValue = $searchInput.val().trim();
|
|
339
|
+
|
|
340
|
+
let query = $searchInputValue;
|
|
341
|
+
query += advancedSearch.getAdvancedCriteriaQuery(query !== '');
|
|
342
|
+
|
|
343
|
+
return query;
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
/*
|
|
347
|
+
* If search on init is not required, extends data with stored dataset
|
|
348
|
+
* @param {object} data - search configuration including model and endpoint for datatable
|
|
349
|
+
* @returns {Promise}
|
|
350
|
+
*/
|
|
351
|
+
function appendDefaultDatasetToDatatable(data) {
|
|
352
|
+
return new Promise(function (resolve, reject) {
|
|
353
|
+
// If no search on init, get dataset from searchStore
|
|
354
|
+
if (instance.config.searchOnInit === false) {
|
|
355
|
+
searchStore
|
|
356
|
+
.getItem('results')
|
|
357
|
+
.then(storedSearchResults => {
|
|
358
|
+
instance.config.searchOnInit = true;
|
|
359
|
+
data.storedSearchResults = storedSearchResults;
|
|
360
|
+
resolve();
|
|
361
|
+
})
|
|
362
|
+
.catch(e => {
|
|
363
|
+
instance.trigger('error', e);
|
|
364
|
+
reject(new Error('Error appending default dataset from searchStore to datatable'));
|
|
365
|
+
});
|
|
366
|
+
} else {
|
|
367
|
+
resolve();
|
|
368
|
+
}
|
|
369
|
+
});
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
/**
|
|
373
|
+
* Creates a datatable with search results
|
|
374
|
+
* @param {object} data - search configuration including model and endpoint for datatable
|
|
375
|
+
*/
|
|
376
|
+
function buildSearchResultsDatatable(data) {
|
|
377
|
+
//update the section container
|
|
378
|
+
const $tableContainer = $('<div class="flex-container-full"></div>');
|
|
379
|
+
const section = $('.content-container', $container);
|
|
380
|
+
section.empty();
|
|
381
|
+
section.append($tableContainer);
|
|
382
|
+
$tableContainer.on('load.datatable', searchResultsLoaded);
|
|
383
|
+
|
|
384
|
+
//create datatable
|
|
385
|
+
$tableContainer.datatable(
|
|
386
|
+
{
|
|
387
|
+
url: data.url,
|
|
388
|
+
model: _.values(data.model),
|
|
389
|
+
labels: {
|
|
390
|
+
actions: ''
|
|
391
|
+
},
|
|
392
|
+
actions: [
|
|
393
|
+
{
|
|
394
|
+
id: 'go-to-item',
|
|
395
|
+
label: __('View'),
|
|
396
|
+
action: function openResource(uri, data) {
|
|
397
|
+
instance.trigger('refresh', uri, data);
|
|
398
|
+
instance.destroy();
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
],
|
|
402
|
+
params: {
|
|
403
|
+
params: data.params,
|
|
404
|
+
filters: data.filters,
|
|
405
|
+
rows: 20
|
|
406
|
+
}
|
|
407
|
+
},
|
|
408
|
+
data.storedSearchResults
|
|
409
|
+
);
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
/**
|
|
413
|
+
* Triggered on load.datatable event, it updates searchStore and manages possible exceptions
|
|
414
|
+
* @param {object} e - load.datatable event
|
|
415
|
+
* @param {object} dataset - datatable dataset
|
|
416
|
+
*/
|
|
417
|
+
function searchResultsLoaded(e, dataset) {
|
|
418
|
+
if (dataset.records === 0) {
|
|
419
|
+
replaceSearchResultsDatatableWithMessage('no-matches');
|
|
420
|
+
}
|
|
421
|
+
instance.trigger(`datatable-loaded`);
|
|
422
|
+
updateSearchStore({
|
|
423
|
+
action: 'update',
|
|
424
|
+
dataset,
|
|
425
|
+
context: context.shownStructure,
|
|
426
|
+
criterias: {
|
|
427
|
+
search: $searchInput.val(),
|
|
428
|
+
class: isResourceSelector ? _.map(resourceSelector.getSelection(), 'uri')[0] : rootClassUri,
|
|
429
|
+
advancedCriteria: advancedSearch.getState()
|
|
430
|
+
}
|
|
431
|
+
});
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
/**
|
|
435
|
+
* Updates searchStore. If action is 'clear', searchStore is claread. If not, received
|
|
436
|
+
* data is assigned to searchStore. Once all actions have been done,
|
|
437
|
+
* store-updated event is triggered
|
|
438
|
+
* @param {object} data - data to store
|
|
439
|
+
*/
|
|
440
|
+
function updateSearchStore(data) {
|
|
441
|
+
const promises = [];
|
|
442
|
+
if (data.action === 'clear') {
|
|
443
|
+
promises.push(searchStore.clear());
|
|
444
|
+
} else if (data.action === 'update') {
|
|
445
|
+
promises.push(searchStore.setItem('criterias', data.criterias));
|
|
446
|
+
promises.push(searchStore.setItem('context', data.context));
|
|
447
|
+
promises.push(
|
|
448
|
+
data.dataset.records === 0
|
|
449
|
+
? searchStore.removeItem('results')
|
|
450
|
+
: searchStore.setItem('results', data.dataset)
|
|
451
|
+
);
|
|
452
|
+
}
|
|
453
|
+
|
|
454
|
+
Promise.all(promises)
|
|
455
|
+
.then(() => instance.trigger(`store-updated`))
|
|
456
|
+
.catch(e => instance.trigger('error', e));
|
|
457
|
+
}
|
|
458
|
+
|
|
459
|
+
/**
|
|
460
|
+
* Clear search input, criteria and results from both, view and store.
|
|
461
|
+
* Also sets every criterion on criteriaState to unredered and
|
|
462
|
+
* undefined value
|
|
463
|
+
*/
|
|
464
|
+
function clear() {
|
|
465
|
+
$searchInput.val('');
|
|
466
|
+
advancedSearch.clear();
|
|
467
|
+
isResourceSelector && resourceSelector.select(rootClassUri);
|
|
468
|
+
replaceSearchResultsDatatableWithMessage('no-query');
|
|
469
|
+
updateSearchStore({ action: 'clear' });
|
|
470
|
+
}
|
|
471
|
+
|
|
472
|
+
/**
|
|
473
|
+
* Removes datatable container and displays a message instead
|
|
474
|
+
* @param {string} reason - reason why datatable is not rendered, to display appropiate message
|
|
475
|
+
*/
|
|
476
|
+
function replaceSearchResultsDatatableWithMessage(reason) {
|
|
477
|
+
const section = $('.content-container', $container);
|
|
478
|
+
section.empty();
|
|
479
|
+
let message = '';
|
|
480
|
+
let icon = '';
|
|
481
|
+
|
|
482
|
+
if (reason === 'no-query') {
|
|
483
|
+
message = __('Please define your search in the search panel.');
|
|
484
|
+
icon = 'icon-find';
|
|
485
|
+
} else if (reason === 'no-matches') {
|
|
486
|
+
message = __('No item found. Please try other search criteria.');
|
|
487
|
+
icon = 'icon-info';
|
|
488
|
+
}
|
|
489
|
+
|
|
490
|
+
const infoMessage = infoMessageTpl({ message, icon });
|
|
491
|
+
section.append(infoMessage);
|
|
492
|
+
}
|
|
493
|
+
|
|
494
|
+
// return initialized instance of searchModal
|
|
495
|
+
return instance.init(config);
|
|
496
|
+
}
|