diff --git a/pkg/services/navtree/navtreeimpl/navtree.go b/pkg/services/navtree/navtreeimpl/navtree.go index 5b9eb985bd8..76c1f7686fd 100644 --- a/pkg/services/navtree/navtreeimpl/navtree.go +++ b/pkg/services/navtree/navtreeimpl/navtree.go @@ -574,6 +574,15 @@ func (s *ServiceImpl) buildDataConnectionsNavLink(c *contextmodel.ReqContext) *n Url: baseUrl + "/datasources", Children: []*navtree.NavLink{}, }) + + // Stacks + children = append(children, &navtree.NavLink{ + Id: "connections-stacks", + Text: "Stacks", + SubTitle: "Manage data source stacks for different environments", + Url: baseUrl + "/stacks", + Children: []*navtree.NavLink{}, + }) } if len(children) > 0 { diff --git a/public/app/features/connections/pages/DataSourceStacksPage.tsx b/public/app/features/connections/pages/DataSourceStacksPage.tsx index 65144a8b511..1e9b7b79d9e 100644 --- a/public/app/features/connections/pages/DataSourceStacksPage.tsx +++ b/public/app/features/connections/pages/DataSourceStacksPage.tsx @@ -108,7 +108,7 @@ export function DataSourceStacksPage() { }; return ( - + + diff --git a/public/app/features/connections/pages/NewStackPage.tsx b/public/app/features/connections/pages/NewStackPage.tsx index d264a450b23..82df2b3689e 100644 --- a/public/app/features/connections/pages/NewStackPage.tsx +++ b/public/app/features/connections/pages/NewStackPage.tsx @@ -4,7 +4,7 @@ import { StackForm } from 'app/features/datasources/components/new-stack-form/St export function NewStackPage() { return ( (datasourceStacksGVR); + export const StackForm = ({ existing }: Props) => { const styles = useStyles2(getStyles); const notifyApp = useAppNotification(); + const navigate = useNavigate(); + + const isEditing = !!existing; const initialValues: StackFormValues = useMemo(() => { if (existing) { @@ -47,10 +63,32 @@ export const StackForm = ({ existing }: Props) => { } = formAPI; const submit = async (values: StackFormValues): Promise => { - const payload = prepareCreateStackPayload(values); - console.log('Form submitted with payload:', payload); - // TODO: Call API to save the stack using payload - notifyApp.success('Stack saved successfully!'); + const spec = prepareCreateStackPayload(values); + + try { + if (isEditing) { + // Update existing stack + const existingStack = await datasourceStacksClient.get(values.name); + await datasourceStacksClient.update({ + ...existingStack, + spec, + }); + notifyApp.success('Stack updated successfully!'); + } else { + // Create new stack + await datasourceStacksClient.create({ + metadata: { name: values.name }, + spec, + }); + notifyApp.success('Stack created successfully!'); + } + + // Navigate to stacks list page + navigate(ROUTES.Stacks); + } catch (error) { + const message = error instanceof Error ? error.message : 'An unknown error occurred'; + notifyApp.error(`Failed to save stack: ${message}`); + } }; const onInvalid: SubmitErrorHandler = () => {