import {TextCellEditor} from "../../rendering/cellEditors/textCellEditor"; import {Bean, PostConstruct} from "../../context/context"; import {IAfterGuiAttachedParams, IComponent} from "../../interfaces/iComponent"; import {DefaultDateComponent} from "../../filter/dateFilter"; import {HeaderComp} from "../../headerRendering/header/headerComp"; import {HeaderGroupComp} from "../../headerRendering/headerGroup/headerGroupComp"; import { DateFloatingFilterComp, NumberFloatingFilterComp, ReadModelAsStringFloatingFilterComp, SetFloatingFilterComp, TextFloatingFilterComp } from "../../filter/floatingFilter"; import {EmptyFloatingFilterWrapperComp, FloatingFilterWrapperComp} from "../../filter/floatingFilterWrapper"; 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"; 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 & B, B> { component: RegisteredComponentInput, type:ComponentType, source:RegisteredComponentSource } export type RegisteredComponentInput & B, B> = AgGridRegisteredComponentInput| {new(): B}; export type AgGridRegisteredComponentInput> = AgGridComponentFunctionInput | {new(): A} export type AgGridComponentFunctionInput = (params:any)=>string | HTMLElement ; @Bean('componentProvider') export class ComponentProvider { private agGridDefaults :{[key:string]:AgGridRegisteredComponentInput}; private jsComponents :{[key:string]:AgGridRegisteredComponentInput} = {}; private frameworkComponents :{[key:string]:{new(): any}} = {}; @PostConstruct public postConstruct (){ this.agGridDefaults = { //THE FOLLOWING COMPONENTS HAVE NO DEFAULTS, THEY NEED TO BE SPECIFIED AS AN SPECIFIC FLAVOUR //THERE ARE NO DEFAULTS THAT FIT ALL PURPOSES //THEY ARE ADDED HERE TO AVOID THE NOT FOUND WARNING. filterComponent:null, customFloatingFilterComponent:null, //date dateComponent: DefaultDateComponent, //header headerComponent: HeaderComp, headerGroupComponent: HeaderGroupComp, //floating filters setFloatingFilterComponent: SetFloatingFilterComp, textFloatingFilterComponent: TextFloatingFilterComp, numberFloatingFilterComponent:NumberFloatingFilterComp, dateFloatingFilterComponent: DateFloatingFilterComp, readModelAsStringFloatingFilterComponent: ReadModelAsStringFloatingFilterComp, floatingFilterWrapperComponent: FloatingFilterWrapperComp, emptyFloatingFilterWrapperComponent: EmptyFloatingFilterWrapperComp, //renderers cellRenderer: null, fullWidthCellRenderer: null, innerRenderer: null, groupRowInnerRenderer: null, animateShowChange: AnimateShowChangeCellRenderer, animateSlide: AnimateSlideCellRenderer, group: GroupCellRenderer, groupRowRenderer: GroupCellRenderer, loadingCellRenderer: LoadingCellRenderer, pinnedRowCellRenderer: null, //editors cellEditor: TextCellEditor, textCellEditor: TextCellEditor, text: TextCellEditor, selectCellEditor: SelectCellEditor, select: SelectCellEditor, popupTextCellEditor: PopupTextCellEditor, popupText: PopupTextCellEditor, popupSelectCellEditor: PopupSelectCellEditor, popupSelect: PopupSelectCellEditor, largeTextCellEditor: LargeTextCellEditor, largeText: LargeTextCellEditor } } public registerComponent> (name:string, component:AgGridRegisteredComponentInput){ // console.warn(`ag-grid: registering components is a lab feature, is not intended to be used or supported yet.`); 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 & B, B> (name:string, component:{new(): IComponent}){ // console.warn(`ag-grid: registering components is a lab feature, is not intended to be used or supported yet.`); 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 & B, B> (name:string): RegisteredComponent{ 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 { type: ComponentType.AG_GRID, component: <{new(): A}>this.agGridDefaults[name], source: RegisteredComponentSource.DEFAULT } } if (Object.keys(this.agGridDefaults).indexOf(name) < 0){ console.warn(`ag-grid: Looking for component [${name}] but it wasn't found.`); } return null; } }