Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add a page dedicated to examples in the Foundation SDK docs #636

Merged
merged 1 commit into from
Nov 8, 2024

Conversation

K-Phoen
Copy link
Member

@K-Phoen K-Phoen commented Nov 7, 2024

To make these examples discoverable from the Foundation SDK website as well.

@K-Phoen K-Phoen self-assigned this Nov 7, 2024
@K-Phoen K-Phoen requested a review from a team as a code owner November 7, 2024 12:13
Copy link

github-actions bot commented Nov 7, 2024

Note: in addition to the changes introduced by this PR, the diff includes unreleased changes living in main.

🔎 Changes to grafana-foundation-sdk@next+cog-v0.0.x

diff --git a/.github/workflows/php-ci.yaml b/.github/workflows/php-ci.yaml
index 7c848ccc..4a5cb3af 100644
--- a/.github/workflows/php-ci.yaml
+++ b/.github/workflows/php-ci.yaml
@@ -31,7 +31,7 @@ jobs:
         run: composer install
 
       - name: Lint generated PHP code with phpstan
-        run: phpstan analyze --memory-limit 256M -c .config/ci/php/phpstan.neon
+        run: phpstan analyze --memory-limit 512M -c .config/ci/php/phpstan.neon
 
       - name: Lint generated PHP code with psalm
         run: psalm -c .config/ci/php/psalm.xml php
diff --git a/go/annotationslist/panel_builder_gen.go b/go/annotationslist/panel_builder_gen.go
index c44b6709..d496492e 100644
--- a/go/annotationslist/panel_builder_gen.go
+++ b/go/annotationslist/panel_builder_gen.go
@@ -355,6 +355,25 @@ func (builder *PanelBuilder) ColorScheme(color cog.Builder[dashboard.FieldColor]
 	return builder
 }
 
