pgadmin4/web/pgadmin/static/js/selection/active_cell_capture.js
Akshay Joshi 9f836f5433 Fixed following code smells reported by SonarQube:
1) Immediately return this expression instead of assigning it to the temporary variable.
 2) Extract this nested ternary operation into an independent statement.
 3) Expected a `for-of` loop instead of a `for` loop with this simple iteration.
2022-01-18 14:49:54 +05:30

204 lines
6.2 KiB
JavaScript

/////////////////////////////////////////////////////////////
//
// pgAdmin 4 - PostgreSQL Tools
//
// Copyright (C) 2013 - 2022, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
define([
'jquery',
'sources/selection/range_selection_helper',
], function ($, RangeSelectionHelper) {
return function () {
var KEY_RIGHT = 39;
var KEY_LEFT = 37;
var KEY_UP = 38;
var KEY_DOWN = 40;
var bypassDefaultActiveCellRangeChange = false;
var isColumnsResized = false;
var isMouseInHeader = false;
var grid;
var init = function (slickGrid) {
grid = slickGrid;
grid.onDragEnd.subscribe(onDragEndHandler);
grid.onHeaderClick.subscribe(onHeaderClickHandler);
grid.onClick.subscribe(onClickHandler);
grid.onActiveCellChanged.subscribe(onActiveCellChangedHandler);
grid.onKeyDown.subscribe(onKeyDownHandler);
grid.onHeaderMouseEnter.subscribe(onHeaderMouseEnterHandler);
grid.onHeaderMouseLeave.subscribe(onHeaderMouseLeaveHandler);
grid.onColumnsResized.subscribe(onColumnsResizedHandler);
};
var destroy = function () {
grid.onDragEnd.unsubscribe(onDragEndHandler);
grid.onHeaderClick.unsubscribe(onHeaderClickHandler);
grid.onActiveCellChanged.unsubscribe(onActiveCellChangedHandler);
grid.onKeyDown.unsubscribe(onKeyDownHandler);
grid.onHeaderMouseEnter.unsubscribe(onHeaderMouseEnterHandler);
grid.onHeaderMouseLeave.unsubscribe(onHeaderMouseLeaveHandler);
grid.onColumnsResized.unsubscribe(onColumnsResizedHandler);
};
$.extend(this, {
'init': init,
'destroy': destroy,
});
function onDragEndHandler(event, dragData) {
bypassDefaultActiveCellRangeChange = true;
grid.setActiveCell(dragData.range.start.row, dragData.range.start.cell);
}
function onHeaderClickHandler(event, args) {
if (isColumnsResizedAndCurrentlyInHeader()) {
isColumnsResized = false;
event.stopPropagation();
return;
}
/* Skip if clicked on resize handler */
if($(event.target).hasClass('slick-resizable-handle')) {
return;
}
bypassDefaultActiveCellRangeChange = true;
var clickedColumn = args.column.pos + 1;
if (isClickingLastClickedHeader(0, clickedColumn)) {
if (isSingleRangeSelected()) {
grid.resetActiveCell();
} else {
grid.setActiveCell(0, retrievePreviousSelectedRange().fromCell);
}
} else if (!isClickingInSelectedColumn(clickedColumn)) {
grid.setActiveCell(0, clickedColumn);
}
}
function isEditableNewRow(row) {
return row >= grid.getDataLength();
}
function onHeaderMouseLeaveHandler() {
isMouseInHeader = false;
}
function onHeaderMouseEnterHandler() {
isMouseInHeader = true;
isColumnsResized = false;
}
function onColumnsResizedHandler() {
isColumnsResized = true;
}
function onClickHandler(event, args) {
if (isRowHeader(args.cell)) {
bypassDefaultActiveCellRangeChange = true;
var rowClicked = args.row;
if (isEditableNewRow(rowClicked)) {
return;
}
if (isClickingLastClickedHeader(rowClicked, 1)) {
if (isSingleRangeSelected() || grid.getSelectionModel().getSelectedRanges().length === 0) {
grid.resetActiveCell();
} else {
grid.setActiveCell(retrievePreviousSelectedRange().fromRow, 1);
}
} else if (!isClickingInSelectedRow(rowClicked)) {
grid.setActiveCell(rowClicked, 1);
}
}
}
function onActiveCellChangedHandler(event) {
if (bypassDefaultActiveCellRangeChange) {
bypassDefaultActiveCellRangeChange = false;
event.stopPropagation();
}
}
function onKeyDownHandler(event) {
if (hasActiveCell() && isShiftArrowKey(event)) {
selectOnlyRangeOfActiveCell();
}
}
function isColumnsResizedAndCurrentlyInHeader() {
return isMouseInHeader && isColumnsResized;
}
function isClickingLastClickedHeader(clickedRow, clickedColumn) {
return hasActiveCell() && grid.getActiveCell().row === clickedRow && grid.getActiveCell().cell === clickedColumn;
}
function isClickingInSelectedColumn(clickedColumn) {
var column = RangeSelectionHelper.rangeForColumn(grid, clickedColumn);
var cellSelectionModel = grid.getSelectionModel();
var ranges = cellSelectionModel.getSelectedRanges();
return RangeSelectionHelper.isRangeSelected(ranges, column);
}
function isRowHeader(cellClicked) {
return grid.getColumns()[cellClicked].id === 'row-header-column';
}
function isClickingInSelectedRow(rowClicked) {
var row = RangeSelectionHelper.rangeForRow(grid, rowClicked);
var cellSelectionModel = grid.getSelectionModel();
var ranges = cellSelectionModel.getSelectedRanges();
return RangeSelectionHelper.isRangeSelected(ranges, row);
}
function isSingleRangeSelected() {
var cellSelectionModel = grid.getSelectionModel();
var ranges = cellSelectionModel.getSelectedRanges();
return ranges.length === 1;
}
function retrievePreviousSelectedRange() {
var cellSelectionModel = grid.getSelectionModel();
var ranges = cellSelectionModel.getSelectedRanges();
return ranges[ranges.length - 2];
}
function isArrowKey(event) {
return event.which === KEY_RIGHT
|| event.which === KEY_UP
|| event.which === KEY_LEFT
|| event.which === KEY_DOWN;
}
function isModifiedByShiftOnly(event) {
return event.shiftKey
&& !event.ctrlKey
&& !event.altKey;
}
function isShiftArrowKey(event) {
return isModifiedByShiftOnly(event) && isArrowKey(event);
}
function hasActiveCell() {
return !!grid.getActiveCell();
}
function selectOnlyRangeOfActiveCell() {
var cellSelectionModel = grid.getSelectionModel();
var ranges = cellSelectionModel.getSelectedRanges();
if (ranges.length > 1) {
cellSelectionModel.setSelectedRanges([ranges.pop()]);
}
}
};
});