diff --git a/apps/dashboard/pkg/apis/dashboard/types.go b/apps/dashboard/pkg/apis/dashboard/types.go
index 29d6f8458e3..e204bee7f37 100644
--- a/apps/dashboard/pkg/apis/dashboard/types.go
+++ b/apps/dashboard/pkg/apis/dashboard/types.go
@@ -3,8 +3,9 @@ package dashboard
// Information about how the requesting user can use a given dashboard
type DashboardAccess struct {
// Metadata fields
- Slug string `json:"slug,omitempty"`
- Url string `json:"url,omitempty"`
+ Slug string `json:"slug,omitempty"`
+ Url string `json:"url,omitempty"`
+ IsPublic bool `json:"isPublic"`
// The permissions part
CanSave bool `json:"canSave"`
diff --git a/apps/dashboard/pkg/apis/dashboard/v0alpha1/types.go b/apps/dashboard/pkg/apis/dashboard/v0alpha1/types.go
index 7f813a12a1f..d0b222ac7d2 100644
--- a/apps/dashboard/pkg/apis/dashboard/v0alpha1/types.go
+++ b/apps/dashboard/pkg/apis/dashboard/v0alpha1/types.go
@@ -12,8 +12,9 @@ type DashboardWithAccessInfo struct {
// +k8s:deepcopy-gen=true
type DashboardAccess struct {
// Metadata fields
- Slug string `json:"slug,omitempty"`
- Url string `json:"url,omitempty"`
+ Slug string `json:"slug,omitempty"`
+ Url string `json:"url,omitempty"`
+ IsPublic bool `json:"isPublic"`
// The permissions part
CanSave bool `json:"canSave"`
diff --git a/apps/dashboard/pkg/apis/dashboard/v0alpha1/zz_generated.conversion.go b/apps/dashboard/pkg/apis/dashboard/v0alpha1/zz_generated.conversion.go
index 626201ec314..48869b1c0e8 100644
--- a/apps/dashboard/pkg/apis/dashboard/v0alpha1/zz_generated.conversion.go
+++ b/apps/dashboard/pkg/apis/dashboard/v0alpha1/zz_generated.conversion.go
@@ -112,6 +112,7 @@ func Convert_dashboard_AnnotationPermission_To_v0alpha1_AnnotationPermission(in
func autoConvert_v0alpha1_DashboardAccess_To_dashboard_DashboardAccess(in *DashboardAccess, out *dashboard.DashboardAccess, s conversion.Scope) error {
out.Slug = in.Slug
out.Url = in.Url
+ out.IsPublic = in.IsPublic
out.CanSave = in.CanSave
out.CanEdit = in.CanEdit
out.CanAdmin = in.CanAdmin
@@ -129,6 +130,7 @@ func Convert_v0alpha1_DashboardAccess_To_dashboard_DashboardAccess(in *Dashboard
func autoConvert_dashboard_DashboardAccess_To_v0alpha1_DashboardAccess(in *dashboard.DashboardAccess, out *DashboardAccess, s conversion.Scope) error {
out.Slug = in.Slug
out.Url = in.Url
+ out.IsPublic = in.IsPublic
out.CanSave = in.CanSave
out.CanEdit = in.CanEdit
out.CanAdmin = in.CanAdmin
diff --git a/apps/dashboard/pkg/apis/dashboard/v0alpha1/zz_generated.openapi.go b/apps/dashboard/pkg/apis/dashboard/v0alpha1/zz_generated.openapi.go
index 1e81a87f2fa..b4a69d0031d 100644
--- a/apps/dashboard/pkg/apis/dashboard/v0alpha1/zz_generated.openapi.go
+++ b/apps/dashboard/pkg/apis/dashboard/v0alpha1/zz_generated.openapi.go
@@ -170,6 +170,13 @@ func schema_pkg_apis_dashboard_v0alpha1_DashboardAccess(ref common.ReferenceCall
Format: "",
},
},
+ "isPublic": {
+ SchemaProps: spec.SchemaProps{
+ Default: false,
+ Type: []string{"boolean"},
+ Format: "",
+ },
+ },
"canSave": {
SchemaProps: spec.SchemaProps{
Description: "The permissions part",
@@ -212,7 +219,7 @@ func schema_pkg_apis_dashboard_v0alpha1_DashboardAccess(ref common.ReferenceCall
},
},
},
- Required: []string{"canSave", "canEdit", "canAdmin", "canStar", "canDelete", "annotationsPermissions"},
+ Required: []string{"isPublic", "canSave", "canEdit", "canAdmin", "canStar", "canDelete", "annotationsPermissions"},
},
},
Dependencies: []string{
diff --git a/apps/dashboard/pkg/apis/dashboard/v1beta1/types.go b/apps/dashboard/pkg/apis/dashboard/v1beta1/types.go
index ee4125d8f6a..285c3661980 100644
--- a/apps/dashboard/pkg/apis/dashboard/v1beta1/types.go
+++ b/apps/dashboard/pkg/apis/dashboard/v1beta1/types.go
@@ -123,8 +123,9 @@ type DashboardWithAccessInfo struct {
// +k8s:deepcopy-gen=true
type DashboardAccess struct {
// Metadata fields
- Slug string `json:"slug,omitempty"`
- Url string `json:"url,omitempty"`
+ Slug string `json:"slug,omitempty"`
+ Url string `json:"url,omitempty"`
+ IsPublic bool `json:"isPublic"`
// The permissions part
CanSave bool `json:"canSave"`
diff --git a/apps/dashboard/pkg/apis/dashboard/v1beta1/zz_generated.conversion.go b/apps/dashboard/pkg/apis/dashboard/v1beta1/zz_generated.conversion.go
index e3f1f46785b..b8f76f5deb9 100644
--- a/apps/dashboard/pkg/apis/dashboard/v1beta1/zz_generated.conversion.go
+++ b/apps/dashboard/pkg/apis/dashboard/v1beta1/zz_generated.conversion.go
@@ -118,6 +118,7 @@ func Convert_dashboard_AnnotationPermission_To_v1beta1_AnnotationPermission(in *
func autoConvert_v1beta1_DashboardAccess_To_dashboard_DashboardAccess(in *DashboardAccess, out *dashboard.DashboardAccess, s conversion.Scope) error {
out.Slug = in.Slug
out.Url = in.Url
+ out.IsPublic = in.IsPublic
out.CanSave = in.CanSave
out.CanEdit = in.CanEdit
out.CanAdmin = in.CanAdmin
@@ -135,6 +136,7 @@ func Convert_v1beta1_DashboardAccess_To_dashboard_DashboardAccess(in *DashboardA
func autoConvert_dashboard_DashboardAccess_To_v1beta1_DashboardAccess(in *dashboard.DashboardAccess, out *DashboardAccess, s conversion.Scope) error {
out.Slug = in.Slug
out.Url = in.Url
+ out.IsPublic = in.IsPublic
out.CanSave = in.CanSave
out.CanEdit = in.CanEdit
out.CanAdmin = in.CanAdmin
diff --git a/apps/dashboard/pkg/apis/dashboard/v1beta1/zz_generated.openapi.go b/apps/dashboard/pkg/apis/dashboard/v1beta1/zz_generated.openapi.go
index be747be2ae3..3e2bdeab5f8 100644
--- a/apps/dashboard/pkg/apis/dashboard/v1beta1/zz_generated.openapi.go
+++ b/apps/dashboard/pkg/apis/dashboard/v1beta1/zz_generated.openapi.go
@@ -165,6 +165,13 @@ func schema_pkg_apis_dashboard_v1beta1_DashboardAccess(ref common.ReferenceCallb
Format: "",
},
},
+ "isPublic": {
+ SchemaProps: spec.SchemaProps{
+ Default: false,
+ Type: []string{"boolean"},
+ Format: "",
+ },
+ },
"canSave": {
SchemaProps: spec.SchemaProps{
Description: "The permissions part",
@@ -207,7 +214,7 @@ func schema_pkg_apis_dashboard_v1beta1_DashboardAccess(ref common.ReferenceCallb
},
},
},
- Required: []string{"canSave", "canEdit", "canAdmin", "canStar", "canDelete", "annotationsPermissions"},
+ Required: []string{"isPublic", "canSave", "canEdit", "canAdmin", "canStar", "canDelete", "annotationsPermissions"},
},
},
Dependencies: []string{
diff --git a/apps/dashboard/pkg/apis/dashboard/v2alpha1/types.go b/apps/dashboard/pkg/apis/dashboard/v2alpha1/types.go
index d3599063b7a..c48e2d00602 100644
--- a/apps/dashboard/pkg/apis/dashboard/v2alpha1/types.go
+++ b/apps/dashboard/pkg/apis/dashboard/v2alpha1/types.go
@@ -123,8 +123,9 @@ type DashboardWithAccessInfo struct {
// +k8s:deepcopy-gen=true
type DashboardAccess struct {
// Metadata fields
- Slug string `json:"slug,omitempty"`
- Url string `json:"url,omitempty"`
+ Slug string `json:"slug,omitempty"`
+ Url string `json:"url,omitempty"`
+ IsPublic bool `json:"isPublic"`
// The permissions part
CanSave bool `json:"canSave"`
diff --git a/apps/dashboard/pkg/apis/dashboard/v2alpha1/zz_generated.conversion.go b/apps/dashboard/pkg/apis/dashboard/v2alpha1/zz_generated.conversion.go
index fe4c7479194..0ac74fef54e 100644
--- a/apps/dashboard/pkg/apis/dashboard/v2alpha1/zz_generated.conversion.go
+++ b/apps/dashboard/pkg/apis/dashboard/v2alpha1/zz_generated.conversion.go
@@ -118,6 +118,7 @@ func Convert_dashboard_AnnotationPermission_To_v2alpha1_AnnotationPermission(in
func autoConvert_v2alpha1_DashboardAccess_To_dashboard_DashboardAccess(in *DashboardAccess, out *dashboard.DashboardAccess, s conversion.Scope) error {
out.Slug = in.Slug
out.Url = in.Url
+ out.IsPublic = in.IsPublic
out.CanSave = in.CanSave
out.CanEdit = in.CanEdit
out.CanAdmin = in.CanAdmin
@@ -135,6 +136,7 @@ func Convert_v2alpha1_DashboardAccess_To_dashboard_DashboardAccess(in *Dashboard
func autoConvert_dashboard_DashboardAccess_To_v2alpha1_DashboardAccess(in *dashboard.DashboardAccess, out *DashboardAccess, s conversion.Scope) error {
out.Slug = in.Slug
out.Url = in.Url
+ out.IsPublic = in.IsPublic
out.CanSave = in.CanSave
out.CanEdit = in.CanEdit
out.CanAdmin = in.CanAdmin
diff --git a/apps/dashboard/pkg/apis/dashboard/v2alpha1/zz_generated.openapi.go b/apps/dashboard/pkg/apis/dashboard/v2alpha1/zz_generated.openapi.go
index 548a8c93268..f5db9945589 100644
--- a/apps/dashboard/pkg/apis/dashboard/v2alpha1/zz_generated.openapi.go
+++ b/apps/dashboard/pkg/apis/dashboard/v2alpha1/zz_generated.openapi.go
@@ -265,6 +265,13 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardAccess(ref common.ReferenceCall
Format: "",
},
},
+ "isPublic": {
+ SchemaProps: spec.SchemaProps{
+ Default: false,
+ Type: []string{"boolean"},
+ Format: "",
+ },
+ },
"canSave": {
SchemaProps: spec.SchemaProps{
Description: "The permissions part",
@@ -307,7 +314,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardAccess(ref common.ReferenceCall
},
},
},
- Required: []string{"canSave", "canEdit", "canAdmin", "canStar", "canDelete", "annotationsPermissions"},
+ Required: []string{"isPublic", "canSave", "canEdit", "canAdmin", "canStar", "canDelete", "annotationsPermissions"},
},
},
Dependencies: []string{
diff --git a/apps/dashboard/pkg/apis/dashboard/v2beta1/types.go b/apps/dashboard/pkg/apis/dashboard/v2beta1/types.go
index 8ecda3cfd7d..07a0cf6da4f 100644
--- a/apps/dashboard/pkg/apis/dashboard/v2beta1/types.go
+++ b/apps/dashboard/pkg/apis/dashboard/v2beta1/types.go
@@ -123,8 +123,9 @@ type DashboardWithAccessInfo struct {
// +k8s:deepcopy-gen=true
type DashboardAccess struct {
// Metadata fields
- Slug string `json:"slug,omitempty"`
- Url string `json:"url,omitempty"`
+ Slug string `json:"slug,omitempty"`
+ Url string `json:"url,omitempty"`
+ IsPublic bool `json:"isPublic"`
// The permissions part
CanSave bool `json:"canSave"`
diff --git a/apps/dashboard/pkg/apis/dashboard/v2beta1/zz_generated.conversion.go b/apps/dashboard/pkg/apis/dashboard/v2beta1/zz_generated.conversion.go
index fce43178b8a..9d7ab0b1ee2 100644
--- a/apps/dashboard/pkg/apis/dashboard/v2beta1/zz_generated.conversion.go
+++ b/apps/dashboard/pkg/apis/dashboard/v2beta1/zz_generated.conversion.go
@@ -118,6 +118,7 @@ func Convert_dashboard_AnnotationPermission_To_v2beta1_AnnotationPermission(in *
func autoConvert_v2beta1_DashboardAccess_To_dashboard_DashboardAccess(in *DashboardAccess, out *dashboard.DashboardAccess, s conversion.Scope) error {
out.Slug = in.Slug
out.Url = in.Url
+ out.IsPublic = in.IsPublic
out.CanSave = in.CanSave
out.CanEdit = in.CanEdit
out.CanAdmin = in.CanAdmin
@@ -135,6 +136,7 @@ func Convert_v2beta1_DashboardAccess_To_dashboard_DashboardAccess(in *DashboardA
func autoConvert_dashboard_DashboardAccess_To_v2beta1_DashboardAccess(in *dashboard.DashboardAccess, out *DashboardAccess, s conversion.Scope) error {
out.Slug = in.Slug
out.Url = in.Url
+ out.IsPublic = in.IsPublic
out.CanSave = in.CanSave
out.CanEdit = in.CanEdit
out.CanAdmin = in.CanAdmin
diff --git a/apps/dashboard/pkg/apis/dashboard/v2beta1/zz_generated.openapi.go b/apps/dashboard/pkg/apis/dashboard/v2beta1/zz_generated.openapi.go
index f8108887a27..5c0c44e07c3 100644
--- a/apps/dashboard/pkg/apis/dashboard/v2beta1/zz_generated.openapi.go
+++ b/apps/dashboard/pkg/apis/dashboard/v2beta1/zz_generated.openapi.go
@@ -269,6 +269,13 @@ func schema_pkg_apis_dashboard_v2beta1_DashboardAccess(ref common.ReferenceCallb
Format: "",
},
},
+ "isPublic": {
+ SchemaProps: spec.SchemaProps{
+ Default: false,
+ Type: []string{"boolean"},
+ Format: "",
+ },
+ },
"canSave": {
SchemaProps: spec.SchemaProps{
Description: "The permissions part",
@@ -311,7 +318,7 @@ func schema_pkg_apis_dashboard_v2beta1_DashboardAccess(ref common.ReferenceCallb
},
},
},
- Required: []string{"canSave", "canEdit", "canAdmin", "canStar", "canDelete", "annotationsPermissions"},
+ Required: []string{"isPublic", "canSave", "canEdit", "canAdmin", "canStar", "canDelete", "annotationsPermissions"},
},
},
Dependencies: []string{
diff --git a/packages/grafana-api-clients/src/clients/rtkq/dashboard/v0alpha1/endpoints.gen.ts b/packages/grafana-api-clients/src/clients/rtkq/dashboard/v0alpha1/endpoints.gen.ts
index 6ca3505d067..4d23ca92514 100644
--- a/packages/grafana-api-clients/src/clients/rtkq/dashboard/v0alpha1/endpoints.gen.ts
+++ b/packages/grafana-api-clients/src/clients/rtkq/dashboard/v0alpha1/endpoints.gen.ts
@@ -845,6 +845,7 @@ export type DashboardAccess = {
/** The permissions part */
canSave: boolean;
canStar: boolean;
+ isPublic: boolean;
/** Metadata fields */
slug?: string;
url?: string;
diff --git a/packages/grafana-test-utils/src/handlers/apis/dashboard.grafana.app/v1beta1/handlers.ts b/packages/grafana-test-utils/src/handlers/apis/dashboard.grafana.app/v1beta1/handlers.ts
index 0c9c364780d..251ca44e766 100644
--- a/packages/grafana-test-utils/src/handlers/apis/dashboard.grafana.app/v1beta1/handlers.ts
+++ b/packages/grafana-test-utils/src/handlers/apis/dashboard.grafana.app/v1beta1/handlers.ts
@@ -27,6 +27,7 @@ const dashboardToAppPlatform = (dashboard: (typeof mockTree)[number]['item']) =>
},
status: {},
// TODO: Eventually add access properties, as required by tests
+ access: {},
};
};
diff --git a/pkg/registry/apis/dashboard/register.go b/pkg/registry/apis/dashboard/register.go
index b21877720cd..cb351569358 100644
--- a/pkg/registry/apis/dashboard/register.go
+++ b/pkg/registry/apis/dashboard/register.go
@@ -53,6 +53,7 @@ import (
"github.com/grafana/grafana/pkg/services/libraryelements"
"github.com/grafana/grafana/pkg/services/librarypanels"
"github.com/grafana/grafana/pkg/services/provisioning"
+ "github.com/grafana/grafana/pkg/services/publicdashboards"
"github.com/grafana/grafana/pkg/services/quota"
"github.com/grafana/grafana/pkg/services/search/sort"
"github.com/grafana/grafana/pkg/services/user"
@@ -112,6 +113,7 @@ type DashboardsAPIBuilder struct {
dualWriter dualwrite.Service
folderClientProvider client.K8sHandlerProvider
libraryPanels libraryelements.Service // for legacy library panels
+ publicDashboardService publicdashboards.Service
isStandalone bool // skips any handling including anything to do with legacy storage
}
@@ -140,6 +142,7 @@ func RegisterAPIService(
restConfigProvider apiserver.RestConfigProvider,
userService user.Service,
libraryPanels libraryelements.Service,
+ publicDashboardService publicdashboards.Service,
) *DashboardsAPIBuilder {
dbp := legacysql.NewDatabaseProvider(sql)
namespacer := request.GetNamespaceMapper(cfg)
@@ -163,6 +166,7 @@ func RegisterAPIService(
dualWriter: dual,
folderClientProvider: newSimpleFolderClientProvider(folderClient),
libraryPanels: libraryPanels,
+ publicDashboardService: publicDashboardService,
legacy: &DashboardStorage{
Access: legacy.NewDashboardAccess(dbp, namespacer, dashStore, provisioning, libraryPanelSvc, sorter, dashboardPermissionsSvc, accessControl, features),
@@ -652,6 +656,7 @@ func (b *DashboardsAPIBuilder) storageForVersion(
b.accessControl,
opts.Scheme,
newDTOFunc,
+ b.publicDashboardService,
)
if err != nil {
return err
diff --git a/pkg/registry/apis/dashboard/sub_dto.go b/pkg/registry/apis/dashboard/sub_dto.go
index 30e58e0d22e..f2e9bc0b6df 100644
--- a/pkg/registry/apis/dashboard/sub_dto.go
+++ b/pkg/registry/apis/dashboard/sub_dto.go
@@ -19,6 +19,7 @@ import (
"github.com/grafana/grafana/pkg/services/accesscontrol"
"github.com/grafana/grafana/pkg/services/apiserver/endpoints/request"
"github.com/grafana/grafana/pkg/services/dashboards"
+ "github.com/grafana/grafana/pkg/services/publicdashboards"
"github.com/grafana/grafana/pkg/storage/unified/apistore"
"github.com/grafana/grafana/pkg/storage/unified/resource"
"github.com/grafana/grafana/pkg/storage/unified/resourcepb"
@@ -28,13 +29,14 @@ type dtoBuilder = func(dashboard runtime.Object, access *dashboard.DashboardAcce
// The DTO returns everything the UI needs in a single request
type DTOConnector struct {
- getter rest.Getter
- legacy legacy.DashboardAccess
- unified resource.ResourceClient
- largeObjects apistore.LargeObjectSupport
- accessControl accesscontrol.AccessControl
- scheme *runtime.Scheme
- builder dtoBuilder
+ getter rest.Getter
+ legacy legacy.DashboardAccess
+ unified resource.ResourceClient
+ largeObjects apistore.LargeObjectSupport
+ accessControl accesscontrol.AccessControl
+ scheme *runtime.Scheme
+ builder dtoBuilder
+ publicDashboardService publicdashboards.Service
}
func NewDTOConnector(
@@ -45,15 +47,17 @@ func NewDTOConnector(
accessControl accesscontrol.AccessControl,
scheme *runtime.Scheme,
builder dtoBuilder,
+ publicDashboardService publicdashboards.Service,
) (rest.Storage, error) {
return &DTOConnector{
- getter: getter,
- legacy: legacyAccess,
- accessControl: accessControl,
- unified: resourceClient,
- largeObjects: largeObjects,
- builder: builder,
- scheme: scheme,
+ getter: getter,
+ legacy: legacyAccess,
+ accessControl: accessControl,
+ unified: resourceClient,
+ largeObjects: largeObjects,
+ builder: builder,
+ scheme: scheme,
+ publicDashboardService: publicDashboardService,
}, nil
}
@@ -154,6 +158,11 @@ func (r *DTOConnector) Connect(ctx context.Context, name string, opts runtime.Ob
access.Slug = slugify.Slugify(title)
access.Url = dashboards.GetDashboardFolderURL(false, name, access.Slug)
+ pubDash, err := r.publicDashboardService.FindByDashboardUid(ctx, user.GetOrgID(), name)
+ if err == nil && pubDash != nil {
+ access.IsPublic = true
+ }
+
dash, err := r.builder(rawobj, access)
if err != nil {
responder.Error(err)
diff --git a/pkg/server/wire_gen.go b/pkg/server/wire_gen.go
index 42ef5427c90..417b4aeeb4d 100644
--- a/pkg/server/wire_gen.go
+++ b/pkg/server/wire_gen.go
@@ -840,7 +840,7 @@ func Initialize(ctx context.Context, cfg *setting.Cfg, opts Options, apiOpts api
identitySynchronizer := authnimpl.ProvideIdentitySynchronizer(authnimplService)
ldapImpl := service12.ProvideService(cfg, featureToggles, ssosettingsimplService)
apiService := api4.ProvideService(cfg, routeRegisterImpl, accessControl, userService, authinfoimplService, ossGroups, identitySynchronizer, orgService, ldapImpl, userAuthTokenService, bundleregistryService)
- dashboardsAPIBuilder := dashboard.RegisterAPIService(cfg, featureToggles, apiserverService, dashboardService, dashboardProvisioningService, service15, dashboardServiceImpl, dashboardPermissionsService, accessControl, accessClient, provisioningServiceImpl, dashboardsStore, registerer, sqlStore, tracingService, resourceClient, dualwriteService, sortService, quotaService, libraryPanelService, eventualRestConfigProvider, userService, libraryElementService)
+ dashboardsAPIBuilder := dashboard.RegisterAPIService(cfg, featureToggles, apiserverService, dashboardService, dashboardProvisioningService, service15, dashboardServiceImpl, dashboardPermissionsService, accessControl, accessClient, provisioningServiceImpl, dashboardsStore, registerer, sqlStore, tracingService, resourceClient, dualwriteService, sortService, quotaService, libraryPanelService, eventualRestConfigProvider, userService, libraryElementService, publicDashboardServiceImpl)
snapshotsAPIBuilder := dashboardsnapshot.RegisterAPIService(serviceImpl, apiserverService, cfg, featureToggles, sqlStore, registerer)
dataSourceAPIBuilder, err := datasource.RegisterAPIService(configProvider, featureToggles, apiserverService, middlewareHandler, scopedPluginDatasourceProvider, plugincontextProvider, accessControl, registerer)
if err != nil {
@@ -1474,7 +1474,7 @@ func InitializeForTest(ctx context.Context, t sqlutil.ITestDB, testingT interfac
identitySynchronizer := authnimpl.ProvideIdentitySynchronizer(authnimplService)
ldapImpl := service12.ProvideService(cfg, featureToggles, ssosettingsimplService)
apiService := api4.ProvideService(cfg, routeRegisterImpl, accessControl, userService, authinfoimplService, ossGroups, identitySynchronizer, orgService, ldapImpl, userAuthTokenService, bundleregistryService)
- dashboardsAPIBuilder := dashboard.RegisterAPIService(cfg, featureToggles, apiserverService, dashboardService, dashboardProvisioningService, service15, dashboardServiceImpl, dashboardPermissionsService, accessControl, accessClient, provisioningServiceImpl, dashboardsStore, registerer, sqlStore, tracingService, resourceClient, dualwriteService, sortService, quotaService, libraryPanelService, eventualRestConfigProvider, userService, libraryElementService)
+ dashboardsAPIBuilder := dashboard.RegisterAPIService(cfg, featureToggles, apiserverService, dashboardService, dashboardProvisioningService, service15, dashboardServiceImpl, dashboardPermissionsService, accessControl, accessClient, provisioningServiceImpl, dashboardsStore, registerer, sqlStore, tracingService, resourceClient, dualwriteService, sortService, quotaService, libraryPanelService, eventualRestConfigProvider, userService, libraryElementService, publicDashboardServiceImpl)
snapshotsAPIBuilder := dashboardsnapshot.RegisterAPIService(serviceImpl, apiserverService, cfg, featureToggles, sqlStore, registerer)
dataSourceAPIBuilder, err := datasource.RegisterAPIService(configProvider, featureToggles, apiserverService, middlewareHandler, scopedPluginDatasourceProvider, plugincontextProvider, accessControl, registerer)
if err != nil {
diff --git a/pkg/tests/apis/openapi_snapshots/dashboard.grafana.app-v0alpha1.json b/pkg/tests/apis/openapi_snapshots/dashboard.grafana.app-v0alpha1.json
index b9c3ee36a91..e53e6509bc1 100644
--- a/pkg/tests/apis/openapi_snapshots/dashboard.grafana.app-v0alpha1.json
+++ b/pkg/tests/apis/openapi_snapshots/dashboard.grafana.app-v0alpha1.json
@@ -2324,6 +2324,7 @@
"com.github.grafana.grafana.apps.dashboard.pkg.apis.dashboard.v0alpha1.DashboardAccess": {
"type": "object",
"required": [
+ "isPublic",
"canSave",
"canEdit",
"canAdmin",
@@ -2356,6 +2357,10 @@
"type": "boolean",
"default": false
},
+ "isPublic": {
+ "type": "boolean",
+ "default": false
+ },
"slug": {
"description": "Metadata fields",
"type": "string"
diff --git a/pkg/tests/apis/openapi_snapshots/dashboard.grafana.app-v1beta1.json b/pkg/tests/apis/openapi_snapshots/dashboard.grafana.app-v1beta1.json
index 4ae094ff867..363af97fb34 100644
--- a/pkg/tests/apis/openapi_snapshots/dashboard.grafana.app-v1beta1.json
+++ b/pkg/tests/apis/openapi_snapshots/dashboard.grafana.app-v1beta1.json
@@ -1018,6 +1018,7 @@
"description": "Information about how the requesting user can use a given dashboard",
"type": "object",
"required": [
+ "isPublic",
"canSave",
"canEdit",
"canAdmin",
@@ -1050,6 +1051,10 @@
"type": "boolean",
"default": false
},
+ "isPublic": {
+ "type": "boolean",
+ "default": false
+ },
"slug": {
"description": "Metadata fields",
"type": "string"
diff --git a/pkg/tests/apis/openapi_snapshots/dashboard.grafana.app-v2alpha1.json b/pkg/tests/apis/openapi_snapshots/dashboard.grafana.app-v2alpha1.json
index d8962a72a5d..56d972f6514 100644
--- a/pkg/tests/apis/openapi_snapshots/dashboard.grafana.app-v2alpha1.json
+++ b/pkg/tests/apis/openapi_snapshots/dashboard.grafana.app-v2alpha1.json
@@ -1019,6 +1019,7 @@
"description": "Information about how the requesting user can use a given dashboard",
"type": "object",
"required": [
+ "isPublic",
"canSave",
"canEdit",
"canAdmin",
@@ -1051,6 +1052,10 @@
"type": "boolean",
"default": false
},
+ "isPublic": {
+ "type": "boolean",
+ "default": false
+ },
"slug": {
"description": "Metadata fields",
"type": "string"
diff --git a/public/app/features/dashboard-scene/scene/new-toolbar/actions/PublicDashboardBadge.tsx b/public/app/features/dashboard-scene/scene/new-toolbar/actions/PublicDashboardBadge.tsx
index 58df0c52c7e..1687e099574 100644
--- a/public/app/features/dashboard-scene/scene/new-toolbar/actions/PublicDashboardBadge.tsx
+++ b/public/app/features/dashboard-scene/scene/new-toolbar/actions/PublicDashboardBadge.tsx
@@ -13,17 +13,26 @@ export const PublicDashboardBadge = ({ dashboard }: ToolbarActionProps) => {
return null;
}
- return ;
+ return (
+
+ );
};
// Used in old architecture
export const PublicDashboardBadgeLegacy = PublicDashboardBadgeInternal;
-function PublicDashboardBadgeInternal({ uid }: { uid: string }) {
- const { data: publicDashboard } = useGetPublicDashboardQuery(uid);
+function PublicDashboardBadgeInternal({ uid, hasPublicDashboard }: { uid: string; hasPublicDashboard?: boolean }) {
+ const { data: publicDashboard } = useGetPublicDashboardQuery(uid, {
+ skip: hasPublicDashboard !== undefined && !hasPublicDashboard,
+ });
const styles = useStyles2(getStyles);
- if (!publicDashboard) {
+ const showBadge = hasPublicDashboard !== undefined ? hasPublicDashboard : !!publicDashboard;
+
+ if (!showBadge) {
return null;
}
diff --git a/public/app/features/dashboard-scene/serialization/transformSaveModelSchemaV2ToScene.ts b/public/app/features/dashboard-scene/serialization/transformSaveModelSchemaV2ToScene.ts
index 2a2f96caa30..490429f5712 100644
--- a/public/app/features/dashboard-scene/serialization/transformSaveModelSchemaV2ToScene.ts
+++ b/public/app/features/dashboard-scene/serialization/transformSaveModelSchemaV2ToScene.ts
@@ -148,6 +148,7 @@ export function transformSaveModelSchemaV2ToScene(dto: DashboardWithAccessInfo extends Resource {
k8s: dash.metadata,
version: dash.metadata.generation,
created: dash.metadata.creationTimestamp,
+ publicDashboardEnabled: dash.access.isPublic,
},
dashboard: {
...dash.spec,