-
Notifications
You must be signed in to change notification settings - Fork 1.3k
Expand file tree
/
Copy pathselectionData.ts
More file actions
123 lines (106 loc) · 4.96 KB
/
selectionData.ts
File metadata and controls
123 lines (106 loc) · 4.96 KB
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
112
113
114
115
116
117
118
119
120
121
122
123
// ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
// ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃
// ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃
// ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃
// ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃
// ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
// ┃ Copyright (c) 2017, the Perspective Authors. ┃
// ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃
// ┃ This file is part of the Perspective library, distributed under the terms ┃
// ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃
// ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
import { Settings } from "../types";
export function toValue(type, value) {
switch (type) {
case "date":
case "datetime":
return value instanceof Date
? value
: new Date(parseInt(value)).toLocaleString([], {
dateStyle: "short",
timeStyle: "medium",
});
case "integer":
return parseInt(value, 10);
case "float":
return parseFloat(value);
}
return value;
}
export function getGroupValues(data, settings) {
if (settings.crossValues.length === 0) return [];
if (data.crossValue.length === 0) return [];
const groupValues = (data.crossValue.split
? data.crossValue.split("|")
: Array.isArray(data.crossValue)
? data.crossValue
: [data.crossValue]) || [data.key];
return groupValues.map((cross, i) => ({
name: settings.crossValues[i].name,
value: toValue(settings.crossValues[i].type, cross),
}));
}
export function getSplitValues(data, settings: Settings) {
if (settings.splitValues.length === 0) return [];
let splitValues = [data.mainValue];
if (data.key) {
splitValues = data.key.split("|");
} else if (data.mainValue?.split) {
splitValues = data.mainValue.split("|");
}
return settings.splitValues.map((split, i) => ({
name: split.name,
value: toValue(split.type, splitValues[i]),
}));
}
export function getDataValues(data, settings) {
if (settings.mainValues.length > 1) {
if (data.mainValues) {
return settings.mainValues.map((main, i) => ({
name: main.name,
value: toValue(main.type, data.mainValues[i]),
}));
}
return settings.mainValues.map((main) => ({
name: main.name,
value: toValue(
main.type,
data.row[getDataRowKey(data.key, main, settings.realValues)]
),
}));
}
return [
{
name: settings.mainValues[0].name,
value: toValue(
settings.mainValues[0].type,
data.colorValue ||
data.mainValue - data.baseValue ||
data.mainValue ||
data.mainValues
),
},
];
}
function getDataRowKey(key, main, realValues) {
if (!key) {
return main.name;
}
if (key.includes("|")) {
const splitKey = key.split("|");
const keyIncludesValidValueName =
splitKey[splitKey.length - 1] === main.name;
if (keyIncludesValidValueName) {
return key;
}
const keyIncludesInvalidValueName = realValues.includes(
splitKey[splitKey.length - 1]
);
const validKeyPrefix = keyIncludesInvalidValueName
? splitKey.slice(0, splitKey.length - 1).join("|")
: key;
return `${validKeyPrefix}|${main.name}`;
}
const keyIsRealValue = realValues.includes(key);
return keyIsRealValue ? main.name : `${key}|${main.name}`;
}