@qoretechnologies/reqraft 0.10.56 → 0.10.57-pr.127.g0a792ea
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/.claude/CLAUDE.md +1 -0
- package/README.md +20 -0
- package/design/TRACKING.md +290 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -1
- package/dist/tracking/browser/attach.d.ts +8 -0
- package/dist/tracking/browser/attach.d.ts.map +1 -0
- package/dist/tracking/browser/attach.js +182 -0
- package/dist/tracking/browser/attach.js.map +1 -0
- package/dist/tracking/browser/env.d.ts +14 -0
- package/dist/tracking/browser/env.d.ts.map +1 -0
- package/dist/tracking/browser/env.js +150 -0
- package/dist/tracking/browser/env.js.map +1 -0
- package/dist/tracking/core/consent.d.ts +21 -0
- package/dist/tracking/core/consent.d.ts.map +1 -0
- package/dist/tracking/core/consent.js +39 -0
- package/dist/tracking/core/consent.js.map +1 -0
- package/dist/tracking/core/engagement.d.ts +20 -0
- package/dist/tracking/core/engagement.d.ts.map +1 -0
- package/dist/tracking/core/engagement.js +52 -0
- package/dist/tracking/core/engagement.js.map +1 -0
- package/dist/tracking/core/experiments.d.ts +109 -0
- package/dist/tracking/core/experiments.d.ts.map +1 -0
- package/dist/tracking/core/experiments.js +294 -0
- package/dist/tracking/core/experiments.js.map +1 -0
- package/dist/tracking/core/hash.d.ts +16 -0
- package/dist/tracking/core/hash.d.ts.map +1 -0
- package/dist/tracking/core/hash.js +31 -0
- package/dist/tracking/core/hash.js.map +1 -0
- package/dist/tracking/core/ids.d.ts +6 -0
- package/dist/tracking/core/ids.d.ts.map +1 -0
- package/dist/tracking/core/ids.js +31 -0
- package/dist/tracking/core/ids.js.map +1 -0
- package/dist/tracking/core/observable.d.ts +12 -0
- package/dist/tracking/core/observable.d.ts.map +1 -0
- package/dist/tracking/core/observable.js +32 -0
- package/dist/tracking/core/observable.js.map +1 -0
- package/dist/tracking/core/queue.d.ts +47 -0
- package/dist/tracking/core/queue.d.ts.map +1 -0
- package/dist/tracking/core/queue.js +205 -0
- package/dist/tracking/core/queue.js.map +1 -0
- package/dist/tracking/core/sections.d.ts +54 -0
- package/dist/tracking/core/sections.d.ts.map +1 -0
- package/dist/tracking/core/sections.js +156 -0
- package/dist/tracking/core/sections.js.map +1 -0
- package/dist/tracking/core/storage.d.ts +15 -0
- package/dist/tracking/core/storage.d.ts.map +1 -0
- package/dist/tracking/core/storage.js +72 -0
- package/dist/tracking/core/storage.js.map +1 -0
- package/dist/tracking/core/tracker.d.ts +122 -0
- package/dist/tracking/core/tracker.d.ts.map +1 -0
- package/dist/tracking/core/tracker.js +390 -0
- package/dist/tracking/core/tracker.js.map +1 -0
- package/dist/tracking/core/types.d.ts +130 -0
- package/dist/tracking/core/types.d.ts.map +1 -0
- package/dist/tracking/core/types.js +69 -0
- package/dist/tracking/core/types.js.map +1 -0
- package/dist/tracking/core/utm.d.ts +6 -0
- package/dist/tracking/core/utm.d.ts.map +1 -0
- package/dist/tracking/core/utm.js +30 -0
- package/dist/tracking/core/utm.js.map +1 -0
- package/dist/tracking/index.d.ts +46 -0
- package/dist/tracking/index.d.ts.map +1 -0
- package/dist/tracking/index.js +91 -0
- package/dist/tracking/index.js.map +1 -0
- package/dist/tracking/markup.d.ts +12 -0
- package/dist/tracking/markup.d.ts.map +1 -0
- package/dist/tracking/markup.js +19 -0
- package/dist/tracking/markup.js.map +1 -0
- package/dist/tracking/react/Experiment.d.ts +23 -0
- package/dist/tracking/react/Experiment.d.ts.map +1 -0
- package/dist/tracking/react/Experiment.js +28 -0
- package/dist/tracking/react/Experiment.js.map +1 -0
- package/dist/tracking/react/TrackingProvider.d.ts +26 -0
- package/dist/tracking/react/TrackingProvider.d.ts.map +1 -0
- package/dist/tracking/react/TrackingProvider.js +45 -0
- package/dist/tracking/react/TrackingProvider.js.map +1 -0
- package/dist/tracking/react/hooks.d.ts +39 -0
- package/dist/tracking/react/hooks.d.ts.map +1 -0
- package/dist/tracking/react/hooks.js +96 -0
- package/dist/tracking/react/hooks.js.map +1 -0
- package/dist/tracking/react/index.d.ts +7 -0
- package/dist/tracking/react/index.d.ts.map +1 -0
- package/dist/tracking/react/index.js +17 -0
- package/dist/tracking/react/index.js.map +1 -0
- package/dist/tracking/testing.d.ts +40 -0
- package/dist/tracking/testing.d.ts.map +1 -0
- package/dist/tracking/testing.js +140 -0
- package/dist/tracking/testing.js.map +1 -0
- package/dist/tracking/ui/ExperimentCard.d.ts +55 -0
- package/dist/tracking/ui/ExperimentCard.d.ts.map +1 -0
- package/dist/tracking/ui/ExperimentCard.js +340 -0
- package/dist/tracking/ui/ExperimentCard.js.map +1 -0
- package/dist/tracking/ui/ExperimentsOverlay.d.ts +59 -0
- package/dist/tracking/ui/ExperimentsOverlay.d.ts.map +1 -0
- package/dist/tracking/ui/ExperimentsOverlay.js +359 -0
- package/dist/tracking/ui/ExperimentsOverlay.js.map +1 -0
- package/dist/tracking/ui/anchor.d.ts +107 -0
- package/dist/tracking/ui/anchor.d.ts.map +1 -0
- package/dist/tracking/ui/anchor.js +108 -0
- package/dist/tracking/ui/anchor.js.map +1 -0
- package/dist/tracking/ui/card.d.ts +121 -0
- package/dist/tracking/ui/card.d.ts.map +1 -0
- package/dist/tracking/ui/card.js +417 -0
- package/dist/tracking/ui/card.js.map +1 -0
- package/dist/tracking/ui/client.d.ts +42 -0
- package/dist/tracking/ui/client.d.ts.map +1 -0
- package/dist/tracking/ui/client.js +123 -0
- package/dist/tracking/ui/client.js.map +1 -0
- package/dist/tracking/ui/index.d.ts +20 -0
- package/dist/tracking/ui/index.d.ts.map +1 -0
- package/dist/tracking/ui/index.js +60 -0
- package/dist/tracking/ui/index.js.map +1 -0
- package/dist/tracking/ui/types.d.ts +120 -0
- package/dist/tracking/ui/types.d.ts.map +1 -0
- package/dist/tracking/ui/types.js +8 -0
- package/dist/tracking/ui/types.js.map +1 -0
- package/dist/tracking/ui/useExperimentsAdmin.d.ts +31 -0
- package/dist/tracking/ui/useExperimentsAdmin.d.ts.map +1 -0
- package/dist/tracking/ui/useExperimentsAdmin.js +136 -0
- package/dist/tracking/ui/useExperimentsAdmin.js.map +1 -0
- package/package.json +1 -1
- package/src/index.tsx +5 -0
- package/src/stories/tracking.tsx +206 -0
- package/src/tracking/browser/attach.ts +186 -0
- package/src/tracking/browser/env.ts +78 -0
- package/src/tracking/core/consent.ts +37 -0
- package/src/tracking/core/engagement.ts +47 -0
- package/src/tracking/core/experiments.ts +258 -0
- package/src/tracking/core/hash.ts +26 -0
- package/src/tracking/core/ids.ts +25 -0
- package/src/tracking/core/observable.ts +23 -0
- package/src/tracking/core/queue.ts +131 -0
- package/src/tracking/core/sections.ts +166 -0
- package/src/tracking/core/storage.ts +69 -0
- package/src/tracking/core/tracker.ts +417 -0
- package/src/tracking/core/types.ts +162 -0
- package/src/tracking/core/utm.ts +23 -0
- package/src/tracking/index.ts +72 -0
- package/src/tracking/markup.ts +17 -0
- package/src/tracking/react/Experiment.tsx +44 -0
- package/src/tracking/react/TrackingProvider.tsx +56 -0
- package/src/tracking/react/hooks.ts +106 -0
- package/src/tracking/react/index.ts +13 -0
- package/src/tracking/testing.ts +108 -0
- package/src/tracking/ui/ExperimentCard.stories.tsx +290 -0
- package/src/tracking/ui/ExperimentCard.tsx +581 -0
- package/src/tracking/ui/ExperimentsOverlay.stories.tsx +155 -0
- package/src/tracking/ui/ExperimentsOverlay.tsx +437 -0
- package/src/tracking/ui/anchor.ts +180 -0
- package/src/tracking/ui/card.ts +464 -0
- package/src/tracking/ui/client.ts +117 -0
- package/src/tracking/ui/index.ts +77 -0
- package/src/tracking/ui/types.ts +110 -0
- package/src/tracking/ui/useExperimentsAdmin.ts +103 -0
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __assign = (this && this.__assign) || function () {
|
|
3
|
+
__assign = Object.assign || function(t) {
|
|
4
|
+
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
5
|
+
s = arguments[i];
|
|
6
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
7
|
+
t[p] = s[p];
|
|
8
|
+
}
|
|
9
|
+
return t;
|
|
10
|
+
};
|
|
11
|
+
return __assign.apply(this, arguments);
|
|
12
|
+
};
|
|
13
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
14
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
15
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
16
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
17
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
18
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
19
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
20
|
+
});
|
|
21
|
+
};
|
|
22
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
23
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
24
|
+
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
25
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
26
|
+
function step(op) {
|
|
27
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
28
|
+
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
29
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
30
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
31
|
+
switch (op[0]) {
|
|
32
|
+
case 0: case 1: t = op; break;
|
|
33
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
34
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
35
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
36
|
+
default:
|
|
37
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
38
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
39
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
40
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
41
|
+
if (t[2]) _.ops.pop();
|
|
42
|
+
_.trys.pop(); continue;
|
|
43
|
+
}
|
|
44
|
+
op = body.call(thisArg, _);
|
|
45
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
46
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
50
|
+
exports.createMemoryTracker = void 0;
|
|
51
|
+
var storage_1 = require("./core/storage");
|
|
52
|
+
var tracker_1 = require("./core/tracker");
|
|
53
|
+
var types_1 = require("./core/types");
|
|
54
|
+
var createMemoryTracker = function (options) {
|
|
55
|
+
var _a, _b;
|
|
56
|
+
if (options === void 0) { options = {}; }
|
|
57
|
+
var clock = (_a = options.start) !== null && _a !== void 0 ? _a : Date.UTC(2026, 8, 29, 10, 0, 0);
|
|
58
|
+
var offline = false;
|
|
59
|
+
var timers = new Map();
|
|
60
|
+
var nextTimer = 1;
|
|
61
|
+
var local = (0, storage_1.memoryStorage)();
|
|
62
|
+
var session = (0, storage_1.memoryStorage)();
|
|
63
|
+
var config = (0, types_1.resolveConfig)(__assign({ property: 'test', endpoint: '/collect', experimentsEndpoint: '/experiments' }, options.config));
|
|
64
|
+
var keys = (0, types_1.storageKeys)(config.storagePrefix);
|
|
65
|
+
if (options.consent) {
|
|
66
|
+
local.set(keys.consent, options.consent);
|
|
67
|
+
local.set(keys.consentVersion, String(config.consentVersion));
|
|
68
|
+
}
|
|
69
|
+
if (options.vid)
|
|
70
|
+
local.set(keys.vid, options.vid);
|
|
71
|
+
Object.entries((_b = options.seed) !== null && _b !== void 0 ? _b : {}).forEach(function (_a) {
|
|
72
|
+
var k = _a[0], v = _a[1];
|
|
73
|
+
return local.set(k, v);
|
|
74
|
+
});
|
|
75
|
+
var page = __assign({ origin: 'https://example.com', path: '/', search: '', title: 'Example', referrer: '', lang: 'en-US', viewport: [1440, 900], device: 'desktop' }, options.page);
|
|
76
|
+
var sent = [];
|
|
77
|
+
var tracker = new tracker_1.Tracker(config, {
|
|
78
|
+
local: local,
|
|
79
|
+
session: session,
|
|
80
|
+
now: function () { return clock; },
|
|
81
|
+
setTimer: function (fn, ms) {
|
|
82
|
+
var id = nextTimer++;
|
|
83
|
+
timers.set(id, { at: clock + ms, fn: fn });
|
|
84
|
+
return id;
|
|
85
|
+
},
|
|
86
|
+
clearTimer: function (h) { return void timers.delete(h); },
|
|
87
|
+
page: function () { return page; },
|
|
88
|
+
transport: {
|
|
89
|
+
send: function (body, mode) { return __awaiter(void 0, void 0, void 0, function () {
|
|
90
|
+
return __generator(this, function (_a) {
|
|
91
|
+
if (offline)
|
|
92
|
+
return [2 /*return*/, false];
|
|
93
|
+
sent.push({ batch: JSON.parse(body), mode: mode });
|
|
94
|
+
return [2 /*return*/, true];
|
|
95
|
+
});
|
|
96
|
+
}); },
|
|
97
|
+
},
|
|
98
|
+
fetchJson: function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
99
|
+
return __generator(this, function (_a) {
|
|
100
|
+
if (!options.experiments || options.experiments === 'fail')
|
|
101
|
+
throw new Error('no experiments endpoint');
|
|
102
|
+
return [2 /*return*/, { experiments: typeof options.experiments === 'function' ? options.experiments() : options.experiments }];
|
|
103
|
+
});
|
|
104
|
+
}); },
|
|
105
|
+
});
|
|
106
|
+
var advance = function (ms) { return __awaiter(void 0, void 0, void 0, function () {
|
|
107
|
+
var until, due;
|
|
108
|
+
return __generator(this, function (_a) {
|
|
109
|
+
switch (_a.label) {
|
|
110
|
+
case 0:
|
|
111
|
+
until = clock + ms;
|
|
112
|
+
_a.label = 1;
|
|
113
|
+
case 1:
|
|
114
|
+
due = Array.from(timers.entries()).filter(function (_a) {
|
|
115
|
+
var t = _a[1];
|
|
116
|
+
return t.at <= until;
|
|
117
|
+
}).sort(function (a, b) { return a[1].at - b[1].at; })[0];
|
|
118
|
+
if (!due)
|
|
119
|
+
return [3 /*break*/, 4];
|
|
120
|
+
timers.delete(due[0]);
|
|
121
|
+
clock = Math.max(clock, due[1].at);
|
|
122
|
+
due[1].fn();
|
|
123
|
+
return [4 /*yield*/, Promise.resolve()];
|
|
124
|
+
case 2:
|
|
125
|
+
_a.sent();
|
|
126
|
+
_a.label = 3;
|
|
127
|
+
case 3: return [3 /*break*/, 1];
|
|
128
|
+
case 4:
|
|
129
|
+
clock = until;
|
|
130
|
+
return [4 /*yield*/, new Promise(function (r) { return setTimeout(r, 0); })];
|
|
131
|
+
case 5:
|
|
132
|
+
_a.sent();
|
|
133
|
+
return [2 /*return*/];
|
|
134
|
+
}
|
|
135
|
+
});
|
|
136
|
+
}); };
|
|
137
|
+
return { tracker: tracker, sent: sent, local: local, session: session, keys: keys, page: page, advance: advance, now: function () { return clock; }, setOffline: function (o) { return (offline = o); } };
|
|
138
|
+
};
|
|
139
|
+
exports.createMemoryTracker = createMemoryTracker;
|
|
140
|
+
//# sourceMappingURL=testing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"testing.js","sourceRoot":"","sources":["../../src/tracking/testing.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import type { IExperimentEntry, TExperimentActionResult } from './types';
|
|
2
|
+
type TMaybeAsync<T = unknown> = T | Promise<T>;
|
|
3
|
+
export interface IExperimentCardProps {
|
|
4
|
+
/** The experiment key (`data-experiment` of `<Experiment>`). */
|
|
5
|
+
experimentKey: string;
|
|
6
|
+
/** The server's experiment and its results; absent while the test is not on the server. */
|
|
7
|
+
test?: IExperimentEntry | null;
|
|
8
|
+
/** The card's title. Default: the experiment's name, else its key. */
|
|
9
|
+
name?: string;
|
|
10
|
+
/** The version this page shows now: its row takes the info colour (and `aria-current`). */
|
|
11
|
+
shown?: string;
|
|
12
|
+
/** The versions the page's code renders (`data-variants`); a server version outside it cannot be shown. */
|
|
13
|
+
codeVariants?: string[];
|
|
14
|
+
/** The room the card has (px): the versions scroll inside when it is short. */
|
|
15
|
+
maxHeight?: number;
|
|
16
|
+
/** Why the list could not be loaded (the analytics service cannot be reached). */
|
|
17
|
+
loadError?: string | null;
|
|
18
|
+
/** An "Open in …" link at the start of the footer (a new tab). */
|
|
19
|
+
detailsUrl?: string | null;
|
|
20
|
+
/** The link's label. Default `Open in admin portal`. */
|
|
21
|
+
detailsLabel?: string;
|
|
22
|
+
/** One version's analytics (a new tab): a "Show analytics" action on each row; none without it. */
|
|
23
|
+
versionDetailsUrl?: (variant: string) => string | null | undefined;
|
|
24
|
+
/** Where the full analytics live, in the help's words. Default `the admin portal`. */
|
|
25
|
+
analyticsLabel?: string;
|
|
26
|
+
/** Best first (conversion on the primary metric, then visitors). Default true. */
|
|
27
|
+
sort?: boolean;
|
|
28
|
+
/** The words for a test that is in the page's code but not set up in the analytics service yet. */
|
|
29
|
+
notSetUpText?: string;
|
|
30
|
+
/** Who removed a version, in words, by the history's `actor` (`{ 'landing-editor': 'in the editor' }`). */
|
|
31
|
+
actorLabels?: Record<string, string>;
|
|
32
|
+
/** Asks before Accept, Remove, Start, Pause and Stop (Reqore's confirm dialog). Default true. */
|
|
33
|
+
confirm?: boolean;
|
|
34
|
+
/** A notification after each action (what happened, or the server's error). Default true. */
|
|
35
|
+
notify?: boolean;
|
|
36
|
+
/** A click (or Enter / Space) on a version's row: show that version on this page. Rows are not clickable without it. */
|
|
37
|
+
onShow?: (variant: string) => void;
|
|
38
|
+
/** Each action appears only when its callback is given; a returned promise shows the button busy until it settles. */
|
|
39
|
+
onAccept?: (variant: string) => TMaybeAsync<TExperimentActionResult | unknown>;
|
|
40
|
+
onRemove?: (variant: string) => TMaybeAsync<TExperimentActionResult | unknown>;
|
|
41
|
+
onStart?: () => TMaybeAsync;
|
|
42
|
+
onPause?: () => TMaybeAsync;
|
|
43
|
+
onStop?: () => TMaybeAsync;
|
|
44
|
+
/** The ✕ in the header. */
|
|
45
|
+
onClose?: () => void;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* One A/B test: its name and status, the verdict in plain words, one row per version (visitors,
|
|
49
|
+
* conversion, chance to beat the original, a bar; click a row to show that version; Accept, and
|
|
50
|
+
* Remove at the far end), and the test's own controls (Start / Resume, Pause, Stop) with an
|
|
51
|
+
* optional link to its details. Driven only by props: no requests of its own.
|
|
52
|
+
*/
|
|
53
|
+
export declare const ExperimentCard: ({ experimentKey, test, name, shown, codeVariants, maxHeight, loadError, detailsUrl, detailsLabel, versionDetailsUrl, analyticsLabel, sort, notSetUpText, actorLabels, confirm, notify, onShow, onAccept, onRemove, onStart, onPause, onStop, onClose, }: IExperimentCardProps) => import("react/jsx-runtime").JSX.Element;
|
|
54
|
+
export {};
|
|
55
|
+
//# sourceMappingURL=ExperimentCard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ExperimentCard.d.ts","sourceRoot":"","sources":["../../../src/tracking/ui/ExperimentCard.tsx"],"names":[],"mappings":"AAkDA,OAAO,KAAK,EAAE,gBAAgB,EAAqB,uBAAuB,EAAE,MAAM,SAAS,CAAC;AAE5F,KAAK,WAAW,CAAC,CAAC,GAAG,OAAO,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;AAE/C,MAAM,WAAW,oBAAoB;IACnC,gEAAgE;IAChE,aAAa,EAAE,MAAM,CAAC;IACtB,2FAA2F;IAC3F,IAAI,CAAC,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAC/B,sEAAsE;IACtE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,2FAA2F;IAC3F,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,2GAA2G;IAC3G,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,+EAA+E;IAC/E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kFAAkF;IAClF,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,kEAAkE;IAClE,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,wDAAwD;IACxD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,mGAAmG;IACnG,iBAAiB,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IACnE,sFAAsF;IACtF,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,kFAAkF;IAClF,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,mGAAmG;IACnG,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,2GAA2G;IAC3G,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,iGAAiG;IACjG,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,6FAA6F;IAC7F,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,wHAAwH;IACxH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,sHAAsH;IACtH,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,WAAW,CAAC,uBAAuB,GAAG,OAAO,CAAC,CAAC;IAC/E,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,WAAW,CAAC,uBAAuB,GAAG,OAAO,CAAC,CAAC;IAC/E,OAAO,CAAC,EAAE,MAAM,WAAW,CAAC;IAC5B,OAAO,CAAC,EAAE,MAAM,WAAW,CAAC;IAC5B,MAAM,CAAC,EAAE,MAAM,WAAW,CAAC;IAC3B,2BAA2B;IAC3B,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACtB;AAoCD;;;;;GAKG;AACH,eAAO,MAAM,cAAc,4PAwBxB,oBAAoB,4CAiatB,CAAC"}
|
|
@@ -0,0 +1,340 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __makeTemplateObject = (this && this.__makeTemplateObject) || function (cooked, raw) {
|
|
3
|
+
if (Object.defineProperty) { Object.defineProperty(cooked, "raw", { value: raw }); } else { cooked.raw = raw; }
|
|
4
|
+
return cooked;
|
|
5
|
+
};
|
|
6
|
+
var __assign = (this && this.__assign) || function () {
|
|
7
|
+
__assign = Object.assign || function(t) {
|
|
8
|
+
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
9
|
+
s = arguments[i];
|
|
10
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
11
|
+
t[p] = s[p];
|
|
12
|
+
}
|
|
13
|
+
return t;
|
|
14
|
+
};
|
|
15
|
+
return __assign.apply(this, arguments);
|
|
16
|
+
};
|
|
17
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
18
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
19
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
20
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
21
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
22
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
23
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
24
|
+
});
|
|
25
|
+
};
|
|
26
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
27
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
28
|
+
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
29
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
30
|
+
function step(op) {
|
|
31
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
32
|
+
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
33
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
34
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
35
|
+
switch (op[0]) {
|
|
36
|
+
case 0: case 1: t = op; break;
|
|
37
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
38
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
39
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
40
|
+
default:
|
|
41
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
42
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
43
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
44
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
45
|
+
if (t[2]) _.ops.pop();
|
|
46
|
+
_.trys.pop(); continue;
|
|
47
|
+
}
|
|
48
|
+
op = body.call(thisArg, _);
|
|
49
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
50
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
54
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
55
|
+
};
|
|
56
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
57
|
+
exports.ExperimentCard = void 0;
|
|
58
|
+
var jsx_runtime_1 = require("react/jsx-runtime");
|
|
59
|
+
var reqore_1 = require("@qoretechnologies/reqore");
|
|
60
|
+
var polished_1 = require("polished");
|
|
61
|
+
var react_1 = require("react");
|
|
62
|
+
var styled_components_1 = __importDefault(require("styled-components"));
|
|
63
|
+
var anchor_1 = require("./anchor");
|
|
64
|
+
var card_1 = require("./card");
|
|
65
|
+
// Solid tags: a badge with only an intent is a minimal tag, unreadable on a light theme.
|
|
66
|
+
var solid = function (intent) { return ({
|
|
67
|
+
gradient: { colors: { 0: intent, 100: "".concat(intent, ":darken:1") } },
|
|
68
|
+
weight: 'bold',
|
|
69
|
+
}); };
|
|
70
|
+
var ROW_GAP = 6;
|
|
71
|
+
// Layout only: the versions scroll inside the card past three and a half rows.
|
|
72
|
+
var StyledVersions = styled_components_1.default.div(templateObject_1 || (templateObject_1 = __makeTemplateObject(["\n display: flex;\n flex-direction: column;\n gap: ", "px;\n max-height: ", ";\n overflow-y: ", ";\n overflow-x: hidden;\n overscroll-behavior: contain;\n min-width: 0;\n\n /* The rows take the card's width, never their content's, padding included: a host page\n without a global border-box reset would otherwise push each row past the card's edge. */\n > * {\n min-width: 0;\n }\n *,\n *::before,\n *::after {\n box-sizing: border-box;\n }\n"], ["\n display: flex;\n flex-direction: column;\n gap: ", "px;\n max-height: ", ";\n overflow-y: ", ";\n overflow-x: hidden;\n overscroll-behavior: contain;\n min-width: 0;\n\n /* The rows take the card's width, never their content's, padding included: a host page\n without a global border-box reset would otherwise push each row past the card's edge. */\n > * {\n min-width: 0;\n }\n *,\n *::before,\n *::after {\n box-sizing: border-box;\n }\n"])), ROW_GAP, function (_a) {
|
|
73
|
+
var $max = _a.$max;
|
|
74
|
+
return ($max ? "".concat($max, "px") : 'none');
|
|
75
|
+
}, function (_a) {
|
|
76
|
+
var $max = _a.$max;
|
|
77
|
+
return ($max ? 'auto' : 'visible');
|
|
78
|
+
});
|
|
79
|
+
/** Header, verdict and footer take about this much of `maxHeight`; the versions get the rest. */
|
|
80
|
+
var CHROME_HEIGHT = 230;
|
|
81
|
+
/**
|
|
82
|
+
* One A/B test: its name and status, the verdict in plain words, one row per version (visitors,
|
|
83
|
+
* conversion, chance to beat the original, a bar; click a row to show that version; Accept, and
|
|
84
|
+
* Remove at the far end), and the test's own controls (Start / Resume, Pause, Stop) with an
|
|
85
|
+
* optional link to its details. Driven only by props: no requests of its own.
|
|
86
|
+
*/
|
|
87
|
+
var ExperimentCard = function (_a) {
|
|
88
|
+
var experimentKey = _a.experimentKey, test = _a.test, name = _a.name, shown = _a.shown, _b = _a.codeVariants, codeVariants = _b === void 0 ? [] : _b, maxHeight = _a.maxHeight, loadError = _a.loadError, detailsUrl = _a.detailsUrl, _c = _a.detailsLabel, detailsLabel = _c === void 0 ? 'Open in admin portal' : _c, versionDetailsUrl = _a.versionDetailsUrl, _d = _a.analyticsLabel, analyticsLabel = _d === void 0 ? 'the admin portal' : _d, _e = _a.sort, sort = _e === void 0 ? true : _e, notSetUpText = _a.notSetUpText, actorLabels = _a.actorLabels, _f = _a.confirm, confirm = _f === void 0 ? true : _f, _g = _a.notify, notify = _g === void 0 ? true : _g, onShow = _a.onShow, onAccept = _a.onAccept, onRemove = _a.onRemove, onStart = _a.onStart, onPause = _a.onPause, onStop = _a.onStop, onClose = _a.onClose;
|
|
89
|
+
var entry = test !== null && test !== void 0 ? test : undefined;
|
|
90
|
+
var confirmAction = (0, reqore_1.useReqoreProperty)('confirmAction');
|
|
91
|
+
var addNotification = (0, reqore_1.useReqoreProperty)('addNotification');
|
|
92
|
+
var theme = (0, reqore_1.useReqoreTheme)();
|
|
93
|
+
var light = (function () {
|
|
94
|
+
try {
|
|
95
|
+
return (0, polished_1.getLuminance)(theme.main) > 0.5;
|
|
96
|
+
}
|
|
97
|
+
catch (_a) {
|
|
98
|
+
return false;
|
|
99
|
+
}
|
|
100
|
+
})();
|
|
101
|
+
var _h = (0, react_1.useState)(null), busy = _h[0], setBusy = _h[1];
|
|
102
|
+
var _j = (0, react_1.useState)(false), helpOpen = _j[0], setHelpOpen = _j[1];
|
|
103
|
+
var _k = (0, react_1.useState)(0), rowHeight = _k[0], setRowHeight = _k[1];
|
|
104
|
+
var firstRow = (0, react_1.useRef)(null);
|
|
105
|
+
var mounted = (0, react_1.useRef)(true);
|
|
106
|
+
(0, react_1.useEffect)(function () { return function () {
|
|
107
|
+
mounted.current = false;
|
|
108
|
+
}; }, []);
|
|
109
|
+
var unreachable = !entry && !!loadError;
|
|
110
|
+
var codeKey = codeVariants.join(',');
|
|
111
|
+
// The order is decided when the data arrives (a refresh), never while the user works in the card.
|
|
112
|
+
var order = (0, react_1.useMemo)(function () {
|
|
113
|
+
var all = (0, card_1.versionRows)(entry, codeVariants);
|
|
114
|
+
return (sort ? (0, card_1.sortVersionRows)(all) : all).map(function (r) { return r.key; });
|
|
115
|
+
// `codeVariants` is followed by its keys, not its identity.
|
|
116
|
+
}, [entry, codeKey, sort]);
|
|
117
|
+
var unsorted = (0, card_1.versionRows)(entry, codeVariants);
|
|
118
|
+
var rows = order
|
|
119
|
+
.map(function (key) { return unsorted.find(function (r) { return r.key === key; }); })
|
|
120
|
+
.filter(Boolean)
|
|
121
|
+
.concat(unsorted.filter(function (r) { return !order.includes(r.key); }));
|
|
122
|
+
var leader = (0, card_1.leadingVersion)(entry, rows);
|
|
123
|
+
var bars = (0, card_1.barValues)(rows);
|
|
124
|
+
var metric = (0, card_1.primaryMetric)(entry === null || entry === void 0 ? void 0 : entry.results);
|
|
125
|
+
var status = entry === null || entry === void 0 ? void 0 : entry.experiment.status;
|
|
126
|
+
var title = name || (entry === null || entry === void 0 ? void 0 : entry.experiment.name) || experimentKey;
|
|
127
|
+
var tag = (0, card_1.statusTag)(entry, unreachable);
|
|
128
|
+
var note = (0, card_1.phaseNote)(entry, actorLabels);
|
|
129
|
+
var busyOn = function (action, variant) {
|
|
130
|
+
if (variant === void 0) { variant = ''; }
|
|
131
|
+
return busy === "".concat(action, ":").concat(variant);
|
|
132
|
+
};
|
|
133
|
+
(0, react_1.useLayoutEffect)(function () {
|
|
134
|
+
var _a, _b;
|
|
135
|
+
var h = (_b = (_a = firstRow.current) === null || _a === void 0 ? void 0 : _a.offsetHeight) !== null && _b !== void 0 ? _b : 0;
|
|
136
|
+
if (h && h !== rowHeight)
|
|
137
|
+
setRowHeight(h);
|
|
138
|
+
});
|
|
139
|
+
// A row's height changes with the card's width (a phone, a resized window): measure it again.
|
|
140
|
+
(0, react_1.useEffect)(function () {
|
|
141
|
+
var el = firstRow.current;
|
|
142
|
+
if (!el || typeof ResizeObserver === 'undefined')
|
|
143
|
+
return undefined;
|
|
144
|
+
var ro = new ResizeObserver(function () { return setRowHeight(el.offsetHeight); });
|
|
145
|
+
ro.observe(el);
|
|
146
|
+
return function () { return ro.disconnect(); };
|
|
147
|
+
}, []);
|
|
148
|
+
// Minimal buttons tint their text from the intent, too pale on a light theme: a deeper shade there.
|
|
149
|
+
var quiet = function (intent) { return (__assign({ minimal: true }, (light && intent ?
|
|
150
|
+
{
|
|
151
|
+
effect: { color: "".concat(intent, ":darken:2"), weight: 'thick' },
|
|
152
|
+
iconColor: "".concat(intent, ":darken:2"),
|
|
153
|
+
}
|
|
154
|
+
: {}))); };
|
|
155
|
+
var act = function (action, variant) {
|
|
156
|
+
if (!entry)
|
|
157
|
+
return;
|
|
158
|
+
var callbacks = {
|
|
159
|
+
accept: onAccept,
|
|
160
|
+
remove: onRemove,
|
|
161
|
+
start: onStart,
|
|
162
|
+
pause: onPause,
|
|
163
|
+
stop: onStop,
|
|
164
|
+
};
|
|
165
|
+
var callback = callbacks[action];
|
|
166
|
+
if (!callback)
|
|
167
|
+
return;
|
|
168
|
+
var isVersion = action === 'accept' || action === 'remove';
|
|
169
|
+
var copy = isVersion ? (0, card_1.confirmCopy)(action, entry, variant) : (0, card_1.lifecycleCopy)(action, entry);
|
|
170
|
+
var titles = {
|
|
171
|
+
accept: ['Winner accepted', 'Could not accept'],
|
|
172
|
+
remove: ['Version removed', 'Could not remove'],
|
|
173
|
+
start: [status === 'paused' ? 'Test resumed' : 'Test started', 'Could not start'],
|
|
174
|
+
pause: ['Test paused', 'Could not pause'],
|
|
175
|
+
stop: ['Test stopped', 'Could not stop'],
|
|
176
|
+
};
|
|
177
|
+
var run = function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
178
|
+
var result, content, err_1;
|
|
179
|
+
var _a;
|
|
180
|
+
return __generator(this, function (_b) {
|
|
181
|
+
switch (_b.label) {
|
|
182
|
+
case 0:
|
|
183
|
+
setBusy("".concat(action, ":").concat(variant !== null && variant !== void 0 ? variant : ''));
|
|
184
|
+
_b.label = 1;
|
|
185
|
+
case 1:
|
|
186
|
+
_b.trys.push([1, 3, 4, 5]);
|
|
187
|
+
return [4 /*yield*/, callback(variant)];
|
|
188
|
+
case 2:
|
|
189
|
+
result = _b.sent();
|
|
190
|
+
if (notify) {
|
|
191
|
+
content = isVersion ?
|
|
192
|
+
(0, card_1.actionOutcome)(action, result, variant)
|
|
193
|
+
: "\u201C".concat(title, "\u201D is ").concat(action === 'start' ? 'running'
|
|
194
|
+
: action === 'pause' ? 'paused'
|
|
195
|
+
: 'stopped', ".");
|
|
196
|
+
addNotification === null || addNotification === void 0 ? void 0 : addNotification({
|
|
197
|
+
intent: 'success',
|
|
198
|
+
title: titles[action][0],
|
|
199
|
+
content: content,
|
|
200
|
+
duration: 8000,
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
return [3 /*break*/, 5];
|
|
204
|
+
case 3:
|
|
205
|
+
err_1 = _b.sent();
|
|
206
|
+
if (notify) {
|
|
207
|
+
addNotification === null || addNotification === void 0 ? void 0 : addNotification({
|
|
208
|
+
intent: 'danger',
|
|
209
|
+
title: titles[action][1],
|
|
210
|
+
content: (_a = err_1 === null || err_1 === void 0 ? void 0 : err_1.message) !== null && _a !== void 0 ? _a : String(err_1),
|
|
211
|
+
duration: 10000,
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
return [3 /*break*/, 5];
|
|
215
|
+
case 4:
|
|
216
|
+
if (mounted.current)
|
|
217
|
+
setBusy(null);
|
|
218
|
+
return [7 /*endfinally*/];
|
|
219
|
+
case 5: return [2 /*return*/];
|
|
220
|
+
}
|
|
221
|
+
});
|
|
222
|
+
}); };
|
|
223
|
+
if (confirm && confirmAction) {
|
|
224
|
+
confirmAction({
|
|
225
|
+
title: copy.title,
|
|
226
|
+
description: copy.description,
|
|
227
|
+
confirmLabel: copy.confirmLabel,
|
|
228
|
+
confirmButtonIntent: action === 'accept' || action === 'start' ? 'success'
|
|
229
|
+
: action === 'pause' ? 'warning'
|
|
230
|
+
: 'danger',
|
|
231
|
+
onConfirm: function () { return void run(); },
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
else {
|
|
235
|
+
void run();
|
|
236
|
+
}
|
|
237
|
+
};
|
|
238
|
+
var footer = [];
|
|
239
|
+
if (detailsUrl) {
|
|
240
|
+
footer.push(__assign(__assign({ position: 'left', icon: 'ExternalLinkLine', label: detailsLabel, responsive: false }, quiet()), { tooltip: 'This test’s details (a new tab)', onClick: function () { return window.open(detailsUrl, '_blank', 'noopener'); } }));
|
|
241
|
+
}
|
|
242
|
+
if (entry && status) {
|
|
243
|
+
// Every button in the card is minimal, except Start test / Resume: the one primary action.
|
|
244
|
+
if (onStart && (0, card_1.canStart)(status)) {
|
|
245
|
+
footer.push({
|
|
246
|
+
position: 'right',
|
|
247
|
+
icon: 'PlayLine',
|
|
248
|
+
intent: 'success',
|
|
249
|
+
label: status === 'paused' ? 'Resume' : 'Start test',
|
|
250
|
+
responsive: false,
|
|
251
|
+
disabled: !!busy,
|
|
252
|
+
loading: busyOn('start'),
|
|
253
|
+
tooltip: status === 'paused' ?
|
|
254
|
+
'Split visitors between the versions again'
|
|
255
|
+
: 'Start splitting visitors between the versions and counting',
|
|
256
|
+
onClick: function () { return act('start'); },
|
|
257
|
+
});
|
|
258
|
+
}
|
|
259
|
+
if (onPause && (0, card_1.canPause)(status)) {
|
|
260
|
+
footer.push(__assign(__assign({ position: 'right', icon: 'PauseLine', intent: 'warning', label: 'Pause', responsive: false }, quiet('warning')), { disabled: !!busy, loading: busyOn('pause'), tooltip: 'Everybody sees the original until you resume', onClick: function () { return act('pause'); } }));
|
|
261
|
+
}
|
|
262
|
+
if (onStop && (0, card_1.canStop)(status)) {
|
|
263
|
+
footer.push(__assign(__assign({ position: 'right', icon: 'StopLine', intent: 'danger', label: 'Stop', responsive: false }, quiet('danger')), { disabled: !!busy, loading: busyOn('stop'), tooltip: 'End the test without a winner', onClick: function () { return act('stop'); } }));
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
var accept = status ? (0, card_1.canAccept)(status) : false;
|
|
267
|
+
var remove = status ? (0, card_1.canRemove)(status, rows.length) : false;
|
|
268
|
+
var listMax = (0, card_1.versionsMaxHeight)({
|
|
269
|
+
rows: rows.length,
|
|
270
|
+
rowHeight: rowHeight,
|
|
271
|
+
gap: ROW_GAP,
|
|
272
|
+
available: maxHeight ? Math.max(rowHeight, maxHeight - CHROME_HEIGHT) : undefined,
|
|
273
|
+
});
|
|
274
|
+
return ((0, jsx_runtime_1.jsxs)(reqore_1.ReqorePanel, { className: 'reqraft-experiment-card', label: title, icon: 'FlaskLine', badge: { label: tag.label, icon: tag.icon, effect: solid(tag.intent) }, size: 'small', rounded: true, flat: false, padded: true, collapsible: false, onClose: onClose, closeTooltip: 'Close (Esc)', closeButtonProps: { 'aria-label': 'Close the test card', minimal: true }, actions: [
|
|
275
|
+
{
|
|
276
|
+
icon: 'QuestionLine',
|
|
277
|
+
minimal: true,
|
|
278
|
+
flat: true,
|
|
279
|
+
tooltip: 'How A/B tests work',
|
|
280
|
+
'aria-label': 'How A/B tests work',
|
|
281
|
+
onClick: function () { return setHelpOpen(true); },
|
|
282
|
+
},
|
|
283
|
+
], bottomActions: footer.length ? footer : undefined, children: [(0, jsx_runtime_1.jsx)(reqore_1.ReqoreCallout, { size: 'small', flat: true, icon: 'LineChartLine', intent: unreachable ? 'warning' : (0, card_1.verdictIntent)(entry), effect: { weight: 500 }, children: (0, card_1.verdictLine)(entry, { unreachable: unreachable, notSetUpText: notSetUpText }) }), note && ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(reqore_1.ReqoreVerticalSpacer, { height: 6 }), (0, jsx_runtime_1.jsx)(reqore_1.ReqoreP, { size: 'small', effect: { opacity: 0.7 }, children: note })] })), (0, jsx_runtime_1.jsx)(reqore_1.ReqoreVerticalSpacer, { height: 10 }), (0, jsx_runtime_1.jsx)(reqore_1.ReqoreP, { size: 'small', effect: { opacity: 0.75, weight: 500 }, children: "".concat(rows.length, " versions").concat((metric === null || metric === void 0 ? void 0 : metric.name) ? " \u00B7 goal: \u201C".concat(metric.name, "\u201D") : '') }), (0, jsx_runtime_1.jsx)(reqore_1.ReqoreVerticalSpacer, { height: 6 }), (0, jsx_runtime_1.jsx)(StyledVersions, { "$max": listMax, role: 'list', "aria-label": 'Versions', className: 'reqraft-experiment-versions', children: rows.map(function (r, i) {
|
|
284
|
+
var isShown = r.key === shown;
|
|
285
|
+
var badges = [];
|
|
286
|
+
if ((leader === null || leader === void 0 ? void 0 : leader.key) === r.key) {
|
|
287
|
+
badges.push(leader.kind === 'winner' ?
|
|
288
|
+
{ label: 'Winner', icon: 'TrophyLine', effect: solid('success') }
|
|
289
|
+
: { label: 'Leading', icon: 'ArrowUpLine', effect: solid('success') });
|
|
290
|
+
}
|
|
291
|
+
if (r.control)
|
|
292
|
+
badges.push({ label: 'Original', icon: 'HomeLine' });
|
|
293
|
+
if (!r.inCode)
|
|
294
|
+
badges.push({ label: 'Not in the code', icon: 'AlertLine', effect: solid('warning') });
|
|
295
|
+
// The whole row shows its version; Accept and Remove stop the click (Reqore's row actions do).
|
|
296
|
+
var showable = !!onShow && r.inCode && !isShown;
|
|
297
|
+
var actions = [];
|
|
298
|
+
var analytics = entry ? versionDetailsUrl === null || versionDetailsUrl === void 0 ? void 0 : versionDetailsUrl(r.key) : null;
|
|
299
|
+
if (analytics) {
|
|
300
|
+
actions.push(__assign(__assign({ size: 'small', icon: 'BarChartBoxLine', intent: 'info' }, quiet('info')), { tooltip: "Show analytics for \u201C".concat(r.name, "\u201D (a new tab)"), 'aria-label': "Show analytics for ".concat(r.name), onClick: function () { return window.open(analytics, '_blank', 'noopener'); } }));
|
|
301
|
+
}
|
|
302
|
+
if (entry && onAccept) {
|
|
303
|
+
actions.push(__assign(__assign({ size: 'small', icon: 'TrophyLine', intent: 'success', label: 'Accept' }, quiet('success')), { disabled: !accept || !!busy, loading: busyOn('accept', r.key), tooltip: accept ?
|
|
304
|
+
"End the test: every visitor sees \u201C".concat(r.name, "\u201D")
|
|
305
|
+
: 'Only a started test can be accepted', onClick: function () { return act('accept', r.key); } }));
|
|
306
|
+
}
|
|
307
|
+
if (entry && onRemove) {
|
|
308
|
+
actions.push(__assign(__assign({ size: 'small', icon: 'DeleteBinLine', intent: 'danger' }, quiet('danger')), { 'aria-label': "Remove version ".concat(r.name),
|
|
309
|
+
// At the far end of the row, away from Accept, so it is not clicked by accident.
|
|
310
|
+
style: { marginLeft: 'auto' }, disabled: !remove || !!busy, loading: busyOn('remove', r.key), tooltip: remove ?
|
|
311
|
+
"Remove version: drop \u201C".concat(r.name, "\u201D from the test")
|
|
312
|
+
: 'This version cannot be removed now', onClick: function () { return act('remove', r.key); } }));
|
|
313
|
+
}
|
|
314
|
+
return ((0, jsx_runtime_1.jsx)("div", { role: 'listitem', ref: i === 0 ? firstRow : undefined, "data-version": r.key, "aria-current": isShown || undefined, children: (0, jsx_runtime_1.jsx)(reqore_1.ReqoreEntityRow, __assign({ size: 'small', rounded: true, flat: !isShown, intent: isShown ? 'info' : undefined, label: r.name, badge: badges, description: (0, card_1.numbersLine)(r, metric === null || metric === void 0 ? void 0 : metric.name, status), metadata: r.visitors ?
|
|
315
|
+
(0, jsx_runtime_1.jsx)(reqore_1.ReqoreProgress, { value: bars[i], size: 'tiny', rounded: true, flat: true, style: { width: '100%', minWidth: 160 }, intent: isShown ? 'info'
|
|
316
|
+
: r.control ?
|
|
317
|
+
'muted'
|
|
318
|
+
: 'success', "aria-label": "".concat(r.name, ": conversion compared with the best version") })
|
|
319
|
+
: undefined, iconHasBackground: false, showIcon: false, actions: actions.length ? actions : undefined }, (showable ?
|
|
320
|
+
{
|
|
321
|
+
role: 'button',
|
|
322
|
+
tabIndex: 0,
|
|
323
|
+
'aria-label': "Show \u201C".concat(r.name, "\u201D on this page"),
|
|
324
|
+
tooltip: "Show \u201C".concat(r.name, "\u201D on this page (only here, never counted)"),
|
|
325
|
+
onClick: function () { return onShow(r.key); },
|
|
326
|
+
onKeyDown: function (e) {
|
|
327
|
+
if (!(0, anchor_1.activatesRow)(e.key, e.target === e.currentTarget))
|
|
328
|
+
return;
|
|
329
|
+
e.preventDefault();
|
|
330
|
+
onShow(r.key);
|
|
331
|
+
},
|
|
332
|
+
}
|
|
333
|
+
: {}))) }, r.key));
|
|
334
|
+
}) }), !entry && ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(reqore_1.ReqoreVerticalSpacer, { height: 8 }), (0, jsx_runtime_1.jsx)(reqore_1.ReqoreP, { size: 'small', effect: { opacity: 0.7 }, children: unreachable ?
|
|
335
|
+
'Start, Accept and Remove come back once the analytics service answers.'
|
|
336
|
+
: 'Start, Accept and Remove appear once the test is set up.' })] })), (0, jsx_runtime_1.jsx)(reqore_1.ReqoreModal, { isOpen: helpOpen, onClose: function () { return setHelpOpen(false); }, label: 'How A/B tests work', icon: 'QuestionLine', width: '640px', blur: 2, className: 'reqraft-experiment-help', children: (0, card_1.helpSections)(entry, analyticsLabel).map(function (section) { return ((0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)(reqore_1.ReqoreH4, { children: section.title }), (0, jsx_runtime_1.jsx)(reqore_1.ReqoreVerticalSpacer, { height: 4 }), section.paragraphs.map(function (text) { return ((0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)(reqore_1.ReqoreP, { size: 'small', effect: { weight: 500 }, children: text }), (0, jsx_runtime_1.jsx)(reqore_1.ReqoreVerticalSpacer, { height: 6 })] }, text)); }), (0, jsx_runtime_1.jsx)(reqore_1.ReqoreVerticalSpacer, { height: 14 })] }, section.title)); }) })] }));
|
|
337
|
+
};
|
|
338
|
+
exports.ExperimentCard = ExperimentCard;
|
|
339
|
+
var templateObject_1;
|
|
340
|
+
//# sourceMappingURL=ExperimentCard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ExperimentCard.js","sourceRoot":"","sources":["../../../src/tracking/ui/ExperimentCard.tsx"],"names":[],"mappings":"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"}
|