@delmaredigital/payload-experiments 0.2.0-rc.7 → 0.3.0-rc.4
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/README.md +202 -26
- package/dist/admin/PreviewLinks.d.ts +2 -1
- package/dist/admin/PreviewLinks.js +50 -21
- package/dist/admin/TestsNavLink.d.ts +3 -1
- package/dist/admin/TestsNavLink.js +2 -2
- package/dist/admin/actions/ConfirmDialog.d.ts +7 -4
- package/dist/admin/actions/ConfirmDialog.js +37 -82
- package/dist/admin/actions/DecideDialog.d.ts +3 -1
- package/dist/admin/actions/DecideDialog.js +30 -13
- package/dist/admin/actions/MakeContentResult.d.ts +13 -2
- package/dist/admin/actions/MakeContentResult.js +115 -16
- package/dist/admin/actions/actions.model.d.ts +2 -4
- package/dist/admin/actions/actions.model.js +2 -3
- package/dist/admin/allocation.model.js +3 -5
- package/dist/admin/api.d.ts +10 -4
- package/dist/admin/api.js +11 -7
- package/dist/admin/armSelect/ArmSelectField.js +14 -22
- package/dist/admin/arms/arms.model.d.ts +1 -21
- package/dist/admin/arms/arms.model.js +1 -153
- package/dist/admin/copy/actions.d.ts +39 -3
- package/dist/admin/copy/actions.js +40 -4
- package/dist/admin/copy/armSelect.js +5 -5
- package/dist/admin/copy/arms.d.ts +1 -6
- package/dist/admin/copy/arms.js +1 -16
- package/dist/admin/copy/audience.d.ts +2 -1
- package/dist/admin/copy/audience.js +3 -2
- package/dist/admin/copy/common.d.ts +13 -6
- package/dist/admin/copy/common.js +14 -8
- package/dist/admin/copy/goals.d.ts +21 -6
- package/dist/admin/copy/goals.js +27 -6
- package/dist/admin/copy/readiness.d.ts +22 -0
- package/dist/admin/copy/readiness.js +21 -0
- package/dist/admin/copy/recommendation.d.ts +0 -3
- package/dist/admin/copy/recommendation.js +0 -3
- package/dist/admin/copy/results.d.ts +43 -2
- package/dist/admin/copy/results.js +44 -3
- package/dist/admin/copy/review.d.ts +2 -2
- package/dist/admin/copy/review.js +2 -2
- package/dist/admin/copy/setting.d.ts +2 -0
- package/dist/admin/copy/setting.js +2 -0
- package/dist/admin/copy/surface.d.ts +7 -5
- package/dist/admin/copy/surface.js +9 -5
- package/dist/admin/copy/testPage.d.ts +10 -0
- package/dist/admin/copy/testPage.js +10 -0
- package/dist/admin/format/date.d.ts +2 -0
- package/dist/admin/format/date.js +10 -0
- package/dist/admin/paths.d.ts +2 -1
- package/dist/admin/paths.js +2 -1
- package/dist/admin/previewLinks.model.d.ts +4 -2
- package/dist/admin/previewLinks.model.js +8 -7
- package/dist/admin/results/CiChart.js +11 -21
- package/dist/admin/results/DataQualityPanel.d.ts +4 -2
- package/dist/admin/results/DataQualityPanel.js +30 -17
- package/dist/admin/results/DataTable.d.ts +16 -0
- package/dist/admin/results/DataTable.js +152 -0
- package/dist/admin/results/StatTile.d.ts +7 -0
- package/dist/admin/results/StatTile.js +22 -0
- package/dist/admin/results/VerdictHero.d.ts +13 -0
- package/dist/admin/results/{VerdictCard.js → VerdictHero.js} +15 -12
- package/dist/admin/results/legacy.d.ts +16 -0
- package/dist/admin/results/legacy.js +27 -0
- package/dist/admin/results/releasePages.model.d.ts +17 -0
- package/dist/admin/results/releasePages.model.js +10 -0
- package/dist/admin/results/results.css +64 -0
- package/dist/admin/results/results.model.d.ts +11 -7
- package/dist/admin/results/results.model.js +24 -7
- package/dist/admin/results/snapshot.d.ts +14 -0
- package/dist/admin/results/snapshot.js +3 -0
- package/dist/admin/surface/ResultsRoute.d.ts +1 -1
- package/dist/admin/surface/ResultsRoute.js +59 -34
- package/dist/admin/surface/SurfaceShell.d.ts +11 -2
- package/dist/admin/surface/SurfaceShell.js +49 -14
- package/dist/admin/surface/TestsHome.d.ts +6 -1
- package/dist/admin/surface/TestsHome.js +182 -114
- package/dist/admin/surface/TestsSurface.js +56 -16
- package/dist/admin/surface/goals/GoalForm.js +341 -308
- package/dist/admin/surface/goals/GoalsList.js +123 -89
- package/dist/admin/surface/goals/data.d.ts +8 -2
- package/dist/admin/surface/goals/data.js +24 -16
- package/dist/admin/surface/goals/goals.css +10 -13
- package/dist/admin/surface/home.model.d.ts +8 -8
- package/dist/admin/surface/home.model.js +23 -12
- package/dist/admin/surface/newTest/NewTest.js +9 -9
- package/dist/admin/surface/pageBlock/parts.js +31 -26
- package/dist/admin/surface/readiness/ActionDialogs.js +47 -19
- package/dist/admin/surface/readiness/Banner.d.ts +3 -0
- package/dist/admin/surface/readiness/Banner.js +58 -33
- package/dist/admin/surface/readiness/SaveStatus.d.ts +1 -0
- package/dist/admin/surface/readiness/SaveStatus.js +6 -3
- package/dist/admin/surface/readiness/readiness.model.d.ts +2 -0
- package/dist/admin/surface/readiness/readiness.model.js +25 -9
- package/dist/admin/surface/readiness/useTransition.d.ts +1 -0
- package/dist/admin/surface/readiness/useTransition.js +2 -1
- package/dist/admin/surface/results/ReleasePages.d.ts +14 -0
- package/dist/admin/surface/results/ReleasePages.js +116 -0
- package/dist/admin/surface/results/ResultsBody.d.ts +11 -1
- package/dist/admin/surface/results/ResultsBody.js +277 -105
- package/dist/admin/surface/results/ResultsHeader.d.ts +10 -0
- package/dist/admin/surface/results/ResultsHeader.js +177 -0
- package/dist/admin/surface/results/recommendation.model.d.ts +3 -2
- package/dist/admin/surface/results/recommendation.model.js +12 -9
- package/dist/admin/surface/results/useResults.d.ts +21 -3
- package/dist/admin/surface/results/useResults.js +2 -1
- package/dist/admin/surface/setting/parts.js +75 -88
- package/dist/admin/surface/setting/setting.css +3 -15
- package/dist/admin/surface/surface.css +61 -47
- package/dist/admin/surface/test/AdvancedSection.js +55 -48
- package/dist/admin/surface/test/GoalSection.js +46 -47
- package/dist/admin/surface/test/LengthSection.js +46 -34
- package/dist/admin/surface/test/Rail.d.ts +4 -0
- package/dist/admin/surface/test/Rail.js +83 -0
- package/dist/admin/surface/test/ReadinessBar.d.ts +5 -0
- package/dist/admin/surface/test/ReadinessBar.js +33 -0
- package/dist/admin/surface/test/Section.d.ts +1 -1
- package/dist/admin/surface/test/Section.js +36 -16
- package/dist/admin/surface/test/TargetingSection.js +168 -142
- package/dist/admin/surface/test/TestPage.d.ts +2 -1
- package/dist/admin/surface/test/TestPage.js +146 -68
- package/dist/admin/surface/test/VersionsSection.js +151 -120
- package/dist/admin/surface/test/fields.d.ts +11 -4
- package/dist/admin/surface/test/fields.js +84 -85
- package/dist/admin/surface/test/jumpToSection.d.ts +3 -0
- package/dist/admin/surface/test/jumpToSection.js +10 -0
- package/dist/admin/surface/test/pageParts.js +9 -3
- package/dist/admin/surface/test/testPage.css +81 -14
- package/dist/admin/surface/test/testPage.model.d.ts +2 -3
- package/dist/admin/surface/test/testPage.model.js +1 -21
- package/dist/admin/surface/useTestDocument.js +12 -5
- package/dist/admin/targeting/targeting.model.d.ts +1 -3
- package/dist/admin/targeting/targeting.model.js +3 -8
- package/dist/admin/theme.css +115 -36
- package/dist/admin/theme.d.ts +38 -0
- package/dist/admin/theme.js +38 -1
- package/dist/admin/useApi.d.ts +17 -2
- package/dist/admin/useLayerUsage.js +14 -23
- package/dist/admin/views/ExperimentsRootView.js +12 -2
- package/dist/admin/views/TestsNavLinkServer.d.ts +2 -0
- package/dist/admin/views/TestsNavLinkServer.js +43 -0
- package/dist/arms/copy.d.ts +6 -0
- package/dist/arms/copy.js +16 -0
- package/dist/arms/model.d.ts +23 -0
- package/dist/arms/model.js +173 -0
- package/dist/collections/experiments/config.js +25 -0
- package/dist/collections/experiments/lockHook.js +3 -1
- package/dist/collections/identities.js +6 -1
- package/dist/collections/metrics.js +7 -0
- package/dist/collections/metricsGuards.d.ts +9 -0
- package/dist/collections/metricsGuards.js +33 -0
- package/dist/contentDone.d.ts +4 -0
- package/dist/contentDone.js +5 -0
- package/dist/db/appends.d.ts +6 -2
- package/dist/db/appends.js +10 -4
- package/dist/db/identities.d.ts +8 -7
- package/dist/db/identities.js +9 -6
- package/dist/db/locks.d.ts +6 -0
- package/dist/db/locks.js +13 -1
- package/dist/db/metricUsage.d.ts +19 -0
- package/dist/db/metricUsage.js +54 -0
- package/dist/db/names.d.ts +5 -0
- package/dist/db/names.js +5 -0
- package/dist/db/pageOccupancy.d.ts +12 -0
- package/dist/db/pageOccupancy.js +45 -0
- package/dist/db/publishedContent.d.ts +10 -0
- package/dist/db/publishedContent.js +43 -0
- package/dist/db/results.d.ts +2 -0
- package/dist/db/results.js +6 -2
- package/dist/db/snapshots.d.ts +18 -6
- package/dist/db/snapshots.js +25 -8
- package/dist/db/sweep.js +11 -6
- package/dist/endpoints/index.js +19 -1
- package/dist/endpoints/results.js +5 -0
- package/dist/endpoints/sanitizeReadinessDetail.d.ts +1 -0
- package/dist/endpoints/sanitizeReadinessDetail.js +2 -0
- package/dist/endpoints/summary.js +20 -2
- package/dist/endpoints/transitions.d.ts +15 -0
- package/dist/endpoints/transitions.js +36 -0
- package/dist/errors.d.ts +8 -0
- package/dist/errors.js +28 -0
- package/dist/exports/adminRsc.d.ts +1 -0
- package/dist/exports/adminRsc.js +1 -0
- package/dist/exports/index.d.ts +2 -1
- package/dist/exports/index.js +1 -0
- package/dist/exports/puck.d.ts +2 -1
- package/dist/exports/puck.js +1 -1
- package/dist/exports/puckEditor.d.ts +4 -1
- package/dist/exports/puckEditor.js +3 -1
- package/dist/exports/rsc.d.ts +6 -1
- package/dist/exports/rsc.js +2 -0
- package/dist/hooks/pageGuard.d.ts +5 -0
- package/dist/hooks/pageGuard.js +139 -0
- package/dist/lib/fetchAllDocs.d.ts +16 -0
- package/dist/lib/fetchAllDocs.js +56 -0
- package/dist/log.js +6 -3
- package/dist/manifest/compile.d.ts +5 -0
- package/dist/manifest/compile.js +5 -1
- package/dist/options.js +16 -0
- package/dist/plugin.js +30 -2
- package/dist/puck/ExperimentPicker.js +47 -16
- package/dist/puck/ExperimentSlot.d.ts +51 -1
- package/dist/puck/ExperimentSlot.js +23 -12
- package/dist/puck/copy.d.ts +6 -5
- package/dist/puck/copy.js +6 -5
- package/dist/puck/editor/CreateExperimentDrawer.js +46 -56
- package/dist/puck/editor/ExperimentSlotEditor.d.ts +52 -1
- package/dist/puck/editor/ExperimentSlotEditor.js +292 -137
- package/dist/puck/editor/ResultsReadout.d.ts +6 -0
- package/dist/puck/editor/ResultsReadout.js +99 -0
- package/dist/puck/editor/VersionBuilder.d.ts +34 -0
- package/dist/puck/editor/VersionBuilder.js +317 -0
- package/dist/puck/editor/armWrites.d.ts +7 -0
- package/dist/puck/editor/armWrites.js +71 -0
- package/dist/puck/editor/armsCache.d.ts +14 -0
- package/dist/puck/editor/armsCache.js +78 -0
- package/dist/puck/editor/copy.d.ts +33 -1
- package/dist/puck/editor/copy.js +45 -8
- package/dist/puck/editor/createTest.d.ts +1 -1
- package/dist/puck/editor/createTest.js +25 -14
- package/dist/puck/editor/editor.chrome.css +121 -0
- package/dist/puck/editor/editor.css +288 -204
- package/dist/puck/editor/editor.model.d.ts +4 -1
- package/dist/puck/editor/editor.model.js +10 -7
- package/dist/puck/editor/experimentOutlinePlugin.d.ts +3 -0
- package/dist/puck/editor/experimentOutlinePlugin.js +89 -0
- package/dist/puck/experimentSlotField.d.ts +2 -0
- package/dist/puck/experimentSlotField.js +11 -3
- package/dist/puck/hostContext.d.ts +10 -0
- package/dist/puck/hostContext.js +12 -0
- package/dist/puck/routes.d.ts +12 -0
- package/dist/puck/routes.js +11 -0
- package/dist/puck/slotConfig.d.ts +1 -1
- package/dist/puck/slotConfig.js +2 -2
- package/dist/results/aggregate.js +4 -3
- package/dist/results/analyse.d.ts +4 -1
- package/dist/results/analyse.js +27 -11
- package/dist/results/cuped.js +3 -2
- package/dist/results/identityCredit.d.ts +15 -7
- package/dist/results/identityCredit.js +32 -33
- package/dist/results/rolloutUnits.js +2 -1
- package/dist/results/snapshot.js +8 -2
- package/dist/results/srm.js +2 -1
- package/dist/sanitizeReadinessDetail.d.ts +7 -0
- package/dist/sanitizeReadinessDetail.js +63 -0
- package/dist/server/linkIdentity.d.ts +10 -1
- package/dist/server/linkIdentity.js +17 -15
- package/dist/server/metadata.d.ts +5 -0
- package/dist/server/metadata.js +18 -3
- package/dist/server/normaliseContentRelationships.d.ts +7 -0
- package/dist/server/normaliseContentRelationships.js +62 -0
- package/dist/server/recordContentChange.d.ts +1 -1
- package/dist/server/recordContentChange.js +17 -8
- package/dist/server/runResults.d.ts +3 -2
- package/dist/server/runResults.js +157 -35
- package/dist/targeting/values.d.ts +4 -0
- package/dist/targeting/values.js +10 -0
- package/dist/transitions/addMetric.js +8 -0
- package/dist/transitions/archive.js +2 -3
- package/dist/transitions/checkStart.d.ts +10 -3
- package/dist/transitions/checkStart.js +25 -0
- package/dist/transitions/contentFields.d.ts +7 -0
- package/dist/transitions/contentFields.js +20 -0
- package/dist/transitions/decide.js +22 -2
- package/dist/transitions/dismissContentEntry.d.ts +8 -0
- package/dist/transitions/dismissContentEntry.js +45 -0
- package/dist/transitions/makeContent.d.ts +5 -2
- package/dist/transitions/makeContent.js +217 -118
- package/dist/transitions/phaseRecord.d.ts +8 -2
- package/dist/transitions/placements.d.ts +3 -6
- package/dist/transitions/placements.js +12 -1
- package/dist/transitions/preflightData.d.ts +9 -1
- package/dist/transitions/preflightData.js +138 -20
- package/dist/transitions/releasePages.d.ts +8 -0
- package/dist/transitions/releasePages.js +26 -0
- package/dist/transitions/restoreContentEntry.d.ts +8 -0
- package/dist/transitions/restoreContentEntry.js +47 -0
- package/dist/transitions/start.js +62 -7
- package/dist/types/contracts.d.ts +24 -4
- package/dist/types/endpoints.d.ts +34 -3
- package/dist/types/index.d.ts +1 -0
- package/dist/types/index.js +1 -0
- package/dist/types/reasons.d.ts +3 -0
- package/dist/types/reasons.js +1 -0
- package/dist/types/snapshot.d.ts +6 -1
- package/dist/ui/Banner.d.ts +2 -0
- package/dist/ui/Banner.js +2 -0
- package/dist/ui/Breadcrumb.d.ts +7 -0
- package/dist/ui/Breadcrumb.js +25 -0
- package/dist/ui/Button.d.ts +15 -0
- package/dist/ui/Button.js +32 -0
- package/dist/ui/Card.d.ts +12 -0
- package/dist/ui/Card.js +40 -0
- package/dist/ui/Checkbox.d.ts +2 -0
- package/dist/ui/Checkbox.js +2 -0
- package/dist/{admin/components → ui}/ChipsInput.d.ts +4 -3
- package/dist/{admin/components → ui}/ChipsInput.js +20 -12
- package/dist/ui/Dialog.d.ts +13 -0
- package/dist/ui/Dialog.js +85 -0
- package/dist/ui/EmptyState.d.ts +2 -0
- package/dist/ui/EmptyState.js +2 -0
- package/dist/ui/Feedback.d.ts +24 -0
- package/dist/ui/Feedback.js +40 -0
- package/dist/ui/Inputs.d.ts +34 -0
- package/dist/ui/Inputs.js +225 -0
- package/dist/ui/NumberInput.d.ts +2 -0
- package/dist/ui/NumberInput.js +2 -0
- package/dist/ui/Range.d.ts +2 -0
- package/dist/ui/Range.js +2 -0
- package/dist/ui/SearchInput.d.ts +2 -0
- package/dist/ui/SearchInput.js +2 -0
- package/dist/ui/SectionCard.d.ts +2 -0
- package/dist/ui/SectionCard.js +2 -0
- package/dist/ui/Select.d.ts +2 -0
- package/dist/ui/Select.js +2 -0
- package/dist/ui/StatusChip.d.ts +2 -0
- package/dist/ui/StatusChip.js +2 -0
- package/dist/ui/Tabs.d.ts +16 -0
- package/dist/ui/Tabs.js +61 -0
- package/dist/ui/TextInput.d.ts +2 -0
- package/dist/ui/TextInput.js +2 -0
- package/dist/ui/Textarea.d.ts +2 -0
- package/dist/ui/Textarea.js +2 -0
- package/dist/ui/Toggle.d.ts +2 -0
- package/dist/ui/Toggle.js +2 -0
- package/dist/ui/accent.d.ts +40 -0
- package/dist/ui/accent.js +139 -0
- package/dist/ui/index.d.ts +9 -0
- package/dist/ui/index.js +9 -0
- package/dist/ui/ui.css +92 -0
- package/package.json +5 -2
- package/dist/admin/components/chipsInput.css +0 -11
- package/dist/admin/results/ArmTable.d.ts +0 -8
- package/dist/admin/results/ArmTable.js +0 -113
- package/dist/admin/results/VerdictCard.d.ts +0 -9
- package/dist/admin/surface/goals/GoalsBreadcrumb.d.ts +0 -5
- package/dist/admin/surface/goals/GoalsBreadcrumb.js +0 -47
- package/dist/admin/surface/test/TestHeader.d.ts +0 -4
- package/dist/admin/surface/test/TestHeader.js +0 -70
|
@@ -1,20 +1,30 @@
|
|
|
1
1
|
'use client';
|
|
2
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
3
|
import { useEffect, useState } from 'react';
|
|
4
|
-
import { Link
|
|
4
|
+
import { Link } from '@payloadcms/ui';
|
|
5
5
|
import { formatAdminURL } from 'payload/shared';
|
|
6
|
-
import {
|
|
6
|
+
import { Banner, EmptyState } from '../../../ui/Feedback.js';
|
|
7
|
+
import { Button } from '../../../ui/Button.js';
|
|
8
|
+
import { SearchInput } from '../../../ui/Inputs.js';
|
|
9
|
+
import { SurfaceShell } from '../SurfaceShell.js';
|
|
10
|
+
import { SURFACE_COPY } from '../../copy/surface.js';
|
|
11
|
+
import { GOALS_COPY as C, goalsNoMatches, goalUsedBy } from '../../copy/goals.js';
|
|
12
|
+
import { METRIC_KIND_LABELS } from '../../copy/metrics.js';
|
|
7
13
|
import { goalUsage } from './goals.model.js';
|
|
8
14
|
import { goalPages } from './data.js';
|
|
9
|
-
import { GoalsBreadcrumb } from './GoalsBreadcrumb.js';
|
|
10
15
|
import './goals.css';
|
|
11
16
|
export function GoalsList({ surface, returnToTest }) {
|
|
12
17
|
const [data, setData] = useState();
|
|
13
18
|
const [error, setError] = useState('');
|
|
14
19
|
const [attempt, setAttempt] = useState(0);
|
|
20
|
+
const [search, setSearch] = useState('');
|
|
15
21
|
const returnQuery = returnToTest ? `?${new URLSearchParams({
|
|
16
22
|
return: returnToTest
|
|
17
23
|
})}` : '';
|
|
24
|
+
const url = (path)=>formatAdminURL({
|
|
25
|
+
adminRoute: surface.adminRoute,
|
|
26
|
+
path
|
|
27
|
+
});
|
|
18
28
|
useEffect(()=>{
|
|
19
29
|
const controller = new AbortController();
|
|
20
30
|
setData(undefined);
|
|
@@ -37,99 +47,123 @@ export function GoalsList({ surface, returnToTest }) {
|
|
|
37
47
|
attempt
|
|
38
48
|
]);
|
|
39
49
|
const usage = goalUsage(data?.tests ?? []);
|
|
40
|
-
const
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
}),
|
|
50
|
+
const showSearch = (data?.goals.length ?? 0) > 8;
|
|
51
|
+
const goals = data?.goals.filter((goal)=>!showSearch || goal.name.toLocaleLowerCase().includes(search.trim().toLocaleLowerCase())) ?? [];
|
|
52
|
+
const newGoal = surface.canManage ? /*#__PURE__*/ _jsx(Button, {
|
|
53
|
+
variant: "primary",
|
|
54
|
+
href: url(`/experiments/goals/new${returnQuery}`),
|
|
46
55
|
children: C.newGoal
|
|
47
|
-
});
|
|
48
|
-
return /*#__PURE__*/
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
56
|
+
}) : null;
|
|
57
|
+
return /*#__PURE__*/ _jsx(SurfaceShell, {
|
|
58
|
+
adminRoute: surface.adminRoute,
|
|
59
|
+
title: C.title,
|
|
60
|
+
crumbs: [
|
|
61
|
+
{
|
|
62
|
+
label: SURFACE_COPY.title,
|
|
63
|
+
href: url('/experiments')
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
label: C.title
|
|
67
|
+
}
|
|
68
|
+
],
|
|
69
|
+
actions: /*#__PURE__*/ _jsxs(_Fragment, {
|
|
70
|
+
children: [
|
|
71
|
+
returnToTest ? /*#__PURE__*/ _jsx(Button, {
|
|
72
|
+
variant: "quiet",
|
|
73
|
+
href: url(`/experiments/${encodeURIComponent(returnToTest)}`),
|
|
74
|
+
children: C.backToTest
|
|
75
|
+
}) : null,
|
|
76
|
+
newGoal
|
|
77
|
+
]
|
|
78
|
+
}),
|
|
79
|
+
children: /*#__PURE__*/ _jsxs("div", {
|
|
80
|
+
className: "xp-goals",
|
|
81
|
+
children: [
|
|
82
|
+
showSearch ? /*#__PURE__*/ _jsx(SearchInput, {
|
|
83
|
+
id: "xp-goals-search",
|
|
84
|
+
label: C.search,
|
|
85
|
+
placeholder: C.search,
|
|
86
|
+
value: search,
|
|
87
|
+
onChange: (event)=>setSearch(event.target.value)
|
|
88
|
+
}) : null,
|
|
89
|
+
error ? /*#__PURE__*/ _jsx(Banner, {
|
|
90
|
+
tone: "error",
|
|
91
|
+
action: /*#__PURE__*/ _jsx(Button, {
|
|
92
|
+
size: "sm",
|
|
70
93
|
onClick: ()=>setAttempt((n)=>n + 1),
|
|
71
94
|
children: C.retry
|
|
72
|
-
})
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
const count = usage.get(goal.id) ?? 0;
|
|
100
|
-
return /*#__PURE__*/ _jsxs("tr", {
|
|
95
|
+
}),
|
|
96
|
+
children: error
|
|
97
|
+
}) : !data ? /*#__PURE__*/ _jsx("p", {
|
|
98
|
+
role: "status",
|
|
99
|
+
children: C.loading
|
|
100
|
+
}) : !data.goals.length ? /*#__PURE__*/ _jsx(EmptyState, {
|
|
101
|
+
action: newGoal,
|
|
102
|
+
children: C.empty
|
|
103
|
+
}) : !goals.length ? /*#__PURE__*/ _jsx(EmptyState, {
|
|
104
|
+
action: /*#__PURE__*/ _jsx(Button, {
|
|
105
|
+
variant: "quiet",
|
|
106
|
+
onClick: ()=>setSearch(''),
|
|
107
|
+
children: C.clearSearch
|
|
108
|
+
}),
|
|
109
|
+
children: goalsNoMatches(search)
|
|
110
|
+
}) : /*#__PURE__*/ _jsx("div", {
|
|
111
|
+
className: "xp-tests-list",
|
|
112
|
+
children: goals.map((goal)=>{
|
|
113
|
+
const count = usage.get(goal.id) ?? 0;
|
|
114
|
+
const kind = surface.metricSources.find((source)=>source.id === goal.source)?.kind;
|
|
115
|
+
const label = kind && Object.hasOwn(METRIC_KIND_LABELS, kind) ? METRIC_KIND_LABELS[kind] : undefined;
|
|
116
|
+
const href = url(`/experiments/goals/${encodeURIComponent(String(goal.id))}${returnQuery}`);
|
|
117
|
+
return /*#__PURE__*/ _jsxs("article", {
|
|
118
|
+
className: "xp-tests-row",
|
|
119
|
+
children: [
|
|
120
|
+
/*#__PURE__*/ _jsxs("div", {
|
|
121
|
+
className: "xp-tests-row-main",
|
|
101
122
|
children: [
|
|
102
|
-
/*#__PURE__*/
|
|
103
|
-
|
|
104
|
-
children:
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
123
|
+
/*#__PURE__*/ _jsxs("div", {
|
|
124
|
+
className: "xp-tests-row-name",
|
|
125
|
+
children: [
|
|
126
|
+
/*#__PURE__*/ _jsx(Link, {
|
|
127
|
+
href: href,
|
|
128
|
+
children: goal.name
|
|
108
129
|
}),
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
}),
|
|
115
|
-
/*#__PURE__*/ _jsx("td", {
|
|
116
|
-
children: goal.direction === 'decrease' ? C.decrease : C.increase
|
|
130
|
+
label ? /*#__PURE__*/ _jsx("span", {
|
|
131
|
+
className: "xp-tests-kind",
|
|
132
|
+
children: label[0].toUpperCase() + label.slice(1)
|
|
133
|
+
}) : null
|
|
134
|
+
]
|
|
117
135
|
}),
|
|
118
|
-
/*#__PURE__*/
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
136
|
+
/*#__PURE__*/ _jsxs("div", {
|
|
137
|
+
className: "xp-tests-row-line",
|
|
138
|
+
children: [
|
|
139
|
+
/*#__PURE__*/ _jsx("span", {
|
|
140
|
+
children: goal.direction === 'decrease' ? C.decrease : C.increase
|
|
141
|
+
}),
|
|
142
|
+
/*#__PURE__*/ _jsx("span", {
|
|
143
|
+
"aria-hidden": "true",
|
|
144
|
+
children: "·"
|
|
145
|
+
}),
|
|
146
|
+
/*#__PURE__*/ _jsx("span", {
|
|
147
|
+
children: count ? goalUsedBy(count) : C.unused
|
|
148
|
+
})
|
|
149
|
+
]
|
|
125
150
|
})
|
|
126
151
|
]
|
|
127
|
-
},
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
152
|
+
}),
|
|
153
|
+
/*#__PURE__*/ _jsx(Button, {
|
|
154
|
+
className: "xp-tests-row-action",
|
|
155
|
+
variant: returnToTest ? 'primary' : 'secondary',
|
|
156
|
+
size: "sm",
|
|
157
|
+
href: returnToTest ? url(`/experiments/${encodeURIComponent(returnToTest)}?${new URLSearchParams({
|
|
158
|
+
goal: String(goal.id)
|
|
159
|
+
})}`) : href,
|
|
160
|
+
children: returnToTest ? C.useGoal : C.open
|
|
161
|
+
})
|
|
162
|
+
]
|
|
163
|
+
}, `${typeof goal.id}:${goal.id}`);
|
|
164
|
+
})
|
|
131
165
|
})
|
|
132
|
-
|
|
133
|
-
|
|
166
|
+
]
|
|
167
|
+
})
|
|
134
168
|
});
|
|
135
169
|
}
|
|
@@ -1,3 +1,9 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
export declare class GoalResponseError extends Error {
|
|
2
|
+
readonly fields: Record<string, string>;
|
|
3
|
+
constructor(message: string, fields: Record<string, string>);
|
|
4
|
+
}
|
|
5
|
+
/** Map REST refusals while retaining Payload's field validation details. */
|
|
6
|
+
export declare function goalResponse(response: Response, fallback: string, options?: {
|
|
7
|
+
notFound?: string;
|
|
8
|
+
}): Promise<unknown>;
|
|
3
9
|
export declare function goalPages<T>(base: string, collection: 'xp-metrics' | 'xp-experiments', signal: AbortSignal): Promise<T[]>;
|
|
@@ -1,24 +1,32 @@
|
|
|
1
|
+
import { DocsResponseError, fetchAllDocs } from '../../../lib/fetchAllDocs.js';
|
|
2
|
+
import { refusalMessage } from '../../copy/common.js';
|
|
1
3
|
import { GOALS_COPY as C } from '../../copy/goals.js';
|
|
2
4
|
import { payloadFieldErrors } from '../testDocument.model.js';
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
throw new Error(messages.length ? messages.join(' ') : fallback);
|
|
5
|
+
export class GoalResponseError extends Error {
|
|
6
|
+
fields;
|
|
7
|
+
constructor(message, fields){
|
|
8
|
+
super(message), this.fields = fields;
|
|
8
9
|
}
|
|
10
|
+
}
|
|
11
|
+
/** Map REST refusals while retaining Payload's field validation details. */ export async function goalResponse(response, fallback, options) {
|
|
12
|
+
const body = await response.json().catch(()=>undefined);
|
|
13
|
+
if (!response.ok) goalRefusal(body, response.status, fallback, options);
|
|
9
14
|
if (body == null) throw new Error(fallback);
|
|
10
15
|
return body;
|
|
11
16
|
}
|
|
17
|
+
function goalRefusal(body, status, fallback, options) {
|
|
18
|
+
const fields = payloadFieldErrors(body, '_section', fallback);
|
|
19
|
+
const first = body?.errors?.[0];
|
|
20
|
+
throw new GoalResponseError(refusalMessage(first?.code, status, Object.values(fields).join(' ') || fallback, options), fields);
|
|
21
|
+
}
|
|
12
22
|
export async function goalPages(base, collection, signal) {
|
|
13
|
-
const
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
if (!body.hasNextPage) return all;
|
|
23
|
-
}
|
|
23
|
+
const result = await fetchAllDocs(`${base}/${collection}?depth=0`, {
|
|
24
|
+
credentials: 'include',
|
|
25
|
+
signal
|
|
26
|
+
}).catch((cause)=>{
|
|
27
|
+
if (cause instanceof DocsResponseError) throw new Error(C.loadError);
|
|
28
|
+
throw cause;
|
|
29
|
+
});
|
|
30
|
+
if (!result.ok) goalRefusal(result.body, result.status, C.loadError);
|
|
31
|
+
return result.docs;
|
|
24
32
|
}
|
|
@@ -1,15 +1,12 @@
|
|
|
1
|
+
/* Compact rows reuse surface.css's xp-tests-list / xp-tests-row classes. */
|
|
1
2
|
.xp-goals { display: grid; gap: var(--xp-space-4); }
|
|
2
|
-
.xp-goals
|
|
3
|
-
.xp-goals-table { overflow-x: auto; }
|
|
4
|
-
.xp-goals-table table { width: 100%; border-collapse: collapse; text-align: left; }
|
|
5
|
-
.xp-goals-table th, .xp-goals-table td { padding: var(--xp-space-3); border-bottom: 1px solid var(--xp-border); }
|
|
3
|
+
.xp-goals > .xp-ui-field { max-width: 20rem; }
|
|
6
4
|
.xp-goal-form { max-width: 48rem; display: grid; gap: var(--xp-space-4); }
|
|
7
|
-
.xp-goal-
|
|
8
|
-
.xp-goal-
|
|
9
|
-
.xp-goal-form
|
|
10
|
-
|
|
11
|
-
}
|
|
12
|
-
.xp-goal-
|
|
13
|
-
.xp-goal-
|
|
14
|
-
.xp-goal-
|
|
15
|
-
.xp-goal-cancel { padding: var(--xp-space-2) var(--xp-space-4); color: var(--xp-text); }
|
|
5
|
+
.xp-goal-card { display: grid; gap: var(--xp-space-4); }
|
|
6
|
+
.xp-goal-card > h2 { margin: 0; font: var(--xp-text-title); }
|
|
7
|
+
.xp-goal-form fieldset { border: 0; margin: 0; padding: 0; min-width: 0; display: grid; gap: var(--xp-space-4); }
|
|
8
|
+
.xp-goal-form input[readonly] { background: var(--xp-surface-2); }
|
|
9
|
+
.xp-goal-advanced { border: 1px solid var(--xp-border); border-radius: var(--xp-radius); }
|
|
10
|
+
.xp-goal-advanced > summary { padding: var(--xp-space-4); cursor: pointer; font: var(--xp-text-body); }
|
|
11
|
+
.xp-goal-advanced > summary:focus-visible { outline: 2px solid var(--xp-focus); outline-offset: 2px; }
|
|
12
|
+
.xp-goal-advanced-fields { display: grid; gap: var(--xp-space-4); padding: 0 var(--xp-space-4) var(--xp-space-4); }
|
|
@@ -1,17 +1,18 @@
|
|
|
1
|
-
import type { DocId, ExperimentKind, Status } from '../../types/contracts.js';
|
|
1
|
+
import type { Arm, DocId, ExperimentKind, Status, UnitType } from '../../types/contracts.js';
|
|
2
2
|
import type { SummaryResponse } from '../../types/endpoints.js';
|
|
3
|
+
import type { ReadinessContext } from './readiness/readiness.model.js';
|
|
3
4
|
export interface HomeTest {
|
|
4
5
|
id: DocId;
|
|
5
6
|
name: string;
|
|
6
7
|
kind: ExperimentKind;
|
|
7
8
|
status: Status;
|
|
9
|
+
unitType: UnitType;
|
|
10
|
+
updatedAt?: string | null;
|
|
11
|
+
flagPoint?: string | null;
|
|
8
12
|
analysis?: {
|
|
9
13
|
plannedDurationDays?: number | null;
|
|
10
14
|
} | null;
|
|
11
|
-
arms?:
|
|
12
|
-
key: string;
|
|
13
|
-
label?: string;
|
|
14
|
-
}> | null;
|
|
15
|
+
arms?: Arm[] | null;
|
|
15
16
|
decidedAt?: string | null;
|
|
16
17
|
decision?: {
|
|
17
18
|
winnerArm?: string | null;
|
|
@@ -22,10 +23,10 @@ type Summary = SummaryResponse[DocId] | undefined;
|
|
|
22
23
|
export type Health = 'red' | 'amber' | 'green';
|
|
23
24
|
export declare function healthDot(test: HomeTest, summary: Summary): Health | undefined;
|
|
24
25
|
export declare function groupTests(tests: readonly HomeTest[], summaries: SummaryResponse, search?: string): {
|
|
25
|
-
label: "
|
|
26
|
+
label: "Needs attention" | "Running" | "Decided" | "Draft" | "Archived" | "Ready to start";
|
|
26
27
|
tests: HomeTest[];
|
|
27
28
|
}[];
|
|
28
|
-
export declare function homeCard(test: HomeTest, summary: Summary, adminRoute: string): {
|
|
29
|
+
export declare function homeCard(test: HomeTest, summary: Summary, adminRoute: string, flagPoints?: ReadinessContext['flagPoints']): {
|
|
29
30
|
kind: "Whole page" | "Page block" | "Setting";
|
|
30
31
|
pill: {
|
|
31
32
|
label: string;
|
|
@@ -33,7 +34,6 @@ export declare function homeCard(test: HomeTest, summary: Summary, adminRoute: s
|
|
|
33
34
|
tooltip: string;
|
|
34
35
|
};
|
|
35
36
|
line: string;
|
|
36
|
-
headline: string | undefined;
|
|
37
37
|
health: Health | undefined;
|
|
38
38
|
href: string;
|
|
39
39
|
action: "Continue setup" | "View results" | "Open";
|
|
@@ -1,13 +1,16 @@
|
|
|
1
1
|
import { formatAdminURL } from 'payload/shared';
|
|
2
|
+
import { formatDate } from '../format/date.js';
|
|
2
3
|
import { armLabel } from '../labels.js';
|
|
3
4
|
import { statusPill } from '../status.model.js';
|
|
4
5
|
import { decidedLine, runningLine, SURFACE_COPY } from '../copy/surface.js';
|
|
6
|
+
import { nextCopy } from '../copy/readiness.js';
|
|
7
|
+
import { READINESS } from './readiness/readiness.model.js';
|
|
8
|
+
import { sanitizeReadinessDetail } from '../../sanitizeReadinessDetail.js';
|
|
5
9
|
export function healthDot(test, summary) {
|
|
6
10
|
const code = summary?.verdict?.code;
|
|
7
|
-
if (
|
|
8
|
-
if (code === '
|
|
9
|
-
|
|
10
|
-
return 'green';
|
|
11
|
+
if (summary?.health?.some((item)=>item.code === 'version-page-unavailable') || code === 'data-problem' || code === 'guardrail-failing') return 'red';
|
|
12
|
+
if (summary?.health?.length || code === 'unavailable' || code === 'collecting' && test.analysis?.plannedDurationDays != null && summary.days > test.analysis.plannedDurationDays) return 'amber';
|
|
13
|
+
return code ? 'green' : undefined;
|
|
11
14
|
}
|
|
12
15
|
export function groupTests(tests, summaries, search = '') {
|
|
13
16
|
const groups = SURFACE_COPY.groups.map((label)=>({
|
|
@@ -27,31 +30,39 @@ export function groupTests(tests, summaries, search = '') {
|
|
|
27
30
|
const number = (value)=>value != null && Number.isFinite(value) ? new Intl.NumberFormat('en-US', {
|
|
28
31
|
maximumFractionDigits: 0
|
|
29
32
|
}).format(value) : '—';
|
|
30
|
-
export function homeCard(test, summary, adminRoute) {
|
|
33
|
+
export function homeCard(test, summary, adminRoute, flagPoints) {
|
|
31
34
|
const results = [
|
|
32
35
|
'running',
|
|
33
36
|
'stopped',
|
|
34
|
-
'decided'
|
|
37
|
+
'decided',
|
|
38
|
+
'archived'
|
|
35
39
|
].includes(test.status);
|
|
36
40
|
const href = formatAdminURL({
|
|
37
41
|
adminRoute,
|
|
38
42
|
path: `/experiments/${encodeURIComponent(test.id)}${results ? '/results' : ''}`
|
|
39
43
|
});
|
|
40
|
-
let line = summary?.ready ? SURFACE_COPY.ready : SURFACE_COPY.next;
|
|
44
|
+
let line = summary?.ready === true ? SURFACE_COPY.ready : nextCopy(SURFACE_COPY.next);
|
|
45
|
+
const next = summary?.next;
|
|
46
|
+
if ((test.status === 'draft' || test.status === 'stopped') && summary?.ready !== true && next && Object.hasOwn(READINESS, next.code)) {
|
|
47
|
+
// Keep unexpected text out of authored copy, including responses from older servers.
|
|
48
|
+
const sentence = READINESS[next.code].next(sanitizeReadinessDetail(next.code, next.detail), {
|
|
49
|
+
...test,
|
|
50
|
+
arms: test.arms ?? [],
|
|
51
|
+
flagPoints
|
|
52
|
+
});
|
|
53
|
+
if (sentence) line = nextCopy(sentence);
|
|
54
|
+
}
|
|
41
55
|
if (test.status === 'running') line = runningLine(number(summary?.days), number(test.analysis?.plannedDurationDays), number(summary?.exposures));
|
|
42
56
|
if (test.status === 'decided') {
|
|
43
|
-
const date = test.decidedAt ? new Date(test.decidedAt) : undefined;
|
|
44
57
|
const winner = test.decision?.winnerArm;
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
}) : '—', winner ? armLabel(winner, test.arms?.find((arm)=>arm.key === winner)?.label) : '—');
|
|
58
|
+
const winnerLabel = test.arms?.find((arm)=>arm.key === winner)?.label?.trim();
|
|
59
|
+
line = decidedLine(formatDate(test.decidedAt), winner ? winnerLabel || armLabel(winner) : '—');
|
|
48
60
|
}
|
|
49
61
|
if (test.status === 'archived') line = statusPill(test).label;
|
|
50
62
|
return {
|
|
51
63
|
kind: SURFACE_COPY.kinds[test.kind],
|
|
52
64
|
pill: statusPill(test),
|
|
53
65
|
line,
|
|
54
|
-
headline: test.status === 'running' ? summary?.verdict?.headline : undefined,
|
|
55
66
|
health: healthDot(test, summary),
|
|
56
67
|
href,
|
|
57
68
|
action: results ? SURFACE_COPY.results : test.status === 'draft' || test.status === 'stopped' ? SURFACE_COPY.continue : SURFACE_COPY.open
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
|
+
import { fetchAllDocs } from '../../../lib/fetchAllDocs.js';
|
|
3
4
|
import { useEffect, useRef, useState } from 'react';
|
|
4
5
|
import { useRouter } from 'next/navigation.js';
|
|
5
6
|
import { formatAdminURL } from 'payload/shared';
|
|
@@ -28,14 +29,13 @@ export function NewTest({ surface, pages }) {
|
|
|
28
29
|
setLayerState('loading');
|
|
29
30
|
void (async ()=>{
|
|
30
31
|
try {
|
|
31
|
-
const response = await
|
|
32
|
+
const response = await fetchAllDocs(`${surface.apiRoute.replace(/\/$/, '')}/xp-layers?depth=0`, {
|
|
32
33
|
credentials: 'include',
|
|
33
34
|
signal: controller.signal
|
|
34
35
|
});
|
|
35
|
-
|
|
36
|
-
if (!response.ok || !Array.isArray(body?.docs)) throw new Error('groups');
|
|
36
|
+
if (!response.ok) throw new Error('groups');
|
|
37
37
|
if (!controller.signal.aborted) {
|
|
38
|
-
setLayers(
|
|
38
|
+
setLayers(response.docs);
|
|
39
39
|
setLayerState('ready');
|
|
40
40
|
}
|
|
41
41
|
} catch {
|
|
@@ -80,12 +80,12 @@ export function NewTest({ surface, pages }) {
|
|
|
80
80
|
const collections = [
|
|
81
81
|
...new Set(pages?.map((page)=>page.collection))
|
|
82
82
|
];
|
|
83
|
-
return /*#__PURE__*/ _jsxs("
|
|
83
|
+
return /*#__PURE__*/ _jsxs("div", {
|
|
84
84
|
className: "xp-new-test",
|
|
85
85
|
children: [
|
|
86
86
|
step === 'kind' ? /*#__PURE__*/ _jsxs(_Fragment, {
|
|
87
87
|
children: [
|
|
88
|
-
/*#__PURE__*/ _jsx("
|
|
88
|
+
/*#__PURE__*/ _jsx("h2", {
|
|
89
89
|
children: C.question
|
|
90
90
|
}),
|
|
91
91
|
/*#__PURE__*/ _jsxs("div", {
|
|
@@ -131,7 +131,7 @@ export function NewTest({ surface, pages }) {
|
|
|
131
131
|
]
|
|
132
132
|
}) : step === 'block' ? /*#__PURE__*/ _jsxs(_Fragment, {
|
|
133
133
|
children: [
|
|
134
|
-
/*#__PURE__*/ _jsx("
|
|
134
|
+
/*#__PURE__*/ _jsx("h2", {
|
|
135
135
|
children: C.block
|
|
136
136
|
}),
|
|
137
137
|
/*#__PURE__*/ _jsx("p", {
|
|
@@ -169,7 +169,7 @@ export function NewTest({ surface, pages }) {
|
|
|
169
169
|
]
|
|
170
170
|
}) : step === 'setting' ? /*#__PURE__*/ _jsxs(_Fragment, {
|
|
171
171
|
children: [
|
|
172
|
-
/*#__PURE__*/ _jsx("
|
|
172
|
+
/*#__PURE__*/ _jsx("h2", {
|
|
173
173
|
children: C.chooseSetting
|
|
174
174
|
}),
|
|
175
175
|
/*#__PURE__*/ _jsxs("fieldset", {
|
|
@@ -289,7 +289,7 @@ export function NewTest({ surface, pages }) {
|
|
|
289
289
|
void submit();
|
|
290
290
|
},
|
|
291
291
|
children: [
|
|
292
|
-
/*#__PURE__*/ _jsx("
|
|
292
|
+
/*#__PURE__*/ _jsx("h2", {
|
|
293
293
|
children: C.nameQuestion
|
|
294
294
|
}),
|
|
295
295
|
/*#__PURE__*/ _jsxs("label", {
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
|
-
import {
|
|
3
|
+
import { Button } from '../../../ui/Button.js';
|
|
4
|
+
import { previewPages } from '../../previewLinks.model.js';
|
|
5
|
+
import { TEST_PAGE as C, placementCount } from '../../copy/testPage.js';
|
|
4
6
|
import { placementLine, slotReady } from './pageBlock.model.js';
|
|
5
7
|
function Binding({ test }) {
|
|
6
8
|
const placements = test.preflight?.placements ?? [];
|
|
@@ -8,16 +10,20 @@ function Binding({ test }) {
|
|
|
8
10
|
className: "xp-page-binding",
|
|
9
11
|
children: placements.length ? /*#__PURE__*/ _jsxs(_Fragment, {
|
|
10
12
|
children: [
|
|
11
|
-
placements.map((placement
|
|
13
|
+
previewPages(placements).map((placement)=>/*#__PURE__*/ _jsxs("p", {
|
|
14
|
+
className: "xp-ui-button-group",
|
|
12
15
|
children: [
|
|
13
16
|
placementLine(placement),
|
|
17
|
+
placement.slotCount > 1 ? placementCount(placement.slotCount) : null,
|
|
14
18
|
' ',
|
|
15
|
-
placement.editorUrl ? /*#__PURE__*/ _jsx(
|
|
19
|
+
placement.editorUrl ? /*#__PURE__*/ _jsx(Button, {
|
|
20
|
+
variant: "link",
|
|
21
|
+
size: "sm",
|
|
16
22
|
href: placement.editorUrl,
|
|
17
23
|
children: C.openPage
|
|
18
24
|
}) : null
|
|
19
25
|
]
|
|
20
|
-
},
|
|
26
|
+
}, placement.key)),
|
|
21
27
|
/*#__PURE__*/ _jsx("p", {
|
|
22
28
|
children: C.editedOnPage
|
|
23
29
|
})
|
|
@@ -30,32 +36,31 @@ function Binding({ test }) {
|
|
|
30
36
|
function VersionContent({ test, armIndex }) {
|
|
31
37
|
const arm = test.doc?.arms[armIndex];
|
|
32
38
|
if (!arm) return null;
|
|
33
|
-
if (arm.kind === 'holdout') return /*#__PURE__*/ _jsx("
|
|
39
|
+
if (arm.kind === 'holdout') return /*#__PURE__*/ _jsx("span", {
|
|
40
|
+
className: "xp-content-chip",
|
|
34
41
|
children: C.holdoutContent
|
|
35
42
|
});
|
|
36
43
|
const placements = test.preflight?.placements ?? [];
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
44
|
+
const pages = previewPages(placements);
|
|
45
|
+
const ready = placements.length > 0 && placements.every((placement)=>slotReady(placement, arm));
|
|
46
|
+
return /*#__PURE__*/ _jsxs("div", {
|
|
47
|
+
className: "xp-version-content",
|
|
48
|
+
children: [
|
|
49
|
+
/*#__PURE__*/ _jsx("span", {
|
|
50
|
+
className: `xp-content-chip ${ready ? 'xp-content-ready' : 'xp-content-empty'}`,
|
|
51
|
+
children: ready ? C.ready : C.empty
|
|
52
|
+
}),
|
|
53
|
+
/*#__PURE__*/ _jsx("div", {
|
|
54
|
+
className: "xp-ui-button-group",
|
|
55
|
+
children: pages.filter((page)=>page.editorUrl).map((page)=>/*#__PURE__*/ _jsx(Button, {
|
|
56
|
+
variant: "link",
|
|
57
|
+
size: "sm",
|
|
58
|
+
href: page.editorUrl,
|
|
59
|
+
"aria-label": pages.length > 1 ? `${C.editOnPage}: ${page.title}` : undefined,
|
|
53
60
|
children: C.editOnPage
|
|
54
|
-
})
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
children: C.emptySlot
|
|
58
|
-
})
|
|
61
|
+
}, page.key))
|
|
62
|
+
})
|
|
63
|
+
]
|
|
59
64
|
});
|
|
60
65
|
}
|
|
61
66
|
export const pageBlockParts = {
|