mirror of
https://github.com/grafana/grafana.git
synced 2025-01-21 05:53:42 -06:00
cfdea1ee30
* add isPublic to dashboard * refactor routes to use route group and add placeholder method for sharing apii * add sharing pane and utils for public dashboard config to sharing modal * Sharing modal now persists data through the api * moves ShareDashboard endpoint to new file and starts adding tests * generates mocks. Adds tests for public dashboard feature flag * Adds ability to pass in array of features to enable for the test * test to update public flag on dashboard WIP * Adds mock for SaveDashboardSharingConfig * Fixes tests. Had to use FakeDashboardService * Adds React tests for public dashboards toggle * removes semicolons * refactors SharePublic component to use hooks * rename from `share publicly` to `public dashboard config` * checkpoint. debugging tests. need to verify name changes * checkpoint. test bugs fixed. need to finish returning proper response codes * finish renaming. fix test * Update pkg/api/api.go Co-authored-by: Torkel Ödegaard <torkel@grafana.com> * update backend url * rename internal objects and commands. fix configuration modal labels * add endpoint for retrieving public dashboard configuration and populate the frontend state from it * add test for dashboardCanBePublic * adds backend routes * copy DashboardPage component into component for public dashboards. WIP * adds react routes, and doesnt render main nav bar when viewing a public route * removes extra react route from testing * updates component name * Wrap the original dashboard component so we can pass props relevant to public dashboards, turn kiosk mode on/off, etc * Wraps DashboardPage in PublicDashboardPage component. DashboardPage gets rendered in kiosk mode when public prop is passed. * removes commented out code from exploratory work * Makes public dashboard routes require no auth * extracts helper to own util file to check if were viewing a public page * Hides panel dropdown when its being viewed publicly * formatting * use function from utils file for determining if publicly viewed. If public, hides app notifications, searchwrapper, and commandpalette. * adds unit tests for util function used to see if page is being viewed publicly * cant added annotations to panel when being publicly viewed * removes useless comment * hides backend and frontend pubdash routes behind feature flag * consider feature flag when checking url path to see if on public dashboard * renames function * still render app notifications when in public view * Extract pubdash route logic into own file * fixes failing tests * Determines path using location locationUtils. This covers the case when grafana is being hosted on a subpath. Updates tests. * renames pubdash web route to be more understandable * rename route * fixes failing test * fixes failing test. Needed to update pubdash urls * sets flag on grafana boot config for if viewing public dashboard. Removes hacky check that looks at the url * fixes failing tests. Uses config to determine if viewing public dashboard * renders the blue panel timeInfo on public dashboard panel * Extracts conditional logic for rendering components out into their own functions * removes publicDashboardView check, and uses dashboard meta instead * the timeInfo is always displayed on the panel * After fetch of public dashboard dto, the meta isPublic flag gets set and used to determine if viewing public dashboard for child components. Fixes tests for PanelHeader. * Fixes failing test. Needed to add isPublic flag to dashboard meta. Co-authored-by: Jeff Levin <jeff@levinology.com> Co-authored-by: Torkel Ödegaard <torkel@grafana.com>
101 lines
2.3 KiB
Go
101 lines
2.3 KiB
Go
package models
|
|
|
|
import (
|
|
"strings"
|
|
|
|
"github.com/grafana/grafana/pkg/infra/log"
|
|
"github.com/grafana/grafana/pkg/infra/tracing"
|
|
"github.com/grafana/grafana/pkg/setting"
|
|
"github.com/grafana/grafana/pkg/web"
|
|
"github.com/prometheus/client_golang/prometheus"
|
|
)
|
|
|
|
type ReqContext struct {
|
|
*web.Context
|
|
*SignedInUser
|
|
UserToken *UserToken
|
|
|
|
IsSignedIn bool
|
|
IsRenderCall bool
|
|
AllowAnonymous bool
|
|
SkipCache bool
|
|
Logger log.Logger
|
|
// RequestNonce is a cryptographic request identifier for use with Content Security Policy.
|
|
RequestNonce string
|
|
IsPublicDashboardView bool
|
|
|
|
PerfmonTimer prometheus.Summary
|
|
LookupTokenErr error
|
|
}
|
|
|
|
// Handle handles and logs error by given status.
|
|
func (ctx *ReqContext) Handle(cfg *setting.Cfg, status int, title string, err error) {
|
|
data := struct {
|
|
Title string
|
|
AppTitle string
|
|
AppSubUrl string
|
|
Theme string
|
|
ErrorMsg error
|
|
}{title, "Grafana", cfg.AppSubURL, "dark", nil}
|
|
if err != nil {
|
|
ctx.Logger.Error(title, "error", err)
|
|
if setting.Env != setting.Prod {
|
|
data.ErrorMsg = err
|
|
}
|
|
}
|
|
|
|
ctx.HTML(status, cfg.ErrTemplateName, data)
|
|
}
|
|
|
|
func (ctx *ReqContext) IsApiRequest() bool {
|
|
return strings.HasPrefix(ctx.Req.URL.Path, "/api")
|
|
}
|
|
|
|
func (ctx *ReqContext) JsonApiErr(status int, message string, err error) {
|
|
resp := make(map[string]interface{})
|
|
traceID := tracing.TraceIDFromContext(ctx.Req.Context(), false)
|
|
|
|
if err != nil {
|
|
resp["traceID"] = traceID
|
|
ctx.Logger.Error(message, "error", err, "traceID", traceID)
|
|
if setting.Env != setting.Prod {
|
|
resp["error"] = err.Error()
|
|
}
|
|
}
|
|
|
|
switch status {
|
|
case 404:
|
|
resp["message"] = "Not Found"
|
|
case 500:
|
|
resp["message"] = "Internal Server Error"
|
|
}
|
|
|
|
if message != "" {
|
|
resp["message"] = message
|
|
}
|
|
|
|
ctx.JSON(status, resp)
|
|
}
|
|
|
|
func (ctx *ReqContext) HasUserRole(role RoleType) bool {
|
|
return ctx.OrgRole.Includes(role)
|
|
}
|
|
|
|
func (ctx *ReqContext) HasHelpFlag(flag HelpFlags1) bool {
|
|
return ctx.HelpFlags1.HasFlag(flag)
|
|
}
|
|
|
|
func (ctx *ReqContext) TimeRequest(timer prometheus.Summary) {
|
|
ctx.PerfmonTimer = timer
|
|
}
|
|
|
|
// QueryBoolWithDefault extracts a value from the request query params and applies a bool default if not present.
|
|
func (ctx *ReqContext) QueryBoolWithDefault(field string, d bool) bool {
|
|
f := ctx.Query(field)
|
|
if f == "" {
|
|
return d
|
|
}
|
|
|
|
return ctx.QueryBool(field)
|
|
}
|