diff --git a/' b/' new file mode 100644 index 00000000000..61ae44e0aba --- /dev/null +++ b/' @@ -0,0 +1,134 @@ + + +.sidemenu { + display: flex; + flex-flow: column; + flex-direction: column; + width: $side-menu-width; + background-color: $side-menu-bg; + z-index: 1; + + a:focus { + text-decoration: none; + } +} + +.sidemenu__top { + flex-grow: 1; +} + +.sidemenu__bottom { + padding-bottom: $spacer; +} + +.sidemenu-item { + position: relative; + @include left-brand-border(); + + &.active, + &:hover { + background-color: $side-menu-item-hover-bg; + @include left-brand-border-gradient(); + + .dropdown-menu { + margin: 0; + display: block; + opacity: 0; + top: 0px; + // important to overlap it otherwise it can be hidden + // again by the mouse getting outside the hover space + left: $side-menu-width - 2px; + @include animation('dropdown-anim 100ms ease-in-out 100ms forwards'); + z-index: 1; + } + } +} + +.dropup.sidemenu-item:hover .dropdown-menu { + top: auto !important; +} + +.sidemenu-link { + color: $link-color; + line-height: 42px; + padding: 0px 10px 0px 10px; + display: block; + position: relative; + font-size: 16px; + border: 1px solid transparent; + + img { + border-radius: 50%; + width: 28px; + height: 28px; + box-shadow: 0 0 14px 2px rgba(255,255,255, 0.05); + } +} + +@include keyframes(dropdown-anim) { + 0% { + opacity: 0; + //transform: translate3d(-5%,0,0); + } + 100% { + opacity: 1; + //transform: translate3d(0,0,0); + } +} + +.icon-circle { + width: 35px; + height: 35px; + display: inline-block; + i { + color: $link-color; + opacity: .7; + position: relative; + left: 3px; + font-size: 130%; + } + + .fa { + top: 2px; + } + + .icon-gf { + top: 5px; + } + + img { + left: 3px; + position: relative; + } +} + +.side-menu-header { + padding: 10px 10px 10px 20px; + white-space: nowrap; + background-color: $side-menu-item-hover-bg; + font-size: 17px; +} + +li.sidemenu-org-switcher { + border-bottom: 1px solid $dropdownDividerBottom; +} + +.sidemenu-org-switcher__org-name { + font-size: $font-size-base; +} + +.sidemenu-org-switcher__org-current { + font-size: $font-size-xs; + color: $text-color-weak; +} + +.sidemenu-org-switcher__switch { + font-size: $font-size-sm; + padding-left: 1.5rem; + display: flex; + align-items: center; + i.fa > { + margin-right: 5px; + top: 0; + } +} diff --git a/pkg/api/dtos/models.go b/pkg/api/dtos/models.go index d1c346e9539..b155858c58c 100644 --- a/pkg/api/dtos/models.go +++ b/pkg/api/dtos/models.go @@ -27,6 +27,7 @@ type CurrentUser struct { Email string `json:"email"` Name string `json:"name"` LightTheme bool `json:"lightTheme"` + OrgCount int `json:"orgCount"` OrgId int64 `json:"orgId"` OrgName string `json:"orgName"` OrgRole m.RoleType `json:"orgRole"` diff --git a/pkg/api/frontendsettings.go b/pkg/api/frontendsettings.go index 2693d5f9683..53d72d411ef 100644 --- a/pkg/api/frontendsettings.go +++ b/pkg/api/frontendsettings.go @@ -141,7 +141,6 @@ func getFrontendSettingsMap(c *middleware.Context) (map[string]interface{}, erro "alertingEnabled": setting.AlertingEnabled, "googleAnalyticsId": setting.GoogleAnalyticsId, "disableLoginForm": setting.DisableLoginForm, - "disableSignoutMenu": setting.DisableSignoutMenu, "externalUserMngInfo": setting.ExternalUserMngInfo, "externalUserMngLinkUrl": setting.ExternalUserMngLinkUrl, "externalUserMngLinkName": setting.ExternalUserMngLinkName, diff --git a/pkg/api/index.go b/pkg/api/index.go index da696df1210..23ba7aedc23 100644 --- a/pkg/api/index.go +++ b/pkg/api/index.go @@ -50,6 +50,7 @@ func setIndexViewData(c *middleware.Context) (*dtos.IndexViewData, error) { Login: c.Login, Email: c.Email, Name: c.Name, + OrgCount: c.OrgCount, OrgId: c.OrgId, OrgName: c.OrgName, OrgRole: c.OrgRole, @@ -86,9 +87,9 @@ func setIndexViewData(c *middleware.Context) (*dtos.IndexViewData, error) { if c.OrgRole == m.ROLE_ADMIN || c.OrgRole == m.ROLE_EDITOR { data.NavTree = append(data.NavTree, &dtos.NavLink{ - Text: "New", + Text: "Create", Icon: "fa fa-fw fa-plus", - Url: "", + Url: "#", Children: []*dtos.NavLink{ {Text: "Dashboard", Icon: "fa fa-fw fa-plus", Url: setting.AppSubUrl + "/dashboard/new"}, {Text: "Folder", Icon: "fa fa-fw fa-plus", Url: setting.AppSubUrl + "/dashboard/new/?editview=new-folder"}, @@ -112,17 +113,33 @@ func setIndexViewData(c *middleware.Context) (*dtos.IndexViewData, error) { }) if c.IsSignedIn { - data.NavTree = append(data.NavTree, &dtos.NavLink{ + profileNode := &dtos.NavLink{ Text: c.SignedInUser.Login, Id: "profile", Img: data.User.GravatarUrl, Url: setting.AppSubUrl + "/profile", HideFromMenu: true, Children: []*dtos.NavLink{ - {Text: "Signout", Url: setting.AppSubUrl + "/logout", Icon: "fa fa-fw fa-sign-out", Target: "_self"}, {Text: "Your profile", Url: setting.AppSubUrl + "/profile", Icon: "fa fa-fw fa-sliders"}, {Text: "Change Password", Id: "change-password", Url: setting.AppSubUrl + "/profile/password", Icon: "fa fa-fw fa-lock", HideFromMenu: true}, }, + } + + if !setting.DisableSignoutMenu { + // add sign out first + profileNode.Children = append([]*dtos.NavLink{ + {Text: "Sign out", Url: setting.AppSubUrl + "/logout", Icon: "fa fa-fw fa-sign-out", Target: "_self"}, + }, profileNode.Children...) + } + + data.NavTree = append(data.NavTree, profileNode) + } else { + data.NavTree = append(data.NavTree, &dtos.NavLink{ + Text: "Sign in", + Id: "sign-in", + Icon: "fa fa-fw fa-sign-in", + Url: setting.AppSubUrl + "/login", + HideFromMenu: true, }) } @@ -226,7 +243,7 @@ func setIndexViewData(c *middleware.Context) (*dtos.IndexViewData, error) { }, }, { - Text: "User Management", + Text: "Users", Id: "users", Description: "Manage users & user groups", Icon: "fa fa-fw fa-users", @@ -258,21 +275,22 @@ func setIndexViewData(c *middleware.Context) (*dtos.IndexViewData, error) { }) } - data.NavTree = append(data.NavTree, &dtos.NavLink{ - Text: "Help", - Id: "help", - Url: "/help", - Icon: "fa fa-fw fa-question", - HideFromMenu: true, - Children: []*dtos.NavLink{ - {Text: "Shortcuts", Url: "/shortcuts", Icon: "fa fa-fw fa-keyboard-o", Target: "_self"}, - {Text: "Community site", Url: "http://community.grafana.com", Icon: "fa fa-fw fa-comment", Target: "_blank"}, - {Text: "Documentation", Url: "http://docs.grafana.org", Icon: "fa fa-fw fa-file", Target: "_blank"}, - }, - }) data.NavTree = append(data.NavTree, cfgNode) } + data.NavTree = append(data.NavTree, &dtos.NavLink{ + Text: "Help", + Id: "help", + Url: "#", + Icon: "fa fa-fw fa-question", + HideFromMenu: true, + Children: []*dtos.NavLink{ + {Text: "Keyboard shortcuts", Url: "/shortcuts", Icon: "fa fa-fw fa-keyboard-o", Target: "_self"}, + {Text: "Community site", Url: "http://community.grafana.com", Icon: "fa fa-fw fa-comment", Target: "_blank"}, + {Text: "Documentation", Url: "http://docs.grafana.org", Icon: "fa fa-fw fa-file", Target: "_blank"}, + }, + }) + return &data, nil } diff --git a/pkg/models/user.go b/pkg/models/user.go index 805bac2628f..bb12bc0038d 100644 --- a/pkg/models/user.go +++ b/pkg/models/user.go @@ -160,6 +160,7 @@ type SignedInUser struct { Name string Email string ApiKeyId int64 + OrgCount int IsGrafanaAdmin bool HelpFlags1 HelpFlags1 LastSeenAt time.Time diff --git a/pkg/services/sqlstore/user.go b/pkg/services/sqlstore/user.go index 14f9ddb08c6..00eb0c4bc6b 100644 --- a/pkg/services/sqlstore/user.go +++ b/pkg/services/sqlstore/user.go @@ -350,6 +350,7 @@ func GetSignedInUser(query *m.GetSignedInUserQuery) error { u.name as name, u.help_flags1 as help_flags1, u.last_seen_at as last_seen_at, + (SELECT COUNT(*) FROM org_user where org_user.user_id = u.id) as org_count, org.name as org_name, org_user.role as org_role, org.id as org_id diff --git a/public/app/core/components/navbar/navbar.ts b/public/app/core/components/navbar/navbar.ts index 1106cd13903..3f576617e31 100644 --- a/public/app/core/components/navbar/navbar.ts +++ b/public/app/core/components/navbar/navbar.ts @@ -11,7 +11,6 @@ export class NavbarCtrl { /** @ngInject */ constructor(private $scope, private $rootScope, private contextSrv) { - console.log(this.model); } showSearch() { diff --git a/public/app/core/components/sidemenu/sidemenu.html b/public/app/core/components/sidemenu/sidemenu.html index fd8d1e28da6..6dd08687743 100644 --- a/public/app/core/components/sidemenu/sidemenu.html +++ b/public/app/core/components/sidemenu/sidemenu.html @@ -36,7 +36,16 @@ -