@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/uploader.js
CHANGED
|
@@ -1,594 +1,594 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @author Bertrand Chevrier <bertrand@taotesting.com>
|
|
3
|
-
*/
|
|
4
|
-
import $ from 'jquery';
|
|
5
|
-
import _ from 'lodash';
|
|
6
|
-
import __ from 'i18n';
|
|
7
|
-
import async from 'async';
|
|
8
|
-
import Pluginifier from 'core/pluginifier';
|
|
9
|
-
import bytes from 'util/bytes';
|
|
10
|
-
import uploaderTpl from 'ui/uploader/uploader';
|
|
11
|
-
import fileEntryTpl from 'ui/uploader/fileEntry';
|
|
12
|
-
import 'ui/filesender';
|
|
13
|
-
import 'ui/progressbar';
|
|
14
|
-
|
|
15
|
-
const ns = 'uploader';
|
|
16
|
-
const dataNs = 'ui.' + ns;
|
|
17
|
-
|
|
18
|
-
//the plugin defaults
|
|
19
|
-
const defaults = {
|
|
20
|
-
upload: true,
|
|
21
|
-
read: false,
|
|
22
|
-
multiple: false,
|
|
23
|
-
uploadQueueSize: 3,
|
|
24
|
-
inputName: 'content',
|
|
25
|
-
showResetButton: true,
|
|
26
|
-
showUploadButton: true,
|
|
27
|
-
browseBtnClass: 'btn-browse',
|
|
28
|
-
uploadBtnClass: 'btn-upload',
|
|
29
|
-
resetBtnClass: 'btn-reset',
|
|
30
|
-
fileNameClass: 'file-name',
|
|
31
|
-
dropZoneClass: 'file-drop',
|
|
32
|
-
progressBarClass: 'progressbar',
|
|
33
|
-
dragOverClass: 'drag-hover',
|
|
34
|
-
formAttributes: {
|
|
35
|
-
class: 'uploader uploaderContainer'
|
|
36
|
-
},
|
|
37
|
-
defaultErrMsg: __('Unable to upload file'),
|
|
38
|
-
uploadBtnText: __('Upload'),
|
|
39
|
-
|
|
40
|
-
/**
|
|
41
|
-
* Make files available before file selection. It can be used to filter.
|
|
42
|
-
* @callback fileSelect
|
|
43
|
-
* @param {Array<File>} files - the selected files
|
|
44
|
-
* @param {Function} [done] - callback with filtered files
|
|
45
|
-
* @returns {undefined|Array<File>} the files to be selected
|
|
46
|
-
*/
|
|
47
|
-
fileSelect: function (files, done) {
|
|
48
|
-
if (_.isFunction(done)) {
|
|
49
|
-
return done(files);
|
|
50
|
-
}
|
|
51
|
-
return files;
|
|
52
|
-
}
|
|
53
|
-
};
|
|
54
|
-
|
|
55
|
-
//feature tests
|
|
56
|
-
const tests = {
|
|
57
|
-
filereader: typeof FileReader !== 'undefined',
|
|
58
|
-
dnd: 'draggable' in document.createElement('span')
|
|
59
|
-
};
|
|
60
|
-
|
|
61
|
-
/**
|
|
62
|
-
* Define a jQuery component to help you to manage file(s) upload/reading.
|
|
63
|
-
* @exports ui/uploader
|
|
64
|
-
*/
|
|
65
|
-
const uploader = {
|
|
66
|
-
/**
|
|
67
|
-
* Initialize the plugin.
|
|
68
|
-
*
|
|
69
|
-
* Called the jQuery way once registered by the Pluginifier.
|
|
70
|
-
* @example $('selector').uploader();
|
|
71
|
-
*
|
|
72
|
-
* @constructor
|
|
73
|
-
* @param {Object} [options] - the plugin options
|
|
74
|
-
* @param {Boolean} [options.upload = true] - if we upload the file once selected
|
|
75
|
-
* @param {String} [options.uploadUrl] - the URL where the files will be posted
|
|
76
|
-
* @param {jQueryElement} [options.$form] - a form to be used instead
|
|
77
|
-
* @param {Boolean} [options.read = false] - if we can read the file once selected
|
|
78
|
-
* @param {Boolean} [options.multiple = false] - enable to select more multiple files (may be not supported by old browsers)
|
|
79
|
-
* @param {Number} [options.uploadQueueSize = 3] - max parallel uploads (applies only in multiple mode)
|
|
80
|
-
* @param {String} [options.browseBtnClass = btn-browse] - the class to identify the browse button
|
|
81
|
-
* @param {String} [options.uploadBtnClass = btn-upload] - the class to identify the upload button
|
|
82
|
-
* @param {String} [options.resetBtnClass = btn-reset] - the class to identify the reset button
|
|
83
|
-
* @param {String} [options.fileNameClass = file-name] - the class of the elt where the file name is set
|
|
84
|
-
* @param {String} [options.dropZoneClass = file-drop] - the class of the drop file elt
|
|
85
|
-
* @param {String} [options.progressBarClass = progressbar] - the class to identify the progress bar
|
|
86
|
-
* @param {String} [options.dragOverClass = drag-hover] - the class to set to the drop zone when dragging over
|
|
87
|
-
* @param {Function} [options.fileSelect] - called back before selection with files in params and returns the files to select; filter use case
|
|
88
|
-
* @param {Object} [options.formAttributes] - object with all the attributes you want to be on the form element
|
|
89
|
-
* @param {String} [options.defaultErrMsg] - localized error message when something goes wrong
|
|
90
|
-
* @param {String} [options.uploadBtnText] - text on upload button
|
|
91
|
-
* @returns {jQueryElement} for chainingV
|
|
92
|
-
*/
|
|
93
|
-
init: function (options) {
|
|
94
|
-
//get options using default
|
|
95
|
-
options = _.defaults(options || {}, defaults);
|
|
96
|
-
|
|
97
|
-
return this.each(function () {
|
|
98
|
-
const $elt = $(this);
|
|
99
|
-
let $builtInForm;
|
|
100
|
-
|
|
101
|
-
if (!$elt.data(dataNs)) {
|
|
102
|
-
$elt.html(uploaderTpl(options));
|
|
103
|
-
|
|
104
|
-
// form could be inside $elt ...
|
|
105
|
-
$builtInForm = options.$form && options.$form.length ? options.$form : $elt.find('form');
|
|
106
|
-
|
|
107
|
-
// ... if not it could be a wrapper
|
|
108
|
-
if (!$builtInForm.length) {
|
|
109
|
-
$builtInForm = $elt.closest('form');
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
// ... if no form is present wrap $elt in one
|
|
113
|
-
if (!$builtInForm.length) {
|
|
114
|
-
$elt.wrap($('<form>', options.formAttributes));
|
|
115
|
-
$builtInForm = $elt.parent();
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
//retrieve elements
|
|
119
|
-
options.$input = $('input[type=file]', $elt);
|
|
120
|
-
options.$browseBtn = $('.' + options.browseBtnClass, $elt);
|
|
121
|
-
options.$fileName = $('.' + options.fileNameClass, $elt);
|
|
122
|
-
options.$dropZone = $('.' + options.dropZoneClass, $elt);
|
|
123
|
-
options.$progressBar = $('.' + options.progressBarClass, $elt);
|
|
124
|
-
options.$form = $builtInForm;
|
|
125
|
-
options.$uploadBtn = $('.' + options.uploadBtnClass, $elt);
|
|
126
|
-
options.$resetBtn = $('.' + options.resetBtnClass, $elt);
|
|
127
|
-
|
|
128
|
-
options.useDropZone = tests.dnd;
|
|
129
|
-
|
|
130
|
-
options.dropZonePlaceholder = options.$dropZone.html();
|
|
131
|
-
options.fileNamePlaceholder = options.$fileName.text();
|
|
132
|
-
|
|
133
|
-
options.files = [];
|
|
134
|
-
|
|
135
|
-
$elt.data(dataNs, options);
|
|
136
|
-
|
|
137
|
-
uploader._reset($elt);
|
|
138
|
-
|
|
139
|
-
const inputHandler = function (e) {
|
|
140
|
-
// _.values also get the length property of the FileList object,
|
|
141
|
-
// so we go for a plain old loop.
|
|
142
|
-
const finalFiles = [];
|
|
143
|
-
_.forEach(e.target.files, function (file) {
|
|
144
|
-
finalFiles.push(file);
|
|
145
|
-
});
|
|
146
|
-
|
|
147
|
-
uploader._selectFiles($elt, finalFiles);
|
|
148
|
-
options.$input.val('');
|
|
149
|
-
};
|
|
150
|
-
|
|
151
|
-
const dragOverHandler = function (e) {
|
|
152
|
-
e.preventDefault();
|
|
153
|
-
e.stopPropagation();
|
|
154
|
-
options.$dropZone.addClass(options.dragOverClass);
|
|
155
|
-
};
|
|
156
|
-
const dragOutHandler = function (e) {
|
|
157
|
-
e.preventDefault();
|
|
158
|
-
e.stopPropagation();
|
|
159
|
-
options.$dropZone.removeClass(options.dragOverClass);
|
|
160
|
-
};
|
|
161
|
-
|
|
162
|
-
//manage input selection
|
|
163
|
-
if (!tests.filereader) {
|
|
164
|
-
throw new Error('FileReader API not supported! Please use a compliant browser!');
|
|
165
|
-
}
|
|
166
|
-
options.$input.on('change', inputHandler);
|
|
167
|
-
|
|
168
|
-
// IE Specific hack. It prevents the browseBtn to slightly
|
|
169
|
-
// move on click. Special thanks to Dieter Raber, OAT S.A.
|
|
170
|
-
options.$input.on('mousedown', function (e) {
|
|
171
|
-
e.preventDefault();
|
|
172
|
-
$(this).blur();
|
|
173
|
-
return false;
|
|
174
|
-
});
|
|
175
|
-
|
|
176
|
-
//manage drag and drop selection
|
|
177
|
-
if (options.useDropZone) {
|
|
178
|
-
//prevent drag and drop outside the zone to loose the current context
|
|
179
|
-
$(document)
|
|
180
|
-
.off('drop.' + ns)
|
|
181
|
-
.on('drop.' + ns, function (e) {
|
|
182
|
-
e.stopImmediatePropagation();
|
|
183
|
-
e.preventDefault();
|
|
184
|
-
return false;
|
|
185
|
-
});
|
|
186
|
-
$(document)
|
|
187
|
-
.off('dragover.' + ns)
|
|
188
|
-
.on('dragover.' + ns, function (e) {
|
|
189
|
-
e.stopImmediatePropagation();
|
|
190
|
-
e.preventDefault();
|
|
191
|
-
return false;
|
|
192
|
-
});
|
|
193
|
-
options.$dropZone
|
|
194
|
-
.on('dragover', dragOverHandler)
|
|
195
|
-
.on('dragend', dragOutHandler)
|
|
196
|
-
.on('dragleave', dragOutHandler)
|
|
197
|
-
.on('drop', function (e) {
|
|
198
|
-
let files = [];
|
|
199
|
-
dragOutHandler(e);
|
|
200
|
-
|
|
201
|
-
if (e.target.files) {
|
|
202
|
-
files = _.values(e.target.files);
|
|
203
|
-
} else if (e.originalEvent.files) {
|
|
204
|
-
files = _.values(e.originalEvent.files);
|
|
205
|
-
} else if (e.originalEvent.dataTransfer && e.originalEvent.dataTransfer.files) {
|
|
206
|
-
files = _.values(e.originalEvent.dataTransfer.files);
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
if (files && files.length) {
|
|
210
|
-
let append = options.$dropZone.children('ul').length > 0;
|
|
211
|
-
if (!options.multiple) {
|
|
212
|
-
files = [files[0]];
|
|
213
|
-
append = false;
|
|
214
|
-
}
|
|
215
|
-
|
|
216
|
-
uploader._selectFiles($elt, files, append);
|
|
217
|
-
}
|
|
218
|
-
return false;
|
|
219
|
-
});
|
|
220
|
-
} else {
|
|
221
|
-
options.$dropZone.hide();
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
//getting files
|
|
225
|
-
$elt.on('fileselect.' + ns, function () {
|
|
226
|
-
if (options.files.length === 0) {
|
|
227
|
-
uploader._reset($elt);
|
|
228
|
-
}
|
|
229
|
-
|
|
230
|
-
if (options.upload) {
|
|
231
|
-
options.$uploadBtn
|
|
232
|
-
.off('click')
|
|
233
|
-
.on('click', function (e) {
|
|
234
|
-
e.preventDefault();
|
|
235
|
-
uploader._upload($elt, options.files);
|
|
236
|
-
})
|
|
237
|
-
.removeProp('disabled');
|
|
238
|
-
}
|
|
239
|
-
|
|
240
|
-
if (options.read) {
|
|
241
|
-
uploader._read($elt, options.files);
|
|
242
|
-
}
|
|
243
|
-
|
|
244
|
-
options.$resetBtn
|
|
245
|
-
.off('click')
|
|
246
|
-
.on('click', function (e) {
|
|
247
|
-
e.preventDefault();
|
|
248
|
-
uploader._reset($elt);
|
|
249
|
-
})
|
|
250
|
-
.removeProp('disabled');
|
|
251
|
-
});
|
|
252
|
-
|
|
253
|
-
/**
|
|
254
|
-
* The plugin has been created.
|
|
255
|
-
* @event uploader#create.uploader
|
|
256
|
-
*/
|
|
257
|
-
$elt.trigger('create.' + ns);
|
|
258
|
-
}
|
|
259
|
-
});
|
|
260
|
-
},
|
|
261
|
-
|
|
262
|
-
/**
|
|
263
|
-
* Select files to upload/read.
|
|
264
|
-
*
|
|
265
|
-
* Called the jQuery way once registered by the Pluginifier:
|
|
266
|
-
* @example $('selector').uploader('selectFiles', files);
|
|
267
|
-
*
|
|
268
|
-
* @param {jQueryElement} $elt - plugin's element
|
|
269
|
-
* @param {Array<File>} files - the selected files
|
|
270
|
-
* @param {Boolean} [append = false] - in append mode the files are added instead of replaced
|
|
271
|
-
* @fires uploader#fileselect.uploader
|
|
272
|
-
*/
|
|
273
|
-
_selectFiles: function _selectFiles($elt, files, append) {
|
|
274
|
-
const self = this;
|
|
275
|
-
let listContent;
|
|
276
|
-
const options = $elt.data(dataNs);
|
|
277
|
-
|
|
278
|
-
//update the file name field with the current number of files selected
|
|
279
|
-
const updateFileName = function updateFileName() {
|
|
280
|
-
const length = options.files.length;
|
|
281
|
-
options.$fileName
|
|
282
|
-
.text(length + ' ' + (length > 1 ? __('files selected') : __('file selected')))
|
|
283
|
-
.removeClass('placeholder');
|
|
284
|
-
};
|
|
285
|
-
|
|
286
|
-
if (files.length <= 0 && !append) {
|
|
287
|
-
//empty file list, so we reset the plugin
|
|
288
|
-
self._reset($elt);
|
|
289
|
-
}
|
|
290
|
-
if (files.length > 0) {
|
|
291
|
-
//execute the fileSelect function to filter files before selection
|
|
292
|
-
options.fileSelect.call($elt, files, function (filteredFiles) {
|
|
293
|
-
if (append) {
|
|
294
|
-
options.files = options.files.concat(filteredFiles);
|
|
295
|
-
} else {
|
|
296
|
-
options.files = filteredFiles;
|
|
297
|
-
}
|
|
298
|
-
|
|
299
|
-
if (options.useDropZone) {
|
|
300
|
-
updateFileName();
|
|
301
|
-
|
|
302
|
-
listContent = _.reduce(
|
|
303
|
-
filteredFiles,
|
|
304
|
-
function (acc, file) {
|
|
305
|
-
return (
|
|
306
|
-
acc +
|
|
307
|
-
fileEntryTpl({
|
|
308
|
-
name: file.name,
|
|
309
|
-
size: bytes.hrSize(file.size)
|
|
310
|
-
})
|
|
311
|
-
);
|
|
312
|
-
},
|
|
313
|
-
''
|
|
314
|
-
);
|
|
315
|
-
|
|
316
|
-
if (append) {
|
|
317
|
-
options.$dropZone.children('ul').append(listContent);
|
|
318
|
-
} else {
|
|
319
|
-
options.$dropZone.html('<ul>' + listContent + '</ul>');
|
|
320
|
-
}
|
|
321
|
-
|
|
322
|
-
options.$dropZone.off('click.' + ns).on('click.' + ns, '[data-role=delete]', function (e) {
|
|
323
|
-
const $fileEntry = $(this).parent();
|
|
324
|
-
const name = $fileEntry.data('file-name');
|
|
325
|
-
e.preventDefault();
|
|
326
|
-
e.stopPropagation();
|
|
327
|
-
if (name) {
|
|
328
|
-
options.files = _.reject(options.files, { name: name });
|
|
329
|
-
if (options.files.length === 0) {
|
|
330
|
-
self._reset($elt);
|
|
331
|
-
} else {
|
|
332
|
-
updateFileName();
|
|
333
|
-
}
|
|
334
|
-
$fileEntry.remove();
|
|
335
|
-
}
|
|
336
|
-
});
|
|
337
|
-
} else {
|
|
338
|
-
//legacy mode, no dnd support
|
|
339
|
-
options.files = options.files.slice(0, 1);
|
|
340
|
-
options.$fileName.text(files[0].name).removeClass('placeholder');
|
|
341
|
-
}
|
|
342
|
-
|
|
343
|
-
/**
|
|
344
|
-
* Files has been selected
|
|
345
|
-
* @event uploader#fileselect.uploader
|
|
346
|
-
*/
|
|
347
|
-
$elt.trigger('fileselect.' + ns);
|
|
348
|
-
});
|
|
349
|
-
}
|
|
350
|
-
},
|
|
351
|
-
|
|
352
|
-
/**
|
|
353
|
-
* Get the selected files.
|
|
354
|
-
*
|
|
355
|
-
* Called the jQuery way once registered by the Pluginifier:
|
|
356
|
-
* @example const files = $('selector').uploader('files');
|
|
357
|
-
*
|
|
358
|
-
* @param {jQueryElement} $elt - plugin's element
|
|
359
|
-
* @returns {Array<File>} the selected files
|
|
360
|
-
*/
|
|
361
|
-
_files: function ($elt) {
|
|
362
|
-
let files = [];
|
|
363
|
-
const options = $elt.data(dataNs);
|
|
364
|
-
if (options) {
|
|
365
|
-
files = options.files;
|
|
366
|
-
}
|
|
367
|
-
return files;
|
|
368
|
-
},
|
|
369
|
-
|
|
370
|
-
/**
|
|
371
|
-
* Reset the component
|
|
372
|
-
*
|
|
373
|
-
* Called the jQuery way once registered by the Pluginifier:
|
|
374
|
-
* @example $('selector').uploader('reset');
|
|
375
|
-
*
|
|
376
|
-
* @param {jQueryElement} $elt - plugin's element
|
|
377
|
-
* @fires uploader#reset.uploader
|
|
378
|
-
*/
|
|
379
|
-
_reset: function ($elt) {
|
|
380
|
-
const options = $elt.data(dataNs);
|
|
381
|
-
|
|
382
|
-
options.$fileName.text(options.fileNamePlaceholder).addClass('placeholder');
|
|
383
|
-
|
|
384
|
-
options.$dropZone.empty().html(options.dropZonePlaceholder);
|
|
385
|
-
|
|
386
|
-
options.$uploadBtn.prop('disabled', true);
|
|
387
|
-
options.$resetBtn.prop('disabled', true);
|
|
388
|
-
|
|
389
|
-
const importButton = options.$form[0].querySelector('button');
|
|
390
|
-
if (importButton) {
|
|
391
|
-
importButton.setAttribute('disabled', true);
|
|
392
|
-
}
|
|
393
|
-
|
|
394
|
-
if (options.$progressBar) {
|
|
395
|
-
options.$progressBar.removeClass('success').progressbar('destroy').progressbar({ value: 0 });
|
|
396
|
-
}
|
|
397
|
-
/**
|
|
398
|
-
* The plugin has been created.
|
|
399
|
-
* @event uploader#reset.uploader
|
|
400
|
-
*/
|
|
401
|
-
$elt.trigger('reset.' + ns);
|
|
402
|
-
},
|
|
403
|
-
|
|
404
|
-
/**
|
|
405
|
-
* Upload the selected file
|
|
406
|
-
*
|
|
407
|
-
* Called the jQuery way once registered by the Pluginifier:
|
|
408
|
-
* @example $('selector').uploader('upload');
|
|
409
|
-
*
|
|
410
|
-
* @param {jQueryElement} $elt - plugin's element
|
|
411
|
-
* @fires uploader#upload.uploader
|
|
412
|
-
* @fires uploader#fail.uploader
|
|
413
|
-
* @fires uploader#end.uploader
|
|
414
|
-
*/
|
|
415
|
-
_upload: function ($elt) {
|
|
416
|
-
let length,
|
|
417
|
-
$fileEntries,
|
|
418
|
-
entryHeight,
|
|
419
|
-
errors = [],
|
|
420
|
-
q;
|
|
421
|
-
|
|
422
|
-
const options = $elt.data(dataNs);
|
|
423
|
-
|
|
424
|
-
if (options && options.files.length) {
|
|
425
|
-
length = options.files.length;
|
|
426
|
-
$fileEntries = $('ul', options.$dropZone);
|
|
427
|
-
entryHeight = $('li:first', $fileEntries).outerHeight();
|
|
428
|
-
|
|
429
|
-
//create an async queue to start uploads
|
|
430
|
-
q = async.queue(function (file, done) {
|
|
431
|
-
var $fileEntry = $('li[data-file-name="' + file.name + '"]', $fileEntries);
|
|
432
|
-
var $status = $('.status', $fileEntry);
|
|
433
|
-
var index = $fileEntries.children().index($fileEntry);
|
|
434
|
-
|
|
435
|
-
//update the scroll into the element
|
|
436
|
-
options.$dropZone.stop(true, true).animate({ scrollTop: index * entryHeight }, 25);
|
|
437
|
-
|
|
438
|
-
$status.removeClass('success').removeClass('error').addClass('sending');
|
|
439
|
-
|
|
440
|
-
//send (upload) the file
|
|
441
|
-
options.$form.sendfile({
|
|
442
|
-
url: options.uploadUrl,
|
|
443
|
-
file: file,
|
|
444
|
-
loaded: function (result) {
|
|
445
|
-
$status.removeClass('sending').removeClass('error').addClass('success');
|
|
446
|
-
done(null, result);
|
|
447
|
-
},
|
|
448
|
-
failed: function (message) {
|
|
449
|
-
message = message || options.defaultErrMsg;
|
|
450
|
-
$status.removeClass('sending').removeClass('success').addClass('error').attr('title', message);
|
|
451
|
-
done(new Error(message));
|
|
452
|
-
}
|
|
453
|
-
});
|
|
454
|
-
}, options.uploadQueueSize || 1);
|
|
455
|
-
|
|
456
|
-
//disable buttons
|
|
457
|
-
options.$uploadBtn.prop('disabled', true);
|
|
458
|
-
options.$resetBtn.prop('disabled', true);
|
|
459
|
-
|
|
460
|
-
options.$progressBar.progressbar('value', 0);
|
|
461
|
-
|
|
462
|
-
//start pushing uploads into the queue
|
|
463
|
-
_.forEach(options.files, function (file, index) {
|
|
464
|
-
_.delay(function () {
|
|
465
|
-
q.push(file, function (err, result) {
|
|
466
|
-
var complete = ((index + 1) / length) * 100;
|
|
467
|
-
|
|
468
|
-
if (err) {
|
|
469
|
-
errors.push(err);
|
|
470
|
-
|
|
471
|
-
/**
|
|
472
|
-
* The file fails to upload
|
|
473
|
-
* @event uploader#fail.uploader
|
|
474
|
-
* @param {Object} file - the uploaded file
|
|
475
|
-
* @param {Object} err - the error
|
|
476
|
-
*/
|
|
477
|
-
$elt.trigger('fail.' + ns, [file, err]);
|
|
478
|
-
} else {
|
|
479
|
-
/**
|
|
480
|
-
* A file is uploaded
|
|
481
|
-
* @event uploader#upload.uploader
|
|
482
|
-
* @param {Object} file - the uploaded file
|
|
483
|
-
* @param {Object} result - the upload response
|
|
484
|
-
*/
|
|
485
|
-
$elt.trigger('upload.' + ns, [file, result]);
|
|
486
|
-
}
|
|
487
|
-
|
|
488
|
-
//update progress bar regarding the number of files uploaded
|
|
489
|
-
options.$progressBar.progressbar('value', complete);
|
|
490
|
-
|
|
491
|
-
if (complete >= 100) {
|
|
492
|
-
if (errors.length === length) {
|
|
493
|
-
options.$progressBar.addClass('error');
|
|
494
|
-
} else if (errors.length > 0) {
|
|
495
|
-
options.$progressBar.addClass('warning');
|
|
496
|
-
} else {
|
|
497
|
-
options.$progressBar.addClass('success');
|
|
498
|
-
}
|
|
499
|
-
|
|
500
|
-
/**
|
|
501
|
-
* The upload sequence is complete
|
|
502
|
-
* @event uploader#end.uploader
|
|
503
|
-
*/
|
|
504
|
-
$elt.trigger('end.' + ns);
|
|
505
|
-
}
|
|
506
|
-
});
|
|
507
|
-
}, 50);
|
|
508
|
-
});
|
|
509
|
-
}
|
|
510
|
-
},
|
|
511
|
-
|
|
512
|
-
/**
|
|
513
|
-
* Read the selected file.
|
|
514
|
-
*
|
|
515
|
-
* TODO update files status and progress bar by file
|
|
516
|
-
*
|
|
517
|
-
* Called the jQuery way once registered by the Pluginifier:
|
|
518
|
-
* @example $('selector').uploader('read');
|
|
519
|
-
*
|
|
520
|
-
* @param {jQueryElement} $elt - plugin's element
|
|
521
|
-
* @fires uploader#readstart.uploader
|
|
522
|
-
* @fires uploader#readend.uploader
|
|
523
|
-
*/
|
|
524
|
-
_read: function ($elt) {
|
|
525
|
-
var options = $elt.data(dataNs);
|
|
526
|
-
|
|
527
|
-
if (options && options.files.length) {
|
|
528
|
-
_.forEach(options.files, function (file) {
|
|
529
|
-
// Let's read the file to get its base64 encoded content.
|
|
530
|
-
var reader = new FileReader();
|
|
531
|
-
|
|
532
|
-
reader.onload = function (e) {
|
|
533
|
-
options.$progressBar.progressbar('value', 100);
|
|
534
|
-
|
|
535
|
-
/**
|
|
536
|
-
* The read is fininshed
|
|
537
|
-
* @event uploader#readend.uploader
|
|
538
|
-
* @param {Object} file - the reading file
|
|
539
|
-
* @param {Object} result - the content
|
|
540
|
-
*/
|
|
541
|
-
$elt.trigger('readend.' + ns, [file, e.target.result]);
|
|
542
|
-
};
|
|
543
|
-
|
|
544
|
-
reader.onloadstart = function () {
|
|
545
|
-
options.$progressBar.progressbar('value', 0);
|
|
546
|
-
|
|
547
|
-
/**
|
|
548
|
-
* The reading starts
|
|
549
|
-
* @event uploader#readstart.uploader
|
|
550
|
-
* @param {Object} file - the reading file
|
|
551
|
-
*/
|
|
552
|
-
$elt.trigger('readstart.' + ns, [file]);
|
|
553
|
-
};
|
|
554
|
-
|
|
555
|
-
if (options.$progressBar.length) {
|
|
556
|
-
reader.onprogress = function (e) {
|
|
557
|
-
var percentProgress = Math.ceil((Math.round(e.loaded) / Math.round(e.total)) * 100);
|
|
558
|
-
options.$progressBar.progressbar('value', percentProgress);
|
|
559
|
-
};
|
|
560
|
-
}
|
|
561
|
-
reader.readAsDataURL(file);
|
|
562
|
-
});
|
|
563
|
-
}
|
|
564
|
-
},
|
|
565
|
-
|
|
566
|
-
/**
|
|
567
|
-
* Destroy completely the plugin.
|
|
568
|
-
*
|
|
569
|
-
* Called the jQuery way once registered by the Pluginifier:
|
|
570
|
-
* @example $('selector').uploader('destroy');
|
|
571
|
-
*
|
|
572
|
-
* @fires uploader#destroy.uploader
|
|
573
|
-
*/
|
|
574
|
-
destroy: function () {
|
|
575
|
-
this.each(function () {
|
|
576
|
-
var $elt = $(this);
|
|
577
|
-
|
|
578
|
-
$(document)
|
|
579
|
-
.off('drop.' + ns)
|
|
580
|
-
.off('dragover.' + ns);
|
|
581
|
-
|
|
582
|
-
$elt.empty();
|
|
583
|
-
|
|
584
|
-
/**
|
|
585
|
-
* The plugin has been destroyed.
|
|
586
|
-
* @event uploader#destroy.uploader
|
|
587
|
-
*/
|
|
588
|
-
$elt.trigger('destroy.' + ns);
|
|
589
|
-
});
|
|
590
|
-
}
|
|
591
|
-
};
|
|
592
|
-
|
|
593
|
-
//Register the incrementer to behave as a jQuery plugin.
|
|
594
|
-
Pluginifier.register(ns, uploader, { expose: ['reset', 'selectFiles', 'upload', 'read'] });
|
|
1
|
+
/**
|
|
2
|
+
* @author Bertrand Chevrier <bertrand@taotesting.com>
|
|
3
|
+
*/
|
|
4
|
+
import $ from 'jquery';
|
|
5
|
+
import _ from 'lodash';
|
|
6
|
+
import __ from 'i18n';
|
|
7
|
+
import async from 'async';
|
|
8
|
+
import Pluginifier from 'core/pluginifier';
|
|
9
|
+
import bytes from 'util/bytes';
|
|
10
|
+
import uploaderTpl from 'ui/uploader/uploader';
|
|
11
|
+
import fileEntryTpl from 'ui/uploader/fileEntry';
|
|
12
|
+
import 'ui/filesender';
|
|
13
|
+
import 'ui/progressbar';
|
|
14
|
+
|
|
15
|
+
const ns = 'uploader';
|
|
16
|
+
const dataNs = 'ui.' + ns;
|
|
17
|
+
|
|
18
|
+
//the plugin defaults
|
|
19
|
+
const defaults = {
|
|
20
|
+
upload: true,
|
|
21
|
+
read: false,
|
|
22
|
+
multiple: false,
|
|
23
|
+
uploadQueueSize: 3,
|
|
24
|
+
inputName: 'content',
|
|
25
|
+
showResetButton: true,
|
|
26
|
+
showUploadButton: true,
|
|
27
|
+
browseBtnClass: 'btn-browse',
|
|
28
|
+
uploadBtnClass: 'btn-upload',
|
|
29
|
+
resetBtnClass: 'btn-reset',
|
|
30
|
+
fileNameClass: 'file-name',
|
|
31
|
+
dropZoneClass: 'file-drop',
|
|
32
|
+
progressBarClass: 'progressbar',
|
|
33
|
+
dragOverClass: 'drag-hover',
|
|
34
|
+
formAttributes: {
|
|
35
|
+
class: 'uploader uploaderContainer'
|
|
36
|
+
},
|
|
37
|
+
defaultErrMsg: __('Unable to upload file'),
|
|
38
|
+
uploadBtnText: __('Upload'),
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Make files available before file selection. It can be used to filter.
|
|
42
|
+
* @callback fileSelect
|
|
43
|
+
* @param {Array<File>} files - the selected files
|
|
44
|
+
* @param {Function} [done] - callback with filtered files
|
|
45
|
+
* @returns {undefined|Array<File>} the files to be selected
|
|
46
|
+
*/
|
|
47
|
+
fileSelect: function (files, done) {
|
|
48
|
+
if (_.isFunction(done)) {
|
|
49
|
+
return done(files);
|
|
50
|
+
}
|
|
51
|
+
return files;
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
//feature tests
|
|
56
|
+
const tests = {
|
|
57
|
+
filereader: typeof FileReader !== 'undefined',
|
|
58
|
+
dnd: 'draggable' in document.createElement('span')
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Define a jQuery component to help you to manage file(s) upload/reading.
|
|
63
|
+
* @exports ui/uploader
|
|
64
|
+
*/
|
|
65
|
+
const uploader = {
|
|
66
|
+
/**
|
|
67
|
+
* Initialize the plugin.
|
|
68
|
+
*
|
|
69
|
+
* Called the jQuery way once registered by the Pluginifier.
|
|
70
|
+
* @example $('selector').uploader();
|
|
71
|
+
*
|
|
72
|
+
* @constructor
|
|
73
|
+
* @param {Object} [options] - the plugin options
|
|
74
|
+
* @param {Boolean} [options.upload = true] - if we upload the file once selected
|
|
75
|
+
* @param {String} [options.uploadUrl] - the URL where the files will be posted
|
|
76
|
+
* @param {jQueryElement} [options.$form] - a form to be used instead
|
|
77
|
+
* @param {Boolean} [options.read = false] - if we can read the file once selected
|
|
78
|
+
* @param {Boolean} [options.multiple = false] - enable to select more multiple files (may be not supported by old browsers)
|
|
79
|
+
* @param {Number} [options.uploadQueueSize = 3] - max parallel uploads (applies only in multiple mode)
|
|
80
|
+
* @param {String} [options.browseBtnClass = btn-browse] - the class to identify the browse button
|
|
81
|
+
* @param {String} [options.uploadBtnClass = btn-upload] - the class to identify the upload button
|
|
82
|
+
* @param {String} [options.resetBtnClass = btn-reset] - the class to identify the reset button
|
|
83
|
+
* @param {String} [options.fileNameClass = file-name] - the class of the elt where the file name is set
|
|
84
|
+
* @param {String} [options.dropZoneClass = file-drop] - the class of the drop file elt
|
|
85
|
+
* @param {String} [options.progressBarClass = progressbar] - the class to identify the progress bar
|
|
86
|
+
* @param {String} [options.dragOverClass = drag-hover] - the class to set to the drop zone when dragging over
|
|
87
|
+
* @param {Function} [options.fileSelect] - called back before selection with files in params and returns the files to select; filter use case
|
|
88
|
+
* @param {Object} [options.formAttributes] - object with all the attributes you want to be on the form element
|
|
89
|
+
* @param {String} [options.defaultErrMsg] - localized error message when something goes wrong
|
|
90
|
+
* @param {String} [options.uploadBtnText] - text on upload button
|
|
91
|
+
* @returns {jQueryElement} for chainingV
|
|
92
|
+
*/
|
|
93
|
+
init: function (options) {
|
|
94
|
+
//get options using default
|
|
95
|
+
options = _.defaults(options || {}, defaults);
|
|
96
|
+
|
|
97
|
+
return this.each(function () {
|
|
98
|
+
const $elt = $(this);
|
|
99
|
+
let $builtInForm;
|
|
100
|
+
|
|
101
|
+
if (!$elt.data(dataNs)) {
|
|
102
|
+
$elt.html(uploaderTpl(options));
|
|
103
|
+
|
|
104
|
+
// form could be inside $elt ...
|
|
105
|
+
$builtInForm = options.$form && options.$form.length ? options.$form : $elt.find('form');
|
|
106
|
+
|
|
107
|
+
// ... if not it could be a wrapper
|
|
108
|
+
if (!$builtInForm.length) {
|
|
109
|
+
$builtInForm = $elt.closest('form');
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
// ... if no form is present wrap $elt in one
|
|
113
|
+
if (!$builtInForm.length) {
|
|
114
|
+
$elt.wrap($('<form>', options.formAttributes));
|
|
115
|
+
$builtInForm = $elt.parent();
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
//retrieve elements
|
|
119
|
+
options.$input = $('input[type=file]', $elt);
|
|
120
|
+
options.$browseBtn = $('.' + options.browseBtnClass, $elt);
|
|
121
|
+
options.$fileName = $('.' + options.fileNameClass, $elt);
|
|
122
|
+
options.$dropZone = $('.' + options.dropZoneClass, $elt);
|
|
123
|
+
options.$progressBar = $('.' + options.progressBarClass, $elt);
|
|
124
|
+
options.$form = $builtInForm;
|
|
125
|
+
options.$uploadBtn = $('.' + options.uploadBtnClass, $elt);
|
|
126
|
+
options.$resetBtn = $('.' + options.resetBtnClass, $elt);
|
|
127
|
+
|
|
128
|
+
options.useDropZone = tests.dnd;
|
|
129
|
+
|
|
130
|
+
options.dropZonePlaceholder = options.$dropZone.html();
|
|
131
|
+
options.fileNamePlaceholder = options.$fileName.text();
|
|
132
|
+
|
|
133
|
+
options.files = [];
|
|
134
|
+
|
|
135
|
+
$elt.data(dataNs, options);
|
|
136
|
+
|
|
137
|
+
uploader._reset($elt);
|
|
138
|
+
|
|
139
|
+
const inputHandler = function (e) {
|
|
140
|
+
// _.values also get the length property of the FileList object,
|
|
141
|
+
// so we go for a plain old loop.
|
|
142
|
+
const finalFiles = [];
|
|
143
|
+
_.forEach(e.target.files, function (file) {
|
|
144
|
+
finalFiles.push(file);
|
|
145
|
+
});
|
|
146
|
+
|
|
147
|
+
uploader._selectFiles($elt, finalFiles);
|
|
148
|
+
options.$input.val('');
|
|
149
|
+
};
|
|
150
|
+
|
|
151
|
+
const dragOverHandler = function (e) {
|
|
152
|
+
e.preventDefault();
|
|
153
|
+
e.stopPropagation();
|
|
154
|
+
options.$dropZone.addClass(options.dragOverClass);
|
|
155
|
+
};
|
|
156
|
+
const dragOutHandler = function (e) {
|
|
157
|
+
e.preventDefault();
|
|
158
|
+
e.stopPropagation();
|
|
159
|
+
options.$dropZone.removeClass(options.dragOverClass);
|
|
160
|
+
};
|
|
161
|
+
|
|
162
|
+
//manage input selection
|
|
163
|
+
if (!tests.filereader) {
|
|
164
|
+
throw new Error('FileReader API not supported! Please use a compliant browser!');
|
|
165
|
+
}
|
|
166
|
+
options.$input.on('change', inputHandler);
|
|
167
|
+
|
|
168
|
+
// IE Specific hack. It prevents the browseBtn to slightly
|
|
169
|
+
// move on click. Special thanks to Dieter Raber, OAT S.A.
|
|
170
|
+
options.$input.on('mousedown', function (e) {
|
|
171
|
+
e.preventDefault();
|
|
172
|
+
$(this).blur();
|
|
173
|
+
return false;
|
|
174
|
+
});
|
|
175
|
+
|
|
176
|
+
//manage drag and drop selection
|
|
177
|
+
if (options.useDropZone) {
|
|
178
|
+
//prevent drag and drop outside the zone to loose the current context
|
|
179
|
+
$(document)
|
|
180
|
+
.off('drop.' + ns)
|
|
181
|
+
.on('drop.' + ns, function (e) {
|
|
182
|
+
e.stopImmediatePropagation();
|
|
183
|
+
e.preventDefault();
|
|
184
|
+
return false;
|
|
185
|
+
});
|
|
186
|
+
$(document)
|
|
187
|
+
.off('dragover.' + ns)
|
|
188
|
+
.on('dragover.' + ns, function (e) {
|
|
189
|
+
e.stopImmediatePropagation();
|
|
190
|
+
e.preventDefault();
|
|
191
|
+
return false;
|
|
192
|
+
});
|
|
193
|
+
options.$dropZone
|
|
194
|
+
.on('dragover', dragOverHandler)
|
|
195
|
+
.on('dragend', dragOutHandler)
|
|
196
|
+
.on('dragleave', dragOutHandler)
|
|
197
|
+
.on('drop', function (e) {
|
|
198
|
+
let files = [];
|
|
199
|
+
dragOutHandler(e);
|
|
200
|
+
|
|
201
|
+
if (e.target.files) {
|
|
202
|
+
files = _.values(e.target.files);
|
|
203
|
+
} else if (e.originalEvent.files) {
|
|
204
|
+
files = _.values(e.originalEvent.files);
|
|
205
|
+
} else if (e.originalEvent.dataTransfer && e.originalEvent.dataTransfer.files) {
|
|
206
|
+
files = _.values(e.originalEvent.dataTransfer.files);
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
if (files && files.length) {
|
|
210
|
+
let append = options.$dropZone.children('ul').length > 0;
|
|
211
|
+
if (!options.multiple) {
|
|
212
|
+
files = [files[0]];
|
|
213
|
+
append = false;
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
uploader._selectFiles($elt, files, append);
|
|
217
|
+
}
|
|
218
|
+
return false;
|
|
219
|
+
});
|
|
220
|
+
} else {
|
|
221
|
+
options.$dropZone.hide();
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
//getting files
|
|
225
|
+
$elt.on('fileselect.' + ns, function () {
|
|
226
|
+
if (options.files.length === 0) {
|
|
227
|
+
uploader._reset($elt);
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
if (options.upload) {
|
|
231
|
+
options.$uploadBtn
|
|
232
|
+
.off('click')
|
|
233
|
+
.on('click', function (e) {
|
|
234
|
+
e.preventDefault();
|
|
235
|
+
uploader._upload($elt, options.files);
|
|
236
|
+
})
|
|
237
|
+
.removeProp('disabled');
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
if (options.read) {
|
|
241
|
+
uploader._read($elt, options.files);
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
options.$resetBtn
|
|
245
|
+
.off('click')
|
|
246
|
+
.on('click', function (e) {
|
|
247
|
+
e.preventDefault();
|
|
248
|
+
uploader._reset($elt);
|
|
249
|
+
})
|
|
250
|
+
.removeProp('disabled');
|
|
251
|
+
});
|
|
252
|
+
|
|
253
|
+
/**
|
|
254
|
+
* The plugin has been created.
|
|
255
|
+
* @event uploader#create.uploader
|
|
256
|
+
*/
|
|
257
|
+
$elt.trigger('create.' + ns);
|
|
258
|
+
}
|
|
259
|
+
});
|
|
260
|
+
},
|
|
261
|
+
|
|
262
|
+
/**
|
|
263
|
+
* Select files to upload/read.
|
|
264
|
+
*
|
|
265
|
+
* Called the jQuery way once registered by the Pluginifier:
|
|
266
|
+
* @example $('selector').uploader('selectFiles', files);
|
|
267
|
+
*
|
|
268
|
+
* @param {jQueryElement} $elt - plugin's element
|
|
269
|
+
* @param {Array<File>} files - the selected files
|
|
270
|
+
* @param {Boolean} [append = false] - in append mode the files are added instead of replaced
|
|
271
|
+
* @fires uploader#fileselect.uploader
|
|
272
|
+
*/
|
|
273
|
+
_selectFiles: function _selectFiles($elt, files, append) {
|
|
274
|
+
const self = this;
|
|
275
|
+
let listContent;
|
|
276
|
+
const options = $elt.data(dataNs);
|
|
277
|
+
|
|
278
|
+
//update the file name field with the current number of files selected
|
|
279
|
+
const updateFileName = function updateFileName() {
|
|
280
|
+
const length = options.files.length;
|
|
281
|
+
options.$fileName
|
|
282
|
+
.text(length + ' ' + (length > 1 ? __('files selected') : __('file selected')))
|
|
283
|
+
.removeClass('placeholder');
|
|
284
|
+
};
|
|
285
|
+
|
|
286
|
+
if (files.length <= 0 && !append) {
|
|
287
|
+
//empty file list, so we reset the plugin
|
|
288
|
+
self._reset($elt);
|
|
289
|
+
}
|
|
290
|
+
if (files.length > 0) {
|
|
291
|
+
//execute the fileSelect function to filter files before selection
|
|
292
|
+
options.fileSelect.call($elt, files, function (filteredFiles) {
|
|
293
|
+
if (append) {
|
|
294
|
+
options.files = options.files.concat(filteredFiles);
|
|
295
|
+
} else {
|
|
296
|
+
options.files = filteredFiles;
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
if (options.useDropZone) {
|
|
300
|
+
updateFileName();
|
|
301
|
+
|
|
302
|
+
listContent = _.reduce(
|
|
303
|
+
filteredFiles,
|
|
304
|
+
function (acc, file) {
|
|
305
|
+
return (
|
|
306
|
+
acc +
|
|
307
|
+
fileEntryTpl({
|
|
308
|
+
name: file.name,
|
|
309
|
+
size: bytes.hrSize(file.size)
|
|
310
|
+
})
|
|
311
|
+
);
|
|
312
|
+
},
|
|
313
|
+
''
|
|
314
|
+
);
|
|
315
|
+
|
|
316
|
+
if (append) {
|
|
317
|
+
options.$dropZone.children('ul').append(listContent);
|
|
318
|
+
} else {
|
|
319
|
+
options.$dropZone.html('<ul>' + listContent + '</ul>');
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
options.$dropZone.off('click.' + ns).on('click.' + ns, '[data-role=delete]', function (e) {
|
|
323
|
+
const $fileEntry = $(this).parent();
|
|
324
|
+
const name = $fileEntry.data('file-name');
|
|
325
|
+
e.preventDefault();
|
|
326
|
+
e.stopPropagation();
|
|
327
|
+
if (name) {
|
|
328
|
+
options.files = _.reject(options.files, { name: name });
|
|
329
|
+
if (options.files.length === 0) {
|
|
330
|
+
self._reset($elt);
|
|
331
|
+
} else {
|
|
332
|
+
updateFileName();
|
|
333
|
+
}
|
|
334
|
+
$fileEntry.remove();
|
|
335
|
+
}
|
|
336
|
+
});
|
|
337
|
+
} else {
|
|
338
|
+
//legacy mode, no dnd support
|
|
339
|
+
options.files = options.files.slice(0, 1);
|
|
340
|
+
options.$fileName.text(files[0].name).removeClass('placeholder');
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
/**
|
|
344
|
+
* Files has been selected
|
|
345
|
+
* @event uploader#fileselect.uploader
|
|
346
|
+
*/
|
|
347
|
+
$elt.trigger('fileselect.' + ns);
|
|
348
|
+
});
|
|
349
|
+
}
|
|
350
|
+
},
|
|
351
|
+
|
|
352
|
+
/**
|
|
353
|
+
* Get the selected files.
|
|
354
|
+
*
|
|
355
|
+
* Called the jQuery way once registered by the Pluginifier:
|
|
356
|
+
* @example const files = $('selector').uploader('files');
|
|
357
|
+
*
|
|
358
|
+
* @param {jQueryElement} $elt - plugin's element
|
|
359
|
+
* @returns {Array<File>} the selected files
|
|
360
|
+
*/
|
|
361
|
+
_files: function ($elt) {
|
|
362
|
+
let files = [];
|
|
363
|
+
const options = $elt.data(dataNs);
|
|
364
|
+
if (options) {
|
|
365
|
+
files = options.files;
|
|
366
|
+
}
|
|
367
|
+
return files;
|
|
368
|
+
},
|
|
369
|
+
|
|
370
|
+
/**
|
|
371
|
+
* Reset the component
|
|
372
|
+
*
|
|
373
|
+
* Called the jQuery way once registered by the Pluginifier:
|
|
374
|
+
* @example $('selector').uploader('reset');
|
|
375
|
+
*
|
|
376
|
+
* @param {jQueryElement} $elt - plugin's element
|
|
377
|
+
* @fires uploader#reset.uploader
|
|
378
|
+
*/
|
|
379
|
+
_reset: function ($elt) {
|
|
380
|
+
const options = $elt.data(dataNs);
|
|
381
|
+
|
|
382
|
+
options.$fileName.text(options.fileNamePlaceholder).addClass('placeholder');
|
|
383
|
+
|
|
384
|
+
options.$dropZone.empty().html(options.dropZonePlaceholder);
|
|
385
|
+
|
|
386
|
+
options.$uploadBtn.prop('disabled', true);
|
|
387
|
+
options.$resetBtn.prop('disabled', true);
|
|
388
|
+
|
|
389
|
+
const importButton = options.$form[0].querySelector('button');
|
|
390
|
+
if (importButton) {
|
|
391
|
+
importButton.setAttribute('disabled', true);
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
if (options.$progressBar) {
|
|
395
|
+
options.$progressBar.removeClass('success').progressbar('destroy').progressbar({ value: 0 });
|
|
396
|
+
}
|
|
397
|
+
/**
|
|
398
|
+
* The plugin has been created.
|
|
399
|
+
* @event uploader#reset.uploader
|
|
400
|
+
*/
|
|
401
|
+
$elt.trigger('reset.' + ns);
|
|
402
|
+
},
|
|
403
|
+
|
|
404
|
+
/**
|
|
405
|
+
* Upload the selected file
|
|
406
|
+
*
|
|
407
|
+
* Called the jQuery way once registered by the Pluginifier:
|
|
408
|
+
* @example $('selector').uploader('upload');
|
|
409
|
+
*
|
|
410
|
+
* @param {jQueryElement} $elt - plugin's element
|
|
411
|
+
* @fires uploader#upload.uploader
|
|
412
|
+
* @fires uploader#fail.uploader
|
|
413
|
+
* @fires uploader#end.uploader
|
|
414
|
+
*/
|
|
415
|
+
_upload: function ($elt) {
|
|
416
|
+
let length,
|
|
417
|
+
$fileEntries,
|
|
418
|
+
entryHeight,
|
|
419
|
+
errors = [],
|
|
420
|
+
q;
|
|
421
|
+
|
|
422
|
+
const options = $elt.data(dataNs);
|
|
423
|
+
|
|
424
|
+
if (options && options.files.length) {
|
|
425
|
+
length = options.files.length;
|
|
426
|
+
$fileEntries = $('ul', options.$dropZone);
|
|
427
|
+
entryHeight = $('li:first', $fileEntries).outerHeight();
|
|
428
|
+
|
|
429
|
+
//create an async queue to start uploads
|
|
430
|
+
q = async.queue(function (file, done) {
|
|
431
|
+
var $fileEntry = $('li[data-file-name="' + file.name + '"]', $fileEntries);
|
|
432
|
+
var $status = $('.status', $fileEntry);
|
|
433
|
+
var index = $fileEntries.children().index($fileEntry);
|
|
434
|
+
|
|
435
|
+
//update the scroll into the element
|
|
436
|
+
options.$dropZone.stop(true, true).animate({ scrollTop: index * entryHeight }, 25);
|
|
437
|
+
|
|
438
|
+
$status.removeClass('success').removeClass('error').addClass('sending');
|
|
439
|
+
|
|
440
|
+
//send (upload) the file
|
|
441
|
+
options.$form.sendfile({
|
|
442
|
+
url: options.uploadUrl,
|
|
443
|
+
file: file,
|
|
444
|
+
loaded: function (result) {
|
|
445
|
+
$status.removeClass('sending').removeClass('error').addClass('success');
|
|
446
|
+
done(null, result);
|
|
447
|
+
},
|
|
448
|
+
failed: function (message) {
|
|
449
|
+
message = message || options.defaultErrMsg;
|
|
450
|
+
$status.removeClass('sending').removeClass('success').addClass('error').attr('title', message);
|
|
451
|
+
done(new Error(message));
|
|
452
|
+
}
|
|
453
|
+
});
|
|
454
|
+
}, options.uploadQueueSize || 1);
|
|
455
|
+
|
|
456
|
+
//disable buttons
|
|
457
|
+
options.$uploadBtn.prop('disabled', true);
|
|
458
|
+
options.$resetBtn.prop('disabled', true);
|
|
459
|
+
|
|
460
|
+
options.$progressBar.progressbar('value', 0);
|
|
461
|
+
|
|
462
|
+
//start pushing uploads into the queue
|
|
463
|
+
_.forEach(options.files, function (file, index) {
|
|
464
|
+
_.delay(function () {
|
|
465
|
+
q.push(file, function (err, result) {
|
|
466
|
+
var complete = ((index + 1) / length) * 100;
|
|
467
|
+
|
|
468
|
+
if (err) {
|
|
469
|
+
errors.push(err);
|
|
470
|
+
|
|
471
|
+
/**
|
|
472
|
+
* The file fails to upload
|
|
473
|
+
* @event uploader#fail.uploader
|
|
474
|
+
* @param {Object} file - the uploaded file
|
|
475
|
+
* @param {Object} err - the error
|
|
476
|
+
*/
|
|
477
|
+
$elt.trigger('fail.' + ns, [file, err]);
|
|
478
|
+
} else {
|
|
479
|
+
/**
|
|
480
|
+
* A file is uploaded
|
|
481
|
+
* @event uploader#upload.uploader
|
|
482
|
+
* @param {Object} file - the uploaded file
|
|
483
|
+
* @param {Object} result - the upload response
|
|
484
|
+
*/
|
|
485
|
+
$elt.trigger('upload.' + ns, [file, result]);
|
|
486
|
+
}
|
|
487
|
+
|
|
488
|
+
//update progress bar regarding the number of files uploaded
|
|
489
|
+
options.$progressBar.progressbar('value', complete);
|
|
490
|
+
|
|
491
|
+
if (complete >= 100) {
|
|
492
|
+
if (errors.length === length) {
|
|
493
|
+
options.$progressBar.addClass('error');
|
|
494
|
+
} else if (errors.length > 0) {
|
|
495
|
+
options.$progressBar.addClass('warning');
|
|
496
|
+
} else {
|
|
497
|
+
options.$progressBar.addClass('success');
|
|
498
|
+
}
|
|
499
|
+
|
|
500
|
+
/**
|
|
501
|
+
* The upload sequence is complete
|
|
502
|
+
* @event uploader#end.uploader
|
|
503
|
+
*/
|
|
504
|
+
$elt.trigger('end.' + ns);
|
|
505
|
+
}
|
|
506
|
+
});
|
|
507
|
+
}, 50);
|
|
508
|
+
});
|
|
509
|
+
}
|
|
510
|
+
},
|
|
511
|
+
|
|
512
|
+
/**
|
|
513
|
+
* Read the selected file.
|
|
514
|
+
*
|
|
515
|
+
* TODO update files status and progress bar by file
|
|
516
|
+
*
|
|
517
|
+
* Called the jQuery way once registered by the Pluginifier:
|
|
518
|
+
* @example $('selector').uploader('read');
|
|
519
|
+
*
|
|
520
|
+
* @param {jQueryElement} $elt - plugin's element
|
|
521
|
+
* @fires uploader#readstart.uploader
|
|
522
|
+
* @fires uploader#readend.uploader
|
|
523
|
+
*/
|
|
524
|
+
_read: function ($elt) {
|
|
525
|
+
var options = $elt.data(dataNs);
|
|
526
|
+
|
|
527
|
+
if (options && options.files.length) {
|
|
528
|
+
_.forEach(options.files, function (file) {
|
|
529
|
+
// Let's read the file to get its base64 encoded content.
|
|
530
|
+
var reader = new FileReader();
|
|
531
|
+
|
|
532
|
+
reader.onload = function (e) {
|
|
533
|
+
options.$progressBar.progressbar('value', 100);
|
|
534
|
+
|
|
535
|
+
/**
|
|
536
|
+
* The read is fininshed
|
|
537
|
+
* @event uploader#readend.uploader
|
|
538
|
+
* @param {Object} file - the reading file
|
|
539
|
+
* @param {Object} result - the content
|
|
540
|
+
*/
|
|
541
|
+
$elt.trigger('readend.' + ns, [file, e.target.result]);
|
|
542
|
+
};
|
|
543
|
+
|
|
544
|
+
reader.onloadstart = function () {
|
|
545
|
+
options.$progressBar.progressbar('value', 0);
|
|
546
|
+
|
|
547
|
+
/**
|
|
548
|
+
* The reading starts
|
|
549
|
+
* @event uploader#readstart.uploader
|
|
550
|
+
* @param {Object} file - the reading file
|
|
551
|
+
*/
|
|
552
|
+
$elt.trigger('readstart.' + ns, [file]);
|
|
553
|
+
};
|
|
554
|
+
|
|
555
|
+
if (options.$progressBar.length) {
|
|
556
|
+
reader.onprogress = function (e) {
|
|
557
|
+
var percentProgress = Math.ceil((Math.round(e.loaded) / Math.round(e.total)) * 100);
|
|
558
|
+
options.$progressBar.progressbar('value', percentProgress);
|
|
559
|
+
};
|
|
560
|
+
}
|
|
561
|
+
reader.readAsDataURL(file);
|
|
562
|
+
});
|
|
563
|
+
}
|
|
564
|
+
},
|
|
565
|
+
|
|
566
|
+
/**
|
|
567
|
+
* Destroy completely the plugin.
|
|
568
|
+
*
|
|
569
|
+
* Called the jQuery way once registered by the Pluginifier:
|
|
570
|
+
* @example $('selector').uploader('destroy');
|
|
571
|
+
*
|
|
572
|
+
* @fires uploader#destroy.uploader
|
|
573
|
+
*/
|
|
574
|
+
destroy: function () {
|
|
575
|
+
this.each(function () {
|
|
576
|
+
var $elt = $(this);
|
|
577
|
+
|
|
578
|
+
$(document)
|
|
579
|
+
.off('drop.' + ns)
|
|
580
|
+
.off('dragover.' + ns);
|
|
581
|
+
|
|
582
|
+
$elt.empty();
|
|
583
|
+
|
|
584
|
+
/**
|
|
585
|
+
* The plugin has been destroyed.
|
|
586
|
+
* @event uploader#destroy.uploader
|
|
587
|
+
*/
|
|
588
|
+
$elt.trigger('destroy.' + ns);
|
|
589
|
+
});
|
|
590
|
+
}
|
|
591
|
+
};
|
|
592
|
+
|
|
593
|
+
//Register the incrementer to behave as a jQuery plugin.
|
|
594
|
+
Pluginifier.register(ns, uploader, { expose: ['reset', 'selectFiles', 'upload', 'read'] });
|