@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/datetime/picker.js
CHANGED
|
@@ -1,576 +1,576 @@
|
|
|
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) 2019 (original work) Open Assessment Technologies SA
|
|
17
|
-
*
|
|
18
|
-
*/
|
|
19
|
-
|
|
20
|
-
/**
|
|
21
|
-
* Date/Time picker component.
|
|
22
|
-
* It supports different setups : date-range, datetime-range, date, time and datetime
|
|
23
|
-
* It supports localized format.
|
|
24
|
-
* It supports either hooking a field, replacing it and adding controls.
|
|
25
|
-
*
|
|
26
|
-
* It wraps the library Flatpickr (https://flatpickr.js.org)
|
|
27
|
-
*
|
|
28
|
-
* @example
|
|
29
|
-
* dateTimePicker(container, {
|
|
30
|
-
* setup : 'date',
|
|
31
|
-
* format : 'YYYY-MM-DD',
|
|
32
|
-
* controlButtons : true
|
|
33
|
-
* })
|
|
34
|
-
* .on('change', function(value){
|
|
35
|
-
* if (value === '1983-04-03'){
|
|
36
|
-
* //...
|
|
37
|
-
* }
|
|
38
|
-
* });
|
|
39
|
-
*
|
|
40
|
-
* @author Bertrand Chevrier <bertrand@taotesting.com>
|
|
41
|
-
*/
|
|
42
|
-
import _ from 'lodash';
|
|
43
|
-
import __ from 'i18n';
|
|
44
|
-
import moment from 'moment';
|
|
45
|
-
import component from 'ui/component';
|
|
46
|
-
import flatpickr from 'lib/flatpickr/flatpickr';
|
|
47
|
-
import flatpickrLocalization from 'lib/flatpickr/l10n/index';
|
|
48
|
-
import dateTimePickerTpl from 'ui/datetime/tpl/picker';
|
|
49
|
-
import 'lib/flatpickr/flatpickr.css';
|
|
50
|
-
import 'ui/datetime/css/picker.css';
|
|
51
|
-
|
|
52
|
-
/**
|
|
53
|
-
* The supported formats
|
|
54
|
-
*/
|
|
55
|
-
var formats = {
|
|
56
|
-
date: {
|
|
57
|
-
default: 'YYYY-MM-DD',
|
|
58
|
-
localized: 'L'
|
|
59
|
-
},
|
|
60
|
-
time: {
|
|
61
|
-
default: 'HH:mm',
|
|
62
|
-
localized: 'LT'
|
|
63
|
-
},
|
|
64
|
-
datetime: {
|
|
65
|
-
default: 'YYYY-MM-DD HH:mm',
|
|
66
|
-
localized: 'L LT'
|
|
67
|
-
}
|
|
68
|
-
};
|
|
69
|
-
|
|
70
|
-
/**
|
|
71
|
-
* Possible setups for the picker
|
|
72
|
-
*/
|
|
73
|
-
var setups = {
|
|
74
|
-
'date-range': {
|
|
75
|
-
mode: 'range',
|
|
76
|
-
label: __('date range'),
|
|
77
|
-
format: formats.date
|
|
78
|
-
},
|
|
79
|
-
'datetime-range': {
|
|
80
|
-
mode: 'range',
|
|
81
|
-
label: __('date time range'),
|
|
82
|
-
enableTime: true,
|
|
83
|
-
format: formats.datetime
|
|
84
|
-
},
|
|
85
|
-
date: {
|
|
86
|
-
mode: 'single',
|
|
87
|
-
format: formats.date
|
|
88
|
-
},
|
|
89
|
-
time: {
|
|
90
|
-
mode: 'single',
|
|
91
|
-
enableTime: true,
|
|
92
|
-
label: __('time'),
|
|
93
|
-
noCalendar: true,
|
|
94
|
-
format: formats.time
|
|
95
|
-
},
|
|
96
|
-
datetime: {
|
|
97
|
-
mode: 'single',
|
|
98
|
-
enableTime: true,
|
|
99
|
-
label: __('date time'),
|
|
100
|
-
format: formats.datetime
|
|
101
|
-
}
|
|
102
|
-
};
|
|
103
|
-
|
|
104
|
-
/**
|
|
105
|
-
* List of supported constraints
|
|
106
|
-
*/
|
|
107
|
-
var supportedConstraints = ['minDate', 'maxDate', 'enable', 'disable'];
|
|
108
|
-
|
|
109
|
-
/**
|
|
110
|
-
* Checks translation existing for given locale
|
|
111
|
-
* @param {String} locale
|
|
112
|
-
* @returns {Boolean}
|
|
113
|
-
*/
|
|
114
|
-
const hasTranslationsForLocale = locale => _.isObject(flatpickrLocalization[locale]);
|
|
115
|
-
|
|
116
|
-
/**
|
|
117
|
-
* Detects document language
|
|
118
|
-
* @returns {String | undefined}
|
|
119
|
-
*/
|
|
120
|
-
const getDefaultLocale = () => {
|
|
121
|
-
const documentLang = window.document.documentElement.getAttribute('lang');
|
|
122
|
-
const documentLocale = documentLang && documentLang.split('-')[0];
|
|
123
|
-
|
|
124
|
-
if (documentLocale && hasTranslationsForLocale(documentLocale)) {
|
|
125
|
-
return documentLocale;
|
|
126
|
-
}
|
|
127
|
-
};
|
|
128
|
-
|
|
129
|
-
/**
|
|
130
|
-
* The default configuration
|
|
131
|
-
* @see dateTimePickerFactory
|
|
132
|
-
*/
|
|
133
|
-
var defaultConfig = {
|
|
134
|
-
setup: 'date',
|
|
135
|
-
controlButtons: false,
|
|
136
|
-
locale: getDefaultLocale(),
|
|
137
|
-
useLocalizedFormat: false,
|
|
138
|
-
constraints: {}
|
|
139
|
-
};
|
|
140
|
-
|
|
141
|
-
/**
|
|
142
|
-
* Get the long date/time format from the localized format (LT to 'DD/MM/YYYY HH:mm')
|
|
143
|
-
* @param {String} locale - 2 digits locale code (en, fr, de, etc.)
|
|
144
|
-
* @param {String} localizedFormat - see moment's localized format (L, LT, LLLL, ...)
|
|
145
|
-
* @returns {String|boolean} the long date/time format
|
|
146
|
-
*/
|
|
147
|
-
var getLongLocalizedFormat = function getLongLocalizedFormat(locale, localizedFormat) {
|
|
148
|
-
if (/[LT]+/.test(localizedFormat) && locale) {
|
|
149
|
-
return localizedFormat
|
|
150
|
-
.split(' ')
|
|
151
|
-
.map(function(format) {
|
|
152
|
-
return moment(new Date())
|
|
153
|
-
.locale(locale)
|
|
154
|
-
.localeData()
|
|
155
|
-
.longDateFormat(format);
|
|
156
|
-
})
|
|
157
|
-
.join(' ');
|
|
158
|
-
}
|
|
159
|
-
return false;
|
|
160
|
-
};
|
|
161
|
-
|
|
162
|
-
/**
|
|
163
|
-
* Does the given date/time format uses the am/pm pattern ?
|
|
164
|
-
* @param {String} format - moment format
|
|
165
|
-
* @returns {Boolean} true if the contains am/pm
|
|
166
|
-
*/
|
|
167
|
-
var isFormatAmPm = function isFormatAmPm(format) {
|
|
168
|
-
return format && /a$/i.test(format);
|
|
169
|
-
};
|
|
170
|
-
|
|
171
|
-
/**
|
|
172
|
-
* Does the given date/time format contains seconds ?
|
|
173
|
-
* @param {String} format - moment format
|
|
174
|
-
* @returns {Boolean} true if the format contains seconds
|
|
175
|
-
*/
|
|
176
|
-
var isFormatInSeconds = function isFormatInSeconds(format) {
|
|
177
|
-
return format && /(:ss)+/i.test(format);
|
|
178
|
-
};
|
|
179
|
-
|
|
180
|
-
/**
|
|
181
|
-
* The component factory
|
|
182
|
-
*
|
|
183
|
-
* @param {HTMLElement|jQuery} container - where to append the component
|
|
184
|
-
* @param {Object} [config]
|
|
185
|
-
* @param {String} [config.setup = date] - the picker setup in date-range, datetime-range, date, time and datetime
|
|
186
|
-
* @param {String} [config.locale] - the picker local
|
|
187
|
-
* @param {String} [config.useLocalzedFormat = false] - does the locale is used to define the format
|
|
188
|
-
* @param {String} [config.format] - define your own date/time format for the instance
|
|
189
|
-
* @param {Boolean} [config.controlButtons = false] - does the field have controls to trigger opening and reset
|
|
190
|
-
* @param {Object} [config.constraints] - date time selection constraints
|
|
191
|
-
* @param {Object} [config.constraints] - date time selection constraints
|
|
192
|
-
* @param {Array<String|Date>} [config.constraints.disable] - list of dates to disable
|
|
193
|
-
* @param {Array<String|Date>} [config.constraints.enable] - list of dates to enable (if some are disabled)
|
|
194
|
-
* @param {String|Date} [config.constraints.minDate] - minimum date to start picking from
|
|
195
|
-
* @param {String|Date} [config.constraints.maxDate] - maximum date to start picking from
|
|
196
|
-
*
|
|
197
|
-
* @param {HTMLInputElement} [config.replaceField] - an input field to replace. The field attr are taken instead of config.field
|
|
198
|
-
* @param {Object} [config.field] - the input field configuration
|
|
199
|
-
* @param {String} [config.field.name] - the input field name
|
|
200
|
-
* @param {String} [config.field.id] - the input field id
|
|
201
|
-
* @param {String} [config.field.placeholder] - the input field placeholder
|
|
202
|
-
* @param {String} [config.field.pattern] - the input field pattern mask
|
|
203
|
-
* @param {String} [config.field.value] - the input field value
|
|
204
|
-
* @param {String} [config.field.label] - label the field for a11y
|
|
205
|
-
*
|
|
206
|
-
* @returns {dateTimePickerComponent} the component instance
|
|
207
|
-
*/
|
|
208
|
-
export default function dateTimePickerFactory(container, options) {
|
|
209
|
-
var format = '';
|
|
210
|
-
var value = '';
|
|
211
|
-
|
|
212
|
-
/**
|
|
213
|
-
* @typedef {Object} dateTimePicker
|
|
214
|
-
*/
|
|
215
|
-
var dateTimePicker = component(
|
|
216
|
-
{
|
|
217
|
-
/**
|
|
218
|
-
* Get the current value
|
|
219
|
-
* @returns {String} the field value, null if none
|
|
220
|
-
*/
|
|
221
|
-
getValue: function getValue() {
|
|
222
|
-
if (this.is('rendered')) {
|
|
223
|
-
return this.controls.input.value;
|
|
224
|
-
}
|
|
225
|
-
return null;
|
|
226
|
-
},
|
|
227
|
-
|
|
228
|
-
/**
|
|
229
|
-
* Set the current value
|
|
230
|
-
* @param {String|Date} newValue - the new value matching the format
|
|
231
|
-
*/
|
|
232
|
-
setValue: function setValue(newValue) {
|
|
233
|
-
if (this.is('ready')) {
|
|
234
|
-
value = newValue;
|
|
235
|
-
|
|
236
|
-
if (_.isString(value)) {
|
|
237
|
-
this.controls.input.value = value;
|
|
238
|
-
}
|
|
239
|
-
this.picker.setDate(value, true);
|
|
240
|
-
}
|
|
241
|
-
return null;
|
|
242
|
-
},
|
|
243
|
-
|
|
244
|
-
/**
|
|
245
|
-
* Get the dates currently selected.
|
|
246
|
-
* Usefull for the range mode to get the date list
|
|
247
|
-
* @returns {Array<[Date|String]>|boolean} the selected dates
|
|
248
|
-
*/
|
|
249
|
-
getSelectedDates: function getSelectedDates() {
|
|
250
|
-
var selection;
|
|
251
|
-
if (this.is('ready') && this.picker) {
|
|
252
|
-
selection = this.picker.selectedDates;
|
|
253
|
-
if (selection && !_.isArray(selection)) {
|
|
254
|
-
return [selection];
|
|
255
|
-
}
|
|
256
|
-
return selection;
|
|
257
|
-
}
|
|
258
|
-
return false;
|
|
259
|
-
},
|
|
260
|
-
|
|
261
|
-
/**
|
|
262
|
-
* Get the date/time format description, ie. 'YYYY-MM-DD'
|
|
263
|
-
* @returns {String} the format
|
|
264
|
-
*/
|
|
265
|
-
getFormat: function getFormat() {
|
|
266
|
-
return format;
|
|
267
|
-
},
|
|
268
|
-
|
|
269
|
-
/**
|
|
270
|
-
* Open the picker
|
|
271
|
-
* @returns {dateTimePicker} chains
|
|
272
|
-
* @fires dateTimePicker#open
|
|
273
|
-
*/
|
|
274
|
-
open: function open() {
|
|
275
|
-
if (this.is('ready')) {
|
|
276
|
-
this.picker.open();
|
|
277
|
-
}
|
|
278
|
-
return this;
|
|
279
|
-
},
|
|
280
|
-
|
|
281
|
-
/**
|
|
282
|
-
* Close the picker
|
|
283
|
-
* @returns {dateTimePicker} chains
|
|
284
|
-
* @fires dateTimePicker#close
|
|
285
|
-
*/
|
|
286
|
-
close: function close() {
|
|
287
|
-
if (this.is('ready')) {
|
|
288
|
-
this.picker.close();
|
|
289
|
-
}
|
|
290
|
-
return this;
|
|
291
|
-
},
|
|
292
|
-
|
|
293
|
-
/**
|
|
294
|
-
* Clear the field content and close the picker
|
|
295
|
-
* @returns {dateTimePicker} chains
|
|
296
|
-
* @fires dateTimePicker#close
|
|
297
|
-
* @fires dateTimePicker#clear
|
|
298
|
-
*/
|
|
299
|
-
clear: function clear() {
|
|
300
|
-
if (this.is('ready')) {
|
|
301
|
-
value = '';
|
|
302
|
-
|
|
303
|
-
this.picker.close();
|
|
304
|
-
this.picker.clear();
|
|
305
|
-
|
|
306
|
-
/**
|
|
307
|
-
* The picker get cleared
|
|
308
|
-
* @event dateTimePicker#clear
|
|
309
|
-
*/
|
|
310
|
-
this.trigger('clear');
|
|
311
|
-
}
|
|
312
|
-
return this;
|
|
313
|
-
},
|
|
314
|
-
|
|
315
|
-
/**
|
|
316
|
-
* Clear the field content and close the picker
|
|
317
|
-
* @returns {dateTimePicker} chains
|
|
318
|
-
* @fires dateTimePicker#open
|
|
319
|
-
* @fires dateTimePicker#close
|
|
320
|
-
*/
|
|
321
|
-
toggle: function toogle() {
|
|
322
|
-
if (this.is('ready')) {
|
|
323
|
-
this.picker.toggle();
|
|
324
|
-
}
|
|
325
|
-
return this;
|
|
326
|
-
},
|
|
327
|
-
|
|
328
|
-
/**
|
|
329
|
-
* Update constraints on a running instance
|
|
330
|
-
* @param {String} constraint - the constraint name in minDate, maxDate, enable, disable
|
|
331
|
-
* @param {*} constraintValue - the constraint value to update
|
|
332
|
-
* @returns {dateTimePicker} chains
|
|
333
|
-
* @fires dateTimePicker#open
|
|
334
|
-
* @fires dateTimePicker#close
|
|
335
|
-
*/
|
|
336
|
-
updateConstraints: function updateConstraints(constraint, constraintValue) {
|
|
337
|
-
if (this.is('ready')) {
|
|
338
|
-
if (_.contains(supportedConstraints, constraint)) {
|
|
339
|
-
this.picker.set(constraint, constraintValue);
|
|
340
|
-
}
|
|
341
|
-
}
|
|
342
|
-
return this;
|
|
343
|
-
}
|
|
344
|
-
},
|
|
345
|
-
defaultConfig
|
|
346
|
-
);
|
|
347
|
-
|
|
348
|
-
dateTimePicker
|
|
349
|
-
.setTemplate(dateTimePickerTpl)
|
|
350
|
-
.on('init', function() {
|
|
351
|
-
var self = this;
|
|
352
|
-
|
|
353
|
-
var locale;
|
|
354
|
-
var setup = setups[this.config.setup] || setups.datetime;
|
|
355
|
-
|
|
356
|
-
//map the locale from the options to the picker locale
|
|
357
|
-
if (this.config.locale && hasTranslationsForLocale(this.config.locale)) {
|
|
358
|
-
locale = this.config.locale;
|
|
359
|
-
}
|
|
360
|
-
|
|
361
|
-
//date/time format
|
|
362
|
-
if (locale && this.config.useLocalizedFormat) {
|
|
363
|
-
//get the format from the locale
|
|
364
|
-
format = getLongLocalizedFormat(locale, setup.format.localized);
|
|
365
|
-
} else {
|
|
366
|
-
//get the format from the config
|
|
367
|
-
format = this.config.format || setup.format.default;
|
|
368
|
-
}
|
|
369
|
-
|
|
370
|
-
//input field configuration
|
|
371
|
-
this.config.field = this.config.field || {};
|
|
372
|
-
|
|
373
|
-
// replace a field by the date picker input field
|
|
374
|
-
//TODO consider replacing data-attr and classes
|
|
375
|
-
if (this.config.replaceField && this.config.replaceField instanceof HTMLInputElement) {
|
|
376
|
-
this.config.field.id = this.config.replaceField.id;
|
|
377
|
-
this.config.field.name = this.config.replaceField.name;
|
|
378
|
-
this.config.field.placeholder = this.config.replaceField.placeholder;
|
|
379
|
-
this.config.field.value = this.config.replaceField.value;
|
|
380
|
-
this.config.field.pattern = this.config.replaceField.pattern;
|
|
381
|
-
|
|
382
|
-
this.config.replaceField.parentNode.removeChild(this.config.replaceField);
|
|
383
|
-
}
|
|
384
|
-
|
|
385
|
-
if (!this.config.field.placeholder && format && setup.mode === 'single') {
|
|
386
|
-
this.config.field.placeholder = format.toLowerCase();
|
|
387
|
-
}
|
|
388
|
-
if (!this.config.field.label) {
|
|
389
|
-
this.config.field.label = setup.label;
|
|
390
|
-
}
|
|
391
|
-
|
|
392
|
-
/**
|
|
393
|
-
* Build the configuration of the picker
|
|
394
|
-
* @see https://flatpickr.js.org/options/
|
|
395
|
-
*/
|
|
396
|
-
this.pickerConfig = {
|
|
397
|
-
mode: setup.mode,
|
|
398
|
-
enableTime: !!setup.enableTime,
|
|
399
|
-
noCalendar: !!setup.noCalendar,
|
|
400
|
-
time_24hr: !isFormatAmPm(format),
|
|
401
|
-
enableSeconds: setup.enableTime && isFormatInSeconds(format),
|
|
402
|
-
allowInput: true,
|
|
403
|
-
clickOpens: !this.config.controlButtons,
|
|
404
|
-
disableMobile: true,
|
|
405
|
-
|
|
406
|
-
/**
|
|
407
|
-
* How flatpickr will format the given date
|
|
408
|
-
* @param {Date} date
|
|
409
|
-
* @returns {String} the formatted date
|
|
410
|
-
*/
|
|
411
|
-
formatDate: function formatDate(date) {
|
|
412
|
-
return moment(date).format(format);
|
|
413
|
-
},
|
|
414
|
-
|
|
415
|
-
/**
|
|
416
|
-
* How flatpickr parse the given input
|
|
417
|
-
* @param {String} dateString
|
|
418
|
-
* @returns {Date}
|
|
419
|
-
*/
|
|
420
|
-
parseDate: function parseDate(dateString) {
|
|
421
|
-
return moment(dateString, format).toDate();
|
|
422
|
-
},
|
|
423
|
-
|
|
424
|
-
/**
|
|
425
|
-
* When the picker is opened
|
|
426
|
-
* @fires dateTimePicker#open
|
|
427
|
-
*/
|
|
428
|
-
onOpen: function onOpen() {
|
|
429
|
-
/**
|
|
430
|
-
* The picker get opened
|
|
431
|
-
* @event dateTimePicker#open
|
|
432
|
-
*/
|
|
433
|
-
self.trigger('open');
|
|
434
|
-
},
|
|
435
|
-
|
|
436
|
-
/**
|
|
437
|
-
* When the picker is opened
|
|
438
|
-
* @fires dateTimePicker#close
|
|
439
|
-
*/
|
|
440
|
-
onClose: function onClose() {
|
|
441
|
-
/**
|
|
442
|
-
* The picker get closed
|
|
443
|
-
* @event dateTimePicker#close
|
|
444
|
-
*/
|
|
445
|
-
self.trigger('close');
|
|
446
|
-
},
|
|
447
|
-
|
|
448
|
-
/**
|
|
449
|
-
* Hook flatpickr error handler
|
|
450
|
-
* @param {Error} err - the thrown error
|
|
451
|
-
*/
|
|
452
|
-
errorHandler: function errorHandler(err) {
|
|
453
|
-
if (err instanceof Error) {
|
|
454
|
-
//if an invalid date is provided
|
|
455
|
-
//add a visual feedback indicating why the field get emptied
|
|
456
|
-
if (/^Invalid date/.test(err.message)) {
|
|
457
|
-
self.controls.input.classList.add('error');
|
|
458
|
-
_.delay(function() {
|
|
459
|
-
self.controls.input.classList.remove('error');
|
|
460
|
-
}, 1000);
|
|
461
|
-
} else {
|
|
462
|
-
/**
|
|
463
|
-
* Unexpected error
|
|
464
|
-
* @event dateTimePicker#error
|
|
465
|
-
* @param {Error} err
|
|
466
|
-
*/
|
|
467
|
-
self.trigger('error', err);
|
|
468
|
-
}
|
|
469
|
-
}
|
|
470
|
-
}
|
|
471
|
-
};
|
|
472
|
-
//locale should be defined only if set...
|
|
473
|
-
if (locale) {
|
|
474
|
-
this.pickerConfig.locale = locale;
|
|
475
|
-
}
|
|
476
|
-
|
|
477
|
-
_.forEach(this.config.constraints, function(constraintValue, constraint) {
|
|
478
|
-
if (_.contains(supportedConstraints, constraint) && constraintValue) {
|
|
479
|
-
self.pickerConfig[constraint] = constraintValue;
|
|
480
|
-
}
|
|
481
|
-
});
|
|
482
|
-
|
|
483
|
-
//render into the container
|
|
484
|
-
if (container) {
|
|
485
|
-
setTimeout(function() {
|
|
486
|
-
self.render(container);
|
|
487
|
-
}, 0);
|
|
488
|
-
}
|
|
489
|
-
})
|
|
490
|
-
.on('render', function() {
|
|
491
|
-
var self = this;
|
|
492
|
-
|
|
493
|
-
var element = this.getElement()[0];
|
|
494
|
-
|
|
495
|
-
this.controls = {
|
|
496
|
-
input: element.querySelector('input')
|
|
497
|
-
};
|
|
498
|
-
|
|
499
|
-
//always scope the picker to the component container
|
|
500
|
-
//in order to scope and style each instance
|
|
501
|
-
this.pickerConfig.appendTo = element;
|
|
502
|
-
|
|
503
|
-
//behavior of the right buttons if configured
|
|
504
|
-
if (this.config.controlButtons) {
|
|
505
|
-
this.controls.toggleButton = element.querySelector('.picker-toggle');
|
|
506
|
-
this.controls.clearButton = element.querySelector('.picker-clear');
|
|
507
|
-
|
|
508
|
-
this.controls.toggleButton.addEventListener('click', function(e) {
|
|
509
|
-
e.preventDefault();
|
|
510
|
-
e.stopPropagation();
|
|
511
|
-
self.toggle();
|
|
512
|
-
});
|
|
513
|
-
|
|
514
|
-
this.controls.clearButton.addEventListener('click', function(e) {
|
|
515
|
-
e.preventDefault();
|
|
516
|
-
e.stopPropagation();
|
|
517
|
-
self.clear();
|
|
518
|
-
});
|
|
519
|
-
}
|
|
520
|
-
|
|
521
|
-
this.controls.input.addEventListener('change', function() {
|
|
522
|
-
var newValue = self.controls.input.value;
|
|
523
|
-
|
|
524
|
-
if (value && _.isString(newValue) && _.isEmpty(newValue)) {
|
|
525
|
-
//if someone remove the value from the field
|
|
526
|
-
//it's considered a property clean (resets everything)
|
|
527
|
-
self.clear();
|
|
528
|
-
} else if (value !== newValue) {
|
|
529
|
-
value = newValue;
|
|
530
|
-
|
|
531
|
-
/**
|
|
532
|
-
* A value get changed
|
|
533
|
-
* @event dateTimePicker#change
|
|
534
|
-
* @param {String} value - the date/time value
|
|
535
|
-
*/
|
|
536
|
-
self.trigger('change', value);
|
|
537
|
-
}
|
|
538
|
-
});
|
|
539
|
-
|
|
540
|
-
value = this.controls.input.value;
|
|
541
|
-
|
|
542
|
-
//instantiate the picker
|
|
543
|
-
_.defer(function() {
|
|
544
|
-
self.picker = flatpickr(self.controls.input, self.pickerConfig);
|
|
545
|
-
|
|
546
|
-
self.enable()
|
|
547
|
-
.setState('ready', true)
|
|
548
|
-
.trigger('ready');
|
|
549
|
-
});
|
|
550
|
-
})
|
|
551
|
-
.on('enable', function() {
|
|
552
|
-
if (this.controls) {
|
|
553
|
-
this.controls.input.disabled = false;
|
|
554
|
-
if (this.config.controlButtons) {
|
|
555
|
-
this.controls.toggleButton.disabled = false;
|
|
556
|
-
this.controls.clearButton.disabled = false;
|
|
557
|
-
}
|
|
558
|
-
}
|
|
559
|
-
})
|
|
560
|
-
.on('disable', function() {
|
|
561
|
-
if (this.controls) {
|
|
562
|
-
this.controls.input.disabled = true;
|
|
563
|
-
if (this.config.controlButtons) {
|
|
564
|
-
this.controls.toggleButton.disabled = true;
|
|
565
|
-
this.controls.clearButton.disabled = true;
|
|
566
|
-
}
|
|
567
|
-
}
|
|
568
|
-
});
|
|
569
|
-
|
|
570
|
-
//defered init to catch the event
|
|
571
|
-
setTimeout(function() {
|
|
572
|
-
dateTimePicker.init(options);
|
|
573
|
-
}, 0);
|
|
574
|
-
|
|
575
|
-
return dateTimePicker;
|
|
576
|
-
}
|
|
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) 2019 (original work) Open Assessment Technologies SA
|
|
17
|
+
*
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Date/Time picker component.
|
|
22
|
+
* It supports different setups : date-range, datetime-range, date, time and datetime
|
|
23
|
+
* It supports localized format.
|
|
24
|
+
* It supports either hooking a field, replacing it and adding controls.
|
|
25
|
+
*
|
|
26
|
+
* It wraps the library Flatpickr (https://flatpickr.js.org)
|
|
27
|
+
*
|
|
28
|
+
* @example
|
|
29
|
+
* dateTimePicker(container, {
|
|
30
|
+
* setup : 'date',
|
|
31
|
+
* format : 'YYYY-MM-DD',
|
|
32
|
+
* controlButtons : true
|
|
33
|
+
* })
|
|
34
|
+
* .on('change', function(value){
|
|
35
|
+
* if (value === '1983-04-03'){
|
|
36
|
+
* //...
|
|
37
|
+
* }
|
|
38
|
+
* });
|
|
39
|
+
*
|
|
40
|
+
* @author Bertrand Chevrier <bertrand@taotesting.com>
|
|
41
|
+
*/
|
|
42
|
+
import _ from 'lodash';
|
|
43
|
+
import __ from 'i18n';
|
|
44
|
+
import moment from 'moment';
|
|
45
|
+
import component from 'ui/component';
|
|
46
|
+
import flatpickr from 'lib/flatpickr/flatpickr';
|
|
47
|
+
import flatpickrLocalization from 'lib/flatpickr/l10n/index';
|
|
48
|
+
import dateTimePickerTpl from 'ui/datetime/tpl/picker';
|
|
49
|
+
import 'lib/flatpickr/flatpickr.css';
|
|
50
|
+
import 'ui/datetime/css/picker.css';
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* The supported formats
|
|
54
|
+
*/
|
|
55
|
+
var formats = {
|
|
56
|
+
date: {
|
|
57
|
+
default: 'YYYY-MM-DD',
|
|
58
|
+
localized: 'L'
|
|
59
|
+
},
|
|
60
|
+
time: {
|
|
61
|
+
default: 'HH:mm',
|
|
62
|
+
localized: 'LT'
|
|
63
|
+
},
|
|
64
|
+
datetime: {
|
|
65
|
+
default: 'YYYY-MM-DD HH:mm',
|
|
66
|
+
localized: 'L LT'
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Possible setups for the picker
|
|
72
|
+
*/
|
|
73
|
+
var setups = {
|
|
74
|
+
'date-range': {
|
|
75
|
+
mode: 'range',
|
|
76
|
+
label: __('date range'),
|
|
77
|
+
format: formats.date
|
|
78
|
+
},
|
|
79
|
+
'datetime-range': {
|
|
80
|
+
mode: 'range',
|
|
81
|
+
label: __('date time range'),
|
|
82
|
+
enableTime: true,
|
|
83
|
+
format: formats.datetime
|
|
84
|
+
},
|
|
85
|
+
date: {
|
|
86
|
+
mode: 'single',
|
|
87
|
+
format: formats.date
|
|
88
|
+
},
|
|
89
|
+
time: {
|
|
90
|
+
mode: 'single',
|
|
91
|
+
enableTime: true,
|
|
92
|
+
label: __('time'),
|
|
93
|
+
noCalendar: true,
|
|
94
|
+
format: formats.time
|
|
95
|
+
},
|
|
96
|
+
datetime: {
|
|
97
|
+
mode: 'single',
|
|
98
|
+
enableTime: true,
|
|
99
|
+
label: __('date time'),
|
|
100
|
+
format: formats.datetime
|
|
101
|
+
}
|
|
102
|
+
};
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* List of supported constraints
|
|
106
|
+
*/
|
|
107
|
+
var supportedConstraints = ['minDate', 'maxDate', 'enable', 'disable'];
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* Checks translation existing for given locale
|
|
111
|
+
* @param {String} locale
|
|
112
|
+
* @returns {Boolean}
|
|
113
|
+
*/
|
|
114
|
+
const hasTranslationsForLocale = locale => _.isObject(flatpickrLocalization[locale]);
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* Detects document language
|
|
118
|
+
* @returns {String | undefined}
|
|
119
|
+
*/
|
|
120
|
+
const getDefaultLocale = () => {
|
|
121
|
+
const documentLang = window.document.documentElement.getAttribute('lang');
|
|
122
|
+
const documentLocale = documentLang && documentLang.split('-')[0];
|
|
123
|
+
|
|
124
|
+
if (documentLocale && hasTranslationsForLocale(documentLocale)) {
|
|
125
|
+
return documentLocale;
|
|
126
|
+
}
|
|
127
|
+
};
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* The default configuration
|
|
131
|
+
* @see dateTimePickerFactory
|
|
132
|
+
*/
|
|
133
|
+
var defaultConfig = {
|
|
134
|
+
setup: 'date',
|
|
135
|
+
controlButtons: false,
|
|
136
|
+
locale: getDefaultLocale(),
|
|
137
|
+
useLocalizedFormat: false,
|
|
138
|
+
constraints: {}
|
|
139
|
+
};
|
|
140
|
+
|
|
141
|
+
/**
|
|
142
|
+
* Get the long date/time format from the localized format (LT to 'DD/MM/YYYY HH:mm')
|
|
143
|
+
* @param {String} locale - 2 digits locale code (en, fr, de, etc.)
|
|
144
|
+
* @param {String} localizedFormat - see moment's localized format (L, LT, LLLL, ...)
|
|
145
|
+
* @returns {String|boolean} the long date/time format
|
|
146
|
+
*/
|
|
147
|
+
var getLongLocalizedFormat = function getLongLocalizedFormat(locale, localizedFormat) {
|
|
148
|
+
if (/[LT]+/.test(localizedFormat) && locale) {
|
|
149
|
+
return localizedFormat
|
|
150
|
+
.split(' ')
|
|
151
|
+
.map(function(format) {
|
|
152
|
+
return moment(new Date())
|
|
153
|
+
.locale(locale)
|
|
154
|
+
.localeData()
|
|
155
|
+
.longDateFormat(format);
|
|
156
|
+
})
|
|
157
|
+
.join(' ');
|
|
158
|
+
}
|
|
159
|
+
return false;
|
|
160
|
+
};
|
|
161
|
+
|
|
162
|
+
/**
|
|
163
|
+
* Does the given date/time format uses the am/pm pattern ?
|
|
164
|
+
* @param {String} format - moment format
|
|
165
|
+
* @returns {Boolean} true if the contains am/pm
|
|
166
|
+
*/
|
|
167
|
+
var isFormatAmPm = function isFormatAmPm(format) {
|
|
168
|
+
return format && /a$/i.test(format);
|
|
169
|
+
};
|
|
170
|
+
|
|
171
|
+
/**
|
|
172
|
+
* Does the given date/time format contains seconds ?
|
|
173
|
+
* @param {String} format - moment format
|
|
174
|
+
* @returns {Boolean} true if the format contains seconds
|
|
175
|
+
*/
|
|
176
|
+
var isFormatInSeconds = function isFormatInSeconds(format) {
|
|
177
|
+
return format && /(:ss)+/i.test(format);
|
|
178
|
+
};
|
|
179
|
+
|
|
180
|
+
/**
|
|
181
|
+
* The component factory
|
|
182
|
+
*
|
|
183
|
+
* @param {HTMLElement|jQuery} container - where to append the component
|
|
184
|
+
* @param {Object} [config]
|
|
185
|
+
* @param {String} [config.setup = date] - the picker setup in date-range, datetime-range, date, time and datetime
|
|
186
|
+
* @param {String} [config.locale] - the picker local
|
|
187
|
+
* @param {String} [config.useLocalzedFormat = false] - does the locale is used to define the format
|
|
188
|
+
* @param {String} [config.format] - define your own date/time format for the instance
|
|
189
|
+
* @param {Boolean} [config.controlButtons = false] - does the field have controls to trigger opening and reset
|
|
190
|
+
* @param {Object} [config.constraints] - date time selection constraints
|
|
191
|
+
* @param {Object} [config.constraints] - date time selection constraints
|
|
192
|
+
* @param {Array<String|Date>} [config.constraints.disable] - list of dates to disable
|
|
193
|
+
* @param {Array<String|Date>} [config.constraints.enable] - list of dates to enable (if some are disabled)
|
|
194
|
+
* @param {String|Date} [config.constraints.minDate] - minimum date to start picking from
|
|
195
|
+
* @param {String|Date} [config.constraints.maxDate] - maximum date to start picking from
|
|
196
|
+
*
|
|
197
|
+
* @param {HTMLInputElement} [config.replaceField] - an input field to replace. The field attr are taken instead of config.field
|
|
198
|
+
* @param {Object} [config.field] - the input field configuration
|
|
199
|
+
* @param {String} [config.field.name] - the input field name
|
|
200
|
+
* @param {String} [config.field.id] - the input field id
|
|
201
|
+
* @param {String} [config.field.placeholder] - the input field placeholder
|
|
202
|
+
* @param {String} [config.field.pattern] - the input field pattern mask
|
|
203
|
+
* @param {String} [config.field.value] - the input field value
|
|
204
|
+
* @param {String} [config.field.label] - label the field for a11y
|
|
205
|
+
*
|
|
206
|
+
* @returns {dateTimePickerComponent} the component instance
|
|
207
|
+
*/
|
|
208
|
+
export default function dateTimePickerFactory(container, options) {
|
|
209
|
+
var format = '';
|
|
210
|
+
var value = '';
|
|
211
|
+
|
|
212
|
+
/**
|
|
213
|
+
* @typedef {Object} dateTimePicker
|
|
214
|
+
*/
|
|
215
|
+
var dateTimePicker = component(
|
|
216
|
+
{
|
|
217
|
+
/**
|
|
218
|
+
* Get the current value
|
|
219
|
+
* @returns {String} the field value, null if none
|
|
220
|
+
*/
|
|
221
|
+
getValue: function getValue() {
|
|
222
|
+
if (this.is('rendered')) {
|
|
223
|
+
return this.controls.input.value;
|
|
224
|
+
}
|
|
225
|
+
return null;
|
|
226
|
+
},
|
|
227
|
+
|
|
228
|
+
/**
|
|
229
|
+
* Set the current value
|
|
230
|
+
* @param {String|Date} newValue - the new value matching the format
|
|
231
|
+
*/
|
|
232
|
+
setValue: function setValue(newValue) {
|
|
233
|
+
if (this.is('ready')) {
|
|
234
|
+
value = newValue;
|
|
235
|
+
|
|
236
|
+
if (_.isString(value)) {
|
|
237
|
+
this.controls.input.value = value;
|
|
238
|
+
}
|
|
239
|
+
this.picker.setDate(value, true);
|
|
240
|
+
}
|
|
241
|
+
return null;
|
|
242
|
+
},
|
|
243
|
+
|
|
244
|
+
/**
|
|
245
|
+
* Get the dates currently selected.
|
|
246
|
+
* Usefull for the range mode to get the date list
|
|
247
|
+
* @returns {Array<[Date|String]>|boolean} the selected dates
|
|
248
|
+
*/
|
|
249
|
+
getSelectedDates: function getSelectedDates() {
|
|
250
|
+
var selection;
|
|
251
|
+
if (this.is('ready') && this.picker) {
|
|
252
|
+
selection = this.picker.selectedDates;
|
|
253
|
+
if (selection && !_.isArray(selection)) {
|
|
254
|
+
return [selection];
|
|
255
|
+
}
|
|
256
|
+
return selection;
|
|
257
|
+
}
|
|
258
|
+
return false;
|
|
259
|
+
},
|
|
260
|
+
|
|
261
|
+
/**
|
|
262
|
+
* Get the date/time format description, ie. 'YYYY-MM-DD'
|
|
263
|
+
* @returns {String} the format
|
|
264
|
+
*/
|
|
265
|
+
getFormat: function getFormat() {
|
|
266
|
+
return format;
|
|
267
|
+
},
|
|
268
|
+
|
|
269
|
+
/**
|
|
270
|
+
* Open the picker
|
|
271
|
+
* @returns {dateTimePicker} chains
|
|
272
|
+
* @fires dateTimePicker#open
|
|
273
|
+
*/
|
|
274
|
+
open: function open() {
|
|
275
|
+
if (this.is('ready')) {
|
|
276
|
+
this.picker.open();
|
|
277
|
+
}
|
|
278
|
+
return this;
|
|
279
|
+
},
|
|
280
|
+
|
|
281
|
+
/**
|
|
282
|
+
* Close the picker
|
|
283
|
+
* @returns {dateTimePicker} chains
|
|
284
|
+
* @fires dateTimePicker#close
|
|
285
|
+
*/
|
|
286
|
+
close: function close() {
|
|
287
|
+
if (this.is('ready')) {
|
|
288
|
+
this.picker.close();
|
|
289
|
+
}
|
|
290
|
+
return this;
|
|
291
|
+
},
|
|
292
|
+
|
|
293
|
+
/**
|
|
294
|
+
* Clear the field content and close the picker
|
|
295
|
+
* @returns {dateTimePicker} chains
|
|
296
|
+
* @fires dateTimePicker#close
|
|
297
|
+
* @fires dateTimePicker#clear
|
|
298
|
+
*/
|
|
299
|
+
clear: function clear() {
|
|
300
|
+
if (this.is('ready')) {
|
|
301
|
+
value = '';
|
|
302
|
+
|
|
303
|
+
this.picker.close();
|
|
304
|
+
this.picker.clear();
|
|
305
|
+
|
|
306
|
+
/**
|
|
307
|
+
* The picker get cleared
|
|
308
|
+
* @event dateTimePicker#clear
|
|
309
|
+
*/
|
|
310
|
+
this.trigger('clear');
|
|
311
|
+
}
|
|
312
|
+
return this;
|
|
313
|
+
},
|
|
314
|
+
|
|
315
|
+
/**
|
|
316
|
+
* Clear the field content and close the picker
|
|
317
|
+
* @returns {dateTimePicker} chains
|
|
318
|
+
* @fires dateTimePicker#open
|
|
319
|
+
* @fires dateTimePicker#close
|
|
320
|
+
*/
|
|
321
|
+
toggle: function toogle() {
|
|
322
|
+
if (this.is('ready')) {
|
|
323
|
+
this.picker.toggle();
|
|
324
|
+
}
|
|
325
|
+
return this;
|
|
326
|
+
},
|
|
327
|
+
|
|
328
|
+
/**
|
|
329
|
+
* Update constraints on a running instance
|
|
330
|
+
* @param {String} constraint - the constraint name in minDate, maxDate, enable, disable
|
|
331
|
+
* @param {*} constraintValue - the constraint value to update
|
|
332
|
+
* @returns {dateTimePicker} chains
|
|
333
|
+
* @fires dateTimePicker#open
|
|
334
|
+
* @fires dateTimePicker#close
|
|
335
|
+
*/
|
|
336
|
+
updateConstraints: function updateConstraints(constraint, constraintValue) {
|
|
337
|
+
if (this.is('ready')) {
|
|
338
|
+
if (_.contains(supportedConstraints, constraint)) {
|
|
339
|
+
this.picker.set(constraint, constraintValue);
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
return this;
|
|
343
|
+
}
|
|
344
|
+
},
|
|
345
|
+
defaultConfig
|
|
346
|
+
);
|
|
347
|
+
|
|
348
|
+
dateTimePicker
|
|
349
|
+
.setTemplate(dateTimePickerTpl)
|
|
350
|
+
.on('init', function() {
|
|
351
|
+
var self = this;
|
|
352
|
+
|
|
353
|
+
var locale;
|
|
354
|
+
var setup = setups[this.config.setup] || setups.datetime;
|
|
355
|
+
|
|
356
|
+
//map the locale from the options to the picker locale
|
|
357
|
+
if (this.config.locale && hasTranslationsForLocale(this.config.locale)) {
|
|
358
|
+
locale = this.config.locale;
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
//date/time format
|
|
362
|
+
if (locale && this.config.useLocalizedFormat) {
|
|
363
|
+
//get the format from the locale
|
|
364
|
+
format = getLongLocalizedFormat(locale, setup.format.localized);
|
|
365
|
+
} else {
|
|
366
|
+
//get the format from the config
|
|
367
|
+
format = this.config.format || setup.format.default;
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
//input field configuration
|
|
371
|
+
this.config.field = this.config.field || {};
|
|
372
|
+
|
|
373
|
+
// replace a field by the date picker input field
|
|
374
|
+
//TODO consider replacing data-attr and classes
|
|
375
|
+
if (this.config.replaceField && this.config.replaceField instanceof HTMLInputElement) {
|
|
376
|
+
this.config.field.id = this.config.replaceField.id;
|
|
377
|
+
this.config.field.name = this.config.replaceField.name;
|
|
378
|
+
this.config.field.placeholder = this.config.replaceField.placeholder;
|
|
379
|
+
this.config.field.value = this.config.replaceField.value;
|
|
380
|
+
this.config.field.pattern = this.config.replaceField.pattern;
|
|
381
|
+
|
|
382
|
+
this.config.replaceField.parentNode.removeChild(this.config.replaceField);
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
if (!this.config.field.placeholder && format && setup.mode === 'single') {
|
|
386
|
+
this.config.field.placeholder = format.toLowerCase();
|
|
387
|
+
}
|
|
388
|
+
if (!this.config.field.label) {
|
|
389
|
+
this.config.field.label = setup.label;
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
/**
|
|
393
|
+
* Build the configuration of the picker
|
|
394
|
+
* @see https://flatpickr.js.org/options/
|
|
395
|
+
*/
|
|
396
|
+
this.pickerConfig = {
|
|
397
|
+
mode: setup.mode,
|
|
398
|
+
enableTime: !!setup.enableTime,
|
|
399
|
+
noCalendar: !!setup.noCalendar,
|
|
400
|
+
time_24hr: !isFormatAmPm(format),
|
|
401
|
+
enableSeconds: setup.enableTime && isFormatInSeconds(format),
|
|
402
|
+
allowInput: true,
|
|
403
|
+
clickOpens: !this.config.controlButtons,
|
|
404
|
+
disableMobile: true,
|
|
405
|
+
|
|
406
|
+
/**
|
|
407
|
+
* How flatpickr will format the given date
|
|
408
|
+
* @param {Date} date
|
|
409
|
+
* @returns {String} the formatted date
|
|
410
|
+
*/
|
|
411
|
+
formatDate: function formatDate(date) {
|
|
412
|
+
return moment(date).format(format);
|
|
413
|
+
},
|
|
414
|
+
|
|
415
|
+
/**
|
|
416
|
+
* How flatpickr parse the given input
|
|
417
|
+
* @param {String} dateString
|
|
418
|
+
* @returns {Date}
|
|
419
|
+
*/
|
|
420
|
+
parseDate: function parseDate(dateString) {
|
|
421
|
+
return moment(dateString, format).toDate();
|
|
422
|
+
},
|
|
423
|
+
|
|
424
|
+
/**
|
|
425
|
+
* When the picker is opened
|
|
426
|
+
* @fires dateTimePicker#open
|
|
427
|
+
*/
|
|
428
|
+
onOpen: function onOpen() {
|
|
429
|
+
/**
|
|
430
|
+
* The picker get opened
|
|
431
|
+
* @event dateTimePicker#open
|
|
432
|
+
*/
|
|
433
|
+
self.trigger('open');
|
|
434
|
+
},
|
|
435
|
+
|
|
436
|
+
/**
|
|
437
|
+
* When the picker is opened
|
|
438
|
+
* @fires dateTimePicker#close
|
|
439
|
+
*/
|
|
440
|
+
onClose: function onClose() {
|
|
441
|
+
/**
|
|
442
|
+
* The picker get closed
|
|
443
|
+
* @event dateTimePicker#close
|
|
444
|
+
*/
|
|
445
|
+
self.trigger('close');
|
|
446
|
+
},
|
|
447
|
+
|
|
448
|
+
/**
|
|
449
|
+
* Hook flatpickr error handler
|
|
450
|
+
* @param {Error} err - the thrown error
|
|
451
|
+
*/
|
|
452
|
+
errorHandler: function errorHandler(err) {
|
|
453
|
+
if (err instanceof Error) {
|
|
454
|
+
//if an invalid date is provided
|
|
455
|
+
//add a visual feedback indicating why the field get emptied
|
|
456
|
+
if (/^Invalid date/.test(err.message)) {
|
|
457
|
+
self.controls.input.classList.add('error');
|
|
458
|
+
_.delay(function() {
|
|
459
|
+
self.controls.input.classList.remove('error');
|
|
460
|
+
}, 1000);
|
|
461
|
+
} else {
|
|
462
|
+
/**
|
|
463
|
+
* Unexpected error
|
|
464
|
+
* @event dateTimePicker#error
|
|
465
|
+
* @param {Error} err
|
|
466
|
+
*/
|
|
467
|
+
self.trigger('error', err);
|
|
468
|
+
}
|
|
469
|
+
}
|
|
470
|
+
}
|
|
471
|
+
};
|
|
472
|
+
//locale should be defined only if set...
|
|
473
|
+
if (locale) {
|
|
474
|
+
this.pickerConfig.locale = locale;
|
|
475
|
+
}
|
|
476
|
+
|
|
477
|
+
_.forEach(this.config.constraints, function(constraintValue, constraint) {
|
|
478
|
+
if (_.contains(supportedConstraints, constraint) && constraintValue) {
|
|
479
|
+
self.pickerConfig[constraint] = constraintValue;
|
|
480
|
+
}
|
|
481
|
+
});
|
|
482
|
+
|
|
483
|
+
//render into the container
|
|
484
|
+
if (container) {
|
|
485
|
+
setTimeout(function() {
|
|
486
|
+
self.render(container);
|
|
487
|
+
}, 0);
|
|
488
|
+
}
|
|
489
|
+
})
|
|
490
|
+
.on('render', function() {
|
|
491
|
+
var self = this;
|
|
492
|
+
|
|
493
|
+
var element = this.getElement()[0];
|
|
494
|
+
|
|
495
|
+
this.controls = {
|
|
496
|
+
input: element.querySelector('input')
|
|
497
|
+
};
|
|
498
|
+
|
|
499
|
+
//always scope the picker to the component container
|
|
500
|
+
//in order to scope and style each instance
|
|
501
|
+
this.pickerConfig.appendTo = element;
|
|
502
|
+
|
|
503
|
+
//behavior of the right buttons if configured
|
|
504
|
+
if (this.config.controlButtons) {
|
|
505
|
+
this.controls.toggleButton = element.querySelector('.picker-toggle');
|
|
506
|
+
this.controls.clearButton = element.querySelector('.picker-clear');
|
|
507
|
+
|
|
508
|
+
this.controls.toggleButton.addEventListener('click', function(e) {
|
|
509
|
+
e.preventDefault();
|
|
510
|
+
e.stopPropagation();
|
|
511
|
+
self.toggle();
|
|
512
|
+
});
|
|
513
|
+
|
|
514
|
+
this.controls.clearButton.addEventListener('click', function(e) {
|
|
515
|
+
e.preventDefault();
|
|
516
|
+
e.stopPropagation();
|
|
517
|
+
self.clear();
|
|
518
|
+
});
|
|
519
|
+
}
|
|
520
|
+
|
|
521
|
+
this.controls.input.addEventListener('change', function() {
|
|
522
|
+
var newValue = self.controls.input.value;
|
|
523
|
+
|
|
524
|
+
if (value && _.isString(newValue) && _.isEmpty(newValue)) {
|
|
525
|
+
//if someone remove the value from the field
|
|
526
|
+
//it's considered a property clean (resets everything)
|
|
527
|
+
self.clear();
|
|
528
|
+
} else if (value !== newValue) {
|
|
529
|
+
value = newValue;
|
|
530
|
+
|
|
531
|
+
/**
|
|
532
|
+
* A value get changed
|
|
533
|
+
* @event dateTimePicker#change
|
|
534
|
+
* @param {String} value - the date/time value
|
|
535
|
+
*/
|
|
536
|
+
self.trigger('change', value);
|
|
537
|
+
}
|
|
538
|
+
});
|
|
539
|
+
|
|
540
|
+
value = this.controls.input.value;
|
|
541
|
+
|
|
542
|
+
//instantiate the picker
|
|
543
|
+
_.defer(function() {
|
|
544
|
+
self.picker = flatpickr(self.controls.input, self.pickerConfig);
|
|
545
|
+
|
|
546
|
+
self.enable()
|
|
547
|
+
.setState('ready', true)
|
|
548
|
+
.trigger('ready');
|
|
549
|
+
});
|
|
550
|
+
})
|
|
551
|
+
.on('enable', function() {
|
|
552
|
+
if (this.controls) {
|
|
553
|
+
this.controls.input.disabled = false;
|
|
554
|
+
if (this.config.controlButtons) {
|
|
555
|
+
this.controls.toggleButton.disabled = false;
|
|
556
|
+
this.controls.clearButton.disabled = false;
|
|
557
|
+
}
|
|
558
|
+
}
|
|
559
|
+
})
|
|
560
|
+
.on('disable', function() {
|
|
561
|
+
if (this.controls) {
|
|
562
|
+
this.controls.input.disabled = true;
|
|
563
|
+
if (this.config.controlButtons) {
|
|
564
|
+
this.controls.toggleButton.disabled = true;
|
|
565
|
+
this.controls.clearButton.disabled = true;
|
|
566
|
+
}
|
|
567
|
+
}
|
|
568
|
+
});
|
|
569
|
+
|
|
570
|
+
//defered init to catch the event
|
|
571
|
+
setTimeout(function() {
|
|
572
|
+
dateTimePicker.init(options);
|
|
573
|
+
}, 0);
|
|
574
|
+
|
|
575
|
+
return dateTimePicker;
|
|
576
|
+
}
|