import {Autowired, Bean} from "../../context/context"; import {IDateComp, IDateParams} from "../../rendering/dateComponent"; import {GridOptions} from "../../entities/gridOptions"; import {IAfterGuiAttachedParams, IComponent} from "../../interfaces/iComponent"; import {ColDef} from "../../entities/colDef"; import {IHeaderGroupComp, IHeaderGroupParams} from "../../headerRendering/headerGroup/headerGroupComp"; import {IHeaderComp, IHeaderParams} from "../../headerRendering/header/headerComp"; import {IFloatingFilterComp, IFloatingFilterParams} from "../../filter/floatingFilter"; import {GridOptionsWrapper} from "../../gridOptionsWrapper"; import {IFloatingFilterWrapperComp, IFloatingFilterWrapperParams} from "../../filter/floatingFilterWrapper"; import {Column} from "../../entities/column"; import {IFilterComp} from "../../interfaces/iFilter"; import {FilterManager} from "../../filter/filterManager"; import {ComponentResolver} from "./componentResolver"; import {ICellRendererComp, ICellRendererParams} from "../../rendering/cellRenderers/iCellRenderer"; import {GroupCellRendererParams} from "../../rendering/cellRenderers/groupCellRenderer"; import {ISetFilterParams} from "../../interfaces/iSetFilterParams"; enum ComponentType { AG_GRID, FRAMEWORK } /** * B the business interface (ie IHeader) * A the agGridComponent interface (ie IHeaderComp). The final object acceptable by ag-grid */ interface ComponentToUse & B, B> { component:{new(): A}|{new(): B}, type:ComponentType } @Bean('componentRecipes') export class ComponentRecipes { @Autowired("componentResolver") private componentResolver:ComponentResolver; @Autowired("gridOptions") private gridOptions: GridOptions; @Autowired("gridOptionsWrapper") private gridOptionsWrapper: GridOptionsWrapper; @Autowired('filterManager') private filterManager: FilterManager; public newDateComponent (params: IDateParams): IDateComp{ return this.componentResolver.createAgGridComponent(this.gridOptions, params, "dateComponent"); } public newHeaderComponent (params:IHeaderParams): IHeaderComp{ return this.componentResolver.createAgGridComponent(params.column.getColDef(), params, "headerComponent"); } public newHeaderGroupComponent (params:IHeaderGroupParams): IHeaderGroupComp{ return this.componentResolver.createAgGridComponent(params.columnGroup.getColGroupDef(), params, "headerGroupComponent"); } private newFloatingFilterComponent (type:string, colDef:ColDef, params:IFloatingFilterParams):IFloatingFilterComp{ //type if populated must be one of ['set','number','text','date'] let floatingFilterName: string = type + "FloatingFilterComponent"; return > this.componentResolver.createAgGridComponent( colDef, params, "floatingFilterComponent", floatingFilterName, false ); } public newFloatingFilterWrapperComponent> (column:Column, params:IFloatingFilterParams):IFloatingFilterWrapperComp{ let colDef = column.getColDef(); if (colDef.suppressFilter){ return this.newEmptyFloatingFilterWrapperComponent(column); } let floatingFilterType: string; if (typeof colDef.filter === 'string') { floatingFilterType = colDef.filter; } else if (!colDef.filter){ floatingFilterType= this.gridOptionsWrapper.isEnterprise() ? 'set' : 'text'; } else { floatingFilterType= 'custom'; } let floatingFilter:IFloatingFilterComp = this.newFloatingFilterComponent(floatingFilterType, colDef, params); let floatingFilterWrapperComponentParams : IFloatingFilterWrapperParams = { column: column, floatingFilterComp: floatingFilter, suppressFilterButton: this.componentResolver.mergeParams(colDef, 'floatingFilterComponent', params).suppressFilterButton }; if (!floatingFilter){ let filterComponent:ComponentToUse = this.getFilterComponentPrototype(colDef); if (filterComponent && !filterComponent.component.prototype.getModelAsString){ return this.newEmptyFloatingFilterWrapperComponent(column); } let rawModelFn = params.currentParentModel; params.currentParentModel = ():M=>{ let parent:IFilterComp = this.filterManager.getFilterComponent(column); return parent.getModelAsString(rawModelFn()); }; floatingFilterWrapperComponentParams.floatingFilterComp = this.newFloatingFilterComponent('readModelAsString', colDef, params); } return > this.componentResolver.createAgGridComponent( colDef, floatingFilterWrapperComponentParams, "floatingFilterWrapperComponent" ); } public newFullWidthGroupRowInnerCellRenderer (params:ICellRendererParams):ICellRendererComp{ return this.componentResolver.createAgGridComponent(this.gridOptions, params, "groupRowInnerRenderer", "groupRowInnerRenderer", false); } public newCellRenderer (target: ColDef | ISetFilterParams, params:ICellRendererParams):ICellRendererComp{ return this.componentResolver.createAgGridComponent(target, params, "cellRenderer", "cellRenderer", false); } public newInnerCellRenderer (target: GroupCellRendererParams, params:ICellRendererParams):ICellRendererComp{ return this.componentResolver.createAgGridComponent(target, params, "innerRenderer"); } public newFullRowGroupRenderer (params:ICellRendererParams):ICellRendererComp{ return this.componentResolver.createAgGridComponent(this.gridOptionsWrapper, params, "fullWidthCellRenderer"); } private getFilterComponentPrototype & B, B> (colDef: ColDef): ComponentToUse { return >this.componentResolver.getComponentToUse(colDef, "filterComponent"); } private newEmptyFloatingFilterWrapperComponent(column:Column) { let floatingFilterWrapperComponentParams : IFloatingFilterWrapperParams = { column: column, floatingFilterComp: null }; return > this.componentResolver.createAgGridComponent( column.getColDef(), floatingFilterWrapperComponentParams, "floatingFilterWrapperComponent", "emptyFloatingFilterWrapperComponent" ); } }