Skip to content

Commit

Permalink
prepare for changeable top N value
Browse files Browse the repository at this point in the history
  • Loading branch information
sgratzl committed Dec 14, 2018
1 parent 473f872 commit 82c15b6
Show file tree
Hide file tree
Showing 4 changed files with 57 additions and 20 deletions.
13 changes: 7 additions & 6 deletions src/model/AggregateGroupColumn.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import Column, {IColumnDesc, widthChanged, labelChanged, metaDataChanged, dirty,
import {IGroup} from './interfaces';
import Ranking from './Ranking';
import {IEventListener} from '../internal/AEventDispatcher';
import {EAggregationState} from '../provider/interfaces';

/**
* factory for creating a description creating a rank column
Expand All @@ -14,9 +15,9 @@ export function createAggregateDesc(label: string = 'Aggregate Groups') {
}

export interface IAggregateGroupColumnDesc extends IColumnDesc {
isAggregated(ranking: Ranking, group: IGroup): 'collapse' | 'expand' | 'expand_top';
isAggregated(ranking: Ranking, group: IGroup): EAggregationState;

setAggregated(ranking: Ranking, group: IGroup, value: 'collapse' | 'expand' | 'expand_top'): void;
setAggregated(ranking: Ranking, group: IGroup, value: EAggregationState): void;
}

/**
Expand All @@ -25,7 +26,7 @@ export interface IAggregateGroupColumnDesc extends IColumnDesc {
* @asMemberOf AggregateGroupColumn
* @event
*/
export declare function aggregate(ranking: Ranking, group: IGroup, value: boolean, showTop: number): void;
export declare function aggregate(ranking: Ranking, group: IGroup, value: boolean, state: EAggregationState): void;

/**
* a checkbox column for selections
Expand Down Expand Up @@ -73,8 +74,8 @@ export default class AggregateGroupColumn extends Column {
return false;
}

setAggregated(group: IGroup, value: boolean | 'collapse' | 'expand' | 'expand_top') {
const n = typeof value === 'boolean' ? (value ? 'expand' : 'collapse'): value;
setAggregated(group: IGroup, value: boolean | EAggregationState) {
const n: EAggregationState = typeof value === 'boolean' ? (value ? EAggregationState.EXPAND : EAggregationState.COLLAPSE): value;
const ranking = this.findMyRanker()!;
const current = ((<IAggregateGroupColumnDesc>this.desc).isAggregated) && (<IAggregateGroupColumnDesc>this.desc).isAggregated(ranking, group);
if (current === n) {
Expand All @@ -84,7 +85,7 @@ export default class AggregateGroupColumn extends Column {
if ((<IAggregateGroupColumnDesc>this.desc).setAggregated) {
(<IAggregateGroupColumnDesc>this.desc).setAggregated(ranking, group, n);
}
this.fire(AggregateGroupColumn.EVENT_AGGREGATE, ranking, group, n !== 'collapse', n);
this.fire(AggregateGroupColumn.EVENT_AGGREGATE, ranking, group, n !== EAggregationState.COLLAPSE, n);
return false;
}
}
49 changes: 36 additions & 13 deletions src/provider/ADataProvider.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import {dirty, dirtyCaches, dirtyHeader, dirtyValues} from '../model/Column';
import {toGroupID, unifyParents} from '../model/internal';
import RankColumn from '../model/RankColumn';
import Ranking, {addColumn, EDirtyReason, orderChanged, removeColumn} from '../model/Ranking';
import {IColumnDump, IDataProvider, IDataProviderDump, IDataProviderOptions, IRankingDump, SCHEMA_REF} from './interfaces';
import {IColumnDump, IDataProvider, IDataProviderDump, IDataProviderOptions, IRankingDump, SCHEMA_REF, EAggregationState} from './interfaces';
import {exportRanking, IExportOptions, map2Object, object2Map} from './utils';
import {IRenderTasks} from './tasks';

Expand Down Expand Up @@ -58,6 +58,13 @@ export declare function addDesc(desc: IColumnDesc): void;
* @event
*/
export declare function clearDesc(): void;

/**
* @asMemberOf ADataProvider
* @event
*/
export declare function showTopNChanged(previous: number, current: number): void;

/**
* emitted when the selection changes
* @asMemberOf ADataProvider
Expand All @@ -69,7 +76,7 @@ export declare function jumpToNearest(dataIndices: number[]): void;
* @asMemberOf ADataProvider
* @event
*/
export declare function aggregate(ranking: Ranking, group: IGroup | IGroup[], value: boolean, showTopN: number): void;
export declare function aggregate(ranking: Ranking, group: IGroup | IGroup[], value: boolean, state: EAggregationState): void;


/**
Expand Down Expand Up @@ -126,6 +133,7 @@ abstract class ADataProvider extends AEventDispatcher implements IDataProvider {
static readonly EVENT_DIRTY_VALUES = Ranking.EVENT_DIRTY_VALUES;
static readonly EVENT_DIRTY_CACHES = Ranking.EVENT_DIRTY_CACHES;
static readonly EVENT_ORDER_CHANGED = Ranking.EVENT_ORDER_CHANGED;
static readonly EVENT_SHOWTOPN_CHANGED = 'showTopNChanged';
static readonly EVENT_ADD_DESC = 'addDesc';
static readonly EVENT_CLEAR_DESC = 'clearDesc';
static readonly EVENT_JUMP_TO_NEAREST = 'jumpToNearest';
Expand Down Expand Up @@ -160,7 +168,7 @@ abstract class ADataProvider extends AEventDispatcher implements IDataProvider {
readonly columnTypes: {[columnType: string]: typeof Column};

protected readonly multiSelections: boolean;
private readonly showTopN: number;
private showTopN: number;

constructor(options: Partial<IDataProviderOptions> = {}) {
super();
Expand All @@ -180,6 +188,7 @@ abstract class ADataProvider extends AEventDispatcher implements IDataProvider {
protected createEventList() {
return super.createEventList().concat([
ADataProvider.EVENT_DATA_CHANGED, ADataProvider.EVENT_BUSY,
ADataProvider.EVENT_SHOWTOPN_CHANGED,
ADataProvider.EVENT_ADD_COLUMN, ADataProvider.EVENT_REMOVE_COLUMN,
ADataProvider.EVENT_ADD_RANKING, ADataProvider.EVENT_REMOVE_RANKING,
ADataProvider.EVENT_DIRTY, ADataProvider.EVENT_DIRTY_HEADER, ADataProvider.EVENT_DIRTY_VALUES, ADataProvider.EVENT_DIRTY_CACHES,
Expand All @@ -190,6 +199,7 @@ abstract class ADataProvider extends AEventDispatcher implements IDataProvider {

on(type: typeof ADataProvider.EVENT_BUSY, listener: typeof busy | null): this;
on(type: typeof ADataProvider.EVENT_DATA_CHANGED, listener: typeof dataChanged | null): this;
on(type: typeof ADataProvider.EVENT_SHOWTOPN_CHANGED, listener: typeof showTopNChanged | null): this;
on(type: typeof ADataProvider.EVENT_ADD_COLUMN, listener: typeof addColumn | null): this;
on(type: typeof ADataProvider.EVENT_REMOVE_COLUMN, listener: typeof removeColumn | null): this;
on(type: typeof ADataProvider.EVENT_ADD_RANKING, listener: typeof addRanking | null): this;
Expand Down Expand Up @@ -422,8 +432,8 @@ abstract class ADataProvider extends AEventDispatcher implements IDataProvider {
(<ISelectionColumnDesc>desc).setter = (index: number, value: boolean) => value ? this.select(index) : this.deselect(index);
(<ISelectionColumnDesc>desc).setterAll = (indices: IndicesArray, value: boolean) => value ? this.selectAll(indices) : this.deselectAll(indices);
} else if (desc.type === 'aggregate') {
(<IAggregateGroupColumnDesc>desc).isAggregated = (ranking: Ranking, group: IGroup) => this.getAggregatedState(ranking, group);
(<IAggregateGroupColumnDesc>desc).setAggregated = (ranking: Ranking, group: IGroup, value: 'expand' | 'collapse' | 'expand_top') => this.setAggregateState(ranking, group, value);
(<IAggregateGroupColumnDesc>desc).isAggregated = (ranking: Ranking, group: IGroup) => this.getAggregationState(ranking, group);
(<IAggregateGroupColumnDesc>desc).setAggregated = (ranking: Ranking, group: IGroup, value: EAggregationState) => this.setAggregationState(ranking, group, value);
}
return desc;
}
Expand Down Expand Up @@ -633,13 +643,13 @@ abstract class ADataProvider extends AEventDispatcher implements IDataProvider {
return this.getTopNAggregated(ranking, group) >= 0;
}

getAggregatedState(ranking: Ranking, group: IGroup) {
getAggregationState(ranking: Ranking, group: IGroup) {
const n = this.getTopNAggregated(ranking, group);
return n < 0 ? 'expand' : (n === 0 ? 'collapse' : 'expand_top');
return n < 0 ? EAggregationState.EXPAND : (n === 0 ? EAggregationState.COLLAPSE : EAggregationState.EXPAND_TOP_N);
}

setAggregateState(ranking: Ranking, group: IGroup, value: 'collapse' | 'expand' | 'expand_top') {
this.setTopNAggregated(ranking, group, value === 'collapse' ? 0 : (value === 'expand' ? -1 : this.showTopN));
setAggregationState(ranking: Ranking, group: IGroup, value: EAggregationState) {
this.setTopNAggregated(ranking, group, value === EAggregationState.COLLAPSE ? 0 : (value === EAggregationState.EXPAND_TOP_N ? -1 : this.showTopN));
}

getTopNAggregated(ranking: Ranking, group: IGroup) {
Expand Down Expand Up @@ -694,15 +704,15 @@ abstract class ADataProvider extends AEventDispatcher implements IDataProvider {
this.fire([ADataProvider.EVENT_GROUP_AGGREGATION_CHANGED, ADataProvider.EVENT_DIRTY_VALUES, ADataProvider.EVENT_DIRTY], ranking, group, value);
}

aggregateAllOf(ranking: Ranking, aggregateAll: boolean | number | 'collapse' | 'expand' | 'expand_top') {
aggregateAllOf(ranking: Ranking, aggregateAll: boolean | number | EAggregationState) {
let v: number;
if (typeof aggregateAll === 'boolean') {
v = aggregateAll ? 0 : -1;
} else if (aggregateAll === 'collapse') {
} else if (aggregateAll === EAggregationState.COLLAPSE) {
v = 0;
} else if (aggregateAll === 'expand') {
} else if (aggregateAll === EAggregationState.EXPAND) {
v = -1;
} else if (aggregateAll === 'expand_top') {
} else if (aggregateAll === EAggregationState.EXPAND_TOP_N) {
v = this.showTopN;
} else {
v = aggregateAll;
Expand All @@ -725,6 +735,19 @@ abstract class ADataProvider extends AEventDispatcher implements IDataProvider {
this.fire([ADataProvider.EVENT_GROUP_AGGREGATION_CHANGED, ADataProvider.EVENT_DIRTY_VALUES, ADataProvider.EVENT_DIRTY], ranking, groups, v >= 0, v);
}

setShowTopN(value: number) {
if (this.showTopN === value) {
return;
}
// update entries
for (const [k, v] of Array.from(this.aggregations.entries())) {
if (v === this.showTopN) {
this.aggregations.set(k, value);
}
}
this.fire([ADataProvider.EVENT_SHOWTOPN_CHANGED, ADataProvider.EVENT_DIRTY_VALUES, ADataProvider.EVENT_DIRTY], this.showTopN, this.showTopN = value);
}

/**
* sorts the given ranking and eventually return a ordering of the data items
* @param ranking
Expand Down
11 changes: 10 additions & 1 deletion src/provider/interfaces.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,11 @@ import '!file-loader?name=schema.4.0.0.json!./schema.json';
import {ISequence} from '../internal/interable';
import {IRenderTasks} from './tasks';

export enum EAggregationState {
COLLAPSE = 'collapse',
EXPAND = 'expand',
EXPAND_TOP_N = 'expand_top'
}

export interface IDataProviderOptions {
columnTypes: {[columnType: string]: typeof Column};
Expand Down Expand Up @@ -68,7 +73,11 @@ export interface IDataProvider extends AEventDispatcher {

isAggregated(ranking: Ranking, group: IGroup): boolean;

aggregateAllOf(ranking: Ranking, aggregateAll: boolean | number | 'collapse' | 'expand' | 'expand_top'): void;
setAggregationState(ranking: Ranking, group: IGroup, state: EAggregationState): void;

getAggregationState(ranking: Ranking, group: IGroup): EAggregationState;

aggregateAllOf(ranking: Ranking, aggregateAll: boolean | number | EAggregationState): void;

getTopNAggregated(ranking: Ranking, group: IGroup): number;

Expand Down
4 changes: 4 additions & 0 deletions src/ui/EngineRenderer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -185,6 +185,7 @@ export default class EngineRenderer extends AEventDispatcher {
this.data.on(`${ADataProvider.EVENT_ADD_RANKING}.body`, null);
this.data.on(`${ADataProvider.EVENT_REMOVE_RANKING}.body`, null);
this.data.on(`${ADataProvider.EVENT_GROUP_AGGREGATION_CHANGED}.body`, null);
this.data.on(`${ADataProvider.EVENT_SHOWTOPN_CHANGED}.body`, null);
this.data.on(`${ADataProvider.EVENT_JUMP_TO_NEAREST}.body`, null);
this.data.on(`${ADataProvider.EVENT_BUSY}.body`, null);

Expand All @@ -205,6 +206,9 @@ export default class EngineRenderer extends AEventDispatcher {
data.on(`${ADataProvider.EVENT_GROUP_AGGREGATION_CHANGED}.body`, (ranking: Ranking) => {
this.update(this.rankings.filter((r) => r.ranking === ranking));
});
data.on(`${ADataProvider.EVENT_SHOWTOPN_CHANGED}.body`, () => {
this.update(this.rankings);
});
data.on(`${ADataProvider.EVENT_JUMP_TO_NEAREST}.body`, (indices: number[]) => {
this.setHighlightToNearest(indices, true);
});
Expand Down

0 comments on commit 82c15b6

Please sign in to comment.