diff --git a/html/嬫夋暿棙梡棪忬嫷/嬫夋暿棙梡棪忬嫷 _ So-Manager娗棟僷僱儖_files/freeze-table.js.僟僂儞儘乕僪 b/html/嬫夋暿棙梡棪忬嫷/嬫夋暿棙梡棪忬嫷 _ So-Manager娗棟僷僱儖_files/freeze-table.js.僟僂儞儘乕僪 deleted file mode 100644 index 5d3fdee..0000000 --- a/html/嬫夋暿棙梡棪忬嫷/嬫夋暿棙梡棪忬嫷 _ So-Manager娗棟僷僱儖_files/freeze-table.js.僟僂儞儘乕僪 +++ /dev/null @@ -1,804 +0,0 @@ -/** - * RWD Table with freezing head and columns for jQuery - * - * @author Nick Tsai - * @version 1.3.0 - * @see https://github.com/yidas/jquery-freeze-table - */ -(function ($, window) { - - 'use strict'; - - /** - * Main object - * - * @param {element} element - * @param {object} options - */ - var FreezeTable = function(element, options) { - - // Target element initialization - this.$tableWrapper = $(element).first(); - - // Options - this.options = options || {}; - this.namespace = this.options.namespace || 'freeze-table'; - this.callback; - this.scrollBarHeight; - this.shadow; - this.fastMode; - this.backgroundColor; - this.scrollable; - - // Caches - this.$table = this.$tableWrapper.children("table"); - this.$container = ((typeof this.options.container !== 'undefined') && this.options.container && $(this.options.container).length) ? $(this.options.container) : $(window); - this.$headTableWrap; - this.$columnTableWrap; - this.$columnHeadTableWrap; - this.$scrollBarWrap; - this.fixedNavbarHeight; - this.isWindowScrollX = false; - - // Static class names for clone wraps - this.headWrapClass = 'clone-head-table-wrap'; - this.columnWrapClass = 'clone-column-table-wrap'; - this.columnHeadWrapClass = 'clone-column-head-table-wrap'; - this.scrollBarWrapClass = 'clone-scroll-bar-wrap'; - - this.init(); - - return this; - } - - /** - * Initialization - */ - FreezeTable.prototype.init = function() { - - // Element check - if (!this.$table.length) { - throw "The element must contain a table dom"; - } - - /** - * Update Mode - */ - if (this.options==='update') { - - this.destroy(); - this.options = this.$tableWrapper.data('freeze-table-data'); - } - else if (this.options==='resize') { - - this.options = this.$tableWrapper.data('freeze-table-data'); - // Get selected FreezeTable's namespace - this.namespace = this.options.namespace || this.namespace; - this.resize(); - // Skip init for better performance usage - return; - } - else { - // Save to DOM data - this.$tableWrapper.data('freeze-table-data', this.options); - } - - /** - * Options Setting - */ - var options = this.options; - var freezeHead = (typeof options.freezeHead !== 'undefined') ? options.freezeHead : true; - var freezeColumn = (typeof options.freezeColumn !== 'undefined') ? options.freezeColumn : true; - var freezeColumnHead = (typeof options.freezeColumnHead !== 'undefined') ? options.freezeColumnHead : true; - var scrollBar = (typeof options.scrollBar !== 'undefined') ? options.scrollBar : false; - var fixedNavbar = options.fixedNavbar || '.navbar-fixed-top'; - var callback = options.callback || null; - this.namespace = this.options.namespace || this.namespace; - // Default to get window scroll bar height - this.scrollBarHeight = ($.isNumeric(options.scrollBarHeight)) ? options.scrollBarHeight : (window.innerWidth - document.documentElement.clientWidth); - this.shadow = (typeof options.shadow !== 'undefined') ? options.shadow : false; - this.fastMode = (typeof options.fastMode !== 'undefined') ? options.fastMode : false; - this.backgroundColor = (typeof options.backgroundColor !== 'undefined') ? options.backgroundColor : 'white'; - this.scrollable = (typeof options.scrollable !== 'undefined') ? options.scrollable : false; - - // Get navbar height for keeping fixed navbar - this.fixedNavbarHeight = (fixedNavbar) ? $(fixedNavbar).outerHeight() || 0 : 0; - - // Check existence - if (this.isInit()) { - this.destroy(); - } - - // Release height of the table wrapper - if (!this.scrollable) { - this.$tableWrapper.css('height', '100%') - .css('min-height', '100%') - .css('max-height', '100%'); - } - - /** - * Building - */ - // Switch for freezeHead - if (freezeHead) { - this.buildHeadTable(); - } - // Switch for freezeColumn - if (freezeColumn) { - this.buildColumnTable(); - // X scroll bar - this.$tableWrapper.css('overflow-x', 'scroll'); - } - // Switch for freezeColumnHead - if (freezeColumnHead && freezeHead && freezeColumn) { - this.buildColumnHeadTable(); - } - // Switch for scrollBar - if (scrollBar) { - this.buildScrollBar(); - } - - // Body scroll-x prevention - var detectWindowScroll = (function (){ - // If body scroll-x is opened, close library to prevent Invalid usage - if (this.$container.scrollLeft() > 0) { - // Mark - this.isWindowScrollX = true; - // Hide all components - if (this.$headTableWrap) { - this.$headTableWrap.css('visibility', 'hidden'); - } - if (this.$columnTableWrap) { - this.$columnTableWrap.css('visibility', 'hidden'); - } - if (this.$columnHeadTableWrap) { - this.$columnHeadTableWrap.css('visibility', 'hidden'); - } - if (this.$scrollBarWrap) { - this.$scrollBarWrap.css('visibility', 'hidden'); - } - - } else { - // Unmark - this.isWindowScrollX = false; - } - - }).bind(this); - // Listener of Body scroll-x prevention - this.$container.on('scroll.'+this.namespace, function () { - - detectWindowScroll(); - }); - - // Initialization - this.resize(); - - // Callback - if (typeof callback === 'function') { - callback(); - } - } - - /** - * Freeze thead table - */ - FreezeTable.prototype.buildHeadTable = function() { - - var that = this; - - // Clone the table as Fixed thead - var $headTable = this.clone(this.$table); - - // Fast Mode - if (this.fastMode) { - var $headTable = this.simplifyHead($headTable); - } - - var headWrapStyles = this.options.headWrapStyles || null; - // Wrap the Fixed Column table - this.$headTableWrap = $('
') - .append($headTable) - .css('position', 'fixed') - .css('overflow', 'hidden') - .css('visibility', 'hidden') - .css('top', 0 + this.fixedNavbarHeight) - .css('z-index', 2); - // Shadow option - if (this.shadow) { - this.$headTableWrap.css('box-shadow', '0px 6px 10px -5px rgba(159, 159, 160, 0.8)'); - } - // Styles option - if (headWrapStyles && typeof headWrapStyles === "object") { - $.each(headWrapStyles, function(key, value) { - that.$headTableWrap.css(key, value); - }); - } - // Add into target table wrap - this.$tableWrapper.append(this.$headTableWrap); - - /** - * Listener - Table scroll for effecting Freeze Column - */ - this.$tableWrapper.on('scroll.'+this.namespace, function() { - - // this.$headTableWrap.css('left', this.$table.offset().left); - that.$headTableWrap.scrollLeft($(this).scrollLeft()); - }); - - // Scrollable option - if (this.scrollable) { - - var handler = function (window, that) { - - var top = that.$tableWrapper.offset().top; - - // Detect Current container's top is in the table scope - if (that.$tableWrapper.scrollTop() > 0 && top > that.fixedNavbarHeight) { - - that.$headTableWrap.offset({top: top}); - that.$headTableWrap.css('visibility', 'visible'); - - } else { - - that.$headTableWrap.css('visibility', 'hidden'); - } - } - - /** - * Listener - Window scroll for effecting freeze head table - */ - this.$tableWrapper.on('scroll.'+this.namespace, function() { - - handler(window, that); - }); - - this.$container.on('scroll.'+this.namespace, function() { - - handler(window, that); - }); - - } - // Default with window container - else if ($.isWindow(that.$container.get(0))) { - - /** - * Listener - Window scroll for effecting freeze head table - */ - this.$container.on('scroll.'+this.namespace, function() { - - // Current container's top position - var topPosition = that.$container.scrollTop() + that.fixedNavbarHeight; - var tableTop = that.$table.offset().top - 1; - - // Detect Current container's top is in the table scope - if (tableTop - 1 <= topPosition && (tableTop + that.$table.outerHeight() - 1) >= topPosition) { - - that.$headTableWrap.css('visibility', 'visible'); - - } else { - - that.$headTableWrap.css('visibility', 'hidden'); - } - }); - } - // Container setting - else { - - /** - * Listener - Window scroll for effecting freeze head table - */ - this.$container.on('scroll.'+this.namespace, function() { - - var windowTop = $(window).scrollTop(); - var tableTop = that.$table.offset().top - 1; - - // Detect Current container's top is in the table scope - if (tableTop <= windowTop && (tableTop + that.$table.outerHeight() - 1) >= windowTop) { - - that.$headTableWrap.offset({top: windowTop}); - that.$headTableWrap.css('visibility', 'visible'); - - } else { - - that.$headTableWrap.css('visibility', 'hidden'); - } - }); - } - - /** - * Listener - Window resize for effecting freeze head table - */ - this.$container.on('resize.'+this.namespace, function() { - - // Scrollable check and prevention - var headTableWrapWidth = (that.scrollable) ? that.$tableWrapper.width() - that.scrollBarHeight : that.$tableWrapper.width(); - headTableWrapWidth = (headTableWrapWidth > 0) ? headTableWrapWidth : that.$tableWrapper.width(); - that.$headTableWrap.css('width', headTableWrapWidth); - that.$headTableWrap.css('height', that.$table.find("thead").outerHeight()); - }); - } - - /** - * Freeze column table - */ - FreezeTable.prototype.buildColumnTable = function() { - - var that = this; - - /** - * Setting - */ - var columnWrapStyles = this.options.columnWrapStyles || null; - var columnNum = this.options.columnNum || 1; - var columnKeep = (typeof this.options.columnKeep !== 'undefined') ? this.options.columnKeep : false; - // Shadow option - var defaultColumnBorderWidth = (this.shadow) ? 0 : 1; - var columnBorderWidth = (typeof this.options.columnBorderWidth !== 'undefined') ? this.options.columnBorderWidth : defaultColumnBorderWidth; - - // Clone the table as Fixed Column table - var $columnTable = this.clone(this.$table); - - // Wrap the Fixed Column table - this.$columnTableWrap = $('
') - .append($columnTable) - .css('position', 'fixed') - .css('overflow', 'hidden') - .css('visibility', 'hidden') - .css('z-index', 1); - // Shadow option - if (this.shadow) { - this.$columnTableWrap.css('box-shadow', '6px 0px 10px -5px rgba(159, 159, 160, 0.8)'); - } - // Styles option - if (columnWrapStyles && typeof columnWrapStyles === "object") { - $.each(columnWrapStyles, function(key, value) { - that.$columnTableWrap.css(key, value); - }); - } - // Scrollable - if (this.scrollable) { - // Scrollable check and prevention - var columnTableWrapHeight = this.$tableWrapper.height() - this.scrollBarHeight; - columnTableWrapHeight = (columnTableWrapHeight > 0) ? columnTableWrapHeight : this.$tableWrapper.height(); - this.$columnTableWrap.height(columnTableWrapHeight); - } - // Add into target table wrap - this.$tableWrapper.append(this.$columnTableWrap); - - /** - * localize the column wrap to current top - */ - var localizeWrap = function () { - - that.$columnTableWrap.offset({top: that.$tableWrapper.offset().top}); - } - - // Column keep option - if (columnKeep) { - - this.$columnTableWrap.css('visibility', 'visible'); - - } else { - - // Scrollable option - if (that.scrollable) { - - /** - * Listener - Table scroll for effecting Freeze Column - */ - this.$tableWrapper.on('scroll.'+this.namespace, function() { - - - // Detect for horizontal scroll - if ($(this).scrollLeft() > 0) { - - // Scrollable localization - that.$columnTableWrap.scrollTop(that.$tableWrapper.scrollTop()); - that.$columnTableWrap.css('visibility', 'visible'); - - } else { - - that.$columnTableWrap.css('visibility', 'hidden'); - } - }); - - } else { - - /** - * Listener - Table scroll for effecting Freeze Column - */ - this.$tableWrapper.on('scroll.'+this.namespace, function() { - - // Disable while isWindowScrollX - if (that.isWindowScrollX) - return; - - // Detect for horizontal scroll - if ($(this).scrollLeft() > 0) { - - that.$columnTableWrap.css('visibility', 'visible'); - - } else { - - that.$columnTableWrap.css('visibility', 'hidden'); - } - }); - } - } - - /** - * Listener - Window resize for effecting tables - */ - this.$container.on('resize.'+this.namespace, function() { - - // Follows origin table's width - $columnTable.width(that.$table.width()); - - /** - * Dynamic column calculation - */ - // Get width by fixed column with number setting - var width = 0 + columnBorderWidth; - for (var i = 1; i <= columnNum; i++) { - // th/td detection - var th = that.$table.find('th:nth-child('+i+')').outerWidth(); - var addWidth = (th > 0) ? th : that.$table.find('td:nth-child('+i+')').outerWidth(); - width += addWidth; - } - that.$columnTableWrap.width(width); - - localizeWrap(); - }); - - /** - * Listener - Window scroll for effecting freeze column table - */ - this.$container.on('scroll.'+this.namespace, function() { - - localizeWrap(); - }); - } - - /** - * Freeze column thead table - */ - FreezeTable.prototype.buildColumnHeadTable = function() { - - var that = this; - - // Clone head table wrap - this.$columnHeadTableWrap = this.clone(this.$headTableWrap); - - // Fast Mode - if (this.fastMode) { - this.$columnHeadTableWrap = this.simplifyHead(this.$columnHeadTableWrap); - } - - var columnHeadWrapStyles = this.options.columnHeadWrapStyles || null; - - this.$columnHeadTableWrap.removeClass(this.namespace) - .addClass(this.columnHeadWrapClass) - .css('z-index', 3); - // Shadow option - if (this.shadow) { - this.$columnHeadTableWrap.css('box-shadow', 'none'); - } - // Styles option - if (columnHeadWrapStyles && typeof columnHeadWrapStyles === "object") { - $.each(columnHeadWrapStyles, function(key, value) { - this.$columnHeadTableWrap.css(key, value); - }); - } - - // Add into target table wrap - this.$tableWrapper.append(this.$columnHeadTableWrap); - - // Scrollable option - if (this.scrollable) { - - var detect = function () { - - var top = that.$tableWrapper.offset().top; - - // Detect Current container's top is in the table scope - if (that.$tableWrapper.scrollTop() > 0 && top > that.fixedNavbarHeight) { - - that.$columnHeadTableWrap.offset({top: top}); - that.$columnHeadTableWrap.css('visibility', 'visible'); - - } else { - - that.$columnHeadTableWrap.css('visibility', 'hidden'); - } - } - - /** - * Listener - Window scroll for effecting freeze head table - */ - $(this.$tableWrapper).on('scroll.'+this.namespace, function() { - - detect(); - }); - - } - // Default with window container - else if ($.isWindow(this.$container.get(0))) { - - var detect = function () { - - // Current container's top position - var topPosition = that.$container.scrollTop() + that.fixedNavbarHeight; - var tableTop = that.$table.offset().top - 1; - - // Detect Current container's top is in the table scope - if (tableTop - 1 <= topPosition && (tableTop + that.$table.outerHeight() - 1) >= topPosition && that.$tableWrapper.scrollLeft() > 0) { - - that.$columnHeadTableWrap.css('visibility', 'visible'); - - } else { - - that.$columnHeadTableWrap.css('visibility', 'hidden'); - } - } - } - // Container setting - else { - - var detect = function () { - - var windowTop = $(window).scrollTop(); - var tableTop = that.$table.offset().top - 1; - - // Detect Current container's top is in the table scope - if (tableTop <= windowTop && (tableTop + that.$table.outerHeight() - 1) >= windowTop && that.$tableWrapper.scrollLeft() > 0) { - - that.$columnHeadTableWrap.offset({top: windowTop}); - that.$columnHeadTableWrap.css('visibility', 'visible'); - - } else { - - that.$columnHeadTableWrap.css('visibility', 'hidden'); - } - } - } - - /** - * Listener - Window scroll for effecting Freeze column-head table - */ - this.$container.on('scroll.'+this.namespace, function() { - - detect(); - }); - - /** - * Listener - Table scroll for effecting Freeze column-head table - */ - this.$tableWrapper.on('scroll.'+this.namespace, function() { - - // Disable while isWindowScrollX - if (that.isWindowScrollX) - return; - - detect(); - }); - - /** - * Listener - Window resize for effecting freeze column-head table - */ - this.$container.on('resize.'+this.namespace, function() { - - // Table synchronism - that.$columnHeadTableWrap.find("> table").css('width', that.$table.width()); - that.$columnHeadTableWrap.css('width', that.$columnTableWrap.width()); - that.$columnHeadTableWrap.css('height', that.$table.find("thead").outerHeight()); - }); - } - - /** - * Freeze scroll bar - */ - FreezeTable.prototype.buildScrollBar = function() { - - var that = this; - - var theadHeight = this.$table.find("thead").outerHeight(); - - // Scroll wrap container - var $scrollBarContainer = $('
') - .css('width', this.$table.width()) - .css('height', 1); - - // Wrap the Fixed Column table - this.$scrollBarWrap = $('
') - .css('position', 'fixed') - .css('overflow-x', 'scroll') - .css('visibility', 'hidden') - .css('bottom', 0) - .css('z-index', 2) - .css('width', this.$tableWrapper.width()) - .css('height', this.scrollBarHeight); - - // Add into target table wrap - this.$scrollBarWrap.append($scrollBarContainer); - this.$tableWrapper.append(this.$scrollBarWrap); - - /** - * Listener - Freeze scroll bar effected Table - */ - this.$scrollBarWrap.on('scroll.'+this.namespace, function() { - - that.$tableWrapper.scrollLeft($(this).scrollLeft()); - }); - - /** - * Listener - Table scroll for effecting Freeze scroll bar - */ - this.$tableWrapper.on('scroll.'+this.namespace, function() { - - // this.$headTableWrap.css('left', $table.offset().left); - that.$scrollBarWrap.scrollLeft($(this).scrollLeft()); - }); - - /** - * Listener - Window scroll for effecting scroll bar - */ - this.$container.on('scroll.'+this.namespace, function() { - - // Current container's top position - var bottomPosition = that.$container.scrollTop() + that.$container.height() - theadHeight + that.fixedNavbarHeight; - - // Detect Current container's top is in the table scope - if (that.$table.offset().top - 1 <= bottomPosition && (that.$table.offset().top + that.$table.outerHeight() - 1) >= bottomPosition) { - - that.$scrollBarWrap.css('visibility', 'visible'); - - } else { - - that.$scrollBarWrap.css('visibility', 'hidden'); - } - }); - - /** - * Listener - Window resize for effecting scroll bar - */ - this.$container.on('resize.'+this.namespace, function() { - - // Update width - $scrollBarContainer.css('width', that.$table.width()) - // Update Wrap - that.$scrollBarWrap.css('width', that.$tableWrapper.width()); - }); - } - - /** - * Clone element - * - * @param {element} element - */ - FreezeTable.prototype.clone = function (element) { - - var $clone = $(element).clone() - .removeAttr('id') // Remove ID - - // Bootstrap background-color transparent problem - if (this.backgroundColor) { - $clone.css('background-color', this.backgroundColor); - } - - return $clone; - } - - /** - * simplify cloned head table - * - * @param {element} table Table element - */ - FreezeTable.prototype.simplifyHead = function (table) { - - var that = this; - - var $headTable = $(table); - // Remove non-display DOM but keeping first row for accuracy - $headTable.find("> tr, > tbody > tr, tfoot > tr").not(':first').remove(); - // Each th/td width synchronism - $.each($headTable.find("> thead > tr:nth-child(1) >"), function (key, value) { - - var width = that.$table.find("> thead > tr:nth-child(1) > :nth-child("+parseInt(key+1)+")").outerWidth(); - $(this).css('width', width); - }); - - return $headTable; - } - - /** - * Detect is already initialized - */ - FreezeTable.prototype.isInit = function() { - - // Check existence DOM - if (this.$tableWrapper.find("."+this.headWrapClass).length) - return true; - if (this.$tableWrapper.find("."+this.columnWrapClass).length) - return true; - if (this.$tableWrapper.find("."+this.columnHeadWrapClass).length) - return true; - if (this.$tableWrapper.find("."+this.scrollBarWrapClass).length) - return true; - - return false; - - } - - /** - * Unbind all events by same namespace - */ - FreezeTable.prototype.unbind = function() { - - this.$container.off('resize.'+this.namespace); - this.$container.off('scroll.'+this.namespace); - this.$tableWrapper.off('scroll.'+this.namespace); - } - - /** - * Destroy Freeze Table by same namespace - */ - FreezeTable.prototype.destroy = function() { - - this.unbind(); - this.$tableWrapper.find("."+this.headWrapClass).remove(); - this.$tableWrapper.find("."+this.columnWrapClass).remove(); - this.$tableWrapper.find("."+this.columnHeadWrapClass).remove(); - this.$tableWrapper.find("."+this.scrollBarWrapClass).remove(); - } - - /** - * Resize trigger for current same namespace - */ - FreezeTable.prototype.resize = function() { - - this.$container.trigger('resize.'+this.namespace); - this.$container.trigger('scroll.'+this.namespace); - this.$tableWrapper.trigger('scroll.'+this.namespace); - - return true; - } - - /** - * Update for Dynamic Content - */ - FreezeTable.prototype.update = function() { - - // Same as re-new object - this.options = 'update'; - this.init(); - return this; - } - - /** - * Interface - */ - // Class for single element - window.FreezeTable = FreezeTable; - // jQuery interface - $.fn.freezeTable = function (options) { - - // Single/Multiple mode - if (this.length === 1) { - - return new FreezeTable(this, options) - } - else if (this.length > 1) { - - var result = []; - // Multiple elements bundle - this.each(function () { - result.push(new FreezeTable(this, options)); - }); - - return result; - } - - return false; - } - -})(jQuery, window);