ag-grid
Version:
Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components
265 lines (231 loc) • 10.3 kB
text/typescript
import {TextCellEditor} from "../../rendering/cellEditors/textCellEditor";
import {Autowired, Bean, Context, PostConstruct, PreConstruct} 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 {OverlayWrapperComponent} from "../../rendering/overlays/overlayWrapperComponent";
import {LoadingOverlayComponent} from "../../rendering/overlays/loadingOverlayComponent";
import {NoRowsOverlayComponent} from "../../rendering/overlays/noRowsOverlayComponent";
import {GridOptions} from "../../entities/gridOptions";
import {_} from "../../utils";
import {TestingSandbox} from "../../widgets/testingSandbox";
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;
('context')
private context: Context;
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,
// a text component Niall is working on, for some PoC work
agTestingSandbox: TestingSandbox,
//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{
let componentProvider: ComponentProvider = this.context.getBean('componentProvider');
if (this.gridOptions.components != null) {
Object.keys(this.gridOptions.components).forEach(it=>{
componentProvider.registerComponent(it, this.gridOptions.components[it]);
});
}
if (this.gridOptions.frameworkComponents != null) {
Object.keys(this.gridOptions.frameworkComponents).forEach(it=>{
componentProvider.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;
}
}