/
CompositeNumberColumn.ts
111 lines (92 loc) · 2.85 KB
/
CompositeNumberColumn.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
102
103
104
105
106
107
108
109
110
111
import { format } from 'd3-format';
import CompositeColumn from './CompositeColumn';
import type { IDataRow, IGroup, IColumnDesc } from './interfaces';
import { isMissingValue } from './missing';
import NumberColumn from './NumberColumn';
import { SortByDefault, toolbar } from './annotations';
import type { ISequence } from '../internal';
import type { INumberColumn } from './INumberColumn';
export interface ICompositeNumberDesc extends IColumnDesc {
/**
* d3 format number Format
* @default 0.3n
*/
numberFormat?: string;
}
export declare type ICompositeNumberColumnDesc = ICompositeNumberDesc & IColumnDesc;
/**
* implementation of a combine column, standard operations how to select
*/
@toolbar('rename', 'clone', 'sort', 'sortBy', 'group', 'groupBy')
@SortByDefault('descending')
export default class CompositeNumberColumn extends CompositeColumn implements INumberColumn {
private readonly numberFormat: (n: number) => string = format('.3n');
constructor(id: string, desc: Readonly<ICompositeNumberColumnDesc>) {
super(id, desc);
if (desc.numberFormat) {
this.numberFormat = format(desc.numberFormat);
}
}
getNumberFormat() {
return this.numberFormat;
}
getLabel(row: IDataRow) {
if (!this.isLoaded()) {
return '';
}
const v = this.getValue(row);
//keep non number if it is not a number else convert using formatter
return String(typeof v === 'number' && !Number.isNaN(v) && isFinite(v) ? this.numberFormat(v) : v);
}
getValue(row: IDataRow) {
if (!this.isLoaded()) {
return null;
}
//weighted sum
const v = this.compute(row);
if (isMissingValue(v)) {
return null;
}
return v;
}
protected compute(_row: IDataRow) {
return NaN;
}
getNumber(row: IDataRow) {
const r = this.getValue(row);
return r == null ? NaN : r;
}
getRawNumber(row: IDataRow) {
return this.getNumber(row);
}
iterNumber(row: IDataRow) {
return [this.getNumber(row)];
}
iterRawNumber(row: IDataRow) {
return [this.getRawNumber(row)];
}
getExportValue(row: IDataRow, format: 'text' | 'json'): any {
if (format === 'json') {
return {
value: this.getRawNumber(row),
children: this.children.map((d) => d.getExportValue(row, format)),
};
}
return super.getExportValue(row, format);
}
toCompareValue(row: IDataRow) {
return NumberColumn.prototype.toCompareValue.call(this, row);
}
toCompareValueType() {
return NumberColumn.prototype.toCompareValueType.call(this);
}
toCompareGroupValue(rows: ISequence<IDataRow>, group: IGroup) {
return NumberColumn.prototype.toCompareGroupValue.call(this, rows, group);
}
toCompareGroupValueType() {
return NumberColumn.prototype.toCompareGroupValueType.call(this);
}
getRenderer(): string {
return NumberColumn.prototype.getRenderer.call(this);
}
}