@oneuptime/common 12.0.20 → 12.0.21
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/Models/AnalyticsModels/ChangeEvent.ts +331 -0
- package/Models/AnalyticsModels/Index.ts +2 -0
- package/Server/EnvironmentConfig.ts +1 -8
- package/Server/Infrastructure/Postgres/SchemaMigrations/1789000000000-AddUserSlackAndMicrosoftTeams.ts +42 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +0 -2
- package/Server/Services/ChangeEventService.ts +11 -0
- package/Server/Services/EnterpriseLicenseService.ts +3 -3
- package/Server/Services/Index.ts +2 -0
- package/Server/Utils/Attribution.ts +11 -11
- package/Server/Utils/Marketing/MarketingEventWebhook.ts +4 -5
- package/Server/Utils/Telemetry/ChangeEventRow.ts +228 -0
- package/Server/Views/Partials/AnalyticsConsent.ejs +3 -95
- package/Tests/App/Dashboard/DashboardChartWidgetZoom.test.tsx +64 -0
- package/Tests/App/Dashboard/EventOverlayHook.test.tsx +249 -0
- package/Tests/App/Dashboard/InvestigationArtifacts.test.tsx +315 -0
- package/Tests/App/Dashboard/InvestigationDrawer.test.tsx +258 -0
- package/Tests/App/Dashboard/MetricChartsCompare.test.tsx +171 -0
- package/Tests/App/Dashboard/MetricViewCompare.test.tsx +233 -0
- package/Tests/Server/Infrastructure/Postgres/AddUserSlackAndMicrosoftTeamsMigration.test.ts +236 -0
- package/Tests/Server/Utils/AI/SRE/Insights/Detectors/ExceptionIdentity.test.ts +224 -0
- package/Tests/Server/Utils/Attribution.test.ts +4 -5
- package/Tests/Server/Utils/Marketing/MarketingEventUtil.test.ts +2 -2
- package/Tests/Server/Utils/Monitor/MonitorCriteriaExpectationBuilder.test.ts +300 -0
- package/Tests/UI/Components/Charts/ChartGhostSeries.test.tsx +103 -0
- package/Tests/UI/Components/Charts/TooltipEntries.test.ts +44 -8
- package/Tests/Utils/Telemetry/CrossSignalScope.test.ts +13 -2
- package/Types/AnalyticsDatabase/AnalyticsTableName.ts +7 -0
- package/Types/Marketing/Attribution.ts +9 -15
- package/Types/Marketing/MarketingEvent.ts +10 -46
- package/UI/Components/Charts/Area/AreaChart.tsx +15 -0
- package/UI/Components/Charts/ChartGroup/ChartGroup.tsx +16 -1
- package/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.tsx +189 -93
- package/UI/Components/Charts/ChartLibrary/BarChart/BarChart.tsx +6 -1
- package/UI/Components/Charts/ChartLibrary/LineChart/LineChart.tsx +213 -114
- package/UI/Components/Charts/ChartLibrary/Utils/TooltipEntries.ts +42 -27
- package/UI/Components/Charts/Line/LineChart.tsx +15 -0
- package/Utils/Metrics/MetricExplorerUrl.ts +119 -5
- package/Utils/Telemetry/CrossSignalScope.ts +19 -10
- package/build/dist/Models/AnalyticsModels/ChangeEvent.js +298 -0
- package/build/dist/Models/AnalyticsModels/ChangeEvent.js.map +1 -0
- package/build/dist/Models/AnalyticsModels/Index.js +2 -0
- package/build/dist/Models/AnalyticsModels/Index.js.map +1 -1
- package/build/dist/Server/EnvironmentConfig.js +1 -7
- package/build/dist/Server/EnvironmentConfig.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789000000000-AddUserSlackAndMicrosoftTeams.js +39 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789000000000-AddUserSlackAndMicrosoftTeams.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +0 -2
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Services/ChangeEventService.js +9 -0
- package/build/dist/Server/Services/ChangeEventService.js.map +1 -0
- package/build/dist/Server/Services/EnterpriseLicenseService.js +3 -3
- package/build/dist/Server/Services/Index.js +2 -0
- package/build/dist/Server/Services/Index.js.map +1 -1
- package/build/dist/Server/Utils/Attribution.js +6 -6
- package/build/dist/Server/Utils/Marketing/MarketingEventWebhook.js +4 -5
- package/build/dist/Server/Utils/Marketing/MarketingEventWebhook.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/ChangeEventRow.js +150 -0
- package/build/dist/Server/Utils/Telemetry/ChangeEventRow.js.map +1 -0
- package/build/dist/Types/AnalyticsDatabase/AnalyticsTableName.js +7 -0
- package/build/dist/Types/AnalyticsDatabase/AnalyticsTableName.js.map +1 -1
- package/build/dist/Types/Marketing/Attribution.js +9 -15
- package/build/dist/Types/Marketing/Attribution.js.map +1 -1
- package/build/dist/Types/Marketing/MarketingEvent.js +2 -33
- package/build/dist/Types/Marketing/MarketingEvent.js.map +1 -1
- package/build/dist/UI/Components/Charts/Area/AreaChart.js +1 -1
- package/build/dist/UI/Components/Charts/Area/AreaChart.js.map +1 -1
- package/build/dist/UI/Components/Charts/ChartGroup/ChartGroup.js +9 -1
- package/build/dist/UI/Components/Charts/ChartGroup/ChartGroup.js.map +1 -1
- package/build/dist/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.js +92 -38
- package/build/dist/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.js.map +1 -1
- package/build/dist/UI/Components/Charts/ChartLibrary/BarChart/BarChart.js +8 -8
- package/build/dist/UI/Components/Charts/ChartLibrary/BarChart/BarChart.js.map +1 -1
- package/build/dist/UI/Components/Charts/ChartLibrary/LineChart/LineChart.js +95 -37
- package/build/dist/UI/Components/Charts/ChartLibrary/LineChart/LineChart.js.map +1 -1
- package/build/dist/UI/Components/Charts/ChartLibrary/Utils/TooltipEntries.js +39 -24
- package/build/dist/UI/Components/Charts/ChartLibrary/Utils/TooltipEntries.js.map +1 -1
- package/build/dist/UI/Components/Charts/Line/LineChart.js +1 -1
- package/build/dist/UI/Components/Charts/Line/LineChart.js.map +1 -1
- package/build/dist/Utils/Metrics/MetricExplorerUrl.js +81 -0
- package/build/dist/Utils/Metrics/MetricExplorerUrl.js.map +1 -1
- package/build/dist/Utils/Telemetry/CrossSignalScope.js +14 -8
- package/build/dist/Utils/Telemetry/CrossSignalScope.js.map +1 -1
- package/package.json +1 -1
- package/Server/Infrastructure/Postgres/SchemaMigrations/1788900000000-RedactStoredMonitorIngestSecrets.ts +0 -117
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1788900000000-RedactStoredMonitorIngestSecrets.js +0 -106
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1788900000000-RedactStoredMonitorIngestSecrets.js.map +0 -1
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
import OneUptimeDate from "../../../Types/Date";
|
|
2
|
+
import ObjectID from "../../../Types/ObjectID";
|
|
3
|
+
/*
|
|
4
|
+
* Change-event ingest parsing + ClickHouse row building. Pure on purpose
|
|
5
|
+
* (no network, no request objects) so App/Tests can pin every validation
|
|
6
|
+
* rule without a server.
|
|
7
|
+
*/
|
|
8
|
+
/*
|
|
9
|
+
* Events whose source timestamp is outside this window are stamped with
|
|
10
|
+
* the ingestion time instead (original preserved in attributes). The
|
|
11
|
+
* table partitions by toYYYYMMDD(time), so a forged or garbage timestamp
|
|
12
|
+
* must not be allowed to create arbitrary partitions.
|
|
13
|
+
*/
|
|
14
|
+
export const MAX_CHANGE_EVENT_AGE_IN_DAYS = 366;
|
|
15
|
+
export const MAX_CHANGE_EVENT_FUTURE_SKEW_IN_MINUTES = 60;
|
|
16
|
+
// Caps keep a CI script's mistake from becoming a storage problem.
|
|
17
|
+
export const MAX_CHANGE_EVENTS_PER_REQUEST = 100;
|
|
18
|
+
export const MAX_CHANGE_EVENT_TITLE_LENGTH = 500;
|
|
19
|
+
export const MAX_CHANGE_EVENT_DESCRIPTION_LENGTH = 5000;
|
|
20
|
+
export const MAX_CHANGE_EVENT_TYPE_LENGTH = 50;
|
|
21
|
+
export const MAX_CHANGE_EVENT_ATTRIBUTES = 50;
|
|
22
|
+
export const DEFAULT_CHANGE_EVENT_TYPE = "deployment";
|
|
23
|
+
/*
|
|
24
|
+
* Serviceless change events (project-wide markers) have no service
|
|
25
|
+
* retention ladder to consult; deploy markers are tiny and valuable for
|
|
26
|
+
* long-baseline comparisons, so keep them a year.
|
|
27
|
+
*/
|
|
28
|
+
export const DEFAULT_CHANGE_EVENT_RETENTION_IN_DAYS = 365;
|
|
29
|
+
function parseEntryTime(value) {
|
|
30
|
+
if (typeof value === "number" && Number.isFinite(value)) {
|
|
31
|
+
/*
|
|
32
|
+
* Epoch seconds vs milliseconds: anything below 1e12 read as ms would
|
|
33
|
+
* be before 2001 — CI clocks don't say that; treat it as seconds.
|
|
34
|
+
*/
|
|
35
|
+
const ms = value < 1e12 ? value * 1000 : value;
|
|
36
|
+
const date = new Date(ms);
|
|
37
|
+
return Number.isNaN(date.getTime()) ? null : date;
|
|
38
|
+
}
|
|
39
|
+
if (typeof value === "string" && value.trim() !== "") {
|
|
40
|
+
const date = new Date(value);
|
|
41
|
+
return Number.isNaN(date.getTime()) ? null : date;
|
|
42
|
+
}
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Validate one raw ingest entry. Returns null when the entry cannot be a
|
|
47
|
+
* change event at all (no usable title); every other malformation is
|
|
48
|
+
* repaired (defaults, trims, caps) rather than rejected — CI pipelines
|
|
49
|
+
* should not fail a deploy over a long description.
|
|
50
|
+
*/
|
|
51
|
+
export function parseChangeEventIngestEntry(entry) {
|
|
52
|
+
var _a, _b, _c;
|
|
53
|
+
if (!entry || typeof entry !== "object" || Array.isArray(entry)) {
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
56
|
+
const rawTitle = (_a = entry["title"]) !== null && _a !== void 0 ? _a : entry["name"];
|
|
57
|
+
const title = typeof rawTitle === "string"
|
|
58
|
+
? rawTitle.trim().slice(0, MAX_CHANGE_EVENT_TITLE_LENGTH)
|
|
59
|
+
: "";
|
|
60
|
+
if (title === "") {
|
|
61
|
+
return null;
|
|
62
|
+
}
|
|
63
|
+
const rawEventType = (_b = entry["eventType"]) !== null && _b !== void 0 ? _b : entry["type"];
|
|
64
|
+
const eventType = typeof rawEventType === "string" && rawEventType.trim() !== ""
|
|
65
|
+
? rawEventType.trim().toLowerCase().slice(0, MAX_CHANGE_EVENT_TYPE_LENGTH)
|
|
66
|
+
: DEFAULT_CHANGE_EVENT_TYPE;
|
|
67
|
+
const rawDescription = entry["description"];
|
|
68
|
+
const description = typeof rawDescription === "string"
|
|
69
|
+
? rawDescription.trim().slice(0, MAX_CHANGE_EVENT_DESCRIPTION_LENGTH)
|
|
70
|
+
: "";
|
|
71
|
+
const attributes = {};
|
|
72
|
+
const rawAttributes = entry["attributes"];
|
|
73
|
+
if (rawAttributes &&
|
|
74
|
+
typeof rawAttributes === "object" &&
|
|
75
|
+
!Array.isArray(rawAttributes)) {
|
|
76
|
+
for (const key of Object.keys(rawAttributes)) {
|
|
77
|
+
if (key.trim() === "") {
|
|
78
|
+
continue;
|
|
79
|
+
}
|
|
80
|
+
if (Object.keys(attributes).length >= MAX_CHANGE_EVENT_ATTRIBUTES) {
|
|
81
|
+
break;
|
|
82
|
+
}
|
|
83
|
+
const value = rawAttributes[key];
|
|
84
|
+
if (typeof value === "string" ||
|
|
85
|
+
typeof value === "number" ||
|
|
86
|
+
typeof value === "boolean") {
|
|
87
|
+
attributes[key] = String(value);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
return {
|
|
92
|
+
time: parseEntryTime((_c = entry["time"]) !== null && _c !== void 0 ? _c : entry["timestamp"]),
|
|
93
|
+
eventType,
|
|
94
|
+
title,
|
|
95
|
+
description,
|
|
96
|
+
attributes,
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Accept the shapes CI scripts actually send: a bare object (one event),
|
|
101
|
+
* a bare array, or { events: [...] }.
|
|
102
|
+
*/
|
|
103
|
+
export function extractChangeEventEntries(body) {
|
|
104
|
+
if (!body) {
|
|
105
|
+
return [];
|
|
106
|
+
}
|
|
107
|
+
if (Array.isArray(body)) {
|
|
108
|
+
return body.filter((item) => {
|
|
109
|
+
return typeof item === "object" && item !== null && !Array.isArray(item);
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
if (typeof body !== "object") {
|
|
113
|
+
return [];
|
|
114
|
+
}
|
|
115
|
+
const asObject = body;
|
|
116
|
+
const nested = asObject["events"];
|
|
117
|
+
if (Array.isArray(nested)) {
|
|
118
|
+
return extractChangeEventEntries(nested);
|
|
119
|
+
}
|
|
120
|
+
// A single bare event object — but not the {events: <non-array>} shape.
|
|
121
|
+
if (nested === undefined && Object.keys(asObject).length > 0) {
|
|
122
|
+
return [asObject];
|
|
123
|
+
}
|
|
124
|
+
return [];
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* ParsedChangeEventEntry -> ChangeEvent ClickHouse row.
|
|
128
|
+
*/
|
|
129
|
+
export function buildChangeEventDbRow(data) {
|
|
130
|
+
const { parsed, projectId, serviceMetadata, retentionDays } = data;
|
|
131
|
+
const ingestionDate = OneUptimeDate.getCurrentDate();
|
|
132
|
+
let eventTime = parsed.time || ingestionDate;
|
|
133
|
+
let attributes = Object.assign({}, parsed.attributes);
|
|
134
|
+
const ageInDays = OneUptimeDate.getNumberOfDaysBetweenDates(eventTime, ingestionDate);
|
|
135
|
+
const futureSkewInMinutes = (eventTime.getTime() - ingestionDate.getTime()) / (60 * 1000);
|
|
136
|
+
if (Number.isNaN(eventTime.getTime()) ||
|
|
137
|
+
ageInDays > MAX_CHANGE_EVENT_AGE_IN_DAYS ||
|
|
138
|
+
futureSkewInMinutes > MAX_CHANGE_EVENT_FUTURE_SKEW_IN_MINUTES) {
|
|
139
|
+
attributes = Object.assign(Object.assign({}, attributes), { "oneuptime.original_time": String(parsed.time) });
|
|
140
|
+
eventTime = ingestionDate;
|
|
141
|
+
}
|
|
142
|
+
const retentionDate = OneUptimeDate.addRemoveDays(ingestionDate, retentionDays);
|
|
143
|
+
return Object.assign(Object.assign({ _id: ObjectID.generateTimeOrdered().toString(), createdAt: OneUptimeDate.toClickhouseDateTime(ingestionDate), projectId: projectId.toString() }, (serviceMetadata
|
|
144
|
+
? {
|
|
145
|
+
primaryEntityId: serviceMetadata.primaryEntityId.toString(),
|
|
146
|
+
primaryEntityType: serviceMetadata.primaryEntityType,
|
|
147
|
+
}
|
|
148
|
+
: {})), { time: OneUptimeDate.toClickhouseDateTime64(eventTime), eventType: parsed.eventType, title: parsed.title, description: parsed.description, attributes, attributeKeys: Object.keys(attributes).sort(), retentionDate: OneUptimeDate.toClickhouseDateTime(retentionDate) });
|
|
149
|
+
}
|
|
150
|
+
//# sourceMappingURL=ChangeEventRow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ChangeEventRow.js","sourceRoot":"","sources":["../../../../../Server/Utils/Telemetry/ChangeEventRow.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,6 +8,13 @@ var AnalyticsTableName;
|
|
|
8
8
|
* attributes with a keys sidecar for arbitrary-field filtering.
|
|
9
9
|
*/
|
|
10
10
|
AnalyticsTableName["SecurityEvent"] = "SecurityEventItemV1";
|
|
11
|
+
/*
|
|
12
|
+
* Deploy/config-change markers posted by CI/CD, rendered as dashed
|
|
13
|
+
* vertical lines on metric charts. Peer of LogItemV3 in layout (tenant
|
|
14
|
+
* projectId, per-row retentionDate TTL, attributes Map + keys sidecar)
|
|
15
|
+
* but tiny in volume.
|
|
16
|
+
*/
|
|
17
|
+
AnalyticsTableName["ChangeEvent"] = "ChangeEventV1";
|
|
11
18
|
AnalyticsTableName["Metric"] = "MetricItemV3";
|
|
12
19
|
AnalyticsTableName["ExceptionInstance"] = "ExceptionItemV3";
|
|
13
20
|
AnalyticsTableName["Span"] = "SpanItemV3";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AnalyticsTableName.js","sourceRoot":"","sources":["../../../../Types/AnalyticsDatabase/AnalyticsTableName.ts"],"names":[],"mappings":"AAAA,IAAK,
|
|
1
|
+
{"version":3,"file":"AnalyticsTableName.js","sourceRoot":"","sources":["../../../../Types/AnalyticsDatabase/AnalyticsTableName.ts"],"names":[],"mappings":"AAAA,IAAK,kBAoFJ;AApFD,WAAK,kBAAkB;IACrB,uCAAiB,CAAA;IACjB;;;;;OAKG;IACH,2DAAqC,CAAA;IACrC;;;;;OAKG;IACH,mDAA6B,CAAA;IAC7B,6CAAuB,CAAA;IACvB,2DAAqC,CAAA;IACrC,yCAAmB,CAAA;IACnB,iDAA2B,CAAA;IAC3B,mDAA6B,CAAA;IAC7B,+CAAyB,CAAA;IACzB,2DAAqC,CAAA;IACrC,6CAAuB,CAAA;IACvB,6EAAuD,CAAA;IACvD;;;;;OAKG;IACH,6DAAuC,CAAA;IACvC;;;;OAIG;IACH,6EAAuD,CAAA;IACvD;;;;;;OAMG;IACH,+EAAyD,CAAA;IACzD,qFAA+D,CAAA;IAC/D,mFAA6D,CAAA;IAC7D,mEAA6C,CAAA;IAC7C;;;;;;OAMG;IACH,6DAAuC,CAAA;IACvC,2DAAqC,CAAA;IACrC,yDAAmC,CAAA;IACnC;;;;;;;OAOG;IACH,+CAAyB,CAAA;IACzB;;;;;;;;;;;;;OAaG;IACH,iDAA2B,CAAA;IAC3B,2DAAqC,CAAA;AACvC,CAAC,EApFI,kBAAkB,KAAlB,kBAAkB,QAoFtB;AAED,eAAe,kBAAkB,CAAC"}
|
|
@@ -3,19 +3,14 @@
|
|
|
3
3
|
* writes it.
|
|
4
4
|
*
|
|
5
5
|
* Attribution starts in the browser (Home/Views/head-basic.ejs stores it in
|
|
6
|
-
* localStorage) and reaches the server through
|
|
6
|
+
* localStorage) and reaches the server through the signup form
|
|
7
|
+
* (App/FeatureSet/Accounts/src/Pages/Register.tsx), which posts it onto the
|
|
8
|
+
* User record.
|
|
7
9
|
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
* /enterprise/demo, /support, /enterprise/self-hosted — goes through it.
|
|
13
|
-
*
|
|
14
|
-
* Both doors are reachable by an unauthenticated caller, so both must whitelist
|
|
15
|
-
* and length-bound what they accept. Keeping the key lists here rather than in
|
|
16
|
-
* each door means a key added for the browser cannot be silently dropped by one
|
|
17
|
-
* of the readers — which is exactly what happened to UTM parameters on the Cal
|
|
18
|
-
* path, where the webhook parsed click IDs the embed never sent.
|
|
10
|
+
* That door is reachable by an unauthenticated caller, so it must whitelist and
|
|
11
|
+
* length-bound what it accepts. Keeping the key lists here rather than in the
|
|
12
|
+
* door itself means a key added for the browser cannot be silently dropped on
|
|
13
|
+
* arrival.
|
|
19
14
|
*/
|
|
20
15
|
// Ad-platform click identifiers, in the spelling each platform uses on the URL.
|
|
21
16
|
export const AdClickIdKeys = [
|
|
@@ -29,9 +24,8 @@ export const AdClickIdKeys = [
|
|
|
29
24
|
"rdt_cid",
|
|
30
25
|
];
|
|
31
26
|
/*
|
|
32
|
-
* UTM parameters travel as snake_case on a URL and
|
|
33
|
-
*
|
|
34
|
-
* Both spellings are accepted on the way in — Cal booking questions and hand
|
|
27
|
+
* UTM parameters travel as snake_case on a URL and as camelCase once they are
|
|
28
|
+
* columns on User/Project. Both spellings are accepted on the way in — hand
|
|
35
29
|
* written links produce either — and only the camelCase form is stored.
|
|
36
30
|
*/
|
|
37
31
|
export const UtmWireKeyToPropertyKey = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Attribution.js","sourceRoot":"","sources":["../../../../Types/Marketing/Attribution.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"Attribution.js","sourceRoot":"","sources":["../../../../Types/Marketing/Attribution.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,gFAAgF;AAChF,MAAM,CAAC,MAAM,aAAa,GAAkB;IAC1C,OAAO;IACP,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,SAAS;IACT,WAAW;IACX,QAAQ;IACR,SAAS;CACV,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAA2B;IAC7D,UAAU,EAAE,WAAW;IACvB,UAAU,EAAE,WAAW;IACvB,YAAY,EAAE,aAAa;IAC3B,QAAQ,EAAE,SAAS;IACnB,WAAW,EAAE,YAAY;CAC1B,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAAkB,MAAM,CAAC,MAAM,CACzD,uBAAuB,CACxB,CAAC;AAEF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAW,QAAQ,CAAC;AAElD;;;GAGG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAkB;IACjD,GAAG,eAAe;IAClB,YAAY;IACZ,UAAU;IACV,WAAW;CACZ,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAW,GAAG,CAAC"}
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
*
|
|
12
12
|
* - DEDUPLICATION. `eventId` is stable for a given real-world occurrence, so
|
|
13
13
|
* a redelivery carries the id the first attempt did. Retries are expected
|
|
14
|
-
* (the queue retries
|
|
14
|
+
* (the delivery queue retries), so a receiver that keys on
|
|
15
15
|
* anything else will double-count.
|
|
16
16
|
* - ORDERING. Events are delivered per-occurrence with no sequence number.
|
|
17
17
|
* A signup and a plan change seconds apart may arrive either way round;
|
|
@@ -25,7 +25,6 @@
|
|
|
25
25
|
export var MarketingEventType;
|
|
26
26
|
(function (MarketingEventType) {
|
|
27
27
|
MarketingEventType["SignUp"] = "sign_up";
|
|
28
|
-
MarketingEventType["MeetingBooked"] = "meeting_booked";
|
|
29
28
|
/*
|
|
30
29
|
* A project's first paid subscription, created together with the project.
|
|
31
30
|
*
|
|
@@ -44,39 +43,9 @@ export var MarketingEventType;
|
|
|
44
43
|
* whose email is typed in by a human rather than captured from a session —
|
|
45
44
|
* which is exactly what makes it joinable: set EnterpriseLicense.email to
|
|
46
45
|
* the address the customer booked with and this event shares an identity
|
|
47
|
-
* with
|
|
46
|
+
* with whatever else that address has done, months earlier.
|
|
48
47
|
*/
|
|
49
48
|
MarketingEventType["EnterpriseLicenseIssued"] = "enterprise_license_issued";
|
|
50
49
|
})(MarketingEventType || (MarketingEventType = {}));
|
|
51
|
-
/*
|
|
52
|
-
* Which conversation a booked meeting actually is.
|
|
53
|
-
*
|
|
54
|
-
* All three Cal embeds book the same event type (oneuptimehq/demo), so without
|
|
55
|
-
* this the webhook cannot tell a free user's support call from a net-new
|
|
56
|
-
* enterprise demo — they arrive as one undifferentiated `meeting_booked`, and
|
|
57
|
-
* anything bidding on or reporting against that count values them identically.
|
|
58
|
-
*
|
|
59
|
-
* The browser event has carried this since the embeds were instrumented; the
|
|
60
|
-
* webhook did not, which meant the authoritative record was the one that could
|
|
61
|
-
* not make the distinction.
|
|
62
|
-
*
|
|
63
|
-
* `Unknown` is a real state, not a failure: a booking made through a Cal link
|
|
64
|
-
* that was not one of the instrumented embeds genuinely has no kind, and is
|
|
65
|
-
* still a booking worth emitting.
|
|
66
|
-
*/
|
|
67
|
-
export var MeetingBookingKind;
|
|
68
|
-
(function (MeetingBookingKind) {
|
|
69
|
-
MeetingBookingKind["EnterpriseDemo"] = "enterprise_demo";
|
|
70
|
-
MeetingBookingKind["SupportCall"] = "support_call";
|
|
71
|
-
MeetingBookingKind["ArchitectureAssessment"] = "architecture_assessment";
|
|
72
|
-
MeetingBookingKind["Unknown"] = "unknown";
|
|
73
|
-
})(MeetingBookingKind || (MeetingBookingKind = {}));
|
|
74
|
-
/*
|
|
75
|
-
* The Cal booking-metadata key the embeds write and the webhook reads. Shared
|
|
76
|
-
* so a rename cannot land on one side only - the failure mode there is silent,
|
|
77
|
-
* because a booking with no recognised kind still succeeds.
|
|
78
|
-
*/
|
|
79
|
-
export const BOOKING_KIND_METADATA_KEY = "ou_booking_kind";
|
|
80
|
-
export const MeetingBookingKinds = Object.values(MeetingBookingKind);
|
|
81
50
|
export const MARKETING_EVENT_SCHEMA_VERSION = 1;
|
|
82
51
|
//# sourceMappingURL=MarketingEvent.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MarketingEvent.js","sourceRoot":"","sources":["../../../../Types/Marketing/MarketingEvent.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,CAAN,IAAY,
|
|
1
|
+
{"version":3,"file":"MarketingEvent.js","sourceRoot":"","sources":["../../../../Types/Marketing/MarketingEvent.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,CAAN,IAAY,kBAuBX;AAvBD,WAAY,kBAAkB;IAC5B,wCAAkB,CAAA;IAClB;;;;;;;OAOG;IACH,kEAA4C,CAAA;IAC5C,oEAA8C,CAAA;IAC9C,wEAAkD,CAAA;IAClD;;;;;;;;OAQG;IACH,2EAAqD,CAAA;AACvD,CAAC,EAvBW,kBAAkB,KAAlB,kBAAkB,QAuB7B;AAED,MAAM,CAAC,MAAM,8BAA8B,GAAW,CAAC,CAAC"}
|
|
@@ -108,7 +108,7 @@ const AreaChartElement = (props) => {
|
|
|
108
108
|
? formattedTimeReferenceLines
|
|
109
109
|
: undefined, formattedReferenceRegions: formattedReferenceRegions.length > 0
|
|
110
110
|
? formattedReferenceRegions
|
|
111
|
-
: undefined, formattedExemplarPoints: formattedExemplars.length > 0 ? formattedExemplars : undefined, onExemplarClick: props.onExemplarClick, onTimeRangeSelect: props.onTimeRangeSelect, anomalyBandLowerKey: bandLower, anomalyBandUpperKey: bandUpper })),
|
|
111
|
+
: undefined, formattedExemplarPoints: formattedExemplars.length > 0 ? formattedExemplars : undefined, onExemplarClick: props.onExemplarClick, onTimeRangeSelect: props.onTimeRangeSelect, onBucketClick: props.onBucketClick, ghostCategories: props.ghostSeriesNames, anomalyBandLowerKey: bandLower, anomalyBandUpperKey: bandUpper })),
|
|
112
112
|
hasNoData && React.createElement(NoDataMessage, null)));
|
|
113
113
|
};
|
|
114
114
|
export default AreaChartElement;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AreaChart.js","sourceRoot":"","sources":["../../../../../../UI/Components/Charts/Area/AreaChart.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,qCAAqC,CAAC;AAKhE,OAAO,KAAK,EAAE,EAGZ,SAAS,EACT,OAAO,GACR,MAAM,OAAO,CAAC;AAIf,OAAO,UAAU,MAAM,qBAAqB,CAAC;AAC7C,OAAuB,EACrB,2BAA2B,GAC5B,MAAM,sCAAsC,CAAC;AAI9C,OAAO,aAAa,MAAM,oBAAoB,CAAC;AAC/C,OAAO,kBAAkB,MAAM,yBAAyB,CAAC;AAKzD,OAAO,SAAS,MAAM,gBAAgB,CAAC;AACvC,OAAO,aAAa,MAAM,6BAA6B,CAAC;AAExD,MAAM,CAAC,MAAM,gBAAgB,GAAoC;IAC/D,MAAM;IACN,SAAS;IACT,QAAQ;IACR,OAAO;IACP,MAAM;IACN,MAAM;IACN,MAAM;IACN,SAAS;IACT,QAAQ;IACR,MAAM;CACP,CAAC;
|
|
1
|
+
{"version":3,"file":"AreaChart.js","sourceRoot":"","sources":["../../../../../../UI/Components/Charts/Area/AreaChart.tsx"],"names":[],"mappings":"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"}
|
|
@@ -14,7 +14,15 @@ export var ChartType;
|
|
|
14
14
|
ChartType["AREA"] = "area";
|
|
15
15
|
})(ChartType || (ChartType = {}));
|
|
16
16
|
const ChartGroup = (props) => {
|
|
17
|
-
|
|
17
|
+
/*
|
|
18
|
+
* Stable per-mount fallback: a plain const regenerated the id on every
|
|
19
|
+
* render, which forced recharts to tear down and re-subscribe its sync
|
|
20
|
+
* listeners on each parent re-render (auto-refresh ticks included).
|
|
21
|
+
*/
|
|
22
|
+
const [fallbackSyncId] = useState(() => {
|
|
23
|
+
return Text.generateRandomText(10);
|
|
24
|
+
});
|
|
25
|
+
const syncId = props.syncId || fallbackSyncId;
|
|
18
26
|
const [metricInfoModalChart, setMetricInfoModalChart] = useState(null);
|
|
19
27
|
const getChartContent = (chart, index) => {
|
|
20
28
|
/*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChartGroup.js","sourceRoot":"","sources":["../../../../../../UI/Components/Charts/ChartGroup/ChartGroup.tsx"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,wBAAwB,CAAC;AAE1C,OAAO,cAAc,MAAM,kCAAkC,CAAC;AAC9D,OAAO,SAA+C,MAAM,mBAAmB,CAAC;AAChF,OAAO,eAEN,MAAM,iBAAiB,CAAC;AACzB,OAAO,gBAEN,MAAM,mBAAmB,CAAC;AAE3B,OAAO,IAAI,EAAE,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,QAAQ,MAAM,iCAAiC,CAAC;AACvD,OAAO,KAAK,EAAE,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,KAAK,EAAE,EAAmC,QAAQ,EAAE,MAAM,OAAO,CAAC;AAEzE,MAAM,CAAN,IAAY,SAIX;AAJD,WAAY,SAAS;IACnB,0BAAa,CAAA;IACb,wBAAW,CAAA;IACX,0BAAa,CAAA;AACf,CAAC,EAJW,SAAS,KAAT,SAAS,QAIpB;
|
|
1
|
+
{"version":3,"file":"ChartGroup.js","sourceRoot":"","sources":["../../../../../../UI/Components/Charts/ChartGroup/ChartGroup.tsx"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,wBAAwB,CAAC;AAE1C,OAAO,cAAc,MAAM,kCAAkC,CAAC;AAC9D,OAAO,SAA+C,MAAM,mBAAmB,CAAC;AAChF,OAAO,eAEN,MAAM,iBAAiB,CAAC;AACzB,OAAO,gBAEN,MAAM,mBAAmB,CAAC;AAE3B,OAAO,IAAI,EAAE,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,QAAQ,MAAM,iCAAiC,CAAC;AACvD,OAAO,KAAK,EAAE,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,KAAK,EAAE,EAAmC,QAAQ,EAAE,MAAM,OAAO,CAAC;AAEzE,MAAM,CAAN,IAAY,SAIX;AAJD,WAAY,SAAS;IACnB,0BAAa,CAAA;IACb,wBAAW,CAAA;IACX,0BAAa,CAAA;AACf,CAAC,EAJW,SAAS,KAAT,SAAS,QAIpB;AAgDD,MAAM,UAAU,GAAsC,CACpD,KAAqB,EACP,EAAE;IAChB;;;;OAIG;IACH,MAAM,CAAC,cAAc,CAAC,GAAG,QAAQ,CAAS,GAAG,EAAE;QAC7C,OAAO,IAAI,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IACH,MAAM,MAAM,GAAW,KAAK,CAAC,MAAM,IAAI,cAAc,CAAC;IACtD,MAAM,CAAC,oBAAoB,EAAE,uBAAuB,CAAC,GACnD,QAAQ,CAAyB,IAAI,CAAC,CAAC;IAIzC,MAAM,eAAe,GAA4B,CAC/C,KAAY,EACZ,KAAa,EACC,EAAE;QAChB;;;;WAIG;QACH,MAAM,UAAU,GAAY,CAAC,KAAK,CAAC,cAAc,CAAC;QAElD,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;YACnB,KAAK,SAAS,CAAC,IAAI;gBACjB,OAAO,CACL,oBAAC,SAAS,kBACR,GAAG,EAAE,KAAK,IACL,KAAK,CAAC,KAAwB,IACnC,MAAM,EAAE,MAAM,EACd,cAAc,EAAE,KAAK,CAAC,cAAc,EACpC,eAAe,EAAE,KAAK,CAAC,eAAe,EACtC,UAAU,EAAE,UAAU,IACtB,CACH,CAAC;YACJ,KAAK,SAAS,CAAC,GAAG;gBAChB,OAAO,CACL,oBAAC,eAAe,kBACd,GAAG,EAAE,KAAK,IACL,KAAK,CAAC,KAAuB,IAClC,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,UAAU,IACtB,CACH,CAAC;YACJ,KAAK,SAAS,CAAC,IAAI;gBACjB,OAAO,CACL,oBAAC,gBAAgB,kBACf,GAAG,EAAE,KAAK,IACL,KAAK,CAAC,KAAwB,IACnC,MAAM,EAAE,MAAM,EACd,cAAc,EAAE,KAAK,CAAC,cAAc,EACpC,eAAe,EAAE,KAAK,CAAC,eAAe,EACtC,UAAU,EAAE,UAAU,IACtB,CACH,CAAC;YACJ;gBACE,OAAO,yCAAK,CAAC;QACjB,CAAC;IACH,CAAC,CAAC;IAIF,uEAAuE;IACvE,MAAM,iBAAiB,GAA8B,CACnD,KAAY,EACE,EAAE;QAChB,MAAM,uBAAuB,GAC3B,CAAC,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC,IAAI,CAAC;YAChE,OAAO,CACJ,KAAK,CAAC,KAAyC,CAAC,iBAAiB,CACnE,CAAC;QAEJ,IAAI,CAAC,uBAAuB,EAAE,CAAC;YAC7B,OAAO,yCAAK,CAAC;QACf,CAAC;QAED,OAAO,CACL,8BAAM,SAAS,EAAC,8DAA8D,mBAEvE,CACR,CAAC;IACJ,CAAC,CAAC;IAIF,MAAM,WAAW,GAAwB,CAAC,KAAY,EAAgB,EAAE;QACtE,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;YACtB,OAAO,yCAAK,CAAC;QACf,CAAC;QAED,OAAO,CACL,gCACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAC,qJAAqJ,EAC/J,KAAK,EAAC,qBAAqB,EAC3B,OAAO,EAAE,GAAG,EAAE;gBACZ,uBAAuB,CAAC,KAAK,CAAC,UAAU,IAAI,IAAI,CAAC,CAAC;YACpD,CAAC;YAED,oBAAC,IAAI,IACH,IAAI,EAAE,QAAQ,CAAC,iBAAiB,EAChC,IAAI,EAAE,QAAQ,CAAC,OAAO,EACtB,SAAS,EAAC,aAAa,GACvB,CACK,CACV,CAAC;IACJ,CAAC,CAAC;IAIF,MAAM,eAAe,GAA4B,CAC/C,KAAY,EACE,EAAE;QAChB,IAAI,CAAC,KAAK,CAAC,gBAAgB,EAAE,CAAC;YAC5B,OAAO,yCAAK,CAAC;QACf,CAAC;QAED,OAAO,CACL,gCACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAC,qJAAqJ,EAC/J,KAAK,EAAC,yBAAyB,EAC/B,OAAO,EAAE,GAAG,EAAE;;gBACZ,MAAA,KAAK,CAAC,gBAAgB,qDAAI,CAAC;YAC7B,CAAC;YAED,oBAAC,IAAI,IACH,IAAI,EAAE,QAAQ,CAAC,YAAY,EAC3B,IAAI,EAAE,QAAQ,CAAC,OAAO,EACtB,SAAS,EAAC,aAAa,GACvB,CACK,CACV,CAAC;IACJ,CAAC,CAAC;IAEF,MAAM,qBAAqB,GAAuB,GAAiB,EAAE;QACnE,IAAI,CAAC,oBAAoB,EAAE,CAAC;YAC1B,OAAO,yCAAK,CAAC;QACf,CAAC;QAED,MAAM,UAAU,GACd,oBAAoB,CAAC,UAAU,IAAI,EAAE,CAAC;QACxC,MAAM,aAAa,GAAkB,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAE7D;;;;WAIG;QACH,MAAM,WAAW,GAAW,oBAAoB,CAAC,IAAI;YACnD,CAAC,CAAC,cAAc,CAAC,eAAe,CAAC,oBAAoB,CAAC,IAAI,EAAE;gBACxD,UAAU,EAAE,oBAAoB,CAAC,UAAU;aAC5C,CAAC;YACJ,CAAC,CAAC,EAAE,CAAC;QAEP,OAAO,CACL,oBAAC,KAAK,IACJ,KAAK,EAAC,gBAAgB,EACtB,OAAO,EAAE,GAAG,EAAE;gBACZ,uBAAuB,CAAC,IAAI,CAAC,CAAC;YAChC,CAAC,EACD,QAAQ,EAAE,GAAG,EAAE;gBACb,uBAAuB,CAAC,IAAI,CAAC,CAAC;YAChC,CAAC,EACD,gBAAgB,EAAC,OAAO,EACxB,UAAU,EAAE,UAAU,CAAC,MAAM;YAE7B,6BAAK,SAAS,EAAC,WAAW;gBACxB,6BAAK,SAAS,EAAC,kDAAkD;oBAC/D,+BAAO,SAAS,EAAC,gBAAgB;wBAC/B;4BACE,4BAAI,SAAS,EAAC,0BAA0B;gCACtC,4BAAI,SAAS,EAAC,yDAAyD,kBAElE;gCACL,4BAAI,SAAS,EAAC,wCAAwC,IACnD,oBAAoB,CAAC,UAAU,CAC7B,CACF;4BACL,4BAAI,SAAS,EAAC,0BAA0B;gCACtC,4BAAI,SAAS,EAAC,yDAAyD,kBAElE;gCACL,4BAAI,SAAS,EAAC,sBAAsB,IACjC,oBAAoB,CAAC,eAAe,CAClC,CACF;4BACJ,WAAW,IAAI,CACd,4BAAI,SAAS,EAAC,0BAA0B;gCACtC,4BAAI,SAAS,EAAC,yDAAyD,WAElE;gCACL,4BAAI,SAAS,EAAC,sBAAsB,IAAE,WAAW,CAAM,CACpD,CACN;4BACA,oBAAoB,CAAC,gBAAgB,IAAI,CACxC,4BAAI,SAAS,EAAC,0BAA0B;gCACtC,4BAAI,SAAS,EAAC,yDAAyD,iBAElE;gCACL,4BAAI,SAAS,EAAC,wCAAwC,IACnD,oBAAoB,CAAC,gBAAgB,CACnC,CACF,CACN;4BACA,aAAa,CAAC,MAAM,GAAG,CAAC,IAAI,CAC3B;gCACE,4BAAI,SAAS,EAAC,mEAAmE,iBAE5E;gCACL,4BAAI,SAAS,EAAC,QAAQ;oCACpB,6BAAK,SAAS,EAAC,aAAa,IACzB,aAAa,CAAC,GAAG,CAAC,CAAC,GAAW,EAAE,EAAE;wCACjC,OAAO,CACL,6BAAK,GAAG,EAAE,GAAG,EAAE,SAAS,EAAC,yBAAyB;4CAChD,8BAAM,SAAS,EAAC,0FAA0F,IACvG,GAAG,CACC;4CACP,8BAAM,SAAS,EAAC,iCAAiC,IAC9C,UAAU,CAAC,GAAG,CAAC,CACX,CACH,CACP,CAAC;oCACJ,CAAC,CAAC,CACE,CACH,CACF,CACN,CACK,CACF,CACJ,CACF,CACA,CACT,CAAC;IACJ,CAAC,CAAC;IAEF,+EAA+E;IAC/E,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;QACnB,OAAO,CACL;YACG,qBAAqB,EAAE;YACxB,6BAAK,SAAS,EAAC,uCAAuC,IACnD,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAY,EAAE,KAAa,EAAE,EAAE;gBAChD,OAAO,CACL,6BACE,GAAG,EAAE,KAAK,EACV,SAAS,EAAE,YAAY,KAAK,CAAC,aAAa,IAAI,EAAE,8BAA8B;oBAE9E,6BAAK,SAAS,EAAC,qCAAqC;wBAClD,6BAAK,SAAS,EAAC,oCAAoC;4BACjD,6BAAK,SAAS,EAAC,mBAAmB;gCAChC,4BACE,SAAS,EAAC,qEAAqE,EAC/E,KAAK,EAAE,KAAK,CAAC,KAAK,IAEjB,KAAK,CAAC,KAAK,CACT;gCACJ,WAAW,CAAC,KAAK,CAAC;gCAClB,eAAe,CAAC,KAAK,CAAC;gCACtB,iBAAiB,CAAC,KAAK,CAAC,CACrB;4BACL,KAAK,CAAC,WAAW,IAAI,CACpB,2BAAG,SAAS,EAAC,4CAA4C,IACtD,KAAK,CAAC,WAAW,CAChB,CACL,CACG;wBACL,eAAe,CAAC,KAAK,EAAE,KAAK,CAAC;wBAC7B,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,CACtB,6BAAK,SAAS,EAAC,MAAM,IAAE,KAAK,CAAC,cAAc,CAAO,CACnD,CAAC,CAAC,CAAC,IAAI,CACJ,CACF,CACP,CAAC;YACJ,CAAC,CAAC,CACE,CACL,CACJ,CAAC;IACJ,CAAC;IAED,0CAA0C;IAC1C,MAAM,QAAQ,GACZ,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,gBAAgB,CAAC;IAEhE,OAAO,CACL;QACG,qBAAqB,EAAE;QACxB,6BAAK,SAAS,EAAE,oBAAoB,QAAQ,QAAQ,IACjD,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAY,EAAE,KAAa,EAAE,EAAE;YAChD,OAAO,CACL,6BACE,GAAG,EAAE,KAAK,EACV,SAAS,EAAE,sEAAsE,KAAK,CAAC,aAAa,IAAI,EAAE,EAAE;gBAG5G,6BAAK,SAAS,EAAC,sCAAsC;oBACnD,6BAAK,SAAS,EAAC,mBAAmB;wBAChC,2CACc,sBAAsB,EAClC,EAAE,EAAC,sBAAsB,EACzB,SAAS,EAAC,gEAAgE,EAC1E,KAAK,EAAE,KAAK,CAAC,KAAK,IAEjB,KAAK,CAAC,KAAK,CACT;wBACJ,WAAW,CAAC,KAAK,CAAC;wBAClB,eAAe,CAAC,KAAK,CAAC;wBACtB,iBAAiB,CAAC,KAAK,CAAC,CACrB;oBACL,KAAK,CAAC,WAAW,IAAI,CACpB,0CACc,kBAAkB,EAC9B,SAAS,EAAC,8DAA8D,EACxE,KAAK,EAAE,KAAK,CAAC,WAAW,IAEvB,KAAK,CAAC,WAAW,CAChB,CACL,CACG;gBACN,6BAAK,SAAS,EAAC,8CAA8C,IAC1D,eAAe,CAAC,KAAK,EAAE,KAAK,CAAC,CAC1B;gBACL,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,CACtB,6BAAK,SAAS,EAAC,oCAAoC,IAChD,KAAK,CAAC,cAAc,CACjB,CACP,CAAC,CAAC,CAAC,IAAI,CACJ,CACP,CAAC;QACJ,CAAC,CAAC,CACE,CACL,CACJ,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,UAAU,CAAC"}
|
|
@@ -30,6 +30,21 @@ import ChartCurve from "../../Types/ChartCurve";
|
|
|
30
30
|
* entirely (the dashed lines and their click-through remain).
|
|
31
31
|
*/
|
|
32
32
|
const MAX_LABELED_TIME_REFERENCE_LINES = 6;
|
|
33
|
+
/*
|
|
34
|
+
* recharts invokes child event handlers with varying shapes ((event) for
|
|
35
|
+
* plain SVG passthrough, (data, event) for adapted children) — find the
|
|
36
|
+
* DOM event wherever it is so propagation can be stopped reliably.
|
|
37
|
+
*/
|
|
38
|
+
function stopChartEventPropagation(...args) {
|
|
39
|
+
for (const candidate of args) {
|
|
40
|
+
if (candidate &&
|
|
41
|
+
typeof candidate.stopPropagation ===
|
|
42
|
+
"function") {
|
|
43
|
+
candidate.stopPropagation();
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
33
48
|
const LegendItem = ({ name, color, onClick, activeLegend, }) => {
|
|
34
49
|
const hasOnValueChange = Boolean(onClick);
|
|
35
50
|
return (React.createElement("li", { className: cx("group inline-flex flex-nowrap items-center gap-1.5 whitespace-nowrap rounded px-2 py-1 transition", hasOnValueChange
|
|
@@ -236,10 +251,10 @@ const ChartTooltip = ({ active, payload, label, valueFormatter, }) => {
|
|
|
236
251
|
return null;
|
|
237
252
|
};
|
|
238
253
|
const AreaChart = React.forwardRef((props, ref) => {
|
|
239
|
-
var _a, _b
|
|
254
|
+
var _a, _b;
|
|
240
255
|
const { data = [], categories = [], index, colors = AvailableChartColors, valueFormatter = (value) => {
|
|
241
256
|
return value.toString();
|
|
242
|
-
}, startEndOnly = false, showXAxis = true, showYAxis = true, showGridLines = true, yAxisWidth = 56, intervalType = "equidistantPreserveStart", showTooltip = true, showLegend = true, autoMinValue = false, minValue, maxValue, allowDecimals = true, connectNulls = false, className, onValueChange, enableLegendSlider = false, tickGap = 5, xAxisLabel, yAxisLabel, legendPosition = "right", tooltipCallback, customTooltip, formattedTimeReferenceLines, formattedReferenceRegions, onTimeRangeSelect } = props, other = __rest(props, ["data", "categories", "index", "colors", "valueFormatter", "startEndOnly", "showXAxis", "showYAxis", "showGridLines", "yAxisWidth", "intervalType", "showTooltip", "showLegend", "autoMinValue", "minValue", "maxValue", "allowDecimals", "connectNulls", "className", "onValueChange", "enableLegendSlider", "tickGap", "xAxisLabel", "yAxisLabel", "legendPosition", "tooltipCallback", "customTooltip", "formattedTimeReferenceLines", "formattedReferenceRegions", "onTimeRangeSelect"]);
|
|
257
|
+
}, startEndOnly = false, showXAxis = true, showYAxis = true, showGridLines = true, yAxisWidth = 56, intervalType = "equidistantPreserveStart", showTooltip = true, showLegend = true, autoMinValue = false, minValue, maxValue, allowDecimals = true, connectNulls = false, className, onValueChange, enableLegendSlider = false, tickGap = 5, xAxisLabel, yAxisLabel, legendPosition = "right", tooltipCallback, customTooltip, formattedTimeReferenceLines, formattedReferenceRegions, onTimeRangeSelect, onBucketClick, ghostCategories } = props, other = __rest(props, ["data", "categories", "index", "colors", "valueFormatter", "startEndOnly", "showXAxis", "showYAxis", "showGridLines", "yAxisWidth", "intervalType", "showTooltip", "showLegend", "autoMinValue", "minValue", "maxValue", "allowDecimals", "connectNulls", "className", "onValueChange", "enableLegendSlider", "tickGap", "xAxisLabel", "yAxisLabel", "legendPosition", "tooltipCallback", "customTooltip", "formattedTimeReferenceLines", "formattedReferenceRegions", "onTimeRangeSelect", "onBucketClick", "ghostCategories"]);
|
|
243
258
|
const CustomTooltip = customTooltip;
|
|
244
259
|
const paddingValue = (!showXAxis && !showYAxis) || (startEndOnly && !showYAxis) ? 0 : 20;
|
|
245
260
|
const [legendHeight, setLegendHeight] = React.useState(60);
|
|
@@ -434,23 +449,51 @@ const AreaChart = React.forwardRef((props, ref) => {
|
|
|
434
449
|
}
|
|
435
450
|
return (React.createElement("div", Object.assign({ ref: ref, className: cx("flex-1 w-full", hasOnTimeRangeSelect && "cursor-crosshair", className) }, other),
|
|
436
451
|
React.createElement(ResponsiveContainer, null,
|
|
437
|
-
React.createElement(RechartsAreaChart, Object.assign({ data: data,
|
|
452
|
+
React.createElement(RechartsAreaChart, Object.assign({ data: data }, (props.syncid ? { syncId: props.syncid.toString() } : {}), (hasOnTimeRangeSelect
|
|
438
453
|
? {
|
|
439
454
|
onMouseDown: handleRangeSelectMouseDown,
|
|
440
455
|
onMouseMove: handleRangeSelectMouseMove,
|
|
441
456
|
onMouseUp: handleRangeSelectMouseUp,
|
|
442
457
|
}
|
|
443
|
-
: {}), { onClick:
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
458
|
+
: {}), { onClick: (chartState) => {
|
|
459
|
+
// Ignore the click that follows a drag-to-select.
|
|
460
|
+
if (suppressNextClickRef.current) {
|
|
461
|
+
return;
|
|
462
|
+
}
|
|
463
|
+
/*
|
|
464
|
+
* A click while a legend/dot selection is active keeps its
|
|
465
|
+
* long-standing meaning — clear the selection — and never
|
|
466
|
+
* also pins a bucket.
|
|
467
|
+
*/
|
|
468
|
+
if (hasOnValueChange && (activeLegend || activeDot)) {
|
|
449
469
|
setActiveDot(undefined);
|
|
450
470
|
setActiveLegend(undefined);
|
|
451
471
|
onValueChange === null || onValueChange === void 0 ? void 0 : onValueChange(null);
|
|
472
|
+
return;
|
|
473
|
+
}
|
|
474
|
+
if (!onBucketClick) {
|
|
475
|
+
return;
|
|
476
|
+
}
|
|
477
|
+
const rowIndex = getRowIndexFromChartState(chartState);
|
|
478
|
+
if (rowIndex === null) {
|
|
479
|
+
return;
|
|
452
480
|
}
|
|
453
|
-
|
|
481
|
+
const bucketStart = getBucketDateAtIndex(rowIndex);
|
|
482
|
+
if (!bucketStart) {
|
|
483
|
+
return;
|
|
484
|
+
}
|
|
485
|
+
/*
|
|
486
|
+
* Cover the full bucket: width from adjacent row dates, the
|
|
487
|
+
* same derivation drag-to-select uses.
|
|
488
|
+
*/
|
|
489
|
+
const adjacentDate = rowIndex > 0
|
|
490
|
+
? getBucketDateAtIndex(rowIndex - 1)
|
|
491
|
+
: getBucketDateAtIndex(rowIndex + 1);
|
|
492
|
+
const bucketWidthInMs = adjacentDate
|
|
493
|
+
? Math.abs(bucketStart.getTime() - adjacentDate.getTime())
|
|
494
|
+
: 0;
|
|
495
|
+
onBucketClick(bucketStart, new Date(bucketStart.getTime() + bucketWidthInMs), (data[rowIndex] || {}));
|
|
496
|
+
}, margin: {
|
|
454
497
|
bottom: (xAxisLabel
|
|
455
498
|
? 40
|
|
456
499
|
: showXAxis
|
|
@@ -541,32 +584,37 @@ const AreaChart = React.forwardRef((props, ref) => {
|
|
|
541
584
|
const colorKey = categoryColors.get(category);
|
|
542
585
|
const hex = getColorHex(colorKey);
|
|
543
586
|
const isCustomColor = isHexColorValue(colorKey);
|
|
544
|
-
|
|
587
|
+
const isGhost = (ghostCategories === null || ghostCategories === void 0 ? void 0 : ghostCategories.includes(category)) || false;
|
|
588
|
+
return (React.createElement(Area, Object.assign({ key: category, name: category, type: props.curve || ChartCurve.MONOTONE, dataKey: category, stroke: hex, strokeWidth: isGhost ? 1.5 : 2, strokeLinejoin: "round", strokeLinecap: "round", fill: `url(#${gradientId})`, fillOpacity: isGhost ? 0 : 1, strokeOpacity: (activeDot || (activeLegend && activeLegend !== category)
|
|
545
589
|
? 0.3
|
|
546
|
-
: 1, isAnimationActive: false, connectNulls: connectNulls,
|
|
590
|
+
: 1) * (isGhost ? 0.45 : 1), isAnimationActive: false, connectNulls: connectNulls,
|
|
547
591
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
548
|
-
activeDot:
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
592
|
+
activeDot: isGhost
|
|
593
|
+
? false
|
|
594
|
+
: (dotProps) => {
|
|
595
|
+
const { cx: cxCoord, cy: cyCoord, stroke, strokeLinecap: slc, strokeLinejoin: slj, strokeWidth, } = dotProps;
|
|
596
|
+
return (React.createElement(Dot, { className: cx("stroke-white", onValueChange ? "cursor-pointer" : "", getColorClassName(colorKey, "fill")), cx: cxCoord, cy: cyCoord, r: 5, fill: isCustomColor ? hex : "", stroke: stroke, strokeLinecap: slc, strokeLinejoin: slj, strokeWidth: strokeWidth,
|
|
597
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
598
|
+
onClick: (_, event) => {
|
|
599
|
+
return onDotClick(dotProps, event);
|
|
600
|
+
} }));
|
|
601
|
+
},
|
|
556
602
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
557
|
-
dot:
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
603
|
+
dot: isGhost
|
|
604
|
+
? false
|
|
605
|
+
: (dotProps) => {
|
|
606
|
+
const { stroke, strokeLinecap: slc, strokeLinejoin: slj, strokeWidth, cx: cxCoord, cy: cyCoord, index: dotIndex, } = dotProps;
|
|
607
|
+
if ((hasOnlyOneValueForKey(data, category) &&
|
|
608
|
+
!(activeDot ||
|
|
609
|
+
(activeLegend && activeLegend !== category))) ||
|
|
610
|
+
((activeDot === null || activeDot === void 0 ? void 0 : activeDot.index) === dotIndex &&
|
|
611
|
+
(activeDot === null || activeDot === void 0 ? void 0 : activeDot.dataKey) === category)) {
|
|
612
|
+
return (React.createElement(Dot, { key: dotIndex, cx: cxCoord, cy: cyCoord, r: 5, stroke: stroke, fill: isCustomColor ? hex : "", strokeLinecap: slc, strokeLinejoin: slj, strokeWidth: strokeWidth, className: cx("stroke-white", onValueChange ? "cursor-pointer" : "", getColorClassName(colorKey, "fill")) }));
|
|
613
|
+
}
|
|
614
|
+
return (React.createElement(React.Fragment, { key: dotIndex }));
|
|
615
|
+
} }, (isGhost ? { strokeDasharray: "6 4" } : {}))));
|
|
616
|
+
}), (_a = props.referenceLines) === null || _a === void 0 ? void 0 :
|
|
617
|
+
_a.map((refLine, refIndex) => {
|
|
570
618
|
return (React.createElement(ReferenceLine, { key: `ref-${refIndex}`, y: refLine.value, stroke: refLine.color, strokeDasharray: refLine.strokeDasharray || "4 4", strokeWidth: 1.5 }, refLine.label && (React.createElement(Label, { value: refLine.label, position: "insideTopRight", fill: refLine.color, fontSize: 11, fontWeight: 500 }))));
|
|
571
619
|
}), formattedReferenceRegions === null || formattedReferenceRegions === void 0 ? void 0 :
|
|
572
620
|
formattedReferenceRegions.map((region, regionIndex) => {
|
|
@@ -574,8 +622,10 @@ const AreaChart = React.forwardRef((props, ref) => {
|
|
|
574
622
|
return (React.createElement(ReferenceArea, Object.assign({ key: `ref-region-${regionIndex}`, x1: region.formattedX1, x2: region.formattedX2, fill: regionColor, fillOpacity: 0.12, stroke: regionColor, strokeOpacity: 0.35, strokeWidth: 1 }, (region.original.onClick
|
|
575
623
|
? {
|
|
576
624
|
style: { cursor: "pointer" },
|
|
577
|
-
onClick: () => {
|
|
625
|
+
onClick: (...args) => {
|
|
578
626
|
var _a, _b;
|
|
627
|
+
// Never let an annotation click also pin a bucket.
|
|
628
|
+
stopChartEventPropagation(...args);
|
|
579
629
|
if (suppressNextClickRef.current) {
|
|
580
630
|
return;
|
|
581
631
|
}
|
|
@@ -589,8 +639,10 @@ const AreaChart = React.forwardRef((props, ref) => {
|
|
|
589
639
|
return (React.createElement(ReferenceLine, Object.assign({ key: `time-ref-${timeRefIndex}`, x: timeRefLine.formattedX, stroke: lineColor, strokeDasharray: timeRefLine.original.strokeDasharray || "4 4", strokeWidth: 1.5 }, (timeRefLine.original.onClick
|
|
590
640
|
? {
|
|
591
641
|
style: { cursor: "pointer" },
|
|
592
|
-
onClick: () => {
|
|
642
|
+
onClick: (...args) => {
|
|
593
643
|
var _a, _b;
|
|
644
|
+
// Never let an annotation click also pin a bucket.
|
|
645
|
+
stopChartEventPropagation(...args);
|
|
594
646
|
if (suppressNextClickRef.current) {
|
|
595
647
|
return;
|
|
596
648
|
}
|
|
@@ -609,10 +661,12 @@ const AreaChart = React.forwardRef((props, ref) => {
|
|
|
609
661
|
angle: 90,
|
|
610
662
|
}
|
|
611
663
|
: { position: "insideTop" }), { fill: lineColor, fontSize: 10, fontWeight: 500 })))));
|
|
612
|
-
}), (
|
|
613
|
-
|
|
614
|
-
return (React.createElement(ReferenceDot, { key: `exemplar-${exemplarIndex}`, x: exemplar.formattedX, y: exemplar.y, r: 5, fill: "#7c3aed", stroke: "var(--ou-chart-marker-ring, #ffffff)", strokeWidth: 2, style: { cursor: "pointer" }, onClick: () => {
|
|
664
|
+
}), (_b = props.formattedExemplarPoints) === null || _b === void 0 ? void 0 :
|
|
665
|
+
_b.map((exemplar, exemplarIndex) => {
|
|
666
|
+
return (React.createElement(ReferenceDot, { key: `exemplar-${exemplarIndex}`, x: exemplar.formattedX, y: exemplar.y, r: 5, fill: "#7c3aed", stroke: "var(--ou-chart-marker-ring, #ffffff)", strokeWidth: 2, style: { cursor: "pointer" }, onClick: (...args) => {
|
|
615
667
|
var _a;
|
|
668
|
+
// Never let an exemplar click also pin a bucket.
|
|
669
|
+
stopChartEventPropagation(...args);
|
|
616
670
|
// Ignore the click that follows a drag-to-select.
|
|
617
671
|
if (suppressNextClickRef.current) {
|
|
618
672
|
return;
|