2017-06-08 07:31:36 -05:00
|
|
|
define([
|
|
|
|
'jquery',
|
|
|
|
'sources/selection/range_selection_helper',
|
|
|
|
'slickgrid'
|
|
|
|
], function ($, RangeSelectionHelper) {
|
2017-04-18 07:28:45 -05:00
|
|
|
var ColumnSelector = function () {
|
2017-06-08 07:31:36 -05:00
|
|
|
var Slick = window.Slick;
|
|
|
|
var gridEventBus = new Slick.EventHandler();
|
|
|
|
|
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-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)) {
|
|
|
|
$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');
|
|
|
|
|
|
|
|
updateRanges(grid, columnDefinition.id);
|
|
|
|
}
|
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) {
|
|
|
|
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 =
|
|
|
|
"<span data-cell-type='column-header-row' " +
|
2017-06-08 07:31:36 -05:00
|
|
|
" 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>" +
|
2017-04-18 07:28:45 -05:00
|
|
|
"</span>";
|
|
|
|
return _.extend(columnDefinition, {
|
|
|
|
name: name
|
|
|
|
});
|
|
|
|
} else {
|
|
|
|
return columnDefinition;
|
|
|
|
}
|
|
|
|
});
|
|
|
|
};
|
|
|
|
|
|
|
|
$.extend(this, {
|
|
|
|
"init": init,
|
2017-06-08 07:31:36 -05:00
|
|
|
"getColumnDefinitions": getColumnDefinitions
|
2017-04-18 07:28:45 -05:00
|
|
|
});
|
|
|
|
};
|
|
|
|
return ColumnSelector;
|
|
|
|
});
|