@forestadmin/datasource-customizer 1.37.0 → 1.37.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { DateOperation, DistributionChart, LeaderboardChart, MultipleTimeBasedChart, ObjectiveChart, PercentageChart, SmartChart, TimeBasedChart, ValueChart } from '@forestadmin/datasource-toolkit';
|
|
2
|
-
import { TimeBasedChartOptions } from './types';
|
|
3
2
|
export default class ResultBuilder {
|
|
4
3
|
private static readonly formats;
|
|
5
4
|
value(value: number, previousValue?: number): ValueChart;
|
|
@@ -11,8 +10,6 @@ export default class ResultBuilder {
|
|
|
11
10
|
* @param {Array<{ date: Date; value: number | null }> | Record<string, number>} values -
|
|
12
11
|
* This can be an array of objects with 'date' and 'value' properties,
|
|
13
12
|
* or a record (object) with date-value pairs.
|
|
14
|
-
* @param {TimeBasedChartOptions} options - displayMissingPointsAsZeros:
|
|
15
|
-
* display a continuous line even if some data is missing.
|
|
16
13
|
*
|
|
17
14
|
* @returns {TimeBasedChart} Returns a TimeBasedChart representing the data within the specified
|
|
18
15
|
* time range.
|
|
@@ -30,7 +27,7 @@ export default class ResultBuilder {
|
|
|
30
27
|
timeBased(timeRange: DateOperation, values: Array<{
|
|
31
28
|
date: Date;
|
|
32
29
|
value: number | null;
|
|
33
|
-
}> | Record<string, number | null
|
|
30
|
+
}> | Record<string, number | null>): TimeBasedChart;
|
|
34
31
|
/**
|
|
35
32
|
* Add a MultipleTimeBasedChart based on a time range,
|
|
36
33
|
* an array of dates, and multiple lines of data.
|
|
@@ -41,8 +38,6 @@ export default class ResultBuilder {
|
|
|
41
38
|
* @param {Array<{ label: string; values: Array<number | null> }>} lines - An array of lines,
|
|
42
39
|
* each containing a label and an array of numeric data values (or null)
|
|
43
40
|
* corresponding to the dates.
|
|
44
|
-
* @param {TimeBasedChartOptions} options - displayMissingPointsAsZeros:
|
|
45
|
-
* display a continuous line even if some data is missing.
|
|
46
41
|
*
|
|
47
42
|
* @returns {MultipleTimeBasedChart} Returns a MultipleTimeBasedChart representing multiple
|
|
48
43
|
* lines of data within the specified time range.
|
|
@@ -64,7 +59,7 @@ export default class ResultBuilder {
|
|
|
64
59
|
multipleTimeBased(timeRange: DateOperation, dates: Date[], lines: Array<{
|
|
65
60
|
label: string;
|
|
66
61
|
values: Array<number | null>;
|
|
67
|
-
}
|
|
62
|
+
}>): MultipleTimeBasedChart;
|
|
68
63
|
percentage(value: number): PercentageChart;
|
|
69
64
|
objective(value: number, objective: number): ObjectiveChart;
|
|
70
65
|
leaderboard(obj: Record<string, number>): LeaderboardChart;
|
|
@@ -15,8 +15,6 @@ class ResultBuilder {
|
|
|
15
15
|
* @param {Array<{ date: Date; value: number | null }> | Record<string, number>} values -
|
|
16
16
|
* This can be an array of objects with 'date' and 'value' properties,
|
|
17
17
|
* or a record (object) with date-value pairs.
|
|
18
|
-
* @param {TimeBasedChartOptions} options - displayMissingPointsAsZeros:
|
|
19
|
-
* display a continuous line even if some data is missing.
|
|
20
18
|
*
|
|
21
19
|
* @returns {TimeBasedChart} Returns a TimeBasedChart representing the data within the specified
|
|
22
20
|
* time range.
|
|
@@ -31,17 +29,17 @@ class ResultBuilder {
|
|
|
31
29
|
* ]
|
|
32
30
|
* );
|
|
33
31
|
*/
|
|
34
|
-
timeBased(timeRange, values
|
|
32
|
+
timeBased(timeRange, values) {
|
|
35
33
|
if (!values)
|
|
36
34
|
return [];
|
|
37
35
|
if (Array.isArray(values)) {
|
|
38
|
-
return ResultBuilder.buildTimeBasedChartResult(timeRange, values
|
|
36
|
+
return ResultBuilder.buildTimeBasedChartResult(timeRange, values);
|
|
39
37
|
}
|
|
40
38
|
const formattedValues = Object.entries(values).map(([stringDate, value]) => ({
|
|
41
39
|
date: new Date(stringDate),
|
|
42
40
|
value,
|
|
43
41
|
}));
|
|
44
|
-
return ResultBuilder.buildTimeBasedChartResult(timeRange, formattedValues
|
|
42
|
+
return ResultBuilder.buildTimeBasedChartResult(timeRange, formattedValues);
|
|
45
43
|
}
|
|
46
44
|
/**
|
|
47
45
|
* Add a MultipleTimeBasedChart based on a time range,
|
|
@@ -53,8 +51,6 @@ class ResultBuilder {
|
|
|
53
51
|
* @param {Array<{ label: string; values: Array<number | null> }>} lines - An array of lines,
|
|
54
52
|
* each containing a label and an array of numeric data values (or null)
|
|
55
53
|
* corresponding to the dates.
|
|
56
|
-
* @param {TimeBasedChartOptions} options - displayMissingPointsAsZeros:
|
|
57
|
-
* display a continuous line even if some data is missing.
|
|
58
54
|
*
|
|
59
55
|
* @returns {MultipleTimeBasedChart} Returns a MultipleTimeBasedChart representing multiple
|
|
60
56
|
* lines of data within the specified time range.
|
|
@@ -73,7 +69,7 @@ class ResultBuilder {
|
|
|
73
69
|
* ],
|
|
74
70
|
* );
|
|
75
71
|
*/
|
|
76
|
-
multipleTimeBased(timeRange, dates, lines
|
|
72
|
+
multipleTimeBased(timeRange, dates, lines) {
|
|
77
73
|
if (!dates || !lines)
|
|
78
74
|
return { labels: null, values: null };
|
|
79
75
|
let formattedTimes = null;
|
|
@@ -82,7 +78,7 @@ class ResultBuilder {
|
|
|
82
78
|
computed.push({ date, value: line.values[index] });
|
|
83
79
|
return computed;
|
|
84
80
|
}, []);
|
|
85
|
-
const buildTimeBased = ResultBuilder.buildTimeBasedChartResult(timeRange, values
|
|
81
|
+
const buildTimeBased = ResultBuilder.buildTimeBasedChartResult(timeRange, values);
|
|
86
82
|
if (!formattedTimes)
|
|
87
83
|
formattedTimes = buildTimeBased.map(timeBased => timeBased.label);
|
|
88
84
|
return { key: line.label, values: buildTimeBased.map(timeBased => timeBased.values.value) };
|
|
@@ -120,7 +116,7 @@ class ResultBuilder {
|
|
|
120
116
|
* { label: 'Feb 22', values: { value: 6 } },
|
|
121
117
|
* ]
|
|
122
118
|
*/
|
|
123
|
-
static buildTimeBasedChartResult(timeRange, points
|
|
119
|
+
static buildTimeBasedChartResult(timeRange, points) {
|
|
124
120
|
if (!points.length)
|
|
125
121
|
return [];
|
|
126
122
|
const pointsInDateTime = points.map(point => ({
|
|
@@ -140,10 +136,9 @@ class ResultBuilder {
|
|
|
140
136
|
.sort((dateA, dateB) => dateA.toUnixInteger() - dateB.toUnixInteger());
|
|
141
137
|
const first = dates[0].startOf(timeRange.toLowerCase());
|
|
142
138
|
const last = dates[dates.length - 1];
|
|
143
|
-
const defaultValue = options?.displayMissingPointsAsZeros ? 0 : null;
|
|
144
139
|
for (let current = first; current <= last; current = current.plus({ [timeRange]: 1 })) {
|
|
145
140
|
const label = current.toFormat(format);
|
|
146
|
-
dataPoints.push({ label, values: { value: formatted[label] ??
|
|
141
|
+
dataPoints.push({ label, values: { value: formatted[label] ?? 0 } });
|
|
147
142
|
}
|
|
148
143
|
return dataPoints;
|
|
149
144
|
}
|
|
@@ -155,4 +150,4 @@ ResultBuilder.formats = {
|
|
|
155
150
|
Month: 'MMM yy',
|
|
156
151
|
Year: 'yyyy',
|
|
157
152
|
};
|
|
158
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
153
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzdWx0LWJ1aWxkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZGVjb3JhdG9ycy9jaGFydC9yZXN1bHQtYnVpbGRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQVdBLGlDQUErQztBQUUvQyxNQUFxQixhQUFhO0lBUWhDLEtBQUssQ0FBQyxLQUFhLEVBQUUsYUFBc0I7UUFDekMsT0FBTyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFLGFBQWEsRUFBRSxDQUFDO0lBQy9ELENBQUM7SUFFRCxZQUFZLENBQUMsR0FBMkI7UUFDdEMsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNyRSxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O09Bb0JHO0lBQ0gsU0FBUyxDQUNQLFNBQXdCLEVBQ3hCLE1BQW1GO1FBRW5GLElBQUksQ0FBQyxNQUFNO1lBQUUsT0FBTyxFQUFFLENBQUM7UUFFdkIsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQ3pCLE9BQU8sYUFBYSxDQUFDLHlCQUF5QixDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsQ0FBQztTQUNuRTtRQUVELE1BQU0sZUFBZSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDM0UsSUFBSSxFQUFFLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQztZQUMxQixLQUFLO1NBQ04sQ0FBQyxDQUFDLENBQUM7UUFFSixPQUFPLGFBQWEsQ0FBQyx5QkFBeUIsQ0FBQyxTQUFTLEVBQUUsZUFB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
|
|
@@ -5,7 +5,4 @@ import AgentCustomizationContext from '../../context/agent-context';
|
|
|
5
5
|
import { TCollectionName, TSchema } from '../../templates';
|
|
6
6
|
export type DataSourceChartDefinition<S extends TSchema = TSchema> = (context: AgentCustomizationContext<S>, resultBuilder: ResultBuilder) => Promise<Chart> | Chart;
|
|
7
7
|
export type CollectionChartDefinition<S extends TSchema = TSchema, N extends TCollectionName<S> = TCollectionName<S>> = (context: CollectionChartContext<S, N>, resultBuilder: ResultBuilder) => Promise<Chart> | Chart;
|
|
8
|
-
export type TimeBasedChartOptions = {
|
|
9
|
-
displayMissingPointsAsZeros?: boolean;
|
|
10
|
-
};
|
|
11
8
|
//# sourceMappingURL=types.d.ts.map
|