diff --git a/pkg/api/api.go b/pkg/api/api.go index ed73f2dc76d..6ea5bcd7c95 100644 --- a/pkg/api/api.go +++ b/pkg/api/api.go @@ -113,6 +113,9 @@ func Register(r *macaron.Macaron) { r.Put("/password", bind(m.ChangeUserPasswordCommand{}), wrap(ChangeUserPassword)) r.Get("/quotas", wrap(GetUserQuotas)) + r.Put("/helpflags/:id", wrap(SetHelpFlag)) + // For dev purpose + r.Get("/helpflags/clear", wrap(ClearHelpFlags)) r.Get("/preferences", wrap(GetUserPreferences)) r.Put("/preferences", bind(dtos.UpdatePrefsCmd{}), wrap(UpdateUserPreferences)) diff --git a/pkg/api/dtos/models.go b/pkg/api/dtos/models.go index 170a5a868fc..7f8d107d9f4 100644 --- a/pkg/api/dtos/models.go +++ b/pkg/api/dtos/models.go @@ -22,19 +22,20 @@ type LoginCommand struct { } type CurrentUser struct { - IsSignedIn bool `json:"isSignedIn"` - Id int64 `json:"id"` - Login string `json:"login"` - Email string `json:"email"` - Name string `json:"name"` - LightTheme bool `json:"lightTheme"` - OrgId int64 `json:"orgId"` - OrgName string `json:"orgName"` - OrgRole m.RoleType `json:"orgRole"` - IsGrafanaAdmin bool `json:"isGrafanaAdmin"` - GravatarUrl string `json:"gravatarUrl"` - Timezone string `json:"timezone"` - Locale string `json:"locale"` + IsSignedIn bool `json:"isSignedIn"` + Id int64 `json:"id"` + Login string `json:"login"` + Email string `json:"email"` + Name string `json:"name"` + LightTheme bool `json:"lightTheme"` + OrgId int64 `json:"orgId"` + OrgName string `json:"orgName"` + OrgRole m.RoleType `json:"orgRole"` + IsGrafanaAdmin bool `json:"isGrafanaAdmin"` + GravatarUrl string `json:"gravatarUrl"` + Timezone string `json:"timezone"` + Locale string `json:"locale"` + HelpFlags1 m.HelpFlags1 `json:"helpFlags1"` } type DashboardMeta struct { diff --git a/pkg/api/index.go b/pkg/api/index.go index 99a5f78f9c9..5bc4344a8ba 100644 --- a/pkg/api/index.go +++ b/pkg/api/index.go @@ -58,6 +58,7 @@ func setIndexViewData(c *middleware.Context) (*dtos.IndexViewData, error) { LightTheme: prefs.Theme == "light", Timezone: prefs.Timezone, Locale: locale, + HelpFlags1: c.HelpFlags1, }, Settings: settings, AppUrl: appUrl, diff --git a/pkg/api/user.go b/pkg/api/user.go index f98eec02c40..715103aacbd 100644 --- a/pkg/api/user.go +++ b/pkg/api/user.go @@ -180,3 +180,34 @@ func SearchUsers(c *middleware.Context) Response { return Json(200, query.Result) } + +func SetHelpFlag(c *middleware.Context) Response { + flag := c.ParamsInt64(":id") + + bitmask := &c.HelpFlags1 + bitmask.AddFlag(m.HelpFlags1(flag)) + + cmd := m.SetUserHelpFlagCommand{ + UserId: c.UserId, + HelpFlags1: *bitmask, + } + + if err := bus.Dispatch(&cmd); err != nil { + return ApiError(500, "Failed to update help flag", err) + } + + return Json(200, &util.DynMap{"message": "Help flag set", "helpFlags1": cmd.HelpFlags1}) +} + +func ClearHelpFlags(c *middleware.Context) Response { + cmd := m.SetUserHelpFlagCommand{ + UserId: c.UserId, + HelpFlags1: m.HelpFlags1(0), + } + + if err := bus.Dispatch(&cmd); err != nil { + return ApiError(500, "Failed to update help flag", err) + } + + return Json(200, &util.DynMap{"message": "Help flag set", "helpFlags1": cmd.HelpFlags1}) +} diff --git a/pkg/models/helpflags.go b/pkg/models/helpflags.go new file mode 100644 index 00000000000..1bab730e265 --- /dev/null +++ b/pkg/models/helpflags.go @@ -0,0 +1,18 @@ +package models + +type HelpFlags1 uint64 + +const ( + HelpFlagGettingStartedPanelDismissed HelpFlags1 = 1 << iota + HelpFlagDashboardHelp1 +) + +func (f HelpFlags1) HasFlag(flag HelpFlags1) bool { return f&flag != 0 } +func (f *HelpFlags1) AddFlag(flag HelpFlags1) { *f |= flag } +func (f *HelpFlags1) ClearFlag(flag HelpFlags1) { *f &= ^flag } +func (f *HelpFlags1) ToggleFlag(flag HelpFlags1) { *f ^= flag } + +type SetUserHelpFlagCommand struct { + HelpFlags1 HelpFlags1 + UserId int64 +} diff --git a/pkg/models/user.go b/pkg/models/user.go index 1f99f866c86..8bfad7c2fb4 100644 --- a/pkg/models/user.go +++ b/pkg/models/user.go @@ -22,6 +22,7 @@ type User struct { Company string EmailVerified bool Theme string + HelpFlags1 HelpFlags1 IsAdmin bool OrgId int64 @@ -144,6 +145,7 @@ type SignedInUser struct { Email string ApiKeyId int64 IsGrafanaAdmin bool + HelpFlags1 HelpFlags1 } type UserProfileDTO struct { diff --git a/pkg/services/sqlstore/migrations/user_mig.go b/pkg/services/sqlstore/migrations/user_mig.go index 51db4d74857..67446f64d1a 100644 --- a/pkg/services/sqlstore/migrations/user_mig.go +++ b/pkg/services/sqlstore/migrations/user_mig.go @@ -88,4 +88,8 @@ func addUserMigrations(mg *Migrator) { })) mg.AddMigration("Drop old table user_v1", NewDropTableMigration("user_v1")) + + mg.AddMigration("Add column help_flags1 to user table", NewAddColumnMigration(userV2, &Column{ + Name: "help_flags1", Type: DB_BigInt, Nullable: false, Default: "0", + })) } diff --git a/pkg/services/sqlstore/user.go b/pkg/services/sqlstore/user.go index bb21995f54a..b26a9153f55 100644 --- a/pkg/services/sqlstore/user.go +++ b/pkg/services/sqlstore/user.go @@ -28,6 +28,7 @@ func init() { bus.AddHandler("sql", DeleteUser) bus.AddHandler("sql", SetUsingOrg) bus.AddHandler("sql", UpdateUserPermissions) + bus.AddHandler("sql", SetUserHelpFlag) } func getOrgIdForNewUser(cmd *m.CreateUserCommand, sess *session) (int64, error) { @@ -207,7 +208,7 @@ func GetUserByEmail(query *m.GetUserByEmailQuery) error { if err != nil { return err } else if has == false { - return m.ErrUserNotFound + return m.ErrUserNotFound } query.Result = user @@ -308,6 +309,7 @@ func GetSignedInUser(query *m.GetSignedInUserQuery) error { u.email as email, u.login as login, u.name as name, + u.help_flags1 as help_flags1, org.name as org_name, org_user.role as org_role, org.id as org_id @@ -380,3 +382,20 @@ func UpdateUserPermissions(cmd *m.UpdateUserPermissionsCommand) error { return err }) } + +func SetUserHelpFlag(cmd *m.SetUserHelpFlagCommand) error { + return inTransaction2(func(sess *session) error { + + user := m.User{ + Id: cmd.UserId, + HelpFlags1: cmd.HelpFlags1, + Updated: time.Now(), + } + + if _, err := sess.Id(cmd.UserId).Cols("help_flags1").Update(&user); err != nil { + return err + } + + return nil + }) +} diff --git a/public/app/core/services/backend_srv.ts b/public/app/core/services/backend_srv.ts index 1e620e88216..9a5ec5d219b 100644 --- a/public/app/core/services/backend_srv.ts +++ b/public/app/core/services/backend_srv.ts @@ -74,7 +74,9 @@ export class BackendSrv { return this.$http(options).then(results => { if (options.method !== 'GET') { if (results && results.data.message) { - this.alertSrv.set(results.data.message, '', 'success', 3000); + if (options.showSuccessAlert !== false) { + this.alertSrv.set(results.data.message, '', 'success', 3000); + } } } return results.data; diff --git a/public/app/core/services/context_srv.ts b/public/app/core/services/context_srv.ts index ac00528db20..3d048e4f869 100644 --- a/public/app/core/services/context_srv.ts +++ b/public/app/core/services/context_srv.ts @@ -10,6 +10,7 @@ export class User { isSignedIn: any; orgRole: any; timezone: string; + helpFlags1: number; constructor() { if (config.bootData.user) { diff --git a/public/app/features/dashboard/row/add_panel.ts b/public/app/features/dashboard/row/add_panel.ts index 3e2dc9e31d8..189108d9b4a 100644 --- a/public/app/features/dashboard/row/add_panel.ts +++ b/public/app/features/dashboard/row/add_panel.ts @@ -84,11 +84,8 @@ export class AddPanelCtrl { var panel = { id: null, title: config.new_panel_title, - error: false, span: span < defaultSpan && span > 0 ? span : defaultSpan, - editable: true, type: panelPluginInfo.id, - isNew: true, }; this.rowCtrl.closeDropView(); diff --git a/public/app/features/dashboard/row/row_model.ts b/public/app/features/dashboard/row/row_model.ts index 0729d43bf0a..cbde701ccfe 100644 --- a/public/app/features/dashboard/row/row_model.ts +++ b/public/app/features/dashboard/row/row_model.ts @@ -19,7 +19,6 @@ export class DashboardRow { showTitle: false, titleSize: 'h6', height: 250, - isNew: false, repeat: null, repeatRowId: null, repeatIteration: null, diff --git a/public/app/plugins/panel/gettingstarted/module.html b/public/app/plugins/panel/gettingstarted/module.html index ac18a53bd4d..0c319a46d81 100644 --- a/public/app/plugins/panel/gettingstarted/module.html +++ b/public/app/plugins/panel/gettingstarted/module.html @@ -2,23 +2,34 @@
Getting Started with Grafana - +
-