"Use strict"; import "../../node_modules/bootstrap/dist/css/bootstrap.css"; import "../../node_modules/bootstrap-multiselect/dist/css/bootstrap-multiselect.css"; import powerbi from "powerbi-visuals-api"; import {ISelectorManager,ISelectorManagerConstructor, IFilterManager} from "../visual/visualInterfaces"; import * as d3 from "d3"; type Selection<T extends d3.BaseType> = d3.Selection<T, any, any, any>; /* 负责页面上选择器的展示 */ export class SelectorManager implements ISelectorManager{ public selectorContainer : Selection<HTMLElement>; private selector:ISelector; public filterManager:IFilterManager; private categories: powerbi.DataViewCategoryColumn; private defaultSelect: powerbi.DataViewValueColumn; private defaultStart: powerbi.DataViewValueColumn; private defaultEnd: powerbi.DataViewValueColumn; constructor(selectorContainer:Selection<HTMLElement>,filterManager:IFilterManager){ console.debug("selectorManager constructor start"); this.selectorContainer=selectorContainer; this.filterManager=filterManager; } public switchSelector<T extends ISelector>(classSelector:new ()=>T){ let newSelector=new classSelector(); this.selector?.dispose(); this.selector=newSelector; } updateData(categories: powerbi.DataViewCategoryColumn, defaultSelect: powerbi.DataViewValueColumn, defaultStart: powerbi.DataViewValueColumn, defaultEnd: powerbi.DataViewValueColumn){ if(!this.selector){ let fieldType=categories.source.type; if(fieldType.text){ this.selector=new DropDownSelector(this); }else if(fieldType.numeric){ this.selector=new DropDownSelector(this); }else if(fieldType.dateTime){ this.selector=new CalendarSelector(this); }else{ throw "only receive text/num/datetime field"; } } this.selector.update(categories, defaultSelect, defaultStart, defaultEnd); }; public filterStringField(selection:string[]){ }; } interface ISelector{ update(categories: powerbi.DataViewCategoryColumn, defaultSelect: powerbi.DataViewValueColumn, defaultStart: powerbi.DataViewValueColumn, defaultEnd: powerbi.DataViewValueColumn); dispose():void; } abstract class Selector implements ISelector{ constructor(manager: ISelectorManager){ console.debug("Abstract selector:","constructor start"); this.manager=manager; this.createView(); } protected abstract createView():void; public abstract dispose():void; protected readonly manager:ISelectorManager; public abstract update(categories: powerbi.DataViewCategoryColumn, defaultSelect: powerbi.DataViewValueColumn, defaultStart: powerbi.DataViewValueColumn, defaultEnd: powerbi.DataViewValueColumn):void; } class DropDownSelector extends Selector{ private dropDown:Selection<HTMLElement>; protected createView() { console.debug('dropDownViewManager','createView start'); this.dropDown=this.manager.selectorContainer.append('div').classed('dropDown-selector',true) .append('select').attr('id','dropDown-select').attr('multiple','true'); console.debug('dropDownViewManager','createView end'); } public dispose(){ this.dropDown.remove(); } public update(field: powerbi.DataViewCategoryColumn, defaultSelect: powerbi.DataViewValueColumn, defaultStart: powerbi.DataViewValueColumn, defaultEnd: powerbi.DataViewValueColumn) { console.debug('dropDownViewManager','update start'); let filterManager:IFilterManager=this.manager.filterManager; $('#dropDown-select').multiselect({ onChange:function(){ let selectedValues:string[]=[]; $('option:selected').map(function(a,item){ selectedValues.push(item.textContent); console.debug('item:',item.textContent); filterManager.filterStringField(selectedValues); }); }, maxHeight:200, includeSelectAllOption:true }); let options=[]; field.values.map((item)=>{ options.push({ label:item.toString() }); }); $('#dropDown-select').multiselect('dataprovider',options); $('.dropDown-selector').css('overflow','visible').css('z-index',1000).css('position','relative'); $('.dropdown-menu').css('overflow','flow').css('z-index',1000).css('position','relative'); //$('#dropDown-select').multiselect('rebuild'); console.debug("dropDown:",this.dropDown); console.debug('dropDownViewManager','update end'); } } class ListSelector extends Selector{ public dispose() { throw new Error("Method not implemented."); } protected createView() { throw new Error("Method not implemented."); } public update(categories: powerbi.DataViewCategoryColumn, defaultSelect: powerbi.DataViewValueColumn, defaultStart: powerbi.DataViewValueColumn, defaultEnd: powerbi.DataViewValueColumn) { console.debug('ListSelector','updateView'); let dropDownSelector=this.manager.selectorContainer.append("select").classed("listSelector"); } } class CalendarSelector extends Selector{ public dispose() { throw new Error("Method not implemented."); } protected createView() { throw new Error("Method not implemented."); } public update(categories: powerbi.DataViewCategoryColumn, defaultSelect: powerbi.DataViewValueColumn, defaultStart: powerbi.DataViewValueColumn, defaultEnd: powerbi.DataViewValueColumn) { console.debug('calendarViewManager','updateView'); let dropDownSelector=this.manager.selectorContainer.append("select").classed("listSelector"); } }