136 lines
5.8 KiB
TypeScript
136 lines
5.8 KiB
TypeScript
"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");
|
|
}
|
|
} |