import { RevBehavioredColumnSettings, RevBehavioredGridSettings, RevCellEditor, RevClientGrid, RevFocus, RevViewCell } from '../../client'; import { RevDataServer, RevSchemaField } from '../../common'; import { RevStandardElementCellEditor } from './standard-element-cell-editor'; /** @public */ export abstract class RevStandardInputElementCellEditor< BGS extends RevBehavioredGridSettings, BCS extends RevBehavioredColumnSettings, SF extends RevSchemaField > extends RevStandardElementCellEditor { keyDownEventer: RevCellEditor.KeyDownEventer; declare protected readonly _element: HTMLInputElement; constructor(grid: RevClientGrid, dataServer: RevDataServer, inputType: string) { const element = document.createElement('input'); super(grid, dataServer, element); element.type = inputType; element.style.borderStyle = 'none'; element.style.padding = '0'; element.classList.add('revgrid-input-editor'); } override setReadonly(value: boolean) { super.setReadonly(value); this._element.readOnly = value; } override tryOpenCell(viewCell: RevViewCell, openingKeyDownEvent: KeyboardEvent | undefined, openingClickEvent: MouseEvent | undefined) { const result = super.tryOpenCell(viewCell, openingKeyDownEvent, openingClickEvent); if (result) { this._element.addEventListener('keydown', this.keyDownEventer); } return result; } override closeCell(field: SF, dataServerRowIndex: number, cancel: boolean) { this._element.removeEventListener('keydown', this.keyDownEventer); super.closeCell(field, dataServerRowIndex, cancel); } override processGridKeyDownEvent(event: KeyboardEvent, fromEditor: boolean, _schemaColumn: SF, _dataServerRowIndex: number) { if (fromEditor) { // Event was emitted by this editor. Any key it can consume has effectively already been consumed return this.canConsumeKey(event.key); } else { // Cannot dispatch an event from another element to an input element return false; } } selectAll() { this._element.setSelectionRange(0, this._element.value.length); } private canConsumeKey(key: string) { switch (key as RevFocus.ActionKeyboardKey) { case RevFocus.ActionKeyboardKey.arrowUp: case RevFocus.ActionKeyboardKey.arrowDown: case RevFocus.ActionKeyboardKey.pageUp: case RevFocus.ActionKeyboardKey.pageDown: case RevFocus.ActionKeyboardKey.tab: case RevFocus.ActionKeyboardKey.enter: case RevFocus.ActionKeyboardKey.escape: return false; default: return true; } } }