infusion
Version:
Infusion is an application framework for developing flexible stuff with JavaScript
132 lines (112 loc) • 5.13 kB
JavaScript
/*
Copyright The Infusion copyright holders
See the AUTHORS.md file at the top-level directory of this distribution and at
https://github.com/fluid-project/infusion/raw/master/AUTHORS.md.
Licensed under the Educational Community License (ECL), Version 2.0 or the New
BSD license. You may not use this file except in compliance with one these
Licenses.
You may obtain a copy of the ECL 2.0 License and BSD License at
https://github.com/fluid-project/infusion/raw/master/Infusion-LICENSE.txt
*/
var fluid_3_0_0 = fluid_3_0_0 || {};
(function ($, fluid) {
"use strict";
fluid.registerNamespace("fluid.pagedTable");
// cf. ancient SVN-era version in bitbucket at https://bitbucket.org/fluid/infusion/src/adf319d9b279/branches/FLUID-2881/src/webapp/components/pager/js/PagedTable.js
fluid.defaults("fluid.pagedTable.rangeAnnotator", {
gradeNames: ["fluid.component"]
});
// TODO: Get rid of this old-style kind of architecture - we should just react to model changes directly and not inject this
// peculiar event up and down the place. Probably best to have new renderer first.
fluid.pagedTable.rangeAnnotator.onRenderPageLinks = function (that, tree, newModel, pagerBar) {
pagerBar.tooltip.close(); // Close any existing tooltips otherwise they will linger after their parent is destroyed
var roots = {};
var column = that.options.annotateColumnRange || (that.options.annotateSortedColumn ? newModel.sortKey : null);
if (!column) {
return;
}
var dataModel = that.options.dataModel;
var columnDefs = that.options.columnDefs;
var columnDef = fluid.table.findColumnDef(columnDefs, column);
function fetchValue(index) {
index = that.permutation ? that.permutation[index] : index;
return fluid.table.fetchValue(that.options.dataOffset, dataModel, index, columnDef.valuebinding, roots);
}
var tModel = {};
fluid.model.copyModel(tModel, newModel);
var tooltipInfo = {};
fluid.each(tree, function (cell) {
if (cell.ID === "page-link:link") {
var page = cell.pageIndex;
var start = page * tModel.pageSize;
tModel.pageIndex = page;
var limit = fluid.pager.computePageLimit(tModel);
var iValue = fetchValue(start);
var lValue = fetchValue(limit - 1);
tooltipInfo[page] = {
first: iValue,
last: lValue
};
}
});
pagerBar.tooltipInfo = tooltipInfo;
};
fluid.pagedTable.directModelFilter = function (model, pagerModel, perm) {
var togo = [];
var limit = fluid.pager.computePageLimit(pagerModel);
for (var i = pagerModel.pageIndex * pagerModel.pageSize; i < limit; ++i) {
var index = perm ? perm[i] : i;
togo[togo.length] = {index: index, row: model[index]};
}
return togo;
};
fluid.pagedTable.configureTooltip = function (pagedTable, pagerBar, renderedPageList) {
var idMap = renderedPageList.rendererOptions.idMap;
var idToContent = {};
fluid.each(pagerBar.tooltipInfo, function (value, index) {
idToContent[idMap["pageLink:" + index]] = fluid.stringTemplate(pagedTable.options.markup.rangeAnnotation, value);
});
pagerBar.tooltip.applier.change("idToContent", idToContent);
};
fluid.defaults("fluid.pagedTable", {
gradeNames: ["fluid.pager", "fluid.table"],
distributeOptions: [{
target: "{that renderedPageList}.options.listeners.afterRender",
record: {
funcName: "fluid.pagedTable.configureTooltip",
args: ["{pagedTable}", "{pagerBar}", "{arguments}.0"]
// NB! Use of "pagerBar" depends on FLUID-5258 - we will need a new annotation when this is fixed
}
}, {
target: "{that renderedPageList}.options.listeners.onRenderPageLinks",
record: {
funcName: "fluid.pagedTable.rangeAnnotator.onRenderPageLinks",
args: ["{pagedTable}", "{arguments}.0", "{arguments}.1", "{pagerBar}"] // FLUID-5258 as above
}
}, {
target: "{that pagerBar}.options.components.tooltip",
source: "{that}.options.tooltip"
}],
annotateSortedColumn: false,
annotateColumnRange: undefined, // specify a "key" from the columnDefs
markup: {
rangeAnnotation: "<b> %first </b><br/>—<br/><b> %last </b>"
},
tooltip: {
type: "fluid.tooltip",
container: "{that}.container",
options: {
}
},
invokers: {
acquireDefaultRange: {
funcName: "fluid.identity",
args: "{that}.dataModel.length"
}
},
modelFilter: fluid.pagedTable.directModelFilter,
model: {
pageSize: 10
}
});
})(jQuery, fluid_3_0_0);