jwic.lib.slickgrid.plugins.slick.draggablegrouping.js Maven / Gradle / Ivy
/**
*
* Draggable Grouping contributed by: Muthukumar Selvarasu
* muthukumar{dot}se{at}gmail{dot}com
* github.com/muthukumarse/Slickgrid
*
* NOTES:
* This plugin provides the Draggable Grouping feature
*/
(function ($) {
// Register namespace
$.extend(true, window, {
"Slick": {
"DraggableGrouping": DraggableGrouping
}
});
/**
* DraggableGrouping plugin to show/hide tooltips when columns are too narrow to fit content.
* @constructor
* @param {boolean} [options.enableForCells=true] - Enable tooltip for grid cells
* @param {boolean} [options.enableForHeaderCells=false] - Enable tooltip for header cells
* @param {number} [options.maxToolTipLength=null] - The maximum length for a tooltip
*/
function DraggableGrouping(options) {
var _grid;
var _gridUid;
var _gridColumns;
var _dataView;
var dropbox;
var dropboxPlaceholder;
var _self = this;
var _defaults = {
};
/**
* Initialize plugin.
*/
function init(grid) {
options = $.extend(true, {}, _defaults, options);
_grid = grid;
_gridUid = _grid.getUID();
_gridColumns = _grid.getColumns();
_dataView = _grid.getData();
dropbox = $(_grid.getPreHeaderPanel());
dropbox.html("Drop a column header here to group by the column");
dropboxPlaceholder = dropbox.find(".slick-placeholder");
setupColumnDropbox();
}
/**
* Destroy plugin.
*/
function destroy() {
}
function setColumns(col) {
_gridColumns = col;
}
var emptyDropbox;
function setupColumnDropbox() {
dropbox.droppable({
activeClass: "ui-state-default",
hoverClass: "ui-state-hover",
accept: ":not(.ui-sortable-helper)",
deactivate: function(event, ui) {
dropbox.removeClass("slick-header-column-denied");
},
drop: function(event, ui) {
handleGroupByDrop(this, ui.draggable);
},
over: function(event, ui) {
var id = (ui.draggable).attr('id').replace(_gridUid, "");
_gridColumns.forEach(function(e, i, a) {
if (e.id == id) {
if (e.grouping == null) {
dropbox.addClass("slick-header-column-denied");
}
}
});
}
});
dropbox.sortable({
items: "div.slick-dropped-grouping",
cursor: "default",
tolerance: "pointer",
helper: "clone",
update: function(event, ui) {
var sortArray = $(this).sortable('toArray', {
attribute: 'data-id'
}),
newGroupingOrder = [];
for (var i = 0, l = sortArray.length; i < l; i++) {
for (var a = 0, b = columnsGroupBy.length; a < b; a++) {
if (columnsGroupBy[a].id == sortArray[i]) {
newGroupingOrder.push(columnsGroupBy[a]);
break;
}
}
}
columnsGroupBy = newGroupingOrder;
updateGroupBy();
}
});
emptyDropbox = dropbox.html();
}
var columnsGroupBy = [];
var groupBySorters = [];
function handleGroupByDrop(container, column) {
var columnid = column.attr('id').replace(_gridUid, "");
var columnAllowed = true;
columnsGroupBy.forEach(function(e, i, a) {
if (e.id == columnid) {
columnAllowed = false;
}
});
if (columnAllowed) {
_gridColumns.forEach(function(e, i, a) {
if (e.id == columnid) {
if (e.grouping != null) {
var entry = $("");
var span = $("").text(column.text() + " ")
span.appendTo(entry);
$("").appendTo(entry);
entry.appendTo(container);
addColumnGroupBy(e, column, container, entry);
addGroupByRemoveClickHandler(e.id, container, column, entry);
}
}
});
}
}
function addColumnGroupBy(column) {
columnsGroupBy.push(column);
updateGroupBy();
}
function addGroupByRemoveClickHandler(id, container, column, entry) {
var text = entry;
$("#" + _gridUid + id + "_entry").on('click', function() {
$(this).off('click');
removeGroupBy(id, column, text);
});
}
function clearDroppedGroups() {
columnsGroupBy = [];
}
function removeFromArray(arr) {
var what, a = arguments,
L = a.length,
ax;
while (L > 1 && arr.length) {
what = a[--L];
while ((ax = arr.indexOf(what)) != -1) {
arr.splice(ax, 1);
}
}
return arr;
}
function removeGroupBy(id, column, entry) {
entry.remove();
var groupby = [];
_gridColumns.forEach(function(e, i, a) {
groupby[e.id] = e;
});
removeFromArray(columnsGroupBy, groupby[id]);
if(columnsGroupBy.length == 0){
dropboxPlaceholder.show();
}
updateGroupBy();
}
function updateGroupBy() {
if (columnsGroupBy.length == 0) {
_dataView.setGrouping([]);
return;
}
var groupingArray = [];
columnsGroupBy.forEach(function(element, index, array) {
groupingArray.push(element.grouping);
});
_dataView.setGrouping(groupingArray);
/*
collapseAllGroups();
*/
}
// Public API
$.extend(this, {
"init": init,
"destroy": destroy,
"clearDroppedGroups": clearDroppedGroups
});
}
})(jQuery);
© 2015 - 2025 Weber Informatics LLC | Privacy Policy