@catull/igniteui-angular
Version:
Ignite UI for Angular is a dependency-free Angular toolkit for building modern web apps
1,037 lines • 108 kB
JavaScript
import { __decorate, __metadata } from "tslib";
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, HostBinding, HostListener, Input, TemplateRef, ViewChild, NgZone, OnInit, OnDestroy, OnChanges, SimpleChanges } from '@angular/core';
import { IgxTextHighlightDirective } from '../directives/text-highlight/text-highlight.directive';
import { GridBaseAPIService } from './api.service';
import { getNodeSizeViaRange, ROW_COLLAPSE_KEYS, ROW_EXPAND_KEYS, SUPPORTED_KEYS, NAVIGATION_KEYS, isIE, isLeftClick, PlatformUtil } from '../core/utils';
import { IgxGridSelectionService, ISelectionNode, IgxGridCRUDService } from './selection/selection.service';
import { DeprecateProperty, DeprecateMethod } from '../core/deprecateDecorators';
import { HammerGesturesManager } from '../core/touch';
import { GridSelectionMode } from './common/enums';
/**
* Providing reference to `IgxGridCellComponent`:
* ```typescript
* @ViewChild('grid', { read: IgxGridComponent })
* public grid: IgxGridComponent;
* ```
* ```typescript
* let column = this.grid.columnList.first;
* ```
* ```typescript
* let cell = column.cells[0];
* ```
*/
let IgxGridCellComponent = class IgxGridCellComponent {
constructor(selectionService, crudService, gridAPI, cdr, element, zone, touchManager, platformUtil) {
this.selectionService = selectionService;
this.crudService = crudService;
this.gridAPI = gridAPI;
this.cdr = cdr;
this.element = element;
this.zone = zone;
this.touchManager = touchManager;
this.platformUtil = platformUtil;
this._vIndex = -1;
/**
* Sets/gets the highlight class of the cell.
* Default value is `"igx-highlight"`.
* ```typescript
* let highlightClass = this.cell.highlightClass;
* ```
* ```typescript
* this.cell.highlightClass = 'igx-cell-highlight';
* ```
* @memberof IgxGridCellComponent
*/
this.highlightClass = 'igx-highlight';
/**
* Sets/gets the active highlight class class of the cell.
* Default value is `"igx-highlight__active"`.
* ```typescript
* let activeHighlightClass = this.cell.activeHighlightClass;
* ```
* ```typescript
* this.cell.activeHighlightClass = 'igx-cell-highlight_active';
* ```
* @memberof IgxGridCellComponent
*/
this.activeHighlightClass = 'igx-highlight__active';
/**
* @hidden
* @internal
*/
this.lastPinned = false;
/**
* Returns whether the cell is in edit mode.
*/
this.editMode = false;
/**
* Sets/get the `tabindex` property of the cell.
* Default value is `0`.
* ```typescript
* this.cell.tabindex = 1;
* ```
* ```typescript
* let cellTabIndex = this.cell.tabindex;
* ```
* @memberof IgxGridCellComponent
*/
this.tabindex = 0;
/**
* Sets/get the `role` property of the cell.
* Default value is `"gridcell"`.
* ```typescript
* this.cell.role = 'grid-cell';
* ```
* ```typescript
* let cellRole = this.cell.role;
* ```
* @memberof IgxGridCellComponent
*/
this.role = 'gridcell';
/**
* Gets the width of the cell.
* ```typescript
* let cellWidth = this.cell.width;
* ```
* @memberof IgxGridCellComponent
*/
this.width = '';
/**
* @hidden
* @internal
*/
this.focused = false;
this.isInCompositionMode = false;
this._cellSelection = GridSelectionMode.multiple;
/**
*
* @hidden
* @internal
*/
this.pointerdown = (event) => {
if (!isLeftClick(event)) {
this.selectionService.addKeyboardRange();
this.selectionService.initKeyboardState();
this.selectionService.primaryButton = false;
return;
}
this.selectionService.pointerDown(this.selectionNode, event.shiftKey, event.ctrlKey);
};
/**
*
* @hidden
* @internal
*/
this.pointerenter = (event) => {
const dragMode = this.selectionService.pointerEnter(this.selectionNode, event);
if (dragMode) {
this.grid.cdr.detectChanges();
}
};
/**
* @hidden
* @internal
*/
this.pointerup = (event) => {
if (this.grid.hasColumnLayouts) {
this.grid.navigation.setStartNavigationCell(this.colStart, this.rowStart, null);
}
if (!isLeftClick(event)) {
return;
}
if (this.selectionService.pointerUp(this.selectionNode, this.grid.onRangeSelection)) {
this.grid.cdr.detectChanges();
}
this._updateCRUDStatus();
};
/**
* @hidden
* @internal
*/
this.onDoubleClick = (event) => {
if (event.type === 'doubletap') {
// prevent double-tap to zoom on iOS
event.preventDefault();
}
if (this.editable && !this.editMode && !this.row.deleted) {
this.crudService.begin(this);
}
this.grid.onDoubleClick.emit({
cell: this,
event
});
};
}
/**
* Gets the cell template context object.
* ```typescript
* let context = this.cell.context();
* ```
* @memberof IgxGridCellComponent
*/
get context() {
return {
$implicit: this.value,
cell: this
};
}
/**
* Gets the cell template.
* ```typescript
* let template = this.cell.template;
* ```
* @memberof IgxGridCellComponent
*/
get template() {
if (this.editMode) {
const inlineEditorTemplate = this.column.inlineEditorTemplate;
return inlineEditorTemplate ? inlineEditorTemplate : this.inlineEditorTemplate;
}
if (this.cellTemplate) {
return this.cellTemplate;
}
return this.defaultCellTemplate;
}
/**
* Gets the `id` of the grid in which the cell is stored.
* ```typescript
* let gridId = this.cell.gridID;
* ```
* @memberof IgxGridCellComponent
*/
get gridID() {
return this.row.gridID;
}
/**
* Gets the grid of the cell.
* ```typescript
* let grid = this.cell.grid;
* ```
* @memberof IgxGridCellComponent
*/
get grid() {
return this.gridAPI.grid;
}
/**
* Gets the `index` of the row where the cell is stored.
* ```typescript
* let rowIndex = this.cell.rowIndex;
* ```
* @memberof IgxGridCellComponent
*/
get rowIndex() {
return this.row.index;
}
/**
* Gets the `index` of the cell column.
* ```typescript
* let columnIndex = this.cell.columnIndex;
* ```
* @memberof IgxGridCellComponent
*/
get columnIndex() {
return this.column.index;
}
/**
* Gets the visible `index` of the in which the cell is stored.
* ```typescript
* let visibleColumnIndex = this.cell.visibleColumnIndex;
* ```
* @memberof IgxGridCellComponent
*/
get visibleColumnIndex() {
return this.column.columnLayoutChild ? this.column.visibleIndex : this._vIndex;
}
set visibleColumnIndex(val) {
this._vIndex = val;
}
/**
* Gets the ID of the cell.
* ```typescript
* let cellID = this.cell.cellID;
* ```
* @memberof IgxGridCellComponent
*/
get cellID() {
const primaryKey = this.grid.primaryKey;
const rowID = primaryKey ? this.rowData[primaryKey] : this.rowData;
return { rowID, columnID: this.columnIndex, rowIndex: this.rowIndex };
}
/**
* Returns a reference to the nativeElement of the cell.
* ```typescript
* let cellNativeElement = this.cell.nativeElement;
* ```
* @memberof IgxGridCellComponent
*/
get nativeElement() {
return this.element.nativeElement;
}
/**
* @deprecated
* Use `cell.editMode` as a getter and
* `cell.setEditMode(true | false)` to start/exit edit mode.
*
* Gets/sets whether the cell is in edit mode.
* ```typescript
* let isCellInEditMode = this.cell.inEditMode;
* ```
* @memberof IgxGridCellComponent
*/
get inEditMode() {
return this.editMode;
}
set inEditMode(value) {
this.setEditMode(value);
}
/**
* @hidden
* @internal
*/
get cellSelectionMode() {
return this._cellSelection;
}
set cellSelectionMode(value) {
if (this._cellSelection === value) {
return;
}
this.zone.runOutsideAngular(() => {
value === GridSelectionMode.multiple ?
this.addPointerListeners(value) : this.removePointerListeners(this._cellSelection);
});
this._cellSelection = value;
}
/**
* Gets whether the cell is editable.
* ```typescript
* let isCellReadonly = this.cell.readonly;
* ```
* @memberof IgxGridCellComponent
*/
get readonly() {
return !this.column.editable;
}
get gridRowSpan() {
return this.column.gridRowSpan;
}
get gridColumnSpan() {
return this.column.gridColumnSpan;
}
get rowEnd() {
return this.column.rowEnd;
}
get colEnd() {
return this.column.colEnd;
}
get rowStart() {
return this.column.rowStart;
}
get colStart() {
return this.column.colStart;
}
/**
* Returns a string containing the grid `id` and the column `field` concatenated by "_".
* ```typescript
* let describedBy = this.cell.describedBy;
* ```
* @memberof IgxGridCellComponent
*/
get describedby() {
return `${this.row.gridID}_${this.column.field}`;
}
/**
* Gets whether the cell is selected.
* ```typescript
* let isSelected = this.cell.selected;
* ```
* @memberof IgxGridCellComponent
*/
get selected() {
return this.selectionService.selected(this.selectionNode);
}
/**
* Selects/deselects the cell.
* ```typescript
* this.cell.selected = true.
* ```
* @memberof IgxGridCellComponent
*/
set selected(val) {
const node = this.selectionNode;
val ? this.selectionService.add(node) : this.selectionService.remove(node);
this.grid.notifyChanges();
}
get dirty() {
if (this.grid.rowEditable) {
const rowCurrentState = this.grid.transactions.getAggregatedValue(this.row.rowID, false);
if (rowCurrentState) {
return rowCurrentState[this.column.field] !== undefined && rowCurrentState[this.column.field] !== null;
}
}
else {
const rowTransaction = this.grid.transactions.getState(this.row.rowID);
return rowTransaction && rowTransaction.value &&
(rowTransaction.value[this.column.field] ||
rowTransaction.value[this.column.field] === 0 ||
rowTransaction.value[this.column.field] === false);
}
return false;
}
/**
* Sets the current edit value while a cell is in edit mode.
* Only for cell editing mode.
* ```typescript
* this.cell.editValue = value;
* ```
* @memberof IgxGridCellComponent
*/
set editValue(value) {
if (this.crudService.inEditMode) {
this.crudService.cell.editValue = value;
}
}
/**
* Gets the current edit value while a cell is in edit mode.
* Only for cell editing mode.
* ```typescript
* let editValue = this.cell.editValue;
* ```
* @memberof IgxGridCellComponent
*/
get editValue() {
if (this.crudService.inEditMode) {
return this.crudService.cell.editValue;
}
}
/**
* Returns whether the cell is editable.
*/
get editable() {
return this.column.editable;
}
set highlight(value) {
this._highlight = value;
if (this._highlight && this.grid.lastSearchInfo.searchText) {
this._highlight.highlight(this.grid.lastSearchInfo.searchText, this.grid.lastSearchInfo.caseSensitive, this.grid.lastSearchInfo.exactMatch);
this._highlight.activateIfNecessary();
}
}
get highlight() {
return this._highlight;
}
get selectionNode() {
return {
row: this.rowIndex,
column: this.column.columnLayoutChild ? this.column.parent.visibleIndex : this.visibleColumnIndex,
layout: this.column.columnLayoutChild ? {
rowStart: this.column.rowStart,
colStart: this.column.colStart,
rowEnd: this.column.rowEnd,
colEnd: this.column.colEnd,
columnVisibleIndex: this.visibleColumnIndex
} : null
};
}
addPointerListeners(selection) {
if (selection !== GridSelectionMode.multiple) {
return;
}
this.nativeElement.addEventListener('pointerdown', this.pointerdown);
this.nativeElement.addEventListener('pointerenter', this.pointerenter);
this.nativeElement.addEventListener('pointerup', this.pointerup);
}
removePointerListeners(selection) {
if (selection !== GridSelectionMode.multiple) {
return;
}
this.nativeElement.removeEventListener('pointerdown', this.pointerdown);
this.nativeElement.removeEventListener('pointerenter', this.pointerenter);
this.nativeElement.removeEventListener('pointerup', this.pointerup);
}
/**
* @hidden
* @internal
*/
ngOnInit() {
this.zone.runOutsideAngular(() => {
this.addPointerListeners(this.cellSelectionMode);
// IE 11 workarounds
if (isIE()) {
this.compositionStartHandler = () => this.isInCompositionMode = true;
this.compositionEndHandler = () => this.isInCompositionMode = false;
// Hitting Enter with IME submits and exits from edit mode instead of first closing the IME dialog
this.nativeElement.addEventListener('compositionstart', this.compositionStartHandler);
this.nativeElement.addEventListener('compositionend', this.compositionEndHandler);
}
});
if (this.platformUtil.isIOS) {
this.touchManager.addEventListener(this.nativeElement, 'doubletap', this.onDoubleClick, {
cssProps: {} /* don't disable user-select, etc */
});
}
}
/**
* @hidden
* @internal
*/
ngOnDestroy() {
this.zone.runOutsideAngular(() => {
this.removePointerListeners(this.cellSelectionMode);
if (isIE()) {
this.nativeElement.removeEventListener('compositionstart', this.compositionStartHandler);
this.nativeElement.removeEventListener('compositionend', this.compositionEndHandler);
}
});
this.touchManager.destroy();
}
/**
* @hidden
* @internal
*/
_updateCRUDStatus() {
if (this.editMode) {
return;
}
const crud = this.crudService;
const editableCell = this.crudService.cell;
const editMode = !!(crud.row || crud.cell);
if (this.editable && editMode && !this.row.deleted) {
if (editableCell) {
this.gridAPI.update_cell(editableCell, editableCell.editValue);
}
crud.end();
this.grid.notifyChanges();
crud.begin(this);
return;
}
if (editableCell && crud.sameRow(this.cellID.rowID)) {
this.gridAPI.submit_value();
}
else if (editMode && !crud.sameRow(this.cellID.rowID)) {
this.grid.endEdit(true);
}
}
/**
* @deprecated
* Gets whether the cell is selected.
* ```typescript
* let isCellSelected = thid.cell.isCellSelected();
* ```
* @memberof IgxGridCellComponent
*/
isCellSelected() {
return this.selectionService.selected(this.selectionNode);
}
/**
* @hidden
* @internal
*/
ngOnChanges(changes) {
if (changes.value && !changes.value.firstChange) {
if (this.highlight) {
this.highlight.lastSearchInfo.searchedText = this.grid.lastSearchInfo.searchText;
this.highlight.lastSearchInfo.caseSensitive = this.grid.lastSearchInfo.caseSensitive;
this.highlight.lastSearchInfo.exactMatch = this.grid.lastSearchInfo.exactMatch;
}
}
}
/**
* Starts/ends edit mode for the cell.
*
* ```typescript
* cell.setEditMode(true);
* ```
*/
setEditMode(value) {
if (this.row.deleted) {
return;
}
if (this.editable && value) {
this.gridAPI.submit_value();
this.crudService.begin(this);
}
else {
this.gridAPI.escape_editMode();
}
this.grid.notifyChanges();
}
/**
* Sets new value to the cell.
* ```typescript
* this.cell.update('New Value');
* ```
* @memberof IgxGridCellComponent
*/
// TODO: Refactor
update(val) {
if (this.row.deleted) {
return;
}
const cell = this.crudService.createCell(this);
const args = this.gridAPI.update_cell(cell, val);
if (this.crudService.cell && this.crudService.sameCell(cell)) {
if (args.cancel) {
return;
}
this.gridAPI.escape_editMode();
}
this.cdr.markForCheck();
}
/**
* @hidden
* @internal
*/
onClick(event) {
this.grid.onCellClick.emit({
cell: this,
event
});
}
/**
* @hidden
* @internal
*/
onContextMenu(event) {
this.grid.onContextMenu.emit({
cell: this,
event
});
}
/**
* @hidden
* @internal
*/
onFocus(event) {
if (this.focused) {
return;
}
this.focused = true;
this.row.focused = true;
const node = this.selectionNode;
const shouldEmitSelection = !this.selectionService.isActiveNode(node);
if (this.selectionService.primaryButton) {
this._updateCRUDStatus();
this.selectionService.activeElement = node;
}
else {
this.selectionService.activeElement = null;
if (this.crudService.inEditMode && !this.editMode) {
this.gridAPI.submit_value();
}
}
this.selectionService.primaryButton = true;
if (this.cellSelectionMode === GridSelectionMode.multiple && this.selectionService.activeElement) {
this.selectionService.add(this.selectionService.activeElement, false); // pointer events handle range generation
this.selectionService.keyboardStateOnFocus(node, this.grid.onRangeSelection, this.nativeElement);
}
if (this.grid.isCellSelectable && shouldEmitSelection) {
this.grid.onSelection.emit({ cell: this, event });
}
}
/**
* @hidden
* @internal
*/
onBlur() {
this.focused = false;
this.row.focused = false;
}
handleAlt(key, event) {
if (this.row.nativeElement.tagName.toLowerCase() === 'igx-tree-grid-row' && this.isToggleKey(key)) {
const collapse = this.row.expanded && ROW_COLLAPSE_KEYS.has(key);
const expand = !this.row.expanded && ROW_EXPAND_KEYS.has(key);
if (collapse) {
this.gridAPI.trigger_row_expansion_toggle(this.row.treeRow, !this.row.expanded, event, this.visibleColumnIndex);
}
else if (expand) {
this.gridAPI.trigger_row_expansion_toggle(this.row.treeRow, !this.row.expanded, event, this.visibleColumnIndex);
}
}
else if (this.grid.hasDetails && this.isToggleKey(key)) {
const collapse = this.row.expanded && ROW_COLLAPSE_KEYS.has(key);
const expand = !this.row.expanded && ROW_EXPAND_KEYS.has(key);
const expandedStates = this.grid.expansionStates;
if (expand) {
expandedStates.set(this.row.rowID, true);
}
else if (collapse) {
expandedStates.set(this.row.rowID, false);
}
this.grid.expansionStates = expandedStates;
this.grid.notifyChanges();
}
}
handleTab(shift) {
if (shift) {
this.grid.navigation.performShiftTabKey(this.row.nativeElement, this.selectionNode);
}
else {
this.grid.navigation.performTab(this.row.nativeElement, this.selectionNode);
}
}
handleEnd(ctrl) {
if (ctrl) {
this.grid.navigation.goToLastCell();
}
else {
this.grid.navigation.onKeydownEnd(this.rowIndex, false, this.rowStart);
}
}
handleHome(ctrl) {
if (ctrl) {
this.grid.navigation.goToFirstCell();
}
else {
this.grid.navigation.onKeydownHome(this.rowIndex, false, this.rowStart);
}
}
// TODO: Refactor
/**
*
* @hidden
* @internal
*/
dispatchEvent(event) {
const key = event.key.toLowerCase();
const shift = event.shiftKey;
const ctrl = event.ctrlKey;
const node = this.selectionNode;
if (!SUPPORTED_KEYS.has(key)) {
return;
}
event.stopPropagation();
const keydownArgs = { targetType: 'dataCell', target: this, event: event, cancel: false };
this.grid.onGridKeydown.emit(keydownArgs);
if (keydownArgs.cancel) {
this.selectionService.clear();
this.selectionService.keyboardState.active = true;
return;
}
if (event.altKey) {
event.preventDefault();
this.handleAlt(key, event);
return;
}
this.selectionService.keyboardStateOnKeydown(node, shift, shift && key === 'tab');
if (key === 'tab') {
event.preventDefault();
}
if (this.editMode) {
if (NAVIGATION_KEYS.has(key)) {
if (this.column.inlineEditorTemplate) {
return;
}
if (['date', 'boolean'].indexOf(this.column.dataType) > -1) {
return;
}
return;
}
}
if (NAVIGATION_KEYS.has(key)) {
event.preventDefault();
}
switch (key) {
case 'tab':
this.handleTab(shift);
break;
case 'end':
this.handleEnd(ctrl);
break;
case 'home':
this.handleHome(ctrl);
break;
case 'arrowleft':
case 'left':
if (ctrl) {
this.grid.navigation.onKeydownHome(node.row, false, this.rowStart);
break;
}
this.grid.navigation.onKeydownArrowLeft(this.nativeElement, this.selectionNode);
break;
case 'arrowright':
case 'right':
if (ctrl) {
this.grid.navigation.onKeydownEnd(node.row, false, this.rowStart);
break;
}
this.grid.navigation.onKeydownArrowRight(this.nativeElement, this.selectionNode);
break;
case 'arrowup':
case 'up':
if (ctrl) {
this.grid.navigation.navigateTop(this.visibleColumnIndex);
break;
}
this.grid.navigation.navigateUp(this.row.nativeElement, this.selectionNode);
break;
case 'arrowdown':
case 'down':
if (ctrl) {
this.grid.navigation.navigateBottom(this.visibleColumnIndex);
break;
}
this.grid.navigation.navigateDown(this.row.nativeElement, this.selectionNode);
break;
case 'enter':
case 'f2':
this.onKeydownEnterEditMode();
break;
case 'escape':
case 'esc':
this.onKeydownExitEditMode();
break;
case ' ':
case 'spacebar':
case 'space':
if (this.grid.isRowSelectable) {
this.row.selected ? this.selectionService.deselectRow(this.row.rowID, event) :
this.selectionService.selectRowById(this.row.rowID, false, event);
}
break;
default:
return;
}
}
/**
* @hidden
* @internal
*/
onKeydownEnterEditMode() {
if (this.isInCompositionMode) {
return;
}
if (this.column.editable && !this.row.deleted) {
if (this.editMode) {
this.grid.endEdit(true);
this.nativeElement.focus();
}
else {
this.crudService.begin(this);
}
}
}
/**
* @hidden
* @internal
*/
onKeydownExitEditMode() {
if (this.isInCompositionMode) {
return;
}
if (this.editMode) {
const args = this.crudService.cell.createEditEventArgs();
this.grid.onCellEditCancel.emit(args);
if (args.cancel) {
return;
}
this.grid.endEdit(false);
this.nativeElement.focus();
}
}
/**
* If the provided string matches the text in the cell, the text gets highlighted.
* ```typescript
* this.cell.highlightText('Cell Value', true);
* ```
* @memberof IgxGridCellComponent
*/
highlightText(text, caseSensitive, exactMatch) {
return this.highlight && this.column.searchable ? this.highlight.highlight(text, caseSensitive, exactMatch) : 0;
}
/**
* Clears the highlight of the text in the cell.
* ```typescript
* this.cell.clearHighLight();
* ```
* @memberof IgxGridCellComponent
*/
clearHighlight() {
if (this.highlight && this.column.searchable) {
this.highlight.clearHighlight();
}
}
/**
* @hidden
* @internal
*/
calculateSizeToFit(range) {
return Math.max(...Array.from(this.nativeElement.children)
.map((child) => getNodeSizeViaRange(range, child)));
}
isToggleKey(key) {
return ROW_COLLAPSE_KEYS.has(key) || ROW_EXPAND_KEYS.has(key);
}
};
IgxGridCellComponent.ctorParameters = () => [
{ type: IgxGridSelectionService },
{ type: IgxGridCRUDService },
{ type: GridBaseAPIService },
{ type: ChangeDetectorRef },
{ type: ElementRef },
{ type: NgZone },
{ type: HammerGesturesManager },
{ type: PlatformUtil }
];
__decorate([
Input(),
__metadata("design:type", Object)
], IgxGridCellComponent.prototype, "column", void 0);
__decorate([
Input(),
__metadata("design:type", Object)
], IgxGridCellComponent.prototype, "row", void 0);
__decorate([
Input(),
__metadata("design:type", Object)
], IgxGridCellComponent.prototype, "rowData", void 0);
__decorate([
Input(),
__metadata("design:type", TemplateRef)
], IgxGridCellComponent.prototype, "cellTemplate", void 0);
__decorate([
Input(),
__metadata("design:type", Object)
], IgxGridCellComponent.prototype, "value", void 0);
__decorate([
Input(),
__metadata("design:type", Function)
], IgxGridCellComponent.prototype, "formatter", void 0);
__decorate([
HostBinding('attr.data-rowIndex'),
__metadata("design:type", Number),
__metadata("design:paramtypes", [])
], IgxGridCellComponent.prototype, "rowIndex", null);
__decorate([
HostBinding('attr.data-visibleIndex'),
Input(),
__metadata("design:type", Object),
__metadata("design:paramtypes", [Object])
], IgxGridCellComponent.prototype, "visibleColumnIndex", null);
__decorate([
DeprecateProperty(`'inEditMode' is deprecated\nUse 'editMode' to get the current state and 'setEditMode(boolean)' as a setter`),
__metadata("design:type", Boolean),
__metadata("design:paramtypes", [Boolean])
], IgxGridCellComponent.prototype, "inEditMode", null);
__decorate([
Input(),
__metadata("design:type", Object),
__metadata("design:paramtypes", [Object])
], IgxGridCellComponent.prototype, "cellSelectionMode", null);
__decorate([
Input(),
HostBinding('class.igx-grid__td--pinned-last'),
__metadata("design:type", Object)
], IgxGridCellComponent.prototype, "lastPinned", void 0);
__decorate([
Input(),
HostBinding('class.igx-grid__td--editing'),
__metadata("design:type", Object)
], IgxGridCellComponent.prototype, "editMode", void 0);
__decorate([
HostBinding('attr.tabindex'),
__metadata("design:type", Object)
], IgxGridCellComponent.prototype, "tabindex", void 0);
__decorate([
HostBinding('attr.role'),
__metadata("design:type", Object)
], IgxGridCellComponent.prototype, "role", void 0);
__decorate([
HostBinding('attr.aria-readonly'),
__metadata("design:type", Boolean),
__metadata("design:paramtypes", [])
], IgxGridCellComponent.prototype, "readonly", null);
__decorate([
HostBinding('attr.aria-describedby'),
__metadata("design:type", String),
__metadata("design:paramtypes", [])
], IgxGridCellComponent.prototype, "describedby", null);
__decorate([
Input(),
__metadata("design:type", Object)
], IgxGridCellComponent.prototype, "width", void 0);
__decorate([
HostBinding('attr.aria-selected'),
HostBinding('class.igx-grid__td--selected'),
__metadata("design:type", Boolean),
__metadata("design:paramtypes", [Boolean])
], IgxGridCellComponent.prototype, "selected", null);
__decorate([
HostBinding('class.igx-grid__td--edited'),
__metadata("design:type", Object),
__metadata("design:paramtypes", [])
], IgxGridCellComponent.prototype, "dirty", null);
__decorate([
HostBinding('class.igx-grid__td--active'),
__metadata("design:type", Object)
], IgxGridCellComponent.prototype, "focused", void 0);
__decorate([
ViewChild('defaultCell', { read: TemplateRef, static: true }),
__metadata("design:type", TemplateRef)
], IgxGridCellComponent.prototype, "defaultCellTemplate", void 0);
__decorate([
ViewChild('inlineEditor', { read: TemplateRef, static: true }),
__metadata("design:type", TemplateRef)
], IgxGridCellComponent.prototype, "inlineEditorTemplate", void 0);
__decorate([
ViewChild(IgxTextHighlightDirective, { read: IgxTextHighlightDirective }),
__metadata("design:type", IgxTextHighlightDirective),
__metadata("design:paramtypes", [IgxTextHighlightDirective])
], IgxGridCellComponent.prototype, "highlight", null);
__decorate([
DeprecateMethod(`'isCellSelected' is deprecated. Use 'selected' property instead.`),
__metadata("design:type", Function),
__metadata("design:paramtypes", []),
__metadata("design:returntype", void 0)
], IgxGridCellComponent.prototype, "isCellSelected", null);
__decorate([
HostListener('dblclick', ['$event']),
__metadata("design:type", Object)
], IgxGridCellComponent.prototype, "onDoubleClick", void 0);
__decorate([
HostListener('click', ['$event']),
__metadata("design:type", Function),
__metadata("design:paramtypes", [MouseEvent]),
__metadata("design:returntype", void 0)
], IgxGridCellComponent.prototype, "onClick", null);
__decorate([
HostListener('contextmenu', ['$event']),
__metadata("design:type", Function),
__metadata("design:paramtypes", [MouseEvent]),
__metadata("design:returntype", void 0)
], IgxGridCellComponent.prototype, "onContextMenu", null);
__decorate([
HostListener('focus', ['$event']),
__metadata("design:type", Function),
__metadata("design:paramtypes", [FocusEvent]),
__metadata("design:returntype", void 0)
], IgxGridCellComponent.prototype, "onFocus", null);
__decorate([
HostListener('blur'),
__metadata("design:type", Function),
__metadata("design:paramtypes", []),
__metadata("design:returntype", void 0)
], IgxGridCellComponent.prototype, "onBlur", null);
__decorate([
HostListener('keydown', ['$event']),
__metadata("design:type", Function),
__metadata("design:paramtypes", [KeyboardEvent]),
__metadata("design:returntype", void 0)
], IgxGridCellComponent.prototype, "dispatchEvent", null);
IgxGridCellComponent = __decorate([
Component({
changeDetection: ChangeDetectionStrategy.OnPush,
selector: 'igx-grid-cell',
template: "<ng-template #defaultCell>\n <div igxTextHighlight style=\"pointer-events: none\" [cssClass]=\"highlightClass\" [activeCssClass]=\"activeHighlightClass\" [groupName]=\"gridID\"\n [value]=\"formatter ? formatter(value) : column.dataType === 'number' ? (value | igxdecimal: grid.locale) : column.dataType === 'date' ? (value | igxdate: grid.locale) : value\"\n [row]=\"rowData\" [column]=\"this.column.field\" [containerClass]=\"'igx-grid__td-text'\"\n class=\"igx-grid__td-text\">{{ formatter ? formatter(value) : column.dataType === 'number' ? (value | igxdecimal:\n grid.locale) : column.dataType === 'date' ? (value | igxdate: grid.locale) : value }}</div>\n</ng-template>\n<ng-template #inlineEditor let-cell=\"cell\">\n <ng-container *ngIf=\"column.dataType === 'string'\">\n <igx-input-group displayDensity=\"compact\">\n <input igxInput [value]=\"editValue\" (input)=\"editValue = $event.target.value\" [igxFocus]=\"focused\" />\n </igx-input-group>\n </ng-container>\n <ng-container *ngIf=\"column.dataType === 'number'\">\n <igx-input-group displayDensity=\"compact\">\n <input igxInput [value]=\"editValue\" (input)=\"editValue = $event.target.value\" [igxFocus]=\"focused\" type=\"number\">\n </igx-input-group>\n </ng-container>\n <ng-container *ngIf=\"column.dataType === 'boolean'\">\n <igx-checkbox (change)=\"editValue = $event.checked\" [value]=\"editValue\" [checked]=\"editValue\"\n [igxFocus]=\"focused\" [disableRipple]=\"true\"></igx-checkbox>\n </ng-container>\n <ng-container *ngIf=\"column.dataType === 'date'\">\n <igx-date-picker [style.width.%]=\"100\" [outlet]=\"grid.outletDirective\" mode=\"dropdown\"\n [locale]=\"grid.locale\" [(value)]=\"editValue\" [igxFocus]=\"focused\" [labelVisibility]=\"false\">\n </igx-date-picker>\n </ng-container>\n</ng-template>\n<ng-container *ngTemplateOutlet=\"template; context: context\">\n</ng-container>\n",
providers: [HammerGesturesManager]
}),
__metadata("design:paramtypes", [IgxGridSelectionService,
IgxGridCRUDService,
GridBaseAPIService,
ChangeDetectorRef,
ElementRef,
NgZone,
HammerGesturesManager,
PlatformUtil])
], IgxGridCellComponent);
export { IgxGridCellComponent };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2VsbC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9pZ25pdGV1aS1hbmd1bGFyLyIsInNvdXJjZXMiOlsibGliL2dyaWRzL2NlbGwuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQ0gsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsVUFBVSxFQUNWLFdBQVcsRUFDWCxZQUFZLEVBQ1osS0FBSyxFQUNMLFdBQVcsRUFDWCxTQUFTLEVBQ1QsTUFBTSxFQUNOLE1BQU0sRUFDTixTQUFTLEVBQ1QsU0FBUyxFQUNULGFBQWEsRUFDaEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sdURBQXVELENBQUM7QUFDbEcsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFDSCxtQkFBbUIsRUFBRSxpQkFBaUIsRUFBRSxlQUFlLEVBQUUsY0FBYyxFQUFFLGVBQWUsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLFlBQVksRUFDNUgsTUFBTSxlQUFlLENBQUM7QUFHdkIsT0FBTyxFQUFFLHVCQUF1QixFQUFFLGNBQWMsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQzVHLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxlQUFlLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUNqRixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHdEQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFJbkQ7Ozs7Ozs7Ozs7OztHQVlHO0FBT0gsSUFBYSxvQkFBb0IsR0FBakMsTUFBYSxvQkFBb0I7SUE2ZTdCLFlBQ2MsZ0JBQXlDLEVBQ3pDLFdBQStCLEVBQ2xDLE9BQTRELEVBQzVELEdBQXNCLEVBQ3JCLE9BQW1CLEVBQ2pCLElBQVksRUFDZCxZQUFtQyxFQUNqQyxZQUEwQjtRQVAxQixx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