diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/wwwroot/libs/abp/aspnetcore-mvc-ui-theme-shared/bootstrap/dom-event-handlers.js b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/wwwroot/libs/abp/aspnetcore-mvc-ui-theme-shared/bootstrap/dom-event-handlers.js index 3499aef9a9..bbc26e4e1f 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/wwwroot/libs/abp/aspnetcore-mvc-ui-theme-shared/bootstrap/dom-event-handlers.js +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/wwwroot/libs/abp/aspnetcore-mvc-ui-theme-shared/bootstrap/dom-event-handlers.js @@ -296,254 +296,317 @@ abp.dom.initializers.initializeDateRangePickers = function ($rootElement) { - $rootElement - .findWithSelf('abp-date-picker,abp-date-range-picker') - .each(function () { - var $this = $(this); - var $input = $this.find('.input-group input[type="text"]') - if ($input.data('daterangepicker')) { - return; - } - - var $openButton = $this.find('button[data-type="open"]') - var $clearButton = $this.find('button[data-type="clear"]') - var singleDatePicker = $this.is('abp-date-picker') - var options = {}; - options.singleDatePicker = singleDatePicker; - - var defaultOptions = { - showDropdowns: true, - opens: "center", - drops: "down", - autoApply: true, - autoUpdateInput: false, - showTodayButton: true, - showClearButton: true, - minYear: parseInt(moment().subtract(100, 'year').locale('en').format('YYYY')), - maxYear: parseInt(moment().add(100, 'year').locale('en').format('YYYY')), - locale: { - direction: abp.localization.currentCulture.isRightToLeft ? 'rtl' : 'ltr', - todayLabel: abp.localization.localize('Today', 'AbpUi'), - clearLabel: abp.localization.localize('Clear', 'AbpUi'), - applyLabel: abp.localization.localize('Apply', 'AbpUi'), - }, - singleOpenAndClearButton: true - }; - var locale = defaultOptions.locale; - $.extend(options, defaultOptions); - $.extend(options, $this.data()); - if (jQuery.isEmptyObject(options.locale)) { - options.locale = locale; - } else { - locale = options.locale; - } - - $.extend(options, $this.data("options")); - if (jQuery.isEmptyObject(options.locale)) { - options.locale = locale; - } + function setOptions (options, $datePickerElement, singleDatePicker) { + + options.singleDatePicker = singleDatePicker; + + var defaultOptions = { + showDropdowns: true, + opens: "center", + drops: "down", + autoApply: true, + autoUpdateInput: false, + showTodayButton: true, + showClearButton: true, + minYear: parseInt(moment().subtract(100, 'year').locale('en').format('YYYY')), + maxYear: parseInt(moment().add(100, 'year').locale('en').format('YYYY')), + locale: { + direction: abp.localization.currentCulture.isRightToLeft ? 'rtl' : 'ltr', + todayLabel: abp.localization.localize('Today', 'AbpUi'), + clearLabel: abp.localization.localize('Clear', 'AbpUi'), + applyLabel: abp.localization.localize('Apply', 'AbpUi'), + }, + singleOpenAndClearButton: true + }; + var locale = defaultOptions.locale; + $.extend(options, defaultOptions); + $.extend(options, $datePickerElement.data()); + if ($.isEmptyObject(options.locale)) { + options.locale = locale; + } else { + locale = options.locale; + } - if (options.timePicker && options.timePicker24Hour === undefined) { - options.timePicker24Hour = moment.localeData().longDateFormat('LT').indexOf('A') < 1; - } + $.extend(options, $datePickerElement.data("options")); + if ($.isEmptyObject(options.locale)) { + options.locale = locale; + } - var isUtc = options.isUtc; - var isIso = options.isIso; - var timePicker = options.timePicker; - var timePicker24Hour = options.timePicker24Hour; - var timePickerSeconds = options.timePickerSeconds; - var dateFormat = options.dateFormat; - var separator = options.separator; - var defaultDateFormat = "YYYY-MM-DD"; - var singleOpenAndClearButton = options.singleOpenAndClearButton && $clearButton.length > 0 && $openButton.length > 0; + if (options.timePicker && options.timePicker24Hour === undefined) { + options.timePicker24Hour = moment.localeData().longDateFormat('LT').indexOf('A') < 1; + } - const replaceButton = function (hasDate) { - var hiddenClass = 'd-none'; - - if (singleOpenAndClearButton) { - if (hasDate) { - $openButton.addClass(hiddenClass); - $clearButton.removeClass(hiddenClass); - $clearButton.insertAfter($openButton); - } else { - $openButton.removeClass(hiddenClass); - $clearButton.addClass(hiddenClass); - $openButton.insertAfter($clearButton); - } - } - } + if (options.dateFormat) { + options.locale = options.locale || {}; + options.locale.format = options.dateFormat; + } - const getMoment = function (date) { - if (!date) { - return isUtc ? moment.utc() : moment(); - } + if (options.separator) { + options.locale = options.locale || {}; + options.locale.separator = options.separator; + } - if (isUtc) { - return moment.utc(date, dateFormat); + if (options.ranges) { + $.each(options.ranges, function (key, value) { + let start = value[0]; + let end; + if (value.length > 1) { + end = value[1]; } else { - return moment(date, dateFormat); + end = value[0]; } - } + options.ranges[key] = [getMoment(start, options), getMoment(end, options.isUtc)]; + }); + } - if (dateFormat) { - options.locale = options.locale || {}; - options.locale.format = dateFormat; - } + if (typeof options.template !== 'string' && !(options.template instanceof $)) + options.template = + '
' + + '
' + + '
' + + '
' + + '
' + + '
' + + '
' + + '
' + + '
' + + '
' + + '
' + + ' ' + + '
' + + '
'; + } - if (separator) { - options.locale = options.locale || {}; - options.locale.separator = separator; - } + function replaceOpenButton (hasDate,singleOpenAndClearButton, $openButton, $clearButton) { + var hiddenClass = 'd-none'; - var startDate = options.startDate ? moment(options.startDate) : null; - if (singleDatePicker && !startDate) { - startDate = options.date ? moment(options.date) : null; + if (singleOpenAndClearButton) { + if (hasDate) { + $openButton.addClass(hiddenClass); + $clearButton.removeClass(hiddenClass); + $clearButton.insertAfter($openButton); + } else { + $openButton.removeClass(hiddenClass); + $clearButton.addClass(hiddenClass); + $openButton.insertAfter($clearButton); } + } + } - var endDate = options.endDate ? moment(options.endDate) : null; - if (startDate) { - options.startDate = startDate; - } - if (endDate) { - options.endDate = endDate; - } + function getMoment (date, options, dateFormat) { + var isUtc = options.isUtc; + dateFormat = dateFormat || options.dateFormat; + if (!date) { + return isUtc ? moment.utc() : moment(); + } - if (options.ranges) { - $.each(options.ranges, function (key, value) { - let start = value[0]; - let end; - if (value.length > 1) { - end = value[1]; - } else { - end = value[0]; - } - options.ranges[key] = [getMoment(start), getMoment(end)]; - }); + if (isUtc) { + return moment.utc(date, dateFormat); + } else { + return moment(date, dateFormat); + } + } + + function getStartDate(options, startDate){ + startDate = startDate ? startDate : options.startDate; + startDate = startDate ? getMoment(startDate, options) : null; + if (options.singleDatePicker && !startDate) { + startDate = options.date ? getMoment(options.date, options) : null; + } + + if(startDate && startDate.isValid()){ + return startDate; + } + + return null; + } + + function getEndDate(options, endDate){ + if (options.singleDatePicker) { + return null; + } + endDate = endDate ? endDate : options.endDate; + endDate = endDate ? getMoment(endDate, options) : null; + + if(endDate && endDate.isValid()){ + return endDate; + } + + return null; + } + + function getTodayButton(options, $input){ + if (options.showTodayButton) { + var $todayBtn = $(''); + if(options.todayButtonClasses){ + $todayBtn.addClass(options.todayButtonClasses); + }else{ + $todayBtn.addClass('btn-default'); } - var $todayBtn = $(''); - var $clearBtn = $(''); - - var extraButtons = []; - if (options.showTodayButton) { - extraButtons.push($todayBtn); - - $todayBtn.on('click', function () { - var today = getMoment(); - $input.data('daterangepicker').setStartDate(today); - $input.data('daterangepicker').setEndDate(today); - $input.data('daterangepicker').updateView(); - }); + $todayBtn.on('click', function () { + var today = getMoment(undefined, options); + $input.data('daterangepicker').setStartDate(today); + $input.data('daterangepicker').setEndDate(today); + $input.data('daterangepicker').updateView(); + }); + + return $todayBtn; + } + + return null; + } + + function getClearButton(options, $input, $dateRangePicker){ + if (options.showClearButton) { + var $clearBtn = $(''); + if(options.clearButtonClasses){ + $clearBtn.addClass(options.clearButtonClasses); + }else{ + $clearBtn.addClass('btn-default'); } + $clearBtn.on('click', function () { + $input.val('').trigger('change'); + $dateRangePicker.hide(); + }); + + return $clearBtn; + } + return null; + } + + function addExtraButtons(options, $dateRangePicker, $input) { + var extraButtons = [getTodayButton(options, $input), getClearButton(options, $input, $dateRangePicker)]; + if ($dateRangePicker.container.find('.drp-buttons').css('display') !== 'none') { - if (options.showClearButton) { - extraButtons.push($clearBtn); + $.each(extraButtons, function (index, value) { + $dateRangePicker.container.find('.drp-buttons').prepend(value); + }); + } else { + var $div = $('
'); + $div.css('display', 'block'); + $.each(extraButtons, function (index, value) { + $div.prepend(value); + }); - $clearBtn.on('click', function () { - $input.val('').trigger('change'); - $dateRangePicker.hide(); - }); + $div.insertAfter($dateRangePicker.container.find('.drp-buttons')); + } + } + + function addOpenButtonClick($openButton, $dateRangePicker){ + if(!$openButton){ + return; + } + $dateRangePicker.outsideClick = function (e) { + var target = $(e.target); + // if the page is clicked anywhere except within the daterangerpicker/button itself then call this.hide() + if ( + // ie modal dialog fix + e.type == "focusin" || + target.closest(this.element).length || + target.closest(this.container).length || + target.closest('.calendar-table').length || + target.closest($openButton).length + ) { + return; } - if (typeof options.template !== 'string' && !(options.template instanceof $)) - options.template = - '
' + - '
' + - '
' + - '
' + - '
' + - '
' + - '
' + - '
' + - '
' + - '
' + - '
' + - ' ' + - '
' + - '
'; - - $input.daterangepicker(options); - - var $dateRangePicker = $input.data('daterangepicker'); + this.hide(); + this.element.trigger('outsideClick.daterangepicker', this); + }; - if ($dateRangePicker.container.find('.drp-buttons').css('display') !== 'none') { + $openButton.on('click', function () { + $dateRangePicker.toggle(); + }); + } - $.each(extraButtons, function (index, value) { - $dateRangePicker.container.find('.drp-buttons').prepend(value); - }); + function extendDateFormat (format,options) { + if (options.timePicker) { + if (options.timePicker24Hour) { + if (options.timePickerSeconds) { + format += " HH:mm:ss"; + } else { + format += " HH:mm"; + } + } else { + if (options.timePickerSeconds) { + format += ' ' + " hh:mm:ss A" + } else { + format += " hh:mm A"; + } } - else { - var $div = $('
'); - $div.css('display', 'block'); - $.each(extraButtons, function (index, value) { - $div.prepend(value); - }); + } - $div.insertAfter($dateRangePicker.container.find('.drp-buttons')); + return format; + } + + function fillInput($input, startDate, endDate, options) { + if (options.singleDatePicker) { + if (startDate) { + $input.val(startDate.format(options.dateFormat)); + } + } else { + if (startDate && endDate) { + $input.val(startDate.format(options.dateFormat) + options.separator + endDate.format(options.dateFormat)); + } + } + } + + $rootElement + .findWithSelf('abp-date-picker,abp-date-range-picker') + .each(function () { + var $this = $(this); + var $input = $this.find('.input-group input[type="text"]') + if ($input.data('daterangepicker')) { + return; } - $dateRangePicker.outsideClick = function (e) { - var target = $(e.target); - // if the page is clicked anywhere except within the daterangerpicker/button itself then call this.hide() - if ( - // ie modal dialog fix - e.type == "focusin" || - target.closest(this.element).length || - target.closest(this.container).length || - target.closest('.calendar-table').length || - target.closest($openButton).length - ) { - return; - } + var $openButton = $this.find('button[data-type="open"]') + var $clearButton = $this.find('button[data-type="clear"]') + var singleDatePicker = $this.is('abp-date-picker') + var options = {}; + + setOptions(options, $this, singleDatePicker); - this.hide(); - this.element.trigger('outsideClick.daterangepicker', this); - }; + var isIso = options.isIso; + var dateFormat = options.dateFormat; + var separator = options.separator; + var defaultDateFormat = extendDateFormat("YYYY-MM-DD", options); + + var singleOpenAndClearButton = options.singleOpenAndClearButton && $clearButton.length > 0 && $openButton.length > 0; + + var startDate = getStartDate(options); - $openButton.on('click', function () { - $dateRangePicker.toggle(); - }); + var endDate = getEndDate(options); + if (startDate) { + options.startDate = startDate; + } + if (endDate) { + options.endDate = endDate; + } - const extendDateFormat = function (format) { - if (timePicker) { - if (timePicker24Hour) { - if (timePickerSeconds) { - format += " HH:mm:ss"; - } else { - format += " HH:mm"; - } - } else { - if (timePickerSeconds) { - format += ' ' + " hh:mm:ss A" - } else { - format += " hh:mm A"; - } - } - } + $input.daterangepicker(options); - return format; - } + var $dateRangePicker = $input.data('daterangepicker'); - defaultDateFormat = extendDateFormat(defaultDateFormat); + addExtraButtons(options, $dateRangePicker, $input); + addOpenButtonClick($openButton, $dateRangePicker); + if (!dateFormat) { - dateFormat = extendDateFormat(moment.localeData().longDateFormat('L')) + dateFormat = extendDateFormat(moment.localeData().longDateFormat('L'), options); + options.dateFormat = dateFormat; } if (!separator) { separator = $dateRangePicker.locale.separator; + options.separator = separator; } - if (singleDatePicker) { - if (startDate) { - $input.val(startDate.format(dateFormat)); - } - } else { - if (startDate && endDate) { - $input.val(startDate.format(dateFormat) + separator + endDate.format(dateFormat)); - } + if(options.autoUpdateInput){ + fillInput($input, startDate, endDate, options); } - + $input.on('apply.daterangepicker', function (ev, picker) { if (singleDatePicker) { $(this).val(picker.startDate.format(dateFormat)); @@ -560,8 +623,8 @@ }); $input.on('show.daterangepicker', function (ev, picker) { - var momentStartDate = getMoment(startDate); - var momentEndDate = getMoment(endDate); + var momentStartDate = getMoment(startDate, options); + var momentEndDate = getMoment(endDate, options); if (momentStartDate.isValid()) { picker.setStartDate(momentStartDate); } @@ -575,47 +638,35 @@ $input.trigger('change'); }); + var firstTrigger = true; $input.on('change', function () { if ($(this).val() !== '') { - replaceButton(true); + replaceOpenButton(true, singleOpenAndClearButton, $openButton, $clearButton); } else { - replaceButton(false); + replaceOpenButton(false, singleOpenAndClearButton, $openButton, $clearButton); } var dates = $(this).val().split(separator); if (dates.length === 2) { - startDate = getMoment(dates[0]); - if (!startDate.isValid()) { - startDate = null; - } else { - startDate = formatDate(startDate); - } - endDate = getMoment(dates[1]); - if (!endDate.isValid()) { - endDate = null; - } else { - endDate = formatDate(endDate); - } + startDate = formatDate(getStartDate(options, dates[0])); + endDate = formatDate(getEndDate(options, dates[1])); } else { if (dates[0]) { - startDate = getMoment(dates[0]); - if (!startDate.isValid()) { - startDate = null; - } else { - startDate = formatDate(startDate); - } + startDate = formatDate(getStartDate(options, dates[0])); } else { - startDate = null; + if(!firstTrigger){ + startDate = null; + } } - endDate = null; + if(!firstTrigger){ + endDate = null; + } } if (!startDate) { - replaceButton(false); + replaceOpenButton(false, singleOpenAndClearButton, $openButton, $clearButton); $(this).val(''); - $dateRangePicker.setStartDate(getMoment()); - $dateRangePicker.setEndDate(getMoment()); } if (!singleDatePicker) { @@ -637,6 +688,8 @@ $input.data('startDate', startDate); $input.data('endDate', endDate); } + + firstTrigger = false; }); function formatDate(date) { @@ -652,7 +705,7 @@ function getFormattedStartDate() { if (startDate) { - return getMoment(startDate).format(dateFormat); + return getMoment(startDate, options).format(dateFormat); } return null; @@ -660,7 +713,7 @@ function getFormattedEndDate() { if (endDate) { - return getMoment(endDate).format(dateFormat); + return getMoment(endDate, options).format(dateFormat); } return null;