ag-grid-enterprise
Version:
ag-Grid Enterprise Features
53 lines (42 loc) • 2.17 kB
text/typescript
import {_, Component, Utils, Autowired, CellRendererService, ICellRendererFunc, ICellRendererComp, ColDef, Promise} from "ag-grid-community";
export class RichSelectRow extends Component {
('cellRendererService') cellRendererService: CellRendererService;
private columnDef: ColDef;
constructor(columnDef: ColDef) {
super('<div class="ag-rich-select-row"></div>');
this.columnDef = columnDef;
}
public setState(value: any, valueFormatted: string, selected: boolean): void {
let rendererSuccessful = this.populateWithRenderer(value, valueFormatted);
if (!rendererSuccessful) {
this.populateWithoutRenderer(value, valueFormatted);
}
Utils.addOrRemoveCssClass(this.getGui(), 'ag-rich-select-row-selected', selected);
}
private populateWithoutRenderer(value: any, valueFormatted: string) {
let valueFormattedExits = valueFormatted !== null && valueFormatted !== undefined;
let valueToRender = valueFormattedExits ? valueFormatted : value;
if (Utils.exists(valueToRender) && valueToRender !== '') {
// not using innerHTML to prevent injection of HTML
// https://developer.mozilla.org/en-US/docs/Web/API/Element/innerHTML#Security_considerations
this.getGui().textContent = valueToRender.toString();
} else {
// putting in blank, so if missing, at least the user can click on it
this.getGui().innerHTML = ' ';
}
}
private populateWithRenderer(value: any, valueFormatted: string): boolean {
let promise:Promise<ICellRendererComp> = this.cellRendererService.useRichSelectCellRenderer(this.columnDef, this.getGui(), {value: value, valueFormatted: valueFormatted});
let foundRenderer = _.exists(promise);
if (foundRenderer) {
promise.then(childComponent => {
if (childComponent && childComponent.destroy) {
this.addDestroyFunc(childComponent.destroy.bind(childComponent));
}
});
return true;
} else {
return false;
}
}
}