ag-grid
Version:
Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components
120 lines (99 loc) • 4.34 kB
text/typescript
import {Constants} from "../../constants";
import {Component} from "../../widgets/component";
import {ICellEditorComp, ICellEditorParams} from "./iCellEditor";
import {Utils as _} from '../../utils';
/**
* useFormatter: used when the cell value needs formatting prior to editing, such as when using reference data and you
* want to display text rather than code.
*/
export interface ITextCellEditorParams extends ICellEditorParams {
useFormatter: boolean;
}
export class TextCellEditor extends Component implements ICellEditorComp {
private static TEMPLATE = '<input class="ag-cell-edit-input" type="text"/>';
private highlightAllOnFocus: boolean;
private focusAfterAttached: boolean;
private params: ICellEditorParams;
constructor() {
super(TextCellEditor.TEMPLATE);
}
public init(params: ITextCellEditorParams): void {
this.params = params;
let eInput = <HTMLInputElement> this.getGui();
let startValue: string;
// cellStartedEdit is only false if we are doing fullRow editing
if (params.cellStartedEdit) {
this.focusAfterAttached = true;
let keyPressBackspaceOrDelete =
params.keyPress === Constants.KEY_BACKSPACE
|| params.keyPress === Constants.KEY_DELETE;
if (keyPressBackspaceOrDelete) {
startValue = '';
} else if (params.charPress) {
startValue = params.charPress;
} else {
startValue = this.getStartValue(params);
if (params.keyPress !== Constants.KEY_F2) {
this.highlightAllOnFocus = true;
}
}
} else {
this.focusAfterAttached = false;
startValue = this.getStartValue(params);
}
if (_.exists(startValue)) {
eInput.value = startValue;
}
this.addDestroyableEventListener(eInput, 'keydown', (event: KeyboardEvent)=> {
let isNavigationKey = event.keyCode===Constants.KEY_LEFT
|| event.keyCode===Constants.KEY_RIGHT
|| event.keyCode===Constants.KEY_UP
|| event.keyCode===Constants.KEY_DOWN
|| event.keyCode===Constants.KEY_PAGE_DOWN
|| event.keyCode===Constants.KEY_PAGE_UP
|| event.keyCode===Constants.KEY_PAGE_HOME
|| event.keyCode===Constants.KEY_PAGE_END;
if (isNavigationKey) {
// this stops the grid from executing keyboard navigation
event.stopPropagation();
// this stops the browser from scrolling up / down
let pageUp = event.keyCode===Constants.KEY_PAGE_UP;
let pageDown = event.keyCode===Constants.KEY_PAGE_DOWN;
if (pageUp || pageDown) {
event.preventDefault();
}
}
});
}
public afterGuiAttached(): void {
if (!this.focusAfterAttached) { return; }
let eInput = <HTMLInputElement> this.getGui();
eInput.focus();
if (this.highlightAllOnFocus) {
eInput.select();
} else {
// when we started editing, we want the carot at the end, not the start.
// this comes into play in two scenarios: a) when user hits F2 and b)
// when user hits a printable character, then on IE (and only IE) the carot
// was placed after the first character, thus 'apply' would end up as 'pplea'
let length = eInput.value ? eInput.value.length : 0;
if (length > 0) {
eInput.setSelectionRange(length,length);
}
}
}
// gets called when tabbing trough cells and in full row edit mode
public focusIn(): void {
let eInput = <HTMLInputElement> this.getGui();
eInput.focus();
eInput.select();
}
public getValue(): any {
let eInput = <HTMLInputElement> this.getGui();
return this.params.parseValue(eInput.value);
}
private getStartValue(params: ITextCellEditorParams) {
let formatValue = params.useFormatter || params.column.getColDef().refData;
return formatValue ? params.formatValue(params.value) : params.value;
}
}