Skip to content

Taggle Fusion Canvas Texture Renderer#561

Open
domdir wants to merge 19 commits intotaggle-fusionfrom
taggle-fusion-issue-3-4
Open

Taggle Fusion Canvas Texture Renderer#561
domdir wants to merge 19 commits intotaggle-fusionfrom
taggle-fusion-issue-3-4

Conversation

@domdir
Copy link

@domdir domdir commented Sep 7, 2018

Related PR: Caleydo/lineup_app#19

Summary

Introduces a new overview renderer.
image

In order to display big datasets the columns are rendered onto a canvas. With this approach it is possible to give an overview over very large datasets.

The user is also able to define an expand area. This can be done bei holding down the ALT-key and draging a selection area:
image

The expand selection is displayed in a seperate column:
image

The user can expand the selected area to see the row details:
image

@domdir domdir requested a review from thinkh September 7, 2018 09:01
@thinkh thinkh changed the title Taggle fusion issue 3 4 Taggle Fusion Canvas Texture Renderer Sep 7, 2018
@domdir domdir force-pushed the taggle-fusion-issue-3-4 branch from a636edd to 56c676a Compare October 7, 2018 18:00
@thinkh
Copy link
Member

thinkh commented Oct 29, 2018

I get a runtime error when switching to the overview mode:

  1. npm start
  2. Open http://localhost:8080/builder4.html (or any other demo)
  3. Activate overview checkbox
Uncaught TypeError: Cannot set property 'innerHTML' of null
    at Taggle.setViolation (Taggle.ts:127)
    at Object.violationChanged (Taggle.ts:26)
    at TaggleRenderer.dynamicHeight (TaggleRenderer.ts:92)
    at Object.dynamicHeight (TaggleRenderer.ts:49)
    at EngineRenderer.heightsFor (EngineRenderer.ts:349)
    at EngineRenderer.render (EngineRenderer.ts:389)
    at rankings.forEach (EngineRenderer.ts:378)
    at Array.forEach (<anonymous>)
    at EngineRenderer.update (EngineRenderer.ts:377)
    at TaggleRenderer.update (TaggleRenderer.ts:163)

It seems that the <div class="${cssClass('rule-violation')}"></div> from line 92 is not set because of the surrounding if statement.

this.fire(ADataProvider.EVENT_SELECTION_CHANGED, [], false);
}

clearDetail() {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please add function comment

return Array.from(this.selection);
}

getDetail() {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please add function comment

return this.view(this.getSelection());
}

detailRows(): Promise<any[]> | any[] {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please add function comment

this.fire(ADataProvider.EVENT_SELECTION_CHANGED, this.getSelection());
}

removeDetailAll(indices: number[]) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please add function comment

return true;
}

toggleDetail(index: number, additional = false) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please add function comment

this.fire(ADataProvider.EVENT_SELECTION_CHANGED, this.getSelection());
}

removeDetail(index: number) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please add function comment

this.selectAll(indices);
}

setDetail(indices: number[]) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please add function comment

this.fire(ADataProvider.EVENT_SELECTION_CHANGED, this.getSelection());
}

addDetailAll(indices: number[]) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please add function comment

this.fire(ADataProvider.EVENT_SELECTION_CHANGED, this.getSelection());
}

addDetail(index: number) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please add function comment

return this.selection.has(index);
}

isDetail(index: number) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please add function comment

*/
private readonly selection = new OrderedSet<number>();

private readonly detail = new OrderedSet<number>();
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Add property comment

@import './threshold';
@import './upset';
@import './verticalbar';
.#{$lu_css_prefix} {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why is this necessary?

};

constructor(public readonly ranking: Ranking, header: HTMLElement, body: HTMLElement, tableId: string, style: GridStyleManager, private readonly ctx: IEngineRankingContext, roptions: Partial<IEngineRankingOptions> = {}) {
constructor(public readonly ranking: Ranking, header: HTMLElement, body: HTMLElement, tableId: string, style: GridStyleManager, private readonly ctx: IEngineRankingContext, roptions: Partial<IEngineRankingOptions> = {}, readonly noEvents: boolean = false) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Invert semantic of noEvents = false for easier reading. Because in line 188 the counter part is used if(!noEvents). Rename to addEventListener = true.

if (newValue) {
// become visible
const index = ranking.children.indexOf(col);
if (!noEvents) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please add a comment why and when no event listner is added? Otherwise nobody understands why this flag exists.

d3.select(this.node).select('main').style('display', 'none');
}

s2d() {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do not use abbreviations in this case.

this.textureRenderer.s2d();
}

d2s() {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do not use abbreviations in this case.

this.node.style.display = 'none';
}

s2d() {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do not use abbreviations in this case.

this.engineRenderer.ctx.provider.setDetail(this.engineRenderer.ctx.provider.getSelection());
}

d2s() {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do not use abbreviations in this case.


for (let i = fromIndex; i <= toIndex; i++) {
if (this.engineRenderer.ctx.provider.isSelected(this.currentLocalData[0][i].i)) {
ctx.fillStyle = '#ffa809';
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Use class color constant

if (this.engineRenderer.ctx.provider.isSelected(this.currentLocalData[0][i].i)) {
ctx.fillStyle = '#ffa809';
} else {
ctx.fillStyle = '#ffffff';
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Use class color constant

this.renderer.enableHighlightListening(enable);
}

d2s() {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do not use abbreviations in this case.

this.renderer.d2s();
}

s2d() {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do not use abbreviations in this case.

const others = order.filter((d) => !ss.has(d));
ctx.provider.setSelection(others);
}),
selectionToOverviewDetail: ui('S2D', (_col, _evt, ctx, level) => {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Use more explainable label

const s = ctx.provider.getSelection();
ctx.provider.setDetail(s);
}),
overviewDetailToSelection: ui('D2S', (_col, _evt, ctx, level) => {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Use more explainable label


group(row: IDataRow) {
const isSelected = this.getValue(row);
return isSelected ? OverviewDetailColumn.DETAILED_GROUP : OverviewDetailColumn.NOT_DETAILED_GROUP; }
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Check formatting

private alreadyExpanded: boolean = false;
private expandLaterRows: any[] = [];
private readonly options: Readonly<ILineUpOptions>;
private readonly idPrefix = 'testprefix';
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why testprefix?

totalWidth += rankingWidth;
});
if (totalWidth > this.node.clientWidth) {
this.currentNodeHeight -= 20;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Where does this 20 px are coming from? Is there an existing constant that you can use?

Copy link
Member

@thinkh thinkh left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I couldn't test this functionality with the lineupjs demos, as there is a bug (as described above). Afterwards I can test it again.
Please fix the mentioned comments, before I'll merge the PR.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants