@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
package/src/resource/selector.js
CHANGED
|
@@ -1,871 +1,871 @@
|
|
|
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) 2017-2019 (original work) Open Assessment Technologies SA ;
|
|
17
|
-
*/
|
|
18
|
-
|
|
19
|
-
/**
|
|
20
|
-
* The resource selector component
|
|
21
|
-
* Handles multiple view/selection formats (now tree and list).
|
|
22
|
-
*
|
|
23
|
-
* Let's you change the root class and filter by labels.
|
|
24
|
-
*
|
|
25
|
-
* The data flow is based on the query/update model :
|
|
26
|
-
*
|
|
27
|
-
* @example
|
|
28
|
-
* resourceSelectorFactory(container, config)
|
|
29
|
-
* .on('query', function(params){
|
|
30
|
-
* var self = this;
|
|
31
|
-
* fetch('someurl', params).then(nodes){
|
|
32
|
-
* self.update(nodedata, params);
|
|
33
|
-
* });
|
|
34
|
-
* });
|
|
35
|
-
*
|
|
36
|
-
* FIXME search and advanced search switch to the list format
|
|
37
|
-
* because backend implementation doesn't support well the
|
|
38
|
-
* tree behavior.
|
|
39
|
-
*
|
|
40
|
-
* @author Bertrand Chevrier <bertrand@taotesting.com>
|
|
41
|
-
*/
|
|
42
|
-
import $ from 'jquery';
|
|
43
|
-
import _ from 'lodash';
|
|
44
|
-
import __ from 'i18n';
|
|
45
|
-
import component from 'ui/component';
|
|
46
|
-
import hider from 'ui/hider';
|
|
47
|
-
import classesSelectorFactory from 'ui/class/selector';
|
|
48
|
-
import treeFactory from 'ui/resource/tree';
|
|
49
|
-
import listFactory from 'ui/resource/list';
|
|
50
|
-
import filtersFactory from 'ui/resource/filters';
|
|
51
|
-
import selectorTpl from 'ui/resource/tpl/selector';
|
|
52
|
-
import 'ui/resource/css/selector.css';
|
|
53
|
-
|
|
54
|
-
var labelUri = 'http://www.w3.org/2000/01/rdf-schema#label';
|
|
55
|
-
|
|
56
|
-
var nodeTypes = {
|
|
57
|
-
instance: 'instance',
|
|
58
|
-
class: 'class'
|
|
59
|
-
};
|
|
60
|
-
|
|
61
|
-
var selectionModes = {
|
|
62
|
-
single: 'single',
|
|
63
|
-
multiple: 'multiple',
|
|
64
|
-
both: 'both'
|
|
65
|
-
};
|
|
66
|
-
|
|
67
|
-
var selectAllPolicies = {
|
|
68
|
-
all: 'all', // should select 100% of the nodes, but currently not implementable due to lazy loading
|
|
69
|
-
loaded: 'loaded', // selects all loaded nodes, whether visible or not
|
|
70
|
-
visible: 'visible' // selects only visible nodes
|
|
71
|
-
};
|
|
72
|
-
|
|
73
|
-
var defaultConfig = {
|
|
74
|
-
type: __('resources'),
|
|
75
|
-
noResultsText: _('No resources found'),
|
|
76
|
-
searchPlaceholder: __('Search'),
|
|
77
|
-
icon: 'item',
|
|
78
|
-
selectionMode: selectionModes.single,
|
|
79
|
-
selectClass: false,
|
|
80
|
-
selectAllPolicy: selectAllPolicies.loaded,
|
|
81
|
-
filters: false,
|
|
82
|
-
showContext: true,
|
|
83
|
-
showSelection: true,
|
|
84
|
-
formats: {
|
|
85
|
-
list: {
|
|
86
|
-
icon: 'icon-ul',
|
|
87
|
-
title: __('View resources as a list'),
|
|
88
|
-
componentFactory: listFactory
|
|
89
|
-
},
|
|
90
|
-
tree: {
|
|
91
|
-
icon: 'icon-tree',
|
|
92
|
-
title: __('View resources as a tree'),
|
|
93
|
-
componentFactory: treeFactory,
|
|
94
|
-
active: true
|
|
95
|
-
}
|
|
96
|
-
},
|
|
97
|
-
limit: 30
|
|
98
|
-
};
|
|
99
|
-
|
|
100
|
-
/**
|
|
101
|
-
* Filter and extract classes from a resource tree
|
|
102
|
-
* @param {Object[]} resources - the resource tree
|
|
103
|
-
* @returns {Object[]} contains only classes with URI and label
|
|
104
|
-
*/
|
|
105
|
-
var filterClasses = function filterClasses(resources) {
|
|
106
|
-
return _(resources)
|
|
107
|
-
.filter({ type: nodeTypes.class })
|
|
108
|
-
.map(function (resource) {
|
|
109
|
-
var classNode = _.pick(resource, ['uri', 'label', 'state']);
|
|
110
|
-
|
|
111
|
-
if (resource.children) {
|
|
112
|
-
classNode.children = filterClasses(resource.children);
|
|
113
|
-
}
|
|
114
|
-
return classNode;
|
|
115
|
-
})
|
|
116
|
-
.value();
|
|
117
|
-
};
|
|
118
|
-
|
|
119
|
-
/**
|
|
120
|
-
* The factory that creates the resource selector component
|
|
121
|
-
*
|
|
122
|
-
* @param {jQueryElement} $container - where to append the component
|
|
123
|
-
* @param {Object} config - the component config
|
|
124
|
-
* @param {String} config.classUri - the root Class URI
|
|
125
|
-
* @param {Object|[]} [config.classes] - the classes hierarchy for the class selector
|
|
126
|
-
* @param {Object[]} config.formats - the definition of the supported viewer/selector component
|
|
127
|
-
* @param {Object[]} [config.nodes] - the nodes to preload, the format is up to the formatComponent
|
|
128
|
-
* @param {String} [config.icon] - the icon class that represents a resource
|
|
129
|
-
* @param {String} [config.type] - describes the resource type
|
|
130
|
-
* @param {Boolean} [config.selectionMode] - multiple or single selection mode
|
|
131
|
-
* @param {Number} [config.limit = 30] - the default page size for data paging
|
|
132
|
-
* @param {Object|Boolean} [config.filters = false] - false or filters config, see ui/resource/filters
|
|
133
|
-
* @param {Boolean} [config.showContext = true] - show the context bar (class and format switch)
|
|
134
|
-
* @param {Boolean} [config.showSelection = true] - show the selection bar (search, multi switch and select all)
|
|
135
|
-
* @returns {resourceSelector} the component
|
|
136
|
-
*/
|
|
137
|
-
var resourceSelectorFactory = function resourceSelectorFactory(
|
|
138
|
-
$container,
|
|
139
|
-
config
|
|
140
|
-
) {
|
|
141
|
-
var $classContainer;
|
|
142
|
-
var $resultArea;
|
|
143
|
-
var $noResults;
|
|
144
|
-
var $searchField;
|
|
145
|
-
var $viewFormats;
|
|
146
|
-
var $selectNum;
|
|
147
|
-
var $selectCtrl;
|
|
148
|
-
var $selectCtrlLabel;
|
|
149
|
-
var $filterToggle;
|
|
150
|
-
var $filterContainer;
|
|
151
|
-
var $selectionToggle;
|
|
152
|
-
|
|
153
|
-
var resourceSelectorApi = {
|
|
154
|
-
/**
|
|
155
|
-
* Empty the selection component
|
|
156
|
-
* @returns {resourceSelector} chains
|
|
157
|
-
* @fires resourceSelector#empty
|
|
158
|
-
*/
|
|
159
|
-
empty: function empty() {
|
|
160
|
-
if (this.is('rendered')) {
|
|
161
|
-
if (this.selectionComponent) {
|
|
162
|
-
this.selectionComponent.destroy();
|
|
163
|
-
this.selectionComponent = null;
|
|
164
|
-
}
|
|
165
|
-
}
|
|
166
|
-
return this.trigger('empty');
|
|
167
|
-
},
|
|
168
|
-
|
|
169
|
-
/**
|
|
170
|
-
* Reset the selector
|
|
171
|
-
* @returns {resourceSelector} chains
|
|
172
|
-
* @fires resourceSelector#reset
|
|
173
|
-
*/
|
|
174
|
-
reset: function reset() {
|
|
175
|
-
if (this.is('rendered')) {
|
|
176
|
-
this.empty();
|
|
177
|
-
|
|
178
|
-
this.searchQuery = {};
|
|
179
|
-
|
|
180
|
-
if (this.config.filters) {
|
|
181
|
-
if (this.filtersComponent) {
|
|
182
|
-
this.filtersComponent.reset();
|
|
183
|
-
}
|
|
184
|
-
$searchField
|
|
185
|
-
.val('')
|
|
186
|
-
.attr('title', null)
|
|
187
|
-
.attr('placeholder', this.config.searchPlaceholder);
|
|
188
|
-
}
|
|
189
|
-
}
|
|
190
|
-
return this.trigger('reset');
|
|
191
|
-
},
|
|
192
|
-
|
|
193
|
-
/**
|
|
194
|
-
* Get the selected nodes
|
|
195
|
-
* @returns {Object?} the selection
|
|
196
|
-
*/
|
|
197
|
-
getSelection: function getSelection() {
|
|
198
|
-
if (this.selectionComponent) {
|
|
199
|
-
return this.selectionComponent.getSelection();
|
|
200
|
-
}
|
|
201
|
-
return null;
|
|
202
|
-
},
|
|
203
|
-
|
|
204
|
-
/**
|
|
205
|
-
* Clear the current selection
|
|
206
|
-
* @returns {resourceSelector} chains
|
|
207
|
-
*/
|
|
208
|
-
clearSelection: function clearSelection() {
|
|
209
|
-
if (this.selectionComponent) {
|
|
210
|
-
this.selectionComponent.clearSelection();
|
|
211
|
-
}
|
|
212
|
-
return this;
|
|
213
|
-
},
|
|
214
|
-
|
|
215
|
-
/**
|
|
216
|
-
* Set the search query
|
|
217
|
-
* @param {String|Object} query - label query if string or property filters
|
|
218
|
-
* @returns {resourceSelector} chains
|
|
219
|
-
*/
|
|
220
|
-
setSearchQuery: function setSearchQuery(query) {
|
|
221
|
-
this.searchQuery = {};
|
|
222
|
-
this.searchQuery[labelUri] = '';
|
|
223
|
-
|
|
224
|
-
if (_.isString(query) && !_.isEmpty(query)) {
|
|
225
|
-
this.searchQuery[labelUri] = query;
|
|
226
|
-
}
|
|
227
|
-
if (_.isPlainObject(query)) {
|
|
228
|
-
this.searchQuery = query;
|
|
229
|
-
}
|
|
230
|
-
return this;
|
|
231
|
-
},
|
|
232
|
-
|
|
233
|
-
/**
|
|
234
|
-
* Clear the search query to submit
|
|
235
|
-
* @returns {Object} the query
|
|
236
|
-
*/
|
|
237
|
-
getSearchQuery: function getSearchQuery() {
|
|
238
|
-
if (_.size(this.searchQuery) === 0) {
|
|
239
|
-
this.searchQuery[labelUri] = '';
|
|
240
|
-
}
|
|
241
|
-
return this.searchQuery;
|
|
242
|
-
},
|
|
243
|
-
|
|
244
|
-
/**
|
|
245
|
-
* Ask for a query (forward the event)
|
|
246
|
-
* @param {Object} [params] - the query parameters
|
|
247
|
-
* @param {String} [params.classUri] - the current node class URI
|
|
248
|
-
* @param {String} [params.format] - the selected format
|
|
249
|
-
* @param {String} [params.search] - the search query
|
|
250
|
-
* @param {Number} [params.offset = 0] - for paging
|
|
251
|
-
* @param {Number} [params.limit] - for paging
|
|
252
|
-
* @returns {resourceSelector} chains
|
|
253
|
-
* @fires resourceSelector#query
|
|
254
|
-
*/
|
|
255
|
-
query: function query(params) {
|
|
256
|
-
var defaultParams;
|
|
257
|
-
var search;
|
|
258
|
-
if (this.is('rendered') && !this.is('loading')) {
|
|
259
|
-
this.setState('loading', true);
|
|
260
|
-
|
|
261
|
-
params = params || {};
|
|
262
|
-
search = this.getSearchQuery();
|
|
263
|
-
defaultParams = {
|
|
264
|
-
classUri: this.classUri,
|
|
265
|
-
format: this.format,
|
|
266
|
-
limit: this.config.limit,
|
|
267
|
-
search: _.isObject(search) ? JSON.stringify(search) : ''
|
|
268
|
-
};
|
|
269
|
-
|
|
270
|
-
/**
|
|
271
|
-
* Formulate the query
|
|
272
|
-
* @event resourceSelector#query
|
|
273
|
-
* @param {Object} params - see format above
|
|
274
|
-
*/
|
|
275
|
-
this.trigger('query', _.defaults(params, defaultParams));
|
|
276
|
-
}
|
|
277
|
-
return this;
|
|
278
|
-
},
|
|
279
|
-
|
|
280
|
-
/**
|
|
281
|
-
* Switch the format, so the viewer/selector component
|
|
282
|
-
* @param {String} format - the new format
|
|
283
|
-
* @returns {resourceSelector} chains
|
|
284
|
-
* @fires resourceSelector#formatchange
|
|
285
|
-
*/
|
|
286
|
-
changeFormat: function changeFormat(format) {
|
|
287
|
-
var $viewFormat;
|
|
288
|
-
if (this.is('rendered') && this.format !== format) {
|
|
289
|
-
$viewFormat = $viewFormats.filter(
|
|
290
|
-
`[data-view-format="${format}"]`
|
|
291
|
-
);
|
|
292
|
-
if (
|
|
293
|
-
$viewFormat.length === 1 &&
|
|
294
|
-
!$viewFormat.hasClass('active')
|
|
295
|
-
) {
|
|
296
|
-
$viewFormats.removeClass('active');
|
|
297
|
-
$viewFormat.addClass('active');
|
|
298
|
-
|
|
299
|
-
this.empty();
|
|
300
|
-
|
|
301
|
-
this.format = format;
|
|
302
|
-
|
|
303
|
-
/**
|
|
304
|
-
* The view format has changed
|
|
305
|
-
* @event resourceSelector#formatchange
|
|
306
|
-
* @param {String} format - the new format name
|
|
307
|
-
*/
|
|
308
|
-
this.trigger('formatchange', format);
|
|
309
|
-
}
|
|
310
|
-
}
|
|
311
|
-
return this;
|
|
312
|
-
},
|
|
313
|
-
|
|
314
|
-
/**
|
|
315
|
-
* Let's you change the selection mode
|
|
316
|
-
* @param {String} newMode - single or multiple
|
|
317
|
-
* @returns {resourceSelector} chains
|
|
318
|
-
*/
|
|
319
|
-
changeSelectionMode: function changeSelectionMode(newMode) {
|
|
320
|
-
if (
|
|
321
|
-
this.is('rendered') &&
|
|
322
|
-
this.config.selectionMode !== newMode &&
|
|
323
|
-
selectionModes[newMode]
|
|
324
|
-
) {
|
|
325
|
-
if (this.config.multiple) {
|
|
326
|
-
this.clearSelection();
|
|
327
|
-
}
|
|
328
|
-
|
|
329
|
-
this.config.multiple = newMode === selectionModes.multiple;
|
|
330
|
-
this.selectionComponent.setState(
|
|
331
|
-
'multiple',
|
|
332
|
-
this.config.multiple
|
|
333
|
-
);
|
|
334
|
-
this.setState('multiple', this.config.multiple);
|
|
335
|
-
|
|
336
|
-
if (this.config.multiple) {
|
|
337
|
-
hider.show($selectCtrlLabel);
|
|
338
|
-
} else {
|
|
339
|
-
hider.hide($selectCtrlLabel);
|
|
340
|
-
}
|
|
341
|
-
|
|
342
|
-
/**
|
|
343
|
-
* The selection mode has changed
|
|
344
|
-
* @event resourceSelector#selectionmodechange
|
|
345
|
-
* @param {String} newMode - the new selection mode
|
|
346
|
-
*/
|
|
347
|
-
this.trigger('selectionmodechange', newMode);
|
|
348
|
-
}
|
|
349
|
-
return this;
|
|
350
|
-
},
|
|
351
|
-
|
|
352
|
-
/**
|
|
353
|
-
* Update the component with the given resources
|
|
354
|
-
* @param {Object[]} resources - the data, with at least a URI as key and as property
|
|
355
|
-
* @param {Object} params - the query parameters
|
|
356
|
-
* @returns {resourceSelector} chains
|
|
357
|
-
* @fires resourceSelector#update
|
|
358
|
-
* @fires resourceSelector#change
|
|
359
|
-
* @fires resourceSelector#error
|
|
360
|
-
*/
|
|
361
|
-
update: function update(resources, params) {
|
|
362
|
-
var self = this;
|
|
363
|
-
|
|
364
|
-
var componentFactory;
|
|
365
|
-
|
|
366
|
-
if (this.is('rendered') && this.format) {
|
|
367
|
-
componentFactory =
|
|
368
|
-
this.config.formats[this.format] &&
|
|
369
|
-
this.config.formats[this.format].componentFactory;
|
|
370
|
-
if (!_.isFunction(componentFactory)) {
|
|
371
|
-
return this.trigger(
|
|
372
|
-
'error',
|
|
373
|
-
new TypeError(
|
|
374
|
-
`Unable to load the component for the format ${this.format}`
|
|
375
|
-
)
|
|
376
|
-
);
|
|
377
|
-
}
|
|
378
|
-
|
|
379
|
-
hider.hide($noResults);
|
|
380
|
-
|
|
381
|
-
if (params.updateClasses && this.classSelector) {
|
|
382
|
-
this.classSelector.updateNodes(filterClasses(resources));
|
|
383
|
-
}
|
|
384
|
-
|
|
385
|
-
if (!this.selectionComponent) {
|
|
386
|
-
this.selectionComponent = componentFactory(
|
|
387
|
-
$resultArea,
|
|
388
|
-
_.defaults(
|
|
389
|
-
{
|
|
390
|
-
classUri: this.classUri,
|
|
391
|
-
nodes: resources
|
|
392
|
-
},
|
|
393
|
-
this.config
|
|
394
|
-
)
|
|
395
|
-
)
|
|
396
|
-
.on('query', function (queryParams) {
|
|
397
|
-
self.query(queryParams);
|
|
398
|
-
})
|
|
399
|
-
.on('update', function () {
|
|
400
|
-
if (
|
|
401
|
-
_.size(this.getNodes()) === 0 &&
|
|
402
|
-
$('li', $resultArea).length === 0
|
|
403
|
-
) {
|
|
404
|
-
hider.show($noResults);
|
|
405
|
-
}
|
|
406
|
-
self.trigger('update');
|
|
407
|
-
})
|
|
408
|
-
.on('change', function (selected, onlyVisible) {
|
|
409
|
-
self.trigger('change', selected, onlyVisible);
|
|
410
|
-
})
|
|
411
|
-
.on('error', function (err) {
|
|
412
|
-
self.trigger('error', err);
|
|
413
|
-
});
|
|
414
|
-
} else {
|
|
415
|
-
this.selectionComponent.update(resources, params);
|
|
416
|
-
}
|
|
417
|
-
|
|
418
|
-
this.setState('loading', false);
|
|
419
|
-
}
|
|
420
|
-
return this;
|
|
421
|
-
},
|
|
422
|
-
|
|
423
|
-
/**
|
|
424
|
-
* Update the filters component
|
|
425
|
-
* @param {Object?} filterConfig - the new filter configuration
|
|
426
|
-
* @returns {resourceSelector} chains
|
|
427
|
-
*/
|
|
428
|
-
updateFilters: function updateFilters(filterConfig) {
|
|
429
|
-
if (
|
|
430
|
-
this.is('rendered') &&
|
|
431
|
-
filterConfig !== false &&
|
|
432
|
-
this.filtersComponent
|
|
433
|
-
) {
|
|
434
|
-
this.filtersComponent.update(filterConfig);
|
|
435
|
-
}
|
|
436
|
-
return this;
|
|
437
|
-
},
|
|
438
|
-
|
|
439
|
-
/**
|
|
440
|
-
* Remove a given node, from the selection component and the node list.
|
|
441
|
-
*
|
|
442
|
-
* @param {Object|String} node - the node or the node URI
|
|
443
|
-
* @param {String} [node.uri]
|
|
444
|
-
* @returns {resourceSelector} chains
|
|
445
|
-
*/
|
|
446
|
-
removeNode: function removeNode(node) {
|
|
447
|
-
var uri = _.isString(node) ? node : node.uri;
|
|
448
|
-
if (this.hasNode(uri)) {
|
|
449
|
-
//update the class selector
|
|
450
|
-
if (
|
|
451
|
-
this.getNodeType(node) === nodeTypes.class &&
|
|
452
|
-
this.classSelector
|
|
453
|
-
) {
|
|
454
|
-
this.classSelector.removeNode(node);
|
|
455
|
-
}
|
|
456
|
-
|
|
457
|
-
this.selectionComponent.removeNode(uri);
|
|
458
|
-
}
|
|
459
|
-
return this;
|
|
460
|
-
},
|
|
461
|
-
|
|
462
|
-
/**
|
|
463
|
-
* Add manually a node.
|
|
464
|
-
*
|
|
465
|
-
* @param {Object} node - the node to add
|
|
466
|
-
* @param {String} node.uri
|
|
467
|
-
* @param {String} node.label
|
|
468
|
-
* @param {String} [node.type=instance] - instance or class
|
|
469
|
-
* @param {String} [parentUri] - where to append the new node
|
|
470
|
-
* @returns {resourceSelector} chains
|
|
471
|
-
*/
|
|
472
|
-
addNode: function addNode(node, parentUri) {
|
|
473
|
-
if (
|
|
474
|
-
this.is('rendered') &&
|
|
475
|
-
node &&
|
|
476
|
-
node.uri &&
|
|
477
|
-
this.selectionComponent
|
|
478
|
-
) {
|
|
479
|
-
if (!this.selectionComponent.hasNode(node.uri)) {
|
|
480
|
-
if (!node.type) {
|
|
481
|
-
node.type = nodeTypes.instance;
|
|
482
|
-
}
|
|
483
|
-
|
|
484
|
-
//update the selection component
|
|
485
|
-
this.selectionComponent.update([node], {
|
|
486
|
-
classUri: parentUri || this.classUri,
|
|
487
|
-
format: this.format,
|
|
488
|
-
limit: this.config.limit,
|
|
489
|
-
updateCount:
|
|
490
|
-
node.type === nodeTypes.instance ? 1 : false
|
|
491
|
-
});
|
|
492
|
-
|
|
493
|
-
//update the class selector
|
|
494
|
-
if (
|
|
495
|
-
this.getNodeType(node) === nodeTypes.class &&
|
|
496
|
-
this.classSelector
|
|
497
|
-
) {
|
|
498
|
-
this.classSelector.addNode(node, parentUri);
|
|
499
|
-
}
|
|
500
|
-
}
|
|
501
|
-
}
|
|
502
|
-
return this;
|
|
503
|
-
},
|
|
504
|
-
|
|
505
|
-
/**
|
|
506
|
-
* Add class to classSelector, no update of selectionComponent
|
|
507
|
-
*
|
|
508
|
-
* @param {Object} node - the class node to add
|
|
509
|
-
* @param {String} node.uri
|
|
510
|
-
* @param {String} node.label
|
|
511
|
-
* @param {String} parentUri - where to append the new node
|
|
512
|
-
* @returns {resourceSelector} chains
|
|
513
|
-
*/
|
|
514
|
-
addClassNode: function addClassNode(node, parentUri) {
|
|
515
|
-
if (this.is('rendered') && node && node.uri && this.classSelector) {
|
|
516
|
-
if (
|
|
517
|
-
!this.classSelector.hasNode(node.uri) &&
|
|
518
|
-
this.classSelector.hasNode(parentUri)
|
|
519
|
-
) {
|
|
520
|
-
//add node to the class selector
|
|
521
|
-
this.classSelector.addNode(node, parentUri);
|
|
522
|
-
}
|
|
523
|
-
}
|
|
524
|
-
return this;
|
|
525
|
-
},
|
|
526
|
-
|
|
527
|
-
/**
|
|
528
|
-
* Does the given node exists ?
|
|
529
|
-
*
|
|
530
|
-
* @param {Object|String} node - the node or directly the URI
|
|
531
|
-
* @param {String} [node.uri]
|
|
532
|
-
* @returns {Boolean}
|
|
533
|
-
*/
|
|
534
|
-
hasNode: function hasNode(node) {
|
|
535
|
-
var uri;
|
|
536
|
-
if (node && this.is('rendered') && this.selectionComponent) {
|
|
537
|
-
uri = _.isString(node) ? node : node.uri;
|
|
538
|
-
return this.selectionComponent.hasNode(uri);
|
|
539
|
-
}
|
|
540
|
-
return false;
|
|
541
|
-
},
|
|
542
|
-
|
|
543
|
-
/**
|
|
544
|
-
* Get the type of a node, usually instance or class
|
|
545
|
-
*
|
|
546
|
-
* @param {Object|String} node - the node or directly the URI
|
|
547
|
-
* @param {String} [node.uri]
|
|
548
|
-
* @returns {String|Boolean} one of the nodeTypes or false
|
|
549
|
-
*/
|
|
550
|
-
getNodeType: function getNodeType(node) {
|
|
551
|
-
var uri;
|
|
552
|
-
var foundNode;
|
|
553
|
-
if (node && this.is('rendered') && this.selectionComponent) {
|
|
554
|
-
uri = _.isString(node) ? node : node.uri;
|
|
555
|
-
foundNode = this.selectionComponent.getNode(uri);
|
|
556
|
-
return foundNode && foundNode.type;
|
|
557
|
-
}
|
|
558
|
-
return false;
|
|
559
|
-
},
|
|
560
|
-
|
|
561
|
-
/**
|
|
562
|
-
* Select a node manually
|
|
563
|
-
*
|
|
564
|
-
* @param {Object|String} node - the node to select or directly the URI
|
|
565
|
-
* @param {String} [node.uri]
|
|
566
|
-
* @returns {resourceSelector} chains
|
|
567
|
-
*/
|
|
568
|
-
select: function select(node) {
|
|
569
|
-
var uri = _.isString(node) ? node : node.uri;
|
|
570
|
-
|
|
571
|
-
if (this.hasNode(uri)) {
|
|
572
|
-
if (!this.is('multiple')) {
|
|
573
|
-
this.selectionComponent.clearSelection();
|
|
574
|
-
}
|
|
575
|
-
this.selectionComponent.select(uri);
|
|
576
|
-
|
|
577
|
-
$(`[data-uri="${uri}"]`, $resultArea)[0].scrollIntoView({
|
|
578
|
-
behavior: 'smooth'
|
|
579
|
-
});
|
|
580
|
-
}
|
|
581
|
-
return this;
|
|
582
|
-
},
|
|
583
|
-
|
|
584
|
-
/**
|
|
585
|
-
* Select the default node, then fallback to 1st instance then 1st class
|
|
586
|
-
*
|
|
587
|
-
* @param {Object|String} node - the node to select or directly the URI
|
|
588
|
-
* @param {String} [node.uri]
|
|
589
|
-
* @param {Boolean} [fallback=true] - apply the fallback ?
|
|
590
|
-
* @returns {resourceSelector} chains
|
|
591
|
-
*/
|
|
592
|
-
selectDefaultNode: function selectDefaultNode(node, fallback) {
|
|
593
|
-
var $resource;
|
|
594
|
-
|
|
595
|
-
if (this.is('rendered')) {
|
|
596
|
-
if (this.hasNode(node)) {
|
|
597
|
-
this.select(node);
|
|
598
|
-
} else if (fallback !== false) {
|
|
599
|
-
$resource = this.getElement().find(
|
|
600
|
-
`.${nodeTypes.instance}`
|
|
601
|
-
);
|
|
602
|
-
if (!$resource.length) {
|
|
603
|
-
$resource = this.getElement().find(
|
|
604
|
-
`.${nodeTypes.class}`
|
|
605
|
-
);
|
|
606
|
-
}
|
|
607
|
-
if ($resource.length) {
|
|
608
|
-
this.select($resource.first().data('uri'));
|
|
609
|
-
}
|
|
610
|
-
}
|
|
611
|
-
}
|
|
612
|
-
return this;
|
|
613
|
-
},
|
|
614
|
-
|
|
615
|
-
/**
|
|
616
|
-
* Refresh and select the given node
|
|
617
|
-
*
|
|
618
|
-
* @param {Object|String} node - the node to select or directly the URI
|
|
619
|
-
* @param {String} [node.uri]
|
|
620
|
-
* @returns {resourceSelector} chains
|
|
621
|
-
*/
|
|
622
|
-
refresh: function refresh(node) {
|
|
623
|
-
var queryParams = {
|
|
624
|
-
updateClasses: true
|
|
625
|
-
};
|
|
626
|
-
if (this.is('rendered')) {
|
|
627
|
-
this.on('update.refresh', function () {
|
|
628
|
-
this.off('update.refresh');
|
|
629
|
-
this.selectDefaultNode(node);
|
|
630
|
-
});
|
|
631
|
-
if (node && node.uri) {
|
|
632
|
-
queryParams.selectedUri = node.uri;
|
|
633
|
-
}
|
|
634
|
-
this.reset().query(queryParams);
|
|
635
|
-
}
|
|
636
|
-
return this;
|
|
637
|
-
}
|
|
638
|
-
};
|
|
639
|
-
|
|
640
|
-
/**
|
|
641
|
-
* The resource selector component
|
|
642
|
-
* @typedef {ui/component} resourceSelector
|
|
643
|
-
*/
|
|
644
|
-
var resourceSelector = component(resourceSelectorApi, defaultConfig)
|
|
645
|
-
.setTemplate(selectorTpl)
|
|
646
|
-
.on('init', function () {
|
|
647
|
-
this.searchQuery = {};
|
|
648
|
-
this.classUri = this.config.classUri;
|
|
649
|
-
this.format =
|
|
650
|
-
this.config.format ||
|
|
651
|
-
_.findKey(this.config.formats, { active: true });
|
|
652
|
-
this.config.switchMode =
|
|
653
|
-
this.config.selectionMode === selectionModes.both;
|
|
654
|
-
this.config.multiple =
|
|
655
|
-
this.config.selectionMode === selectionModes.multiple;
|
|
656
|
-
this.setState('multiple', this.config.multiple);
|
|
657
|
-
|
|
658
|
-
this.render($container);
|
|
659
|
-
})
|
|
660
|
-
.on('render', function () {
|
|
661
|
-
var self = this;
|
|
662
|
-
|
|
663
|
-
//we ensure the sub-components are rendered
|
|
664
|
-
return new Promise(function (resolve) {
|
|
665
|
-
var $component = self.getElement();
|
|
666
|
-
|
|
667
|
-
$classContainer = $('.class-context', $component);
|
|
668
|
-
$resultArea = $('main', $component);
|
|
669
|
-
$noResults = $('.no-results', $resultArea);
|
|
670
|
-
$searchField = $('.search input', $component);
|
|
671
|
-
$filterToggle = $('.filters-opener', $component);
|
|
672
|
-
$filterContainer = $('.filters-container', $component);
|
|
673
|
-
$viewFormats = $('.context > a', $component);
|
|
674
|
-
$selectNum = $('.selected-num', $component);
|
|
675
|
-
$selectCtrl = $('.selection-control input', $component);
|
|
676
|
-
$selectCtrlLabel = $('.selection-control label', $component);
|
|
677
|
-
$selectionToggle = $('.selection-toggle', $component);
|
|
678
|
-
|
|
679
|
-
//the search field
|
|
680
|
-
$searchField.on(
|
|
681
|
-
'keyup',
|
|
682
|
-
_.debounce(function (e) {
|
|
683
|
-
var value = $(this).val().trim();
|
|
684
|
-
if (
|
|
685
|
-
value.length > 2 ||
|
|
686
|
-
value.length === 0 ||
|
|
687
|
-
e.which === 13
|
|
688
|
-
) {
|
|
689
|
-
if (self.config.filters) {
|
|
690
|
-
//reset the placeholder
|
|
691
|
-
$(this)
|
|
692
|
-
.attr('title', null)
|
|
693
|
-
.attr(
|
|
694
|
-
'placeholder',
|
|
695
|
-
self.config.searchPlaceholder
|
|
696
|
-
);
|
|
697
|
-
}
|
|
698
|
-
self.empty()
|
|
699
|
-
.changeFormat('list')
|
|
700
|
-
.setSearchQuery(value)
|
|
701
|
-
.query();
|
|
702
|
-
}
|
|
703
|
-
}, 300)
|
|
704
|
-
);
|
|
705
|
-
|
|
706
|
-
//the format switcher
|
|
707
|
-
$viewFormats.on('click', function (e) {
|
|
708
|
-
var $target = $(this);
|
|
709
|
-
var format = $target.data('view-format');
|
|
710
|
-
e.preventDefault();
|
|
711
|
-
|
|
712
|
-
self.reset().changeFormat(format).query();
|
|
713
|
-
});
|
|
714
|
-
|
|
715
|
-
//mode switcher (multiple/single)
|
|
716
|
-
if (self.config.selectionMode === selectionModes.both) {
|
|
717
|
-
//click the toggler
|
|
718
|
-
$selectionToggle.on('click', function (e) {
|
|
719
|
-
e.preventDefault();
|
|
720
|
-
self.changeSelectionMode(
|
|
721
|
-
self.config.multiple
|
|
722
|
-
? selectionModes.single
|
|
723
|
-
: selectionModes.multiple
|
|
724
|
-
);
|
|
725
|
-
});
|
|
726
|
-
|
|
727
|
-
//CTRL-Click
|
|
728
|
-
$resultArea.on('mousedown', function (e) {
|
|
729
|
-
if (e.ctrlKey && !self.config.multiple) {
|
|
730
|
-
self.changeSelectionMode(selectionModes.multiple);
|
|
731
|
-
}
|
|
732
|
-
});
|
|
733
|
-
|
|
734
|
-
//switch back to sinlge
|
|
735
|
-
$resultArea.on('click', function () {
|
|
736
|
-
self.changeSelectionMode(selectionModes.single);
|
|
737
|
-
});
|
|
738
|
-
}
|
|
739
|
-
|
|
740
|
-
//the select all control
|
|
741
|
-
$selectCtrl.on('change', function () {
|
|
742
|
-
if ($(this).prop('checked') === false) {
|
|
743
|
-
self.selectionComponent.clearSelection();
|
|
744
|
-
} else if (
|
|
745
|
-
self.config.selectAllPolicy ===
|
|
746
|
-
selectAllPolicies.visible
|
|
747
|
-
) {
|
|
748
|
-
self.selectionComponent.selectVisible();
|
|
749
|
-
} else if (
|
|
750
|
-
self.config.selectAllPolicy === selectAllPolicies.loaded
|
|
751
|
-
) {
|
|
752
|
-
self.selectionComponent.selectAll();
|
|
753
|
-
}
|
|
754
|
-
});
|
|
755
|
-
|
|
756
|
-
//the advanced filters
|
|
757
|
-
if (self.config.filters !== false) {
|
|
758
|
-
self.filtersComponent = filtersFactory($filterContainer, {
|
|
759
|
-
classUri: self.classUri,
|
|
760
|
-
data: self.config.filters
|
|
761
|
-
}).on('change', function (values) {
|
|
762
|
-
var textualQuery = this.getTextualQuery();
|
|
763
|
-
|
|
764
|
-
$searchField
|
|
765
|
-
.val('')
|
|
766
|
-
.attr('title', textualQuery)
|
|
767
|
-
.attr('placeholder', textualQuery);
|
|
768
|
-
|
|
769
|
-
self.empty()
|
|
770
|
-
.changeFormat('list')
|
|
771
|
-
.setSearchQuery(values)
|
|
772
|
-
.query();
|
|
773
|
-
|
|
774
|
-
$filterContainer.addClass('folded');
|
|
775
|
-
});
|
|
776
|
-
|
|
777
|
-
$filterToggle.on('click', function (e) {
|
|
778
|
-
var searchVal;
|
|
779
|
-
e.preventDefault();
|
|
780
|
-
|
|
781
|
-
if ($filterContainer.hasClass('folded')) {
|
|
782
|
-
//if a value is in the search field, we add it to the label
|
|
783
|
-
searchVal = $searchField.val().trim();
|
|
784
|
-
if (!_.isEmpty(searchVal)) {
|
|
785
|
-
self.filtersComponent.setValue(
|
|
786
|
-
labelUri,
|
|
787
|
-
searchVal
|
|
788
|
-
);
|
|
789
|
-
}
|
|
790
|
-
$filterContainer.removeClass('folded');
|
|
791
|
-
} else {
|
|
792
|
-
$filterContainer.addClass('folded');
|
|
793
|
-
}
|
|
794
|
-
});
|
|
795
|
-
}
|
|
796
|
-
|
|
797
|
-
//initialize the class selector
|
|
798
|
-
self.classSelector = classesSelectorFactory(
|
|
799
|
-
$classContainer,
|
|
800
|
-
self.config
|
|
801
|
-
);
|
|
802
|
-
self.classSelector
|
|
803
|
-
.on('render', resolve)
|
|
804
|
-
.on('change', function (uri) {
|
|
805
|
-
if (uri && uri !== self.classUri) {
|
|
806
|
-
self.classUri = uri;
|
|
807
|
-
|
|
808
|
-
//close the filters
|
|
809
|
-
if ($filterContainer.length) {
|
|
810
|
-
$filterContainer.addClass('folded');
|
|
811
|
-
}
|
|
812
|
-
|
|
813
|
-
/**
|
|
814
|
-
* When the component's root class URI changes
|
|
815
|
-
* @event resourceSelector#classchange
|
|
816
|
-
* @param {String} classUri - the new class URI
|
|
817
|
-
*/
|
|
818
|
-
self.trigger('classchange', uri);
|
|
819
|
-
|
|
820
|
-
self.reset().query();
|
|
821
|
-
}
|
|
822
|
-
});
|
|
823
|
-
|
|
824
|
-
self.query();
|
|
825
|
-
});
|
|
826
|
-
})
|
|
827
|
-
.on('change', function (selected, onlyVisible) {
|
|
828
|
-
var selectedCount = _.size(selected);
|
|
829
|
-
var nodesCount = onlyVisible
|
|
830
|
-
? selectedCount
|
|
831
|
-
: _.size(this.selectionComponent.getNodes());
|
|
832
|
-
|
|
833
|
-
//the number selected at the bottom
|
|
834
|
-
$selectNum.text(selectedCount);
|
|
835
|
-
|
|
836
|
-
//update the state of the "Select All" checkbox
|
|
837
|
-
if (selectedCount === 0) {
|
|
838
|
-
$selectCtrlLabel.attr(
|
|
839
|
-
'title',
|
|
840
|
-
__('Select loaded %s', this.config.type)
|
|
841
|
-
);
|
|
842
|
-
$selectCtrl.prop('checked', false).prop('indeterminate', false);
|
|
843
|
-
// if all of the nodes are selected (or more in the closed subclasses)
|
|
844
|
-
} else if (selectedCount >= nodesCount) {
|
|
845
|
-
$selectCtrlLabel.attr('title', __('Clear selection'));
|
|
846
|
-
$selectCtrl.prop('checked', true).prop('indeterminate', false);
|
|
847
|
-
} else {
|
|
848
|
-
$selectCtrlLabel.attr(
|
|
849
|
-
'title',
|
|
850
|
-
__('Select loaded %s', this.config.type)
|
|
851
|
-
);
|
|
852
|
-
$selectCtrl.prop('checked', false).prop('indeterminate', true);
|
|
853
|
-
}
|
|
854
|
-
});
|
|
855
|
-
|
|
856
|
-
_.defer(function () {
|
|
857
|
-
resourceSelector.init(config);
|
|
858
|
-
});
|
|
859
|
-
return resourceSelector;
|
|
860
|
-
};
|
|
861
|
-
|
|
862
|
-
//Exposes the selection modes
|
|
863
|
-
resourceSelectorFactory.selectionModes = selectionModes;
|
|
864
|
-
|
|
865
|
-
//Exposes the selectAllPolicies
|
|
866
|
-
resourceSelectorFactory.selectAllPolicies = selectAllPolicies;
|
|
867
|
-
|
|
868
|
-
//Exposes the node types
|
|
869
|
-
resourceSelectorFactory.nodeTypes = nodeTypes;
|
|
870
|
-
|
|
871
|
-
export default resourceSelectorFactory;
|
|
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) 2017-2019 (original work) Open Assessment Technologies SA ;
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* The resource selector component
|
|
21
|
+
* Handles multiple view/selection formats (now tree and list).
|
|
22
|
+
*
|
|
23
|
+
* Let's you change the root class and filter by labels.
|
|
24
|
+
*
|
|
25
|
+
* The data flow is based on the query/update model :
|
|
26
|
+
*
|
|
27
|
+
* @example
|
|
28
|
+
* resourceSelectorFactory(container, config)
|
|
29
|
+
* .on('query', function(params){
|
|
30
|
+
* var self = this;
|
|
31
|
+
* fetch('someurl', params).then(nodes){
|
|
32
|
+
* self.update(nodedata, params);
|
|
33
|
+
* });
|
|
34
|
+
* });
|
|
35
|
+
*
|
|
36
|
+
* FIXME search and advanced search switch to the list format
|
|
37
|
+
* because backend implementation doesn't support well the
|
|
38
|
+
* tree behavior.
|
|
39
|
+
*
|
|
40
|
+
* @author Bertrand Chevrier <bertrand@taotesting.com>
|
|
41
|
+
*/
|
|
42
|
+
import $ from 'jquery';
|
|
43
|
+
import _ from 'lodash';
|
|
44
|
+
import __ from 'i18n';
|
|
45
|
+
import component from 'ui/component';
|
|
46
|
+
import hider from 'ui/hider';
|
|
47
|
+
import classesSelectorFactory from 'ui/class/selector';
|
|
48
|
+
import treeFactory from 'ui/resource/tree';
|
|
49
|
+
import listFactory from 'ui/resource/list';
|
|
50
|
+
import filtersFactory from 'ui/resource/filters';
|
|
51
|
+
import selectorTpl from 'ui/resource/tpl/selector';
|
|
52
|
+
import 'ui/resource/css/selector.css';
|
|
53
|
+
|
|
54
|
+
var labelUri = 'http://www.w3.org/2000/01/rdf-schema#label';
|
|
55
|
+
|
|
56
|
+
var nodeTypes = {
|
|
57
|
+
instance: 'instance',
|
|
58
|
+
class: 'class'
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
var selectionModes = {
|
|
62
|
+
single: 'single',
|
|
63
|
+
multiple: 'multiple',
|
|
64
|
+
both: 'both'
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
var selectAllPolicies = {
|
|
68
|
+
all: 'all', // should select 100% of the nodes, but currently not implementable due to lazy loading
|
|
69
|
+
loaded: 'loaded', // selects all loaded nodes, whether visible or not
|
|
70
|
+
visible: 'visible' // selects only visible nodes
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
var defaultConfig = {
|
|
74
|
+
type: __('resources'),
|
|
75
|
+
noResultsText: _('No resources found'),
|
|
76
|
+
searchPlaceholder: __('Search'),
|
|
77
|
+
icon: 'item',
|
|
78
|
+
selectionMode: selectionModes.single,
|
|
79
|
+
selectClass: false,
|
|
80
|
+
selectAllPolicy: selectAllPolicies.loaded,
|
|
81
|
+
filters: false,
|
|
82
|
+
showContext: true,
|
|
83
|
+
showSelection: true,
|
|
84
|
+
formats: {
|
|
85
|
+
list: {
|
|
86
|
+
icon: 'icon-ul',
|
|
87
|
+
title: __('View resources as a list'),
|
|
88
|
+
componentFactory: listFactory
|
|
89
|
+
},
|
|
90
|
+
tree: {
|
|
91
|
+
icon: 'icon-tree',
|
|
92
|
+
title: __('View resources as a tree'),
|
|
93
|
+
componentFactory: treeFactory,
|
|
94
|
+
active: true
|
|
95
|
+
}
|
|
96
|
+
},
|
|
97
|
+
limit: 30
|
|
98
|
+
};
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* Filter and extract classes from a resource tree
|
|
102
|
+
* @param {Object[]} resources - the resource tree
|
|
103
|
+
* @returns {Object[]} contains only classes with URI and label
|
|
104
|
+
*/
|
|
105
|
+
var filterClasses = function filterClasses(resources) {
|
|
106
|
+
return _(resources)
|
|
107
|
+
.filter({ type: nodeTypes.class })
|
|
108
|
+
.map(function (resource) {
|
|
109
|
+
var classNode = _.pick(resource, ['uri', 'label', 'state']);
|
|
110
|
+
|
|
111
|
+
if (resource.children) {
|
|
112
|
+
classNode.children = filterClasses(resource.children);
|
|
113
|
+
}
|
|
114
|
+
return classNode;
|
|
115
|
+
})
|
|
116
|
+
.value();
|
|
117
|
+
};
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* The factory that creates the resource selector component
|
|
121
|
+
*
|
|
122
|
+
* @param {jQueryElement} $container - where to append the component
|
|
123
|
+
* @param {Object} config - the component config
|
|
124
|
+
* @param {String} config.classUri - the root Class URI
|
|
125
|
+
* @param {Object|[]} [config.classes] - the classes hierarchy for the class selector
|
|
126
|
+
* @param {Object[]} config.formats - the definition of the supported viewer/selector component
|
|
127
|
+
* @param {Object[]} [config.nodes] - the nodes to preload, the format is up to the formatComponent
|
|
128
|
+
* @param {String} [config.icon] - the icon class that represents a resource
|
|
129
|
+
* @param {String} [config.type] - describes the resource type
|
|
130
|
+
* @param {Boolean} [config.selectionMode] - multiple or single selection mode
|
|
131
|
+
* @param {Number} [config.limit = 30] - the default page size for data paging
|
|
132
|
+
* @param {Object|Boolean} [config.filters = false] - false or filters config, see ui/resource/filters
|
|
133
|
+
* @param {Boolean} [config.showContext = true] - show the context bar (class and format switch)
|
|
134
|
+
* @param {Boolean} [config.showSelection = true] - show the selection bar (search, multi switch and select all)
|
|
135
|
+
* @returns {resourceSelector} the component
|
|
136
|
+
*/
|
|
137
|
+
var resourceSelectorFactory = function resourceSelectorFactory(
|
|
138
|
+
$container,
|
|
139
|
+
config
|
|
140
|
+
) {
|
|
141
|
+
var $classContainer;
|
|
142
|
+
var $resultArea;
|
|
143
|
+
var $noResults;
|
|
144
|
+
var $searchField;
|
|
145
|
+
var $viewFormats;
|
|
146
|
+
var $selectNum;
|
|
147
|
+
var $selectCtrl;
|
|
148
|
+
var $selectCtrlLabel;
|
|
149
|
+
var $filterToggle;
|
|
150
|
+
var $filterContainer;
|
|
151
|
+
var $selectionToggle;
|
|
152
|
+
|
|
153
|
+
var resourceSelectorApi = {
|
|
154
|
+
/**
|
|
155
|
+
* Empty the selection component
|
|
156
|
+
* @returns {resourceSelector} chains
|
|
157
|
+
* @fires resourceSelector#empty
|
|
158
|
+
*/
|
|
159
|
+
empty: function empty() {
|
|
160
|
+
if (this.is('rendered')) {
|
|
161
|
+
if (this.selectionComponent) {
|
|
162
|
+
this.selectionComponent.destroy();
|
|
163
|
+
this.selectionComponent = null;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
return this.trigger('empty');
|
|
167
|
+
},
|
|
168
|
+
|
|
169
|
+
/**
|
|
170
|
+
* Reset the selector
|
|
171
|
+
* @returns {resourceSelector} chains
|
|
172
|
+
* @fires resourceSelector#reset
|
|
173
|
+
*/
|
|
174
|
+
reset: function reset() {
|
|
175
|
+
if (this.is('rendered')) {
|
|
176
|
+
this.empty();
|
|
177
|
+
|
|
178
|
+
this.searchQuery = {};
|
|
179
|
+
|
|
180
|
+
if (this.config.filters) {
|
|
181
|
+
if (this.filtersComponent) {
|
|
182
|
+
this.filtersComponent.reset();
|
|
183
|
+
}
|
|
184
|
+
$searchField
|
|
185
|
+
.val('')
|
|
186
|
+
.attr('title', null)
|
|
187
|
+
.attr('placeholder', this.config.searchPlaceholder);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
return this.trigger('reset');
|
|
191
|
+
},
|
|
192
|
+
|
|
193
|
+
/**
|
|
194
|
+
* Get the selected nodes
|
|
195
|
+
* @returns {Object?} the selection
|
|
196
|
+
*/
|
|
197
|
+
getSelection: function getSelection() {
|
|
198
|
+
if (this.selectionComponent) {
|
|
199
|
+
return this.selectionComponent.getSelection();
|
|
200
|
+
}
|
|
201
|
+
return null;
|
|
202
|
+
},
|
|
203
|
+
|
|
204
|
+
/**
|
|
205
|
+
* Clear the current selection
|
|
206
|
+
* @returns {resourceSelector} chains
|
|
207
|
+
*/
|
|
208
|
+
clearSelection: function clearSelection() {
|
|
209
|
+
if (this.selectionComponent) {
|
|
210
|
+
this.selectionComponent.clearSelection();
|
|
211
|
+
}
|
|
212
|
+
return this;
|
|
213
|
+
},
|
|
214
|
+
|
|
215
|
+
/**
|
|
216
|
+
* Set the search query
|
|
217
|
+
* @param {String|Object} query - label query if string or property filters
|
|
218
|
+
* @returns {resourceSelector} chains
|
|
219
|
+
*/
|
|
220
|
+
setSearchQuery: function setSearchQuery(query) {
|
|
221
|
+
this.searchQuery = {};
|
|
222
|
+
this.searchQuery[labelUri] = '';
|
|
223
|
+
|
|
224
|
+
if (_.isString(query) && !_.isEmpty(query)) {
|
|
225
|
+
this.searchQuery[labelUri] = query;
|
|
226
|
+
}
|
|
227
|
+
if (_.isPlainObject(query)) {
|
|
228
|
+
this.searchQuery = query;
|
|
229
|
+
}
|
|
230
|
+
return this;
|
|
231
|
+
},
|
|
232
|
+
|
|
233
|
+
/**
|
|
234
|
+
* Clear the search query to submit
|
|
235
|
+
* @returns {Object} the query
|
|
236
|
+
*/
|
|
237
|
+
getSearchQuery: function getSearchQuery() {
|
|
238
|
+
if (_.size(this.searchQuery) === 0) {
|
|
239
|
+
this.searchQuery[labelUri] = '';
|
|
240
|
+
}
|
|
241
|
+
return this.searchQuery;
|
|
242
|
+
},
|
|
243
|
+
|
|
244
|
+
/**
|
|
245
|
+
* Ask for a query (forward the event)
|
|
246
|
+
* @param {Object} [params] - the query parameters
|
|
247
|
+
* @param {String} [params.classUri] - the current node class URI
|
|
248
|
+
* @param {String} [params.format] - the selected format
|
|
249
|
+
* @param {String} [params.search] - the search query
|
|
250
|
+
* @param {Number} [params.offset = 0] - for paging
|
|
251
|
+
* @param {Number} [params.limit] - for paging
|
|
252
|
+
* @returns {resourceSelector} chains
|
|
253
|
+
* @fires resourceSelector#query
|
|
254
|
+
*/
|
|
255
|
+
query: function query(params) {
|
|
256
|
+
var defaultParams;
|
|
257
|
+
var search;
|
|
258
|
+
if (this.is('rendered') && !this.is('loading')) {
|
|
259
|
+
this.setState('loading', true);
|
|
260
|
+
|
|
261
|
+
params = params || {};
|
|
262
|
+
search = this.getSearchQuery();
|
|
263
|
+
defaultParams = {
|
|
264
|
+
classUri: this.classUri,
|
|
265
|
+
format: this.format,
|
|
266
|
+
limit: this.config.limit,
|
|
267
|
+
search: _.isObject(search) ? JSON.stringify(search) : ''
|
|
268
|
+
};
|
|
269
|
+
|
|
270
|
+
/**
|
|
271
|
+
* Formulate the query
|
|
272
|
+
* @event resourceSelector#query
|
|
273
|
+
* @param {Object} params - see format above
|
|
274
|
+
*/
|
|
275
|
+
this.trigger('query', _.defaults(params, defaultParams));
|
|
276
|
+
}
|
|
277
|
+
return this;
|
|
278
|
+
},
|
|
279
|
+
|
|
280
|
+
/**
|
|
281
|
+
* Switch the format, so the viewer/selector component
|
|
282
|
+
* @param {String} format - the new format
|
|
283
|
+
* @returns {resourceSelector} chains
|
|
284
|
+
* @fires resourceSelector#formatchange
|
|
285
|
+
*/
|
|
286
|
+
changeFormat: function changeFormat(format) {
|
|
287
|
+
var $viewFormat;
|
|
288
|
+
if (this.is('rendered') && this.format !== format) {
|
|
289
|
+
$viewFormat = $viewFormats.filter(
|
|
290
|
+
`[data-view-format="${format}"]`
|
|
291
|
+
);
|
|
292
|
+
if (
|
|
293
|
+
$viewFormat.length === 1 &&
|
|
294
|
+
!$viewFormat.hasClass('active')
|
|
295
|
+
) {
|
|
296
|
+
$viewFormats.removeClass('active');
|
|
297
|
+
$viewFormat.addClass('active');
|
|
298
|
+
|
|
299
|
+
this.empty();
|
|
300
|
+
|
|
301
|
+
this.format = format;
|
|
302
|
+
|
|
303
|
+
/**
|
|
304
|
+
* The view format has changed
|
|
305
|
+
* @event resourceSelector#formatchange
|
|
306
|
+
* @param {String} format - the new format name
|
|
307
|
+
*/
|
|
308
|
+
this.trigger('formatchange', format);
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
return this;
|
|
312
|
+
},
|
|
313
|
+
|
|
314
|
+
/**
|
|
315
|
+
* Let's you change the selection mode
|
|
316
|
+
* @param {String} newMode - single or multiple
|
|
317
|
+
* @returns {resourceSelector} chains
|
|
318
|
+
*/
|
|
319
|
+
changeSelectionMode: function changeSelectionMode(newMode) {
|
|
320
|
+
if (
|
|
321
|
+
this.is('rendered') &&
|
|
322
|
+
this.config.selectionMode !== newMode &&
|
|
323
|
+
selectionModes[newMode]
|
|
324
|
+
) {
|
|
325
|
+
if (this.config.multiple) {
|
|
326
|
+
this.clearSelection();
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
this.config.multiple = newMode === selectionModes.multiple;
|
|
330
|
+
this.selectionComponent.setState(
|
|
331
|
+
'multiple',
|
|
332
|
+
this.config.multiple
|
|
333
|
+
);
|
|
334
|
+
this.setState('multiple', this.config.multiple);
|
|
335
|
+
|
|
336
|
+
if (this.config.multiple) {
|
|
337
|
+
hider.show($selectCtrlLabel);
|
|
338
|
+
} else {
|
|
339
|
+
hider.hide($selectCtrlLabel);
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
/**
|
|
343
|
+
* The selection mode has changed
|
|
344
|
+
* @event resourceSelector#selectionmodechange
|
|
345
|
+
* @param {String} newMode - the new selection mode
|
|
346
|
+
*/
|
|
347
|
+
this.trigger('selectionmodechange', newMode);
|
|
348
|
+
}
|
|
349
|
+
return this;
|
|
350
|
+
},
|
|
351
|
+
|
|
352
|
+
/**
|
|
353
|
+
* Update the component with the given resources
|
|
354
|
+
* @param {Object[]} resources - the data, with at least a URI as key and as property
|
|
355
|
+
* @param {Object} params - the query parameters
|
|
356
|
+
* @returns {resourceSelector} chains
|
|
357
|
+
* @fires resourceSelector#update
|
|
358
|
+
* @fires resourceSelector#change
|
|
359
|
+
* @fires resourceSelector#error
|
|
360
|
+
*/
|
|
361
|
+
update: function update(resources, params) {
|
|
362
|
+
var self = this;
|
|
363
|
+
|
|
364
|
+
var componentFactory;
|
|
365
|
+
|
|
366
|
+
if (this.is('rendered') && this.format) {
|
|
367
|
+
componentFactory =
|
|
368
|
+
this.config.formats[this.format] &&
|
|
369
|
+
this.config.formats[this.format].componentFactory;
|
|
370
|
+
if (!_.isFunction(componentFactory)) {
|
|
371
|
+
return this.trigger(
|
|
372
|
+
'error',
|
|
373
|
+
new TypeError(
|
|
374
|
+
`Unable to load the component for the format ${this.format}`
|
|
375
|
+
)
|
|
376
|
+
);
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
hider.hide($noResults);
|
|
380
|
+
|
|
381
|
+
if (params.updateClasses && this.classSelector) {
|
|
382
|
+
this.classSelector.updateNodes(filterClasses(resources));
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
if (!this.selectionComponent) {
|
|
386
|
+
this.selectionComponent = componentFactory(
|
|
387
|
+
$resultArea,
|
|
388
|
+
_.defaults(
|
|
389
|
+
{
|
|
390
|
+
classUri: this.classUri,
|
|
391
|
+
nodes: resources
|
|
392
|
+
},
|
|
393
|
+
this.config
|
|
394
|
+
)
|
|
395
|
+
)
|
|
396
|
+
.on('query', function (queryParams) {
|
|
397
|
+
self.query(queryParams);
|
|
398
|
+
})
|
|
399
|
+
.on('update', function () {
|
|
400
|
+
if (
|
|
401
|
+
_.size(this.getNodes()) === 0 &&
|
|
402
|
+
$('li', $resultArea).length === 0
|
|
403
|
+
) {
|
|
404
|
+
hider.show($noResults);
|
|
405
|
+
}
|
|
406
|
+
self.trigger('update');
|
|
407
|
+
})
|
|
408
|
+
.on('change', function (selected, onlyVisible) {
|
|
409
|
+
self.trigger('change', selected, onlyVisible);
|
|
410
|
+
})
|
|
411
|
+
.on('error', function (err) {
|
|
412
|
+
self.trigger('error', err);
|
|
413
|
+
});
|
|
414
|
+
} else {
|
|
415
|
+
this.selectionComponent.update(resources, params);
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
this.setState('loading', false);
|
|
419
|
+
}
|
|
420
|
+
return this;
|
|
421
|
+
},
|
|
422
|
+
|
|
423
|
+
/**
|
|
424
|
+
* Update the filters component
|
|
425
|
+
* @param {Object?} filterConfig - the new filter configuration
|
|
426
|
+
* @returns {resourceSelector} chains
|
|
427
|
+
*/
|
|
428
|
+
updateFilters: function updateFilters(filterConfig) {
|
|
429
|
+
if (
|
|
430
|
+
this.is('rendered') &&
|
|
431
|
+
filterConfig !== false &&
|
|
432
|
+
this.filtersComponent
|
|
433
|
+
) {
|
|
434
|
+
this.filtersComponent.update(filterConfig);
|
|
435
|
+
}
|
|
436
|
+
return this;
|
|
437
|
+
},
|
|
438
|
+
|
|
439
|
+
/**
|
|
440
|
+
* Remove a given node, from the selection component and the node list.
|
|
441
|
+
*
|
|
442
|
+
* @param {Object|String} node - the node or the node URI
|
|
443
|
+
* @param {String} [node.uri]
|
|
444
|
+
* @returns {resourceSelector} chains
|
|
445
|
+
*/
|
|
446
|
+
removeNode: function removeNode(node) {
|
|
447
|
+
var uri = _.isString(node) ? node : node.uri;
|
|
448
|
+
if (this.hasNode(uri)) {
|
|
449
|
+
//update the class selector
|
|
450
|
+
if (
|
|
451
|
+
this.getNodeType(node) === nodeTypes.class &&
|
|
452
|
+
this.classSelector
|
|
453
|
+
) {
|
|
454
|
+
this.classSelector.removeNode(node);
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
this.selectionComponent.removeNode(uri);
|
|
458
|
+
}
|
|
459
|
+
return this;
|
|
460
|
+
},
|
|
461
|
+
|
|
462
|
+
/**
|
|
463
|
+
* Add manually a node.
|
|
464
|
+
*
|
|
465
|
+
* @param {Object} node - the node to add
|
|
466
|
+
* @param {String} node.uri
|
|
467
|
+
* @param {String} node.label
|
|
468
|
+
* @param {String} [node.type=instance] - instance or class
|
|
469
|
+
* @param {String} [parentUri] - where to append the new node
|
|
470
|
+
* @returns {resourceSelector} chains
|
|
471
|
+
*/
|
|
472
|
+
addNode: function addNode(node, parentUri) {
|
|
473
|
+
if (
|
|
474
|
+
this.is('rendered') &&
|
|
475
|
+
node &&
|
|
476
|
+
node.uri &&
|
|
477
|
+
this.selectionComponent
|
|
478
|
+
) {
|
|
479
|
+
if (!this.selectionComponent.hasNode(node.uri)) {
|
|
480
|
+
if (!node.type) {
|
|
481
|
+
node.type = nodeTypes.instance;
|
|
482
|
+
}
|
|
483
|
+
|
|
484
|
+
//update the selection component
|
|
485
|
+
this.selectionComponent.update([node], {
|
|
486
|
+
classUri: parentUri || this.classUri,
|
|
487
|
+
format: this.format,
|
|
488
|
+
limit: this.config.limit,
|
|
489
|
+
updateCount:
|
|
490
|
+
node.type === nodeTypes.instance ? 1 : false
|
|
491
|
+
});
|
|
492
|
+
|
|
493
|
+
//update the class selector
|
|
494
|
+
if (
|
|
495
|
+
this.getNodeType(node) === nodeTypes.class &&
|
|
496
|
+
this.classSelector
|
|
497
|
+
) {
|
|
498
|
+
this.classSelector.addNode(node, parentUri);
|
|
499
|
+
}
|
|
500
|
+
}
|
|
501
|
+
}
|
|
502
|
+
return this;
|
|
503
|
+
},
|
|
504
|
+
|
|
505
|
+
/**
|
|
506
|
+
* Add class to classSelector, no update of selectionComponent
|
|
507
|
+
*
|
|
508
|
+
* @param {Object} node - the class node to add
|
|
509
|
+
* @param {String} node.uri
|
|
510
|
+
* @param {String} node.label
|
|
511
|
+
* @param {String} parentUri - where to append the new node
|
|
512
|
+
* @returns {resourceSelector} chains
|
|
513
|
+
*/
|
|
514
|
+
addClassNode: function addClassNode(node, parentUri) {
|
|
515
|
+
if (this.is('rendered') && node && node.uri && this.classSelector) {
|
|
516
|
+
if (
|
|
517
|
+
!this.classSelector.hasNode(node.uri) &&
|
|
518
|
+
this.classSelector.hasNode(parentUri)
|
|
519
|
+
) {
|
|
520
|
+
//add node to the class selector
|
|
521
|
+
this.classSelector.addNode(node, parentUri);
|
|
522
|
+
}
|
|
523
|
+
}
|
|
524
|
+
return this;
|
|
525
|
+
},
|
|
526
|
+
|
|
527
|
+
/**
|
|
528
|
+
* Does the given node exists ?
|
|
529
|
+
*
|
|
530
|
+
* @param {Object|String} node - the node or directly the URI
|
|
531
|
+
* @param {String} [node.uri]
|
|
532
|
+
* @returns {Boolean}
|
|
533
|
+
*/
|
|
534
|
+
hasNode: function hasNode(node) {
|
|
535
|
+
var uri;
|
|
536
|
+
if (node && this.is('rendered') && this.selectionComponent) {
|
|
537
|
+
uri = _.isString(node) ? node : node.uri;
|
|
538
|
+
return this.selectionComponent.hasNode(uri);
|
|
539
|
+
}
|
|
540
|
+
return false;
|
|
541
|
+
},
|
|
542
|
+
|
|
543
|
+
/**
|
|
544
|
+
* Get the type of a node, usually instance or class
|
|
545
|
+
*
|
|
546
|
+
* @param {Object|String} node - the node or directly the URI
|
|
547
|
+
* @param {String} [node.uri]
|
|
548
|
+
* @returns {String|Boolean} one of the nodeTypes or false
|
|
549
|
+
*/
|
|
550
|
+
getNodeType: function getNodeType(node) {
|
|
551
|
+
var uri;
|
|
552
|
+
var foundNode;
|
|
553
|
+
if (node && this.is('rendered') && this.selectionComponent) {
|
|
554
|
+
uri = _.isString(node) ? node : node.uri;
|
|
555
|
+
foundNode = this.selectionComponent.getNode(uri);
|
|
556
|
+
return foundNode && foundNode.type;
|
|
557
|
+
}
|
|
558
|
+
return false;
|
|
559
|
+
},
|
|
560
|
+
|
|
561
|
+
/**
|
|
562
|
+
* Select a node manually
|
|
563
|
+
*
|
|
564
|
+
* @param {Object|String} node - the node to select or directly the URI
|
|
565
|
+
* @param {String} [node.uri]
|
|
566
|
+
* @returns {resourceSelector} chains
|
|
567
|
+
*/
|
|
568
|
+
select: function select(node) {
|
|
569
|
+
var uri = _.isString(node) ? node : node.uri;
|
|
570
|
+
|
|
571
|
+
if (this.hasNode(uri)) {
|
|
572
|
+
if (!this.is('multiple')) {
|
|
573
|
+
this.selectionComponent.clearSelection();
|
|
574
|
+
}
|
|
575
|
+
this.selectionComponent.select(uri);
|
|
576
|
+
|
|
577
|
+
$(`[data-uri="${uri}"]`, $resultArea)[0].scrollIntoView({
|
|
578
|
+
behavior: 'smooth'
|
|
579
|
+
});
|
|
580
|
+
}
|
|
581
|
+
return this;
|
|
582
|
+
},
|
|
583
|
+
|
|
584
|
+
/**
|
|
585
|
+
* Select the default node, then fallback to 1st instance then 1st class
|
|
586
|
+
*
|
|
587
|
+
* @param {Object|String} node - the node to select or directly the URI
|
|
588
|
+
* @param {String} [node.uri]
|
|
589
|
+
* @param {Boolean} [fallback=true] - apply the fallback ?
|
|
590
|
+
* @returns {resourceSelector} chains
|
|
591
|
+
*/
|
|
592
|
+
selectDefaultNode: function selectDefaultNode(node, fallback) {
|
|
593
|
+
var $resource;
|
|
594
|
+
|
|
595
|
+
if (this.is('rendered')) {
|
|
596
|
+
if (this.hasNode(node)) {
|
|
597
|
+
this.select(node);
|
|
598
|
+
} else if (fallback !== false) {
|
|
599
|
+
$resource = this.getElement().find(
|
|
600
|
+
`.${nodeTypes.instance}`
|
|
601
|
+
);
|
|
602
|
+
if (!$resource.length) {
|
|
603
|
+
$resource = this.getElement().find(
|
|
604
|
+
`.${nodeTypes.class}`
|
|
605
|
+
);
|
|
606
|
+
}
|
|
607
|
+
if ($resource.length) {
|
|
608
|
+
this.select($resource.first().data('uri'));
|
|
609
|
+
}
|
|
610
|
+
}
|
|
611
|
+
}
|
|
612
|
+
return this;
|
|
613
|
+
},
|
|
614
|
+
|
|
615
|
+
/**
|
|
616
|
+
* Refresh and select the given node
|
|
617
|
+
*
|
|
618
|
+
* @param {Object|String} node - the node to select or directly the URI
|
|
619
|
+
* @param {String} [node.uri]
|
|
620
|
+
* @returns {resourceSelector} chains
|
|
621
|
+
*/
|
|
622
|
+
refresh: function refresh(node) {
|
|
623
|
+
var queryParams = {
|
|
624
|
+
updateClasses: true
|
|
625
|
+
};
|
|
626
|
+
if (this.is('rendered')) {
|
|
627
|
+
this.on('update.refresh', function () {
|
|
628
|
+
this.off('update.refresh');
|
|
629
|
+
this.selectDefaultNode(node);
|
|
630
|
+
});
|
|
631
|
+
if (node && node.uri) {
|
|
632
|
+
queryParams.selectedUri = node.uri;
|
|
633
|
+
}
|
|
634
|
+
this.reset().query(queryParams);
|
|
635
|
+
}
|
|
636
|
+
return this;
|
|
637
|
+
}
|
|
638
|
+
};
|
|
639
|
+
|
|
640
|
+
/**
|
|
641
|
+
* The resource selector component
|
|
642
|
+
* @typedef {ui/component} resourceSelector
|
|
643
|
+
*/
|
|
644
|
+
var resourceSelector = component(resourceSelectorApi, defaultConfig)
|
|
645
|
+
.setTemplate(selectorTpl)
|
|
646
|
+
.on('init', function () {
|
|
647
|
+
this.searchQuery = {};
|
|
648
|
+
this.classUri = this.config.classUri;
|
|
649
|
+
this.format =
|
|
650
|
+
this.config.format ||
|
|
651
|
+
_.findKey(this.config.formats, { active: true });
|
|
652
|
+
this.config.switchMode =
|
|
653
|
+
this.config.selectionMode === selectionModes.both;
|
|
654
|
+
this.config.multiple =
|
|
655
|
+
this.config.selectionMode === selectionModes.multiple;
|
|
656
|
+
this.setState('multiple', this.config.multiple);
|
|
657
|
+
|
|
658
|
+
this.render($container);
|
|
659
|
+
})
|
|
660
|
+
.on('render', function () {
|
|
661
|
+
var self = this;
|
|
662
|
+
|
|
663
|
+
//we ensure the sub-components are rendered
|
|
664
|
+
return new Promise(function (resolve) {
|
|
665
|
+
var $component = self.getElement();
|
|
666
|
+
|
|
667
|
+
$classContainer = $('.class-context', $component);
|
|
668
|
+
$resultArea = $('main', $component);
|
|
669
|
+
$noResults = $('.no-results', $resultArea);
|
|
670
|
+
$searchField = $('.search input', $component);
|
|
671
|
+
$filterToggle = $('.filters-opener', $component);
|
|
672
|
+
$filterContainer = $('.filters-container', $component);
|
|
673
|
+
$viewFormats = $('.context > a', $component);
|
|
674
|
+
$selectNum = $('.selected-num', $component);
|
|
675
|
+
$selectCtrl = $('.selection-control input', $component);
|
|
676
|
+
$selectCtrlLabel = $('.selection-control label', $component);
|
|
677
|
+
$selectionToggle = $('.selection-toggle', $component);
|
|
678
|
+
|
|
679
|
+
//the search field
|
|
680
|
+
$searchField.on(
|
|
681
|
+
'keyup',
|
|
682
|
+
_.debounce(function (e) {
|
|
683
|
+
var value = $(this).val().trim();
|
|
684
|
+
if (
|
|
685
|
+
value.length > 2 ||
|
|
686
|
+
value.length === 0 ||
|
|
687
|
+
e.which === 13
|
|
688
|
+
) {
|
|
689
|
+
if (self.config.filters) {
|
|
690
|
+
//reset the placeholder
|
|
691
|
+
$(this)
|
|
692
|
+
.attr('title', null)
|
|
693
|
+
.attr(
|
|
694
|
+
'placeholder',
|
|
695
|
+
self.config.searchPlaceholder
|
|
696
|
+
);
|
|
697
|
+
}
|
|
698
|
+
self.empty()
|
|
699
|
+
.changeFormat('list')
|
|
700
|
+
.setSearchQuery(value)
|
|
701
|
+
.query();
|
|
702
|
+
}
|
|
703
|
+
}, 300)
|
|
704
|
+
);
|
|
705
|
+
|
|
706
|
+
//the format switcher
|
|
707
|
+
$viewFormats.on('click', function (e) {
|
|
708
|
+
var $target = $(this);
|
|
709
|
+
var format = $target.data('view-format');
|
|
710
|
+
e.preventDefault();
|
|
711
|
+
|
|
712
|
+
self.reset().changeFormat(format).query();
|
|
713
|
+
});
|
|
714
|
+
|
|
715
|
+
//mode switcher (multiple/single)
|
|
716
|
+
if (self.config.selectionMode === selectionModes.both) {
|
|
717
|
+
//click the toggler
|
|
718
|
+
$selectionToggle.on('click', function (e) {
|
|
719
|
+
e.preventDefault();
|
|
720
|
+
self.changeSelectionMode(
|
|
721
|
+
self.config.multiple
|
|
722
|
+
? selectionModes.single
|
|
723
|
+
: selectionModes.multiple
|
|
724
|
+
);
|
|
725
|
+
});
|
|
726
|
+
|
|
727
|
+
//CTRL-Click
|
|
728
|
+
$resultArea.on('mousedown', function (e) {
|
|
729
|
+
if (e.ctrlKey && !self.config.multiple) {
|
|
730
|
+
self.changeSelectionMode(selectionModes.multiple);
|
|
731
|
+
}
|
|
732
|
+
});
|
|
733
|
+
|
|
734
|
+
//switch back to sinlge
|
|
735
|
+
$resultArea.on('click', function () {
|
|
736
|
+
self.changeSelectionMode(selectionModes.single);
|
|
737
|
+
});
|
|
738
|
+
}
|
|
739
|
+
|
|
740
|
+
//the select all control
|
|
741
|
+
$selectCtrl.on('change', function () {
|
|
742
|
+
if ($(this).prop('checked') === false) {
|
|
743
|
+
self.selectionComponent.clearSelection();
|
|
744
|
+
} else if (
|
|
745
|
+
self.config.selectAllPolicy ===
|
|
746
|
+
selectAllPolicies.visible
|
|
747
|
+
) {
|
|
748
|
+
self.selectionComponent.selectVisible();
|
|
749
|
+
} else if (
|
|
750
|
+
self.config.selectAllPolicy === selectAllPolicies.loaded
|
|
751
|
+
) {
|
|
752
|
+
self.selectionComponent.selectAll();
|
|
753
|
+
}
|
|
754
|
+
});
|
|
755
|
+
|
|
756
|
+
//the advanced filters
|
|
757
|
+
if (self.config.filters !== false) {
|
|
758
|
+
self.filtersComponent = filtersFactory($filterContainer, {
|
|
759
|
+
classUri: self.classUri,
|
|
760
|
+
data: self.config.filters
|
|
761
|
+
}).on('change', function (values) {
|
|
762
|
+
var textualQuery = this.getTextualQuery();
|
|
763
|
+
|
|
764
|
+
$searchField
|
|
765
|
+
.val('')
|
|
766
|
+
.attr('title', textualQuery)
|
|
767
|
+
.attr('placeholder', textualQuery);
|
|
768
|
+
|
|
769
|
+
self.empty()
|
|
770
|
+
.changeFormat('list')
|
|
771
|
+
.setSearchQuery(values)
|
|
772
|
+
.query();
|
|
773
|
+
|
|
774
|
+
$filterContainer.addClass('folded');
|
|
775
|
+
});
|
|
776
|
+
|
|
777
|
+
$filterToggle.on('click', function (e) {
|
|
778
|
+
var searchVal;
|
|
779
|
+
e.preventDefault();
|
|
780
|
+
|
|
781
|
+
if ($filterContainer.hasClass('folded')) {
|
|
782
|
+
//if a value is in the search field, we add it to the label
|
|
783
|
+
searchVal = $searchField.val().trim();
|
|
784
|
+
if (!_.isEmpty(searchVal)) {
|
|
785
|
+
self.filtersComponent.setValue(
|
|
786
|
+
labelUri,
|
|
787
|
+
searchVal
|
|
788
|
+
);
|
|
789
|
+
}
|
|
790
|
+
$filterContainer.removeClass('folded');
|
|
791
|
+
} else {
|
|
792
|
+
$filterContainer.addClass('folded');
|
|
793
|
+
}
|
|
794
|
+
});
|
|
795
|
+
}
|
|
796
|
+
|
|
797
|
+
//initialize the class selector
|
|
798
|
+
self.classSelector = classesSelectorFactory(
|
|
799
|
+
$classContainer,
|
|
800
|
+
self.config
|
|
801
|
+
);
|
|
802
|
+
self.classSelector
|
|
803
|
+
.on('render', resolve)
|
|
804
|
+
.on('change', function (uri) {
|
|
805
|
+
if (uri && uri !== self.classUri) {
|
|
806
|
+
self.classUri = uri;
|
|
807
|
+
|
|
808
|
+
//close the filters
|
|
809
|
+
if ($filterContainer.length) {
|
|
810
|
+
$filterContainer.addClass('folded');
|
|
811
|
+
}
|
|
812
|
+
|
|
813
|
+
/**
|
|
814
|
+
* When the component's root class URI changes
|
|
815
|
+
* @event resourceSelector#classchange
|
|
816
|
+
* @param {String} classUri - the new class URI
|
|
817
|
+
*/
|
|
818
|
+
self.trigger('classchange', uri);
|
|
819
|
+
|
|
820
|
+
self.reset().query();
|
|
821
|
+
}
|
|
822
|
+
});
|
|
823
|
+
|
|
824
|
+
self.query();
|
|
825
|
+
});
|
|
826
|
+
})
|
|
827
|
+
.on('change', function (selected, onlyVisible) {
|
|
828
|
+
var selectedCount = _.size(selected);
|
|
829
|
+
var nodesCount = onlyVisible
|
|
830
|
+
? selectedCount
|
|
831
|
+
: _.size(this.selectionComponent.getNodes());
|
|
832
|
+
|
|
833
|
+
//the number selected at the bottom
|
|
834
|
+
$selectNum.text(selectedCount);
|
|
835
|
+
|
|
836
|
+
//update the state of the "Select All" checkbox
|
|
837
|
+
if (selectedCount === 0) {
|
|
838
|
+
$selectCtrlLabel.attr(
|
|
839
|
+
'title',
|
|
840
|
+
__('Select loaded %s', this.config.type)
|
|
841
|
+
);
|
|
842
|
+
$selectCtrl.prop('checked', false).prop('indeterminate', false);
|
|
843
|
+
// if all of the nodes are selected (or more in the closed subclasses)
|
|
844
|
+
} else if (selectedCount >= nodesCount) {
|
|
845
|
+
$selectCtrlLabel.attr('title', __('Clear selection'));
|
|
846
|
+
$selectCtrl.prop('checked', true).prop('indeterminate', false);
|
|
847
|
+
} else {
|
|
848
|
+
$selectCtrlLabel.attr(
|
|
849
|
+
'title',
|
|
850
|
+
__('Select loaded %s', this.config.type)
|
|
851
|
+
);
|
|
852
|
+
$selectCtrl.prop('checked', false).prop('indeterminate', true);
|
|
853
|
+
}
|
|
854
|
+
});
|
|
855
|
+
|
|
856
|
+
_.defer(function () {
|
|
857
|
+
resourceSelector.init(config);
|
|
858
|
+
});
|
|
859
|
+
return resourceSelector;
|
|
860
|
+
};
|
|
861
|
+
|
|
862
|
+
//Exposes the selection modes
|
|
863
|
+
resourceSelectorFactory.selectionModes = selectionModes;
|
|
864
|
+
|
|
865
|
+
//Exposes the selectAllPolicies
|
|
866
|
+
resourceSelectorFactory.selectAllPolicies = selectAllPolicies;
|
|
867
|
+
|
|
868
|
+
//Exposes the node types
|
|
869
|
+
resourceSelectorFactory.nodeTypes = nodeTypes;
|
|
870
|
+
|
|
871
|
+
export default resourceSelectorFactory;
|