mirror of
https://github.com/koalyptus/TableFilter.git
synced 2026-03-16 15:45:45 +01:00
Added grid layout module
This commit is contained in:
parent
5a72404bd6
commit
cd6a57cd3f
12 changed files with 1145 additions and 385 deletions
378
src/modules/gridLayout.js
Normal file
378
src/modules/gridLayout.js
Normal file
|
|
@ -0,0 +1,378 @@
|
|||
define(["exports", "../dom", "../types", "../helpers", "../event"], function (exports, _dom, _types, _helpers, _event) {
|
||||
"use strict";
|
||||
|
||||
var _classProps = function (child, staticProps, instanceProps) {
|
||||
if (staticProps) Object.defineProperties(child, staticProps);
|
||||
if (instanceProps) Object.defineProperties(child.prototype, instanceProps);
|
||||
};
|
||||
|
||||
var Dom = _dom.Dom;
|
||||
var Types = _types.Types;
|
||||
var Helpers = _helpers.Helpers;
|
||||
var Event = _event.Event;
|
||||
var GridLayout = (function () {
|
||||
var GridLayout = function GridLayout(tf) {
|
||||
var f = tf.fObj;
|
||||
|
||||
//defines grid width
|
||||
this.gridWidth = f.grid_width || null;
|
||||
//defines grid height
|
||||
this.gridHeight = f.grid_height || null;
|
||||
//defines css class for main container
|
||||
this.gridMainContCssClass = f.grid_cont_css_class || "grd_Cont";
|
||||
//defines css class for div containing table
|
||||
this.gridContCssClass = f.grid_tbl_cont_css_class || "grd_tblCont";
|
||||
//defines css class for div containing headers' table
|
||||
this.gridHeadContCssClass = f.grid_tblHead_cont_css_class || "grd_headTblCont";
|
||||
//defines css class for div containing rows counter, paging etc.
|
||||
this.gridInfDivCssClass = f.grid_inf_grid_css_class || "grd_inf";
|
||||
//defines which row contains column headers
|
||||
this.gridHeadRowIndex = f.grid_headers_row_index || 0;
|
||||
//array of headers row indexes to be placed in header table
|
||||
this.gridHeadRows = f.grid_headers_rows || [0];
|
||||
//generate filters in table headers
|
||||
this.gridEnableFilters = f.grid_enable_default_filters !== undefined ? f.grid_enable_default_filters : true;
|
||||
//default col width
|
||||
this.gridDefaultColWidth = f.grid_default_col_width || "100px";
|
||||
//enables/disables columns resizer
|
||||
this.gridEnableColResizer = f.grid_enable_cols_resizer !== undefined ? f.grid_enable_cols_resizer : true;
|
||||
//defines col resizer script path
|
||||
this.gridColResizerPath = f.grid_cont_col_resizer_path || this.basePath + "TFExt_ColsResizer/TFExt_ColsResizer.js";
|
||||
|
||||
this.tf = tf;
|
||||
};
|
||||
|
||||
_classProps(GridLayout, null, {
|
||||
init: {
|
||||
writable: true,
|
||||
value: function () {
|
||||
var tf = this.tf;
|
||||
var f = tf.fObj;
|
||||
var tbl = tf.tbl;
|
||||
|
||||
tf.isExternalFlt = true;
|
||||
|
||||
// in case column widths are not set default width 100px
|
||||
if (!tf.hasColWidth) {
|
||||
tf.colWidth = [];
|
||||
for (var k = 0; k < tf.nbCells; k++) {
|
||||
var colW, cell = tbl.rows[this.gridHeadRowIndex].cells[k];
|
||||
if (cell.width !== "") {
|
||||
colW = cell.width;
|
||||
} else if (cell.style.width !== "") {
|
||||
colW = parseInt(cell.style.width, 10);
|
||||
} else {
|
||||
colW = this.gridDefaultColWidth;
|
||||
}
|
||||
tf.colWidth[k] = colW;
|
||||
}
|
||||
tf.hasColWidth = true;
|
||||
}
|
||||
tf.SetColWidths(this.gridHeadRowIndex);
|
||||
|
||||
var tblW; //initial table width
|
||||
if (tbl.width !== "") {
|
||||
tblW = tbl.width;
|
||||
} else if (tbl.style.width !== "") {
|
||||
tblW = parseInt(tbl.style.width, 10);
|
||||
} else {
|
||||
tblW = tbl.clientWidth;
|
||||
}
|
||||
|
||||
//Main container: it will contain all the elements
|
||||
this.tblMainCont = Dom.create("div", ["id", tf.prfxMainTblCont + tf.id]);
|
||||
this.tblMainCont.className = this.gridMainContCssClass;
|
||||
if (this.gridWidth) {
|
||||
this.tblMainCont.style.width = this.gridWidth;
|
||||
}
|
||||
tbl.parentNode.insertBefore(this.tblMainCont, tf.tbl);
|
||||
|
||||
//Table container: div wrapping content table
|
||||
this.tblCont = Dom.create("div", ["id", tf.prfxTblCont + tf.id]);
|
||||
this.tblCont.className = this.gridContCssClass;
|
||||
if (this.gridWidth) {
|
||||
this.tblCont.style.width = this.gridWidth;
|
||||
}
|
||||
if (this.gridHeight) {
|
||||
this.tblCont.style.height = this.gridHeight;
|
||||
}
|
||||
tbl.parentNode.insertBefore(this.tblCont, tf.tbl);
|
||||
var t = tbl.parentNode.removeChild(tf.tbl);
|
||||
this.tblCont.appendChild(t);
|
||||
|
||||
//In case table width is expressed in %
|
||||
if (tbl.style.width === "") {
|
||||
tbl.style.width = (tf.__containsStr("%", tblW) ? tbl.clientWidth : tblW) + "px";
|
||||
}
|
||||
|
||||
var d = this.tblCont.parentNode.removeChild(this.tblCont);
|
||||
this.tblMainCont.appendChild(d);
|
||||
|
||||
//Headers table container: div wrapping headers table
|
||||
this.headTblCont = Dom.create("div", ["id", tf.prfxHeadTblCont + tf.id]);
|
||||
this.headTblCont.className = this.gridHeadContCssClass;
|
||||
if (this.gridWidth) {
|
||||
this.headTblCont.style.width = this.gridWidth;
|
||||
}
|
||||
|
||||
//Headers table
|
||||
this.headTbl = Dom.create("table", ["id", tf.prfxHeadTbl + tf.id]);
|
||||
var tH = Dom.create("tHead"); //IE<7 needs it
|
||||
|
||||
//1st row should be headers row, ids are added if not set
|
||||
//Those ids are used by the sort feature
|
||||
var hRow = tbl.rows[this.gridHeadRowIndex];
|
||||
var sortTriggers = [];
|
||||
for (var n = 0; n < tf.nbCells; n++) {
|
||||
var c = hRow.cells[n];
|
||||
var thId = c.getAttribute("id");
|
||||
if (!thId || thId === "") {
|
||||
thId = tf.prfxGridTh + n + "_" + tf.id;
|
||||
c.setAttribute("id", thId);
|
||||
}
|
||||
sortTriggers.push(thId);
|
||||
}
|
||||
|
||||
//Filters row is created
|
||||
var filtersRow = Dom.create("tr");
|
||||
if (this.gridEnableFilters && tf.fltGrid) {
|
||||
tf.externalFltTgtIds = [];
|
||||
for (var j = 0; j < tf.nbCells; j++) {
|
||||
var fltTdId = tf.prfxFlt + j + tf.prfxGridFltTd + tf.id;
|
||||
var cl = Dom.create(tf.fltCellTag, ["id", fltTdId]);
|
||||
filtersRow.appendChild(cl);
|
||||
tf.externalFltTgtIds[j] = fltTdId;
|
||||
}
|
||||
}
|
||||
//Headers row are moved from content table to headers table
|
||||
for (var i = 0; i < this.gridHeadRows.length; i++) {
|
||||
var headRow = tbl.rows[this.gridHeadRows[0]];
|
||||
tH.appendChild(headRow);
|
||||
}
|
||||
this.headTbl.appendChild(tH);
|
||||
if (tf.filtersRowIndex === 0) {
|
||||
tH.insertBefore(filtersRow, hRow);
|
||||
} else {
|
||||
tH.appendChild(filtersRow);
|
||||
}
|
||||
|
||||
this.headTblCont.appendChild(this.headTbl);
|
||||
this.tblCont.parentNode.insertBefore(this.headTblCont, this.tblCont);
|
||||
|
||||
//THead needs to be removed in content table for sort feature
|
||||
var thead = Dom.tag(tf.tbl, "thead");
|
||||
if (thead.length > 0) {
|
||||
tbl.removeChild(thead[0]);
|
||||
}
|
||||
|
||||
//Headers table style
|
||||
this.headTbl.style.width = tbl.style.width;
|
||||
this.headTbl.style.tableLayout = "fixed";
|
||||
tbl.style.tableLayout = "fixed";
|
||||
this.headTbl.cellPadding = tbl.cellPadding;
|
||||
this.headTbl.cellSpacing = tbl.cellSpacing;
|
||||
|
||||
//Headers container width
|
||||
this.headTblCont.style.width = this.tblCont.clientWidth + "px";
|
||||
|
||||
//content table without headers needs col widths to be reset
|
||||
tf.SetColWidths();
|
||||
|
||||
tbl.style.width = "";
|
||||
if (Helpers.isIE()) {
|
||||
this.headTbl.style.width = "";
|
||||
}
|
||||
|
||||
//scroll synchronisation
|
||||
var o = this; //TF object
|
||||
|
||||
Event.add(this.tblCont, "scroll", function () {
|
||||
o.headTblCont.scrollLeft = this.scrollLeft;
|
||||
var _o = this; //this = scroll element
|
||||
//New pointerX calc taking into account scrollLeft
|
||||
if (!o.isPointerXOverwritten) {
|
||||
try {
|
||||
o.Evt.pointerX = function (e) {
|
||||
e = e || global.event;
|
||||
var scrollLeft = tf_StandardBody().scrollLeft + _o.scrollLeft;
|
||||
return (e.pageX + _o.scrollLeft) || (e.clientX + scrollLeft);
|
||||
};
|
||||
o.isPointerXOverwritten = true;
|
||||
} catch (err) {
|
||||
o.isPointerXOverwritten = false;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
//Sort is enabled if not specified in config object
|
||||
if (f.sort !== false) {
|
||||
tf.sort = true;
|
||||
tf.sortConfig.asyncSort = true;
|
||||
tf.sortConfig.triggerIds = sortTriggers;
|
||||
}
|
||||
|
||||
if (this.gridEnableColResizer) {
|
||||
if (!tf.hasExtensions) {
|
||||
tf.extensions = {
|
||||
name: ["ColumnsResizer_" + tf.id],
|
||||
src: [this.gridColResizerPath],
|
||||
description: ["Columns Resizing"],
|
||||
initialize: [function (o) {
|
||||
o.SetColsResizer("ColumnsResizer_" + o.id);
|
||||
}]
|
||||
};
|
||||
tf.hasExtensions = true;
|
||||
} else {
|
||||
if (!tf.__containsStr("colsresizer", Str.lower(tf.extensions.src.toString()))) {
|
||||
tf.extensions.name.push("ColumnsResizer_" + tf.id);
|
||||
tf.extensions.src.push(tf.gridColResizerPath);
|
||||
tf.extensions.description.push("Columns Resizing");
|
||||
tf.extensions.initialize.push(function (o) {
|
||||
o.SetColsResizer("ColumnsResizer_" + o.id);
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//Default columns resizer properties for grid layout
|
||||
f.col_resizer_cols_headers_table = this.headTbl.getAttribute("id");
|
||||
f.col_resizer_cols_headers_index = this.gridHeadRowIndex;
|
||||
f.col_resizer_width_adjustment = 0;
|
||||
f.col_enable_text_ellipsis = false;
|
||||
|
||||
//Cols generation for all browsers excepted IE<=7
|
||||
o.tblHasColTag = Dom.tag(tbl, "col").length > 0 ? true : false;
|
||||
if (!Helpers.isIE()) {
|
||||
//Col elements are enough to keep column widths after sorting and
|
||||
//filtering
|
||||
var createColTags = function (o) {
|
||||
if (!o) {
|
||||
return;
|
||||
}
|
||||
for (var k = (o.nbCells - 1); k >= 0; k--) {
|
||||
var col = Dom.create("col", ["id", o.id + "_col_" + k]);
|
||||
tbl.firstChild.parentNode.insertBefore(col, tbl.firstChild);
|
||||
col.style.width = o.colWidth[k];
|
||||
o.gridColElms[k] = col;
|
||||
}
|
||||
o.tblHasColTag = true;
|
||||
};
|
||||
if (!o.tblHasColTag) {
|
||||
createColTags(o);
|
||||
} else {
|
||||
var cols = Dom.tag(tbl, "col");
|
||||
for (var ii = 0; ii < o.nbCells; ii++) {
|
||||
cols[ii].setAttribute("id", o.id + "_col_" + ii);
|
||||
cols[ii].style.width = o.colWidth[ii];
|
||||
o.gridColElms.push(cols[ii]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//IE <= 7 needs an additional row for widths as col element width is
|
||||
//not enough...
|
||||
if (Helpers.isIE()) {
|
||||
var tbody = Dom.tag(tbl, "tbody"), r;
|
||||
if (tbody.length > 0) {
|
||||
r = tbody[0].insertRow(0);
|
||||
} else {
|
||||
r = tbl.insertRow(0);
|
||||
}
|
||||
r.style.height = "0px";
|
||||
for (var x = 0; x < o.nbCells; x++) {
|
||||
var col = Dom.create("td", ["id", o.id + "_col_" + x]);
|
||||
col.style.width = o.colWidth[x];
|
||||
tbl.rows[1].cells[x].style.width = "";
|
||||
r.appendChild(col);
|
||||
o.gridColElms.push(col);
|
||||
}
|
||||
this.hasGridWidthsRow = true;
|
||||
//Data table row with widths expressed
|
||||
o.leadColWidthsRow = tbl.rows[0];
|
||||
o.leadColWidthsRow.setAttribute("validRow", "false");
|
||||
|
||||
var beforeSortFn = Types.isFn(f.on_before_sort) ? f.on_before_sort : null;
|
||||
f.on_before_sort = function (o, colIndex) {
|
||||
o.leadColWidthsRow.setAttribute("validRow", "false");
|
||||
if (beforeSortFn) {
|
||||
beforeSortFn.call(null, o, colIndex);
|
||||
}
|
||||
};
|
||||
|
||||
var afterSortFn = Types.isFn(f.on_after_sort) ? f.on_after_sort : null;
|
||||
f.on_after_sort = function (o, colIndex) {
|
||||
if (o.leadColWidthsRow.rowIndex !== 0) {
|
||||
var r = o.leadColWidthsRow;
|
||||
if (tbody.length > 0) {
|
||||
tbody[0].moveRow(o.leadColWidthsRow.rowIndex, 0);
|
||||
} else {
|
||||
tbl.moveRow(o.leadColWidthsRow.rowIndex, 0);
|
||||
}
|
||||
}
|
||||
if (afterSortFn) {
|
||||
afterSortFn.call(null, o, colIndex);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
var afterColResizedFn = Types.isFn(f.on_after_col_resized) ? f.on_after_col_resized : null;
|
||||
f.on_after_col_resized = function (o, colIndex) {
|
||||
if (!colIndex) {
|
||||
return;
|
||||
}
|
||||
var w = o.crWColsRow.cells[colIndex].style.width;
|
||||
var col = o.gridColElms[colIndex];
|
||||
col.style.width = w;
|
||||
|
||||
var thCW = o.crWColsRow.cells[colIndex].clientWidth;
|
||||
var tdCW = o.crWRowDataTbl.cells[colIndex].clientWidth;
|
||||
|
||||
if (Helpers.isIE()) {
|
||||
tbl.style.width = o.headTbl.clientWidth + "px";
|
||||
}
|
||||
|
||||
if (thCW != tdCW && !Helpers.isIE()) {
|
||||
o.headTbl.style.width = tbl.clientWidth + "px";
|
||||
}
|
||||
|
||||
if (afterColResizedFn) {
|
||||
afterColResizedFn.call(null, o, colIndex);
|
||||
}
|
||||
};
|
||||
|
||||
if (tbl.clientWidth !== this.headTbl.clientWidth) {
|
||||
tbl.style.width = this.headTbl.clientWidth + "px";
|
||||
}
|
||||
|
||||
tf.refRow = Helpers.isIE() ? (tf.refRow + 1) : 0;
|
||||
}
|
||||
},
|
||||
destroy: {
|
||||
writable: true,
|
||||
value: function () {
|
||||
var tf = this.tf;
|
||||
var tbl = tf.tbl;
|
||||
|
||||
if (!tf.gridLayout) {
|
||||
return;
|
||||
}
|
||||
var t = tbl.parentNode.removeChild(tbl);
|
||||
this.tblMainCont.parentNode.insertBefore(t, this.tblMainCont);
|
||||
this.tblMainCont.parentNode.removeChild(this.tblMainCont);
|
||||
|
||||
this.tblMainCont = null;
|
||||
this.headTblCont = null;
|
||||
this.headTbl = null;
|
||||
this.tblCont = null;
|
||||
|
||||
tbl.outerHTML = tf.sourceTblHtml;
|
||||
tbl = Dom.id(tf.id); //needed to keep reference
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
return GridLayout;
|
||||
})();
|
||||
|
||||
exports.GridLayout = GridLayout;
|
||||
});
|
||||
1
src/modules/gridLayout.js.map
Normal file
1
src/modules/gridLayout.js.map
Normal file
File diff suppressed because one or more lines are too long
|
|
@ -38,7 +38,7 @@ define(["exports", "../dom", "../types"], function (exports, _dom, _types) {
|
|||
var containerDiv = Dom.create("div", ["id", tf.prfxLoader + tf.id]);
|
||||
containerDiv.className = this.loaderCssClass;
|
||||
|
||||
var targetEl = !this.loaderTgtId ? (tf.gridLayout ? tf.tblCont : tf.tbl.parentNode) : Dom.id(this.loaderTgtId);
|
||||
var targetEl = !this.loaderTgtId ? tf.tbl.parentNode : Dom.id(this.loaderTgtId);
|
||||
if (!this.loaderTgtId) {
|
||||
targetEl.insertBefore(containerDiv, tf.tbl);
|
||||
} else {
|
||||
|
|
|
|||
File diff suppressed because one or more lines are too long
Loading…
Add table
Add a link
Reference in a new issue