From b2639bcebee0abb295bbe430edc4b7748eca03a9 Mon Sep 17 00:00:00 2001 From: MuJianNan Date: Sat, 2 May 2020 00:02:18 +0800 Subject: [PATCH] The single-dropdown work well --- .gitignore | 3 +- pbiviz.json | 4 - src/managers/filterManager.ts | 9 ++ src/managers/layoutManager.ts | 15 +++- src/managers/selectorManager.ts | 151 ++++++++++++++++++++++++-------- src/visual/visual.ts | 19 ++-- src/visual/visualInterfaces.ts | 6 +- style/visual.less | 2 - webpack.statistics.dev.html | 53 ----------- webpack.statistics.prod.html | 53 ----------- 10 files changed, 153 insertions(+), 162 deletions(-) delete mode 100644 webpack.statistics.dev.html delete mode 100644 webpack.statistics.prod.html diff --git a/.gitignore b/.gitignore index a9b3485..518de49 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ /node_modules /dist /.tmp -/.vscode \ No newline at end of file +/.vscode +webpack.statistics.* \ No newline at end of file diff --git a/pbiviz.json b/pbiviz.json index 35b0ad4..a8fe063 100644 --- a/pbiviz.json +++ b/pbiviz.json @@ -18,10 +18,6 @@ "icon": "assets/icon.png" }, "externalJS": [ - "node_modules/jquery/dist/jquery.min.js", - "src/coverJquery.js", - "node_modules/bootstrap/dist/js/bootstrap.min.js", - "node_modules/bootstrap-multiselect/dist/js/bootstrap-multiselect.min.js" ], "style": "style/visual.less", "capabilities": "capabilities.json", diff --git a/src/managers/filterManager.ts b/src/managers/filterManager.ts index beec1cd..03f98c0 100644 --- a/src/managers/filterManager.ts +++ b/src/managers/filterManager.ts @@ -14,6 +14,15 @@ export class FilterManager implements IFilterManager{ constructor(host:IVisualHost){ this.host=host; } + public dispose():void{ + console.debug('filterManager disposing'); + + if(this.target.table&&this.target.column){ + this.clear(); + } + console.debug('filterManager disposed'); + + } public clear():void{ console.debug("clear start:"); this.host.applyJsonFilter(null,"general","filter",powerbi.FilterAction.remove); diff --git a/src/managers/layoutManager.ts b/src/managers/layoutManager.ts index bb58a8a..f780f59 100644 --- a/src/managers/layoutManager.ts +++ b/src/managers/layoutManager.ts @@ -11,13 +11,22 @@ export class LayoutManager implements ILayoutManager{ // constructor(layout:Selection){ // this.layout=layout; // } - header:Selection + headerContainer:Selection constructor(layout:Selection,filterManager:IFilterManager){ this.layout=layout; - this.header=this.layout.append('div').attr('header',true); - this.header.append('button').attr('clear',true).text('clear').on('click',function(){ + this.headerContainer=layout.append("div").classed("header-container",true); + this.headerContainer.append('button').attr('clear',true).text('clear').on('click',function(){ filterManager.clear(); }); + this.headerContainer.style('display','none'); + } + public dispose():void{ + console.debug('layoutManager disposing'); + + this.headerContainer.remove(); + this.layout.remove(); + console.debug('layoutManager disposed'); + } update(dataView:DataView,width:number,height:number):void{ //this.layout.style("width",width+"px").style("height",height+"px"); diff --git a/src/managers/selectorManager.ts b/src/managers/selectorManager.ts index fcc4d5e..cc2537f 100644 --- a/src/managers/selectorManager.ts +++ b/src/managers/selectorManager.ts @@ -21,6 +21,10 @@ export class SelectorManager implements ISelectorManager{ this.selectorContainer=selectorContainer; this.filterManager=filterManager; } + public dispose():void{ + this.selector.dispose(); + this.selectorContainer.remove(); + } public switchSelector(classSelector:new ()=>T){ let newSelector=new classSelector(); this.selector?.dispose(); @@ -56,6 +60,30 @@ interface ISelector{ } abstract class Selector implements ISelector{ + protected field: powerbi.DataViewCategoryColumn; + protected defaultSelect: powerbi.DataViewValueColumn; + protected defaultStart: powerbi.DataViewValueColumn; + protected defaultEnd: powerbi.DataViewValueColumn; + protected checkFieldChange(field: powerbi.DataViewCategoryColumn):boolean{ + //Field is not null, so first check the old field + if(!this.field){ + return true; + } + if(field.source.queryName==this.field.source.queryName){ + console.debug('checkFieldChange: false'); + return false; + }else{ + console.debug('checkFieldChange: true'); + return true; + } + } + protected abstract checkDefaultSelectionChange(defaultSelect: powerbi.DataViewValueColumn, defaultStart: powerbi.DataViewValueColumn, defaultEnd: powerbi.DataViewValueColumn):boolean; + protected checkFieldAndDefaultSelectionChange(field: powerbi.DataViewCategoryColumn, defaultSelect: powerbi.DataViewValueColumn, defaultStart: powerbi.DataViewValueColumn, defaultEnd: powerbi.DataViewValueColumn){ + console.debug('checkFieldAndDefaultSelectionChange start'); + let flag:boolean=this.checkFieldChange(field)||this.checkDefaultSelectionChange(defaultSelect,defaultStart,defaultEnd) + console.debug('checkFieldAndDefaultSelectionChange end, result:',flag); + return flag; + } constructor(manager: ISelectorManager){ console.debug("Abstract selector:","constructor start"); this.manager=manager; @@ -67,59 +95,105 @@ abstract class Selector implements ISelector{ public abstract update(field: powerbi.DataViewCategoryColumn, defaultSelect: powerbi.DataViewValueColumn, defaultStart: powerbi.DataViewValueColumn, defaultEnd: powerbi.DataViewValueColumn):void; } class DropDownSelector extends Selector{ + protected checkDefaultSelectionChange(defaultSelect: powerbi.DataViewValueColumn, defaultStart: powerbi.DataViewValueColumn, defaultEnd: powerbi.DataViewValueColumn): boolean { + //The defaultSelect is nullable, so first check the new defaultSelect + console.debug('checkDefaultSelectionChange start'); + let flag:boolean; + if(!defaultSelect||!defaultSelect.values||!defaultSelect.values[0]){ + console.debug('new defaultSelect is null, set flag=false') + flag=flag||false; + }else{ + if(!this.defaultSelect||!this.defaultSelect.values||!defaultSelect.values[0]){ + console.debug('previous defaultSelect is null, set flag=true'); + flag=flag||true; + }else{ + if(defaultSelect.values[0].toString()!=this.defaultSelect.values[0].toString()){ + console.debug('new defaultSelect not equal to the previous, set flag=true'); + flag=flag||true; + }else{ + console.debug('new defaultSelect equal to the previous, set flag=false'); + flag=flag||false; + } + } + } + console.debug('checkDefaultSelectionChange end, result:',flag); + return flag; + } private dropDown:Selection; protected createView() { console.debug('dropDownViewManager','createView start'); - this.dropDown=this.manager.selectorContainer.append("select").classed("dropDown-selector",true).classed("selector",true).attr("multiple",true); + this.dropDown=this.manager.selectorContainer.append("select").classed("dropDown-selector",true).classed("selector",true);//.attr("multiple",false); + let filterManager:IFilterManager=this.manager.filterManager; + this.dropDown.on("input change",function(){ + console.debug('DropDownSelector:',"input change"); + console.debug('this',this); + console.debug('filterManager:',filterManager); + let selectedValues:string[]=[]; + for(let i=0;i=>this.dropDown.selectAll("option").data(field.values,function(d){return d.toString();});//map data options.exit().remove();//delete - console.debug("dropDown:",this.dropDown); - let filterManager:IFilterManager=this.manager.filterManager; - // this.dropDown.on("input change",function(){ - // console.debug('DropDownSelector:',"input change"); - // console.debug('this',this); - // console.debug('filterManager:',filterManager); - // let selectedValues:string[]=[]; - // for(let i=0;i { // const mouseEvent: MouseEvent = d3.event; // //const eventTarget: EventTarget = mouseEvent.target; @@ -73,12 +74,14 @@ export class Visual implements IVisual { // }); // //mouseEvent.preventDefault(); // }); - let headerContainer=container.append("div").classed("header-container",true); - let selectorContainer=container.append("div").classed("selector-container",true); + //First, create the filterManager this.filterManager=ManagerFactory.CreateFilterManager(FilterManager,options.host); - //Then, layoutManager and selectorManager + //Then, layoutManager and selectorManager, both use the filterManager + //Lagyoutmanager manage the whole div and the slicer-header this.layoutManager=ManagerFactory.CreateLayoutManager(LayoutManager,container,this.filterManager); + //SelectorManager manage selectors + let selectorContainer=container.append("div").classed("selector-container",true); this.selectorManager=ManagerFactory.CreateSelectorManager(SelectorManager,selectorContainer,this.filterManager); } console.debug('end constructor'); @@ -111,13 +114,15 @@ export class Visual implements IVisual { console.debug("start layoutManager updateView"); this.layoutManager.update(dataView,width-10,height-10); - - console.debug("start selectorManager updateView"); - this.selectorManager.updateData(field,defaultSelect,defaultStart,defaultEnd); console.debug("start filterManager updateView"); this.filterManager.update(field); this.events.renderingFinished(options); + + console.debug("start selectorManager updateView"); + this.selectorManager.updateData(field,defaultSelect,defaultStart,defaultEnd); + + } private static parseSettings(dataView: DataView): VisualSettings { diff --git a/src/visual/visualInterfaces.ts b/src/visual/visualInterfaces.ts index a63ecbf..c1f2b2e 100644 --- a/src/visual/visualInterfaces.ts +++ b/src/visual/visualInterfaces.ts @@ -14,6 +14,7 @@ Main interfaces export interface ILayoutManager{ layout:Selection; update(dataView:DataView,width:number,height:number):void; + dispose():void; } export interface ILayoutManagerConstructor{ new(container:Selection,filterManager:IFilterManager):ILayoutManager; @@ -23,19 +24,20 @@ export interface ILayoutManagerConstructor{ export interface ISelectorManager{ selectorContainer:Selection; filterManager:IFilterManager; - updateData(field:powerbi.DataViewCategoryColumn,defaultSelect:powerbi.DataViewValueColumn,defaultStart:powerbi.DataViewValueColumn,defaultEnd:powerbi.DataViewValueColumn); + dispose():void; + updateData(field:powerbi.DataViewCategoryColumn,defaultSelect:powerbi.DataViewValueColumn,defaultStart:powerbi.DataViewValueColumn,defaultEnd:powerbi.DataViewValueColumn):void; } export interface ISelectorManagerConstructor{ new(selectorContainer:Selection,filterManager:IFilterManager):ISelectorManager; } - //IFilterManager export interface IFilterManager{ update(field:powerbi.DataViewCategoryColumn):void; filterStringField(selection:string[]):void; clear():void; + dispose():void; } export interface IFilterManagerConstructor{ new(host:IVisualHost):IFilterManager; diff --git a/style/visual.less b/style/visual.less index f8cf91e..9b1f1dd 100644 --- a/style/visual.less +++ b/style/visual.less @@ -1,5 +1,3 @@ -@import "/node_modules/bootstrap/dist/css/bootstrap.min.css"; -@import "/node_modules/bootstrap-multiselect/dist/css/bootstrap-multiselect.css"; p { font-size: 20px; font-weight: bold; diff --git a/webpack.statistics.dev.html b/webpack.statistics.dev.html deleted file mode 100644 index 3857fbd..0000000 --- a/webpack.statistics.dev.html +++ /dev/null @@ -1,53 +0,0 @@ - - - - - - Webpack Bundle Analyzer [1 May 2020 at 10:41] - - - - - - - - - - - -
- - - diff --git a/webpack.statistics.prod.html b/webpack.statistics.prod.html deleted file mode 100644 index 8c5d340..0000000 --- a/webpack.statistics.prod.html +++ /dev/null @@ -1,53 +0,0 @@ - - - - - - Webpack Bundle Analyzer [29 Apr 2020 at 02:22] - - - - - - - - - - - -
- - -