diff --git a/Bootstrap.Admin/Views/Admin/Mobile.cshtml b/Bootstrap.Admin/Views/Admin/Mobile.cshtml index 0fd89713..aa42a186 100644 --- a/Bootstrap.Admin/Views/Admin/Mobile.cshtml +++ b/Bootstrap.Admin/Views/Admin/Mobile.cshtml @@ -17,7 +17,7 @@ $('#useragent').text(navigator.userAgent); $('#versions').text(JSON.stringify(browser.versions)); - $('footer').footer(); + $.footer(); }; } diff --git a/Bootstrap.Admin/wwwroot/js/longbow.common.js b/Bootstrap.Admin/wwwroot/js/longbow.common.js index 6959cb15..1f36f9e8 100644 --- a/Bootstrap.Admin/wwwroot/js/longbow.common.js +++ b/Bootstrap.Admin/wwwroot/js/longbow.common.js @@ -111,6 +111,13 @@ }; $.extend({ + fullScreenStatus: function fullScreenStatus(value) { + if (value !== undefined) window.fullscreen = value; + return document.fullscreen || + document.mozFullScreen || + document.webkitIsFullScreen || window.fullscreen || + false; + }, bc: function (options) { options = $.extend({ id: "", @@ -125,25 +132,31 @@ cors: false, contentType: 'application/json', dataType: 'json', - method: 'get' + method: 'get', + autoFooter: false }, options); if (!options.url || options.url === "") { - toastr.error('参数错误: 未设置请求地址Url'); + toastr.error('未设置请求地址Url', '参数错误'); return; } var loadFlag = "loading"; + var loadingHandler = null; if (options.loading && options.modal) { var $modal = $(options.modal); if (!$modal.hasClass('event')) { $modal.on('shown.bs.modal', function () { var $this = $(this); + if (loadingHandler !== null) { + window.clearTimeout(loadingHandler); + loadingHandler = null; + } if ($this.hasClass(loadFlag)) return; $this.modal('hide'); }); } - $(options.modal).addClass(loadFlag).modal('show'); + loadingHandler = window.setTimeout(function () { $(options.modal).addClass(loadFlag).modal('show'); }, 300); setTimeout(function () { $(options.modal).find('.close').removeClass('d-none'); }, options.loadingTimeout); @@ -161,13 +174,21 @@ } function success(result) { + if (options.modal && (result || options.loading)) { + if (loadingHandler !== null) { + // cancel show modal event + window.clearTimeout(loadingHandler); + loadingHandler = null; + } + else $(options.modal).removeClass(loadFlag).modal('hide'); + } + if (options.title) toastr[result ? 'success' : 'error'](options.title + (result ? "成功" : "失败")); if ($.isFunction(options.callback)) { options.callback.call(options, result); } - if (options.modal && (result || options.loading)) { - $(options.modal).removeClass(loadFlag).modal('hide'); + if (options.autoFooter === true) { + $.footer(); } - if (options.title) toastr[result ? 'success' : 'error'](options.title + (result ? "成功" : "失败")); } var ajaxSettings = { @@ -181,6 +202,7 @@ success(result); }, error: function (XMLHttpRequest, textStatus, errorThrown) { + if (window.toastr) toastr.error(XMLHttpRequest.status === 500 ? '后台应用程序错误' : errorThrown, '程序错误'); success(false); } }; @@ -201,6 +223,11 @@ while (document.getElementById(prefix)); return prefix; }, + footer: function (options) { + var op = $.extend({ header: "header", content: ".main-content", ele: 'footer' }, options); + var $ele = $(op.ele); + return $(op.header).outerHeight() + $(op.content).outerHeight() + $ele.outerHeight() > $(window).height() ? $ele.removeClass('position-fixed') : $ele.addClass('position-fixed'); + }, formatUrl: function (url) { if (!url) return url; if (url.substr(0, 4) === "http") return url; @@ -225,11 +252,6 @@ that.css({ marginTop: getHeight(), transition: "all .5s linear" }); return this; }, - footer: function (options) { - if ($(window).width() >= 768) { return this.addClass('position-fixed'); } - var op = $.extend({ header: "header", content: ".main-content" }, options); - return $(op.header).outerHeight() + $(op.content).outerHeight() + this.outerHeight() > $(window).height() ? this.removeClass('position-fixed') : this.addClass('position-fixed'); - }, lgbTable: function (options) { var bsa = new DataTable($.extend(options.dataBinder, { url: options.url })); @@ -268,8 +290,11 @@ showToggle: true, //是否显示详细视图和列表视图的切换按钮 cardView: $(window).width() < 768, //是否显示详细视图 queryButton: '#btn_query', - onLoadSuccess: function () { - $('footer').footer(); + onLoadSuccess: function (data) { + $.footer(); + if (data.IsSuccess === false) { + toastr.error(data.HttpResult.Message, data.HttpResult.Name); + } } }, options); settings.url = $.formatUrl(settings.url); @@ -285,6 +310,32 @@ } return this; }, + lgbPopover: function (options) { + this.each(function (index, ele) { + var $ele = $(ele); + var data = $ele.data($.fn.popover.Constructor.DATA_KEY); + if (data) { + $.extend(data.config, options); + } + else { + $ele.popover(options); + } + }); + return this; + }, + lgbTooltip: function (options) { + this.each(function (index, ele) { + var $ele = $(ele); + var data = $ele.data($.fn.tooltip.Constructor.DATA_KEY); + if (data) { + $.extend(data.config, options); + } + else { + $ele.tooltip(options); + } + }); + return this; + }, lgbDatePicker: function (options) { if (!$.isFunction(this.datetimepicker)) return this; var option = $.extend({ @@ -303,6 +354,11 @@ this.datetimepicker(option); return this; }, + getTextByValue: function (value) { + var text = this.children().filter(function () { return $(this).val() === value; }).text(); + if (text === "") text = value; + return text; + }, lgbInfo: function (option) { this.each(function () { var $element = $(this); @@ -331,7 +387,7 @@ if ($.isFunction(op.callback)) op.callback.apply(that, arguments); return console.error(err.toString()); }).then(function () { - if (op.invoke) op.invoke(connection).catch(err => console.error(err.toString())); + if (op.invoke) op.invoke(connection).then(result => console.log(result)).catch(err => console.error(err.toString())); }); return this; } @@ -358,15 +414,17 @@ // fix bug bootstrap-table 1.12.1 showToggle if ($.fn.bootstrapTable) $.fn.bootstrapTable.Constructor.DEFAULTS.icons.toggle = $.fn.bootstrapTable.Constructor.DEFAULTS.icons.toggleOff; - $(document).ajaxStart(function () { - return NProgress.start(); - }); + if (window.NProgress) { + $(document).ajaxStart(function () { + return NProgress.start(); + }); - $(document).ajaxComplete(function (e) { - return NProgress.done(); - }); + $(document).ajaxComplete(function (e) { + return NProgress.done(); + }); + } - toastr.options = { + if (window.toastr) toastr.options = { "closeButton": true, "debug": false, "progressBar": true, @@ -382,6 +440,26 @@ "hideMethod": "fadeOut" }; + $('[data-toggle="dropdown"].dropdown-select').dropdown('select'); + $('[data-toggle="tooltip"]').tooltip(); + $('[data-toggle="popover"]').popover(); + $('[data-toggle="lgbinfo"]').lgbInfo(); + $('.date').lgbDatePicker(); + + $('.collapse').on('shown.bs.collapse', function () { + $.footer().removeClass('d-none'); + }).on('hidden.bs.collapse', function () { + $.footer().removeClass('d-none'); + }).on('hide.bs.collapse', function () { + $('footer').addClass('d-none'); + }).on('show.bs.collapse', function () { + $('footer').addClass('d-none'); + }); + + // fix bug bootstrap-table 1.12.1 showToggle + if ($.fn.bootstrapTable) $.fn.bootstrapTable.Constructor.DEFAULTS.icons.toggle = $.fn.bootstrapTable.Constructor.DEFAULTS.icons.toggleOff; + + $(window).on('resize', function () { $.footer(); }); diff --git a/Bootstrap.Admin/wwwroot/js/longbow.validate.js b/Bootstrap.Admin/wwwroot/js/longbow.validate.js index f06c0a3c..475b42be 100644 --- a/Bootstrap.Admin/wwwroot/js/longbow.validate.js +++ b/Bootstrap.Admin/wwwroot/js/longbow.validate.js @@ -80,13 +80,20 @@ }, settings: $.validator.defaults }, this.defaults(), options); + + // fix bug Edge + this.$element.find('select' + this.options.childClass).on('input', function (e) { + e.stopPropagation(); + }).on('change', function () { + $(this).trigger('input.lgb.validate'); + }); + this.$element.on('input.lgb.validate', this.options.childClass, function () { if (!that.validElement(this)) $(this).tooltip('show'); }).on('inserted.bs.tooltip', this.options.childClass, function () { $('#' + $(this).attr('aria-describedby')).addClass(that.options.errorClass); - }).on('change.lgb.validate', this.options.childClass, function () { - if (!that.validElement(this)) $(this).tooltip('show'); }); + if (!this.options.validButtons) return; this.$element.find(this.options.validButtons).on('click.lgb.validate', function (e) { var valid = that.valid(); diff --git a/Bootstrap.Admin/wwwroot/js/profiles.js b/Bootstrap.Admin/wwwroot/js/profiles.js index 1439c2a1..e2ec0f34 100644 --- a/Bootstrap.Admin/wwwroot/js/profiles.js +++ b/Bootstrap.Admin/wwwroot/js/profiles.js @@ -58,7 +58,7 @@ this._initZoom(); }; - $('footer').footer(); + $.footer(); var dataBinder = new DataEntity({ Password: "#currentPassword", diff --git a/Bootstrap.Admin/wwwroot/js/settings.js b/Bootstrap.Admin/wwwroot/js/settings.js index aced30a6..c54c6cf1 100644 --- a/Bootstrap.Admin/wwwroot/js/settings.js +++ b/Bootstrap.Admin/wwwroot/js/settings.js @@ -58,6 +58,7 @@ $.bc({ url: options.url, cors: !item.Self, + autoFooter: true, callback: function (result) { if ($.isArray(result)) { var html = '
{2}{0}{3}
{6}
'; @@ -78,7 +79,6 @@ }); } $refresh.removeClass('fa-spin'); - $('footer').footer(); } }); }; diff --git a/Bootstrap.Admin/wwwroot/js/tasks.js b/Bootstrap.Admin/wwwroot/js/tasks.js index dc6db0b1..9b512193 100644 --- a/Bootstrap.Admin/wwwroot/js/tasks.js +++ b/Bootstrap.Admin/wwwroot/js/tasks.js @@ -6,13 +6,13 @@ that.toggleClass('fa-spin'); $.bc({ url: Tasks.url, + autoFooter: true, callback: function (result) { if (result) { var content = result.map(function (task) { return $.format(htmlTask, task.TaskName, task.UserName, task.AssignTime, task.Id); }).join(''); $('#list-task').html(content); - $('footer').footer(); } that.toggleClass('fa-spin'); } diff --git a/Bootstrap.Client/wwwroot/js/longbow.common.js b/Bootstrap.Client/wwwroot/js/longbow.common.js index d3fcdcff..1ad4ca26 100644 --- a/Bootstrap.Client/wwwroot/js/longbow.common.js +++ b/Bootstrap.Client/wwwroot/js/longbow.common.js @@ -111,6 +111,13 @@ }; $.extend({ + fullScreenStatus: function fullScreenStatus(value) { + if (value !== undefined) window.fullscreen = value; + return document.fullscreen || + document.mozFullScreen || + document.webkitIsFullScreen || window.fullscreen || + false; + }, bc: function (options) { options = $.extend({ id: "", @@ -124,25 +131,31 @@ cors: false, contentType: 'application/json', dataType: 'json', - method: 'get' + method: 'get', + autoFooter: false }, options); if (!options.url || options.url === "") { - toastr.error('参数错误: 未设置请求地址Url'); + toastr.error('未设置请求地址Url', '参数错误'); return; } var loadFlag = "loading"; + var loadingHandler = null; if (options.loading && options.modal) { var $modal = $(options.modal); if (!$modal.hasClass('event')) { $modal.on('shown.bs.modal', function () { var $this = $(this); + if (loadingHandler !== null) { + window.clearTimeout(loadingHandler); + loadingHandler = null; + } if ($this.hasClass(loadFlag)) return; $this.modal('hide'); }); } - $(options.modal).addClass(loadFlag).modal('show'); + loadingHandler = window.setTimeout(function () { $(options.modal).addClass(loadFlag).modal('show'); }, 300); setTimeout(function () { $(options.modal).find('.close').removeClass('d-none'); }, options.loadingTimeout); @@ -160,13 +173,21 @@ } function success(result) { + if (options.modal && (result || options.loading)) { + if (loadingHandler !== null) { + // cancel show modal event + window.clearTimeout(loadingHandler); + loadingHandler = null; + } + else $(options.modal).removeClass(loadFlag).modal('hide'); + } + if (options.title) toastr[result ? 'success' : 'error'](options.title + (result ? "成功" : "失败")); if ($.isFunction(options.callback)) { options.callback.call(options, result); } - if (options.modal && (result || options.loading)) { - $(options.modal).removeClass(loadFlag).modal('hide'); + if (options.autoFooter === true) { + $.footer(); } - if (options.title) toastr[result ? 'success' : 'error'](options.title + (result ? "成功" : "失败")); } var ajaxSettings = { @@ -180,6 +201,7 @@ success(result); }, error: function (XMLHttpRequest, textStatus, errorThrown) { + if (window.toastr) toastr.error(XMLHttpRequest.status === 500 ? '后台应用程序错误' : errorThrown, '程序错误'); success(false); } }; @@ -200,6 +222,11 @@ while (document.getElementById(prefix)); return prefix; }, + footer: function (options) { + var op = $.extend({ header: "header", content: ".container-fluid", ele: 'footer' }, options); + var $ele = $(op.ele); + return $(op.header).outerHeight() + $(op.content).outerHeight() + $ele.outerHeight() > $(window).height() ? $ele.removeClass('position-fixed') : $ele.addClass('position-fixed'); + }, formatUrl: function (url) { if (!url) return url; if (url.substr(0, 4) === "http") return url; @@ -224,10 +251,6 @@ that.css({ marginTop: getHeight(), transition: "all .5s linear" }); return this; }, - footer: function (options) { - var op = $.extend({ header: "header", content: ".container-fluid" }, options); - return $(op.header).outerHeight() + $(op.content).outerHeight() + this.outerHeight() > $(window).height() ? this.removeClass('position-fixed') : this.addClass('position-fixed'); - }, lgbTable: function (options) { var bsa = new DataTable($.extend(options.dataBinder, { url: options.url })); @@ -266,8 +289,11 @@ showToggle: true, //是否显示详细视图和列表视图的切换按钮 cardView: $(window).width() < 768, //是否显示详细视图 queryButton: '#btn_query', - onLoadSuccess: function () { - $('footer').footer(); + onLoadSuccess: function (data) { + $.footer(); + if (data.IsSuccess === false) { + toastr.error(data.HttpResult.Message, data.HttpResult.Name); + } } }, options); settings.url = $.formatUrl(settings.url); @@ -283,6 +309,32 @@ } return this; }, + lgbPopover: function (options) { + this.each(function (index, ele) { + var $ele = $(ele); + var data = $ele.data($.fn.popover.Constructor.DATA_KEY); + if (data) { + $.extend(data.config, options); + } + else { + $ele.popover(options); + } + }); + return this; + }, + lgbTooltip: function (options) { + this.each(function (index, ele) { + var $ele = $(ele); + var data = $ele.data($.fn.tooltip.Constructor.DATA_KEY); + if (data) { + $.extend(data.config, options); + } + else { + $ele.tooltip(options); + } + }); + return this; + }, lgbDatePicker: function (options) { if (!$.isFunction(this.datetimepicker)) return this; var option = $.extend({ @@ -301,68 +353,10 @@ this.datetimepicker(option); return this; }, - lgbIndicator: function (options) { - if (/update/.test(options)) { - var $indicator = this.data('radialIndicator'); - if ($indicator.indOption.percentage) $indicator.animate(this.attr('data-val') * 100 / this.attr('data-max')); - else $indicator.value(this.attr('data-val')); - return this; - } - this.each(function () { - var op = $.extend({ - barColor: { - 0: '#33CC33', - 70: '#c5c521', - 80: '#e46121', - 90: '#c92b2b', - 100: '#FF0000' - }, - radius: 34, - interaction: false, - barWidth: 5, - roundCorner: true, - percentage: true - }, options); - var $this = $(this); - $this.radialIndicator(op); - if ($this.attr('data-val')) { - var $indicator = $this.data('radialIndicator'); - if ($indicator.indOption.percentage) $indicator.animate($this.attr('data-val') * 100 / $this.attr('data-max')); - else $indicator.value($this.attr('data-val')); - } - }); - return this; - }, - lgbCountUp: function (options) { - options = $.extend({}, options); - this.each(function () { - var option = { - useEasing: true, - useGrouping: false, - separator: ',', - decimal: '.' - }; - var $element = $(this); - var startVal = options.startVal || 0; - var endVal = $element.text() || 100; - var decimals = options.decimals || 0; - var count = new CountUp(this, startVal, endVal, decimals, 1, $.extend(option, options)); - count.start(); - }); - return this; - }, - getTextByValue: function (key, value) { - // 通过Key指定一个下拉框,通过value获得下拉框value值的text属性 - if (this.length !== 1) throw 'element must be one'; - var ele = this.get(0); - if (!ele[key]) { - ele[key] = {}; - var that = ele; - $.each($('#' + key).children(), function (index, element) { - that[key][$(element).attr('value')] = $(element).text(); - }); - } - return ele[key][value]; + getTextByValue: function (value) { + var text = this.children().filter(function () { return $(this).val() === value; }).text(); + if (text === "") text = value; + return text; }, lgbInfo: function (option) { this.each(function () { @@ -392,7 +386,7 @@ if ($.isFunction(op.callback)) op.callback.apply(that, arguments); return console.error(err.toString()); }).then(function () { - if (op.invoke) op.invoke(connection).catch(err => console.error(err.toString())); + if (op.invoke) op.invoke(connection).then(result => console.log(result)).catch(err => console.error(err.toString())); }); return this; } @@ -416,13 +410,70 @@ }); $(function () { + // fix bug bootstrap-table 1.12.1 showToggle + if ($.fn.bootstrapTable) $.fn.bootstrapTable.Constructor.DEFAULTS.icons.toggle = $.fn.bootstrapTable.Constructor.DEFAULTS.icons.toggleOff; + + if (window.NProgress) { + $(document).ajaxStart(function () { + return NProgress.start(); + }); + + $(document).ajaxComplete(function (e) { + return NProgress.done(); + }); + } + + if (window.toastr) toastr.options = { + "closeButton": true, + "debug": false, + "progressBar": true, + "positionClass": "toast-bottom-right", + "onclick": null, + "showDuration": "600", + "hideDuration": "2000", + "timeOut": "4000", + "extendedTimeOut": "1000", + "showEasing": "swing", + "hideEasing": "linear", + "showMethod": "fadeIn", + "hideMethod": "fadeOut" + }; + $('[data-toggle="dropdown"].dropdown-select').dropdown('select'); $('[data-toggle="tooltip"]').tooltip(); $('[data-toggle="popover"]').popover(); $('[data-toggle="lgbinfo"]').lgbInfo(); $('.date').lgbDatePicker(); + $('.collapse').on('shown.bs.collapse', function () { + $.footer().removeClass('d-none'); + }).on('hidden.bs.collapse', function () { + $.footer().removeClass('d-none'); + }).on('hide.bs.collapse', function () { + $('footer').addClass('d-none'); + }).on('show.bs.collapse', function () { + $('footer').addClass('d-none'); + }); + // fix bug bootstrap-table 1.12.1 showToggle - $.fn.bootstrapTable.Constructor.DEFAULTS.icons.toggle = $.fn.bootstrapTable.Constructor.DEFAULTS.icons.toggleOff; + if ($.fn.bootstrapTable) $.fn.bootstrapTable.Constructor.DEFAULTS.icons.toggle = $.fn.bootstrapTable.Constructor.DEFAULTS.icons.toggleOff; + + + $(window).on('resize', function () { + $.footer(); + }); + + $("#gotoTop").on('click', function (e) { + e.preventDefault(); + $('html, body').animate({ + scrollTop: 0 + }, 200); + }); + + $('[data-toggle="dropdown"].dropdown-select').dropdown('select'); + $('[data-toggle="tooltip"]').tooltip(); + $('[data-toggle="popover"]').popover(); + $('[data-toggle="lgbinfo"]').lgbInfo(); + $('.date').lgbDatePicker(); }); })(jQuery); \ No newline at end of file