@manta-eu/react 0.5.1 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/button/index.d.ts +1 -0
- package/dist/components/button/index.d.ts.map +1 -1
- package/dist/components/button/index.js +17 -1
- package/dist/components/button/index.js.map +1 -1
- package/dist/components/chat-view/ToolApprovalPart.d.ts +12 -0
- package/dist/components/chat-view/ToolApprovalPart.d.ts.map +1 -0
- package/dist/components/chat-view/ToolApprovalPart.js +12 -0
- package/dist/components/chat-view/ToolApprovalPart.js.map +1 -0
- package/dist/components/chat-view/ToolMessagePart.d.ts.map +1 -1
- package/dist/components/chat-view/ToolMessagePart.js +7 -15
- package/dist/components/chat-view/ToolMessagePart.js.map +1 -1
- package/dist/components/chat-view/tool-part-rendering.js +1 -1
- package/dist/components/chat-view/tool-part-rendering.js.map +1 -1
- package/dist/components/modal/index.d.ts +4 -0
- package/dist/components/modal/index.d.ts.map +1 -1
- package/dist/components/modal/index.js +11 -3
- package/dist/components/modal/index.js.map +1 -1
- package/dist/components/planning/ActionPlanDetailView.d.ts +1 -0
- package/dist/components/planning/ActionPlanDetailView.d.ts.map +1 -1
- package/dist/components/planning/ActionPlanDetailView.js +2 -2
- package/dist/components/planning/ActionPlanDetailView.js.map +1 -1
- package/dist/components/planning/ConnectedPlanDetailView.d.ts +1 -0
- package/dist/components/planning/ConnectedPlanDetailView.d.ts.map +1 -1
- package/dist/components/planning/ConnectedPlanDetailView.js.map +1 -1
- package/dist/components/planning/TopBar.d.ts +1 -0
- package/dist/components/planning/TopBar.d.ts.map +1 -1
- package/dist/components/planning/TopBar.js +7 -4
- package/dist/components/planning/TopBar.js.map +1 -1
- package/dist/components/planning/plan-detail-utils.d.ts +1 -0
- package/dist/components/planning/plan-detail-utils.d.ts.map +1 -1
- package/dist/components/planning/plan-detail-utils.js +4 -1
- package/dist/components/planning/plan-detail-utils.js.map +1 -1
- package/dist/components/sheet/index.d.ts +13 -19
- package/dist/components/sheet/index.d.ts.map +1 -1
- package/dist/components/sheet/index.js +8 -2
- package/dist/components/sheet/index.js.map +1 -1
- package/dist/components/table/index.d.ts +7 -1
- package/dist/components/table/index.d.ts.map +1 -1
- package/dist/components/table/index.js +18 -12
- package/dist/components/table/index.js.map +1 -1
- package/dist/components/tool-invocation-card/ToolActions.d.ts +2 -4
- package/dist/components/tool-invocation-card/ToolActions.d.ts.map +1 -1
- package/dist/components/tool-invocation-card/ToolActions.js +2 -9
- package/dist/components/tool-invocation-card/ToolActions.js.map +1 -1
- package/dist/components/tool-invocation-card/ToolHeader.d.ts +0 -1
- package/dist/components/tool-invocation-card/ToolHeader.d.ts.map +1 -1
- package/dist/components/tool-invocation-card/ToolHeader.js +11 -4
- package/dist/components/tool-invocation-card/ToolHeader.js.map +1 -1
- package/dist/components/tool-invocation-card/ToolInvocationCard.d.ts +0 -7
- package/dist/components/tool-invocation-card/ToolInvocationCard.d.ts.map +1 -1
- package/dist/components/tool-invocation-card/ToolInvocationCard.js +6 -8
- package/dist/components/tool-invocation-card/ToolInvocationCard.js.map +1 -1
- package/dist/globals.css +1526 -2772
- package/dist/hooks/use-connection-problems.d.ts.map +1 -1
- package/dist/hooks/useActionGraph.d.ts +7 -0
- package/dist/hooks/useActionGraph.d.ts.map +1 -0
- package/dist/hooks/useActionGraph.js +23 -0
- package/dist/hooks/useActionGraph.js.map +1 -0
- package/dist/hooks/useValidateActionPlan.d.ts.map +1 -1
- package/dist/lib/tool-icons.d.ts.map +1 -1
- package/dist/lib/tool-icons.js +1 -0
- package/dist/lib/tool-icons.js.map +1 -1
- package/dist/routes/integrations/components/connect-forms/MetaAdsConnectForm.d.ts +1 -1
- package/dist/routes/integrations/components/connect-forms/MetaAdsConnectForm.d.ts.map +1 -1
- package/dist/routes/integrations/components/connect-forms/MetaAdsConnectForm.js +64 -11
- package/dist/routes/integrations/components/connect-forms/MetaAdsConnectForm.js.map +1 -1
- package/dist/routes/integrations/components/connect-forms/OAuthSetupConnectForm.d.ts.map +1 -1
- package/dist/routes/integrations/components/connect-forms/OAuthSetupConnectForm.js +8 -2
- package/dist/routes/integrations/components/connect-forms/OAuthSetupConnectForm.js.map +1 -1
- package/dist/routes/integrations/components/connect-forms/meta-page-tree.d.ts +5 -0
- package/dist/routes/integrations/components/connect-forms/meta-page-tree.d.ts.map +1 -0
- package/dist/routes/integrations/components/connect-forms/meta-page-tree.js +16 -0
- package/dist/routes/integrations/components/connect-forms/meta-page-tree.js.map +1 -0
- package/dist/routes/integrations/components/connect-forms/oauth-setup-phase.d.ts +2 -1
- package/dist/routes/integrations/components/connect-forms/oauth-setup-phase.d.ts.map +1 -1
- package/dist/routes/integrations/components/connect-forms/oauth-setup-phase.js +4 -1
- package/dist/routes/integrations/components/connect-forms/oauth-setup-phase.js.map +1 -1
- package/dist/routes/integrations/connection-view.d.ts.map +1 -1
- package/dist/routes/integrations/connection-view.js +1 -0
- package/dist/routes/integrations/connection-view.js.map +1 -1
- package/dist/routes/plans/components/ActionPlansPage.d.ts.map +1 -1
- package/dist/routes/plans/components/ActionPlansPage.js +3 -3
- package/dist/routes/plans/components/ActionPlansPage.js.map +1 -1
- package/dist/routes/plans/components/PlanDetailRouteContent.d.ts.map +1 -1
- package/dist/routes/plans/components/PlanDetailRouteContent.js +3 -1
- package/dist/routes/plans/components/PlanDetailRouteContent.js.map +1 -1
- package/package.json +20 -15
- package/src/app-subpaths.json +1 -0
- package/src/components/button/index.tsx +17 -1
- package/src/components/chat-view/ToolApprovalPart.tsx +27 -0
- package/src/components/chat-view/ToolMessagePart.tsx +8 -25
- package/src/components/chat-view/tool-part-rendering.ts +1 -1
- package/src/components/modal/index.tsx +17 -2
- package/src/components/planning/ActionPlanDetailView.tsx +3 -0
- package/src/components/planning/ConnectedPlanDetailView.tsx +1 -0
- package/src/components/planning/TopBar.tsx +14 -3
- package/src/components/planning/plan-detail-utils.tsx +5 -1
- package/src/components/sheet/index.tsx +29 -6
- package/src/components/table/index.tsx +42 -12
- package/src/components/tool-invocation-card/ToolActions.tsx +5 -16
- package/src/components/tool-invocation-card/ToolHeader.tsx +13 -6
- package/src/components/tool-invocation-card/ToolInvocationCard.tsx +6 -23
- package/src/hooks/useActionGraph.ts +41 -0
- package/src/lib/tool-icons.ts +1 -0
- package/src/routes/integrations/components/connect-forms/MetaAdsConnectForm.tsx +131 -15
- package/src/routes/integrations/components/connect-forms/OAuthSetupConnectForm.tsx +8 -2
- package/src/routes/integrations/components/connect-forms/meta-page-tree.ts +17 -0
- package/src/routes/integrations/components/connect-forms/oauth-setup-phase.ts +6 -0
- package/src/routes/integrations/connection-view.ts +1 -0
- package/src/routes/plans/components/ActionPlansPage.tsx +4 -4
- package/src/routes/plans/components/PlanDetailRouteContent.tsx +3 -0
|
@@ -85,11 +85,12 @@ export function OAuthSetupConnectForm<Row extends SetupRow>(props: OAuthSetupCon
|
|
|
85
85
|
const [selectedIds, setSelectedIds] = useState<ReadonlySet<string>>(new Set());
|
|
86
86
|
const hasDismissedRef = useRef(false);
|
|
87
87
|
const [connectionExpired, setConnectionExpired] = useState(false);
|
|
88
|
+
const [submitted, setSubmitted] = useState(false);
|
|
88
89
|
|
|
89
90
|
const states = setup.progress?.state;
|
|
90
91
|
const phase = connectionExpired
|
|
91
92
|
? "failed"
|
|
92
|
-
: derivePhase({ states, hasStartedOAuth, hasSeenActiveState, resumesUnfinishedSetup });
|
|
93
|
+
: derivePhase({ states, hasStartedOAuth, hasSeenActiveState, resumesUnfinishedSetup, submitted });
|
|
93
94
|
|
|
94
95
|
useWindowFocusPoll(setup.refetchProgress, { enabled: activePhases.includes(phase), intervalMs: pollIntervalMs });
|
|
95
96
|
|
|
@@ -114,6 +115,7 @@ export function OAuthSetupConnectForm<Row extends SetupRow>(props: OAuthSetupCon
|
|
|
114
115
|
|
|
115
116
|
function handleOpened() {
|
|
116
117
|
setConnectionExpired(false);
|
|
118
|
+
setSubmitted(false);
|
|
117
119
|
setSelectedIds(new Set());
|
|
118
120
|
setup.resetProgress();
|
|
119
121
|
setHasSeenActiveState(false);
|
|
@@ -131,21 +133,25 @@ export function OAuthSetupConnectForm<Row extends SetupRow>(props: OAuthSetupCon
|
|
|
131
133
|
|
|
132
134
|
async function handleSubmit() {
|
|
133
135
|
if (selectedIds.size === 0) return;
|
|
136
|
+
setSubmitted(true);
|
|
134
137
|
try {
|
|
135
138
|
const result = await setup.connect([...selectedIds]);
|
|
136
139
|
if (result.state.includes(GQLGoogleSetupStateEnum.NotFound)) {
|
|
140
|
+
setSubmitted(false);
|
|
137
141
|
setConnectionExpired(true);
|
|
138
142
|
setSelectedIds(new Set());
|
|
139
143
|
return;
|
|
140
144
|
}
|
|
141
145
|
await setup.refetchProgress();
|
|
142
146
|
} catch (err) {
|
|
147
|
+
setSubmitted(false);
|
|
143
148
|
const info = parseError(err, `Failed to connect ${providerName}`);
|
|
144
149
|
toast.error(info.message, { description: info.description });
|
|
145
150
|
}
|
|
146
151
|
}
|
|
147
152
|
|
|
148
153
|
function handleRetry() {
|
|
154
|
+
setSubmitted(false);
|
|
149
155
|
setSelectedIds(new Set());
|
|
150
156
|
hasDismissedRef.current = false;
|
|
151
157
|
setup.resetProgress();
|
|
@@ -343,7 +349,7 @@ function SubmittingView(props: CopyProps) {
|
|
|
343
349
|
<div className="grid gap-4">
|
|
344
350
|
<div className="grid gap-1">
|
|
345
351
|
<h2 className="typography-large-body-semibold text-default-foreground">Connecting your {copy.entityPlural}</h2>
|
|
346
|
-
<p className="typography-caption text-muted-foreground">
|
|
352
|
+
<p className="typography-caption text-muted-foreground">This can take a minute. Keep this window open.</p>
|
|
347
353
|
</div>
|
|
348
354
|
<StatusLine label="Provisioning…" />
|
|
349
355
|
</div>
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { GQLMetaPageKind, type GQLMetaPage } from "@manta-eu/client";
|
|
2
|
+
import { buildTreeRows, type TreeSelectItem } from "#components/tree-multi-select/index";
|
|
3
|
+
|
|
4
|
+
// Each Instagram account sits under the Page it is linked to, and is picked on its own.
|
|
5
|
+
export function metaPageTreeItems(pages: readonly GQLMetaPage[]): TreeSelectItem[] {
|
|
6
|
+
return buildTreeRows(pages).map(({ node, depth }) => ({
|
|
7
|
+
id: node.id,
|
|
8
|
+
label: node.name ?? (node.kind === GQLMetaPageKind.Instagram ? `Instagram account ${node.id}` : node.id),
|
|
9
|
+
caption: node.kind === GQLMetaPageKind.Instagram ? "Instagram" : undefined,
|
|
10
|
+
selectable: true,
|
|
11
|
+
depth,
|
|
12
|
+
}));
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export function picksAPage(pages: readonly GQLMetaPage[], selectedIds: ReadonlySet<string>): boolean {
|
|
16
|
+
return pages.some((page) => page.kind === GQLMetaPageKind.Page && selectedIds.has(page.id));
|
|
17
|
+
}
|
|
@@ -9,6 +9,8 @@ export type DerivePhaseInput = {
|
|
|
9
9
|
hasSeenActiveState: boolean;
|
|
10
10
|
// Off when the account is connected before its picker, so a leftover setup cannot stand in for a new sign-in.
|
|
11
11
|
resumesUnfinishedSetup?: boolean;
|
|
12
|
+
// Connect was sent: progress reads the old state until the connect has run, so only an outcome ends it.
|
|
13
|
+
submitted?: boolean;
|
|
12
14
|
};
|
|
13
15
|
|
|
14
16
|
const statePriority: readonly GQLGoogleSetupStateEnum[] = [
|
|
@@ -34,10 +36,14 @@ export function derivePhase({
|
|
|
34
36
|
hasStartedOAuth,
|
|
35
37
|
hasSeenActiveState,
|
|
36
38
|
resumesUnfinishedSetup = true,
|
|
39
|
+
submitted = false,
|
|
37
40
|
}: DerivePhaseInput): Phase {
|
|
38
41
|
const defaultPhase: Phase = hasStartedOAuth ? "awaitingOAuth" : "idle";
|
|
39
42
|
if (!hasStartedOAuth && !resumesUnfinishedSetup) return defaultPhase;
|
|
40
43
|
const dominant = statePriority.find((state) => states?.includes(state));
|
|
44
|
+
const settled =
|
|
45
|
+
states?.includes(GQLGoogleSetupStateEnum.NotFound) || (dominant !== undefined && terminalStates.includes(dominant));
|
|
46
|
+
if (submitted && !settled) return "submitting";
|
|
41
47
|
if (dominant && terminalStates.includes(dominant) && !hasSeenActiveState) return defaultPhase;
|
|
42
48
|
return match(dominant)
|
|
43
49
|
.returnType<Phase>()
|
|
@@ -87,6 +87,7 @@ const grantExpiryWarningDays = 14;
|
|
|
87
87
|
// Integrations whose account is limited to what was picked at connect time, so an empty pick reads nothing.
|
|
88
88
|
const oauthIncludedResourcesLabels: Partial<Record<GQLIntegration, { label: string; noneLabel: string }>> = {
|
|
89
89
|
[GQLIntegration.Dash]: { label: "Folders", noneLabel: "No folders selected" },
|
|
90
|
+
[GQLIntegration.Meta]: { label: "Pages", noneLabel: "No Pages picked, reconnect to pick them" },
|
|
90
91
|
};
|
|
91
92
|
|
|
92
93
|
function timeAgoLabel(event: string, at: string | null | undefined): string | undefined {
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
|
|
3
|
-
import { GQLActionPlanState } from "@manta-eu/client";
|
|
4
3
|
import { buildPlanHref as defaultBuildPlanHref } from "@manta-eu/client/shared/agent-mode";
|
|
5
4
|
import { isPresent } from "@manta-eu/lib/present";
|
|
6
5
|
import type { SortingState } from "@tanstack/react-table";
|
|
@@ -32,6 +31,7 @@ import {
|
|
|
32
31
|
} from "./actionPlansTableConfig";
|
|
33
32
|
import { renderDefaultActionPlansFrame, type ActionPlansFrameProps } from "./frame";
|
|
34
33
|
import { ExecutePlanDialog } from "#components/planning/ExecutePlanDialog";
|
|
34
|
+
import { canNeedApproval } from "#components/planning/plan-detail-utils";
|
|
35
35
|
import { createTableConfig, useTableState } from "#components/table/index";
|
|
36
36
|
import { useActionPlans } from "#hooks/useActionPlans";
|
|
37
37
|
import { useFittedPagination } from "#hooks/useFittedPagination";
|
|
@@ -168,13 +168,13 @@ export function ActionPlansPage(props: ActionPlansPageProps) {
|
|
|
168
168
|
}
|
|
169
169
|
}, [count, isLoading, pageIndex, totalPages]);
|
|
170
170
|
|
|
171
|
-
const
|
|
172
|
-
() => plans.filter((plan) => plan.state
|
|
171
|
+
const approvablePlanIris = useMemo(
|
|
172
|
+
() => plans.filter((plan) => canNeedApproval(plan.state)).map((plan) => plan.iri),
|
|
173
173
|
[plans],
|
|
174
174
|
);
|
|
175
175
|
|
|
176
176
|
const { data: manualActionsByPlan } = useManualActionsForPlans({
|
|
177
|
-
planGraphIris:
|
|
177
|
+
planGraphIris: approvablePlanIris,
|
|
178
178
|
refetchIntervalMs: 10000,
|
|
179
179
|
});
|
|
180
180
|
|
|
@@ -21,6 +21,7 @@ import type { PlanViewMode } from "#components/planning/TopBar";
|
|
|
21
21
|
import { useActionPlanDetail } from "#hooks/useActionPlanDetail";
|
|
22
22
|
import { useActionPlanExecution } from "#hooks/useActionPlanExecution";
|
|
23
23
|
import { ActionPlanChangesTable, useActionPlanExecutionProvenance, useManualActions } from "#ldo-ui";
|
|
24
|
+
import { getPendingManualActions } from "#lib/manual-actions";
|
|
24
25
|
import { useMantaClient } from "#providers/MantaClientProvider";
|
|
25
26
|
import { ActivityDetail } from "#routes/activity/detail/ActivityDetail";
|
|
26
27
|
import { invalidateActionPlanQueries } from "#shared/query-keys";
|
|
@@ -138,6 +139,7 @@ export function PlanDetailRouteContent(props: PlanDetailRouteContentProps) {
|
|
|
138
139
|
triggeredAtMs: executionControl.triggeredAtMs,
|
|
139
140
|
isRunningOverride: hasConfirmedExecution || hasExecutionEvidence,
|
|
140
141
|
});
|
|
142
|
+
const pendingApprovalCount = getPendingManualActions(manualActions).length;
|
|
141
143
|
const { triggeredAtMs, dryRun } = executionControl;
|
|
142
144
|
const isDryRun = deriveIsDryRun({ provenance: executionProvenance ?? null, triggeredAtMs, dryRun });
|
|
143
145
|
const shouldShowActioningSurface =
|
|
@@ -180,6 +182,7 @@ export function PlanDetailRouteContent(props: PlanDetailRouteContentProps) {
|
|
|
180
182
|
viewMode={activeViewMode}
|
|
181
183
|
stateOverride={derivedPlanState}
|
|
182
184
|
isDryRun={isDryRun}
|
|
185
|
+
pendingApprovalCount={pendingApprovalCount}
|
|
183
186
|
onViewModeChange={setViewMode}
|
|
184
187
|
onExecute={detailExecuteAction}
|
|
185
188
|
onCancel={detailCancelAction}
|