ag-grid
Version:
Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components
258 lines (226 loc) • 9.92 kB
text/typescript
import {TextCellEditor} from "../../rendering/cellEditors/textCellEditor";
import {Autowired, Bean, PostConstruct} from "../../context/context";
import {IComponent} from "../../interfaces/iComponent";
import {DateFilter, DefaultDateComponent} from "../../filter/dateFilter";
import {HeaderComp} from "../../headerRendering/header/headerComp";
import {HeaderGroupComp} from "../../headerRendering/headerGroup/headerGroupComp";
import {
DateFloatingFilterComp,
NumberFloatingFilterComp,
SetFloatingFilterComp,
TextFloatingFilterComp
} from "../../filter/floatingFilter";
import {ComponentType} from "./componentResolver";
import {GroupCellRenderer} from "../../rendering/cellRenderers/groupCellRenderer";
import {AnimateShowChangeCellRenderer} from "../../rendering/cellRenderers/animateShowChangeCellRenderer";
import {AnimateSlideCellRenderer} from "../../rendering/cellRenderers/animateSlideCellRenderer";
import {LoadingCellRenderer} from "../../rendering/rowComp";
import {SelectCellEditor} from "../../rendering/cellEditors/selectCellEditor";
import {PopupTextCellEditor} from "../../rendering/cellEditors/popupTextCellEditor";
import {PopupSelectCellEditor} from "../../rendering/cellEditors/popupSelectCellEditor";
import {LargeTextCellEditor} from "../../rendering/cellEditors/largeTextCellEditor";
import {TextFilter} from "../../filter/textFilter";
import {NumberFilter} from "../../filter/numberFilter";
import {LoadingOverlayComponent} from "../../rendering/overlays/loadingOverlayComponent";
import {NoRowsOverlayComponent} from "../../rendering/overlays/noRowsOverlayComponent";
import {GridOptions} from "../../entities/gridOptions";
import {_} from "../../utils";
export enum RegisteredComponentSource {
DEFAULT, REGISTERED
}
/**
* B the business interface (ie IHeader)
* A the agGridComponent interface (ie IHeaderComp). The final object acceptable by ag-grid
*/
export interface RegisteredComponent<A extends IComponent<any> & B, B> {
component: RegisteredComponentInput<A, B>,
type: ComponentType,
source: RegisteredComponentSource
}
export type RegisteredComponentInput<A extends IComponent<any> & B, B> =
AgGridRegisteredComponentInput<A>
| { new(): B };
export type AgGridRegisteredComponentInput<A extends IComponent<any>> = AgGridComponentFunctionInput | { new(): A }
export type AgGridComponentFunctionInput = (params: any) => string | HTMLElement ;
export interface DeprecatedComponentName {
propertyHolder: string,
newComponentName: string
}
('componentProvider')
export class ComponentProvider {
('gridOptions')
private gridOptions: GridOptions;
private agGridDefaults: { [key: string]: AgGridRegisteredComponentInput<any> } = {
//date
agDateInput: DefaultDateComponent,
//header
agColumnHeader: HeaderComp,
agColumnGroupHeader: HeaderGroupComp,
//floating filters
agSetColumnFloatingFilter: SetFloatingFilterComp,
agTextColumnFloatingFilter: TextFloatingFilterComp,
agNumberColumnFloatingFilter: NumberFloatingFilterComp,
agDateColumnFloatingFilter: DateFloatingFilterComp,
// renderers
agAnimateShowChangeCellRenderer: AnimateShowChangeCellRenderer,
agAnimateSlideCellRenderer: AnimateSlideCellRenderer,
agGroupCellRenderer: GroupCellRenderer,
agGroupRowRenderer: GroupCellRenderer,
agLoadingCellRenderer: LoadingCellRenderer,
//editors
agCellEditor: TextCellEditor,
agTextCellEditor: TextCellEditor,
agSelectCellEditor: SelectCellEditor,
agPopupTextCellEditor: PopupTextCellEditor,
agPopupSelectCellEditor: PopupSelectCellEditor,
agLargeTextCellEditor: LargeTextCellEditor,
//filter
agTextColumnFilter: TextFilter,
agNumberColumnFilter: NumberFilter,
agDateColumnFilter: DateFilter,
//overlays
agLoadingOverlay: LoadingOverlayComponent,
agNoRowsOverlay: NoRowsOverlayComponent
};
private agDeprecatedNames: { [key: string]: DeprecatedComponentName } = {
set: {
newComponentName: 'agSetColumnFilter',
propertyHolder: 'filter'
},
text: {
newComponentName: 'agTextColumnFilter',
propertyHolder: 'filter'
},
number: {
newComponentName: 'agNumberColumnFilter',
propertyHolder: 'filter'
},
date: {
newComponentName: 'agDateColumnFilter',
propertyHolder: 'filter'
},
group: {
newComponentName: 'agGroupCellRenderer',
propertyHolder: 'cellRenderer'
},
animateShowChange: {
newComponentName: 'agAnimateShowChangeCellRenderer',
propertyHolder: 'cellRenderer'
},
animateSlide: {
newComponentName: 'agAnimateSlideCellRenderer',
propertyHolder: 'cellRenderer'
},
select: {
newComponentName: 'agSelectCellEditor',
propertyHolder: 'cellEditor'
},
largeText: {
newComponentName: 'agLargeTextCellEditor',
propertyHolder: 'cellEditor'
},
popupSelect: {
newComponentName: 'agPopupSelectCellEditor',
propertyHolder: 'cellEditor'
},
popupText: {
newComponentName: 'agPopupTextCellEditor',
propertyHolder: 'cellEditor'
},
richSelect: {
newComponentName: 'agRichSelectCellEditor',
propertyHolder: 'cellEditor'
},
headerComponent: {
newComponentName: 'agColumnHeader',
propertyHolder: 'headerComponent'
}
};
private jsComponents: { [key: string]: AgGridRegisteredComponentInput<any> } = {};
private frameworkComponents: { [key: string]: { new(): any } } = {};
private init(): void {
if (this.gridOptions.components != null) {
Object.keys(this.gridOptions.components).forEach(it => {
this.registerComponent(it, this.gridOptions.components[it]);
});
}
if (this.gridOptions.frameworkComponents != null) {
Object.keys(this.gridOptions.frameworkComponents).forEach(it => {
this.registerFwComponent(it, this.gridOptions.frameworkComponents[it]);
});
}
}
public registerDefaultComponent<A extends IComponent<any>>(rawName: string, component: AgGridRegisteredComponentInput<A>, overridable: boolean = true) {
let name: string = this.translateIfDeprecated(rawName);
if (this.agGridDefaults[name]) {
console.error(`Trying to overwrite a default component. You should call registerComponent`);
return;
}
this.agGridDefaults[name] = component;
}
public registerComponent<A extends IComponent<any>>(rawName: string, component: AgGridRegisteredComponentInput<A>) {
let name: string = this.translateIfDeprecated(rawName);
if (this.frameworkComponents[name]) {
console.error(`Trying to register a component that you have already registered for frameworks: ${name}`);
return;
}
this.jsComponents[name] = component;
}
/**
* B the business interface (ie IHeader)
* A the agGridComponent interface (ie IHeaderComp). The final object acceptable by ag-grid
*/
public registerFwComponent<A extends IComponent<any> & B, B>(rawName: string, component: { new(): IComponent<B> }) {
let name: string = this.translateIfDeprecated(rawName);
if (this.jsComponents[name]) {
console.error(`Trying to register a component that you have already registered for plain javascript: ${name}`);
return;
}
this.frameworkComponents[name] = component;
}
/**
* B the business interface (ie IHeader)
* A the agGridComponent interface (ie IHeaderComp). The final object acceptable by ag-grid
*/
public retrieve<A extends IComponent<any> & B, B>(rawName: string): RegisteredComponent<A, B> {
let name: string = this.translateIfDeprecated(rawName);
if (this.frameworkComponents[name]) {
return {
type: ComponentType.FRAMEWORK,
component: <{ new(): B }>this.frameworkComponents[name],
source: RegisteredComponentSource.REGISTERED
};
}
if (this.jsComponents[name]) {
return {
type: ComponentType.AG_GRID,
component: <{ new(): A }>this.jsComponents[name],
source: RegisteredComponentSource.REGISTERED
};
}
if (this.agGridDefaults[name]) {
return this.agGridDefaults[name] ?
{
type: ComponentType.AG_GRID,
component: <{ new(): A }>this.agGridDefaults[name],
source: RegisteredComponentSource.DEFAULT
} :
null
}
if (Object.keys(this.agGridDefaults).indexOf(name) < 0) {
console.warn(`ag-grid: Looking for component [${name}] but it wasn't found.`);
}
return null;
}
private translateIfDeprecated(raw: string): string {
let deprecatedInfo: DeprecatedComponentName = this.agDeprecatedNames[raw];
if (deprecatedInfo != null) {
_.doOnce(() => {
console.warn(`ag-grid. Since v15.0 component names have been renamed to be namespaced. You should rename ${deprecatedInfo.propertyHolder}:${raw} to ${deprecatedInfo.propertyHolder}:${deprecatedInfo.newComponentName}`);
}, 'DEPREACTE_COMPONENT_' + raw);
return deprecatedInfo.newComponentName;
}
return raw;
}
}