@burdenoff/fluidgrids-fe-sdk 2026.1007.5 → 2026.1008.2
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/ExecutionDetailPage-HPAU7U3E.js +12 -0
- package/dist/{ExecutionDetailPage-3QKAXLHE.js.map → ExecutionDetailPage-HPAU7U3E.js.map} +1 -1
- package/dist/ExecutionsListPage-TLXVEIRK.js +11 -0
- package/dist/{ExecutionsListPage-KZLKLSSC.js.map → ExecutionsListPage-TLXVEIRK.js.map} +1 -1
- package/dist/{WorkflowBuilder-B3VBBZVG.js → WorkflowBuilder-YJLWNBT3.js} +7 -7
- package/dist/{WorkflowBuilder-B3VBBZVG.js.map → WorkflowBuilder-YJLWNBT3.js.map} +1 -1
- package/dist/WorkflowsList-YSZWXFMZ.js +14 -0
- package/dist/{WorkflowsList-3Q7SSUYR.js.map → WorkflowsList-YSZWXFMZ.js.map} +1 -1
- package/dist/{chunk-GKSXZFDY.js → chunk-2C6CUHM3.js} +4 -4
- package/dist/{chunk-GKSXZFDY.js.map → chunk-2C6CUHM3.js.map} +1 -1
- package/dist/{chunk-ZLYJKIKG.js → chunk-2ORIFA6I.js} +3 -3
- package/dist/{chunk-ZLYJKIKG.js.map → chunk-2ORIFA6I.js.map} +1 -1
- package/dist/chunk-F2BBRTLB.js +204 -0
- package/dist/chunk-F2BBRTLB.js.map +1 -0
- package/dist/{chunk-FKOUPL6Z.js → chunk-FAPYERDO.js} +3 -3
- package/dist/{chunk-FKOUPL6Z.js.map → chunk-FAPYERDO.js.map} +1 -1
- package/dist/{chunk-5TITRVCU.js → chunk-I2766GDR.js} +4 -4
- package/dist/{chunk-5TITRVCU.js.map → chunk-I2766GDR.js.map} +1 -1
- package/dist/{chunk-G3RPRMP5.js → chunk-IOV4YPQU.js} +4 -4
- package/dist/{chunk-G3RPRMP5.js.map → chunk-IOV4YPQU.js.map} +1 -1
- package/dist/{chunk-RJPBWDZM.js → chunk-KIJDG6MG.js} +5 -5
- package/dist/{chunk-RJPBWDZM.js.map → chunk-KIJDG6MG.js.map} +1 -1
- package/dist/{chunk-LW722GAN.js → chunk-LVKUOMLJ.js} +5 -4
- package/dist/chunk-LVKUOMLJ.js.map +1 -0
- package/dist/{chunk-SJORR3EX.js → chunk-NG32SZ75.js} +5 -153
- package/dist/chunk-NG32SZ75.js.map +1 -0
- package/dist/{chunk-2DN6NTKM.js → chunk-W73HBP7B.js} +5 -5
- package/dist/{chunk-2DN6NTKM.js.map → chunk-W73HBP7B.js.map} +1 -1
- package/dist/{chunk-IVWSTICA.js → chunk-W7APOU2R.js} +19 -10
- package/dist/chunk-W7APOU2R.js.map +1 -0
- package/dist/{chunk-67CQSSWO.js → chunk-WKALLY4E.js} +4 -4
- package/dist/{chunk-67CQSSWO.js.map → chunk-WKALLY4E.js.map} +1 -1
- package/dist/{chunk-5A7GP6O7.js → chunk-WNFZXH3Z.js} +3 -3
- package/dist/{chunk-5A7GP6O7.js.map → chunk-WNFZXH3Z.js.map} +1 -1
- package/dist/{chunk-BNSM27CU.js → chunk-WXNDAONY.js} +3 -3
- package/dist/{chunk-BNSM27CU.js.map → chunk-WXNDAONY.js.map} +1 -1
- package/dist/{chunk-ZZRRG37Q.js → chunk-WYQ4OBES.js} +3 -3
- package/dist/{chunk-ZZRRG37Q.js.map → chunk-WYQ4OBES.js.map} +1 -1
- package/dist/{chunk-5BDQNSP3.js → chunk-ZBMMEE5U.js} +6 -4
- package/dist/chunk-ZBMMEE5U.js.map +1 -0
- package/dist/client-YFAZ23OL.js +3 -0
- package/dist/{client-AMUUS7VE.js.map → client-YFAZ23OL.js.map} +1 -1
- package/dist/{config-5UMLMALY.js → config-YHUOLDAL.js} +3 -3
- package/dist/{config-5UMLMALY.js.map → config-YHUOLDAL.js.map} +1 -1
- package/dist/executions.js +6 -6
- package/dist/history.js +4 -4
- package/dist/index.d.ts +1 -0
- package/dist/index.js +23 -23
- package/dist/nodes.js +2 -2
- package/dist/observability.js +3 -3
- package/dist/settings.js +3 -3
- package/dist/templates.js +5 -5
- package/dist/workflow-builder.js +6 -6
- package/dist/workflows-list.js +4 -4
- package/package.json +1 -1
- package/dist/ExecutionDetailPage-3QKAXLHE.js +0 -12
- package/dist/ExecutionsListPage-KZLKLSSC.js +0 -11
- package/dist/WorkflowsList-3Q7SSUYR.js +0 -14
- package/dist/chunk-5BDQNSP3.js.map +0 -1
- package/dist/chunk-IVWSTICA.js.map +0 -1
- package/dist/chunk-LW722GAN.js.map +0 -1
- package/dist/chunk-SJORR3EX.js.map +0 -1
- package/dist/chunk-U4AJLVHA.js +0 -52
- package/dist/chunk-U4AJLVHA.js.map +0 -1
- package/dist/client-AMUUS7VE.js +0 -3
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { LOG_STREAM_DESTINATIONS, CREATE_LOG_STREAM_DESTINATION, UPDATE_LOG_STREAM_DESTINATION, DELETE_LOG_STREAM_DESTINATION, TEST_LOG_STREAM_DESTINATION, REPLAY_WORKFLOW_RUN, RETRY_WORKFLOW_RUNS, OBSERVABILITY_DASHBOARD_SUMMARY, OBSERVABILITY_FAILED_RUNS, OBSERVABILITY_DATA_SINKS, OBSERVABILITY_DATA_SINK_DATA } from './chunk-NK32XOQN.js';
|
|
2
2
|
import { throwIfResultError, describeOperationError } from './chunk-LMO5ASOE.js';
|
|
3
3
|
import { useTr } from './chunk-7YWBH2A5.js';
|
|
4
|
-
import { getFluidGridsClient } from './chunk-
|
|
4
|
+
import { getFluidGridsClient } from './chunk-ZBMMEE5U.js';
|
|
5
5
|
import { useCallback, useState, useMemo, useEffect } from 'react';
|
|
6
6
|
import { Icon } from '@iconify/react';
|
|
7
7
|
import { toast } from 'sonner';
|
|
@@ -725,5 +725,5 @@ function LogStreamingTab() {
|
|
|
725
725
|
}
|
|
726
726
|
|
|
727
727
|
export { LogStreamingTab, useDataSinkData, useDataSinks, useInsightsData, useLogStreamDestinationActions, useLogStreamDestinations, useRunReplayActions };
|
|
728
|
-
//# sourceMappingURL=chunk-
|
|
729
|
-
//# sourceMappingURL=chunk-
|
|
728
|
+
//# sourceMappingURL=chunk-WNFZXH3Z.js.map
|
|
729
|
+
//# sourceMappingURL=chunk-WNFZXH3Z.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/modules/observability/hooks/useObservability.ts","../src/modules/observability/types.ts","../src/modules/observability/components/LogStreamingTab.tsx"],"names":["useState","useEffect","useCallback"],"mappings":"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","file":"chunk-5A7GP6O7.js","sourcesContent":["import { useCallback, useEffect, useState } from \"react\";\nimport { getFluidGridsClient } from \"../../../graphql/client\";\nimport {\n describeOperationError,\n throwIfResultError,\n} from \"../../../graphql/errors\";\nimport {\n CREATE_LOG_STREAM_DESTINATION,\n DELETE_LOG_STREAM_DESTINATION,\n LOG_STREAM_DESTINATIONS,\n OBSERVABILITY_DATA_SINK_DATA,\n OBSERVABILITY_DATA_SINKS,\n OBSERVABILITY_DASHBOARD_SUMMARY,\n OBSERVABILITY_FAILED_RUNS,\n REPLAY_WORKFLOW_RUN,\n RETRY_WORKFLOW_RUNS,\n TEST_LOG_STREAM_DESTINATION,\n UPDATE_LOG_STREAM_DESTINATION,\n} from \"../operations\";\nimport type {\n DashboardSummary,\n DataSinkData,\n DataSinkSummary,\n FailedRun,\n LogStreamDestination,\n LogStreamDestinationInput,\n LogStreamDestinationResponse,\n MutationResponse,\n TriggerResponse,\n} from \"../types\";\n\ninterface DestinationQueryData {\n logStreamDestinations: LogStreamDestination[];\n}\n\ninterface DestinationMutationData {\n createLogStreamDestination?: LogStreamDestinationResponse;\n updateLogStreamDestination?: LogStreamDestinationResponse;\n deleteLogStreamDestination?: MutationResponse;\n testLogStreamDestination?: MutationResponse;\n}\n\ninterface SummaryQueryData {\n dashboardSummary: DashboardSummary;\n}\n\ninterface FailedRunsQueryData {\n workflowRuns: {\n total: number;\n hasMore: boolean;\n items: FailedRun[];\n };\n}\n\ninterface TriggerMutationData {\n replayWorkflowRun?: TriggerResponse;\n retryWorkflowRuns?: TriggerResponse[];\n}\n\ninterface DataSinksQueryData {\n listDataSinks: {\n totalCount: number;\n pageInfo: { hasNextPage: boolean; endCursor?: string | null };\n edges: Array<{ cursor: string; node: DataSinkSummary }>;\n };\n}\n\ninterface DataSinkDataQueryData {\n getDataSinkData?: DataSinkData | null;\n}\n\ninterface UseAsyncState<T> {\n data: T | null;\n loading: boolean;\n error: Error | null;\n}\n\nfunction useAsyncRefresh<T>(\n fetcher: () => Promise<T>,\n initial: T | null,\n): UseAsyncState<T> & { refetch: () => Promise<T | null> } {\n const [data, setData] = useState<T | null>(initial);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n\n const refetch = useCallback(async () => {\n setLoading(true);\n setError(null);\n try {\n const next = await fetcher();\n setData(next);\n return next;\n } catch (cause) {\n const nextError = new Error(describeOperationError(cause));\n setError(nextError);\n return null;\n } finally {\n setLoading(false);\n }\n }, [fetcher]);\n\n useEffect(() => {\n void refetch();\n }, [refetch]);\n\n return { data, loading, error, refetch };\n}\n\nexport function useLogStreamDestinations() {\n const fetchDestinations = useCallback(async () => {\n const result = throwIfResultError(\n await getFluidGridsClient().query<DestinationQueryData>({\n query: LOG_STREAM_DESTINATIONS,\n fetchPolicy: \"network-only\",\n }),\n );\n return result.data?.logStreamDestinations ?? [];\n }, []);\n\n const state = useAsyncRefresh(fetchDestinations, []);\n return { destinations: state.data ?? [], ...state, refetch: state.refetch };\n}\n\nexport function useLogStreamDestinationActions() {\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const run = useCallback(\n async <T>(operation: () => Promise<T>): Promise<T | null> => {\n setLoading(true);\n setError(null);\n try {\n return await operation();\n } catch (cause) {\n const nextError = new Error(describeOperationError(cause));\n setError(nextError);\n return null;\n } finally {\n setLoading(false);\n }\n },\n [],\n );\n\n const create = useCallback(\n (input: LogStreamDestinationInput) =>\n run(async () => {\n const result = throwIfResultError(\n await getFluidGridsClient().mutate<DestinationMutationData>({\n mutation: CREATE_LOG_STREAM_DESTINATION,\n variables: { input },\n }),\n );\n return result.data?.createLogStreamDestination ?? null;\n }),\n [run],\n );\n\n const update = useCallback(\n (id: string, input: Partial<LogStreamDestinationInput>) =>\n run(async () => {\n const result = throwIfResultError(\n await getFluidGridsClient().mutate<DestinationMutationData>({\n mutation: UPDATE_LOG_STREAM_DESTINATION,\n variables: { id, input },\n }),\n );\n return result.data?.updateLogStreamDestination ?? null;\n }),\n [run],\n );\n\n const remove = useCallback(\n (id: string) =>\n run(async () => {\n const result = throwIfResultError(\n await getFluidGridsClient().mutate<DestinationMutationData>({\n mutation: DELETE_LOG_STREAM_DESTINATION,\n variables: { id },\n }),\n );\n return result.data?.deleteLogStreamDestination ?? null;\n }),\n [run],\n );\n\n const test = useCallback(\n (id: string) =>\n run(async () => {\n const result = throwIfResultError(\n await getFluidGridsClient().mutate<DestinationMutationData>({\n mutation: TEST_LOG_STREAM_DESTINATION,\n variables: { id },\n }),\n );\n return result.data?.testLogStreamDestination ?? null;\n }),\n [run],\n );\n\n return { create, update, remove, test, loading, error };\n}\n\nexport function useRunReplayActions() {\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const replay = useCallback(async (runId: string) => {\n setLoading(true);\n setError(null);\n try {\n const result = throwIfResultError(\n await getFluidGridsClient().mutate<TriggerMutationData>({\n mutation: REPLAY_WORKFLOW_RUN,\n variables: { runId },\n }),\n );\n return result.data?.replayWorkflowRun ?? null;\n } catch (cause) {\n const nextError = new Error(describeOperationError(cause));\n setError(nextError);\n return null;\n } finally {\n setLoading(false);\n }\n }, []);\n\n const retryMany = useCallback(async (runIds: string[]) => {\n setLoading(true);\n setError(null);\n try {\n const result = throwIfResultError(\n await getFluidGridsClient().mutate<TriggerMutationData>({\n mutation: RETRY_WORKFLOW_RUNS,\n variables: { runIds },\n }),\n );\n return result.data?.retryWorkflowRuns ?? [];\n } catch (cause) {\n const nextError = new Error(describeOperationError(cause));\n setError(nextError);\n return [];\n } finally {\n setLoading(false);\n }\n }, []);\n\n return { replay, retryMany, loading, error };\n}\n\nexport function useInsightsData() {\n const fetchInsights = useCallback(async () => {\n const client = getFluidGridsClient();\n const [summaryResult, failedResult] = await Promise.all([\n client.query<SummaryQueryData>({\n query: OBSERVABILITY_DASHBOARD_SUMMARY,\n fetchPolicy: \"network-only\",\n }),\n client.query<FailedRunsQueryData>({\n query: OBSERVABILITY_FAILED_RUNS,\n variables: {\n input: {\n status: \"FAILED\",\n limit: 100,\n offset: 0,\n },\n },\n fetchPolicy: \"network-only\",\n }),\n ]);\n throwIfResultError(summaryResult);\n throwIfResultError(failedResult);\n return {\n summary: summaryResult.data?.dashboardSummary ?? null,\n failedRuns: failedResult.data?.workflowRuns.items ?? [],\n };\n }, []);\n\n const state = useAsyncRefresh(fetchInsights, null);\n return {\n summary: state.data?.summary ?? null,\n failedRuns: state.data?.failedRuns ?? [],\n loading: state.loading,\n error: state.error,\n refetch: state.refetch,\n };\n}\n\nexport function useDataSinks(search: string) {\n const fetchSinks = useCallback(async () => {\n const result = throwIfResultError(\n await getFluidGridsClient().query<DataSinksQueryData>({\n query: OBSERVABILITY_DATA_SINKS,\n variables: { first: 50, isActive: true, search: search || undefined },\n fetchPolicy: \"network-only\",\n }),\n );\n return result.data?.listDataSinks ?? null;\n }, [search]);\n\n const state = useAsyncRefresh(fetchSinks, null);\n return {\n sinks: state.data?.edges.map((edge) => edge.node) ?? [],\n totalCount: state.data?.totalCount ?? 0,\n hasNextPage: state.data?.pageInfo.hasNextPage ?? false,\n ...state,\n };\n}\n\nexport function useDataSinkData(sink: DataSinkSummary | null) {\n const fetchData = useCallback(async () => {\n if (!sink) return null;\n const result = throwIfResultError(\n await getFluidGridsClient().query<DataSinkDataQueryData>({\n query: OBSERVABILITY_DATA_SINK_DATA,\n variables: { id: sink.id, limit: 100, offset: 0 },\n fetchPolicy: \"network-only\",\n }),\n );\n return result.data?.getDataSinkData ?? null;\n }, [sink]);\n\n const state = useAsyncRefresh(fetchData, null);\n return { sinkData: state.data, ...state };\n}\n","export type LogStreamProvider = \"SYSLOG\" | \"WEBHOOK\" | \"SENTRY\";\n\nexport type LogStreamEventType =\n | \"LOG_ERROR\"\n | \"LOG_WARN\"\n | \"NODE_FAILED\"\n | \"NODE_RETRIED\"\n | \"RUN_CANCELLED\"\n | \"RUN_COMPLETED\"\n | \"RUN_FAILED\"\n | \"RUN_STARTED\";\n\nexport interface LogStreamDestination {\n id: string;\n name: string;\n provider: LogStreamProvider;\n endpoint: string;\n config?: Record<string, unknown> | null;\n eventFilters: LogStreamEventType[];\n isEnabled: boolean;\n hasSecret: boolean;\n lastDispatchError?: string | null;\n lastDispatchStatus?: string | null;\n lastDispatchedAt?: string | null;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface LogStreamDestinationInput {\n name: string;\n provider: LogStreamProvider;\n endpoint: string;\n config?: Record<string, unknown>;\n eventFilters: LogStreamEventType[];\n isEnabled: boolean;\n secret?: string;\n}\n\nexport interface MutationResponse {\n success: boolean;\n message: string;\n}\n\nexport interface LogStreamDestinationResponse extends MutationResponse {\n destination?: LogStreamDestination | null;\n}\n\nexport interface TriggerResponse {\n runId: string;\n status: string;\n workflowKey: string;\n version: string;\n triggerNodeId: string;\n}\n\nexport interface DashboardSummary {\n workflowsCount: number;\n activeWorkflowsCount: number;\n runsCountTotal: number;\n runsCompletedCount: number;\n runsFailedCount: number;\n runsRunningCount: number;\n runsPendingCount: number;\n runsCancelledCount: number;\n runsWaitingCount: number;\n runsCompletedLast24h: number;\n runsFailedLast24h: number;\n runsCompletedLast7d: number;\n runsFailedLast7d: number;\n runsCompletedLast30d: number;\n runsFailedLast30d: number;\n totalNodesExecutedCount: number;\n avgWorkflowExecutionTimeSeconds?: number | null;\n avgNodeExecutionTimeSeconds?: number | null;\n workflowSuccessRate?: number | null;\n nodeUsageStats: NodeUsageStat[];\n recentRuns: RecentRun[];\n}\n\nexport interface NodeUsageStat {\n nodeType: string;\n totalExecutions: number;\n successCount: number;\n failureCount: number;\n avgExecutionTime?: number | null;\n}\n\nexport interface RecentRun {\n id: string;\n workflowKey: string;\n version: string;\n status: string;\n startedAt?: string | null;\n completedAt?: string | null;\n duration?: number | null;\n}\n\nexport interface FailedRun {\n id: string;\n workflowKey: string;\n status: string;\n errorType?: string | null;\n errorMessage?: string | null;\n triggerNodeId: string;\n startedAt?: string | null;\n completedAt?: string | null;\n duration?: number | null;\n workflow?: { name: string } | null;\n}\n\nexport interface DataSinkSummary {\n id: string;\n key: string;\n name?: string | null;\n description?: string | null;\n status: string;\n setupState: string;\n isActive: boolean;\n sizeBytes: number;\n lastRefreshedAt: string;\n nextRefreshAt?: string | null;\n dataStats?: { dataSizeBytes: number; hash: string } | null;\n linkedWorkflowCount: number;\n linkedParserCount: number;\n}\n\nexport interface DataSinkData {\n cached: boolean;\n extracted?: unknown;\n fetchedAt: string;\n hasMore?: boolean | null;\n limit?: number | null;\n offset?: number | null;\n raw: unknown;\n totalCount?: number | null;\n version: number;\n}\n\nexport function isLogStreamProvider(value: string): value is LogStreamProvider {\n return value === \"SYSLOG\" || value === \"WEBHOOK\" || value === \"SENTRY\";\n}\n\nexport const LOG_STREAM_EVENT_TYPES: readonly LogStreamEventType[] = [\n \"LOG_ERROR\",\n \"LOG_WARN\",\n \"NODE_FAILED\",\n \"NODE_RETRIED\",\n \"RUN_CANCELLED\",\n \"RUN_COMPLETED\",\n \"RUN_FAILED\",\n \"RUN_STARTED\",\n];\n","import { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { Icon } from \"@iconify/react\";\nimport { toast } from \"sonner\";\nimport { Button } from \"@burdenoff/fe-libs/button\";\nimport {\n Card,\n CardContent,\n CardHeader,\n Input,\n Label,\n} from \"@burdenoff/fe-libs/ui\";\nimport { useTr } from \"../../../hooks/useTr\";\nimport {\n LOG_STREAM_EVENT_TYPES,\n type LogStreamDestination,\n type LogStreamDestinationInput,\n type LogStreamEventType,\n type LogStreamProvider,\n} from \"../types\";\nimport {\n useLogStreamDestinationActions,\n useLogStreamDestinations,\n} from \"../hooks/useObservability\";\n\ninterface DestinationFormState {\n name: string;\n provider: LogStreamProvider;\n endpoint: string;\n eventFilters: LogStreamEventType[];\n isEnabled: boolean;\n secret: string;\n configText: string;\n}\n\nconst DEFAULT_EVENT_FILTERS: LogStreamEventType[] = [\n \"RUN_FAILED\",\n \"NODE_FAILED\",\n \"LOG_ERROR\",\n];\n\nconst PROVIDERS: LogStreamProvider[] = [\"WEBHOOK\", \"SYSLOG\", \"SENTRY\"];\n\nfunction emptyForm(): DestinationFormState {\n return {\n name: \"\",\n provider: \"WEBHOOK\",\n endpoint: \"\",\n eventFilters: DEFAULT_EVENT_FILTERS,\n isEnabled: true,\n secret: \"\",\n configText: \"{}\",\n };\n}\n\nfunction formFromDestination(\n destination: LogStreamDestination,\n): DestinationFormState {\n return {\n name: destination.name,\n provider: destination.provider,\n endpoint: destination.endpoint,\n eventFilters: destination.eventFilters,\n isEnabled: destination.isEnabled,\n secret: \"\",\n configText: JSON.stringify(destination.config ?? {}, null, 2),\n };\n}\n\nfunction eventLabel(event: LogStreamEventType): string {\n return event\n .toLowerCase()\n .split(\"_\")\n .map((part) => part.charAt(0).toUpperCase() + part.slice(1))\n .join(\" \");\n}\n\nfunction endpointPlaceholder(provider: LogStreamProvider): string {\n switch (provider) {\n case \"SYSLOG\":\n return \"logs.example.com:514\";\n case \"SENTRY\":\n return \"https://public@sentry.example/1\";\n case \"WEBHOOK\":\n return \"https://hooks.example.com/workflows\";\n }\n}\n\nfunction parseConfig(configText: string): Record<string, unknown> | null {\n try {\n const parsed: unknown = JSON.parse(configText || \"{}\");\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n return null;\n }\n return parsed as Record<string, unknown>;\n } catch {\n return null;\n }\n}\n\nfunction formToInput(\n form: DestinationFormState,\n): LogStreamDestinationInput | null {\n const config = parseConfig(form.configText);\n if (!config || !form.name.trim() || !form.endpoint.trim()) return null;\n return {\n name: form.name.trim(),\n provider: form.provider,\n endpoint: form.endpoint.trim(),\n eventFilters: form.eventFilters,\n isEnabled: form.isEnabled,\n config,\n ...(form.secret ? { secret: form.secret } : {}),\n };\n}\n\nexport function LogStreamingTab() {\n const tr = useTr();\n const { destinations, loading, error, refetch } = useLogStreamDestinations();\n const actions = useLogStreamDestinationActions();\n const [form, setForm] = useState<DestinationFormState>(emptyForm);\n const [editingId, setEditingId] = useState<string | null>(null);\n const [showForm, setShowForm] = useState(false);\n\n const editingDestination = useMemo(\n () => destinations.find((destination) => destination.id === editingId),\n [destinations, editingId],\n );\n\n useEffect(() => {\n if (editingDestination) setForm(formFromDestination(editingDestination));\n }, [editingDestination]);\n\n const resetForm = useCallback(() => {\n setForm(emptyForm());\n setEditingId(null);\n setShowForm(false);\n }, []);\n\n const save = useCallback(async () => {\n const input = formToInput(form);\n if (!input) {\n toast.error(\n tr(\n \"fluidgrids.settings.logStreaming.invalidForm\",\n \"Enter a name, endpoint, and valid JSON configuration.\",\n ),\n );\n return;\n }\n const result = editingId\n ? await actions.update(editingId, input)\n : await actions.create(input);\n if (!result?.success) {\n toast.error(\n result?.message ||\n tr(\n \"fluidgrids.settings.logStreaming.saveFailed\",\n \"Could not save log streaming destination.\",\n ),\n );\n return;\n }\n toast.success(\n tr(\n \"fluidgrids.settings.logStreaming.saved\",\n \"Log streaming destination saved.\",\n ),\n );\n resetForm();\n await refetch();\n }, [actions, editingId, form, refetch, resetForm, tr]);\n\n const remove = useCallback(\n async (destination: LogStreamDestination) => {\n if (!window.confirm(`Delete “${destination.name}”?`)) return;\n const result = await actions.remove(destination.id);\n if (!result?.success) {\n toast.error(\n result?.message ||\n tr(\n \"fluidgrids.settings.logStreaming.deleteFailed\",\n \"Could not delete destination.\",\n ),\n );\n return;\n }\n toast.success(\n tr(\n \"fluidgrids.settings.logStreaming.deleted\",\n \"Log streaming destination deleted.\",\n ),\n );\n if (editingId === destination.id) resetForm();\n await refetch();\n },\n [actions, editingId, refetch, resetForm, tr],\n );\n\n const sendTest = useCallback(\n async (destination: LogStreamDestination) => {\n const result = await actions.test(destination.id);\n if (!result) return;\n if (result.success) {\n toast.success(\n tr(\n \"fluidgrids.settings.logStreaming.testSucceeded\",\n \"Test event delivered.\",\n ),\n );\n } else {\n toast.error(\n result.message ||\n tr(\n \"fluidgrids.settings.logStreaming.testFailed\",\n \"Test event could not be delivered.\",\n ),\n );\n }\n await refetch();\n },\n [actions, refetch, tr],\n );\n\n const toggleEvent = (event: LogStreamEventType) => {\n setForm((current) => ({\n ...current,\n eventFilters: current.eventFilters.includes(event)\n ? current.eventFilters.filter((item) => item !== event)\n : [...current.eventFilters, event],\n }));\n };\n\n return (\n <div className=\"space-y-6\">\n <div className=\"flex flex-col gap-3 sm:flex-row sm:items-start sm:justify-between\">\n <div>\n <h2 className=\"text-lg font-semibold text-text-primary\">\n {tr(\"fluidgrids.settings.logStreaming.title\", \"Log streaming\")}\n </h2>\n <p className=\"mt-1 max-w-2xl text-sm text-text-secondary\">\n {tr(\n \"fluidgrids.settings.logStreaming.description\",\n \"Send workflow run and node events to workspace-managed observability destinations. Secrets are write-only and never returned.\",\n )}\n </p>\n </div>\n <Button\n onClick={() => {\n setForm(emptyForm());\n setEditingId(null);\n setShowForm(true);\n }}\n disabled={actions.loading}\n >\n <Icon icon=\"mdi:plus\" className=\"mr-1\" width={16} />\n {tr(\"fluidgrids.settings.logStreaming.add\", \"Add destination\")}\n </Button>\n </div>\n\n {error && (\n <div\n role=\"alert\"\n className=\"rounded-lg border border-status-error-border bg-status-error-bg-subtle p-4 text-sm text-status-error-text\"\n >\n {error.message}\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"ml-3\"\n onClick={() => void refetch()}\n >\n {tr(\"fluidgrids.settings.logStreaming.retry\", \"Retry\")}\n </Button>\n </div>\n )}\n\n {showForm && (\n <Card className=\"border-border-secondary bg-background-secondary\">\n <CardHeader>\n <div className=\"flex items-center justify-between gap-3\">\n <h3 className=\"font-medium text-text-primary\">\n {editingId\n ? tr(\n \"fluidgrids.settings.logStreaming.edit\",\n \"Edit destination\",\n )\n : tr(\n \"fluidgrids.settings.logStreaming.new\",\n \"New destination\",\n )}\n </h3>\n <Button variant=\"ghost\" size=\"sm\" onClick={resetForm}>\n <Icon icon=\"mdi:close\" width={18} />\n </Button>\n </div>\n </CardHeader>\n <CardContent className=\"space-y-5\">\n <div className=\"grid gap-4 md:grid-cols-2\">\n <div className=\"space-y-2\">\n <Label htmlFor=\"log-stream-name\">\n {tr(\"fluidgrids.settings.logStreaming.name\", \"Name\")}\n </Label>\n <Input\n id=\"log-stream-name\"\n value={form.name}\n onChange={(event) =>\n setForm((current) => ({\n ...current,\n name: event.target.value,\n }))\n }\n placeholder=\"Production error stream\"\n />\n </div>\n <div className=\"space-y-2\">\n <Label htmlFor=\"log-stream-provider\">\n {tr(\"fluidgrids.settings.logStreaming.provider\", \"Provider\")}\n </Label>\n <select\n id=\"log-stream-provider\"\n value={form.provider}\n onChange={(event) =>\n setForm((current) => ({\n ...current,\n provider: event.target.value as LogStreamProvider,\n endpoint: \"\",\n }))\n }\n className=\"w-full rounded-md border border-border-secondary bg-background-primary px-3 py-2 text-sm text-text-primary\"\n >\n {PROVIDERS.map((provider) => (\n <option key={provider} value={provider}>\n {provider}\n </option>\n ))}\n </select>\n </div>\n </div>\n <div className=\"space-y-2\">\n <Label htmlFor=\"log-stream-endpoint\">\n {tr(\"fluidgrids.settings.logStreaming.endpoint\", \"Endpoint\")}\n </Label>\n <Input\n id=\"log-stream-endpoint\"\n value={form.endpoint}\n onChange={(event) =>\n setForm((current) => ({\n ...current,\n endpoint: event.target.value,\n }))\n }\n placeholder={endpointPlaceholder(form.provider)}\n type={\n form.provider === \"WEBHOOK\" || form.provider === \"SENTRY\"\n ? \"url\"\n : \"text\"\n }\n />\n </div>\n {form.provider === \"WEBHOOK\" && (\n <div className=\"space-y-2\">\n <Label htmlFor=\"log-stream-secret\">\n {tr(\n \"fluidgrids.settings.logStreaming.secret\",\n \"Signing secret\",\n )}\n </Label>\n <Input\n id=\"log-stream-secret\"\n value={form.secret}\n onChange={(event) =>\n setForm((current) => ({\n ...current,\n secret: event.target.value,\n }))\n }\n placeholder={\n editingId\n ? \"Leave blank to keep the current secret\"\n : \"Enter a signing secret\"\n }\n type=\"password\"\n autoComplete=\"new-password\"\n />\n </div>\n )}\n <div className=\"space-y-2\">\n <Label htmlFor=\"log-stream-config\">\n {tr(\n \"fluidgrids.settings.logStreaming.config\",\n \"Provider configuration (JSON)\",\n )}\n </Label>\n <textarea\n id=\"log-stream-config\"\n value={form.configText}\n onChange={(event) =>\n setForm((current) => ({\n ...current,\n configText: event.target.value,\n }))\n }\n className=\"min-h-24 w-full rounded-md border border-border-secondary bg-background-primary px-3 py-2 font-mono text-xs text-text-primary\"\n spellCheck={false}\n />\n </div>\n <fieldset className=\"space-y-2\">\n <legend className=\"text-sm font-medium text-text-primary\">\n {tr(\n \"fluidgrids.settings.logStreaming.events\",\n \"Events to stream\",\n )}\n </legend>\n <div className=\"grid gap-2 sm:grid-cols-2 lg:grid-cols-4\">\n {LOG_STREAM_EVENT_TYPES.map((event) => (\n <label\n key={event}\n className=\"flex items-center gap-2 text-sm text-text-secondary\"\n >\n <input\n type=\"checkbox\"\n checked={form.eventFilters.includes(event)}\n onChange={() => toggleEvent(event)}\n className=\"size-4 rounded border-border-secondary accent-action-primary-bg\"\n />\n {eventLabel(event)}\n </label>\n ))}\n </div>\n </fieldset>\n <label className=\"flex items-center gap-2 text-sm text-text-secondary\">\n <input\n type=\"checkbox\"\n checked={form.isEnabled}\n onChange={(event) =>\n setForm((current) => ({\n ...current,\n isEnabled: event.target.checked,\n }))\n }\n className=\"size-4 rounded border-border-secondary accent-action-primary-bg\"\n />\n {tr(\n \"fluidgrids.settings.logStreaming.enabled\",\n \"Destination enabled\",\n )}\n </label>\n <div className=\"flex justify-end gap-2\">\n <Button variant=\"outline\" onClick={resetForm}>\n {tr(\"fluidgrids.settings.logStreaming.cancel\", \"Cancel\")}\n </Button>\n <Button onClick={() => void save()} disabled={actions.loading}>\n {actions.loading\n ? tr(\"fluidgrids.settings.logStreaming.saving\", \"Saving…\")\n : tr(\n \"fluidgrids.settings.logStreaming.save\",\n \"Save destination\",\n )}\n </Button>\n </div>\n </CardContent>\n </Card>\n )}\n\n <div className=\"space-y-3\">\n {loading && destinations.length === 0 && (\n <div className=\"rounded-lg border border-border-secondary bg-background-secondary p-6 text-sm text-text-secondary\">\n {tr(\n \"fluidgrids.settings.logStreaming.loading\",\n \"Loading destinations…\",\n )}\n </div>\n )}\n {!loading && destinations.length === 0 && (\n <div className=\"rounded-lg border border-dashed border-border-secondary bg-background-secondary p-8 text-center\">\n <Icon\n icon=\"mdi:transit-connection-variant\"\n className=\"mx-auto mb-3 text-text-secondary\"\n width={32}\n />\n <p className=\"font-medium text-text-primary\">\n {tr(\n \"fluidgrids.settings.logStreaming.emptyTitle\",\n \"No log destinations yet\",\n )}\n </p>\n <p className=\"mt-1 text-sm text-text-secondary\">\n {tr(\n \"fluidgrids.settings.logStreaming.emptyDescription\",\n \"Add a webhook, syslog target, or Sentry DSN to start streaming events.\",\n )}\n </p>\n </div>\n )}\n {destinations.map((destination) => (\n <Card\n key={destination.id}\n className=\"border-border-secondary bg-background-secondary\"\n >\n <CardContent className=\"flex flex-col gap-4 p-4 sm:flex-row sm:items-center sm:justify-between\">\n <div className=\"min-w-0\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <h3 className=\"font-medium text-text-primary\">\n {destination.name}\n </h3>\n <span className=\"rounded-full bg-background-tertiary px-2 py-0.5 text-xs text-text-secondary\">\n {destination.provider}\n </span>\n <span\n className={\n destination.isEnabled\n ? \"text-xs text-status-success-text\"\n : \"text-xs text-text-secondary\"\n }\n >\n {destination.isEnabled\n ? tr(\n \"fluidgrids.settings.logStreaming.enabledBadge\",\n \"Enabled\",\n )\n : tr(\n \"fluidgrids.settings.logStreaming.disabledBadge\",\n \"Disabled\",\n )}\n </span>\n </div>\n <p className=\"mt-1 truncate text-sm text-text-secondary\">\n {destination.endpoint}\n </p>\n <p className=\"mt-1 text-xs text-text-secondary\">\n {destination.eventFilters.length > 0\n ? destination.eventFilters.map(eventLabel).join(\", \")\n : tr(\n \"fluidgrids.settings.logStreaming.allEvents\",\n \"All events\",\n )}\n {destination.hasSecret && \" · Secret configured\"}\n </p>\n {destination.lastDispatchError && (\n <p className=\"mt-2 text-xs text-status-error-text\">\n {destination.lastDispatchError}\n </p>\n )}\n </div>\n <div className=\"flex shrink-0 flex-wrap gap-2\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => void sendTest(destination)}\n disabled={actions.loading}\n >\n <Icon\n icon=\"mdi:send-check-outline\"\n className=\"mr-1\"\n width={15}\n />\n {tr(\"fluidgrids.settings.logStreaming.test\", \"Send test\")}\n </Button>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => {\n setEditingId(destination.id);\n setShowForm(true);\n }}\n disabled={actions.loading}\n >\n {tr(\"fluidgrids.settings.logStreaming.editButton\", \"Edit\")}\n </Button>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => void remove(destination)}\n disabled={actions.loading}\n >\n <Icon\n icon=\"mdi:trash-can-outline\"\n className=\"text-status-error-text\"\n width={17}\n />\n <span className=\"sr-only\">\n {tr(\"fluidgrids.settings.logStreaming.delete\", \"Delete\")}\n </span>\n </Button>\n </div>\n </CardContent>\n </Card>\n ))}\n </div>\n </div>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/modules/observability/hooks/useObservability.ts","../src/modules/observability/types.ts","../src/modules/observability/components/LogStreamingTab.tsx"],"names":["useState","useEffect","useCallback"],"mappings":"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","file":"chunk-WNFZXH3Z.js","sourcesContent":["import { useCallback, useEffect, useState } from \"react\";\nimport { getFluidGridsClient } from \"../../../graphql/client\";\nimport {\n describeOperationError,\n throwIfResultError,\n} from \"../../../graphql/errors\";\nimport {\n CREATE_LOG_STREAM_DESTINATION,\n DELETE_LOG_STREAM_DESTINATION,\n LOG_STREAM_DESTINATIONS,\n OBSERVABILITY_DATA_SINK_DATA,\n OBSERVABILITY_DATA_SINKS,\n OBSERVABILITY_DASHBOARD_SUMMARY,\n OBSERVABILITY_FAILED_RUNS,\n REPLAY_WORKFLOW_RUN,\n RETRY_WORKFLOW_RUNS,\n TEST_LOG_STREAM_DESTINATION,\n UPDATE_LOG_STREAM_DESTINATION,\n} from \"../operations\";\nimport type {\n DashboardSummary,\n DataSinkData,\n DataSinkSummary,\n FailedRun,\n LogStreamDestination,\n LogStreamDestinationInput,\n LogStreamDestinationResponse,\n MutationResponse,\n TriggerResponse,\n} from \"../types\";\n\ninterface DestinationQueryData {\n logStreamDestinations: LogStreamDestination[];\n}\n\ninterface DestinationMutationData {\n createLogStreamDestination?: LogStreamDestinationResponse;\n updateLogStreamDestination?: LogStreamDestinationResponse;\n deleteLogStreamDestination?: MutationResponse;\n testLogStreamDestination?: MutationResponse;\n}\n\ninterface SummaryQueryData {\n dashboardSummary: DashboardSummary;\n}\n\ninterface FailedRunsQueryData {\n workflowRuns: {\n total: number;\n hasMore: boolean;\n items: FailedRun[];\n };\n}\n\ninterface TriggerMutationData {\n replayWorkflowRun?: TriggerResponse;\n retryWorkflowRuns?: TriggerResponse[];\n}\n\ninterface DataSinksQueryData {\n listDataSinks: {\n totalCount: number;\n pageInfo: { hasNextPage: boolean; endCursor?: string | null };\n edges: Array<{ cursor: string; node: DataSinkSummary }>;\n };\n}\n\ninterface DataSinkDataQueryData {\n getDataSinkData?: DataSinkData | null;\n}\n\ninterface UseAsyncState<T> {\n data: T | null;\n loading: boolean;\n error: Error | null;\n}\n\nfunction useAsyncRefresh<T>(\n fetcher: () => Promise<T>,\n initial: T | null,\n): UseAsyncState<T> & { refetch: () => Promise<T | null> } {\n const [data, setData] = useState<T | null>(initial);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n\n const refetch = useCallback(async () => {\n setLoading(true);\n setError(null);\n try {\n const next = await fetcher();\n setData(next);\n return next;\n } catch (cause) {\n const nextError = new Error(describeOperationError(cause));\n setError(nextError);\n return null;\n } finally {\n setLoading(false);\n }\n }, [fetcher]);\n\n useEffect(() => {\n void refetch();\n }, [refetch]);\n\n return { data, loading, error, refetch };\n}\n\nexport function useLogStreamDestinations() {\n const fetchDestinations = useCallback(async () => {\n const result = throwIfResultError(\n await getFluidGridsClient().query<DestinationQueryData>({\n query: LOG_STREAM_DESTINATIONS,\n fetchPolicy: \"network-only\",\n }),\n );\n return result.data?.logStreamDestinations ?? [];\n }, []);\n\n const state = useAsyncRefresh(fetchDestinations, []);\n return { destinations: state.data ?? [], ...state, refetch: state.refetch };\n}\n\nexport function useLogStreamDestinationActions() {\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const run = useCallback(\n async <T>(operation: () => Promise<T>): Promise<T | null> => {\n setLoading(true);\n setError(null);\n try {\n return await operation();\n } catch (cause) {\n const nextError = new Error(describeOperationError(cause));\n setError(nextError);\n return null;\n } finally {\n setLoading(false);\n }\n },\n [],\n );\n\n const create = useCallback(\n (input: LogStreamDestinationInput) =>\n run(async () => {\n const result = throwIfResultError(\n await getFluidGridsClient().mutate<DestinationMutationData>({\n mutation: CREATE_LOG_STREAM_DESTINATION,\n variables: { input },\n }),\n );\n return result.data?.createLogStreamDestination ?? null;\n }),\n [run],\n );\n\n const update = useCallback(\n (id: string, input: Partial<LogStreamDestinationInput>) =>\n run(async () => {\n const result = throwIfResultError(\n await getFluidGridsClient().mutate<DestinationMutationData>({\n mutation: UPDATE_LOG_STREAM_DESTINATION,\n variables: { id, input },\n }),\n );\n return result.data?.updateLogStreamDestination ?? null;\n }),\n [run],\n );\n\n const remove = useCallback(\n (id: string) =>\n run(async () => {\n const result = throwIfResultError(\n await getFluidGridsClient().mutate<DestinationMutationData>({\n mutation: DELETE_LOG_STREAM_DESTINATION,\n variables: { id },\n }),\n );\n return result.data?.deleteLogStreamDestination ?? null;\n }),\n [run],\n );\n\n const test = useCallback(\n (id: string) =>\n run(async () => {\n const result = throwIfResultError(\n await getFluidGridsClient().mutate<DestinationMutationData>({\n mutation: TEST_LOG_STREAM_DESTINATION,\n variables: { id },\n }),\n );\n return result.data?.testLogStreamDestination ?? null;\n }),\n [run],\n );\n\n return { create, update, remove, test, loading, error };\n}\n\nexport function useRunReplayActions() {\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const replay = useCallback(async (runId: string) => {\n setLoading(true);\n setError(null);\n try {\n const result = throwIfResultError(\n await getFluidGridsClient().mutate<TriggerMutationData>({\n mutation: REPLAY_WORKFLOW_RUN,\n variables: { runId },\n }),\n );\n return result.data?.replayWorkflowRun ?? null;\n } catch (cause) {\n const nextError = new Error(describeOperationError(cause));\n setError(nextError);\n return null;\n } finally {\n setLoading(false);\n }\n }, []);\n\n const retryMany = useCallback(async (runIds: string[]) => {\n setLoading(true);\n setError(null);\n try {\n const result = throwIfResultError(\n await getFluidGridsClient().mutate<TriggerMutationData>({\n mutation: RETRY_WORKFLOW_RUNS,\n variables: { runIds },\n }),\n );\n return result.data?.retryWorkflowRuns ?? [];\n } catch (cause) {\n const nextError = new Error(describeOperationError(cause));\n setError(nextError);\n return [];\n } finally {\n setLoading(false);\n }\n }, []);\n\n return { replay, retryMany, loading, error };\n}\n\nexport function useInsightsData() {\n const fetchInsights = useCallback(async () => {\n const client = getFluidGridsClient();\n const [summaryResult, failedResult] = await Promise.all([\n client.query<SummaryQueryData>({\n query: OBSERVABILITY_DASHBOARD_SUMMARY,\n fetchPolicy: \"network-only\",\n }),\n client.query<FailedRunsQueryData>({\n query: OBSERVABILITY_FAILED_RUNS,\n variables: {\n input: {\n status: \"FAILED\",\n limit: 100,\n offset: 0,\n },\n },\n fetchPolicy: \"network-only\",\n }),\n ]);\n throwIfResultError(summaryResult);\n throwIfResultError(failedResult);\n return {\n summary: summaryResult.data?.dashboardSummary ?? null,\n failedRuns: failedResult.data?.workflowRuns.items ?? [],\n };\n }, []);\n\n const state = useAsyncRefresh(fetchInsights, null);\n return {\n summary: state.data?.summary ?? null,\n failedRuns: state.data?.failedRuns ?? [],\n loading: state.loading,\n error: state.error,\n refetch: state.refetch,\n };\n}\n\nexport function useDataSinks(search: string) {\n const fetchSinks = useCallback(async () => {\n const result = throwIfResultError(\n await getFluidGridsClient().query<DataSinksQueryData>({\n query: OBSERVABILITY_DATA_SINKS,\n variables: { first: 50, isActive: true, search: search || undefined },\n fetchPolicy: \"network-only\",\n }),\n );\n return result.data?.listDataSinks ?? null;\n }, [search]);\n\n const state = useAsyncRefresh(fetchSinks, null);\n return {\n sinks: state.data?.edges.map((edge) => edge.node) ?? [],\n totalCount: state.data?.totalCount ?? 0,\n hasNextPage: state.data?.pageInfo.hasNextPage ?? false,\n ...state,\n };\n}\n\nexport function useDataSinkData(sink: DataSinkSummary | null) {\n const fetchData = useCallback(async () => {\n if (!sink) return null;\n const result = throwIfResultError(\n await getFluidGridsClient().query<DataSinkDataQueryData>({\n query: OBSERVABILITY_DATA_SINK_DATA,\n variables: { id: sink.id, limit: 100, offset: 0 },\n fetchPolicy: \"network-only\",\n }),\n );\n return result.data?.getDataSinkData ?? null;\n }, [sink]);\n\n const state = useAsyncRefresh(fetchData, null);\n return { sinkData: state.data, ...state };\n}\n","export type LogStreamProvider = \"SYSLOG\" | \"WEBHOOK\" | \"SENTRY\";\n\nexport type LogStreamEventType =\n | \"LOG_ERROR\"\n | \"LOG_WARN\"\n | \"NODE_FAILED\"\n | \"NODE_RETRIED\"\n | \"RUN_CANCELLED\"\n | \"RUN_COMPLETED\"\n | \"RUN_FAILED\"\n | \"RUN_STARTED\";\n\nexport interface LogStreamDestination {\n id: string;\n name: string;\n provider: LogStreamProvider;\n endpoint: string;\n config?: Record<string, unknown> | null;\n eventFilters: LogStreamEventType[];\n isEnabled: boolean;\n hasSecret: boolean;\n lastDispatchError?: string | null;\n lastDispatchStatus?: string | null;\n lastDispatchedAt?: string | null;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface LogStreamDestinationInput {\n name: string;\n provider: LogStreamProvider;\n endpoint: string;\n config?: Record<string, unknown>;\n eventFilters: LogStreamEventType[];\n isEnabled: boolean;\n secret?: string;\n}\n\nexport interface MutationResponse {\n success: boolean;\n message: string;\n}\n\nexport interface LogStreamDestinationResponse extends MutationResponse {\n destination?: LogStreamDestination | null;\n}\n\nexport interface TriggerResponse {\n runId: string;\n status: string;\n workflowKey: string;\n version: string;\n triggerNodeId: string;\n}\n\nexport interface DashboardSummary {\n workflowsCount: number;\n activeWorkflowsCount: number;\n runsCountTotal: number;\n runsCompletedCount: number;\n runsFailedCount: number;\n runsRunningCount: number;\n runsPendingCount: number;\n runsCancelledCount: number;\n runsWaitingCount: number;\n runsCompletedLast24h: number;\n runsFailedLast24h: number;\n runsCompletedLast7d: number;\n runsFailedLast7d: number;\n runsCompletedLast30d: number;\n runsFailedLast30d: number;\n totalNodesExecutedCount: number;\n avgWorkflowExecutionTimeSeconds?: number | null;\n avgNodeExecutionTimeSeconds?: number | null;\n workflowSuccessRate?: number | null;\n nodeUsageStats: NodeUsageStat[];\n recentRuns: RecentRun[];\n}\n\nexport interface NodeUsageStat {\n nodeType: string;\n totalExecutions: number;\n successCount: number;\n failureCount: number;\n avgExecutionTime?: number | null;\n}\n\nexport interface RecentRun {\n id: string;\n workflowKey: string;\n version: string;\n status: string;\n startedAt?: string | null;\n completedAt?: string | null;\n duration?: number | null;\n}\n\nexport interface FailedRun {\n id: string;\n workflowKey: string;\n status: string;\n errorType?: string | null;\n errorMessage?: string | null;\n triggerNodeId: string;\n startedAt?: string | null;\n completedAt?: string | null;\n duration?: number | null;\n workflow?: { name: string } | null;\n}\n\nexport interface DataSinkSummary {\n id: string;\n key: string;\n name?: string | null;\n description?: string | null;\n status: string;\n setupState: string;\n isActive: boolean;\n sizeBytes: number;\n lastRefreshedAt: string;\n nextRefreshAt?: string | null;\n dataStats?: { dataSizeBytes: number; hash: string } | null;\n linkedWorkflowCount: number;\n linkedParserCount: number;\n}\n\nexport interface DataSinkData {\n cached: boolean;\n extracted?: unknown;\n fetchedAt: string;\n hasMore?: boolean | null;\n limit?: number | null;\n offset?: number | null;\n raw: unknown;\n totalCount?: number | null;\n version: number;\n}\n\nexport function isLogStreamProvider(value: string): value is LogStreamProvider {\n return value === \"SYSLOG\" || value === \"WEBHOOK\" || value === \"SENTRY\";\n}\n\nexport const LOG_STREAM_EVENT_TYPES: readonly LogStreamEventType[] = [\n \"LOG_ERROR\",\n \"LOG_WARN\",\n \"NODE_FAILED\",\n \"NODE_RETRIED\",\n \"RUN_CANCELLED\",\n \"RUN_COMPLETED\",\n \"RUN_FAILED\",\n \"RUN_STARTED\",\n];\n","import { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { Icon } from \"@iconify/react\";\nimport { toast } from \"sonner\";\nimport { Button } from \"@burdenoff/fe-libs/button\";\nimport {\n Card,\n CardContent,\n CardHeader,\n Input,\n Label,\n} from \"@burdenoff/fe-libs/ui\";\nimport { useTr } from \"../../../hooks/useTr\";\nimport {\n LOG_STREAM_EVENT_TYPES,\n type LogStreamDestination,\n type LogStreamDestinationInput,\n type LogStreamEventType,\n type LogStreamProvider,\n} from \"../types\";\nimport {\n useLogStreamDestinationActions,\n useLogStreamDestinations,\n} from \"../hooks/useObservability\";\n\ninterface DestinationFormState {\n name: string;\n provider: LogStreamProvider;\n endpoint: string;\n eventFilters: LogStreamEventType[];\n isEnabled: boolean;\n secret: string;\n configText: string;\n}\n\nconst DEFAULT_EVENT_FILTERS: LogStreamEventType[] = [\n \"RUN_FAILED\",\n \"NODE_FAILED\",\n \"LOG_ERROR\",\n];\n\nconst PROVIDERS: LogStreamProvider[] = [\"WEBHOOK\", \"SYSLOG\", \"SENTRY\"];\n\nfunction emptyForm(): DestinationFormState {\n return {\n name: \"\",\n provider: \"WEBHOOK\",\n endpoint: \"\",\n eventFilters: DEFAULT_EVENT_FILTERS,\n isEnabled: true,\n secret: \"\",\n configText: \"{}\",\n };\n}\n\nfunction formFromDestination(\n destination: LogStreamDestination,\n): DestinationFormState {\n return {\n name: destination.name,\n provider: destination.provider,\n endpoint: destination.endpoint,\n eventFilters: destination.eventFilters,\n isEnabled: destination.isEnabled,\n secret: \"\",\n configText: JSON.stringify(destination.config ?? {}, null, 2),\n };\n}\n\nfunction eventLabel(event: LogStreamEventType): string {\n return event\n .toLowerCase()\n .split(\"_\")\n .map((part) => part.charAt(0).toUpperCase() + part.slice(1))\n .join(\" \");\n}\n\nfunction endpointPlaceholder(provider: LogStreamProvider): string {\n switch (provider) {\n case \"SYSLOG\":\n return \"logs.example.com:514\";\n case \"SENTRY\":\n return \"https://public@sentry.example/1\";\n case \"WEBHOOK\":\n return \"https://hooks.example.com/workflows\";\n }\n}\n\nfunction parseConfig(configText: string): Record<string, unknown> | null {\n try {\n const parsed: unknown = JSON.parse(configText || \"{}\");\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n return null;\n }\n return parsed as Record<string, unknown>;\n } catch {\n return null;\n }\n}\n\nfunction formToInput(\n form: DestinationFormState,\n): LogStreamDestinationInput | null {\n const config = parseConfig(form.configText);\n if (!config || !form.name.trim() || !form.endpoint.trim()) return null;\n return {\n name: form.name.trim(),\n provider: form.provider,\n endpoint: form.endpoint.trim(),\n eventFilters: form.eventFilters,\n isEnabled: form.isEnabled,\n config,\n ...(form.secret ? { secret: form.secret } : {}),\n };\n}\n\nexport function LogStreamingTab() {\n const tr = useTr();\n const { destinations, loading, error, refetch } = useLogStreamDestinations();\n const actions = useLogStreamDestinationActions();\n const [form, setForm] = useState<DestinationFormState>(emptyForm);\n const [editingId, setEditingId] = useState<string | null>(null);\n const [showForm, setShowForm] = useState(false);\n\n const editingDestination = useMemo(\n () => destinations.find((destination) => destination.id === editingId),\n [destinations, editingId],\n );\n\n useEffect(() => {\n if (editingDestination) setForm(formFromDestination(editingDestination));\n }, [editingDestination]);\n\n const resetForm = useCallback(() => {\n setForm(emptyForm());\n setEditingId(null);\n setShowForm(false);\n }, []);\n\n const save = useCallback(async () => {\n const input = formToInput(form);\n if (!input) {\n toast.error(\n tr(\n \"fluidgrids.settings.logStreaming.invalidForm\",\n \"Enter a name, endpoint, and valid JSON configuration.\",\n ),\n );\n return;\n }\n const result = editingId\n ? await actions.update(editingId, input)\n : await actions.create(input);\n if (!result?.success) {\n toast.error(\n result?.message ||\n tr(\n \"fluidgrids.settings.logStreaming.saveFailed\",\n \"Could not save log streaming destination.\",\n ),\n );\n return;\n }\n toast.success(\n tr(\n \"fluidgrids.settings.logStreaming.saved\",\n \"Log streaming destination saved.\",\n ),\n );\n resetForm();\n await refetch();\n }, [actions, editingId, form, refetch, resetForm, tr]);\n\n const remove = useCallback(\n async (destination: LogStreamDestination) => {\n if (!window.confirm(`Delete “${destination.name}”?`)) return;\n const result = await actions.remove(destination.id);\n if (!result?.success) {\n toast.error(\n result?.message ||\n tr(\n \"fluidgrids.settings.logStreaming.deleteFailed\",\n \"Could not delete destination.\",\n ),\n );\n return;\n }\n toast.success(\n tr(\n \"fluidgrids.settings.logStreaming.deleted\",\n \"Log streaming destination deleted.\",\n ),\n );\n if (editingId === destination.id) resetForm();\n await refetch();\n },\n [actions, editingId, refetch, resetForm, tr],\n );\n\n const sendTest = useCallback(\n async (destination: LogStreamDestination) => {\n const result = await actions.test(destination.id);\n if (!result) return;\n if (result.success) {\n toast.success(\n tr(\n \"fluidgrids.settings.logStreaming.testSucceeded\",\n \"Test event delivered.\",\n ),\n );\n } else {\n toast.error(\n result.message ||\n tr(\n \"fluidgrids.settings.logStreaming.testFailed\",\n \"Test event could not be delivered.\",\n ),\n );\n }\n await refetch();\n },\n [actions, refetch, tr],\n );\n\n const toggleEvent = (event: LogStreamEventType) => {\n setForm((current) => ({\n ...current,\n eventFilters: current.eventFilters.includes(event)\n ? current.eventFilters.filter((item) => item !== event)\n : [...current.eventFilters, event],\n }));\n };\n\n return (\n <div className=\"space-y-6\">\n <div className=\"flex flex-col gap-3 sm:flex-row sm:items-start sm:justify-between\">\n <div>\n <h2 className=\"text-lg font-semibold text-text-primary\">\n {tr(\"fluidgrids.settings.logStreaming.title\", \"Log streaming\")}\n </h2>\n <p className=\"mt-1 max-w-2xl text-sm text-text-secondary\">\n {tr(\n \"fluidgrids.settings.logStreaming.description\",\n \"Send workflow run and node events to workspace-managed observability destinations. Secrets are write-only and never returned.\",\n )}\n </p>\n </div>\n <Button\n onClick={() => {\n setForm(emptyForm());\n setEditingId(null);\n setShowForm(true);\n }}\n disabled={actions.loading}\n >\n <Icon icon=\"mdi:plus\" className=\"mr-1\" width={16} />\n {tr(\"fluidgrids.settings.logStreaming.add\", \"Add destination\")}\n </Button>\n </div>\n\n {error && (\n <div\n role=\"alert\"\n className=\"rounded-lg border border-status-error-border bg-status-error-bg-subtle p-4 text-sm text-status-error-text\"\n >\n {error.message}\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"ml-3\"\n onClick={() => void refetch()}\n >\n {tr(\"fluidgrids.settings.logStreaming.retry\", \"Retry\")}\n </Button>\n </div>\n )}\n\n {showForm && (\n <Card className=\"border-border-secondary bg-background-secondary\">\n <CardHeader>\n <div className=\"flex items-center justify-between gap-3\">\n <h3 className=\"font-medium text-text-primary\">\n {editingId\n ? tr(\n \"fluidgrids.settings.logStreaming.edit\",\n \"Edit destination\",\n )\n : tr(\n \"fluidgrids.settings.logStreaming.new\",\n \"New destination\",\n )}\n </h3>\n <Button variant=\"ghost\" size=\"sm\" onClick={resetForm}>\n <Icon icon=\"mdi:close\" width={18} />\n </Button>\n </div>\n </CardHeader>\n <CardContent className=\"space-y-5\">\n <div className=\"grid gap-4 md:grid-cols-2\">\n <div className=\"space-y-2\">\n <Label htmlFor=\"log-stream-name\">\n {tr(\"fluidgrids.settings.logStreaming.name\", \"Name\")}\n </Label>\n <Input\n id=\"log-stream-name\"\n value={form.name}\n onChange={(event) =>\n setForm((current) => ({\n ...current,\n name: event.target.value,\n }))\n }\n placeholder=\"Production error stream\"\n />\n </div>\n <div className=\"space-y-2\">\n <Label htmlFor=\"log-stream-provider\">\n {tr(\"fluidgrids.settings.logStreaming.provider\", \"Provider\")}\n </Label>\n <select\n id=\"log-stream-provider\"\n value={form.provider}\n onChange={(event) =>\n setForm((current) => ({\n ...current,\n provider: event.target.value as LogStreamProvider,\n endpoint: \"\",\n }))\n }\n className=\"w-full rounded-md border border-border-secondary bg-background-primary px-3 py-2 text-sm text-text-primary\"\n >\n {PROVIDERS.map((provider) => (\n <option key={provider} value={provider}>\n {provider}\n </option>\n ))}\n </select>\n </div>\n </div>\n <div className=\"space-y-2\">\n <Label htmlFor=\"log-stream-endpoint\">\n {tr(\"fluidgrids.settings.logStreaming.endpoint\", \"Endpoint\")}\n </Label>\n <Input\n id=\"log-stream-endpoint\"\n value={form.endpoint}\n onChange={(event) =>\n setForm((current) => ({\n ...current,\n endpoint: event.target.value,\n }))\n }\n placeholder={endpointPlaceholder(form.provider)}\n type={\n form.provider === \"WEBHOOK\" || form.provider === \"SENTRY\"\n ? \"url\"\n : \"text\"\n }\n />\n </div>\n {form.provider === \"WEBHOOK\" && (\n <div className=\"space-y-2\">\n <Label htmlFor=\"log-stream-secret\">\n {tr(\n \"fluidgrids.settings.logStreaming.secret\",\n \"Signing secret\",\n )}\n </Label>\n <Input\n id=\"log-stream-secret\"\n value={form.secret}\n onChange={(event) =>\n setForm((current) => ({\n ...current,\n secret: event.target.value,\n }))\n }\n placeholder={\n editingId\n ? \"Leave blank to keep the current secret\"\n : \"Enter a signing secret\"\n }\n type=\"password\"\n autoComplete=\"new-password\"\n />\n </div>\n )}\n <div className=\"space-y-2\">\n <Label htmlFor=\"log-stream-config\">\n {tr(\n \"fluidgrids.settings.logStreaming.config\",\n \"Provider configuration (JSON)\",\n )}\n </Label>\n <textarea\n id=\"log-stream-config\"\n value={form.configText}\n onChange={(event) =>\n setForm((current) => ({\n ...current,\n configText: event.target.value,\n }))\n }\n className=\"min-h-24 w-full rounded-md border border-border-secondary bg-background-primary px-3 py-2 font-mono text-xs text-text-primary\"\n spellCheck={false}\n />\n </div>\n <fieldset className=\"space-y-2\">\n <legend className=\"text-sm font-medium text-text-primary\">\n {tr(\n \"fluidgrids.settings.logStreaming.events\",\n \"Events to stream\",\n )}\n </legend>\n <div className=\"grid gap-2 sm:grid-cols-2 lg:grid-cols-4\">\n {LOG_STREAM_EVENT_TYPES.map((event) => (\n <label\n key={event}\n className=\"flex items-center gap-2 text-sm text-text-secondary\"\n >\n <input\n type=\"checkbox\"\n checked={form.eventFilters.includes(event)}\n onChange={() => toggleEvent(event)}\n className=\"size-4 rounded border-border-secondary accent-action-primary-bg\"\n />\n {eventLabel(event)}\n </label>\n ))}\n </div>\n </fieldset>\n <label className=\"flex items-center gap-2 text-sm text-text-secondary\">\n <input\n type=\"checkbox\"\n checked={form.isEnabled}\n onChange={(event) =>\n setForm((current) => ({\n ...current,\n isEnabled: event.target.checked,\n }))\n }\n className=\"size-4 rounded border-border-secondary accent-action-primary-bg\"\n />\n {tr(\n \"fluidgrids.settings.logStreaming.enabled\",\n \"Destination enabled\",\n )}\n </label>\n <div className=\"flex justify-end gap-2\">\n <Button variant=\"outline\" onClick={resetForm}>\n {tr(\"fluidgrids.settings.logStreaming.cancel\", \"Cancel\")}\n </Button>\n <Button onClick={() => void save()} disabled={actions.loading}>\n {actions.loading\n ? tr(\"fluidgrids.settings.logStreaming.saving\", \"Saving…\")\n : tr(\n \"fluidgrids.settings.logStreaming.save\",\n \"Save destination\",\n )}\n </Button>\n </div>\n </CardContent>\n </Card>\n )}\n\n <div className=\"space-y-3\">\n {loading && destinations.length === 0 && (\n <div className=\"rounded-lg border border-border-secondary bg-background-secondary p-6 text-sm text-text-secondary\">\n {tr(\n \"fluidgrids.settings.logStreaming.loading\",\n \"Loading destinations…\",\n )}\n </div>\n )}\n {!loading && destinations.length === 0 && (\n <div className=\"rounded-lg border border-dashed border-border-secondary bg-background-secondary p-8 text-center\">\n <Icon\n icon=\"mdi:transit-connection-variant\"\n className=\"mx-auto mb-3 text-text-secondary\"\n width={32}\n />\n <p className=\"font-medium text-text-primary\">\n {tr(\n \"fluidgrids.settings.logStreaming.emptyTitle\",\n \"No log destinations yet\",\n )}\n </p>\n <p className=\"mt-1 text-sm text-text-secondary\">\n {tr(\n \"fluidgrids.settings.logStreaming.emptyDescription\",\n \"Add a webhook, syslog target, or Sentry DSN to start streaming events.\",\n )}\n </p>\n </div>\n )}\n {destinations.map((destination) => (\n <Card\n key={destination.id}\n className=\"border-border-secondary bg-background-secondary\"\n >\n <CardContent className=\"flex flex-col gap-4 p-4 sm:flex-row sm:items-center sm:justify-between\">\n <div className=\"min-w-0\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <h3 className=\"font-medium text-text-primary\">\n {destination.name}\n </h3>\n <span className=\"rounded-full bg-background-tertiary px-2 py-0.5 text-xs text-text-secondary\">\n {destination.provider}\n </span>\n <span\n className={\n destination.isEnabled\n ? \"text-xs text-status-success-text\"\n : \"text-xs text-text-secondary\"\n }\n >\n {destination.isEnabled\n ? tr(\n \"fluidgrids.settings.logStreaming.enabledBadge\",\n \"Enabled\",\n )\n : tr(\n \"fluidgrids.settings.logStreaming.disabledBadge\",\n \"Disabled\",\n )}\n </span>\n </div>\n <p className=\"mt-1 truncate text-sm text-text-secondary\">\n {destination.endpoint}\n </p>\n <p className=\"mt-1 text-xs text-text-secondary\">\n {destination.eventFilters.length > 0\n ? destination.eventFilters.map(eventLabel).join(\", \")\n : tr(\n \"fluidgrids.settings.logStreaming.allEvents\",\n \"All events\",\n )}\n {destination.hasSecret && \" · Secret configured\"}\n </p>\n {destination.lastDispatchError && (\n <p className=\"mt-2 text-xs text-status-error-text\">\n {destination.lastDispatchError}\n </p>\n )}\n </div>\n <div className=\"flex shrink-0 flex-wrap gap-2\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => void sendTest(destination)}\n disabled={actions.loading}\n >\n <Icon\n icon=\"mdi:send-check-outline\"\n className=\"mr-1\"\n width={15}\n />\n {tr(\"fluidgrids.settings.logStreaming.test\", \"Send test\")}\n </Button>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => {\n setEditingId(destination.id);\n setShowForm(true);\n }}\n disabled={actions.loading}\n >\n {tr(\"fluidgrids.settings.logStreaming.editButton\", \"Edit\")}\n </Button>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => void remove(destination)}\n disabled={actions.loading}\n >\n <Icon\n icon=\"mdi:trash-can-outline\"\n className=\"text-status-error-text\"\n width={17}\n />\n <span className=\"sr-only\">\n {tr(\"fluidgrids.settings.logStreaming.delete\", \"Delete\")}\n </span>\n </Button>\n </div>\n </CardContent>\n </Card>\n ))}\n </div>\n </div>\n );\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { LogStreamingTab } from './chunk-
|
|
1
|
+
import { LogStreamingTab } from './chunk-WNFZXH3Z.js';
|
|
2
2
|
import { useFlowStore } from './chunk-3B5YEXSW.js';
|
|
3
3
|
import { useWorkflowDefinitionQuery, useUpdateWorkflowDefinitionMutation, useWorkflowDefinitionsQuery } from './chunk-3P4YQ7DO.js';
|
|
4
4
|
import { useTr } from './chunk-7YWBH2A5.js';
|
|
@@ -680,5 +680,5 @@ function SettingsPage({
|
|
|
680
680
|
}
|
|
681
681
|
|
|
682
682
|
export { SettingsPage };
|
|
683
|
-
//# sourceMappingURL=chunk-
|
|
684
|
-
//# sourceMappingURL=chunk-
|
|
683
|
+
//# sourceMappingURL=chunk-WXNDAONY.js.map
|
|
684
|
+
//# sourceMappingURL=chunk-WXNDAONY.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/modules/settings/pages/SettingsPage.tsx"],"names":[],"mappings":"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","file":"chunk-BNSM27CU.js","sourcesContent":["import { useState, useCallback, useEffect, useMemo } from \"react\";\nimport { useNavigate, useParams } from \"react-router\";\nimport { Icon } from \"@iconify/react\";\nimport { Button } from \"@burdenoff/fe-libs/button\";\nimport {\n Tabs,\n TabsList,\n TabsTrigger,\n TabsContent,\n Input,\n Label,\n Switch,\n Card,\n CardHeader,\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n TooltipProvider,\n Select,\n SelectTrigger,\n SelectValue,\n SelectContent,\n SelectItem,\n} from \"@burdenoff/fe-libs/ui\";\nimport { toast } from \"sonner\";\nimport { useTr } from \"../../../hooks/useTr\";\nimport { useFlowStore } from \"../../../builder/stores/flow-store\";\nimport { LogStreamingTab } from \"../../observability/components/LogStreamingTab\";\nimport {\n useWorkflowDefinitionQuery,\n useUpdateWorkflowDefinitionMutation,\n useWorkflowDefinitionsQuery,\n} from \"../../../generated/operations\";\n\n// ============================================================================\n// Per-workflow execution settings (BOFF-7512)\n// ============================================================================\n\n/**\n * Mirrors `IWorkflowConfig` on `wspace-workflow-svc`'s\n * `IWorkflowDefinitionJson.config` (a sibling of `data`, not nested inside\n * it), plus two fields the backend type doesn't have yet: `errorWorkflowKey`\n * and `dataSaving`. Per the ticket, \"if the underlying setting doesn't exist\n * yet, add just the schema field and wire the UI\" — `config` on\n * `definitionJson` is already a free-form JSON blob, so these new keys need\n * no backend schema change to round-trip; nothing downstream reads\n * `dataSaving.saveSuccessExecutions`/`saveFailedExecutions` yet (that's\n * execution-lifecycle work tracked separately), but the value now persists.\n */\ninterface WorkflowExecutionSettings {\n timeout?: number; // seconds\n maxParallelism?: number;\n onError?: \"stop\" | \"continue\" | \"retry\";\n /** Workflow key to run when this workflow's execution fails. */\n errorWorkflowKey?: string;\n dataSaving?: {\n saveSuccessExecutions?: boolean;\n saveFailedExecutions?: boolean;\n };\n}\n\nconst DEFAULT_EXECUTION_SETTINGS: Required<\n Pick<WorkflowExecutionSettings, \"timeout\" | \"maxParallelism\" | \"onError\">\n> = {\n timeout: 300,\n maxParallelism: 5,\n onError: \"stop\",\n};\n\n// ============================================================================\n// Constants\n// ============================================================================\n\nconst DEFAULT_SETTINGS = {\n general: {\n workspaceName: \"Default Workspace\",\n defaultWorkflowPrefix: \"wf\",\n autoSaveDrafts: true,\n },\n execution: {\n defaultTimeoutSeconds: 300,\n maxRetries: 3,\n retryDelaySeconds: 10,\n concurrentExecutionLimit: 5,\n },\n notifications: {\n emailOnSuccess: false,\n emailOnFailure: true,\n webhookOnSuccess: false,\n webhookOnFailure: true,\n },\n api: {\n gatewayUrl: \"/api/v1/workflows\",\n webhookUrlFormat: \"/api/v1/webhooks/workflow/{workflowKey}/trigger\",\n },\n};\n\n// ============================================================================\n// Sub-Components\n// ============================================================================\n\nfunction ReadOnlyBanner() {\n const tr = useTr();\n\n return (\n <div className=\"flex items-center gap-2 p-3 rounded-lg bg-amber-500/10 border border-amber-500/30 mb-6\">\n <Icon\n icon=\"mdi:information\"\n width={18}\n className=\"text-amber-400 shrink-0\"\n />\n <p className=\"text-sm text-amber-400\">\n {tr(\n \"fluidgrids.settings.readOnlyBanner.message\",\n \"Settings are managed at workspace level. Contact your workspace administrator to change these values.\",\n )}\n </p>\n </div>\n );\n}\n\nfunction CopyButton({ value, label }: { value: string; label: string }) {\n const tr = useTr();\n\n const handleCopy = useCallback(async () => {\n try {\n await navigator.clipboard.writeText(value);\n toast.success(\n `${label} ${tr(\"fluidgrids.settings.copyButton.copiedToast\", \"copied to clipboard\")}`,\n );\n } catch {\n toast.error(\n tr(\n \"fluidgrids.settings.copyButton.copyFailedToast\",\n \"Failed to copy to clipboard\",\n ),\n );\n }\n }, [value, label, tr]);\n\n return (\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n onClick={handleCopy}\n className=\"p-1.5 rounded hover:bg-background-tertiary text-text-secondary hover:text-text-primary transition-colors\"\n >\n <Icon icon=\"mdi:content-copy\" width={16} />\n </button>\n </TooltipTrigger>\n <TooltipContent>\n {tr(\"fluidgrids.settings.copyButton.copyTooltipPrefix\", \"Copy\")}{\" \"}\n {label}\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n );\n}\n\nfunction SettingRow({\n label,\n description,\n children,\n}: {\n label: string;\n description?: string;\n children: React.ReactNode;\n}) {\n return (\n <div className=\"flex flex-col sm:flex-row sm:items-center sm:justify-between gap-3 py-4\">\n <div className=\"flex-1 min-w-0\">\n <Label className=\"text-sm font-medium text-text-primary\">{label}</Label>\n {description && (\n <p className=\"text-xs text-text-secondary mt-0.5\">{description}</p>\n )}\n </div>\n <div className=\"shrink-0\">{children}</div>\n </div>\n );\n}\n\n// ============================================================================\n// Tab Content Components\n// ============================================================================\n\nfunction GeneralTab() {\n const tr = useTr();\n const settings = DEFAULT_SETTINGS.general;\n\n return (\n <div>\n <ReadOnlyBanner />\n <div className=\"divide-y divide-border-secondary\">\n <SettingRow\n label={tr(\n \"fluidgrids.settings.general.workspaceNameLabel\",\n \"Workspace Name\",\n )}\n description={tr(\n \"fluidgrids.settings.general.workspaceNameDescription\",\n \"The name of your workspace\",\n )}\n >\n <Input\n value={settings.workspaceName}\n readOnly\n className=\"w-[250px] bg-background-secondary border-border-secondary text-text-primary cursor-default\"\n />\n </SettingRow>\n <SettingRow\n label={tr(\n \"fluidgrids.settings.general.workflowPrefixLabel\",\n \"Default Workflow Prefix\",\n )}\n description={tr(\n \"fluidgrids.settings.general.workflowPrefixDescription\",\n \"Prefix used when generating new workflow keys\",\n )}\n >\n <Input\n value={settings.defaultWorkflowPrefix}\n readOnly\n className=\"w-[120px] bg-background-secondary border-border-secondary text-text-primary cursor-default\"\n />\n </SettingRow>\n <SettingRow\n label={tr(\n \"fluidgrids.settings.general.autoSaveDraftsLabel\",\n \"Auto-save Drafts\",\n )}\n description={tr(\n \"fluidgrids.settings.general.autoSaveDraftsDescription\",\n \"Automatically save draft workflows while editing\",\n )}\n >\n <Switch checked={settings.autoSaveDrafts} disabled />\n </SettingRow>\n </div>\n </div>\n );\n}\n\n/**\n * Editable, per-WORKFLOW execution settings (BOFF-7512) — replaces the old\n * global/read-only tab. Resolves the target workflow from (in order) an\n * explicit `workflowKey` prop, the `:id` route param, or the flow store's\n * currently-loaded workflow (set when the user arrived here from the\n * builder). When none of those resolve, falls back to the previous\n * read-only static display rather than a broken/blank editor.\n */\nfunction ExecutionTab({ workflowKey }: Readonly<{ workflowKey?: string }>) {\n const tr = useTr();\n\n const { data, loading, refetch } = useWorkflowDefinitionQuery({\n variables: { workflowKey },\n skip: !workflowKey,\n fetchPolicy: \"cache-and-network\",\n });\n const [updateWorkflowDefinition, { loading: saving }] =\n useUpdateWorkflowDefinitionMutation();\n\n // \"Error workflow\" picker — reuses the same list-workflows query the\n // history/list pages already use (`workflowDefinitions`), latest version\n // per key, excluding the workflow being edited (running itself as its own\n // error handler on every failure risks an infinite loop).\n const { data: otherWorkflowsData, loading: otherWorkflowsLoading } =\n useWorkflowDefinitionsQuery({\n variables: { input: { latestOnly: true, limit: 100 } },\n });\n const errorWorkflowOptions = (\n otherWorkflowsData?.workflowDefinitions?.items ?? []\n ).filter((w) => w.workflowKey !== workflowKey);\n\n const workflow = data?.workflowDefinition;\n const persistedConfig = useMemo(() => {\n const definitionJson = workflow?.definitionJson as\n Record<string, unknown> | undefined;\n const config = definitionJson?.config as\n WorkflowExecutionSettings | undefined;\n return config ?? {};\n }, [workflow?.definitionJson]);\n\n const [form, setForm] = useState<WorkflowExecutionSettings>(persistedConfig);\n // Re-seed the form whenever the fetched workflow (or its persisted config)\n // changes — e.g. on first load, or after switching workflows.\n useEffect(() => setForm(persistedConfig), [persistedConfig]);\n\n const handleSave = useCallback(async () => {\n if (!workflow?.id) return;\n try {\n const definitionJson = {\n ...(workflow.definitionJson as Record<string, unknown>),\n config: form,\n };\n await updateWorkflowDefinition({\n variables: { id: workflow.id, input: { definitionJson } },\n });\n toast.success(\n tr(\n \"fluidgrids.settings.execution.savedToast\",\n \"Execution settings saved\",\n ),\n );\n void refetch();\n } catch (err) {\n toast.error(\n tr(\n \"fluidgrids.settings.execution.saveFailedToast\",\n \"Failed to save settings\",\n ),\n { description: err instanceof Error ? err.message : undefined },\n );\n }\n }, [workflow, form, updateWorkflowDefinition, refetch, tr]);\n\n if (!workflowKey) {\n // No workflow context resolvable — keep the previous static display so\n // the page still renders something useful rather than an empty form.\n // NOT the workspace-level `ReadOnlyBanner` copy: this isn't a policy\n // restriction, just a missing route/store context, so it gets its own\n // message rather than implying \"contact your admin\".\n const settings = DEFAULT_SETTINGS.execution;\n return (\n <div>\n <div className=\"flex items-center gap-2 p-3 rounded-lg bg-amber-500/10 border border-amber-500/30 mb-6\">\n <Icon\n icon=\"mdi:information\"\n width={18}\n className=\"text-amber-400 shrink-0\"\n />\n <p className=\"text-sm text-amber-400\">\n {tr(\n \"fluidgrids.settings.execution.noWorkflowContextBanner\",\n \"No workflow selected — open Settings from a specific workflow to edit its execution settings.\",\n )}\n </p>\n </div>\n <div className=\"divide-y divide-border-secondary\">\n <SettingRow\n label={tr(\n \"fluidgrids.settings.execution.defaultTimeoutLabel\",\n \"Default Timeout\",\n )}\n description={tr(\n \"fluidgrids.settings.execution.noWorkflowContextDescription\",\n \"Open this page from a specific workflow to edit its execution settings.\",\n )}\n >\n <div className=\"flex items-center gap-2\">\n <Input\n value={settings.defaultTimeoutSeconds}\n readOnly\n className=\"w-[100px] bg-background-secondary border-border-secondary text-text-primary text-right cursor-default\"\n />\n <span className=\"text-xs text-text-secondary\">\n {tr(\n \"fluidgrids.settings.execution.defaultTimeoutUnit\",\n \"seconds\",\n )}\n </span>\n </div>\n </SettingRow>\n </div>\n </div>\n );\n }\n\n return (\n <div>\n <div className=\"divide-y divide-border-secondary\">\n <SettingRow\n label={tr(\n \"fluidgrids.settings.execution.defaultTimeoutLabel\",\n \"Timeout\",\n )}\n description={tr(\n \"fluidgrids.settings.execution.defaultTimeoutDescription\",\n \"Maximum time this workflow's execution can run (in seconds)\",\n )}\n >\n <div className=\"flex items-center gap-2\">\n <Input\n type=\"number\"\n min={1}\n value={form.timeout ?? DEFAULT_EXECUTION_SETTINGS.timeout}\n onChange={(e) =>\n setForm((f) => ({\n ...f,\n timeout: Math.max(1, parseInt(e.target.value, 10) || 1),\n }))\n }\n disabled={loading}\n className=\"w-[100px] text-right\"\n />\n <span className=\"text-xs text-text-secondary\">\n {tr(\n \"fluidgrids.settings.execution.defaultTimeoutUnit\",\n \"seconds\",\n )}\n </span>\n </div>\n </SettingRow>\n <SettingRow\n label={tr(\n \"fluidgrids.settings.execution.concurrencyLimitLabel\",\n \"Concurrency Limit\",\n )}\n description={tr(\n \"fluidgrids.settings.execution.concurrencyLimitDescription\",\n \"Maximum number of this workflow's executions running simultaneously\",\n )}\n >\n <Input\n type=\"number\"\n min={1}\n value={\n form.maxParallelism ?? DEFAULT_EXECUTION_SETTINGS.maxParallelism\n }\n onChange={(e) =>\n setForm((f) => ({\n ...f,\n maxParallelism: Math.max(1, parseInt(e.target.value, 10) || 1),\n }))\n }\n disabled={loading}\n className=\"w-[80px] text-right\"\n />\n </SettingRow>\n <SettingRow\n label={tr(\n \"fluidgrids.settings.execution.onErrorLabel\",\n \"On workflow error\",\n )}\n description={tr(\n \"fluidgrids.settings.execution.onErrorDescription\",\n \"What to do when this workflow's execution fails\",\n )}\n >\n <select\n value={form.onError ?? DEFAULT_EXECUTION_SETTINGS.onError}\n onChange={(e) =>\n setForm((f) => ({\n ...f,\n onError: e.target.value as WorkflowExecutionSettings[\"onError\"],\n }))\n }\n disabled={loading}\n className=\"w-[160px] rounded-md border border-border-secondary bg-background-secondary px-2 py-1.5 text-sm text-text-primary\"\n >\n <option value=\"stop\">\n {tr(\"fluidgrids.settings.execution.onErrorStop\", \"Stop\")}\n </option>\n <option value=\"continue\">\n {tr(\"fluidgrids.settings.execution.onErrorContinue\", \"Continue\")}\n </option>\n <option value=\"retry\">\n {tr(\"fluidgrids.settings.execution.onErrorRetry\", \"Retry\")}\n </option>\n </select>\n </SettingRow>\n <SettingRow\n label={tr(\n \"fluidgrids.settings.execution.errorWorkflowLabel\",\n \"Error workflow\",\n )}\n description={tr(\n \"fluidgrids.settings.execution.errorWorkflowDescription\",\n \"Workflow key to run when this workflow's execution fails (optional)\",\n )}\n >\n <Select\n value={form.errorWorkflowKey ?? \"__none__\"}\n onValueChange={(val) =>\n setForm((f) => ({\n ...f,\n errorWorkflowKey: val === \"__none__\" ? undefined : val,\n }))\n }\n disabled={loading || otherWorkflowsLoading}\n >\n <SelectTrigger className=\"w-[220px] bg-background-secondary border-border-secondary\">\n <SelectValue\n placeholder={tr(\n \"fluidgrids.settings.execution.errorWorkflowPlaceholder\",\n \"None\",\n )}\n />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"__none__\">\n {tr(\"fluidgrids.settings.execution.errorWorkflowNone\", \"None\")}\n </SelectItem>\n {errorWorkflowOptions.map((w) => (\n <SelectItem key={w.workflowKey} value={w.workflowKey}>\n {w.name}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </SettingRow>\n <SettingRow\n label={tr(\n \"fluidgrids.settings.execution.saveSuccessLabel\",\n \"Save successful execution data\",\n )}\n >\n <Switch\n checked={form.dataSaving?.saveSuccessExecutions ?? true}\n onCheckedChange={(checked) =>\n setForm((f) => ({\n ...f,\n dataSaving: { ...f.dataSaving, saveSuccessExecutions: checked },\n }))\n }\n disabled={loading}\n />\n </SettingRow>\n <SettingRow\n label={tr(\n \"fluidgrids.settings.execution.saveFailedLabel\",\n \"Save failed execution data\",\n )}\n >\n <Switch\n checked={form.dataSaving?.saveFailedExecutions ?? true}\n onCheckedChange={(checked) =>\n setForm((f) => ({\n ...f,\n dataSaving: { ...f.dataSaving, saveFailedExecutions: checked },\n }))\n }\n disabled={loading}\n />\n </SettingRow>\n </div>\n <div className=\"mt-4 flex justify-end\">\n <Button onClick={() => void handleSave()} disabled={loading || saving}>\n {saving\n ? tr(\"fluidgrids.settings.execution.saving\", \"Saving…\")\n : tr(\"fluidgrids.settings.execution.save\", \"Save\")}\n </Button>\n </div>\n </div>\n );\n}\n\nfunction NotificationsTab() {\n const tr = useTr();\n const settings = DEFAULT_SETTINGS.notifications;\n\n return (\n <div>\n <ReadOnlyBanner />\n\n {/* Email Notifications */}\n <div className=\"mb-6\">\n <h3 className=\"text-sm font-semibold text-text-primary flex items-center gap-2 mb-3\">\n <Icon icon=\"mdi:email-outline\" width={18} />\n {tr(\n \"fluidgrids.settings.notifications.emailSectionTitle\",\n \"Email Notifications\",\n )}\n </h3>\n <div className=\"divide-y divide-border-secondary rounded-lg border border-border-secondary bg-background-secondary p-1\">\n <SettingRow\n label={tr(\n \"fluidgrids.settings.notifications.emailOnSuccessLabel\",\n \"On Success\",\n )}\n description={tr(\n \"fluidgrids.settings.notifications.emailOnSuccessDescription\",\n \"Send email when a workflow execution completes successfully\",\n )}\n >\n <Switch checked={settings.emailOnSuccess} disabled />\n </SettingRow>\n <SettingRow\n label={tr(\n \"fluidgrids.settings.notifications.emailOnFailureLabel\",\n \"On Failure\",\n )}\n description={tr(\n \"fluidgrids.settings.notifications.emailOnFailureDescription\",\n \"Send email when a workflow execution fails\",\n )}\n >\n <Switch checked={settings.emailOnFailure} disabled />\n </SettingRow>\n </div>\n </div>\n\n {/* Webhook Notifications */}\n <div>\n <h3 className=\"text-sm font-semibold text-text-primary flex items-center gap-2 mb-3\">\n <Icon icon=\"mdi:webhook\" width={18} />\n {tr(\n \"fluidgrids.settings.notifications.webhookSectionTitle\",\n \"Webhook Notifications\",\n )}\n </h3>\n <div className=\"divide-y divide-border-secondary rounded-lg border border-border-secondary bg-background-secondary p-1\">\n <SettingRow\n label={tr(\n \"fluidgrids.settings.notifications.webhookOnSuccessLabel\",\n \"On Success\",\n )}\n description={tr(\n \"fluidgrids.settings.notifications.webhookOnSuccessDescription\",\n \"Send webhook when a workflow execution completes successfully\",\n )}\n >\n <Switch checked={settings.webhookOnSuccess} disabled />\n </SettingRow>\n <SettingRow\n label={tr(\n \"fluidgrids.settings.notifications.webhookOnFailureLabel\",\n \"On Failure\",\n )}\n description={tr(\n \"fluidgrids.settings.notifications.webhookOnFailureDescription\",\n \"Send webhook when a workflow execution fails\",\n )}\n >\n <Switch checked={settings.webhookOnFailure} disabled />\n </SettingRow>\n </div>\n </div>\n </div>\n );\n}\n\nfunction ApiTab() {\n const tr = useTr();\n const settings = DEFAULT_SETTINGS.api;\n\n return (\n <div>\n <div className=\"space-y-4\">\n {/* API Gateway URL */}\n <Card className=\"border border-border-secondary bg-background-secondary\">\n <CardHeader className=\"pb-3\">\n <div className=\"flex items-center gap-2 mb-2\">\n <Icon icon=\"mdi:api\" width={20} className=\"text-text-secondary\" />\n <h3 className=\"text-sm font-semibold text-text-primary\">\n {tr(\n \"fluidgrids.settings.api.gatewayUrlTitle\",\n \"API Gateway URL\",\n )}\n </h3>\n </div>\n <p className=\"text-xs text-text-secondary mb-3\">\n {tr(\n \"fluidgrids.settings.api.gatewayUrlDescription\",\n \"Base URL for workflow API operations. Use this to trigger, list, and manage workflows programmatically.\",\n )}\n </p>\n <div className=\"flex items-center gap-2 rounded-lg bg-background-tertiary px-3 py-2 border border-border-secondary\">\n <code className=\"text-sm text-text-primary flex-1 truncate\">\n {settings.gatewayUrl}\n </code>\n <CopyButton\n value={settings.gatewayUrl}\n label={tr(\n \"fluidgrids.settings.api.gatewayUrlCopyLabel\",\n \"API Gateway URL\",\n )}\n />\n </div>\n </CardHeader>\n </Card>\n\n {/* Webhook URL */}\n <Card className=\"border border-border-secondary bg-background-secondary\">\n <CardHeader className=\"pb-3\">\n <div className=\"flex items-center gap-2 mb-2\">\n <Icon\n icon=\"mdi:webhook\"\n width={20}\n className=\"text-text-secondary\"\n />\n <h3 className=\"text-sm font-semibold text-text-primary\">\n {tr(\n \"fluidgrids.settings.api.webhookUrlTitle\",\n \"Webhook URL Format\",\n )}\n </h3>\n </div>\n <p className=\"text-xs text-text-secondary mb-3\">\n {tr(\n \"fluidgrids.settings.api.webhookUrlDescriptionPrefix\",\n \"URL format for triggering workflows via webhook. Replace\",\n )}{\" \"}\n <code className=\"text-text-primary\">{\"{workflowKey}\"}</code>{\" \"}\n {tr(\n \"fluidgrids.settings.api.webhookUrlDescriptionSuffix\",\n \"with the actual workflow key.\",\n )}\n </p>\n <div className=\"flex items-center gap-2 rounded-lg bg-background-tertiary px-3 py-2 border border-border-secondary\">\n <code className=\"text-sm text-text-primary flex-1 truncate\">\n {settings.webhookUrlFormat}\n </code>\n <CopyButton\n value={settings.webhookUrlFormat}\n label={tr(\n \"fluidgrids.settings.api.webhookUrlCopyLabel\",\n \"Webhook URL\",\n )}\n />\n </div>\n </CardHeader>\n </Card>\n\n {/* Example cURL */}\n <Card className=\"border border-border-secondary bg-background-secondary\">\n <CardHeader className=\"pb-3\">\n <div className=\"flex items-center gap-2 mb-2\">\n <Icon\n icon=\"mdi:console\"\n width={20}\n className=\"text-text-secondary\"\n />\n <h3 className=\"text-sm font-semibold text-text-primary\">\n {tr(\n \"fluidgrids.settings.api.curlExampleTitle\",\n \"Example: Trigger via cURL\",\n )}\n </h3>\n </div>\n <div className=\"relative rounded-lg bg-background-tertiary px-3 py-2 border border-border-secondary\">\n <pre className=\"text-xs text-text-primary overflow-x-auto whitespace-pre-wrap\">\n {`curl -X POST \"${settings.webhookUrlFormat}\" \\\\\n -H \"Content-Type: application/json\" \\\\\n -H \"Authorization: Bearer <token>\" \\\\\n -d '{\"input\": {}}'`}\n </pre>\n <div className=\"absolute top-2 right-2\">\n <CopyButton\n value={`curl -X POST \"${settings.webhookUrlFormat}\" \\\\\\n -H \"Content-Type: application/json\" \\\\\\n -H \"Authorization: Bearer <token>\" \\\\\\n -d '{\"input\": {}}'`}\n label={tr(\n \"fluidgrids.settings.api.curlCopyLabel\",\n \"cURL command\",\n )}\n />\n </div>\n </div>\n </CardHeader>\n </Card>\n </div>\n </div>\n );\n}\n\n// ============================================================================\n// Main Component\n// ============================================================================\n\nexport interface SettingsPageProps {\n /**\n * Explicit workflow key to scope the Execution tab to (BOFF-7512). When\n * omitted, falls back to the `:id`/`:workflowKey` route param (for hosts\n * that mount this page under a per-workflow path), then to the workflow\n * currently loaded in the builder's flow store (for hosts that navigate\n * here from the builder without a route param). If none resolve, the\n * Execution tab falls back to its previous static display.\n */\n workflowKey?: string;\n}\n\nexport function SettingsPage({\n workflowKey: workflowKeyProp,\n}: SettingsPageProps = {}) {\n const tr = useTr();\n const navigate = useNavigate();\n const routeParams = useParams<{ id?: string; workflowKey?: string }>();\n const activeWorkflowKey = useFlowStore((s) => s.workflow.workflowKey);\n const workflowKey =\n workflowKeyProp ||\n routeParams.workflowKey ||\n routeParams.id ||\n activeWorkflowKey ||\n undefined;\n const [activeTab, setActiveTab] = useState(\"general\");\n\n return (\n <div className=\"p-4 sm:p-6 bg-background-primary min-h-screen\">\n {/* Header */}\n <div className=\"flex flex-col sm:flex-row sm:items-center sm:justify-between gap-4 mb-6\">\n <div>\n <h1 className=\"text-2xl sm:text-3xl font-bold text-text-primary\">\n {tr(\"fluidgrids.settings.page.title\", \"Settings\")}\n </h1>\n <p className=\"text-text-secondary mt-1\">\n {tr(\n \"fluidgrids.settings.page.subtitle\",\n \"Configure workflow execution and notification preferences\",\n )}\n </p>\n </div>\n <Button variant=\"outline\" onClick={() => navigate(\"../list\")}>\n <Icon icon=\"mdi:arrow-left\" className=\"mr-2\" width={16} />\n {tr(\"fluidgrids.settings.page.backToWorkflows\", \"Back to Workflows\")}\n </Button>\n </div>\n\n {/* Tabs */}\n <Tabs value={activeTab} onValueChange={setActiveTab} className=\"w-full\">\n <TabsList className=\"bg-background-secondary border border-border-secondary mb-6\">\n <TabsTrigger value=\"general\" className=\"gap-1.5\">\n <Icon icon=\"mdi:cog\" width={16} />\n {tr(\"fluidgrids.settings.page.generalTab\", \"General\")}\n </TabsTrigger>\n <TabsTrigger value=\"execution\" className=\"gap-1.5\">\n <Icon icon=\"mdi:play-circle\" width={16} />\n {tr(\"fluidgrids.settings.page.executionTab\", \"Execution\")}\n </TabsTrigger>\n <TabsTrigger value=\"notifications\" className=\"gap-1.5\">\n <Icon icon=\"mdi:bell-outline\" width={16} />\n {tr(\"fluidgrids.settings.page.notificationsTab\", \"Notifications\")}\n </TabsTrigger>\n <TabsTrigger value=\"log-streaming\" className=\"gap-1.5\">\n <Icon icon=\"mdi:transit-connection-variant\" width={16} />\n {tr(\"fluidgrids.settings.page.logStreamingTab\", \"Log streaming\")}\n </TabsTrigger>\n <TabsTrigger value=\"api\" className=\"gap-1.5\">\n <Icon icon=\"mdi:api\" width={16} />\n {tr(\"fluidgrids.settings.page.apiTab\", \"API\")}\n </TabsTrigger>\n </TabsList>\n\n <TabsContent value=\"general\">\n <GeneralTab />\n </TabsContent>\n <TabsContent value=\"execution\">\n <ExecutionTab workflowKey={workflowKey} />\n </TabsContent>\n <TabsContent value=\"notifications\">\n <NotificationsTab />\n </TabsContent>\n <TabsContent value=\"log-streaming\">\n <LogStreamingTab />\n </TabsContent>\n <TabsContent value=\"api\">\n <ApiTab />\n </TabsContent>\n </Tabs>\n </div>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/modules/settings/pages/SettingsPage.tsx"],"names":[],"mappings":"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","file":"chunk-WXNDAONY.js","sourcesContent":["import { useState, useCallback, useEffect, useMemo } from \"react\";\nimport { useNavigate, useParams } from \"react-router\";\nimport { Icon } from \"@iconify/react\";\nimport { Button } from \"@burdenoff/fe-libs/button\";\nimport {\n Tabs,\n TabsList,\n TabsTrigger,\n TabsContent,\n Input,\n Label,\n Switch,\n Card,\n CardHeader,\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n TooltipProvider,\n Select,\n SelectTrigger,\n SelectValue,\n SelectContent,\n SelectItem,\n} from \"@burdenoff/fe-libs/ui\";\nimport { toast } from \"sonner\";\nimport { useTr } from \"../../../hooks/useTr\";\nimport { useFlowStore } from \"../../../builder/stores/flow-store\";\nimport { LogStreamingTab } from \"../../observability/components/LogStreamingTab\";\nimport {\n useWorkflowDefinitionQuery,\n useUpdateWorkflowDefinitionMutation,\n useWorkflowDefinitionsQuery,\n} from \"../../../generated/operations\";\n\n// ============================================================================\n// Per-workflow execution settings (BOFF-7512)\n// ============================================================================\n\n/**\n * Mirrors `IWorkflowConfig` on `wspace-workflow-svc`'s\n * `IWorkflowDefinitionJson.config` (a sibling of `data`, not nested inside\n * it), plus two fields the backend type doesn't have yet: `errorWorkflowKey`\n * and `dataSaving`. Per the ticket, \"if the underlying setting doesn't exist\n * yet, add just the schema field and wire the UI\" — `config` on\n * `definitionJson` is already a free-form JSON blob, so these new keys need\n * no backend schema change to round-trip; nothing downstream reads\n * `dataSaving.saveSuccessExecutions`/`saveFailedExecutions` yet (that's\n * execution-lifecycle work tracked separately), but the value now persists.\n */\ninterface WorkflowExecutionSettings {\n timeout?: number; // seconds\n maxParallelism?: number;\n onError?: \"stop\" | \"continue\" | \"retry\";\n /** Workflow key to run when this workflow's execution fails. */\n errorWorkflowKey?: string;\n dataSaving?: {\n saveSuccessExecutions?: boolean;\n saveFailedExecutions?: boolean;\n };\n}\n\nconst DEFAULT_EXECUTION_SETTINGS: Required<\n Pick<WorkflowExecutionSettings, \"timeout\" | \"maxParallelism\" | \"onError\">\n> = {\n timeout: 300,\n maxParallelism: 5,\n onError: \"stop\",\n};\n\n// ============================================================================\n// Constants\n// ============================================================================\n\nconst DEFAULT_SETTINGS = {\n general: {\n workspaceName: \"Default Workspace\",\n defaultWorkflowPrefix: \"wf\",\n autoSaveDrafts: true,\n },\n execution: {\n defaultTimeoutSeconds: 300,\n maxRetries: 3,\n retryDelaySeconds: 10,\n concurrentExecutionLimit: 5,\n },\n notifications: {\n emailOnSuccess: false,\n emailOnFailure: true,\n webhookOnSuccess: false,\n webhookOnFailure: true,\n },\n api: {\n gatewayUrl: \"/api/v1/workflows\",\n webhookUrlFormat: \"/api/v1/webhooks/workflow/{workflowKey}/trigger\",\n },\n};\n\n// ============================================================================\n// Sub-Components\n// ============================================================================\n\nfunction ReadOnlyBanner() {\n const tr = useTr();\n\n return (\n <div className=\"flex items-center gap-2 p-3 rounded-lg bg-amber-500/10 border border-amber-500/30 mb-6\">\n <Icon\n icon=\"mdi:information\"\n width={18}\n className=\"text-amber-400 shrink-0\"\n />\n <p className=\"text-sm text-amber-400\">\n {tr(\n \"fluidgrids.settings.readOnlyBanner.message\",\n \"Settings are managed at workspace level. Contact your workspace administrator to change these values.\",\n )}\n </p>\n </div>\n );\n}\n\nfunction CopyButton({ value, label }: { value: string; label: string }) {\n const tr = useTr();\n\n const handleCopy = useCallback(async () => {\n try {\n await navigator.clipboard.writeText(value);\n toast.success(\n `${label} ${tr(\"fluidgrids.settings.copyButton.copiedToast\", \"copied to clipboard\")}`,\n );\n } catch {\n toast.error(\n tr(\n \"fluidgrids.settings.copyButton.copyFailedToast\",\n \"Failed to copy to clipboard\",\n ),\n );\n }\n }, [value, label, tr]);\n\n return (\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n onClick={handleCopy}\n className=\"p-1.5 rounded hover:bg-background-tertiary text-text-secondary hover:text-text-primary transition-colors\"\n >\n <Icon icon=\"mdi:content-copy\" width={16} />\n </button>\n </TooltipTrigger>\n <TooltipContent>\n {tr(\"fluidgrids.settings.copyButton.copyTooltipPrefix\", \"Copy\")}{\" \"}\n {label}\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n );\n}\n\nfunction SettingRow({\n label,\n description,\n children,\n}: {\n label: string;\n description?: string;\n children: React.ReactNode;\n}) {\n return (\n <div className=\"flex flex-col sm:flex-row sm:items-center sm:justify-between gap-3 py-4\">\n <div className=\"flex-1 min-w-0\">\n <Label className=\"text-sm font-medium text-text-primary\">{label}</Label>\n {description && (\n <p className=\"text-xs text-text-secondary mt-0.5\">{description}</p>\n )}\n </div>\n <div className=\"shrink-0\">{children}</div>\n </div>\n );\n}\n\n// ============================================================================\n// Tab Content Components\n// ============================================================================\n\nfunction GeneralTab() {\n const tr = useTr();\n const settings = DEFAULT_SETTINGS.general;\n\n return (\n <div>\n <ReadOnlyBanner />\n <div className=\"divide-y divide-border-secondary\">\n <SettingRow\n label={tr(\n \"fluidgrids.settings.general.workspaceNameLabel\",\n \"Workspace Name\",\n )}\n description={tr(\n \"fluidgrids.settings.general.workspaceNameDescription\",\n \"The name of your workspace\",\n )}\n >\n <Input\n value={settings.workspaceName}\n readOnly\n className=\"w-[250px] bg-background-secondary border-border-secondary text-text-primary cursor-default\"\n />\n </SettingRow>\n <SettingRow\n label={tr(\n \"fluidgrids.settings.general.workflowPrefixLabel\",\n \"Default Workflow Prefix\",\n )}\n description={tr(\n \"fluidgrids.settings.general.workflowPrefixDescription\",\n \"Prefix used when generating new workflow keys\",\n )}\n >\n <Input\n value={settings.defaultWorkflowPrefix}\n readOnly\n className=\"w-[120px] bg-background-secondary border-border-secondary text-text-primary cursor-default\"\n />\n </SettingRow>\n <SettingRow\n label={tr(\n \"fluidgrids.settings.general.autoSaveDraftsLabel\",\n \"Auto-save Drafts\",\n )}\n description={tr(\n \"fluidgrids.settings.general.autoSaveDraftsDescription\",\n \"Automatically save draft workflows while editing\",\n )}\n >\n <Switch checked={settings.autoSaveDrafts} disabled />\n </SettingRow>\n </div>\n </div>\n );\n}\n\n/**\n * Editable, per-WORKFLOW execution settings (BOFF-7512) — replaces the old\n * global/read-only tab. Resolves the target workflow from (in order) an\n * explicit `workflowKey` prop, the `:id` route param, or the flow store's\n * currently-loaded workflow (set when the user arrived here from the\n * builder). When none of those resolve, falls back to the previous\n * read-only static display rather than a broken/blank editor.\n */\nfunction ExecutionTab({ workflowKey }: Readonly<{ workflowKey?: string }>) {\n const tr = useTr();\n\n const { data, loading, refetch } = useWorkflowDefinitionQuery({\n variables: { workflowKey },\n skip: !workflowKey,\n fetchPolicy: \"cache-and-network\",\n });\n const [updateWorkflowDefinition, { loading: saving }] =\n useUpdateWorkflowDefinitionMutation();\n\n // \"Error workflow\" picker — reuses the same list-workflows query the\n // history/list pages already use (`workflowDefinitions`), latest version\n // per key, excluding the workflow being edited (running itself as its own\n // error handler on every failure risks an infinite loop).\n const { data: otherWorkflowsData, loading: otherWorkflowsLoading } =\n useWorkflowDefinitionsQuery({\n variables: { input: { latestOnly: true, limit: 100 } },\n });\n const errorWorkflowOptions = (\n otherWorkflowsData?.workflowDefinitions?.items ?? []\n ).filter((w) => w.workflowKey !== workflowKey);\n\n const workflow = data?.workflowDefinition;\n const persistedConfig = useMemo(() => {\n const definitionJson = workflow?.definitionJson as\n Record<string, unknown> | undefined;\n const config = definitionJson?.config as\n WorkflowExecutionSettings | undefined;\n return config ?? {};\n }, [workflow?.definitionJson]);\n\n const [form, setForm] = useState<WorkflowExecutionSettings>(persistedConfig);\n // Re-seed the form whenever the fetched workflow (or its persisted config)\n // changes — e.g. on first load, or after switching workflows.\n useEffect(() => setForm(persistedConfig), [persistedConfig]);\n\n const handleSave = useCallback(async () => {\n if (!workflow?.id) return;\n try {\n const definitionJson = {\n ...(workflow.definitionJson as Record<string, unknown>),\n config: form,\n };\n await updateWorkflowDefinition({\n variables: { id: workflow.id, input: { definitionJson } },\n });\n toast.success(\n tr(\n \"fluidgrids.settings.execution.savedToast\",\n \"Execution settings saved\",\n ),\n );\n void refetch();\n } catch (err) {\n toast.error(\n tr(\n \"fluidgrids.settings.execution.saveFailedToast\",\n \"Failed to save settings\",\n ),\n { description: err instanceof Error ? err.message : undefined },\n );\n }\n }, [workflow, form, updateWorkflowDefinition, refetch, tr]);\n\n if (!workflowKey) {\n // No workflow context resolvable — keep the previous static display so\n // the page still renders something useful rather than an empty form.\n // NOT the workspace-level `ReadOnlyBanner` copy: this isn't a policy\n // restriction, just a missing route/store context, so it gets its own\n // message rather than implying \"contact your admin\".\n const settings = DEFAULT_SETTINGS.execution;\n return (\n <div>\n <div className=\"flex items-center gap-2 p-3 rounded-lg bg-amber-500/10 border border-amber-500/30 mb-6\">\n <Icon\n icon=\"mdi:information\"\n width={18}\n className=\"text-amber-400 shrink-0\"\n />\n <p className=\"text-sm text-amber-400\">\n {tr(\n \"fluidgrids.settings.execution.noWorkflowContextBanner\",\n \"No workflow selected — open Settings from a specific workflow to edit its execution settings.\",\n )}\n </p>\n </div>\n <div className=\"divide-y divide-border-secondary\">\n <SettingRow\n label={tr(\n \"fluidgrids.settings.execution.defaultTimeoutLabel\",\n \"Default Timeout\",\n )}\n description={tr(\n \"fluidgrids.settings.execution.noWorkflowContextDescription\",\n \"Open this page from a specific workflow to edit its execution settings.\",\n )}\n >\n <div className=\"flex items-center gap-2\">\n <Input\n value={settings.defaultTimeoutSeconds}\n readOnly\n className=\"w-[100px] bg-background-secondary border-border-secondary text-text-primary text-right cursor-default\"\n />\n <span className=\"text-xs text-text-secondary\">\n {tr(\n \"fluidgrids.settings.execution.defaultTimeoutUnit\",\n \"seconds\",\n )}\n </span>\n </div>\n </SettingRow>\n </div>\n </div>\n );\n }\n\n return (\n <div>\n <div className=\"divide-y divide-border-secondary\">\n <SettingRow\n label={tr(\n \"fluidgrids.settings.execution.defaultTimeoutLabel\",\n \"Timeout\",\n )}\n description={tr(\n \"fluidgrids.settings.execution.defaultTimeoutDescription\",\n \"Maximum time this workflow's execution can run (in seconds)\",\n )}\n >\n <div className=\"flex items-center gap-2\">\n <Input\n type=\"number\"\n min={1}\n value={form.timeout ?? DEFAULT_EXECUTION_SETTINGS.timeout}\n onChange={(e) =>\n setForm((f) => ({\n ...f,\n timeout: Math.max(1, parseInt(e.target.value, 10) || 1),\n }))\n }\n disabled={loading}\n className=\"w-[100px] text-right\"\n />\n <span className=\"text-xs text-text-secondary\">\n {tr(\n \"fluidgrids.settings.execution.defaultTimeoutUnit\",\n \"seconds\",\n )}\n </span>\n </div>\n </SettingRow>\n <SettingRow\n label={tr(\n \"fluidgrids.settings.execution.concurrencyLimitLabel\",\n \"Concurrency Limit\",\n )}\n description={tr(\n \"fluidgrids.settings.execution.concurrencyLimitDescription\",\n \"Maximum number of this workflow's executions running simultaneously\",\n )}\n >\n <Input\n type=\"number\"\n min={1}\n value={\n form.maxParallelism ?? DEFAULT_EXECUTION_SETTINGS.maxParallelism\n }\n onChange={(e) =>\n setForm((f) => ({\n ...f,\n maxParallelism: Math.max(1, parseInt(e.target.value, 10) || 1),\n }))\n }\n disabled={loading}\n className=\"w-[80px] text-right\"\n />\n </SettingRow>\n <SettingRow\n label={tr(\n \"fluidgrids.settings.execution.onErrorLabel\",\n \"On workflow error\",\n )}\n description={tr(\n \"fluidgrids.settings.execution.onErrorDescription\",\n \"What to do when this workflow's execution fails\",\n )}\n >\n <select\n value={form.onError ?? DEFAULT_EXECUTION_SETTINGS.onError}\n onChange={(e) =>\n setForm((f) => ({\n ...f,\n onError: e.target.value as WorkflowExecutionSettings[\"onError\"],\n }))\n }\n disabled={loading}\n className=\"w-[160px] rounded-md border border-border-secondary bg-background-secondary px-2 py-1.5 text-sm text-text-primary\"\n >\n <option value=\"stop\">\n {tr(\"fluidgrids.settings.execution.onErrorStop\", \"Stop\")}\n </option>\n <option value=\"continue\">\n {tr(\"fluidgrids.settings.execution.onErrorContinue\", \"Continue\")}\n </option>\n <option value=\"retry\">\n {tr(\"fluidgrids.settings.execution.onErrorRetry\", \"Retry\")}\n </option>\n </select>\n </SettingRow>\n <SettingRow\n label={tr(\n \"fluidgrids.settings.execution.errorWorkflowLabel\",\n \"Error workflow\",\n )}\n description={tr(\n \"fluidgrids.settings.execution.errorWorkflowDescription\",\n \"Workflow key to run when this workflow's execution fails (optional)\",\n )}\n >\n <Select\n value={form.errorWorkflowKey ?? \"__none__\"}\n onValueChange={(val) =>\n setForm((f) => ({\n ...f,\n errorWorkflowKey: val === \"__none__\" ? undefined : val,\n }))\n }\n disabled={loading || otherWorkflowsLoading}\n >\n <SelectTrigger className=\"w-[220px] bg-background-secondary border-border-secondary\">\n <SelectValue\n placeholder={tr(\n \"fluidgrids.settings.execution.errorWorkflowPlaceholder\",\n \"None\",\n )}\n />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"__none__\">\n {tr(\"fluidgrids.settings.execution.errorWorkflowNone\", \"None\")}\n </SelectItem>\n {errorWorkflowOptions.map((w) => (\n <SelectItem key={w.workflowKey} value={w.workflowKey}>\n {w.name}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </SettingRow>\n <SettingRow\n label={tr(\n \"fluidgrids.settings.execution.saveSuccessLabel\",\n \"Save successful execution data\",\n )}\n >\n <Switch\n checked={form.dataSaving?.saveSuccessExecutions ?? true}\n onCheckedChange={(checked) =>\n setForm((f) => ({\n ...f,\n dataSaving: { ...f.dataSaving, saveSuccessExecutions: checked },\n }))\n }\n disabled={loading}\n />\n </SettingRow>\n <SettingRow\n label={tr(\n \"fluidgrids.settings.execution.saveFailedLabel\",\n \"Save failed execution data\",\n )}\n >\n <Switch\n checked={form.dataSaving?.saveFailedExecutions ?? true}\n onCheckedChange={(checked) =>\n setForm((f) => ({\n ...f,\n dataSaving: { ...f.dataSaving, saveFailedExecutions: checked },\n }))\n }\n disabled={loading}\n />\n </SettingRow>\n </div>\n <div className=\"mt-4 flex justify-end\">\n <Button onClick={() => void handleSave()} disabled={loading || saving}>\n {saving\n ? tr(\"fluidgrids.settings.execution.saving\", \"Saving…\")\n : tr(\"fluidgrids.settings.execution.save\", \"Save\")}\n </Button>\n </div>\n </div>\n );\n}\n\nfunction NotificationsTab() {\n const tr = useTr();\n const settings = DEFAULT_SETTINGS.notifications;\n\n return (\n <div>\n <ReadOnlyBanner />\n\n {/* Email Notifications */}\n <div className=\"mb-6\">\n <h3 className=\"text-sm font-semibold text-text-primary flex items-center gap-2 mb-3\">\n <Icon icon=\"mdi:email-outline\" width={18} />\n {tr(\n \"fluidgrids.settings.notifications.emailSectionTitle\",\n \"Email Notifications\",\n )}\n </h3>\n <div className=\"divide-y divide-border-secondary rounded-lg border border-border-secondary bg-background-secondary p-1\">\n <SettingRow\n label={tr(\n \"fluidgrids.settings.notifications.emailOnSuccessLabel\",\n \"On Success\",\n )}\n description={tr(\n \"fluidgrids.settings.notifications.emailOnSuccessDescription\",\n \"Send email when a workflow execution completes successfully\",\n )}\n >\n <Switch checked={settings.emailOnSuccess} disabled />\n </SettingRow>\n <SettingRow\n label={tr(\n \"fluidgrids.settings.notifications.emailOnFailureLabel\",\n \"On Failure\",\n )}\n description={tr(\n \"fluidgrids.settings.notifications.emailOnFailureDescription\",\n \"Send email when a workflow execution fails\",\n )}\n >\n <Switch checked={settings.emailOnFailure} disabled />\n </SettingRow>\n </div>\n </div>\n\n {/* Webhook Notifications */}\n <div>\n <h3 className=\"text-sm font-semibold text-text-primary flex items-center gap-2 mb-3\">\n <Icon icon=\"mdi:webhook\" width={18} />\n {tr(\n \"fluidgrids.settings.notifications.webhookSectionTitle\",\n \"Webhook Notifications\",\n )}\n </h3>\n <div className=\"divide-y divide-border-secondary rounded-lg border border-border-secondary bg-background-secondary p-1\">\n <SettingRow\n label={tr(\n \"fluidgrids.settings.notifications.webhookOnSuccessLabel\",\n \"On Success\",\n )}\n description={tr(\n \"fluidgrids.settings.notifications.webhookOnSuccessDescription\",\n \"Send webhook when a workflow execution completes successfully\",\n )}\n >\n <Switch checked={settings.webhookOnSuccess} disabled />\n </SettingRow>\n <SettingRow\n label={tr(\n \"fluidgrids.settings.notifications.webhookOnFailureLabel\",\n \"On Failure\",\n )}\n description={tr(\n \"fluidgrids.settings.notifications.webhookOnFailureDescription\",\n \"Send webhook when a workflow execution fails\",\n )}\n >\n <Switch checked={settings.webhookOnFailure} disabled />\n </SettingRow>\n </div>\n </div>\n </div>\n );\n}\n\nfunction ApiTab() {\n const tr = useTr();\n const settings = DEFAULT_SETTINGS.api;\n\n return (\n <div>\n <div className=\"space-y-4\">\n {/* API Gateway URL */}\n <Card className=\"border border-border-secondary bg-background-secondary\">\n <CardHeader className=\"pb-3\">\n <div className=\"flex items-center gap-2 mb-2\">\n <Icon icon=\"mdi:api\" width={20} className=\"text-text-secondary\" />\n <h3 className=\"text-sm font-semibold text-text-primary\">\n {tr(\n \"fluidgrids.settings.api.gatewayUrlTitle\",\n \"API Gateway URL\",\n )}\n </h3>\n </div>\n <p className=\"text-xs text-text-secondary mb-3\">\n {tr(\n \"fluidgrids.settings.api.gatewayUrlDescription\",\n \"Base URL for workflow API operations. Use this to trigger, list, and manage workflows programmatically.\",\n )}\n </p>\n <div className=\"flex items-center gap-2 rounded-lg bg-background-tertiary px-3 py-2 border border-border-secondary\">\n <code className=\"text-sm text-text-primary flex-1 truncate\">\n {settings.gatewayUrl}\n </code>\n <CopyButton\n value={settings.gatewayUrl}\n label={tr(\n \"fluidgrids.settings.api.gatewayUrlCopyLabel\",\n \"API Gateway URL\",\n )}\n />\n </div>\n </CardHeader>\n </Card>\n\n {/* Webhook URL */}\n <Card className=\"border border-border-secondary bg-background-secondary\">\n <CardHeader className=\"pb-3\">\n <div className=\"flex items-center gap-2 mb-2\">\n <Icon\n icon=\"mdi:webhook\"\n width={20}\n className=\"text-text-secondary\"\n />\n <h3 className=\"text-sm font-semibold text-text-primary\">\n {tr(\n \"fluidgrids.settings.api.webhookUrlTitle\",\n \"Webhook URL Format\",\n )}\n </h3>\n </div>\n <p className=\"text-xs text-text-secondary mb-3\">\n {tr(\n \"fluidgrids.settings.api.webhookUrlDescriptionPrefix\",\n \"URL format for triggering workflows via webhook. Replace\",\n )}{\" \"}\n <code className=\"text-text-primary\">{\"{workflowKey}\"}</code>{\" \"}\n {tr(\n \"fluidgrids.settings.api.webhookUrlDescriptionSuffix\",\n \"with the actual workflow key.\",\n )}\n </p>\n <div className=\"flex items-center gap-2 rounded-lg bg-background-tertiary px-3 py-2 border border-border-secondary\">\n <code className=\"text-sm text-text-primary flex-1 truncate\">\n {settings.webhookUrlFormat}\n </code>\n <CopyButton\n value={settings.webhookUrlFormat}\n label={tr(\n \"fluidgrids.settings.api.webhookUrlCopyLabel\",\n \"Webhook URL\",\n )}\n />\n </div>\n </CardHeader>\n </Card>\n\n {/* Example cURL */}\n <Card className=\"border border-border-secondary bg-background-secondary\">\n <CardHeader className=\"pb-3\">\n <div className=\"flex items-center gap-2 mb-2\">\n <Icon\n icon=\"mdi:console\"\n width={20}\n className=\"text-text-secondary\"\n />\n <h3 className=\"text-sm font-semibold text-text-primary\">\n {tr(\n \"fluidgrids.settings.api.curlExampleTitle\",\n \"Example: Trigger via cURL\",\n )}\n </h3>\n </div>\n <div className=\"relative rounded-lg bg-background-tertiary px-3 py-2 border border-border-secondary\">\n <pre className=\"text-xs text-text-primary overflow-x-auto whitespace-pre-wrap\">\n {`curl -X POST \"${settings.webhookUrlFormat}\" \\\\\n -H \"Content-Type: application/json\" \\\\\n -H \"Authorization: Bearer <token>\" \\\\\n -d '{\"input\": {}}'`}\n </pre>\n <div className=\"absolute top-2 right-2\">\n <CopyButton\n value={`curl -X POST \"${settings.webhookUrlFormat}\" \\\\\\n -H \"Content-Type: application/json\" \\\\\\n -H \"Authorization: Bearer <token>\" \\\\\\n -d '{\"input\": {}}'`}\n label={tr(\n \"fluidgrids.settings.api.curlCopyLabel\",\n \"cURL command\",\n )}\n />\n </div>\n </div>\n </CardHeader>\n </Card>\n </div>\n </div>\n );\n}\n\n// ============================================================================\n// Main Component\n// ============================================================================\n\nexport interface SettingsPageProps {\n /**\n * Explicit workflow key to scope the Execution tab to (BOFF-7512). When\n * omitted, falls back to the `:id`/`:workflowKey` route param (for hosts\n * that mount this page under a per-workflow path), then to the workflow\n * currently loaded in the builder's flow store (for hosts that navigate\n * here from the builder without a route param). If none resolve, the\n * Execution tab falls back to its previous static display.\n */\n workflowKey?: string;\n}\n\nexport function SettingsPage({\n workflowKey: workflowKeyProp,\n}: SettingsPageProps = {}) {\n const tr = useTr();\n const navigate = useNavigate();\n const routeParams = useParams<{ id?: string; workflowKey?: string }>();\n const activeWorkflowKey = useFlowStore((s) => s.workflow.workflowKey);\n const workflowKey =\n workflowKeyProp ||\n routeParams.workflowKey ||\n routeParams.id ||\n activeWorkflowKey ||\n undefined;\n const [activeTab, setActiveTab] = useState(\"general\");\n\n return (\n <div className=\"p-4 sm:p-6 bg-background-primary min-h-screen\">\n {/* Header */}\n <div className=\"flex flex-col sm:flex-row sm:items-center sm:justify-between gap-4 mb-6\">\n <div>\n <h1 className=\"text-2xl sm:text-3xl font-bold text-text-primary\">\n {tr(\"fluidgrids.settings.page.title\", \"Settings\")}\n </h1>\n <p className=\"text-text-secondary mt-1\">\n {tr(\n \"fluidgrids.settings.page.subtitle\",\n \"Configure workflow execution and notification preferences\",\n )}\n </p>\n </div>\n <Button variant=\"outline\" onClick={() => navigate(\"../list\")}>\n <Icon icon=\"mdi:arrow-left\" className=\"mr-2\" width={16} />\n {tr(\"fluidgrids.settings.page.backToWorkflows\", \"Back to Workflows\")}\n </Button>\n </div>\n\n {/* Tabs */}\n <Tabs value={activeTab} onValueChange={setActiveTab} className=\"w-full\">\n <TabsList className=\"bg-background-secondary border border-border-secondary mb-6\">\n <TabsTrigger value=\"general\" className=\"gap-1.5\">\n <Icon icon=\"mdi:cog\" width={16} />\n {tr(\"fluidgrids.settings.page.generalTab\", \"General\")}\n </TabsTrigger>\n <TabsTrigger value=\"execution\" className=\"gap-1.5\">\n <Icon icon=\"mdi:play-circle\" width={16} />\n {tr(\"fluidgrids.settings.page.executionTab\", \"Execution\")}\n </TabsTrigger>\n <TabsTrigger value=\"notifications\" className=\"gap-1.5\">\n <Icon icon=\"mdi:bell-outline\" width={16} />\n {tr(\"fluidgrids.settings.page.notificationsTab\", \"Notifications\")}\n </TabsTrigger>\n <TabsTrigger value=\"log-streaming\" className=\"gap-1.5\">\n <Icon icon=\"mdi:transit-connection-variant\" width={16} />\n {tr(\"fluidgrids.settings.page.logStreamingTab\", \"Log streaming\")}\n </TabsTrigger>\n <TabsTrigger value=\"api\" className=\"gap-1.5\">\n <Icon icon=\"mdi:api\" width={16} />\n {tr(\"fluidgrids.settings.page.apiTab\", \"API\")}\n </TabsTrigger>\n </TabsList>\n\n <TabsContent value=\"general\">\n <GeneralTab />\n </TabsContent>\n <TabsContent value=\"execution\">\n <ExecutionTab workflowKey={workflowKey} />\n </TabsContent>\n <TabsContent value=\"notifications\">\n <NotificationsTab />\n </TabsContent>\n <TabsContent value=\"log-streaming\">\n <LogStreamingTab />\n </TabsContent>\n <TabsContent value=\"api\">\n <ApiTab />\n </TabsContent>\n </Tabs>\n </div>\n );\n}\n"]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { NEW_WORKFLOW_NAV } from './chunk-KGD6CRSA.js';
|
|
2
2
|
import { QuotaExhaustedDialog } from './chunk-AANIWER2.js';
|
|
3
3
|
import { SdkPermissionButton, FLUIDGRIDS_PERMISSIONS, SdkPermissionGate } from './chunk-W23ZXNKU.js';
|
|
4
|
-
import { useWorkflowDefinitions, useLazyWorkflowDefinition, useImportWorkflow, useDuplicateWorkflow, useDeleteWorkflow } from './chunk-
|
|
4
|
+
import { useWorkflowDefinitions, useLazyWorkflowDefinition, useImportWorkflow, useDuplicateWorkflow, useDeleteWorkflow } from './chunk-2C6CUHM3.js';
|
|
5
5
|
import { useFlowStore } from './chunk-3B5YEXSW.js';
|
|
6
6
|
import { useTr } from './chunk-7YWBH2A5.js';
|
|
7
7
|
import { useState, useMemo } from 'react';
|
|
@@ -1251,5 +1251,5 @@ function WorkflowsList() {
|
|
|
1251
1251
|
}
|
|
1252
1252
|
|
|
1253
1253
|
export { WorkflowsList };
|
|
1254
|
-
//# sourceMappingURL=chunk-
|
|
1255
|
-
//# sourceMappingURL=chunk-
|
|
1254
|
+
//# sourceMappingURL=chunk-WYQ4OBES.js.map
|
|
1255
|
+
//# sourceMappingURL=chunk-WYQ4OBES.js.map
|