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,