@burdenoff/fluidgrids-fe-sdk 2026.1115.11 → 2026.1115.13
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/{AiStudioPage-BeiquIMB.js → AiStudioPage-Cb0JCEB1.js} +4 -4
- package/dist/{ApprovalInboxPage-BRnmz88g.js → ApprovalInboxPage-eI3jF2FR.js} +1 -1
- package/dist/{DataSinkDashboardPage-D6nE6EgZ.js → DataSinkDashboardPage-CbyUgXro.js} +1 -1
- package/dist/{DataTablesPage-Dnmd_wKx.js → DataTablesPage-xtPEAiwW.js} +2 -2
- package/dist/{Disclosure-C3xMLSU-.js → Disclosure-Dps1H0ho.js} +1 -1
- package/dist/{ExecutionDetailPage-B_P-YvYG.js → ExecutionDetailPage-fsr3gOjG.js} +6 -6
- package/dist/{ExecutionsListPage-DG6_8hB3.js → ExecutionsListPage-h7IQfUeQ.js} +6 -6
- package/dist/{FluidGridsProvider-DX6Thg3Z.js → FluidGridsProvider-Ydj45LFA.js} +3 -3
- package/dist/{HistoryPage-Bovdj1vl.js → HistoryPage-Cs7_Le-7.js} +2 -2
- package/dist/{InsightsPage-V48lDU2T.js → InsightsPage-uR_lHf3x.js} +2 -2
- package/dist/{NodesPage-D8rMR0is.js → NodesPage-BHwje3l_.js} +2 -2
- package/dist/{OfflineIcon-DnKb-mo2.js → OfflineIcon-B53l9rQ-.js} +17 -1
- package/dist/{PaidTemplateConfirm-BOV478tt.js → PaidTemplateConfirm-Cmqi4wP_.js} +1 -1
- package/dist/{RunnersPage-XXDoZ0R1.js → RunnersPage-CXM5Uup2.js} +1 -1
- package/dist/{SettingsPage-Bwq_VNLe.js → SettingsPage-D-R4AJAt.js} +3 -3
- package/dist/{TechnicalDetails-xQtjIWWx.js → TechnicalDetails-DR1dt28G.js} +1 -1
- package/dist/{TemplateCard-B4SfeuOJ.js → TemplateCard-ZC1uQyNw.js} +4 -4
- package/dist/{TemplateDetailPanel-DFUiz6n7.js → TemplateDetailPanel-Cj1PKs3N.js} +2 -2
- package/dist/{TemplatePreview-CGU41Exc.js → TemplatePreview-DPcfznfO.js} +6 -6
- package/dist/{TemplatesPage-VKeqKdNZ.js → TemplatesPage-BXiPQxBz.js} +10 -10
- package/dist/{VariablesPage-CFzJFbMb.js → VariablesPage-BCgRsR0S.js} +1 -1
- package/dist/{WorkflowBuilder-D1rKfRjJ.js → WorkflowBuilder-BBjFx-1X.js} +4 -4
- package/dist/{WorkflowBuilder-CfUyB2cA.js → WorkflowBuilder-DnFYRA-p.js} +6 -6
- package/dist/{WorkflowSearchRedirect-Bkm8KsQy.js → WorkflowSearchRedirect-BXrqLvQf.js} +1 -1
- package/dist/{WorkflowsList-BgE2Bcwo.js → WorkflowsList-DsB3z9mG.js} +6 -6
- package/dist/{agentTools-CAC40gup.js → agentTools-DSaRE3TZ.js} +3 -3
- package/dist/{attach-node-helpers-vlWwLKOg.js → attach-node-helpers-DYjc758L.js} +1 -1
- package/dist/{canvasNoteTools-CfvyJ2Mg.js → canvasNoteTools-BTf5CT_u.js} +2 -2
- package/dist/executions.js +2 -2
- package/dist/{flow-builder-C-xoP1_y.js → flow-builder-CvIYh0bh.js} +18 -18
- package/dist/history.js +1 -1
- package/dist/{index-U_t_24Ac.d.ts → index-CfCILuL4.d.ts} +95 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +270 -35
- package/dist/{logs-panel-CMwkrzx_.js → logs-panel-K2Wjz9Yd.js} +1 -1
- package/dist/{node-detail-view-CWPyhSWR.js → node-detail-view-D0pXe5yt.js} +6 -6
- package/dist/{node-editor-tab-body-CMUbqr58.js → node-editor-tab-body-CZ_Um4rr.js} +3 -3
- package/dist/{node-operation-selection-sT7nCmDk.js → node-operation-selection-zPxY9eF4.js} +1 -1
- package/dist/{node-type-icon-BiX35H0z.js → node-type-icon-IADvPV1_.js} +2 -2
- package/dist/nodes.js +1 -1
- package/dist/observability.d.ts +1 -1
- package/dist/observability.js +2 -2
- package/dist/{popover-DlMR7TwZ.js → popover-BdqaLySD.js} +644 -12
- package/dist/{quick-config-panel-ClRN9k1I.js → quick-config-panel-CanGdzpe.js} +5 -5
- package/dist/{schedule-panel-BudusAdi.js → schedule-panel-BdHFNvkT.js} +314 -16
- package/dist/settings.js +1 -1
- package/dist/{sidebar-node-editor-COmLMrwX.js → sidebar-node-editor-BpfjeN-T.js} +5 -5
- package/dist/{store-icon-Bgmyn3Lt.js → store-icon-6Rkkftm4.js} +47 -3
- package/dist/{template-preview-BwOqyuFH.js → template-preview-Ct4S67II.js} +1 -1
- package/dist/templates.js +2 -2
- package/dist/{use-workflow-code-editor-DJMH7-Xx.js → use-workflow-code-editor-DUebU6MB.js} +1 -1
- package/dist/{useDurableParity-Cglyf8HC.js → useDurableParity-BuRiO7wA.js} +1 -1
- package/dist/{useExecutions-Cdgkadhu.js → useExecutions-CdBdvAH6.js} +1 -1
- package/dist/{useGlobalStoreClient-BuSeLKRC.js → useGlobalStoreClient-hPq_o_TH.js} +1 -1
- package/dist/{useObservability-C3pjy6Ol.js → useObservability-CCEjQJzb.js} +1 -1
- package/dist/{useRunHistory-ORb_kIUO.js → useRunHistory-DiFkcMmE.js} +1 -1
- package/dist/{useWorkflowCodeExport-C7BTGUOA.js → useWorkflowCodeExport-DD_SEzK0.js} +1 -1
- package/dist/{useWorkflows-DtuE-oYn.js → useWorkflows-D7zjwT5t.js} +1 -1
- package/dist/workflow-builder.js +5 -5
- package/dist/{workflow-description-Dt9VrAov.js → workflow-description-CRndQlF4.js} +1 -1
- package/dist/workflow-pages.d.ts +1 -1
- package/dist/workflow-pages.js +18 -18
- package/dist/workflow-preview.js +1 -1
- package/dist/workflows-list.js +1 -1
- package/package.json +1 -1
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import { t as NodeTypeIcon } from "./node-type-icon-
|
|
3
|
-
import { A as useFlowStore, k as nodeAccent } from "./node-operation-selection-
|
|
4
|
-
import { H as nodeSubtitle,
|
|
5
|
-
import { i as NodeInputFields, n as useNodeEditorTab, r as NodeEditorTabs, t as NodeEditorTabBody } from "./node-editor-tab-body-
|
|
2
|
+
import { t as NodeTypeIcon } from "./node-type-icon-IADvPV1_.js";
|
|
3
|
+
import { A as useFlowStore, k as nodeAccent } from "./node-operation-selection-zPxY9eF4.js";
|
|
4
|
+
import { Fn as getNodeDetail, H as nodeSubtitle, Jt as useNodeExecution, U as nodeTitle, q as useNodeConfig } from "./FluidGridsProvider-Ydj45LFA.js";
|
|
5
|
+
import { i as NodeInputFields, n as useNodeEditorTab, r as NodeEditorTabs, t as NodeEditorTabBody } from "./node-editor-tab-body-CZ_Um4rr.js";
|
|
6
6
|
import { r as useTr } from "./TranslationBridge-Da-TPgQm.js";
|
|
7
|
-
import { r as NodeExecutionActions } from "./schedule-panel-
|
|
7
|
+
import { r as NodeExecutionActions } from "./schedule-panel-BdHFNvkT.js";
|
|
8
8
|
import { useEffect, useLayoutEffect, useMemo, useRef, useState } from "react";
|
|
9
9
|
import { useReactFlow, useStore } from "@xyflow/react";
|
|
10
10
|
import { Icon } from "@iconify/react";
|
|
@@ -2,17 +2,17 @@
|
|
|
2
2
|
import { r as getFluidGridsConfig } from "./config-X97zrIvn.js";
|
|
3
3
|
import { o as throwIfResultError, t as describeOperationError } from "./errors-xPZ-IbQd.js";
|
|
4
4
|
import { n as getFluidGridsClient, r as getFluidGridsClientSafe } from "./client-Ctl4jmY3.js";
|
|
5
|
-
import { A as useFlowStore } from "./node-operation-selection-
|
|
6
|
-
import { $ as resolveLoadOptionsSpec, B as coerceNumber, Dt as useSaveStatusStore, G as paramsFromOperation, L as useRunGuard, Q as optionListValues, U as nodeTitle, W as optionText, X as isStringOptionList, Z as optionListText, an as
|
|
5
|
+
import { A as useFlowStore } from "./node-operation-selection-zPxY9eF4.js";
|
|
6
|
+
import { $ as resolveLoadOptionsSpec, B as coerceNumber, Dt as useSaveStatusStore, G as paramsFromOperation, L as useRunGuard, Q as optionListValues, U as nodeTitle, W as optionText, X as isStringOptionList, Z as optionListText, an as parseParameterValue, dn as openRunQuotaUpgradePrompt, et as ConditionTreeBuilder, in as formatParameterValue, it as parseMappingValue, ln as isParamVisible, nt as casesFromRules, on as structuredParameterType, ot as boundFieldsOf, qt as subscribeWorkflowSaved, st as missingRequiredParameters, t as FluidGridsContext, tt as SwitchRulesEditor, un as useFluidGridsAnalytics, z as asRecord } from "./FluidGridsProvider-Ydj45LFA.js";
|
|
7
7
|
import { n as useBuilderReadOnly } from "./read-only-context-Dt9N9SIG.js";
|
|
8
8
|
import { r as useTr } from "./TranslationBridge-Da-TPgQm.js";
|
|
9
9
|
import { m as usePhaseCFlags } from "./feature-flags-B_b8PJ6Z.js";
|
|
10
10
|
import { B as unpauseSchedule, E as pauseSchedule, R as triggerSchedule, S as fetchSearchAttributes, t as backfillSchedule, u as describeSchedule } from "./api-D1cWC1yx.js";
|
|
11
11
|
import { ht as useRunFromNodeEligibilityQuery, rn as PreviewScheduleDocument } from "./operations-qq_bbgXP.js";
|
|
12
|
-
import { C as RegenerateEventRegistrationTokenDocument, S as
|
|
12
|
+
import { C as InboundMailSettingsDocument, D as ListenForWebhookTestEventDocument, E as RegenerateEventRegistrationTokenDocument, O as ListenForInboundTestEmailDocument, S as InboundMailboxDocument, T as RotateInboundMailboxAddressDocument, _ as webhookDeliveriesPath, b as WorkflowCallInputsDocument, k as ListenForFormTestSubmissionDocument, n as PopoverContent$1, r as PopoverTrigger$1, t as Popover$1, v as RunOnSection, w as StopWebhookTestListenerDocument, x as WebhookTestListenerDocument, y as ConnectionSelector } from "./popover-BdqaLySD.js";
|
|
13
13
|
import { a as collectExtensions } from "./quota-Cdt8yz7N.js";
|
|
14
14
|
import { ek as ScheduleType, mL as WorkflowScheduleOverlapPolicy } from "./graphql-types-BdhNiBrG.js";
|
|
15
|
-
import { t as useGlobalStoreClient } from "./useGlobalStoreClient-
|
|
15
|
+
import { t as useGlobalStoreClient } from "./useGlobalStoreClient-hPq_o_TH.js";
|
|
16
16
|
import { a as operatorSpec, c as ruleFromRow, i as normaliseAssertRules, n as describeAssertRuleProblem, o as readAssertRulesSetting, r as emptyAssertRuleRow, s as rowsFromRules, t as ASSERT_OPERATORS } from "./assert-rules-Dh_rU0vR.js";
|
|
17
17
|
import { r as describeRule, s as isAgentNodeType } from "./agent-form-Bfvm32j1.js";
|
|
18
18
|
import { i as NativeSelect, l as parseJsonObjectInput, o as StatusPill, t as FieldError, u as useResource } from "./shared-mbyvDPde.js";
|
|
@@ -676,9 +676,14 @@ function useRegenerateWebhookUrl() {
|
|
|
676
676
|
/** Where a run-quota refusal while arming is reported (arming spends a run). */
|
|
677
677
|
const TEST_LISTENER_QUOTA_SURFACE = {
|
|
678
678
|
webhook: "webhook-test",
|
|
679
|
-
form: "form-test"
|
|
679
|
+
form: "form-test",
|
|
680
|
+
email: "email-test"
|
|
680
681
|
};
|
|
681
682
|
async function armRaw(client, kind, input) {
|
|
683
|
+
if (kind === "email") return throwIfResultError(await client.mutate({
|
|
684
|
+
mutation: ListenForInboundTestEmailDocument,
|
|
685
|
+
variables: { input }
|
|
686
|
+
})).data?.listenForInboundTestEmail ?? null;
|
|
682
687
|
if (kind === "form") return throwIfResultError(await client.mutate({
|
|
683
688
|
mutation: ListenForFormTestSubmissionDocument,
|
|
684
689
|
variables: { input }
|
|
@@ -893,7 +898,7 @@ function useWebhookTestListener(target, onReceived, kind = "webhook") {
|
|
|
893
898
|
}
|
|
894
899
|
|
|
895
900
|
// src/builder/components/ndv/webhook-url-field.tsx
|
|
896
|
-
const SECTION_LABEL$
|
|
901
|
+
const SECTION_LABEL$6 = "text-[11px] font-semibold uppercase tracking-[0.12em] text-muted-foreground";
|
|
897
902
|
/** True for an absolute http(s) URL; anything else is never rendered as a link. */
|
|
898
903
|
function isSafeHttpUrl(value) {
|
|
899
904
|
try {
|
|
@@ -978,7 +983,7 @@ function WebhookUrlField({ webhookUrl, loading, registrationId }) {
|
|
|
978
983
|
children: [/* @__PURE__ */ jsxs("div", {
|
|
979
984
|
className: "flex items-center gap-2",
|
|
980
985
|
children: [/* @__PURE__ */ jsx("div", {
|
|
981
|
-
className: SECTION_LABEL$
|
|
986
|
+
className: SECTION_LABEL$6,
|
|
982
987
|
children: tr("fluidgrids.builder.webhookUrlField.productionLabel", "Production URL")
|
|
983
988
|
}), webhookUrl && isActiveVersion && /* @__PURE__ */ jsx("span", {
|
|
984
989
|
className: "rounded-full bg-primary/10 px-2 py-0.5 text-[10px] font-medium text-primary",
|
|
@@ -1024,7 +1029,7 @@ function FormUrlField({ formUrl, loading, error }) {
|
|
|
1024
1029
|
children: [/* @__PURE__ */ jsxs("div", {
|
|
1025
1030
|
className: "flex items-center gap-2",
|
|
1026
1031
|
children: [/* @__PURE__ */ jsx("div", {
|
|
1027
|
-
className: SECTION_LABEL$
|
|
1032
|
+
className: SECTION_LABEL$6,
|
|
1028
1033
|
children: tr("fluidgrids.builder.webhookUrlField.productionLabel", "Production URL")
|
|
1029
1034
|
}), safeUrl && !error && isActiveVersion && /* @__PURE__ */ jsx("span", {
|
|
1030
1035
|
className: "rounded-full bg-primary/10 px-2 py-0.5 text-[10px] font-medium text-primary",
|
|
@@ -1093,13 +1098,14 @@ function TestListenerPanel({ nodeId, kind, testIdPrefix, copy }) {
|
|
|
1093
1098
|
default: outcome = null;
|
|
1094
1099
|
}
|
|
1095
1100
|
const idleHint = hasUnsavedChanges && copy.unsavedChangesHint ? copy.unsavedChangesHint : copy.hint;
|
|
1096
|
-
const
|
|
1101
|
+
const rawTestUrl = listening ? listener.testUrl : null;
|
|
1102
|
+
const testUrl = rawTestUrl?.startsWith("mailto:") ? rawTestUrl.slice(7) : rawTestUrl;
|
|
1097
1103
|
return /* @__PURE__ */ jsxs("div", {
|
|
1098
1104
|
className: "space-y-2",
|
|
1099
1105
|
"data-testid": testIdPrefix,
|
|
1100
1106
|
children: [
|
|
1101
1107
|
/* @__PURE__ */ jsx("div", {
|
|
1102
|
-
className: SECTION_LABEL$
|
|
1108
|
+
className: SECTION_LABEL$6,
|
|
1103
1109
|
children: copy.label
|
|
1104
1110
|
}),
|
|
1105
1111
|
!saved ? /* @__PURE__ */ jsx("div", {
|
|
@@ -1225,9 +1231,45 @@ function FormTestListenerControls({ nodeId }) {
|
|
|
1225
1231
|
copy
|
|
1226
1232
|
});
|
|
1227
1233
|
}
|
|
1234
|
+
/**
|
|
1235
|
+
* "Listen for test email" on the Inbound Email trigger (BOFF-11893): the next
|
|
1236
|
+
* message sent to the node's address within the window starts one TEST run of
|
|
1237
|
+
* the saved version open in the editor instead of a production run, and the
|
|
1238
|
+
* canvas follows it.
|
|
1239
|
+
*/
|
|
1240
|
+
function InboundTestEmailListenerField({ nodeId }) {
|
|
1241
|
+
return useBuilderReadOnly() ? null : /* @__PURE__ */ jsx(InboundTestEmailListenerControls, { nodeId });
|
|
1242
|
+
}
|
|
1243
|
+
function InboundTestEmailListenerControls({ nodeId }) {
|
|
1244
|
+
const tr = useTr();
|
|
1245
|
+
const version = useFlowStore((s) => s.workflow.version);
|
|
1246
|
+
const copy = {
|
|
1247
|
+
label: tr("fluidgrids.builder.inboundEmail.testLabel", "Test email"),
|
|
1248
|
+
unsaved: tr("fluidgrids.builder.inboundEmail.unsaved", "Save the workflow to get its email address."),
|
|
1249
|
+
listen: tr("fluidgrids.builder.inboundEmail.listen", "Listen for test email"),
|
|
1250
|
+
hint: tr("fluidgrids.builder.inboundEmail.listenHint", "The next message to the address starts a test run of the saved version {{version}} instead of a production run.", { version }),
|
|
1251
|
+
unsavedChangesHint: tr("fluidgrids.builder.inboundEmail.unsavedChanges", "Save the workflow first: the test uses the saved version {{version}}, without your unsaved changes.", { version }),
|
|
1252
|
+
listening: (seconds) => tr("fluidgrids.builder.inboundEmail.listening", "Waiting for one test email to version {{version}} — {{seconds}}s left. Send it to the address below.", {
|
|
1253
|
+
version,
|
|
1254
|
+
seconds
|
|
1255
|
+
}),
|
|
1256
|
+
received: tr("fluidgrids.builder.inboundEmail.received", "Test email received — the run is shown on the canvas."),
|
|
1257
|
+
expired: tr("fluidgrids.builder.inboundEmail.expired", "Stopped listening: no test email arrived in time."),
|
|
1258
|
+
stopped: tr("fluidgrids.builder.webhookTestListener.stopped", "Stopped listening."),
|
|
1259
|
+
failed: tr("fluidgrids.builder.inboundEmail.failed", "The test email arrived but the run could not be started."),
|
|
1260
|
+
stopLabel: tr("fluidgrids.builder.webhookTestListener.stop", "Stop"),
|
|
1261
|
+
copyAriaLabel: tr("fluidgrids.builder.inboundEmail.copyAriaLabel", "Copy email address")
|
|
1262
|
+
};
|
|
1263
|
+
return /* @__PURE__ */ jsx(TestListenerPanel, {
|
|
1264
|
+
nodeId,
|
|
1265
|
+
kind: "email",
|
|
1266
|
+
testIdPrefix: "ndv-inbound-email-test",
|
|
1267
|
+
copy
|
|
1268
|
+
});
|
|
1269
|
+
}
|
|
1228
1270
|
|
|
1229
1271
|
// src/builder/components/ndv/manual-push-setup-field.tsx
|
|
1230
|
-
const SECTION_LABEL$
|
|
1272
|
+
const SECTION_LABEL$5 = "text-[11px] font-semibold uppercase tracking-[0.12em] text-muted-foreground";
|
|
1231
1273
|
/** The value the server sends back in place of a stored secret. */
|
|
1232
1274
|
const REDACTED_SECRET = "[REDACTED]";
|
|
1233
1275
|
function UrlSection({ url, loading, testIdPrefix }) {
|
|
@@ -1239,7 +1281,7 @@ function UrlSection({ url, loading, testIdPrefix }) {
|
|
|
1239
1281
|
className: "space-y-2",
|
|
1240
1282
|
children: [
|
|
1241
1283
|
/* @__PURE__ */ jsx("div", {
|
|
1242
|
-
className: SECTION_LABEL$
|
|
1284
|
+
className: SECTION_LABEL$5,
|
|
1243
1285
|
children: tr("fluidgrids.builder.manualPush.urlLabel", "Trigger URL")
|
|
1244
1286
|
}),
|
|
1245
1287
|
safeUrl ? /* @__PURE__ */ jsx(CopyableUrl, {
|
|
@@ -1267,7 +1309,7 @@ function InstructionsSection({ setup, testIdPrefix }) {
|
|
|
1267
1309
|
"data-testid": `${testIdPrefix}-instructions`,
|
|
1268
1310
|
children: [
|
|
1269
1311
|
/* @__PURE__ */ jsx("div", {
|
|
1270
|
-
className: SECTION_LABEL$
|
|
1312
|
+
className: SECTION_LABEL$5,
|
|
1271
1313
|
children: tr("fluidgrids.builder.manualPush.instructionsLabel", "Setup")
|
|
1272
1314
|
}),
|
|
1273
1315
|
setup.instructions && /* @__PURE__ */ jsx("p", {
|
|
@@ -1311,7 +1353,7 @@ function SharedSecretField({ header, secretToken, onSecretChange, readOnly, test
|
|
|
1311
1353
|
className: "space-y-1.5",
|
|
1312
1354
|
children: [
|
|
1313
1355
|
/* @__PURE__ */ jsx("label", {
|
|
1314
|
-
className: SECTION_LABEL$
|
|
1356
|
+
className: SECTION_LABEL$5,
|
|
1315
1357
|
htmlFor: `${testIdPrefix}-secret`,
|
|
1316
1358
|
children: tr("fluidgrids.builder.manualPush.secretLabel", "Shared secret (optional)")
|
|
1317
1359
|
}),
|
|
@@ -1427,7 +1469,7 @@ function ManualPushSetupField({ setup, registration, loading, onRegenerated, sec
|
|
|
1427
1469
|
}
|
|
1428
1470
|
|
|
1429
1471
|
// src/builder/components/ndv/wait-resume-url-field.tsx
|
|
1430
|
-
const SECTION_LABEL$
|
|
1472
|
+
const SECTION_LABEL$4 = "text-[11px] font-semibold uppercase tracking-[0.12em] text-muted-foreground";
|
|
1431
1473
|
/** The expression any node in the run can use to reach this run's resume URL. */
|
|
1432
1474
|
const RESUME_URL_EXPRESSION = "${RunContext.resumeWebhookUrl}";
|
|
1433
1475
|
/**
|
|
@@ -1456,7 +1498,7 @@ function WaitResumeUrlField() {
|
|
|
1456
1498
|
"data-testid": "ndv-wait-resume-url",
|
|
1457
1499
|
children: [
|
|
1458
1500
|
/* @__PURE__ */ jsx("div", {
|
|
1459
|
-
className: SECTION_LABEL$
|
|
1501
|
+
className: SECTION_LABEL$4,
|
|
1460
1502
|
children: tr("fluidgrids.builder.waitResumeUrl.label", "Resume URL")
|
|
1461
1503
|
}),
|
|
1462
1504
|
/* @__PURE__ */ jsxs("div", {
|
|
@@ -1639,6 +1681,261 @@ function WorkflowPickerField({ value, onChange, testId }) {
|
|
|
1639
1681
|
});
|
|
1640
1682
|
}
|
|
1641
1683
|
|
|
1684
|
+
// src/builder/components/ndv/use-inbound-mailbox.ts
|
|
1685
|
+
function toInboundMailboxView(mailbox) {
|
|
1686
|
+
return {
|
|
1687
|
+
address: mailbox.address,
|
|
1688
|
+
status: mailbox.status,
|
|
1689
|
+
totalDeliveries: mailbox.totalDeliveries,
|
|
1690
|
+
startedDeliveries: mailbox.startedDeliveries,
|
|
1691
|
+
droppedDeliveries: mailbox.droppedDeliveries,
|
|
1692
|
+
lastReceivedAt: mailbox.lastReceivedAt ?? null
|
|
1693
|
+
};
|
|
1694
|
+
}
|
|
1695
|
+
async function fetchMailboxState(workflowKey, nodeId, loadFailed) {
|
|
1696
|
+
const client = getFluidGridsClientSafe();
|
|
1697
|
+
if (!client || !workflowKey || !nodeId) return { kind: "unsaved" };
|
|
1698
|
+
try {
|
|
1699
|
+
if (!throwIfResultError(await client.query({
|
|
1700
|
+
query: InboundMailSettingsDocument,
|
|
1701
|
+
fetchPolicy: "cache-first"
|
|
1702
|
+
})).data?.inboundMailSettings.enabled) return { kind: "disabled" };
|
|
1703
|
+
const mailbox = throwIfResultError(await client.query({
|
|
1704
|
+
query: InboundMailboxDocument,
|
|
1705
|
+
variables: {
|
|
1706
|
+
workflowKey,
|
|
1707
|
+
triggerNodeId: nodeId
|
|
1708
|
+
},
|
|
1709
|
+
fetchPolicy: "network-only"
|
|
1710
|
+
})).data?.inboundMailbox;
|
|
1711
|
+
return mailbox ? {
|
|
1712
|
+
kind: "ready",
|
|
1713
|
+
mailbox: toInboundMailboxView(mailbox)
|
|
1714
|
+
} : { kind: "unsaved" };
|
|
1715
|
+
} catch (error) {
|
|
1716
|
+
return {
|
|
1717
|
+
kind: "error",
|
|
1718
|
+
message: describeOperationError(error, loadFailed)
|
|
1719
|
+
};
|
|
1720
|
+
}
|
|
1721
|
+
}
|
|
1722
|
+
/**
|
|
1723
|
+
* The Inbound Email trigger's mailbox for one node (BOFF-11893).
|
|
1724
|
+
*
|
|
1725
|
+
* The address is issued by a save, so the mailbox is reloaded after every save
|
|
1726
|
+
* of the workflow (drafts are saved in place without a new version) and when
|
|
1727
|
+
* the selected node or version changes. Only the newest request may update the
|
|
1728
|
+
* state, and a state loaded for another node is never shown: the node panel
|
|
1729
|
+
* reuses this component across node selections.
|
|
1730
|
+
*/
|
|
1731
|
+
function useInboundMailbox(workflowKey, nodeId, version, loadFailed) {
|
|
1732
|
+
const key = `${workflowKey ?? ""}\u0000${nodeId ?? ""}`;
|
|
1733
|
+
const [loaded, setLoaded] = useState(null);
|
|
1734
|
+
const requestId = useRef(0);
|
|
1735
|
+
const currentKey = useRef(key);
|
|
1736
|
+
useEffect(() => {
|
|
1737
|
+
currentKey.current = key;
|
|
1738
|
+
}, [key]);
|
|
1739
|
+
const load = useCallback(async () => {
|
|
1740
|
+
const current = ++requestId.current;
|
|
1741
|
+
const state = await fetchMailboxState(workflowKey, nodeId, loadFailed);
|
|
1742
|
+
if (current === requestId.current) setLoaded({
|
|
1743
|
+
key,
|
|
1744
|
+
state
|
|
1745
|
+
});
|
|
1746
|
+
}, [
|
|
1747
|
+
key,
|
|
1748
|
+
workflowKey,
|
|
1749
|
+
nodeId,
|
|
1750
|
+
loadFailed
|
|
1751
|
+
]);
|
|
1752
|
+
useEffect(() => {
|
|
1753
|
+
load();
|
|
1754
|
+
return () => {
|
|
1755
|
+
requestId.current += 1;
|
|
1756
|
+
};
|
|
1757
|
+
}, [load, version]);
|
|
1758
|
+
useEffect(() => {
|
|
1759
|
+
if (!workflowKey) return;
|
|
1760
|
+
return subscribeWorkflowSaved(workflowKey, () => {
|
|
1761
|
+
load();
|
|
1762
|
+
});
|
|
1763
|
+
}, [workflowKey, load]);
|
|
1764
|
+
const setMailbox = useCallback((mailbox) => {
|
|
1765
|
+
if (currentKey.current !== key) return;
|
|
1766
|
+
requestId.current += 1;
|
|
1767
|
+
setLoaded({
|
|
1768
|
+
key,
|
|
1769
|
+
state: {
|
|
1770
|
+
kind: "ready",
|
|
1771
|
+
mailbox
|
|
1772
|
+
}
|
|
1773
|
+
});
|
|
1774
|
+
}, [key]);
|
|
1775
|
+
return {
|
|
1776
|
+
state: loaded?.key === key ? loaded.state : { kind: "loading" },
|
|
1777
|
+
setMailbox
|
|
1778
|
+
};
|
|
1779
|
+
}
|
|
1780
|
+
|
|
1781
|
+
// src/builder/components/ndv/inbound-email-address-field.tsx
|
|
1782
|
+
/** The builder field type the Inbound Email trigger's manifest declares for its address panel. */
|
|
1783
|
+
const INBOUND_EMAIL_ADDRESS_FIELD = "inbound-email-address";
|
|
1784
|
+
const SECTION_LABEL$3 = "text-[11px] font-semibold uppercase tracking-[0.12em] text-muted-foreground";
|
|
1785
|
+
/** The panel's message while there is no address to show. */
|
|
1786
|
+
function InboundMailboxPlaceholder({ state, tr }) {
|
|
1787
|
+
const messages = {
|
|
1788
|
+
loading: tr("fluidgrids.builder.inboundEmail.loading", "Loading email address…"),
|
|
1789
|
+
disabled: tr("fluidgrids.builder.inboundEmail.disabled", "Inbound email addresses are not available in this environment."),
|
|
1790
|
+
unsaved: tr("fluidgrids.builder.inboundEmail.unsaved", "Save the workflow to get its email address.")
|
|
1791
|
+
};
|
|
1792
|
+
return /* @__PURE__ */ jsx("div", {
|
|
1793
|
+
className: "rounded-md border border-dashed border-border bg-muted/40 px-3 py-2 text-xs text-muted-foreground",
|
|
1794
|
+
"data-testid": `ndv-inbound-email-${state.kind}`,
|
|
1795
|
+
role: state.kind === "error" ? "alert" : void 0,
|
|
1796
|
+
children: state.kind === "error" ? state.message : messages[state.kind]
|
|
1797
|
+
});
|
|
1798
|
+
}
|
|
1799
|
+
/** Rotate, behind a confirmation: the old address stops working at once. */
|
|
1800
|
+
function InboundMailboxRotate({ workflowKey, nodeId, onRotated, tr }) {
|
|
1801
|
+
const [rotating, setRotating] = useState(false);
|
|
1802
|
+
const [confirming, setConfirming] = useState(false);
|
|
1803
|
+
const [error, setError] = useState(null);
|
|
1804
|
+
const rotate = useCallback(async () => {
|
|
1805
|
+
const client = getFluidGridsClientSafe();
|
|
1806
|
+
if (!client || !workflowKey || !nodeId) return;
|
|
1807
|
+
setRotating(true);
|
|
1808
|
+
setError(null);
|
|
1809
|
+
try {
|
|
1810
|
+
const rotated = throwIfResultError(await client.mutate({
|
|
1811
|
+
mutation: RotateInboundMailboxAddressDocument,
|
|
1812
|
+
variables: {
|
|
1813
|
+
workflowKey,
|
|
1814
|
+
triggerNodeId: nodeId
|
|
1815
|
+
}
|
|
1816
|
+
})).data?.rotateInboundMailboxAddress;
|
|
1817
|
+
if (rotated) onRotated(toInboundMailboxView(rotated));
|
|
1818
|
+
setConfirming(false);
|
|
1819
|
+
} catch (rotateError) {
|
|
1820
|
+
setError(describeOperationError(rotateError, tr("fluidgrids.builder.inboundEmail.rotateFailed", "Could not rotate the address.")));
|
|
1821
|
+
} finally {
|
|
1822
|
+
setRotating(false);
|
|
1823
|
+
}
|
|
1824
|
+
}, [
|
|
1825
|
+
workflowKey,
|
|
1826
|
+
nodeId,
|
|
1827
|
+
onRotated,
|
|
1828
|
+
tr
|
|
1829
|
+
]);
|
|
1830
|
+
return /* @__PURE__ */ jsxs(Fragment$1, { children: [confirming ? /* @__PURE__ */ jsxs("div", {
|
|
1831
|
+
className: "flex flex-wrap items-center gap-2 rounded-md border border-border bg-muted/40 px-3 py-2",
|
|
1832
|
+
"data-testid": "ndv-inbound-email-rotate-confirm",
|
|
1833
|
+
children: [
|
|
1834
|
+
/* @__PURE__ */ jsx("span", {
|
|
1835
|
+
className: "text-[11px] text-foreground",
|
|
1836
|
+
children: tr("fluidgrids.builder.inboundEmail.rotateConfirm", "The current address stops working at once and is never reused.")
|
|
1837
|
+
}),
|
|
1838
|
+
/* @__PURE__ */ jsx("button", {
|
|
1839
|
+
type: "button",
|
|
1840
|
+
onClick: () => void rotate(),
|
|
1841
|
+
disabled: rotating,
|
|
1842
|
+
"data-testid": "ndv-inbound-email-rotate-yes",
|
|
1843
|
+
className: "rounded-md border border-destructive bg-destructive/10 px-3 py-1.5 text-xs font-medium text-destructive hover:bg-destructive/20 disabled:opacity-50",
|
|
1844
|
+
children: tr("fluidgrids.builder.inboundEmail.rotateYes", "Rotate address")
|
|
1845
|
+
}),
|
|
1846
|
+
/* @__PURE__ */ jsx("button", {
|
|
1847
|
+
type: "button",
|
|
1848
|
+
onClick: () => setConfirming(false),
|
|
1849
|
+
disabled: rotating,
|
|
1850
|
+
className: "rounded-md border border-border bg-background px-3 py-1.5 text-xs font-medium text-foreground hover:bg-muted disabled:opacity-50",
|
|
1851
|
+
children: tr("fluidgrids.builder.inboundEmail.rotateCancel", "Cancel")
|
|
1852
|
+
})
|
|
1853
|
+
]
|
|
1854
|
+
}) : /* @__PURE__ */ jsxs("button", {
|
|
1855
|
+
type: "button",
|
|
1856
|
+
onClick: () => setConfirming(true),
|
|
1857
|
+
"data-testid": "ndv-inbound-email-rotate",
|
|
1858
|
+
className: "inline-flex items-center gap-1.5 rounded-md border border-border bg-background px-3 py-1.5 text-xs font-medium text-foreground hover:bg-muted",
|
|
1859
|
+
children: [/* @__PURE__ */ jsx(Icon, {
|
|
1860
|
+
icon: "mdi:refresh",
|
|
1861
|
+
className: "h-4 w-4"
|
|
1862
|
+
}), tr("fluidgrids.builder.inboundEmail.rotate", "Rotate address")]
|
|
1863
|
+
}), error && /* @__PURE__ */ jsx("p", {
|
|
1864
|
+
className: "text-[11px] text-destructive",
|
|
1865
|
+
role: "alert",
|
|
1866
|
+
"data-testid": "ndv-inbound-email-rotate-error",
|
|
1867
|
+
children: error
|
|
1868
|
+
})] });
|
|
1869
|
+
}
|
|
1870
|
+
/** The address, its hint and delivery counts. */
|
|
1871
|
+
function InboundMailboxDetails({ mailbox, isActiveVersion, tr }) {
|
|
1872
|
+
return /* @__PURE__ */ jsxs(Fragment$1, { children: [
|
|
1873
|
+
/* @__PURE__ */ jsx(CopyableUrl, {
|
|
1874
|
+
url: mailbox.address,
|
|
1875
|
+
testId: "ndv-inbound-email-address",
|
|
1876
|
+
copyAriaLabel: tr("fluidgrids.builder.inboundEmail.copyAriaLabel", "Copy email address")
|
|
1877
|
+
}),
|
|
1878
|
+
/* @__PURE__ */ jsx("p", {
|
|
1879
|
+
className: "text-[11px] text-muted-foreground",
|
|
1880
|
+
children: isActiveVersion ? tr("fluidgrids.builder.inboundEmail.activeHint", "Each message sent or forwarded here starts this version of the workflow once. Nothing is ever sent back to the sender.") : tr("fluidgrids.builder.inboundEmail.inactiveHint", "Mail to this address runs the workflow's active version only. Activate this version to make it live, or listen for a test email.")
|
|
1881
|
+
}),
|
|
1882
|
+
/* @__PURE__ */ jsx("p", {
|
|
1883
|
+
className: "text-[11px] text-muted-foreground",
|
|
1884
|
+
"data-testid": "ndv-inbound-email-stats",
|
|
1885
|
+
children: tr("fluidgrids.builder.inboundEmail.stats", "{{total}} received · {{started}} started a run · {{dropped}} dropped", {
|
|
1886
|
+
total: mailbox.totalDeliveries,
|
|
1887
|
+
started: mailbox.startedDeliveries,
|
|
1888
|
+
dropped: mailbox.droppedDeliveries
|
|
1889
|
+
})
|
|
1890
|
+
})
|
|
1891
|
+
] });
|
|
1892
|
+
}
|
|
1893
|
+
/**
|
|
1894
|
+
* The Inbound Email trigger's address panel (BOFF-11893): the node's own email
|
|
1895
|
+
* address once the workflow is saved, with copy, rotate and "Listen for test
|
|
1896
|
+
* email". The address is issued on save and stays the same until rotated;
|
|
1897
|
+
* mail to it starts the workflow's active version.
|
|
1898
|
+
*/
|
|
1899
|
+
function InboundEmailAddressField({ nodeId }) {
|
|
1900
|
+
const tr = useTr();
|
|
1901
|
+
const readOnly = useBuilderReadOnly();
|
|
1902
|
+
const workflowKey = useFlowStore((s) => s.workflow.workflowKey);
|
|
1903
|
+
const version = useFlowStore((s) => s.workflow.version);
|
|
1904
|
+
const isActiveVersion = useFlowStore((s) => s.workflow.status === "ACTIVE");
|
|
1905
|
+
const { state, setMailbox } = useInboundMailbox(workflowKey, nodeId, version, tr("fluidgrids.builder.inboundEmail.loadFailed", "Could not load the email address."));
|
|
1906
|
+
const ready = state.kind === "ready";
|
|
1907
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
1908
|
+
className: "space-y-3",
|
|
1909
|
+
"data-testid": "ndv-inbound-email",
|
|
1910
|
+
children: [/* @__PURE__ */ jsxs("div", {
|
|
1911
|
+
className: "space-y-2",
|
|
1912
|
+
children: [/* @__PURE__ */ jsxs("div", {
|
|
1913
|
+
className: "flex items-center gap-2",
|
|
1914
|
+
children: [/* @__PURE__ */ jsx("div", {
|
|
1915
|
+
className: SECTION_LABEL$3,
|
|
1916
|
+
children: tr("fluidgrids.builder.inboundEmail.label", "Email address")
|
|
1917
|
+
}), ready && isActiveVersion && /* @__PURE__ */ jsx("span", {
|
|
1918
|
+
className: "rounded-full bg-primary/10 px-2 py-0.5 text-[10px] font-medium text-primary",
|
|
1919
|
+
"data-testid": "ndv-inbound-email-live",
|
|
1920
|
+
children: tr("fluidgrids.builder.webhookUrlField.live", "Live")
|
|
1921
|
+
})]
|
|
1922
|
+
}), state.kind === "ready" ? /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx(InboundMailboxDetails, {
|
|
1923
|
+
mailbox: state.mailbox,
|
|
1924
|
+
isActiveVersion,
|
|
1925
|
+
tr
|
|
1926
|
+
}), !readOnly && /* @__PURE__ */ jsx(InboundMailboxRotate, {
|
|
1927
|
+
workflowKey,
|
|
1928
|
+
nodeId,
|
|
1929
|
+
onRotated: setMailbox,
|
|
1930
|
+
tr
|
|
1931
|
+
}, `${workflowKey ?? ""}:${nodeId ?? ""}`)] }) : /* @__PURE__ */ jsx(InboundMailboxPlaceholder, {
|
|
1932
|
+
state,
|
|
1933
|
+
tr
|
|
1934
|
+
})]
|
|
1935
|
+
}), state.kind === "ready" && /* @__PURE__ */ jsx(InboundTestEmailListenerField, { nodeId }, state.mailbox.address)]
|
|
1936
|
+
});
|
|
1937
|
+
}
|
|
1938
|
+
|
|
1642
1939
|
// src/builder/lib/subworkflow-input-mapping.ts
|
|
1643
1940
|
function isPlainObject(value) {
|
|
1644
1941
|
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
@@ -7401,6 +7698,7 @@ function NodeParamsForm({ config, nodeType, testIdPrefix = "ndv" }) {
|
|
|
7401
7698
|
})]
|
|
7402
7699
|
}, p.name);
|
|
7403
7700
|
}
|
|
7701
|
+
if (p.type === "inbound-email-address") return /* @__PURE__ */ jsx(InboundEmailAddressField, { nodeId: config.node?.id }, p.name);
|
|
7404
7702
|
if (nodeType === "internal:assert" && p.name === "rules") return /* @__PURE__ */ jsxs("div", {
|
|
7405
7703
|
className: "flex flex-col gap-1.5",
|
|
7406
7704
|
children: [/* @__PURE__ */ jsxs("div", {
|
package/dist/settings.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import { n as SettingsPage, t as SETTINGS_TAB_PARAM } from "./SettingsPage-
|
|
2
|
+
import { n as SettingsPage, t as SETTINGS_TAB_PARAM } from "./SettingsPage-D-R4AJAt.js";
|
|
3
3
|
import { t as WorkflowSettingsDrawer } from "./WorkflowSettingsDrawer-BiqTf_tV.js";
|
|
4
4
|
import { t as ManagedAiPolicyAuthorityProvider } from "./ManagedAiPolicyAuthority-BxwJ3ptd.js";
|
|
5
5
|
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import { A as useFlowStore, k as nodeAccent } from "./node-operation-selection-
|
|
3
|
-
import { H as nodeSubtitle,
|
|
4
|
-
import { t as NodeTypeIcon } from "./node-type-icon-
|
|
5
|
-
import { i as NodeInputFields, n as useNodeEditorTab, r as NodeEditorTabs, t as NodeEditorTabBody } from "./node-editor-tab-body-
|
|
6
|
-
import { r as NodeExecutionActions } from "./schedule-panel-
|
|
2
|
+
import { A as useFlowStore, k as nodeAccent } from "./node-operation-selection-zPxY9eF4.js";
|
|
3
|
+
import { Fn as getNodeDetail, H as nodeSubtitle, Jt as useNodeExecution, U as nodeTitle, q as useNodeConfig } from "./FluidGridsProvider-Ydj45LFA.js";
|
|
4
|
+
import { t as NodeTypeIcon } from "./node-type-icon-IADvPV1_.js";
|
|
5
|
+
import { i as NodeInputFields, n as useNodeEditorTab, r as NodeEditorTabs, t as NodeEditorTabBody } from "./node-editor-tab-body-CZ_Um4rr.js";
|
|
6
|
+
import { r as NodeExecutionActions } from "./schedule-panel-BdHFNvkT.js";
|
|
7
7
|
import { r as useTr } from "./TranslationBridge-Da-TPgQm.js";
|
|
8
8
|
import { useEffect, useState } from "react";
|
|
9
9
|
import { Icon } from "@iconify/react";
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import { n as offlineCandidates, t as OfflineIcon } from "./OfflineIcon-
|
|
2
|
+
import { n as offlineCandidates, r as onlineCandidates, t as OfflineIcon } from "./OfflineIcon-B53l9rQ-.js";
|
|
3
3
|
import { useState } from "react";
|
|
4
4
|
import { Icon } from "@iconify/react";
|
|
5
5
|
import { cn } from "@burdenoff/fe-libs/utils";
|
|
@@ -12,15 +12,59 @@ function isIconifyName(value) {
|
|
|
12
12
|
return ICONIFY_NAME.test(value) && !/^(https?|data|blob):/i.test(value);
|
|
13
13
|
}
|
|
14
14
|
const IMAGE_URL = /^https?:\/\/[^\s/]/i;
|
|
15
|
+
/**
|
|
16
|
+
* Hosts of the public Iconify API and its mirrors. The API rate-limits per
|
|
17
|
+
* viewer IP, so a link to it is never used as an `<img src>`.
|
|
18
|
+
*/
|
|
19
|
+
const ICONIFY_API_HOSTS = /* @__PURE__ */ new Set([
|
|
20
|
+
"api.iconify.design",
|
|
21
|
+
"api.simplesvg.com",
|
|
22
|
+
"api.unisvg.com"
|
|
23
|
+
]);
|
|
24
|
+
/** Path of an Iconify API SVG link: `/<set>/<name>.svg` or `/<set>:<name>.svg`. */
|
|
25
|
+
const ICONIFY_API_PATH = /^\/([a-z0-9]+(?:-[a-z0-9]+)*)[/:]([a-z0-9]+(?:-[a-z0-9]+)*)\.svg$/i;
|
|
26
|
+
/**
|
|
27
|
+
* Reads a link to the public Iconify API. Returns the icon it names as an
|
|
28
|
+
* Iconify `set:name` (`https://api.iconify.design/logos/slack-icon.svg` is
|
|
29
|
+
* `logos:slack-icon`), `"unrenderable"` for any other link to the API, or
|
|
30
|
+
* null when the value is not an Iconify API link at all.
|
|
31
|
+
*
|
|
32
|
+
* Listings were published with these links as their icon. The store renders
|
|
33
|
+
* them into `iconUrl` offline; when it cannot (the icon is in no Iconify set),
|
|
34
|
+
* the link would only fetch a 404 from the API, so surfaces treat it as the
|
|
35
|
+
* icon name it is and draw it only from the bundled set.
|
|
36
|
+
*/
|
|
37
|
+
function iconifyApiIcon(value) {
|
|
38
|
+
let url;
|
|
39
|
+
try {
|
|
40
|
+
url = new URL(value);
|
|
41
|
+
} catch {
|
|
42
|
+
return null;
|
|
43
|
+
}
|
|
44
|
+
if (!ICONIFY_API_HOSTS.has(url.hostname.toLowerCase())) return null;
|
|
45
|
+
const match = ICONIFY_API_PATH.exec(url.pathname);
|
|
46
|
+
if (!match) return "unrenderable";
|
|
47
|
+
return `${match[1]}:${match[2]}`.toLowerCase();
|
|
48
|
+
}
|
|
15
49
|
const DATA_IMAGE = /^data:image\/[a-z0-9.+-]+[;,]/i;
|
|
16
50
|
const BLOB_URL = /^blob:\S/i;
|
|
17
51
|
/**
|
|
18
52
|
* Classifies one icon value. Returns null for values that can never render:
|
|
19
|
-
* empty strings, bare words, relative paths and non-image schemes.
|
|
53
|
+
* empty strings, bare words, relative paths and non-image schemes. A link to
|
|
54
|
+
* the public Iconify API is read as the icon name it carries (see
|
|
55
|
+
* `iconifyApiIcon`) and keeps the link in `apiLink`; only an online surface
|
|
56
|
+
* may turn it back into an image (see `onlineCandidates`).
|
|
20
57
|
*/
|
|
21
58
|
function classifyStoreIcon(value) {
|
|
22
59
|
const trimmed = value?.trim();
|
|
23
60
|
if (!trimmed) return null;
|
|
61
|
+
const apiIcon = iconifyApiIcon(trimmed);
|
|
62
|
+
if (apiIcon === "unrenderable") return null;
|
|
63
|
+
if (apiIcon) return {
|
|
64
|
+
kind: "icon",
|
|
65
|
+
name: apiIcon,
|
|
66
|
+
apiLink: trimmed
|
|
67
|
+
};
|
|
24
68
|
if (IMAGE_URL.test(trimmed) || DATA_IMAGE.test(trimmed) || BLOB_URL.test(trimmed)) return {
|
|
25
69
|
kind: "image",
|
|
26
70
|
src: trimmed
|
|
@@ -73,7 +117,7 @@ function pickStoreIcon(candidates, failed) {
|
|
|
73
117
|
*/
|
|
74
118
|
function StoreIcon({ candidates, alt, imageClassName, iconClassName, iconSize, fallback, offline = false }) {
|
|
75
119
|
const [failed, setFailed] = useState(() => /* @__PURE__ */ new Set());
|
|
76
|
-
const source = pickStoreIcon(offline ? offlineCandidates(candidates) : candidates, failed);
|
|
120
|
+
const source = pickStoreIcon(offline ? offlineCandidates(candidates) : onlineCandidates(candidates), failed);
|
|
77
121
|
if (!source) return /* @__PURE__ */ jsx(Fragment$1, { children: fallback });
|
|
78
122
|
if (source.kind === "icon") {
|
|
79
123
|
if (offline) return /* @__PURE__ */ jsx(OfflineIcon, {
|
package/dist/templates.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import { t as TemplatesPage } from "./TemplatesPage-
|
|
3
|
-
import { t as TemplatePreview } from "./TemplatePreview-
|
|
2
|
+
import { t as TemplatesPage } from "./TemplatesPage-BXiPQxBz.js";
|
|
3
|
+
import { t as TemplatePreview } from "./TemplatePreview-DPcfznfO.js";
|
|
4
4
|
|
|
5
5
|
export { TemplatePreview, TemplatesPage };
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import { n as getFluidGridsClient } from "./client-Ctl4jmY3.js";
|
|
3
3
|
import { h as fetchCodeBundleSdk } from "./api-D1cWC1yx.js";
|
|
4
4
|
import { o as throwIfResultError, t as describeOperationError } from "./errors-xPZ-IbQd.js";
|
|
5
|
-
import { a as changedSourceFiles, d as isEditableSourcePath, f as projectLanguage, s as defaultSourcePath } from "./node-operation-selection-
|
|
5
|
+
import { a as changedSourceFiles, d as isEditableSourcePath, f as projectLanguage, s as defaultSourcePath } from "./node-operation-selection-zPxY9eF4.js";
|
|
6
6
|
import { useCallback, useEffect, useMemo, useRef, useState } from "react";
|
|
7
7
|
|
|
8
8
|
// src/generated/documents/wspace/BuildWorkflowCodeDocument.ts
|
|
@@ -3,7 +3,7 @@ import { o as throwIfResultError, t as describeOperationError } from "./errors-x
|
|
|
3
3
|
import { n as getFluidGridsClient } from "./client-Ctl4jmY3.js";
|
|
4
4
|
import { r as useTr } from "./TranslationBridge-Da-TPgQm.js";
|
|
5
5
|
import { n as useNavigationV2 } from "./useNavigationV2-C2WeqN7d.js";
|
|
6
|
-
import { f as STATUS_COUNT_GROUP_BY, v as statusCountFilter, y as statusCountsOf } from "./useExecutions-
|
|
6
|
+
import { f as STATUS_COUNT_GROUP_BY, v as statusCountFilter, y as statusCountsOf } from "./useExecutions-CdBdvAH6.js";
|
|
7
7
|
import { useCallback, useEffect, useRef, useState } from "react";
|
|
8
8
|
import { Icon } from "@iconify/react";
|
|
9
9
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
@@ -7,7 +7,7 @@ import { g as useExecutionsStore } from "./config-X97zrIvn.js";
|
|
|
7
7
|
import { l as REPLAY_WORKFLOW_RUN, u as RETRY_WORKFLOW_RUNS } from "./operations-D7o-gUzy.js";
|
|
8
8
|
import { o as throwIfResultError } from "./errors-xPZ-IbQd.js";
|
|
9
9
|
import { a as emitOperationErrorEvent, i as emitFluidGridsEvent } from "./token-refresh-link-BjN7H4qA.js";
|
|
10
|
-
import {
|
|
10
|
+
import { dn as openRunQuotaUpgradePrompt, un as useFluidGridsAnalytics } from "./FluidGridsProvider-Ydj45LFA.js";
|
|
11
11
|
import { i as emitRunStarted } from "./fluidgridsEvents-Dm5CaHtr.js";
|
|
12
12
|
import { r as useTr } from "./TranslationBridge-Da-TPgQm.js";
|
|
13
13
|
import { useCallback, useEffect, useMemo, useRef, useState } from "react";
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import { t as FluidGridsContext } from "./FluidGridsProvider-
|
|
2
|
+
import { t as FluidGridsContext } from "./FluidGridsProvider-Ydj45LFA.js";
|
|
3
3
|
import { n as getGlobalStoreClient } from "./global-client-DP_Wxe5t.js";
|
|
4
4
|
import { useContext } from "react";
|
|
5
5
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { n as getFluidGridsClient } from "./client-Ctl4jmY3.js";
|
|
3
|
-
import {
|
|
3
|
+
import { dn as openRunQuotaUpgradePrompt, un as useFluidGridsAnalytics } from "./FluidGridsProvider-Ydj45LFA.js";
|
|
4
4
|
import { r as useTr } from "./TranslationBridge-Da-TPgQm.js";
|
|
5
5
|
import { i as emitRunStarted } from "./fluidgridsEvents-Dm5CaHtr.js";
|
|
6
6
|
import { o as throwIfResultError, t as describeOperationError } from "./errors-xPZ-IbQd.js";
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { o as throwIfResultError, t as describeOperationError } from "./errors-xPZ-IbQd.js";
|
|
3
3
|
import { n as getFluidGridsClient, r as getFluidGridsClientSafe } from "./client-Ctl4jmY3.js";
|
|
4
|
-
import {
|
|
4
|
+
import { Cn as signalPayloadCard, bn as parseRawSignalPayload, xn as payloadFromCardValues } from "./FluidGridsProvider-Ydj45LFA.js";
|
|
5
5
|
import { r as useTr } from "./TranslationBridge-Da-TPgQm.js";
|
|
6
6
|
import { xf as ExecutionKind } from "./graphql-types-BdhNiBrG.js";
|
|
7
7
|
import { forwardRef, useCallback, useEffect, useImperativeHandle, useMemo, useRef, useState } from "react";
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { o as throwIfResultError, t as describeOperationError } from "./errors-xPZ-IbQd.js";
|
|
3
3
|
import { n as getFluidGridsClient } from "./client-Ctl4jmY3.js";
|
|
4
|
-
import {
|
|
4
|
+
import { un as useFluidGridsAnalytics } from "./FluidGridsProvider-Ydj45LFA.js";
|
|
5
5
|
import { r as useTr } from "./TranslationBridge-Da-TPgQm.js";
|
|
6
6
|
import { i as WORKFLOWS_QUOTA_NAME } from "./quota-Cdt8yz7N.js";
|
|
7
7
|
import { c as emitWorkflowLimitHit, o as emitUpgradeClicked } from "./fluidgridsEvents-Dm5CaHtr.js";
|