handsontable
Version:
Handsontable is a JavaScript Data Grid available for React, Angular and Vue.
179 lines • 7.27 kB
JavaScript
import { isDefined } from "../helpers/mixed.mjs";
import { GRID_GROUP, EDITOR_EDIT_GROUP } from "./constants.mjs";
import { createKeyboardShortcutCommandsPool } from "./commands/index.mjs";
/**
* The context that defines shortcut list available for selected cell or cells.
*
* @param {Handsontable} hot The Handsontable instance.
*/
export function shortcutsGridContext(hot) {
const context = hot.getShortcutManager().addContext('grid');
const commandsPool = createKeyboardShortcutCommandsPool(hot);
const config = {
runOnlyIf: () => {
const {
navigableHeaders
} = hot.getSettings();
return isDefined(hot.getSelected()) && (navigableHeaders || !navigableHeaders && hot.countRenderedRows() > 0 && hot.countRenderedCols() > 0);
},
group: GRID_GROUP
};
context.addShortcuts([{
keys: [['F2']],
callback: event => commandsPool.editorFastOpen(event)
}, {
keys: [['Enter'], ['Enter', 'Shift']],
callback: (event, keys) => commandsPool.editorOpen(event, keys)
}, {
keys: [['Backspace'], ['Delete']],
callback: () => commandsPool.emptySelectedCells()
}], {
group: EDITOR_EDIT_GROUP,
runOnlyIf: () => isDefined(hot.getSelected())
});
context.addShortcuts([{
keys: [['Control/Meta', 'A']],
callback: () => commandsPool.selectAllCells(),
runOnlyIf: () => {
var _hot$getSelectedRange;
return !((_hot$getSelectedRange = hot.getSelectedRangeActive()) !== null && _hot$getSelectedRange !== void 0 && _hot$getSelectedRange.highlight.isHeader());
}
}, {
keys: [['Control/Meta', 'A']],
callback: () => {},
runOnlyIf: () => {
var _hot$getSelectedRange2;
return (_hot$getSelectedRange2 = hot.getSelectedRangeActive()) === null || _hot$getSelectedRange2 === void 0 ? void 0 : _hot$getSelectedRange2.highlight.isHeader();
},
preventDefault: true
}, {
keys: [['Control/Meta', 'Shift', 'Space']],
callback: () => commandsPool.selectAllCellsAndHeaders()
}, {
keys: [['Control/Meta', 'Enter']],
callback: () => commandsPool.populateSelectedCellsData(),
runOnlyIf: () => {
var _hot$getSelectedRange3, _hot$getSelectedRange4;
return !((_hot$getSelectedRange3 = hot.getSelectedRangeActive()) !== null && _hot$getSelectedRange3 !== void 0 && _hot$getSelectedRange3.highlight.isHeader()) && ((_hot$getSelectedRange4 = hot.getSelectedRangeActive()) === null || _hot$getSelectedRange4 === void 0 ? void 0 : _hot$getSelectedRange4.getCellsCount()) > 1;
}
}, {
keys: [['Control', 'Space']],
captureCtrl: true,
callback: () => commandsPool.extendCellsSelectionToColumns()
}, {
keys: [['Shift', 'Space']],
stopPropagation: true,
callback: () => commandsPool.extendCellsSelectionToRows()
}, {
keys: [['ArrowUp']],
callback: () => commandsPool.moveCellSelectionUp()
}, {
keys: [['ArrowUp', 'Control/Meta']],
captureCtrl: true,
callback: () => commandsPool.moveCellSelectionToMostTop()
}, {
keys: [['ArrowUp', 'Shift']],
callback: () => commandsPool.extendCellsSelectionUp()
}, {
keys: [['ArrowUp', 'Shift', 'Control/Meta']],
captureCtrl: true,
callback: () => commandsPool.extendCellsSelectionToMostTop(),
runOnlyIf: () => !(hot.selection.isSelectedByCorner() || hot.selection.isSelectedByColumnHeader())
}, {
keys: [['ArrowDown']],
callback: () => commandsPool.moveCellSelectionDown()
}, {
keys: [['ArrowDown', 'Control/Meta']],
captureCtrl: true,
callback: () => commandsPool.moveCellSelectionToMostBottom()
}, {
keys: [['ArrowDown', 'Shift']],
callback: () => commandsPool.extendCellsSelectionDown()
}, {
keys: [['ArrowDown', 'Shift', 'Control/Meta']],
captureCtrl: true,
callback: () => commandsPool.extendCellsSelectionToMostBottom(),
runOnlyIf: () => !(hot.selection.isSelectedByCorner() || hot.selection.isSelectedByColumnHeader())
}, {
keys: [['ArrowLeft']],
callback: () => commandsPool.moveCellSelectionLeft()
}, {
keys: [['ArrowLeft', 'Control/Meta']],
captureCtrl: true,
callback: () => commandsPool.moveCellSelectionToMostLeft()
}, {
keys: [['ArrowLeft', 'Shift']],
callback: () => commandsPool.extendCellsSelectionLeft()
}, {
keys: [['ArrowLeft', 'Shift', 'Control/Meta']],
captureCtrl: true,
callback: () => commandsPool.extendCellsSelectionToMostLeft(),
runOnlyIf: () => !(hot.selection.isSelectedByCorner() || hot.selection.isSelectedByRowHeader())
}, {
keys: [['ArrowRight']],
callback: () => commandsPool.moveCellSelectionRight()
}, {
keys: [['ArrowRight', 'Control/Meta']],
captureCtrl: true,
callback: () => commandsPool.moveCellSelectionToMostRight()
}, {
keys: [['ArrowRight', 'Shift']],
callback: () => commandsPool.extendCellsSelectionRight()
}, {
keys: [['ArrowRight', 'Shift', 'Control/Meta']],
captureCtrl: true,
callback: () => commandsPool.extendCellsSelectionToMostRight(),
runOnlyIf: () => !(hot.selection.isSelectedByCorner() || hot.selection.isSelectedByRowHeader())
}, {
keys: [['Home']],
captureCtrl: true,
callback: () => commandsPool.moveCellSelectionToMostInlineStart(),
runOnlyIf: () => hot.view.isMainTableNotFullyCoveredByOverlays()
}, {
keys: [['Home', 'Shift']],
callback: () => commandsPool.extendCellsSelectionToMostInlineStart()
}, {
keys: [['Home', 'Control/Meta']],
captureCtrl: true,
callback: () => commandsPool.moveCellSelectionToMostTopInlineStart(),
runOnlyIf: () => hot.view.isMainTableNotFullyCoveredByOverlays()
}, {
keys: [['End']],
captureCtrl: true,
callback: () => commandsPool.moveCellSelectionToMostInlineEnd(),
runOnlyIf: () => hot.view.isMainTableNotFullyCoveredByOverlays()
}, {
keys: [['End', 'Shift']],
callback: () => commandsPool.extendCellsSelectionToMostInlineEnd()
}, {
keys: [['End', 'Control/Meta']],
captureCtrl: true,
callback: () => commandsPool.moveCellSelectionToMostBottomInlineEnd(),
runOnlyIf: () => hot.view.isMainTableNotFullyCoveredByOverlays()
}, {
keys: [['PageUp']],
callback: () => commandsPool.moveCellSelectionUpByViewportHight()
}, {
keys: [['PageUp', 'Shift']],
callback: () => commandsPool.extendCellsSelectionUpByViewportHeight()
}, {
keys: [['PageDown']],
callback: () => commandsPool.moveCellSelectionDownByViewportHeight()
}, {
keys: [['PageDown', 'Shift']],
callback: () => commandsPool.extendCellsSelectionDownByViewportHeight()
}, {
keys: [['Tab']],
// The property value is controlled by focusCatcher module (https://github.com/handsontable/handsontable/blob/master/handsontable/src/core/focusCatcher/index.js)
preventDefault: false,
callback: event => commandsPool.moveCellSelectionInlineStart(event)
}, {
keys: [['Shift', 'Tab']],
// The property value is controlled by focusCatcher module (https://github.com/handsontable/handsontable/blob/master/handsontable/src/core/focusCatcher/index.js)
preventDefault: false,
callback: event => commandsPool.moveCellSelectionInlineEnd(event)
}, {
keys: [['Control/Meta', 'Backspace']],
callback: () => commandsPool.scrollToFocusedCell()
}], config);
}