flowerbi-dates 3.10.1 → 3.10.3
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.
- package/dist/fillDates.js +16 -10
- package/dist/fillDates.js.map +1 -1
- package/dist/fillDates.test.js +32 -29
- package/dist/fillDates.test.js.map +1 -1
- package/package.json +1 -1
- package/src/fillDates.test.ts +163 -137
- package/src/fillDates.ts +46 -39
package/dist/fillDates.js
CHANGED
|
@@ -30,7 +30,7 @@ var days = {
|
|
|
30
30
|
},
|
|
31
31
|
increment: function (d) {
|
|
32
32
|
return d.clone().add(1, "day");
|
|
33
|
-
}
|
|
33
|
+
},
|
|
34
34
|
};
|
|
35
35
|
var months = {
|
|
36
36
|
round: function (d) {
|
|
@@ -41,7 +41,7 @@ var months = {
|
|
|
41
41
|
},
|
|
42
42
|
increment: function (d) {
|
|
43
43
|
return d.clone().add(1, "month");
|
|
44
|
-
}
|
|
44
|
+
},
|
|
45
45
|
};
|
|
46
46
|
var quarters = {
|
|
47
47
|
round: function (d) {
|
|
@@ -55,7 +55,7 @@ var quarters = {
|
|
|
55
55
|
},
|
|
56
56
|
increment: function (d) {
|
|
57
57
|
return d.clone().add(3, "months");
|
|
58
|
-
}
|
|
58
|
+
},
|
|
59
59
|
};
|
|
60
60
|
var years = {
|
|
61
61
|
round: function (d) {
|
|
@@ -66,7 +66,7 @@ var years = {
|
|
|
66
66
|
},
|
|
67
67
|
increment: function (d) {
|
|
68
68
|
return d.clone().add(1, "year");
|
|
69
|
-
}
|
|
69
|
+
},
|
|
70
70
|
};
|
|
71
71
|
/**
|
|
72
72
|
* Standard built-in date types. To customise, implement the {@link FillDateType} interface.
|
|
@@ -75,17 +75,20 @@ exports.dateTypes = {
|
|
|
75
75
|
days: days,
|
|
76
76
|
months: months,
|
|
77
77
|
quarters: quarters,
|
|
78
|
-
years: years
|
|
78
|
+
years: years,
|
|
79
79
|
};
|
|
80
80
|
/**
|
|
81
81
|
* Examines a set of dates and chooses the most specific type that includes them all. If
|
|
82
82
|
* all fall on Jan, 1 then `years` is chosen, and so on.
|
|
83
83
|
*/
|
|
84
84
|
function detectDateType(dates) {
|
|
85
|
-
return !dates.every(function (x) { return x.date() === 1; })
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
85
|
+
return !dates.every(function (x) { return x.date() === 1; })
|
|
86
|
+
? exports.dateTypes.days
|
|
87
|
+
: !dates.every(function (x) { return x.month() % 3 === 0; })
|
|
88
|
+
? exports.dateTypes.months
|
|
89
|
+
: !dates.every(function (x) { return x.month() === 0; })
|
|
90
|
+
? exports.dateTypes.quarters
|
|
91
|
+
: exports.dateTypes.years;
|
|
89
92
|
}
|
|
90
93
|
exports.detectDateType = detectDateType;
|
|
91
94
|
/**
|
|
@@ -143,7 +146,10 @@ function fillDates(_a) {
|
|
|
143
146
|
var lower = min ? type.round(parseDate(min)) : undefined;
|
|
144
147
|
for (var _i = 0, records_1 = records; _i < records_1.length; _i++) {
|
|
145
148
|
var record = records_1[_i];
|
|
146
|
-
var
|
|
149
|
+
var d = getDate(record);
|
|
150
|
+
if (!d)
|
|
151
|
+
continue;
|
|
152
|
+
var current = parseDate(d);
|
|
147
153
|
for (;;) {
|
|
148
154
|
latest = latest ? type.increment(latest) : lower;
|
|
149
155
|
if (!latest || latest >= current) {
|
package/dist/fillDates.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fillDates.js","sourceRoot":"","sources":["../src/fillDates.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,kDAAwC;AAIxC,SAAS,SAAS,CAAC,GAAa;IAC5B,gEAAgE;IAChE,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE;QACzB,GAAG,GAAG,EAAE,GAAG,GAAG,CAAC;KAClB;IAED,OAAO,IAAA,gBAAM,EAAC,GAAG,CAAC,CAAC;AACvB,CAAC;AAcD,IAAM,IAAI,GAAiB;IACvB,KAAK,YAAC,CAAC;QACH,OAAO,CAAC,CAAC,KAAK,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACpC,CAAC;IACD,MAAM,YAAC,CAAC;QACJ,OAAO,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IACD,SAAS,YAAC,CAAC;QACP,OAAO,CAAC,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IACnC,CAAC;CACJ,CAAC;AAEF,IAAM,MAAM,GAAiB;IACzB,KAAK,YAAC,CAAC;QACH,OAAO,CAAC,CAAC,KAAK,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACtC,CAAC;IACD,MAAM,YAAC,CAAC;QACJ,OAAO,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IAChC,CAAC;IACD,SAAS,YAAC,CAAC;QACP,OAAO,CAAC,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IACrC,CAAC;CACJ,
|
|
1
|
+
{"version":3,"file":"fillDates.js","sourceRoot":"","sources":["../src/fillDates.ts"],"names":[],"mappings":"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"}
|
package/dist/fillDates.test.js
CHANGED
|
@@ -17,39 +17,22 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
17
17
|
var fillDates_1 = require("./fillDates");
|
|
18
18
|
var moment_1 = __importDefault(require("moment"));
|
|
19
19
|
test("detects days", function () {
|
|
20
|
-
expect((0, fillDates_1.detectDateType)([
|
|
21
|
-
(0, moment_1.default)("2021-04-01"),
|
|
22
|
-
(0, moment_1.default)("2020-11-01"),
|
|
23
|
-
(0, moment_1.default)("2020-11-02"),
|
|
24
|
-
(0, moment_1.default)("2022-07-01"),
|
|
25
|
-
])).toBe(fillDates_1.dateTypes.days);
|
|
20
|
+
expect((0, fillDates_1.detectDateType)([(0, moment_1.default)("2021-04-01"), (0, moment_1.default)("2020-11-01"), (0, moment_1.default)("2020-11-02"), (0, moment_1.default)("2022-07-01")])).toBe(fillDates_1.dateTypes.days);
|
|
26
21
|
});
|
|
27
22
|
test("detects months", function () {
|
|
28
|
-
expect((0, fillDates_1.detectDateType)([
|
|
29
|
-
(0, moment_1.default)("2021-04-01"),
|
|
30
|
-
(0, moment_1.default)("2020-11-01"),
|
|
31
|
-
(0, moment_1.default)("2022-07-01"),
|
|
32
|
-
])).toBe(fillDates_1.dateTypes.months);
|
|
23
|
+
expect((0, fillDates_1.detectDateType)([(0, moment_1.default)("2021-04-01"), (0, moment_1.default)("2020-11-01"), (0, moment_1.default)("2022-07-01")])).toBe(fillDates_1.dateTypes.months);
|
|
33
24
|
});
|
|
34
25
|
test("detects quarters", function () {
|
|
35
|
-
expect((0, fillDates_1.detectDateType)([
|
|
36
|
-
(0, moment_1.default)("2021-04-01"),
|
|
37
|
-
(0, moment_1.default)("2020-10-01"),
|
|
38
|
-
(0, moment_1.default)("2022-07-01"),
|
|
39
|
-
])).toBe(fillDates_1.dateTypes.quarters);
|
|
26
|
+
expect((0, fillDates_1.detectDateType)([(0, moment_1.default)("2021-04-01"), (0, moment_1.default)("2020-10-01"), (0, moment_1.default)("2022-07-01")])).toBe(fillDates_1.dateTypes.quarters);
|
|
40
27
|
});
|
|
41
28
|
test("detects years", function () {
|
|
42
|
-
expect((0, fillDates_1.detectDateType)([
|
|
43
|
-
(0, moment_1.default)("2021-01-01"),
|
|
44
|
-
(0, moment_1.default)("2020-01-01"),
|
|
45
|
-
(0, moment_1.default)("2022-01-01"),
|
|
46
|
-
])).toBe(fillDates_1.dateTypes.years);
|
|
29
|
+
expect((0, fillDates_1.detectDateType)([(0, moment_1.default)("2021-01-01"), (0, moment_1.default)("2020-01-01"), (0, moment_1.default)("2022-01-01")])).toBe(fillDates_1.dateTypes.years);
|
|
47
30
|
});
|
|
48
31
|
test("handles empty list", function () {
|
|
49
32
|
expect((0, fillDates_1.fillDates)({
|
|
50
33
|
records: [],
|
|
51
34
|
getDate: function (x) { return 0; },
|
|
52
|
-
fill: function () { return undefined; }
|
|
35
|
+
fill: function () { return undefined; },
|
|
53
36
|
})).toStrictEqual([]);
|
|
54
37
|
});
|
|
55
38
|
test("leaves complete months alone", function () {
|
|
@@ -63,7 +46,7 @@ test("leaves complete months alone", function () {
|
|
|
63
46
|
getDate: function (rec) { return rec.date; },
|
|
64
47
|
fill: function (label, rec) { return (__assign({ label: label, totalSales: 0 }, rec)); },
|
|
65
48
|
min: "2020-04-12",
|
|
66
|
-
max: "2020-07-06"
|
|
49
|
+
max: "2020-07-06",
|
|
67
50
|
})).toStrictEqual([
|
|
68
51
|
{ label: "Apr 2020", date: "2020-04-01", totalSales: 10 },
|
|
69
52
|
{ label: "May 2020", date: "2020-05-01", totalSales: 4 },
|
|
@@ -80,7 +63,7 @@ test("fills in missing months", function () {
|
|
|
80
63
|
{ date: "2020-11-01", totalSales: 3 },
|
|
81
64
|
],
|
|
82
65
|
getDate: function (rec) { return rec.date; },
|
|
83
|
-
fill: function (label, rec) { return (__assign({ label: label, totalSales: 0 }, rec)); }
|
|
66
|
+
fill: function (label, rec) { return (__assign({ label: label, totalSales: 0 }, rec)); },
|
|
84
67
|
})).toStrictEqual([
|
|
85
68
|
{ label: "Apr 2020", date: "2020-04-01", totalSales: 10 },
|
|
86
69
|
{ label: "May 2020", totalSales: 0 },
|
|
@@ -103,7 +86,7 @@ test("fills in missing months and min/max range", function () {
|
|
|
103
86
|
getDate: function (rec) { return rec.date; },
|
|
104
87
|
fill: function (label, rec) { return (__assign({ label: label, totalSales: 0 }, rec)); },
|
|
105
88
|
min: "2020-02-15",
|
|
106
|
-
max: "2020-12-02"
|
|
89
|
+
max: "2020-12-02",
|
|
107
90
|
})).toStrictEqual([
|
|
108
91
|
{ label: "Feb 2020", totalSales: 0 },
|
|
109
92
|
{ label: "Mar 2020", totalSales: 0 },
|
|
@@ -129,7 +112,7 @@ test("leaves complete quarters alone", function () {
|
|
|
129
112
|
getDate: function (rec) { return rec.date; },
|
|
130
113
|
fill: function (label, rec) { return (__assign({ label: label, totalSales: 0 }, rec)); },
|
|
131
114
|
min: "2020-07-12",
|
|
132
|
-
max: "2020-04-06"
|
|
115
|
+
max: "2020-04-06",
|
|
133
116
|
})).toStrictEqual([
|
|
134
117
|
{ label: "Jul-Sep 2020", date: "2020-07-01", totalSales: 10 },
|
|
135
118
|
{ label: "Oct-Dec 2020", date: "2020-10-01", totalSales: 4 },
|
|
@@ -147,7 +130,7 @@ test("fills in missing quarters", function () {
|
|
|
147
130
|
],
|
|
148
131
|
type: fillDates_1.dateTypes.quarters,
|
|
149
132
|
getDate: function (rec) { return rec.date; },
|
|
150
|
-
fill: function (label, rec) { return (__assign({ label: label, totalSales: 0 }, rec)); }
|
|
133
|
+
fill: function (label, rec) { return (__assign({ label: label, totalSales: 0 }, rec)); },
|
|
151
134
|
})).toStrictEqual([
|
|
152
135
|
{ label: "Apr-Jun 2020", date: "2020-04-01", totalSales: 10 },
|
|
153
136
|
{ label: "Jul-Sep 2020", totalSales: 0 },
|
|
@@ -170,7 +153,7 @@ test("fills in missing quarters and min/max range", function () {
|
|
|
170
153
|
getDate: function (rec) { return rec.date; },
|
|
171
154
|
fill: function (label, rec) { return (__assign({ label: label, totalSales: 0 }, rec)); },
|
|
172
155
|
min: "2019-10-10",
|
|
173
|
-
max: "2022-01-06"
|
|
156
|
+
max: "2022-01-06",
|
|
174
157
|
})).toStrictEqual([
|
|
175
158
|
{ label: "Oct-Dec 2019", totalSales: 0 },
|
|
176
159
|
{ label: "Jan-Mar 2020", totalSales: 0 },
|
|
@@ -194,7 +177,7 @@ test("explicit type overrides detection", function () {
|
|
|
194
177
|
],
|
|
195
178
|
getDate: function (rec) { return rec.date; },
|
|
196
179
|
fill: function (label, rec) { return (__assign({ label: label, totalSales: 0 }, rec)); },
|
|
197
|
-
type: fillDates_1.dateTypes.months
|
|
180
|
+
type: fillDates_1.dateTypes.months,
|
|
198
181
|
})).toStrictEqual([
|
|
199
182
|
{ label: "Jul 2020", date: "2020-07-01", totalSales: 10 },
|
|
200
183
|
{ label: "Aug 2020", totalSales: 0 },
|
|
@@ -208,4 +191,24 @@ test("explicit type overrides detection", function () {
|
|
|
208
191
|
{ label: "Apr 2021", date: "2021-04-01", totalSales: 3 },
|
|
209
192
|
]);
|
|
210
193
|
});
|
|
194
|
+
test("skips any rogue null dates", function () {
|
|
195
|
+
expect((0, fillDates_1.fillDates)({
|
|
196
|
+
records: [
|
|
197
|
+
{ date: null, totalSales: 10 },
|
|
198
|
+
{ date: "2020-06-01", totalSales: 4 },
|
|
199
|
+
{ date: "2020-07-01", totalSales: 9 },
|
|
200
|
+
{ date: "2020-11-01", totalSales: 3 },
|
|
201
|
+
],
|
|
202
|
+
getDate: function (rec) { return rec.date; },
|
|
203
|
+
fill: function (label, rec) { return (__assign({ label: label, totalSales: 0 }, rec)); },
|
|
204
|
+
type: fillDates_1.dateTypes.months,
|
|
205
|
+
})).toStrictEqual([
|
|
206
|
+
{ label: "Jun 2020", date: "2020-06-01", totalSales: 4 },
|
|
207
|
+
{ label: "Jul 2020", date: "2020-07-01", totalSales: 9 },
|
|
208
|
+
{ label: "Aug 2020", totalSales: 0 },
|
|
209
|
+
{ label: "Sep 2020", totalSales: 0 },
|
|
210
|
+
{ label: "Oct 2020", totalSales: 0 },
|
|
211
|
+
{ label: "Nov 2020", date: "2020-11-01", totalSales: 3 },
|
|
212
|
+
]);
|
|
213
|
+
});
|
|
211
214
|
//# sourceMappingURL=fillDates.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fillDates.test.js","sourceRoot":"","sources":["../src/fillDates.test.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,yCAAmE;AACnE,kDAA4B;AAE5B,IAAI,CAAC,cAAc,EAAE;IACjB,MAAM,CAAC,IAAA,0BAAc,EAAC
|
|
1
|
+
{"version":3,"file":"fillDates.test.js","sourceRoot":"","sources":["../src/fillDates.test.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/fillDates.test.ts
CHANGED
|
@@ -2,64 +2,51 @@ import { fillDates, dateTypes, detectDateType } from "./fillDates";
|
|
|
2
2
|
import moment from "moment";
|
|
3
3
|
|
|
4
4
|
test("detects days", () => {
|
|
5
|
-
expect(detectDateType([
|
|
6
|
-
moment("2021-04-01"),
|
|
7
|
-
moment("2020-11-01"),
|
|
8
|
-
moment("2020-11-02"),
|
|
9
|
-
moment("2022-07-01"),
|
|
10
|
-
])).toBe(dateTypes.days);
|
|
5
|
+
expect(detectDateType([moment("2021-04-01"), moment("2020-11-01"), moment("2020-11-02"), moment("2022-07-01")])).toBe(dateTypes.days);
|
|
11
6
|
});
|
|
12
7
|
|
|
13
8
|
test("detects months", () => {
|
|
14
|
-
expect(detectDateType([
|
|
15
|
-
moment("2021-04-01"),
|
|
16
|
-
moment("2020-11-01"),
|
|
17
|
-
moment("2022-07-01"),
|
|
18
|
-
])).toBe(dateTypes.months);
|
|
9
|
+
expect(detectDateType([moment("2021-04-01"), moment("2020-11-01"), moment("2022-07-01")])).toBe(dateTypes.months);
|
|
19
10
|
});
|
|
20
11
|
|
|
21
12
|
test("detects quarters", () => {
|
|
22
|
-
expect(detectDateType([
|
|
23
|
-
moment("2021-04-01"),
|
|
24
|
-
moment("2020-10-01"),
|
|
25
|
-
moment("2022-07-01"),
|
|
26
|
-
])).toBe(dateTypes.quarters);
|
|
13
|
+
expect(detectDateType([moment("2021-04-01"), moment("2020-10-01"), moment("2022-07-01")])).toBe(dateTypes.quarters);
|
|
27
14
|
});
|
|
28
15
|
|
|
29
16
|
test("detects years", () => {
|
|
30
|
-
expect(detectDateType([
|
|
31
|
-
moment("2021-01-01"),
|
|
32
|
-
moment("2020-01-01"),
|
|
33
|
-
moment("2022-01-01"),
|
|
34
|
-
])).toBe(dateTypes.years);
|
|
17
|
+
expect(detectDateType([moment("2021-01-01"), moment("2020-01-01"), moment("2022-01-01")])).toBe(dateTypes.years);
|
|
35
18
|
});
|
|
36
19
|
|
|
37
20
|
test("handles empty list", () => {
|
|
38
|
-
expect(
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
21
|
+
expect(
|
|
22
|
+
fillDates({
|
|
23
|
+
records: [],
|
|
24
|
+
getDate: (x) => 0,
|
|
25
|
+
fill: () => undefined,
|
|
26
|
+
})
|
|
27
|
+
).toStrictEqual([]);
|
|
43
28
|
});
|
|
44
29
|
|
|
45
30
|
test("leaves complete months alone", () => {
|
|
46
|
-
expect(
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
label,
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
31
|
+
expect(
|
|
32
|
+
fillDates({
|
|
33
|
+
records: [
|
|
34
|
+
{ date: "2020-04-01", totalSales: 10 },
|
|
35
|
+
{ date: "2020-05-01", totalSales: 4 },
|
|
36
|
+
{ date: "2020-06-01", totalSales: 9 },
|
|
37
|
+
{ date: "2020-07-01", totalSales: 3 },
|
|
38
|
+
],
|
|
39
|
+
getDate: (rec) => rec.date,
|
|
40
|
+
fill: (label, rec) => ({
|
|
41
|
+
label,
|
|
42
|
+
totalSales: 0,
|
|
43
|
+
...rec,
|
|
44
|
+
}),
|
|
45
|
+
min: "2020-04-12",
|
|
46
|
+
max: "2020-07-06",
|
|
47
|
+
})
|
|
48
|
+
).toStrictEqual([
|
|
49
|
+
{ label: "Apr 2020", date: "2020-04-01", totalSales: 10 },
|
|
63
50
|
{ label: "May 2020", date: "2020-05-01", totalSales: 4 },
|
|
64
51
|
{ label: "Jun 2020", date: "2020-06-01", totalSales: 9 },
|
|
65
52
|
{ label: "Jul 2020", date: "2020-07-01", totalSales: 3 },
|
|
@@ -67,20 +54,22 @@ test("leaves complete months alone", () => {
|
|
|
67
54
|
});
|
|
68
55
|
|
|
69
56
|
test("fills in missing months", () => {
|
|
70
|
-
expect(
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
label,
|
|
80
|
-
|
|
81
|
-
|
|
57
|
+
expect(
|
|
58
|
+
fillDates({
|
|
59
|
+
records: [
|
|
60
|
+
{ date: "2020-04-01", totalSales: 10 },
|
|
61
|
+
{ date: "2020-06-01", totalSales: 4 },
|
|
62
|
+
{ date: "2020-07-01", totalSales: 9 },
|
|
63
|
+
{ date: "2020-11-01", totalSales: 3 },
|
|
64
|
+
],
|
|
65
|
+
getDate: (rec) => rec.date,
|
|
66
|
+
fill: (label, rec) => ({
|
|
67
|
+
label,
|
|
68
|
+
totalSales: 0,
|
|
69
|
+
...rec,
|
|
70
|
+
}),
|
|
82
71
|
})
|
|
83
|
-
|
|
72
|
+
).toStrictEqual([
|
|
84
73
|
{ label: "Apr 2020", date: "2020-04-01", totalSales: 10 },
|
|
85
74
|
{ label: "May 2020", totalSales: 0 },
|
|
86
75
|
{ label: "Jun 2020", date: "2020-06-01", totalSales: 4 },
|
|
@@ -93,22 +82,24 @@ test("fills in missing months", () => {
|
|
|
93
82
|
});
|
|
94
83
|
|
|
95
84
|
test("fills in missing months and min/max range", () => {
|
|
96
|
-
expect(
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
label,
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
85
|
+
expect(
|
|
86
|
+
fillDates({
|
|
87
|
+
records: [
|
|
88
|
+
{ date: "2020-04-01", totalSales: 10 },
|
|
89
|
+
{ date: "2020-06-01", totalSales: 4 },
|
|
90
|
+
{ date: "2020-07-01", totalSales: 9 },
|
|
91
|
+
{ date: "2020-11-01", totalSales: 3 },
|
|
92
|
+
],
|
|
93
|
+
getDate: (rec) => rec.date,
|
|
94
|
+
fill: (label, rec) => ({
|
|
95
|
+
label,
|
|
96
|
+
totalSales: 0,
|
|
97
|
+
...rec,
|
|
98
|
+
}),
|
|
99
|
+
min: "2020-02-15",
|
|
100
|
+
max: "2020-12-02",
|
|
101
|
+
})
|
|
102
|
+
).toStrictEqual([
|
|
112
103
|
{ label: "Feb 2020", totalSales: 0 },
|
|
113
104
|
{ label: "Mar 2020", totalSales: 0 },
|
|
114
105
|
{ label: "Apr 2020", date: "2020-04-01", totalSales: 10 },
|
|
@@ -124,23 +115,25 @@ test("fills in missing months and min/max range", () => {
|
|
|
124
115
|
});
|
|
125
116
|
|
|
126
117
|
test("leaves complete quarters alone", () => {
|
|
127
|
-
expect(
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
label,
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
118
|
+
expect(
|
|
119
|
+
fillDates({
|
|
120
|
+
records: [
|
|
121
|
+
{ date: "2020-07-01", totalSales: 10 },
|
|
122
|
+
{ date: "2020-10-01", totalSales: 4 },
|
|
123
|
+
{ date: "2021-01-01", totalSales: 9 },
|
|
124
|
+
{ date: "2021-04-01", totalSales: 3 },
|
|
125
|
+
],
|
|
126
|
+
getDate: (rec) => rec.date,
|
|
127
|
+
fill: (label, rec) => ({
|
|
128
|
+
label,
|
|
129
|
+
totalSales: 0,
|
|
130
|
+
...rec,
|
|
131
|
+
}),
|
|
132
|
+
min: "2020-07-12",
|
|
133
|
+
max: "2020-04-06",
|
|
134
|
+
})
|
|
135
|
+
).toStrictEqual([
|
|
136
|
+
{ label: "Jul-Sep 2020", date: "2020-07-01", totalSales: 10 },
|
|
144
137
|
{ label: "Oct-Dec 2020", date: "2020-10-01", totalSales: 4 },
|
|
145
138
|
{ label: "Jan-Mar 2021", date: "2021-01-01", totalSales: 9 },
|
|
146
139
|
{ label: "Apr-Jun 2021", date: "2021-04-01", totalSales: 3 },
|
|
@@ -148,49 +141,53 @@ test("leaves complete quarters alone", () => {
|
|
|
148
141
|
});
|
|
149
142
|
|
|
150
143
|
test("fills in missing quarters", () => {
|
|
151
|
-
expect(
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
label,
|
|
162
|
-
|
|
163
|
-
|
|
144
|
+
expect(
|
|
145
|
+
fillDates({
|
|
146
|
+
records: [
|
|
147
|
+
{ date: "2020-04-01", totalSales: 10 },
|
|
148
|
+
{ date: "2020-10-01", totalSales: 4 },
|
|
149
|
+
{ date: "2021-01-01", totalSales: 9 },
|
|
150
|
+
{ date: "2021-10-01", totalSales: 3 },
|
|
151
|
+
],
|
|
152
|
+
type: dateTypes.quarters,
|
|
153
|
+
getDate: (rec) => rec.date,
|
|
154
|
+
fill: (label, rec) => ({
|
|
155
|
+
label,
|
|
156
|
+
totalSales: 0,
|
|
157
|
+
...rec,
|
|
158
|
+
}),
|
|
164
159
|
})
|
|
165
|
-
|
|
160
|
+
).toStrictEqual([
|
|
166
161
|
{ label: "Apr-Jun 2020", date: "2020-04-01", totalSales: 10 },
|
|
167
162
|
{ label: "Jul-Sep 2020", totalSales: 0 },
|
|
168
163
|
{ label: "Oct-Dec 2020", date: "2020-10-01", totalSales: 4 },
|
|
169
164
|
{ label: "Jan-Mar 2021", date: "2021-01-01", totalSales: 9 },
|
|
170
165
|
{ label: "Apr-Jun 2021", totalSales: 0 },
|
|
171
|
-
{ label: "Jul-Sep 2021", totalSales: 0 },
|
|
166
|
+
{ label: "Jul-Sep 2021", totalSales: 0 },
|
|
172
167
|
{ label: "Oct-Dec 2021", date: "2021-10-01", totalSales: 3 },
|
|
173
168
|
]);
|
|
174
169
|
});
|
|
175
170
|
|
|
176
171
|
test("fills in missing quarters and min/max range", () => {
|
|
177
|
-
expect(
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
label,
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
172
|
+
expect(
|
|
173
|
+
fillDates({
|
|
174
|
+
records: [
|
|
175
|
+
{ date: "2020-04-01", totalSales: 10 },
|
|
176
|
+
{ date: "2020-10-01", totalSales: 4 },
|
|
177
|
+
{ date: "2021-01-01", totalSales: 9 },
|
|
178
|
+
{ date: "2021-10-01", totalSales: 3 },
|
|
179
|
+
],
|
|
180
|
+
type: dateTypes.quarters,
|
|
181
|
+
getDate: (rec) => rec.date,
|
|
182
|
+
fill: (label, rec) => ({
|
|
183
|
+
label,
|
|
184
|
+
totalSales: 0,
|
|
185
|
+
...rec,
|
|
186
|
+
}),
|
|
187
|
+
min: "2019-10-10",
|
|
188
|
+
max: "2022-01-06",
|
|
189
|
+
})
|
|
190
|
+
).toStrictEqual([
|
|
194
191
|
{ label: "Oct-Dec 2019", totalSales: 0 },
|
|
195
192
|
{ label: "Jan-Mar 2020", totalSales: 0 },
|
|
196
193
|
{ label: "Apr-Jun 2020", date: "2020-04-01", totalSales: 10 },
|
|
@@ -205,21 +202,23 @@ test("fills in missing quarters and min/max range", () => {
|
|
|
205
202
|
});
|
|
206
203
|
|
|
207
204
|
test("explicit type overrides detection", () => {
|
|
208
|
-
expect(
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
label,
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
205
|
+
expect(
|
|
206
|
+
fillDates({
|
|
207
|
+
records: [
|
|
208
|
+
{ date: "2020-07-01", totalSales: 10 },
|
|
209
|
+
{ date: "2020-10-01", totalSales: 4 },
|
|
210
|
+
{ date: "2021-01-01", totalSales: 9 },
|
|
211
|
+
{ date: "2021-04-01", totalSales: 3 },
|
|
212
|
+
],
|
|
213
|
+
getDate: (rec) => rec.date,
|
|
214
|
+
fill: (label, rec) => ({
|
|
215
|
+
label,
|
|
216
|
+
totalSales: 0,
|
|
217
|
+
...rec,
|
|
218
|
+
}),
|
|
219
|
+
type: dateTypes.months,
|
|
220
|
+
})
|
|
221
|
+
).toStrictEqual([
|
|
223
222
|
{ label: "Jul 2020", date: "2020-07-01", totalSales: 10 },
|
|
224
223
|
{ label: "Aug 2020", totalSales: 0 },
|
|
225
224
|
{ label: "Sep 2020", totalSales: 0 },
|
|
@@ -231,4 +230,31 @@ test("explicit type overrides detection", () => {
|
|
|
231
230
|
{ label: "Mar 2021", totalSales: 0 },
|
|
232
231
|
{ label: "Apr 2021", date: "2021-04-01", totalSales: 3 },
|
|
233
232
|
]);
|
|
234
|
-
});
|
|
233
|
+
});
|
|
234
|
+
|
|
235
|
+
test("skips any rogue null dates", () => {
|
|
236
|
+
expect(
|
|
237
|
+
fillDates({
|
|
238
|
+
records: [
|
|
239
|
+
{ date: null, totalSales: 10 },
|
|
240
|
+
{ date: "2020-06-01", totalSales: 4 },
|
|
241
|
+
{ date: "2020-07-01", totalSales: 9 },
|
|
242
|
+
{ date: "2020-11-01", totalSales: 3 },
|
|
243
|
+
],
|
|
244
|
+
getDate: (rec) => rec.date!,
|
|
245
|
+
fill: (label, rec) => ({
|
|
246
|
+
label,
|
|
247
|
+
totalSales: 0,
|
|
248
|
+
...rec,
|
|
249
|
+
}),
|
|
250
|
+
type: dateTypes.months,
|
|
251
|
+
})
|
|
252
|
+
).toStrictEqual([
|
|
253
|
+
{ label: "Jun 2020", date: "2020-06-01", totalSales: 4 },
|
|
254
|
+
{ label: "Jul 2020", date: "2020-07-01", totalSales: 9 },
|
|
255
|
+
{ label: "Aug 2020", totalSales: 0 },
|
|
256
|
+
{ label: "Sep 2020", totalSales: 0 },
|
|
257
|
+
{ label: "Oct 2020", totalSales: 0 },
|
|
258
|
+
{ label: "Nov 2020", date: "2020-11-01", totalSales: 3 },
|
|
259
|
+
]);
|
|
260
|
+
});
|
package/src/fillDates.ts
CHANGED
|
@@ -21,7 +21,7 @@ export type FillDateType = {
|
|
|
21
21
|
format(d: Moment): string;
|
|
22
22
|
/** Increment the date by the unit. The given date will already be rounded down. */
|
|
23
23
|
increment(d: Moment): Moment;
|
|
24
|
-
}
|
|
24
|
+
};
|
|
25
25
|
|
|
26
26
|
const days: FillDateType = {
|
|
27
27
|
round(d) {
|
|
@@ -32,7 +32,7 @@ const days: FillDateType = {
|
|
|
32
32
|
},
|
|
33
33
|
increment(d) {
|
|
34
34
|
return d.clone().add(1, "day");
|
|
35
|
-
}
|
|
35
|
+
},
|
|
36
36
|
};
|
|
37
37
|
|
|
38
38
|
const months: FillDateType = {
|
|
@@ -44,8 +44,8 @@ const months: FillDateType = {
|
|
|
44
44
|
},
|
|
45
45
|
increment(d) {
|
|
46
46
|
return d.clone().add(1, "month");
|
|
47
|
-
}
|
|
48
|
-
}
|
|
47
|
+
},
|
|
48
|
+
};
|
|
49
49
|
|
|
50
50
|
const quarters: FillDateType = {
|
|
51
51
|
round(d) {
|
|
@@ -59,8 +59,8 @@ const quarters: FillDateType = {
|
|
|
59
59
|
},
|
|
60
60
|
increment(d) {
|
|
61
61
|
return d.clone().add(3, "months");
|
|
62
|
-
}
|
|
63
|
-
}
|
|
62
|
+
},
|
|
63
|
+
};
|
|
64
64
|
|
|
65
65
|
const years: FillDateType = {
|
|
66
66
|
round(d) {
|
|
@@ -71,14 +71,17 @@ const years: FillDateType = {
|
|
|
71
71
|
},
|
|
72
72
|
increment(d) {
|
|
73
73
|
return d.clone().add(1, "year");
|
|
74
|
-
}
|
|
75
|
-
}
|
|
74
|
+
},
|
|
75
|
+
};
|
|
76
76
|
|
|
77
77
|
/**
|
|
78
78
|
* Standard built-in date types. To customise, implement the {@link FillDateType} interface.
|
|
79
79
|
*/
|
|
80
80
|
export const dateTypes = {
|
|
81
|
-
days,
|
|
81
|
+
days,
|
|
82
|
+
months,
|
|
83
|
+
quarters,
|
|
84
|
+
years,
|
|
82
85
|
} as const;
|
|
83
86
|
|
|
84
87
|
/**
|
|
@@ -86,10 +89,13 @@ export const dateTypes = {
|
|
|
86
89
|
* all fall on Jan, 1 then `years` is chosen, and so on.
|
|
87
90
|
*/
|
|
88
91
|
export function detectDateType(dates: Moment[]): FillDateType {
|
|
89
|
-
return !dates.every(x => x.date() === 1)
|
|
90
|
-
|
|
91
|
-
!dates.every(x => x.month() === 0)
|
|
92
|
-
dateTypes.
|
|
92
|
+
return !dates.every((x) => x.date() === 1)
|
|
93
|
+
? dateTypes.days
|
|
94
|
+
: !dates.every((x) => x.month() % 3 === 0)
|
|
95
|
+
? dateTypes.months
|
|
96
|
+
: !dates.every((x) => x.month() === 0)
|
|
97
|
+
? dateTypes.quarters
|
|
98
|
+
: dateTypes.years;
|
|
93
99
|
}
|
|
94
100
|
|
|
95
101
|
/** Options for {@link fillDates} function. */
|
|
@@ -100,19 +106,19 @@ export interface FillDatesOptions<T, R> {
|
|
|
100
106
|
type?: FillDateType;
|
|
101
107
|
/** Extracts a date value from a record in the input list. */
|
|
102
108
|
getDate(record: T): FillDate;
|
|
103
|
-
/**
|
|
109
|
+
/**
|
|
104
110
|
* Generate a record for a date, from the formatted {@link dateText} and
|
|
105
111
|
* the input record for that date, if any.
|
|
106
112
|
*/
|
|
107
113
|
fill(dateText: string, record: T | undefined): R;
|
|
108
|
-
/**
|
|
114
|
+
/**
|
|
109
115
|
* The minimum date to generate. It will be rounded down by the {@link type}
|
|
110
|
-
* so doesn't need to be on an exact boundary.
|
|
116
|
+
* so doesn't need to be on an exact boundary.
|
|
111
117
|
*/
|
|
112
118
|
min?: FillDate;
|
|
113
|
-
/**
|
|
119
|
+
/**
|
|
114
120
|
* The maximum date to generate. It will be rounded down by the {@link type}
|
|
115
|
-
* so doesn't need to be on an exact boundary.
|
|
121
|
+
* so doesn't need to be on an exact boundary.
|
|
116
122
|
*/
|
|
117
123
|
max?: FillDate;
|
|
118
124
|
}
|
|
@@ -121,10 +127,10 @@ export interface FillDatesOptions<T, R> {
|
|
|
121
127
|
* When querying for a time series chart, e.g. x-axis is _Month_ and y-axis is
|
|
122
128
|
* _Total Sales_, there may be months where nothing was sold so they are
|
|
123
129
|
* missing from the list of records.
|
|
124
|
-
*
|
|
130
|
+
*
|
|
125
131
|
* To render a proper time-series, we need these gaps to be filled in with
|
|
126
132
|
* runs of fake records that give zero amounts for those months. e.g.
|
|
127
|
-
*
|
|
133
|
+
*
|
|
128
134
|
* ```ts
|
|
129
135
|
* const filled = fillDates({
|
|
130
136
|
* records: [
|
|
@@ -141,64 +147,65 @@ export interface FillDatesOptions<T, R> {
|
|
|
141
147
|
* })
|
|
142
148
|
* });
|
|
143
149
|
* ```
|
|
144
|
-
*
|
|
150
|
+
*
|
|
145
151
|
* In the above example we add a `label` property to all the records, and
|
|
146
|
-
* for the records that fill the gaps we set the `totalSales` property to 0.
|
|
152
|
+
* for the records that fill the gaps we set the `totalSales` property to 0.
|
|
147
153
|
* For the real records, `...rec` will copy the real value of `totalSales`.
|
|
148
|
-
*
|
|
154
|
+
*
|
|
149
155
|
* To do this, we need to know:
|
|
150
|
-
*
|
|
156
|
+
*
|
|
151
157
|
* - how to round a date to the start of a unit (year, month, quarter),
|
|
152
158
|
* - how to increment a date by that unit,
|
|
153
159
|
* - how to format a date to a string for display.
|
|
154
|
-
*
|
|
160
|
+
*
|
|
155
161
|
* These operations are encapsulated by the {@link FillDateType} interface.
|
|
156
162
|
* Several built-in types are provided in {@link dateTypes}, but you can
|
|
157
163
|
* implement your own.
|
|
158
|
-
*
|
|
164
|
+
*
|
|
159
165
|
* Optionally you can also pass `min` and `max` dates, which will cause
|
|
160
166
|
* extra records to be added at the start and end of the range if necessary.
|
|
161
|
-
*
|
|
167
|
+
*
|
|
162
168
|
* If you don't pass a `type`, a suitable type will be detected based on
|
|
163
169
|
* how the input record dates fall on unit boundaries.
|
|
164
170
|
*/
|
|
165
|
-
export function fillDates<T, R>(
|
|
166
|
-
{ records, getDate, fill, min, max, type }: FillDatesOptions<T, R>
|
|
167
|
-
) {
|
|
171
|
+
export function fillDates<T, R>({ records, getDate, fill, min, max, type }: FillDatesOptions<T, R>) {
|
|
168
172
|
records = [...records];
|
|
169
173
|
records.sort((x, y) => parseDate(getDate(x)).diff(parseDate(getDate(y))));
|
|
170
174
|
|
|
171
|
-
type = type ?? detectDateType(records.map(d => parseDate(getDate(d))));
|
|
175
|
+
type = type ?? detectDateType(records.map((d) => parseDate(getDate(d))));
|
|
172
176
|
|
|
173
177
|
const results: R[] = [];
|
|
174
178
|
let latest: Moment | undefined = undefined;
|
|
175
179
|
const lower = min ? type.round(parseDate(min)) : undefined;
|
|
176
|
-
|
|
180
|
+
|
|
177
181
|
for (const record of records) {
|
|
178
|
-
const
|
|
179
|
-
|
|
182
|
+
const d = getDate(record);
|
|
183
|
+
if (!d) continue;
|
|
184
|
+
|
|
185
|
+
const current = parseDate(d);
|
|
186
|
+
|
|
180
187
|
for (;;) {
|
|
181
188
|
latest = latest ? type.increment(latest) : lower;
|
|
182
189
|
if (!latest || latest >= current) {
|
|
183
190
|
break;
|
|
184
191
|
}
|
|
185
192
|
|
|
186
|
-
results.push(fill(type.format(latest), undefined));
|
|
193
|
+
results.push(fill(type.format(latest), undefined));
|
|
187
194
|
}
|
|
188
|
-
|
|
195
|
+
|
|
189
196
|
results.push(fill(type.format(current), record));
|
|
190
197
|
latest = current;
|
|
191
198
|
}
|
|
192
|
-
|
|
199
|
+
|
|
193
200
|
if (latest && max) {
|
|
194
|
-
const upper = type.round(parseDate(max))
|
|
201
|
+
const upper = type.round(parseDate(max));
|
|
195
202
|
for (;;) {
|
|
196
203
|
latest = type.increment(latest);
|
|
197
204
|
if (latest > upper) {
|
|
198
205
|
break;
|
|
199
206
|
}
|
|
200
207
|
|
|
201
|
-
results.push(fill(type.format(latest), undefined));
|
|
208
|
+
results.push(fill(type.format(latest), undefined));
|
|
202
209
|
}
|
|
203
210
|
}
|
|
204
211
|
|