+// The behavior when clicking on a result
+func (builder *PanelBuilder) DataLinks(links []cog.Builder[dashboard.DashboardLink]) *PanelBuilder {
+	if builder.internal.FieldConfig == nil {
+		builder.internal.FieldConfig = &dashboard.FieldConfigSource{}
+	}
+	linksResources := make([]dashboard.DashboardLink, 0, len(links))
+	for _, r1 := range links {
+		linksDepth1, err := r1.Build()
+		if err != nil {
+			builder.errors["fieldConfig.defaults.links"] = err.(cog.BuildErrors)
+			return builder
+		}
+		linksResources = append(linksResources, linksDepth1)
+	}
+	builder.internal.FieldConfig.Defaults.Links = linksResources
+
+	return builder
+}
+
 // Alternative to empty string
 func (builder *PanelBuilder) NoValue(noValue string) *PanelBuilder {
 	if builder.internal.FieldConfig == nil {
diff --git a/go/annotationslist/panel_converter_gen.go b/go/annotationslist/panel_converter_gen.go
index 5a28faa4..6a073a9e 100644
--- a/go/annotationslist/panel_converter_gen.go
+++ b/go/annotationslist/panel_converter_gen.go
@@ -395,6 +395,23 @@ func PanelConverter(input dashboard.Panel) string {
 		calls = append(calls, buffer.String())
 		buffer.Reset()
 
+	}
+	if input.FieldConfig != nil && input.FieldConfig.Defaults.Links != nil && len(input.FieldConfig.Defaults.Links) >= 1 {
+
+		buffer.WriteString(`DataLinks(`)
+		tmparg0 := []string{}
+		for _, arg1 := range input.FieldConfig.Defaults.Links {
+			tmplinksarg1 := dashboard.DashboardLinkConverter(arg1)
+			tmparg0 = append(tmparg0, tmplinksarg1)
+		}
+		arg0 := "[]cog.Builder[dashboard.DashboardLink]{" + strings.Join(tmparg0, ",\n") + "}"
+		buffer.WriteString(arg0)
+
+		buffer.WriteString(")")
+
+		calls = append(calls, buffer.String())
+		buffer.Reset()
+
 	}
 	if input.FieldConfig != nil && input.FieldConfig.Defaults.NoValue != nil && *input.FieldConfig.Defaults.NoValue != "" {
 
diff --git a/go/barchart/panel_builder_gen.go b/go/barchart/panel_builder_gen.go
index a5b4556c..5bd8821e 100644
--- a/go/barchart/panel_builder_gen.go
+++ b/go/barchart/panel_builder_gen.go
@@ -356,6 +356,25 @@ func (builder *PanelBuilder) ColorScheme(color cog.Builder[dashboard.FieldColor]
 	return builder
 }
 
+// The behavior when clicking on a result
+func (builder *PanelBuilder) DataLinks(links []cog.Builder[dashboard.DashboardLink]) *PanelBuilder {
+	if builder.internal.FieldConfig == nil {
+		builder.internal.FieldConfig = &dashboard.FieldConfigSource{}
+	}
+	linksResources := make([]dashboard.DashboardLink, 0, len(links))
+	for _, r1 := range links {
+		linksDepth1, err := r1.Build()
+		if err != nil {
+			builder.errors["fieldConfig.defaults.links"] = err.(cog.BuildErrors)
+			return builder
+		}
+		linksResources = append(linksResources, linksDepth1)
+	}
+	builder.internal.FieldConfig.Defaults.Links = linksResources
+
+	return builder
+}
+
 // Alternative to empty string
 func (builder *PanelBuilder) NoValue(noValue string) *PanelBuilder {
 	if builder.internal.FieldConfig == nil {
diff --git a/go/barchart/panel_converter_gen.go b/go/barchart/panel_converter_gen.go
index d920d99b..b197a2ca 100644
--- a/go/barchart/panel_converter_gen.go
+++ b/go/barchart/panel_converter_gen.go
@@ -396,6 +396,23 @@ func PanelConverter(input dashboard.Panel) string {
 		calls = append(calls, buffer.String())
 		buffer.Reset()
 
+	}
+	if input.FieldConfig != nil && input.FieldConfig.Defaults.Links != nil && len(input.FieldConfig.Defaults.Links) >= 1 {
+
+		buffer.WriteString(`DataLinks(`)
+		tmparg0 := []string{}
+		for _, arg1 := range input.FieldConfig.Defaults.Links {
+			tmplinksarg1 := dashboard.DashboardLinkConverter(arg1)
+			tmparg0 = append(tmparg0, tmplinksarg1)
+		}
+		arg0 := "[]cog.Builder[dashboard.DashboardLink]{" + strings.Join(tmparg0, ",\n") + "}"
+		buffer.WriteString(arg0)
+
+		buffer.WriteString(")")
+
+		calls = append(calls, buffer.String())
+		buffer.Reset()
+
 	}
 	if input.FieldConfig != nil && input.FieldConfig.Defaults.NoValue != nil && *input.FieldConfig.Defaults.NoValue != "" {
 
diff --git a/go/bargauge/panel_builder_gen.go b/go/bargauge/panel_builder_gen.go
index 9c00f307..b48633b5 100644
--- a/go/bargauge/panel_builder_gen.go
+++ b/go/bargauge/panel_builder_gen.go
@@ -356,6 +356,25 @@ func (builder *PanelBuilder) ColorScheme(color cog.Builder[dashboard.FieldColor]
 	return builder
 }
 
+// The behavior when clicking on a result
+func (builder *PanelBuilder) DataLinks(links []cog.Builder[dashboard.DashboardLink]) *PanelBuilder {
+	if builder.internal.FieldConfig == nil {
+		builder.internal.FieldConfig = &dashboard.FieldConfigSource{}
+	}
+	linksResources := make([]dashboard.DashboardLink, 0, len(links))
+	for _, r1 := range links {
+		linksDepth1, err := r1.Build()
+		if err != nil {
+			builder.errors["fieldConfig.defaults.links"] = err.(cog.BuildErrors)
+			return builder
+		}
+		linksResources = append(linksResources, linksDepth1)
+	}
+	builder.internal.FieldConfig.Defaults.Links = linksResources
+
+	return builder
+}
+
 // Alternative to empty string
 func (builder *PanelBuilder) NoValue(noValue string) *PanelBuilder {
 	if builder.internal.FieldConfig == nil {
diff --git a/go/bargauge/panel_converter_gen.go b/go/bargauge/panel_converter_gen.go
index 80848999..9fa4e6cf 100644
--- a/go/bargauge/panel_converter_gen.go
+++ b/go/bargauge/panel_converter_gen.go
@@ -396,6 +396,23 @@ func PanelConverter(input dashboard.Panel) string {
 		calls = append(calls, buffer.String())
 		buffer.Reset()
 
+	}
+	if input.FieldConfig != nil && input.FieldConfig.Defaults.Links != nil && len(input.FieldConfig.Defaults.Links) >= 1 {
+
+		buffer.WriteString(`DataLinks(`)
+		tmparg0 := []string{}
+		for _, arg1 := range input.FieldConfig.Defaults.Links {
+			tmplinksarg1 := dashboard.DashboardLinkConverter(arg1)
+			tmparg0 = append(tmparg0, tmplinksarg1)
+		}
+		arg0 := "[]cog.Builder[dashboard.DashboardLink]{" + strings.Join(tmparg0, ",\n") + "}"
+		buffer.WriteString(arg0)
+
+		buffer.WriteString(")")
+
+		calls = append(calls, buffer.String())
+		buffer.Reset()
+
 	}
 	if input.FieldConfig != nil && input.FieldConfig.Defaults.NoValue != nil && *input.FieldConfig.Defaults.NoValue != "" {
 
diff --git a/go/candlestick/panel_builder_gen.go b/go/candlestick/panel_builder_gen.go
index af4bc6ba..1fe582e4 100644
--- a/go/candlestick/panel_builder_gen.go
+++ b/go/candlestick/panel_builder_gen.go
@@ -356,6 +356,25 @@ func (builder *PanelBuilder) ColorScheme(color cog.Builder[dashboard.FieldColor]
 	return builder
 }
 
+// The behavior when clicking on a result
+func (builder *PanelBuilder) DataLinks(links []cog.Builder[dashboard.DashboardLink]) *PanelBuilder {
+	if builder.internal.FieldConfig == nil {
+		builder.internal.FieldConfig = &dashboard.FieldConfigSource{}
+	}
+	linksResources := make([]dashboard.DashboardLink, 0, len(links))
+	for _, r1 := range links {
+		linksDepth1, err := r1.Build()
+		if err != nil {
+			builder.errors["fieldConfig.defaults.links"] = err.(cog.BuildErrors)
+			return builder
+		}
+		linksResources = append(linksResources, linksDepth1)
+	}
+	builder.internal.FieldConfig.Defaults.Links = linksResources
+
+	return builder
+}
+
 // Alternative to empty string
 func (builder *PanelBuilder) NoValue(noValue string) *PanelBuilder {
 	if builder.internal.FieldConfig == nil {
diff --git a/go/candlestick/panel_converter_gen.go b/go/candlestick/panel_converter_gen.go
index fbb875be..2f5e10fe 100644
--- a/go/candlestick/panel_converter_gen.go
+++ b/go/candlestick/panel_converter_gen.go
@@ -396,6 +396,23 @@ func PanelConverter(input dashboard.Panel) string {
 		calls = append(calls, buffer.String())
 		buffer.Reset()
 
+	}
+	if input.FieldConfig != nil && input.FieldConfig.Defaults.Links != nil && len(input.FieldConfig.Defaults.Links) >= 1 {
+
+		buffer.WriteString(`DataLinks(`)
+		tmparg0 := []string{}
+		for _, arg1 := range input.FieldConfig.Defaults.Links {
+			tmplinksarg1 := dashboard.DashboardLinkConverter(arg1)
+			tmparg0 = append(tmparg0, tmplinksarg1)
+		}
+		arg0 := "[]cog.Builder[dashboard.DashboardLink]{" + strings.Join(tmparg0, ",\n") + "}"
+		buffer.WriteString(arg0)
+
+		buffer.WriteString(")")
+
+		calls = append(calls, buffer.String())
+		buffer.Reset()
+
 	}
 	if input.FieldConfig != nil && input.FieldConfig.Defaults.NoValue != nil && *input.FieldConfig.Defaults.NoValue != "" {
 
diff --git a/go/canvas/panel_builder_gen.go b/go/canvas/panel_builder_gen.go
index 5e675476..4dbaeb6f 100644
--- a/go/canvas/panel_builder_gen.go
+++ b/go/canvas/panel_builder_gen.go
@@ -355,6 +355,25 @@ func (builder *PanelBuilder) ColorScheme(color cog.Builder[dashboard.FieldColor]
 	return builder
 }
 
+// The behavior when clicking on a result
+func (builder *PanelBuilder) DataLinks(links []cog.Builder[dashboard.DashboardLink]) *PanelBuilder {
+	if builder.internal.FieldConfig == nil {
+		builder.internal.FieldConfig = &dashboard.FieldConfigSource{}
+	}
+	linksResources := make([]dashboard.DashboardLink, 0, len(links))
+	for _, r1 := range links {
+		linksDepth1, err := r1.Build()
+		if err != nil {
+			builder.errors["fieldConfig.defaults.links"] = err.(cog.BuildErrors)
+			return builder
+		}
+		linksResources = append(linksResources, linksDepth1)
+	}
+	builder.internal.FieldConfig.Defaults.Links = linksResources
+
+	return builder
+}
+
 // Alternative to empty string
 func (builder *PanelBuilder) NoValue(noValue string) *PanelBuilder {
 	if builder.internal.FieldConfig == nil {
diff --git a/go/canvas/panel_converter_gen.go b/go/canvas/panel_converter_gen.go
index e2043b6c..e520ca21 100644
--- a/go/canvas/panel_converter_gen.go
+++ b/go/canvas/panel_converter_gen.go
@@ -395,6 +395,23 @@ func PanelConverter(input dashboard.Panel) string {
 		calls = append(calls, buffer.String())
 		buffer.Reset()
 
+	}
+	if input.FieldConfig != nil && input.FieldConfig.Defaults.Links != nil && len(input.FieldConfig.Defaults.Links) >= 1 {
+
+		buffer.WriteString(`DataLinks(`)
+		tmparg0 := []string{}
+		for _, arg1 := range input.FieldConfig.Defaults.Links {
+			tmplinksarg1 := dashboard.DashboardLinkConverter(arg1)
+			tmparg0 = append(tmparg0, tmplinksarg1)
+		}
+		arg0 := "[]cog.Builder[dashboard.DashboardLink]{" + strings.Join(tmparg0, ",\n") + "}"
+		buffer.WriteString(arg0)
+
+		buffer.WriteString(")")
+
+		calls = append(calls, buffer.String())
+		buffer.Reset()
+
 	}
 	if input.FieldConfig != nil && input.FieldConfig.Defaults.NoValue != nil && *input.FieldConfig.Defaults.NoValue != "" {
 
diff --git a/go/dashboard/panel_builder_gen.go b/go/dashboard/panel_builder_gen.go
index 0d0d8e3a..5670885a 100644
--- a/go/dashboard/panel_builder_gen.go
+++ b/go/dashboard/panel_builder_gen.go
@@ -360,6 +360,25 @@ func (builder *PanelBuilder) ColorScheme(color cog.Builder[FieldColor]) *PanelBu
 	return builder
 }
 
+// The behavior when clicking on a result
+func (builder *PanelBuilder) DataLinks(links []cog.Builder[DashboardLink]) *PanelBuilder {
+	if builder.internal.FieldConfig == nil {
+		builder.internal.FieldConfig = &FieldConfigSource{}
+	}
+	linksResources := make([]DashboardLink, 0, len(links))
+	for _, r1 := range links {
+		linksDepth1, err := r1.Build()
+		if err != nil {
+			builder.errors["fieldConfig.defaults.links"] = err.(cog.BuildErrors)
+			return builder
+		}
+		linksResources = append(linksResources, linksDepth1)
+	}
+	builder.internal.FieldConfig.Defaults.Links = linksResources
+
+	return builder
+}
+
 // Alternative to empty string
 func (builder *PanelBuilder) NoValue(noValue string) *PanelBuilder {
 	if builder.internal.FieldConfig == nil {
diff --git a/go/dashboard/panel_converter_gen.go b/go/dashboard/panel_converter_gen.go
index 7fc2a473..05817da1 100644
--- a/go/dashboard/panel_converter_gen.go
+++ b/go/dashboard/panel_converter_gen.go
@@ -406,6 +406,23 @@ func PanelConverter(input Panel) string {
 		calls = append(calls, buffer.String())
 		buffer.Reset()
 
+	}
+	if input.FieldConfig != nil && input.FieldConfig.Defaults.Links != nil && len(input.FieldConfig.Defaults.Links) >= 1 {
+
+		buffer.WriteString(`DataLinks(`)
+		tmparg0 := []string{}
+		for _, arg1 := range input.FieldConfig.Defaults.Links {
+			tmplinksarg1 := DashboardLinkConverter(arg1)
+			tmparg0 = append(tmparg0, tmplinksarg1)
+		}
+		arg0 := "[]cog.Builder[dashboard.DashboardLink]{" + strings.Join(tmparg0, ",\n") + "}"
+		buffer.WriteString(arg0)
+
+		buffer.WriteString(")")
+
+		calls = append(calls, buffer.String())
+		buffer.Reset()
+
 	}
 	if input.FieldConfig != nil && input.FieldConfig.Defaults.NoValue != nil && *input.FieldConfig.Defaults.NoValue != "" {
 
diff --git a/go/dashboard/types_gen.go b/go/dashboard/types_gen.go
index 5031825a..4ec758a7 100644
--- a/go/dashboard/types_gen.go
+++ b/go/dashboard/types_gen.go
@@ -5152,7 +5152,7 @@ type FieldConfig struct {
 	// Panel color configuration
 	Color *FieldColor `json:"color,omitempty"`
 	// The behavior when clicking on a result
-	Links []any `json:"links,omitempty"`
+	Links []DashboardLink `json:"links,omitempty"`
 	// Alternative to empty string
 	NoValue *string `json:"noValue,omitempty"`
 	// custom is specified by the FieldConfig field
@@ -5335,8 +5335,19 @@ func (resource *FieldConfig) UnmarshalJSONStrict(raw []byte) error {
 	if fields["links"] != nil {
 		if string(fields["links"]) != "null" {
 
-			if err := json.Unmarshal(fields["links"], &resource.Links); err != nil {
-				errs = append(errs, cog.MakeBuildErrors("links", err)...)
+			partialArray := []json.RawMessage{}
+			if err := json.Unmarshal(fields["links"], &partialArray); err != nil {
+				return err
+			}
+
+			for i1 := range partialArray {
+				var result1 DashboardLink
+
+				result1 = DashboardLink{}
+				if err := result1.UnmarshalJSONStrict(partialArray[i1]); err != nil {
+					errs = append(errs, cog.MakeBuildErrors("links["+strconv.Itoa(i1)+"]", err)...)
+				}
+				resource.Links = append(resource.Links, result1)
 			}
 
 		}
@@ -5503,8 +5514,7 @@ func (resource FieldConfig) Equals(other FieldConfig) bool {
 	}
 
 	for i1 := range resource.Links {
-		// is DeepEqual good enough here?
-		if !reflect.DeepEqual(resource.Links[i1], other.Links[i1]) {
+		if !resource.Links[i1].Equals(other.Links[i1]) {
 			return false
 		}
 	}
@@ -5545,6 +5555,12 @@ func (resource FieldConfig) Validate() error {
 		}
 	}
 
+	for i1 := range resource.Links {
+		if err := resource.Links[i1].Validate(); err != nil {
+			errs = append(errs, cog.MakeBuildErrors("links["+strconv.Itoa(i1)+"]", err)...)
+		}
+	}
+
 	if len(errs) == 0 {
 		return nil
 	}
diff --git a/go/dashboardlist/panel_builder_gen.go b/go/dashboardlist/panel_builder_gen.go
index 7687e1d9..bf16a50d 100644
--- a/go/dashboardlist/panel_builder_gen.go
+++ b/go/dashboardlist/panel_builder_gen.go
@@ -355,6 +355,25 @@ func (builder *PanelBuilder) ColorScheme(color cog.Builder[dashboard.FieldColor]
 	return builder
 }
 
+// The behavior when clicking on a result
+func (builder *PanelBuilder) DataLinks(links []cog.Builder[dashboard.DashboardLink]) *PanelBuilder {
+	if builder.internal.FieldConfig == nil {
+		builder.internal.FieldConfig = &dashboard.FieldConfigSource{}
+	}
+	linksResources := make([]dashboard.DashboardLink, 0, len(links))
+	for _, r1 := range links {
+		linksDepth1, err := r1.Build()
+		if err != nil {
+			builder.errors["fieldConfig.defaults.links"] = err.(cog.BuildErrors)
+			return builder
+		}
+		linksResources = append(linksResources, linksDepth1)
+	}
+	builder.internal.FieldConfig.Defaults.Links = linksResources
+
+	return builder
+}
+
 // Alternative to empty string
 func (builder *PanelBuilder) NoValue(noValue string) *PanelBuilder {
 	if builder.internal.FieldConfig == nil {
diff --git a/go/dashboardlist/panel_converter_gen.go b/go/dashboardlist/panel_converter_gen.go
index 489a3a71..012ab934 100644
--- a/go/dashboardlist/panel_converter_gen.go
+++ b/go/dashboardlist/panel_converter_gen.go
@@ -395,6 +395,23 @@ func PanelConverter(input dashboard.Panel) string {
 		calls = append(calls, buffer.String())
 		buffer.Reset()
 
+	}
+	if input.FieldConfig != nil && input.FieldConfig.Defaults.Links != nil && len(input.FieldConfig.Defaults.Links) >= 1 {
+
+		buffer.WriteString(`DataLinks(`)
+		tmparg0 := []string{}
+		for _, arg1 := range input.FieldConfig.Defaults.Links {
+			tmplinksarg1 := dashboard.DashboardLinkConverter(arg1)
+			tmparg0 = append(tmparg0, tmplinksarg1)
+		}
+		arg0 := "[]cog.Builder[dashboard.DashboardLink]{" + strings.Join(tmparg0, ",\n") + "}"
+		buffer.WriteString(arg0)
+
+		buffer.WriteString(")")
+
+		calls = append(calls, buffer.String())
+		buffer.Reset()
+
 	}
 	if input.FieldConfig != nil && input.FieldConfig.Defaults.NoValue != nil && *input.FieldConfig.Defaults.NoValue != "" {
 
diff --git a/go/datagrid/panel_builder_gen.go b/go/datagrid/panel_builder_gen.go
index 02c0a43a..c2e16f67 100644
--- a/go/datagrid/panel_builder_gen.go
+++ b/go/datagrid/panel_builder_gen.go
@@ -355,6 +355,25 @@ func (builder *PanelBuilder) ColorScheme(color cog.Builder[dashboard.FieldColor]
 	return builder
 }
 
+// The behavior when clicking on a result
+func (builder *PanelBuilder) DataLinks(links []cog.Builder[dashboard.DashboardLink]) *PanelBuilder {
+	if builder.internal.FieldConfig == nil {
+		builder.internal.FieldConfig = &dashboard.FieldConfigSource{}
+	}
+	linksResources := make([]dashboard.DashboardLink, 0, len(links))
+	for _, r1 := range links {
+		linksDepth1, err := r1.Build()
+		if err != nil {
+			builder.errors["fieldConfig.defaults.links"] = err.(cog.BuildErrors)
+			return builder
+		}
+		linksResources = append(linksResources, linksDepth1)
+	}
+	builder.internal.FieldConfig.Defaults.Links = linksResources
+
+	return builder
+}
+
 // Alternative to empty string
 func (builder *PanelBuilder) NoValue(noValue string) *PanelBuilder {
 	if builder.internal.FieldConfig == nil {
diff --git a/go/datagrid/panel_converter_gen.go b/go/datagrid/panel_converter_gen.go
index ba3bcab5..0ba8d872 100644
--- a/go/datagrid/panel_converter_gen.go
+++ b/go/datagrid/panel_converter_gen.go
@@ -395,6 +395,23 @@ func PanelConverter(input dashboard.Panel) string {
 		calls = append(calls, buffer.String())
 		buffer.Reset()
 
+	}
+	if input.FieldConfig != nil && input.FieldConfig.Defaults.Links != nil && len(input.FieldConfig.Defaults.Links) >= 1 {
+
+		buffer.WriteString(`DataLinks(`)
+		tmparg0 := []string{}
+		for _, arg1 := range input.FieldConfig.Defaults.Links {
+			tmplinksarg1 := dashboard.DashboardLinkConverter(arg1)
+			tmparg0 = append(tmparg0, tmplinksarg1)
+		}
+		arg0 := "[]cog.Builder[dashboard.DashboardLink]{" + strings.Join(tmparg0, ",\n") + "}"
+		buffer.WriteString(arg0)
+
+		buffer.WriteString(")")
+
+		calls = append(calls, buffer.String())
+		buffer.Reset()
+
 	}
 	if input.FieldConfig != nil && input.FieldConfig.Defaults.NoValue != nil && *input.FieldConfig.Defaults.NoValue != "" {
 
diff --git a/go/debug/panel_builder_gen.go b/go/debug/panel_builder_gen.go
index 06ef97d8..0bdab0de 100644
--- a/go/debug/panel_builder_gen.go
+++ b/go/debug/panel_builder_gen.go
@@ -355,6 +355,25 @@ func (builder *PanelBuilder) ColorScheme(color cog.Builder[dashboard.FieldColor]
 	return builder
 }
 
+// The behavior when clicking on a result
+func (builder *PanelBuilder) DataLinks(links []cog.Builder[dashboard.DashboardLink]) *PanelBuilder {
+	if builder.internal.FieldConfig == nil {
+		builder.internal.FieldConfig = &dashboard.FieldConfigSource{}
+	}
+	linksResources := make([]dashboard.DashboardLink, 0, len(links))
+	for _, r1 := range links {
+		linksDepth1, err := r1.Build()
+		if err != nil {
+			builder.errors["fieldConfig.defaults.links"] = err.(cog.BuildErrors)
+			return builder
+		}
+		linksResources = append(linksResources, linksDepth1)
+	}
+	builder.internal.FieldConfig.Defaults.Links = linksResources
+
+	return builder
+}
+
 // Alternative to empty string
 func (builder *PanelBuilder) NoValue(noValue string) *PanelBuilder {
 	if builder.internal.FieldConfig == nil {
diff --git a/go/debug/panel_converter_gen.go b/go/debug/panel_converter_gen.go
index 38f03aee..defa510c 100644
--- a/go/debug/panel_converter_gen.go
+++ b/go/debug/panel_converter_gen.go
@@ -395,6 +395,23 @@ func PanelConverter(input dashboard.Panel) string {
 		calls = append(calls, buffer.String())
 		buffer.Reset()
 
+	}
+	if input.FieldConfig != nil && input.FieldConfig.Defaults.Links != nil && len(input.FieldConfig.Defaults.Links) >= 1 {
+
+		buffer.WriteString(`DataLinks(`)
+		tmparg0 := []string{}
+		for _, arg1 := range input.FieldConfig.Defaults.Links {
+			tmplinksarg1 := dashboard.DashboardLinkConverter(arg1)
+			tmparg0 = append(tmparg0, tmplinksarg1)
+		}
+		arg0 := "[]cog.Builder[dashboard.DashboardLink]{" + strings.Join(tmparg0, ",\n") + "}"
+		buffer.WriteString(arg0)
+
+		buffer.WriteString(")")
+
+		calls = append(calls, buffer.String())
+		buffer.Reset()
+
 	}
 	if input.FieldConfig != nil && input.FieldConfig.Defaults.NoValue != nil && *input.FieldConfig.Defaults.NoValue != "" {
 
diff --git a/go/docs/Examples.md b/go/docs/Examples.md
new file mode 100644
index 00000000..d7fdea3e
--- /dev/null
+++ b/go/docs/Examples.md
@@ -0,0 +1,32 @@
+---
+weight: 10
+---
+# Examples
+
+A collection of sample Grafana dashboards written in Go is available in the [grafana/grafana-foundation-sdk](https://github.com/grafana/grafana-foundation-sdk/) repository.
+
+Each example showcases different aspects of building dashboards as code:
+
+* [`custom-panel`](https://github.com/grafana/grafana-foundation-sdk/blob/main/examples/go/custom-panel): definition and usage of a _custom_ Panel type
+* [`custom-query`](https://github.com/grafana/grafana-foundation-sdk/blob/main/examples/go/custom-query): definition and usage of a _custom_ Query type
+* [`grafana-agent-overview`](https://github.com/grafana/grafana-foundation-sdk/blob/main/examples/go/grafana-agent-overview):
+    * reproduction of the "Grafana Agent Overview" dashboard from
+      the [Grafana Agent integration](https://grafana.com/docs/grafana-cloud/monitor-infrastructure/integrations/integration-reference/integration-grafana-agent/)
+      available in Grafana Cloud.
+    * dashboard variables
+    * `table` panels
+    * `timeseries` panels
+    * `prometheus` queries
+* [`linux-node-overview`](https://github.com/grafana/grafana-foundation-sdk/blob/main/examples/go/linux-node-overview):
+    * reproduction of the "Grafana Agent Overview" dashboard from
+      the [Linux Server integration](https://grafana.com/docs/grafana-cloud/monitor-infrastructure/integrations/integration-reference/integration-linux-node/#dashboards)
+      available in Grafana Cloud.
+    * dashboard variables
+    * dashboard links
+    * `stat` panels
+    * `table` panels
+    * `timeseries` panels
+    * `prometheus` queries
+* [`red-method`](https://github.com/grafana/grafana-foundation-sdk/blob/main/examples/go/red-method):
+    * example of a dashboard following
+      the [RED method](https://grafana.com/blog/2018/08/02/the-red-method-how-to-instrument-your-services/#the-red-method)
diff --git a/go/docs/Reference/annotationslist/builder-PanelBuilder.md b/go/docs/Reference/annotationslist/builder-PanelBuilder.md
index b84064ce..f324bc9e 100644
--- a/go/docs/Reference/annotationslist/builder-PanelBuilder.md
+++ b/go/docs/Reference/annotationslist/builder-PanelBuilder.md
@@ -34,6 +34,14 @@ Panel color configuration
 func (builder *PanelBuilder) ColorScheme(color cog.Builder[dashboard.FieldColor]) *PanelBuilder

+### DataLinks
+
+The behavior when clicking on a result
+
+go +func (builder *PanelBuilder) DataLinks(links []cog.Builder[dashboard.DashboardLink]) *PanelBuilder +
+

Datasource

The datasource used in all targets.
diff --git a/go/docs/Reference/barchart/builder-PanelBuilder.md b/go/docs/Reference/barchart/builder-PanelBuilder.md
index f75f6f16..91daa857 100644
--- a/go/docs/Reference/barchart/builder-PanelBuilder.md
+++ b/go/docs/Reference/barchart/builder-PanelBuilder.md
@@ -112,6 +112,14 @@ Panel color configuration
func (builder *PanelBuilder) ColorScheme(color cog.Builder[dashboard.FieldColor]) *PanelBuilder


+### <span class="badge object-method"></span> DataLinks
+
+The behavior when clicking on a result
+
+```go
+func (builder *PanelBuilder) DataLinks(links []cog.Builder[dashboard.DashboardLink]) *PanelBuilder
+```
+
### <span class="badge object-method"></span> Datasource

The datasource used in all targets.
diff --git a/go/docs/Reference/bargauge/builder-PanelBuilder.md b/go/docs/Reference/bargauge/builder-PanelBuilder.md
index 35440ba1..6e8d429c 100644
--- a/go/docs/Reference/bargauge/builder-PanelBuilder.md
+++ b/go/docs/Reference/bargauge/builder-PanelBuilder.md
@@ -34,6 +34,14 @@ Panel color configuration
func (builder *PanelBuilder) ColorScheme(color cog.Builder[dashboard.FieldColor]) *PanelBuilder

+### DataLinks
+
+The behavior when clicking on a result
+
+go +func (builder *PanelBuilder) DataLinks(links []cog.Builder[dashboard.DashboardLink]) *PanelBuilder +
+

Datasource

The datasource used in all targets.
diff --git a/go/docs/Reference/candlestick/builder-PanelBuilder.md b/go/docs/Reference/candlestick/builder-PanelBuilder.md
index 3bd83239..97e9263a 100644
--- a/go/docs/Reference/candlestick/builder-PanelBuilder.md
+++ b/go/docs/Reference/candlestick/builder-PanelBuilder.md
@@ -130,6 +130,14 @@ Set which colors are used when the price movement is up or down
func (builder *PanelBuilder) Colors(colors cog.Builder[candlestick.CandlestickColors]) *PanelBuilder


+### <span class="badge object-method"></span> DataLinks
+
+The behavior when clicking on a result
+
+```go
+func (builder *PanelBuilder) DataLinks(links []cog.Builder[dashboard.DashboardLink]) *PanelBuilder
+```
+
### <span class="badge object-method"></span> Datasource

The datasource used in all targets.
diff --git a/go/docs/Reference/canvas/builder-PanelBuilder.md b/go/docs/Reference/canvas/builder-PanelBuilder.md
index f03f6a30..52e20e90 100644
--- a/go/docs/Reference/canvas/builder-PanelBuilder.md
+++ b/go/docs/Reference/canvas/builder-PanelBuilder.md
@@ -34,6 +34,14 @@ Panel color configuration
func (builder *PanelBuilder) ColorScheme(color cog.Builder[dashboard.FieldColor]) *PanelBuilder

+### DataLinks
+
+The behavior when clicking on a result
+
+go +func (builder *PanelBuilder) DataLinks(links []cog.Builder[dashboard.DashboardLink]) *PanelBuilder +
+

Datasource

The datasource used in all targets.
diff --git a/go/docs/Reference/dashboard/builder-PanelBuilder.md b/go/docs/Reference/dashboard/builder-PanelBuilder.md
index de6d6a3d..082efcd3 100644
--- a/go/docs/Reference/dashboard/builder-PanelBuilder.md
+++ b/go/docs/Reference/dashboard/builder-PanelBuilder.md
@@ -34,6 +34,14 @@ Panel color configuration
func (builder *PanelBuilder) ColorScheme(color cog.Builder[dashboard.FieldColor]) *PanelBuilder


+### <span class="badge object-method"></span> DataLinks
+
+The behavior when clicking on a result
+
+```go
+func (builder *PanelBuilder) DataLinks(links []cog.Builder[dashboard.DashboardLink]) *PanelBuilder
+```
+
### <span class="badge object-method"></span> Datasource

The datasource used in all targets.
diff --git a/go/docs/Reference/dashboard/object-FieldConfig.md b/go/docs/Reference/dashboard/object-FieldConfig.md
index f0fc0d13..31d8de5c 100644
--- a/go/docs/Reference/dashboard/object-FieldConfig.md
+++ b/go/docs/Reference/dashboard/object-FieldConfig.md
@@ -57,7 +57,7 @@ type FieldConfig struct {
    // Panel color configuration
    Color *dashboard.FieldColor `json:"color,omitempty"`
    // The behavior when clicking on a result
-    Links []any `json:"links,omitempty"`
+    Links []dashboard.DashboardLink `json:"links,omitempty"`
    // Alternative to empty string
    NoValue *string `json:"noValue,omitempty"`
    // custom is specified by the FieldConfig field
diff --git a/go/docs/Reference/dashboardlist/builder-PanelBuilder.md b/go/docs/Reference/dashboardlist/builder-PanelBuilder.md
index b4f8960f..062810d4 100644
--- a/go/docs/Reference/dashboardlist/builder-PanelBuilder.md
+++ b/go/docs/Reference/dashboardlist/builder-PanelBuilder.md
@@ -34,6 +34,14 @@ Panel color configuration
func (builder *PanelBuilder) ColorScheme(color cog.Builder[dashboard.FieldColor]) *PanelBuilder

+### DataLinks
+
+The behavior when clicking on a result
+
+go +func (builder *PanelBuilder) DataLinks(links []cog.Builder[dashboard.DashboardLink]) *PanelBuilder +
+

Datasource

The datasource used in all targets.
diff --git a/go/docs/Reference/datagrid/builder-PanelBuilder.md b/go/docs/Reference/datagrid/builder-PanelBuilder.md
index 8bdc16e0..0a0e3c67 100644
--- a/go/docs/Reference/datagrid/builder-PanelBuilder.md
+++ b/go/docs/Reference/datagrid/builder-PanelBuilder.md
@@ -34,6 +34,14 @@ Panel color configuration
func (builder *PanelBuilder) ColorScheme(color cog.Builder[dashboard.FieldColor]) *PanelBuilder


+### <span class="badge object-method"></span> DataLinks
+
+The behavior when clicking on a result
+
+```go
+func (builder *PanelBuilder) DataLinks(links []cog.Builder[dashboard.DashboardLink]) *PanelBuilder
+```
+
### <span class="badge object-method"></span> Datasource

The datasource used in all targets.
diff --git a/go/docs/Reference/debug/builder-PanelBuilder.md b/go/docs/Reference/debug/builder-PanelBuilder.md
index c7877b0a..c6e16e86 100644
--- a/go/docs/Reference/debug/builder-PanelBuilder.md
+++ b/go/docs/Reference/debug/builder-PanelBuilder.md
@@ -40,6 +40,14 @@ func (builder *PanelBuilder) ColorScheme(color cog.Builder[dashboard.FieldColor]
func (builder *PanelBuilder) Counters(counters cog.Builder[debug.UpdateConfig]) *PanelBuilder

+### DataLinks
+
+The behavior when clicking on a result
+
+go +func (builder *PanelBuilder) DataLinks(links []cog.Builder[dashboard.DashboardLink]) *PanelBuilder +
+

Datasource

The datasource used in all targets.
diff --git a/go/docs/Reference/gauge/builder-PanelBuilder.md b/go/docs/Reference/gauge/builder-PanelBuilder.md
index 37537ac5..a405f16e 100644
--- a/go/docs/Reference/gauge/builder-PanelBuilder.md
+++ b/go/docs/Reference/gauge/builder-PanelBuilder.md
@@ -34,6 +34,14 @@ Panel color configuration
func (builder *PanelBuilder) ColorScheme(color cog.Builder[dashboard.FieldColor]) *PanelBuilder


+### <span class="badge object-method"></span> DataLinks
+
+The behavior when clicking on a result
+
+```go
+func (builder *PanelBuilder) DataLinks(links []cog.Builder[dashboard.DashboardLink]) *PanelBuilder
+```
+
### <span class="badge object-method"></span> Datasource

The datasource used in all targets.
diff --git a/go/docs/Reference/geomap/builder-PanelBuilder.md b/go/docs/Reference/geomap/builder-PanelBuilder.md
index da5caaeb..aae11247 100644
--- a/go/docs/Reference/geomap/builder-PanelBuilder.md
+++ b/go/docs/Reference/geomap/builder-PanelBuilder.md
@@ -46,6 +46,14 @@ func (builder *PanelBuilder) ColorScheme(color cog.Builder[dashboard.FieldColor]
func (builder *PanelBuilder) Controls(controls cog.Builder[geomap.ControlsOptions]) *PanelBuilder

+### DataLinks
+
+The behavior when clicking on a result
+
+go +func (builder *PanelBuilder) DataLinks(links []cog.Builder[dashboard.DashboardLink]) *PanelBuilder +
+

Datasource

The datasource used in all targets.
diff --git a/go/docs/Reference/heatmap/builder-PanelBuilder.md b/go/docs/Reference/heatmap/builder-PanelBuilder.md
index 50dd7d34..163e62a8 100644
--- a/go/docs/Reference/heatmap/builder-PanelBuilder.md
+++ b/go/docs/Reference/heatmap/builder-PanelBuilder.md
@@ -82,6 +82,14 @@ Panel color configuration
func (builder *PanelBuilder) ColorScheme(color cog.Builder[dashboard.FieldColor]) *PanelBuilder


+### <span class="badge object-method"></span> DataLinks
+
+The behavior when clicking on a result
+
+```go
+func (builder *PanelBuilder) DataLinks(links []cog.Builder[dashboard.DashboardLink]) *PanelBuilder
+```
+
### <span class="badge object-method"></span> Datasource

The datasource used in all targets.
diff --git a/go/docs/Reference/histogram/builder-PanelBuilder.md b/go/docs/Reference/histogram/builder-PanelBuilder.md
index abbe57a9..c5ce1ec1 100644
--- a/go/docs/Reference/histogram/builder-PanelBuilder.md
+++ b/go/docs/Reference/histogram/builder-PanelBuilder.md
@@ -120,6 +120,14 @@ Combines multiple series into a single histogram
func (builder *PanelBuilder) Combine(combine bool) *PanelBuilder

+### DataLinks
+
+The behavior when clicking on a result
+
+go +func (builder *PanelBuilder) DataLinks(links []cog.Builder[dashboard.DashboardLink]) *PanelBuilder +
+

Datasource

The datasource used in all targets.
diff --git a/go/docs/Reference/logs/builder-PanelBuilder.md b/go/docs/Reference/logs/builder-PanelBuilder.md
index 6d3bba5d..e0f0d67e 100644
--- a/go/docs/Reference/logs/builder-PanelBuilder.md
+++ b/go/docs/Reference/logs/builder-PanelBuilder.md
@@ -34,6 +34,14 @@ Panel color configuration
func (builder *PanelBuilder) ColorScheme(color cog.Builder[dashboard.FieldColor]) *PanelBuilder


+### <span class="badge object-method"></span> DataLinks
+
+The behavior when clicking on a result
+
+```go
+func (builder *PanelBuilder) DataLinks(links []cog.Builder[dashboard.DashboardLink]) *PanelBuilder
+```
+
### <span class="badge object-method"></span> Datasource

The datasource used in all targets.
diff --git a/go/docs/Reference/news/builder-PanelBuilder.md b/go/docs/Reference/news/builder-PanelBuilder.md
index c620620f..ff00ae66 100644
--- a/go/docs/Reference/news/builder-PanelBuilder.md
+++ b/go/docs/Reference/news/builder-PanelBuilder.md
@@ -34,6 +34,14 @@ Panel color configuration
func (builder *PanelBuilder) ColorScheme(color cog.Builder[dashboard.FieldColor]) *PanelBuilder

+### DataLinks
+
+The behavior when clicking on a result
+
+go +func (builder *PanelBuilder) DataLinks(links []cog.Builder[dashboard.DashboardLink]) *PanelBuilder +
+

Datasource

The datasource used in all targets.
diff --git a/go/docs/Reference/nodegraph/builder-PanelBuilder.md b/go/docs/Reference/nodegraph/builder-PanelBuilder.md
index b8156be0..bf15d838 100644
--- a/go/docs/Reference/nodegraph/builder-PanelBuilder.md
+++ b/go/docs/Reference/nodegraph/builder-PanelBuilder.md
@@ -34,6 +34,14 @@ Panel color configuration
func (builder *PanelBuilder) ColorScheme(color cog.Builder[dashboard.FieldColor]) *PanelBuilder


+### <span class="badge object-method"></span> DataLinks
+
+The behavior when clicking on a result
+
+```go
+func (builder *PanelBuilder) DataLinks(links []cog.Builder[dashboard.DashboardLink]) *PanelBuilder
+```
+
### <span class="badge object-method"></span> Datasource

The datasource used in all targets.
diff --git a/go/docs/Reference/piechart/builder-PanelBuilder.md b/go/docs/Reference/piechart/builder-PanelBuilder.md
index e2bd12a8..a9890dac 100644
--- a/go/docs/Reference/piechart/builder-PanelBuilder.md
+++ b/go/docs/Reference/piechart/builder-PanelBuilder.md
@@ -34,6 +34,14 @@ Panel color configuration
func (builder *PanelBuilder) ColorScheme(color cog.Builder[dashboard.FieldColor]) *PanelBuilder

+### DataLinks
+
+The behavior when clicking on a result
+
+go +func (builder *PanelBuilder) DataLinks(links []cog.Builder[dashboard.DashboardLink]) *PanelBuilder +
+

Datasource

The datasource used in all targets.
diff --git a/go/docs/Reference/stat/builder-PanelBuilder.md b/go/docs/Reference/stat/builder-PanelBuilder.md
index 0e0ca2a1..df6edefc 100644
--- a/go/docs/Reference/stat/builder-PanelBuilder.md
+++ b/go/docs/Reference/stat/builder-PanelBuilder.md
@@ -40,6 +40,14 @@ Panel color configuration
func (builder *PanelBuilder) ColorScheme(color cog.Builder[dashboard.FieldColor]) *PanelBuilder


+### <span class="badge object-method"></span> DataLinks
+
+The behavior when clicking on a result
+
+```go
+func (builder *PanelBuilder) DataLinks(links []cog.Builder[dashboard.DashboardLink]) *PanelBuilder
+```
+
### <span class="badge object-method"></span> Datasource

The datasource used in all targets.
diff --git a/go/docs/Reference/statetimeline/builder-PanelBuilder.md b/go/docs/Reference/statetimeline/builder-PanelBuilder.md
index 3b03243e..402fd19e 100644
--- a/go/docs/Reference/statetimeline/builder-PanelBuilder.md
+++ b/go/docs/Reference/statetimeline/builder-PanelBuilder.md
@@ -42,6 +42,14 @@ Panel color configuration
func (builder *PanelBuilder) ColorScheme(color cog.Builder[dashboard.FieldColor]) *PanelBuilder

+### DataLinks
+
+The behavior when clicking on a result
+
+go +func (builder *PanelBuilder) DataLinks(links []cog.Builder[dashboard.DashboardLink]) *PanelBuilder +
+

Datasource

The datasource used in all targets.
diff --git a/go/docs/Reference/statushistory/builder-PanelBuilder.md b/go/docs/Reference/statushistory/builder-PanelBuilder.md
index 4473e189..90ad3bbd 100644
--- a/go/docs/Reference/statushistory/builder-PanelBuilder.md
+++ b/go/docs/Reference/statushistory/builder-PanelBuilder.md
@@ -42,6 +42,14 @@ Panel color configuration
func (builder *PanelBuilder) ColorScheme(color cog.Builder[dashboard.FieldColor]) *PanelBuilder


+### <span class="badge object-method"></span> DataLinks
+
+The behavior when clicking on a result
+
+```go
+func (builder *PanelBuilder) DataLinks(links []cog.Builder[dashboard.DashboardLink]) *PanelBuilder
+```
+
### <span class="badge object-method"></span> Datasource

The datasource used in all targets.
diff --git a/go/docs/Reference/table/builder-PanelBuilder.md b/go/docs/Reference/table/builder-PanelBuilder.md
index 2b3f07af..f210bee0 100644
--- a/go/docs/Reference/table/builder-PanelBuilder.md
+++ b/go/docs/Reference/table/builder-PanelBuilder.md
@@ -54,6 +54,14 @@ Panel color configuration
func (builder *PanelBuilder) ColorScheme(color cog.Builder[dashboard.FieldColor]) *PanelBuilder

+### DataLinks
+
+The behavior when clicking on a result
+
+go +func (builder *PanelBuilder) DataLinks(links []cog.Builder[dashboard.DashboardLink]) *PanelBuilder +
+

Datasource

The datasource used in all targets.
diff --git a/go/docs/Reference/text/builder-PanelBuilder.md b/go/docs/Reference/text/builder-PanelBuilder.md
index f9019ee7..7af4d4d2 100644
--- a/go/docs/Reference/text/builder-PanelBuilder.md
+++ b/go/docs/Reference/text/builder-PanelBuilder.md
@@ -46,6 +46,14 @@ func (builder *PanelBuilder) ColorScheme(color cog.Builder[dashboard.FieldColor]
func (builder *PanelBuilder) Content(content string) *PanelBuilder


+### <span class="badge object-method"></span> DataLinks
+
+The behavior when clicking on a result
+
+```go
+func (builder *PanelBuilder) DataLinks(links []cog.Builder[dashboard.DashboardLink]) *PanelBuilder
+```
+
### <span class="badge object-method"></span> Datasource

The datasource used in all targets.
diff --git a/go/docs/Reference/timeseries/builder-PanelBuilder.md b/go/docs/Reference/timeseries/builder-PanelBuilder.md
index 5111929e..38e76a19 100644
--- a/go/docs/Reference/timeseries/builder-PanelBuilder.md
+++ b/go/docs/Reference/timeseries/builder-PanelBuilder.md
@@ -106,6 +106,14 @@ Panel color configuration
func (builder *PanelBuilder) ColorScheme(color cog.Builder[dashboard.FieldColor]) *PanelBuilder

+### DataLinks
+
+The behavior when clicking on a result
+
+go +func (builder *PanelBuilder) DataLinks(links []cog.Builder[dashboard.DashboardLink]) *PanelBuilder +
+

Datasource

The datasource used in all targets.
diff --git a/go/docs/Reference/trend/builder-PanelBuilder.md b/go/docs/Reference/trend/builder-PanelBuilder.md
index cd4d491f..424b019b 100644
--- a/go/docs/Reference/trend/builder-PanelBuilder.md
+++ b/go/docs/Reference/trend/builder-PanelBuilder.md
@@ -106,6 +106,14 @@ Panel color configuration
func (builder *PanelBuilder) ColorScheme(color cog.Builder[dashboard.FieldColor]) *PanelBuilder


+### <span class="badge object-method"></span> DataLinks
+
+The behavior when clicking on a result
+
+```go
+func (builder *PanelBuilder) DataLinks(links []cog.Builder[dashboard.DashboardLink]) *PanelBuilder
+```
+
### <span class="badge object-method"></span> Datasource

The datasource used in all targets.
diff --git a/go/docs/Reference/xychart/builder-PanelBuilder.md b/go/docs/Reference/xychart/builder-PanelBuilder.md
index 12ce1f53..979f47ce 100644
--- a/go/docs/Reference/xychart/builder-PanelBuilder.md
+++ b/go/docs/Reference/xychart/builder-PanelBuilder.md
@@ -88,6 +88,14 @@ Panel color configuration
func (builder *PanelBuilder) ColorScheme(color cog.Builder[dashboard.FieldColor]) *PanelBuilder

+### DataLinks
+
+The behavior when clicking on a result
+
+go +func (builder *PanelBuilder) DataLinks(links []cog.Builder[dashboard.DashboardLink]) *PanelBuilder +
+

Datasource

The datasource used in all targets.
diff --git a/go/gauge/panel_builder_gen.go b/go/gauge/panel_builder_gen.go
index af0b30cd..6e60923a 100644
--- a/go/gauge/panel_builder_gen.go
+++ b/go/gauge/panel_builder_gen.go
@@ -356,6 +356,25 @@ func (builder *PanelBuilder) ColorScheme(color cog.Builder[dashboard.FieldColor]
return builder
}

+// The behavior when clicking on a result
+func (builder *PanelBuilder) DataLinks(links []cog.Builder[dashboard.DashboardLink]) *PanelBuilder {

  • if builder.internal.FieldConfig == nil {
  •   builder.internal.FieldConfig = &dashboard.FieldConfigSource{}
    
  • }
  • linksResources := make([]dashboard.DashboardLink, 0, len(links))
  • for _, r1 := range links {
  •   linksDepth1, err := r1.Build()
    
  •   if err != nil {
    
  •   	builder.errors["fieldConfig.defaults.links"] = err.(cog.BuildErrors)
    
  •   	return builder
    
  •   }
    
  •   linksResources = append(linksResources, linksDepth1)
    
  • }
  • builder.internal.FieldConfig.Defaults.Links = linksResources
  • return builder
    +}

// Alternative to empty string
func (builder *PanelBuilder) NoValue(noValue string) *PanelBuilder {
if builder.internal.FieldConfig == nil {
diff --git a/go/gauge/panel_converter_gen.go b/go/gauge/panel_converter_gen.go
index 05d9cb92..b1f41d3e 100644
--- a/go/gauge/panel_converter_gen.go
+++ b/go/gauge/panel_converter_gen.go
@@ -396,6 +396,23 @@ func PanelConverter(input dashboard.Panel) string {
calls = append(calls, buffer.String())
buffer.Reset()

  • }
  • if input.FieldConfig != nil && input.FieldConfig.Defaults.Links != nil && len(input.FieldConfig.Defaults.Links) >= 1 {
  •   buffer.WriteString(`DataLinks(`)
    
  •   tmparg0 := []string{}
    
  •   for _, arg1 := range input.FieldConfig.Defaults.Links {
    
  •   	tmplinksarg1 := dashboard.DashboardLinkConverter(arg1)
    
  •   	tmparg0 = append(tmparg0, tmplinksarg1)
    
  •   }
    
  •   arg0 := "[]cog.Builder[dashboard.DashboardLink]{" + strings.Join(tmparg0, ",\n") + "}"
    
  •   buffer.WriteString(arg0)
    
  •   buffer.WriteString(")")
    
  •   calls = append(calls, buffer.String())
    
  •   buffer.Reset()
    
  • }
    if input.FieldConfig != nil && input.FieldConfig.Defaults.NoValue != nil && *input.FieldConfig.Defaults.NoValue != "" {

diff --git a/go/geomap/panel_builder_gen.go b/go/geomap/panel_builder_gen.go
index 3ca5a672..d6daf9bc 100644
--- a/go/geomap/panel_builder_gen.go
+++ b/go/geomap/panel_builder_gen.go
@@ -356,6 +356,25 @@ func (builder *PanelBuilder) ColorScheme(color cog.Builder[dashboard.FieldColor]
return builder
}

+// The behavior when clicking on a result
+func (builder *PanelBuilder) DataLinks(links []cog.Builder[dashboard.DashboardLink]) *PanelBuilder {

  • if builder.internal.FieldConfig == nil {
  •   builder.internal.FieldConfig = &dashboard.FieldConfigSource{}
    
  • }
  • linksResources := make([]dashboard.DashboardLink, 0, len(links))
  • for _, r1 := range links {
  •   linksDepth1, err := r1.Build()
    
  •   if err != nil {
    
  •   	builder.errors["fieldConfig.defaults.links"] = err.(cog.BuildErrors)
    
  •   	return builder
    
  •   }
    
  •   linksResources = append(linksResources, linksDepth1)
    
  • }
  • builder.internal.FieldConfig.Defaults.Links = linksResources
  • return builder
    +}

// Alternative to empty string
func (builder *PanelBuilder) NoValue(noValue string) *PanelBuilder {
if builder.internal.FieldConfig == nil {
diff --git a/go/geomap/panel_converter_gen.go b/go/geomap/panel_converter_gen.go
index 36cfe8c6..a6dea8a8 100644
--- a/go/geomap/panel_converter_gen.go
+++ b/go/geomap/panel_converter_gen.go
@@ -396,6 +396,23 @@ func PanelConverter(input dashboard.Panel) string {
calls = append(calls, buffer.String())
buffer.Reset()

  • }
  • if input.FieldConfig != nil && input.FieldConfig.Defaults.Links != nil && len(input.FieldConfig.Defaults.Links) >= 1 {
  •   buffer.WriteString(`DataLinks(`)
    
  •   tmparg0 := []string{}
    
  •   for _, arg1 := range input.FieldConfig.Defaults.Links {
    
  •   	tmplinksarg1 := dashboard.DashboardLinkConverter(arg1)
    
  •   	tmparg0 = append(tmparg0, tmplinksarg1)
    
  •   }
    
  •   arg0 := "[]cog.Builder[dashboard.DashboardLink]{" + strings.Join(tmparg0, ",\n") + "}"
    
  •   buffer.WriteString(arg0)
    
  •   buffer.WriteString(")")
    
  •   calls = append(calls, buffer.String())
    
  •   buffer.Reset()
    
  • }
    if input.FieldConfig != nil && input.FieldConfig.Defaults.NoValue != nil && *input.FieldConfig.Defaults.NoValue != "" {

diff --git a/go/heatmap/panel_builder_gen.go b/go/heatmap/panel_builder_gen.go
index a421b78c..e753d013 100644
--- a/go/heatmap/panel_builder_gen.go
+++ b/go/heatmap/panel_builder_gen.go
@@ -356,6 +356,25 @@ func (builder *PanelBuilder) ColorScheme(color cog.Builder[dashboard.FieldColor]
return builder
}

+// The behavior when clicking on a result
+func (builder *PanelBuilder) DataLinks(links []cog.Builder[dashboard.DashboardLink]) *PanelBuilder {

  • if builder.internal.FieldConfig == nil {
  •   builder.internal.FieldConfig = &dashboard.FieldConfigSource{}
    
  • }
  • linksResources := make([]dashboard.DashboardLink, 0, len(links))
  • for _, r1 := range links {
  •   linksDepth1, err := r1.Build()
    
  •   if err != nil {
    
  •   	builder.errors["fieldConfig.defaults.links"] = err.(cog.BuildErrors)
    
  •   	return builder
    
  •   }
    
  •   linksResources = append(linksResources, linksDepth1)
    
  • }
  • builder.internal.FieldConfig.Defaults.Links = linksResources
  • return builder
    +}

// Alternative to empty string
func (builder *PanelBuilder) NoValue(noValue string) *PanelBuilder {
if builder.internal.FieldConfig == nil {
diff --git a/go/heatmap/panel_converter_gen.go b/go/heatmap/panel_converter_gen.go
index 383c0ad3..d42e3b48 100644
--- a/go/heatmap/panel_converter_gen.go
+++ b/go/heatmap/panel_converter_gen.go
@@ -396,6 +396,23 @@ func PanelConverter(input dashboard.Panel) string {
calls = append(calls, buffer.String())
buffer.Reset()

  • }
  • if input.FieldConfig != nil && input.FieldConfig.Defaults.Links != nil && len(input.FieldConfig.Defaults.Links) >= 1 {
  •   buffer.WriteString(`DataLinks(`)
    
  •   tmparg0 := []string{}
    
  •   for _, arg1 := range input.FieldConfig.Defaults.Links {
    
  •   	tmplinksarg1 := dashboard.DashboardLinkConverter(arg1)
    
  •   	tmparg0 = append(tmparg0, tmplinksarg1)
    
  •   }
    
  •   arg0 := "[]cog.Builder[dashboard.DashboardLink]{" + strings.Join(tmparg0, ",\n") + "}"
    
  •   buffer.WriteString(arg0)
    
  •   buffer.WriteString(")")
    
  •   calls = append(calls, buffer.String())
    
  •   buffer.Reset()
    
  • }
    if input.FieldConfig != nil && input.FieldConfig.Defaults.NoValue != nil && *input.FieldConfig.Defaults.NoValue != "" {

diff --git a/go/histogram/panel_builder_gen.go b/go/histogram/panel_builder_gen.go
index aeac81cd..23cebac3 100644
--- a/go/histogram/panel_builder_gen.go
+++ b/go/histogram/panel_builder_gen.go
@@ -356,6 +356,25 @@ func (builder *PanelBuilder) ColorScheme(color cog.Builder[dashboard.FieldColor]
return builder
}

+// The behavior when clicking on a result
+func (builder *PanelBuilder) DataLinks(links []cog.Builder[dashboard.DashboardLink]) *PanelBuilder {

  • if builder.internal.FieldConfig == nil {
  •   builder.internal.FieldConfig = &dashboard.FieldConfigSource{}
    
  • }
  • linksResources := make([]dashboard.DashboardLink, 0, len(links))
  • for _, r1 := range links {
  •   linksDepth1, err := r1.Build()
    
  •   if err != nil {
    
  •   	builder.errors["fieldConfig.defaults.links"] = err.(cog.BuildErrors)
    
  •   	return builder
    
  •   }
    
  •   linksResources = append(linksResources, linksDepth1)
    
  • }
  • builder.internal.FieldConfig.Defaults.Links = linksResources
  • return builder
    +}

// Alternative to empty string
func (builder *PanelBuilder) NoValue(noValue string) *PanelBuilder {
if builder.internal.FieldConfig == nil {
diff --git a/go/histogram/panel_converter_gen.go b/go/histogram/panel_converter_gen.go
index 9d4106fe..929247d2 100644
--- a/go/histogram/panel_converter_gen.go
+++ b/go/histogram/panel_converter_gen.go
@@ -396,6 +396,23 @@ func PanelConverter(input dashboard.Panel) string {
calls = append(calls, buffer.String())
buffer.Reset()

  • }
  • if input.FieldConfig != nil && input.FieldConfig.Defaults.Links != nil && len(input.FieldConfig.Defaults.Links) >= 1 {
  •   buffer.WriteString(`DataLinks(`)
    
  •   tmparg0 := []string{}
    
  •   for _, arg1 := range input.FieldConfig.Defaults.Links {
    
  •   	tmplinksarg1 := dashboard.DashboardLinkConverter(arg1)
    
  •   	tmparg0 = append(tmparg0, tmplinksarg1)
    
  •   }
    
  •   arg0 := "[]cog.Builder[dashboard.DashboardLink]{" + strings.Join(tmparg0, ",\n") + "}"
    
  •   buffer.WriteString(arg0)
    
  •   buffer.WriteString(")")
    
  •   calls = append(calls, buffer.String())
    
  •   buffer.Reset()
    
  • }
    if input.FieldConfig != nil && input.FieldConfig.Defaults.NoValue != nil && *input.FieldConfig.Defaults.NoValue != "" {

diff --git a/go/logs/panel_builder_gen.go b/go/logs/panel_builder_gen.go
index 95662185..12b68507 100644
--- a/go/logs/panel_builder_gen.go
+++ b/go/logs/panel_builder_gen.go
@@ -356,6 +356,25 @@ func (builder *PanelBuilder) ColorScheme(color cog.Builder[dashboard.FieldColor]
return builder
}

+// The behavior when clicking on a result
+func (builder *PanelBuilder) DataLinks(links []cog.Builder[dashboard.DashboardLink]) *PanelBuilder {

  • if builder.internal.FieldConfig == nil {
  •   builder.internal.FieldConfig = &dashboard.FieldConfigSource{}
    
  • }
  • linksResources := make([]dashboard.DashboardLink, 0, len(links))
  • for _, r1 := range links {
  •   linksDepth1, err := r1.Build()
    
  •   if err != nil {
    
  •   	builder.errors["fieldConfig.defaults.links"] = err.(cog.BuildErrors)
    
  •   	return builder
    
  •   }
    
  •   linksResources = append(linksResources, linksDepth1)
    
  • }
  • builder.internal.FieldConfig.Defaults.Links = linksResources
  • return builder
    +}

// Alternative to empty string
func (builder *PanelBuilder) NoValue(noValue string) *PanelBuilder {
if builder.internal.FieldConfig == nil {
diff --git a/go/logs/panel_converter_gen.go b/go/logs/panel_converter_gen.go
index 5dc28287..98aead3f 100644
--- a/go/logs/panel_converter_gen.go
+++ b/go/logs/panel_converter_gen.go
@@ -395,6 +395,23 @@ func PanelConverter(input dashboard.Panel) string {
calls = append(calls, buffer.String())
buffer.Reset()

  • }
  • if input.FieldConfig != nil && input.FieldConfig.Defaults.Links != nil && len(input.FieldConfig.Defaults.Links) >= 1 {
  •   buffer.WriteString(`DataLinks(`)
    
  •   tmparg0 := []string{}
    
  •   for _, arg1 := range input.FieldConfig.Defaults.Links {
    
  •   	tmplinksarg1 := dashboard.DashboardLinkConverter(arg1)
    
  •   	tmparg0 = append(tmparg0, tmplinksarg1)
    
  •   }
    
  •   arg0 := "[]cog.Builder[dashboard.DashboardLink]{" + strings.Join(tmparg0, ",\n") + "}"
    
  •   buffer.WriteString(arg0)
    
  •   buffer.WriteString(")")
    
  •   calls = append(calls, buffer.String())
    
  •   buffer.Reset()
    
  • }
    if input.FieldConfig != nil && input.FieldConfig.Defaults.NoValue != nil && *input.FieldConfig.Defaults.NoValue != "" {

diff --git a/go/news/panel_builder_gen.go b/go/news/panel_builder_gen.go
index a52ff2df..a0673923 100644
--- a/go/news/panel_builder_gen.go
+++ b/go/news/panel_builder_gen.go
@@ -355,6 +355,25 @@ func (builder *PanelBuilder) ColorScheme(color cog.Builder[dashboard.FieldColor]
return builder
}

+// The behavior when clicking on a result
+func (builder *PanelBuilder) DataLinks(links []cog.Builder[dashboard.DashboardLink]) *PanelBuilder {

  • if builder.internal.FieldConfig == nil {
  •   builder.internal.FieldConfig = &dashboard.FieldConfigSource{}
    
  • }
  • linksResources := make([]dashboard.DashboardLink, 0, len(links))
  • for _, r1 := range links {
  •   linksDepth1, err := r1.Build()
    
  •   if err != nil {
    
  •   	builder.errors["fieldConfig.defaults.links"] = err.(cog.BuildErrors)
    
  •   	return builder
    
  •   }
    
  •   linksResources = append(linksResources, linksDepth1)
    
  • }
  • builder.internal.FieldConfig.Defaults.Links = linksResources
  • return builder
    +}

// Alternative to empty string
func (builder *PanelBuilder) NoValue(noValue string) *PanelBuilder {
if builder.internal.FieldConfig == nil {
diff --git a/go/news/panel_converter_gen.go b/go/news/panel_converter_gen.go
index ab17d587..1f7a920e 100644
--- a/go/news/panel_converter_gen.go
+++ b/go/news/panel_converter_gen.go
@@ -395,6 +395,23 @@ func PanelConverter(input dashboard.Panel) string {
calls = append(calls, buffer.String())
buffer.Reset()

  • }
  • if input.FieldConfig != nil && input.FieldConfig.Defaults.Links != nil && len(input.FieldConfig.Defaults.Links) >= 1 {
  •   buffer.WriteString(`DataLinks(`)
    
  •   tmparg0 := []string{}
    
  •   for _, arg1 := range input.FieldConfig.Defaults.Links {
    
  •   	tmplinksarg1 := dashboard.DashboardLinkConverter(arg1)
    
  •   	tmparg0 = append(tmparg0, tmplinksarg1)
    
  •   }
    
  •   arg0 := "[]cog.Builder[dashboard.DashboardLink]{" + strings.Join(tmparg0, ",\n") + "}"
    
  •   buffer.WriteString(arg0)
    
  •   buffer.WriteString(")")
    
  •   calls = append(calls, buffer.String())
    
  •   buffer.Reset()
    
  • }
    if input.FieldConfig != nil && input.FieldConfig.Defaults.NoValue != nil && *input.FieldConfig.Defaults.NoValue != "" {

diff --git a/go/nodegraph/panel_builder_gen.go b/go/nodegraph/panel_builder_gen.go
index 5ba08c14..15f208e4 100644
--- a/go/nodegraph/panel_builder_gen.go
+++ b/go/nodegraph/panel_builder_gen.go
@@ -355,6 +355,25 @@ func (builder *PanelBuilder) ColorScheme(color cog.Builder[dashboard.FieldColor]
return builder
}

+// The behavior when clicking on a result
+func (builder *PanelBuilder) DataLinks(links []cog.Builder[dashboard.DashboardLink]) *PanelBuilder {

  • if builder.internal.FieldConfig == nil {
  •   builder.internal.FieldConfig = &dashboard.FieldConfigSource{}
    
  • }
  • linksResources := make([]dashboard.DashboardLink, 0, len(links))
  • for _, r1 := range links {
  •   linksDepth1, err := r1.Build()
    
  •   if err != nil {
    
  •   	builder.errors["fieldConfig.defaults.links"] = err.(cog.BuildErrors)
    
  •   	return builder
    
  •   }
    
  •   linksResources = append(linksResources, linksDepth1)
    
  • }
  • builder.internal.FieldConfig.Defaults.Links = linksResources
  • return builder
    +}

// Alternative to empty string
func (builder *PanelBuilder) NoValue(noValue string) *PanelBuilder {
if builder.internal.FieldConfig == nil {
diff --git a/go/nodegraph/panel_converter_gen.go b/go/nodegraph/panel_converter_gen.go
index 68adae9d..bc65f90d 100644
--- a/go/nodegraph/panel_converter_gen.go
+++ b/go/nodegraph/panel_converter_gen.go
@@ -395,6 +395,23 @@ func PanelConverter(input dashboard.Panel) string {
calls = append(calls, buffer.String())
buffer.Reset()

  • }
  • if input.FieldConfig != nil && input.FieldConfig.Defaults.Links != nil && len(input.FieldConfig.Defaults.Links) >= 1 {
  •   buffer.WriteString(`DataLinks(`)
    
  •   tmparg0 := []string{}
    
  •   for _, arg1 := range input.FieldConfig.Defaults.Links {
    
  •   	tmplinksarg1 := dashboard.DashboardLinkConverter(arg1)
    
  •   	tmparg0 = append(tmparg0, tmplinksarg1)
    
  •   }
    
  •   arg0 := "[]cog.Builder[dashboard.DashboardLink]{" + strings.Join(tmparg0, ",\n") + "}"
    
  •   buffer.WriteString(arg0)
    
  •   buffer.WriteString(")")
    
  •   calls = append(calls, buffer.String())
    
  •   buffer.Reset()
    
  • }
    if input.FieldConfig != nil && input.FieldConfig.Defaults.NoValue != nil && *input.FieldConfig.Defaults.NoValue != "" {

diff --git a/go/piechart/panel_builder_gen.go b/go/piechart/panel_builder_gen.go
index 272ca3ca..5ec792a8 100644
--- a/go/piechart/panel_builder_gen.go
+++ b/go/piechart/panel_builder_gen.go
@@ -356,6 +356,25 @@ func (builder *PanelBuilder) ColorScheme(color cog.Builder[dashboard.FieldColor]
return builder
}

+// The behavior when clicking on a result
+func (builder *PanelBuilder) DataLinks(links []cog.Builder[dashboard.DashboardLink]) *PanelBuilder {

  • if builder.internal.FieldConfig == nil {
  •   builder.internal.FieldConfig = &dashboard.FieldConfigSource{}
    
  • }
  • linksResources := make([]dashboard.DashboardLink, 0, len(links))
  • for _, r1 := range links {
  •   linksDepth1, err := r1.Build()
    
  •   if err != nil {
    
  •   	builder.errors["fieldConfig.defaults.links"] = err.(cog.BuildErrors)
    
  •   	return builder
    
  •   }
    
  •   linksResources = append(linksResources, linksDepth1)
    
  • }
  • builder.internal.FieldConfig.Defaults.Links = linksResources
  • return builder
    +}

// Alternative to empty string
func (builder *PanelBuilder) NoValue(noValue string) *PanelBuilder {
if builder.internal.FieldConfig == nil {
diff --git a/go/piechart/panel_converter_gen.go b/go/piechart/panel_converter_gen.go
index 21e3b3a1..52d046f5 100644
--- a/go/piechart/panel_converter_gen.go
+++ b/go/piechart/panel_converter_gen.go
@@ -396,6 +396,23 @@ func PanelConverter(input dashboard.Panel) string {
calls = append(calls, buffer.String())
buffer.Reset()

  • }
  • if input.FieldConfig != nil && input.FieldConfig.Defaults.Links != nil && len(input.FieldConfig.Defaults.Links) >= 1 {
  •   buffer.WriteString(`DataLinks(`)
    
  •   tmparg0 := []string{}
    
  •   for _, arg1 := range input.FieldConfig.Defaults.Links {
    
  •   	tmplinksarg1 := dashboard.DashboardLinkConverter(arg1)
    
  •   	tmparg0 = append(tmparg0, tmplinksarg1)
    
  •   }
    
  •   arg0 := "[]cog.Builder[dashboard.DashboardLink]{" + strings.Join(tmparg0, ",\n") + "}"
    
  •   buffer.WriteString(arg0)
    
  •   buffer.WriteString(")")
    
  •   calls = append(calls, buffer.String())
    
  •   buffer.Reset()
    
  • }
    if input.FieldConfig != nil && input.FieldConfig.Defaults.NoValue != nil && *input.FieldConfig.Defaults.NoValue != "" {

diff --git a/go/stat/panel_builder_gen.go b/go/stat/panel_builder_gen.go
index 995af2ce..f6fd4fa4 100644
--- a/go/stat/panel_builder_gen.go
+++ b/go/stat/panel_builder_gen.go
@@ -356,6 +356,25 @@ func (builder *PanelBuilder) ColorScheme(color cog.Builder[dashboard.FieldColor]
return builder
}

+// The behavior when clicking on a result
+func (builder *PanelBuilder) DataLinks(links []cog.Builder[dashboard.DashboardLink]) *PanelBuilder {

  • if builder.internal.FieldConfig == nil {
  •   builder.internal.FieldConfig = &dashboard.FieldConfigSource{}
    
  • }
  • linksResources := make([]dashboard.DashboardLink, 0, len(links))
  • for _, r1 := range links {
  •   linksDepth1, err := r1.Build()
    
  •   if err != nil {
    
  •   	builder.errors["fieldConfig.defaults.links"] = err.(cog.BuildErrors)
    
  •   	return builder
    
  •   }
    
  •   linksResources = append(linksResources, linksDepth1)
    
  • }
  • builder.internal.FieldConfig.Defaults.Links = linksResources
  • return builder
    +}

// Alternative to empty string
func (builder *PanelBuilder) NoValue(noValue string) *PanelBuilder {
if builder.internal.FieldConfig == nil {
diff --git a/go/stat/panel_converter_gen.go b/go/stat/panel_converter_gen.go
index 9113f565..d80ef9e3 100644
--- a/go/stat/panel_converter_gen.go
+++ b/go/stat/panel_converter_gen.go
@@ -396,6 +396,23 @@ func PanelConverter(input dashboard.Panel) string {
calls = append(calls, buffer.String())
buffer.Reset()

  • }
  • if input.FieldConfig != nil && input.FieldConfig.Defaults.Links != nil && len(input.FieldConfig.Defaults.Links) >= 1 {
  •   buffer.WriteString(`DataLinks(`)
    
  •   tmparg0 := []string{}
    
  •   for _, arg1 := range input.FieldConfig.Defaults.Links {
    
  •   	tmplinksarg1 := dashboard.DashboardLinkConverter(arg1)
    
  •   	tmparg0 = append(tmparg0, tmplinksarg1)
    
  •   }
    
  •   arg0 := "[]cog.Builder[dashboard.DashboardLink]{" + strings.Join(tmparg0, ",\n") + "}"
    
  •   buffer.WriteString(arg0)
    
  •   buffer.WriteString(")")
    
  •   calls = append(calls, buffer.String())
    
  •   buffer.Reset()
    
  • }
    if input.FieldConfig != nil && input.FieldConfig.Defaults.NoValue != nil && *input.FieldConfig.Defaults.NoValue != "" {

diff --git a/go/statetimeline/panel_builder_gen.go b/go/statetimeline/panel_builder_gen.go
index 3644133f..9a783dab 100644
--- a/go/statetimeline/panel_builder_gen.go
+++ b/go/statetimeline/panel_builder_gen.go
@@ -356,6 +356,25 @@ func (builder *PanelBuilder) ColorScheme(color cog.Builder[dashboard.FieldColor]
return builder
}

+// The behavior when clicking on a result
+func (builder *PanelBuilder) DataLinks(links []cog.Builder[dashboard.DashboardLink]) *PanelBuilder {

  • if builder.internal.FieldConfig == nil {
  •   builder.internal.FieldConfig = &dashboard.FieldConfigSource{}
    
  • }
  • linksResources := make([]dashboard.DashboardLink, 0, len(links))
  • for _, r1 := range links {
  •   linksDepth1, err := r1.Build()
    
  •   if err != nil {
    
  •   	builder.errors["fieldConfig.defaults.links"] = err.(cog.BuildErrors)
    
  •   	return builder
    
  •   }
    
  •   linksResources = append(linksResources, linksDepth1)
    
  • }
  • builder.internal.FieldConfig.Defaults.Links = linksResources
  • return builder
    +}

// Alternative to empty string
func (builder *PanelBuilder) NoValue(noValue string) *PanelBuilder {
if builder.internal.FieldConfig == nil {
diff --git a/go/statetimeline/panel_converter_gen.go b/go/statetimeline/panel_converter_gen.go
index f46fd41c..7003b487 100644
--- a/go/statetimeline/panel_converter_gen.go
+++ b/go/statetimeline/panel_converter_gen.go
@@ -396,6 +396,23 @@ func PanelConverter(input dashboard.Panel) string {
calls = append(calls, buffer.String())
buffer.Reset()

  • }
  • if input.FieldConfig != nil && input.FieldConfig.Defaults.Links != nil && len(input.FieldConfig.Defaults.Links) >= 1 {
  •   buffer.WriteString(`DataLinks(`)
    
  •   tmparg0 := []string{}
    
  •   for _, arg1 := range input.FieldConfig.Defaults.Links {
    
  •   	tmplinksarg1 := dashboard.DashboardLinkConverter(arg1)
    
  •   	tmparg0 = append(tmparg0, tmplinksarg1)
    
  •   }
    
  •   arg0 := "[]cog.Builder[dashboard.DashboardLink]{" + strings.Join(tmparg0, ",\n") + "}"
    
  •   buffer.WriteString(arg0)
    
  •   buffer.WriteString(")")
    
  •   calls = append(calls, buffer.String())
    
  •   buffer.Reset()
    
  • }
    if input.FieldConfig != nil && input.FieldConfig.Defaults.NoValue != nil && *input.FieldConfig.Defaults.NoValue != "" {

diff --git a/go/statushistory/panel_builder_gen.go b/go/statushistory/panel_builder_gen.go
index 51823090..8df11e9a 100644
--- a/go/statushistory/panel_builder_gen.go
+++ b/go/statushistory/panel_builder_gen.go
@@ -356,6 +356,25 @@ func (builder *PanelBuilder) ColorScheme(color cog.Builder[dashboard.FieldColor]
return builder
}

+// The behavior when clicking on a result
+func (builder *PanelBuilder) DataLinks(links []cog.Builder[dashboard.DashboardLink]) *PanelBuilder {

  • if builder.internal.FieldConfig == nil {
  •   builder.internal.FieldConfig = &dashboard.FieldConfigSource{}
    
  • }
  • linksResources := make([]dashboard.DashboardLink, 0, len(links))
  • for _, r1 := range links {
  •   linksDepth1, err := r1.Build()
    
  •   if err != nil {
    
  •   	builder.errors["fieldConfig.defaults.links"] = err.(cog.BuildErrors)
    
  •   	return builder
    
  •   }
    
  •   linksResources = append(linksResources, linksDepth1)
    
  • }
  • builder.internal.FieldConfig.Defaults.Links = linksResources
  • return builder
    +}

// Alternative to empty string
func (builder PanelBuilder) NoValue(noValue string) PanelBuilder {
if builder.internal.FieldConfig == nil {
diff --git a/go/statushistory/pan...
[Comment body truncated]

@Pokom
Copy link

Pokom commented Nov 7, 2024

@K-Phoen is there a public preview available anywhere?

@K-Phoen
Copy link
Member Author

K-Phoen commented Nov 7, 2024

Unfortunately not.

The build process is a bit convoluted, building and publishing previews isn't exactly trivial :/

But here's how it looks locally:

Screenshot 2024-11-07 at 14-17-18 Examples - Grafana Foundation SDK

@Pokom
Copy link

Pokom commented Nov 7, 2024

All good! I'm doing some work with updating Karpenters PR's and they use Netlify to host their pages. One cool bit is you get a preview link for docs: aws/karpenter-provider-aws#7250 (comment)

Let me pull locally and review the PR with the preview

@K-Phoen K-Phoen merged commit 2f4f77d into main Nov 8, 2024
14 checks passed
@K-Phoen K-Phoen deleted the docs-foundation-sdk-examples branch November 8, 2024 13:38
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants