pgadmin4/web/pgadmin/static/js/selection/row_selector.js

86 lines
2.7 KiB
JavaScript

define(['jquery', 'sources/selection/range_selection_helper', 'slickgrid'], function ($, rangeSelectionHelper) {
var RowSelector = function () {
var Slick = window.Slick;
var gridEventBus = new Slick.EventHandler();
var init = function (grid) {
grid.getSelectionModel()
.onSelectedRangesChanged.subscribe(handleSelectedRangesChanged.bind(null, grid));
gridEventBus
.subscribe(grid.onClick, handleClick.bind(null, grid))
};
var handleClick = function (grid, event, args) {
if (grid.getColumns()[args.cell].id === 'row-header-column') {
if (event.target.type != "checkbox") {
var checkbox = $(event.target).find('input[type="checkbox"]');
toggleCheckbox($(checkbox));
}
updateRanges(grid, args.row);
}
}
var handleSelectedRangesChanged = function (grid, event, ranges) {
$('[data-cell-type="row-header-checkbox"]:checked')
.each(function (index, checkbox) {
var $checkbox = $(checkbox);
var row = parseInt($checkbox.data('row'));
var isStillSelected = rangeSelectionHelper.isRangeSelected(ranges,
rangeSelectionHelper.rangeForRow(grid, row));
if (!isStillSelected) {
toggleCheckbox($checkbox);
}
});
}
var updateRanges = function (grid, rowId) {
var selectionModel = grid.getSelectionModel();
var ranges = selectionModel.getSelectedRanges();
var rowRange = rangeSelectionHelper.rangeForRow(grid, rowId);
var newRanges;
if (rangeSelectionHelper.isRangeSelected(ranges, rowRange)) {
newRanges = rangeSelectionHelper.removeRange(ranges, rowRange);
} else {
if (rangeSelectionHelper.areAllRangesRows(ranges, grid)) {
newRanges = rangeSelectionHelper.addRange(ranges, rowRange);
} else {
newRanges = [rowRange];
}
}
selectionModel.setSelectedRanges(newRanges);
}
var toggleCheckbox = function (checkbox) {
if (checkbox.prop("checked")) {
checkbox.prop("checked", false)
} else {
checkbox.prop("checked", true)
}
};
var getColumnDefinitionsWithCheckboxes = function (columnDefinitions) {
columnDefinitions.unshift({
id: 'row-header-column',
name: '',
selectable: false,
focusable: false,
formatter: function (rowIndex) {
return '<input type="checkbox" ' +
'data-row="' + rowIndex + '" ' +
'data-cell-type="row-header-checkbox"/>'
}
});
return columnDefinitions;
};
$.extend(this, {
"init": init,
"getColumnDefinitionsWithCheckboxes": getColumnDefinitionsWithCheckboxes
});
};
return RowSelector;
});