2017-06-08 07:31:36 -05:00
|
|
|
define([
|
|
|
|
'jquery',
|
|
|
|
'sources/selection/range_selection_helper',
|
2017-06-12 10:55:14 -05:00
|
|
|
'slickgrid',
|
2017-06-08 07:31:36 -05:00
|
|
|
], function ($, RangeSelectionHelper) {
|
2017-04-18 07:28:45 -05:00
|
|
|
var ColumnSelector = function () {
|
2017-06-27 08:03:04 -05:00
|
|
|
var Slick = window.Slick,
|
|
|
|
gridEventBus = new Slick.EventHandler(),
|
|
|
|
onBeforeColumnSelectAll = new Slick.Event(),
|
|
|
|
onColumnSelectAll = new Slick.Event();
|
2017-06-08 07:31:36 -05:00
|
|
|
|
2017-04-18 07:28:45 -05:00
|
|
|
var init = function (grid) {
|
2017-06-08 07:31:36 -05:00
|
|
|
gridEventBus.subscribe(grid.onHeaderClick, handleHeaderClick.bind(null, grid));
|
|
|
|
grid.getSelectionModel().onSelectedRangesChanged
|
|
|
|
.subscribe(handleSelectedRangesChanged.bind(null, grid));
|
2017-06-27 08:03:04 -05:00
|
|
|
onColumnSelectAll.subscribe(function(e, args) {
|
|
|
|
updateRanges(args.grid, args.column.id);
|
|
|
|
});
|
2017-06-08 07:31:36 -05:00
|
|
|
};
|
2017-04-18 07:28:45 -05:00
|
|
|
|
2017-06-08 07:31:36 -05:00
|
|
|
var handleHeaderClick = function (grid, event, args) {
|
|
|
|
var columnDefinition = args.column;
|
2017-04-18 07:28:45 -05:00
|
|
|
|
2017-06-08 07:31:36 -05:00
|
|
|
grid.focus();
|
2017-04-18 07:28:45 -05:00
|
|
|
|
2017-06-08 07:31:36 -05:00
|
|
|
if (isColumnSelectable(columnDefinition)) {
|
|
|
|
var $columnHeader = $(event.target);
|
|
|
|
if (hasClickedChildOfColumnHeader(event)) {
|
2017-06-27 08:03:04 -05:00
|
|
|
if ($(event.target).hasClass('slick-resizable-handle')) {
|
|
|
|
return;
|
|
|
|
}
|
2017-06-12 10:55:14 -05:00
|
|
|
$columnHeader = $(event.target).parents('.slick-header-column');
|
2017-04-18 07:28:45 -05:00
|
|
|
}
|
2017-06-08 07:31:36 -05:00
|
|
|
$columnHeader.toggleClass('selected');
|
|
|
|
|
2017-06-27 08:03:04 -05:00
|
|
|
if ($columnHeader.hasClass('selected')) {
|
|
|
|
onBeforeColumnSelectAll.notify(args, event);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!(event.isPropagationStopped() || event.isImmediatePropagationStopped())) {
|
|
|
|
updateRanges(grid, columnDefinition.id);
|
|
|
|
}
|
2017-06-08 07:31:36 -05:00
|
|
|
}
|
2017-04-18 07:28:45 -05:00
|
|
|
};
|
|
|
|
|
2017-06-08 07:31:36 -05:00
|
|
|
var handleSelectedRangesChanged = function (grid, event, selectedRanges) {
|
|
|
|
$('.slick-header-column').each(function (index, columnHeader) {
|
|
|
|
var $spanHeaderColumn = $(columnHeader).find('[data-cell-type="column-header-row"]');
|
|
|
|
var columnIndex = grid.getColumnIndex($spanHeaderColumn.data('column-id'));
|
|
|
|
|
|
|
|
if (isColumnSelected(grid, selectedRanges, columnIndex)) {
|
|
|
|
$(columnHeader).addClass('selected');
|
|
|
|
} else {
|
|
|
|
$(columnHeader).removeClass('selected');
|
|
|
|
}
|
|
|
|
});
|
2017-04-18 07:28:45 -05:00
|
|
|
};
|
|
|
|
|
|
|
|
var updateRanges = function (grid, columnId) {
|
|
|
|
var selectionModel = grid.getSelectionModel();
|
|
|
|
var ranges = selectionModel.getSelectedRanges();
|
|
|
|
|
|
|
|
var columnIndex = grid.getColumnIndex(columnId);
|
|
|
|
|
2017-06-08 07:31:36 -05:00
|
|
|
var columnRange = RangeSelectionHelper.rangeForColumn(grid, columnIndex);
|
2017-04-18 07:28:45 -05:00
|
|
|
var newRanges;
|
2017-06-08 07:31:36 -05:00
|
|
|
if (RangeSelectionHelper.isRangeSelected(ranges, columnRange)) {
|
|
|
|
newRanges = RangeSelectionHelper.removeRange(ranges, columnRange);
|
2017-04-18 07:28:45 -05:00
|
|
|
} else {
|
2017-06-08 07:31:36 -05:00
|
|
|
if (RangeSelectionHelper.areAllRangesSingleColumns(ranges, grid)) {
|
|
|
|
newRanges = RangeSelectionHelper.addRange(ranges, columnRange);
|
2017-04-18 07:28:45 -05:00
|
|
|
} else {
|
|
|
|
newRanges = [columnRange];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
selectionModel.setSelectedRanges(newRanges);
|
|
|
|
};
|
|
|
|
|
2017-06-08 07:31:36 -05:00
|
|
|
var hasClickedChildOfColumnHeader = function (event) {
|
2017-06-12 10:55:14 -05:00
|
|
|
return !$(event.target).hasClass('slick-header-column');
|
2017-04-18 07:28:45 -05:00
|
|
|
};
|
|
|
|
|
2017-06-08 07:31:36 -05:00
|
|
|
var isColumnSelectable = function (columnDefinition) {
|
|
|
|
return columnDefinition.selectable !== false;
|
|
|
|
};
|
|
|
|
|
|
|
|
var isColumnSelected = function (grid, selectedRanges, columnIndex) {
|
|
|
|
var allRangesAreRows = RangeSelectionHelper.areAllRangesCompleteRows(grid, selectedRanges);
|
|
|
|
return isAnyCellSelectedInColumn(grid, selectedRanges, columnIndex) && !allRangesAreRows;
|
|
|
|
};
|
|
|
|
|
|
|
|
var isAnyCellSelectedInColumn = function (grid, selectedRanges, columnIndex) {
|
|
|
|
var isStillSelected = RangeSelectionHelper.isRangeEntirelyWithinSelectedRanges(selectedRanges,
|
|
|
|
RangeSelectionHelper.rangeForColumn(grid, columnIndex));
|
|
|
|
var cellSelectedInColumn = RangeSelectionHelper.isAnyCellOfColumnSelected(selectedRanges, columnIndex);
|
|
|
|
|
|
|
|
return isStillSelected || cellSelectedInColumn;
|
2017-04-18 07:28:45 -05:00
|
|
|
};
|
|
|
|
|
2017-06-08 07:31:36 -05:00
|
|
|
var getColumnDefinitions = function (columnDefinitions) {
|
2017-04-18 07:28:45 -05:00
|
|
|
return _.map(columnDefinitions, function (columnDefinition) {
|
2017-06-08 07:31:36 -05:00
|
|
|
if (isColumnSelectable(columnDefinition)) {
|
2017-04-18 07:28:45 -05:00
|
|
|
var name =
|
2017-06-12 10:55:14 -05:00
|
|
|
'<span data-cell-type=\'column-header-row\' ' +
|
|
|
|
' data-test=\'output-column-header\'' +
|
|
|
|
' data-column-id=\'' + columnDefinition.id + '\'>' +
|
|
|
|
' <span class=\'column-description\'>' +
|
|
|
|
' <span class=\'column-name\'>' + columnDefinition.display_name + '</span>' +
|
|
|
|
' <span class=\'column-type\'>' + columnDefinition.column_type + '</span>' +
|
|
|
|
' </span>' +
|
|
|
|
'</span>';
|
2017-04-18 07:28:45 -05:00
|
|
|
return _.extend(columnDefinition, {
|
2017-06-12 10:55:14 -05:00
|
|
|
name: name,
|
2017-04-18 07:28:45 -05:00
|
|
|
});
|
|
|
|
} else {
|
|
|
|
return columnDefinition;
|
|
|
|
}
|
|
|
|
});
|
|
|
|
};
|
|
|
|
|
|
|
|
$.extend(this, {
|
2017-06-12 10:55:14 -05:00
|
|
|
'init': init,
|
|
|
|
'getColumnDefinitions': getColumnDefinitions,
|
2017-06-27 08:03:04 -05:00
|
|
|
'onBeforeColumnSelectAll': onBeforeColumnSelectAll,
|
|
|
|
'onColumnSelectAll': onColumnSelectAll,
|
2017-04-18 07:28:45 -05:00
|
|
|
});
|
|
|
|
};
|
|
|
|
return ColumnSelector;
|
|
|
|
});
|