/
LineUp.ts
101 lines (86 loc) · 2.9 KB
/
LineUp.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
import { type ILineUpOptions, defaultOptions } from '../config';
import { merge, suffix } from '../internal';
import type { DataProvider } from '../provider';
import { cssClass } from '../styles';
import { ALineUp } from './ALineUp';
import EngineRenderer from './EngineRenderer';
import SidePanel from './panel/SidePanel';
export default class LineUp extends ALineUp {
static readonly EVENT_SELECTION_CHANGED = ALineUp.EVENT_SELECTION_CHANGED;
static readonly EVENT_DIALOG_OPENED = ALineUp.EVENT_DIALOG_OPENED;
static readonly EVENT_DIALOG_CLOSED = ALineUp.EVENT_DIALOG_CLOSED;
static readonly EVENT_HIGHLIGHT_CHANGED = ALineUp.EVENT_HIGHLIGHT_CHANGED;
private readonly renderer: EngineRenderer | null;
private readonly panel: SidePanel | null;
private readonly options = defaultOptions();
constructor(node: HTMLElement, data: DataProvider, options: Partial<ILineUpOptions> = {}) {
super(node, data, options && options.ignoreUnsupportedBrowser === true);
merge(this.options, options);
if (this.options.copyableRows) {
this.addCopyListener();
}
if (!this.isBrowserSupported) {
this.renderer = null;
this.panel = null;
return;
}
this.node.classList.add(cssClass());
this.renderer = new EngineRenderer(data, this.node, this.options);
if (this.options.sidePanel) {
this.panel = new SidePanel(this.renderer.ctx, this.node.ownerDocument!, {
collapseable: this.options.sidePanelCollapsed ? 'collapsed' : true,
hierarchy: this.options.hierarchyIndicator && this.options.flags.advancedRankingFeatures,
});
this.renderer.pushUpdateAble((ctx) => this.panel!.update(ctx));
this.node.insertBefore(this.panel.node, this.node.firstChild);
} else {
this.panel = null;
}
this.forward(
this.renderer,
...suffix(
'.main',
EngineRenderer.EVENT_HIGHLIGHT_CHANGED,
EngineRenderer.EVENT_DIALOG_OPENED,
EngineRenderer.EVENT_DIALOG_CLOSED
)
);
}
destroy() {
this.node.classList.remove(cssClass());
if (this.renderer) {
this.renderer.destroy();
}
if (this.panel) {
this.panel.destroy();
}
super.destroy();
}
update() {
if (this.renderer) {
this.renderer.update();
}
}
setDataProvider(data: DataProvider, dump?: any) {
super.setDataProvider(data, dump);
if (!this.renderer) {
return;
}
this.renderer.setDataProvider(data);
this.update();
if (this.panel) {
this.panel.update(this.renderer.ctx);
}
}
setHighlight(dataIndex: number, scrollIntoView = true) {
return this.renderer != null && this.renderer.setHighlight(dataIndex, scrollIntoView);
}
getHighlight() {
return this.renderer ? this.renderer.getHighlight() : -1;
}
protected enableHighlightListening(enable: boolean) {
if (this.renderer) {
this.renderer.enableHighlightListening(enable);
}
}
}