mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
wip: dashboard acl ux2, #10747
This commit is contained in:
@@ -30,6 +30,8 @@ func GetDashboardAclList(c *middleware.Context) Response {
|
|||||||
}
|
}
|
||||||
|
|
||||||
for _, perm := range acl {
|
for _, perm := range acl {
|
||||||
|
perm.UserAvatarUrl = dtos.GetGravatarUrl(perm.UserEmail)
|
||||||
|
perm.TeamAvatarUrl = dtos.GetGravatarUrl(perm.TeamEmail)
|
||||||
if perm.Slug != "" {
|
if perm.Slug != "" {
|
||||||
perm.Url = m.GetDashboardFolderUrl(perm.IsFolder, perm.Uid, perm.Slug)
|
perm.Url = m.GetDashboardFolderUrl(perm.IsFolder, perm.Uid, perm.Slug)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -53,7 +53,10 @@ type DashboardAclInfoDTO struct {
|
|||||||
UserId int64 `json:"userId"`
|
UserId int64 `json:"userId"`
|
||||||
UserLogin string `json:"userLogin"`
|
UserLogin string `json:"userLogin"`
|
||||||
UserEmail string `json:"userEmail"`
|
UserEmail string `json:"userEmail"`
|
||||||
|
UserAvatarUrl string `json:"userAvatarUrl"`
|
||||||
TeamId int64 `json:"teamId"`
|
TeamId int64 `json:"teamId"`
|
||||||
|
TeamEmail string `json:"teamEmail"`
|
||||||
|
TeamAvatarUrl string `json:"teamAvatarUrl"`
|
||||||
Team string `json:"team"`
|
Team string `json:"team"`
|
||||||
Role *RoleType `json:"role,omitempty"`
|
Role *RoleType `json:"role,omitempty"`
|
||||||
Permission PermissionType `json:"permission"`
|
Permission PermissionType `json:"permission"`
|
||||||
|
|||||||
@@ -92,6 +92,7 @@ func GetDashboardAclInfoList(query *m.GetDashboardAclInfoListQuery) error {
|
|||||||
u.login AS user_login,
|
u.login AS user_login,
|
||||||
u.email AS user_email,
|
u.email AS user_email,
|
||||||
ug.name AS team,
|
ug.name AS team,
|
||||||
|
ug.email AS team_email,
|
||||||
d.title,
|
d.title,
|
||||||
d.slug,
|
d.slug,
|
||||||
d.uid,
|
d.uid,
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import React, { Component } from 'react';
|
import React, { Component } from 'react';
|
||||||
import DescriptionPicker from 'app/core/components/Picker/DescriptionPicker';
|
import DescriptionPicker from 'app/core/components/Picker/DescriptionPicker';
|
||||||
import { permissionOptions } from 'app/stores/PermissionsStore/PermissionsStore';
|
import { permissionOptions } from 'app/stores/PermissionsStore/PermissionsStore';
|
||||||
|
|
||||||
@@ -12,10 +12,10 @@ export default class DisabledPermissionListItem extends Component<IProps, any> {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<tr className="gf-form-disabled">
|
<tr className="gf-form-disabled">
|
||||||
<td style={{ width: '100%' }}>
|
<td style={{ width: '1%' }}>
|
||||||
<i className={`fa--permissions-list ${item.icon}`} />
|
<i className={`fa--permissions-list ${item.icon}`} />
|
||||||
<span dangerouslySetInnerHTML={{ __html: item.nameHtml }} />
|
|
||||||
</td>
|
</td>
|
||||||
|
<td style={{ width: '90%' }}>{item.name}</td>
|
||||||
<td />
|
<td />
|
||||||
<td className="query-keyword">Can</td>
|
<td className="query-keyword">Can</td>
|
||||||
<td>
|
<td>
|
||||||
|
|||||||
@@ -15,9 +15,8 @@ export interface DashboardAcl {
|
|||||||
permissionName?: string;
|
permissionName?: string;
|
||||||
role?: string;
|
role?: string;
|
||||||
icon?: string;
|
icon?: string;
|
||||||
nameHtml?: string;
|
name?: string;
|
||||||
inherited?: boolean;
|
inherited?: boolean;
|
||||||
sortName?: string;
|
|
||||||
sortRank?: number;
|
sortRank?: number;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import React, { Component } from 'react';
|
import React, { Component } from 'react';
|
||||||
import PermissionsListItem from './PermissionsListItem';
|
import PermissionsListItem from './PermissionsListItem';
|
||||||
import DisabledPermissionsListItem from './DisabledPermissionsListItem';
|
import DisabledPermissionsListItem from './DisabledPermissionsListItem';
|
||||||
import { observer } from 'mobx-react';
|
import { observer } from 'mobx-react';
|
||||||
@@ -23,7 +23,7 @@ class PermissionsList extends Component<IProps, any> {
|
|||||||
<DisabledPermissionsListItem
|
<DisabledPermissionsListItem
|
||||||
key={0}
|
key={0}
|
||||||
item={{
|
item={{
|
||||||
nameHtml: 'Everyone with <span class="query-keyword">Admin</span> Role',
|
name: 'Admin',
|
||||||
permission: 4,
|
permission: 4,
|
||||||
icon: 'fa fa-fw fa-street-view',
|
icon: 'fa fa-fw fa-street-view',
|
||||||
}}
|
}}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import React from 'react';
|
import React from 'react';
|
||||||
import { observer } from 'mobx-react';
|
import { observer } from 'mobx-react';
|
||||||
import DescriptionPicker from 'app/core/components/Picker/DescriptionPicker';
|
import DescriptionPicker from 'app/core/components/Picker/DescriptionPicker';
|
||||||
import { permissionOptions } from 'app/stores/PermissionsStore/PermissionsStore';
|
import { permissionOptions } from 'app/stores/PermissionsStore/PermissionsStore';
|
||||||
@@ -7,6 +7,16 @@ const setClassNameHelper = inherited => {
|
|||||||
return inherited ? 'gf-form-disabled' : '';
|
return inherited ? 'gf-form-disabled' : '';
|
||||||
};
|
};
|
||||||
|
|
||||||
|
function ItemAvatar({ item }) {
|
||||||
|
if (item.userAvatarUrl) {
|
||||||
|
return <img className="filter-table__avatar" src={item.userAvatarUrl} />;
|
||||||
|
}
|
||||||
|
if (item.teamAvatarUrl) {
|
||||||
|
return <img className="filter-table__avatar" src={item.teamAvatarUrl} />;
|
||||||
|
}
|
||||||
|
return <span className={item.icon} />;
|
||||||
|
}
|
||||||
|
|
||||||
export default observer(({ item, removeItem, permissionChanged, itemIndex, folderInfo }) => {
|
export default observer(({ item, removeItem, permissionChanged, itemIndex, folderInfo }) => {
|
||||||
const handleRemoveItem = evt => {
|
const handleRemoveItem = evt => {
|
||||||
evt.preventDefault();
|
evt.preventDefault();
|
||||||
@@ -18,13 +28,14 @@ export default observer(({ item, removeItem, permissionChanged, itemIndex, folde
|
|||||||
};
|
};
|
||||||
|
|
||||||
const inheritedFromRoot = item.dashboardId === -1 && folderInfo && folderInfo.id === 0;
|
const inheritedFromRoot = item.dashboardId === -1 && folderInfo && folderInfo.id === 0;
|
||||||
|
console.log(item.name);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<tr className={setClassNameHelper(item.inherited)}>
|
<tr className={setClassNameHelper(item.inherited)}>
|
||||||
<td style={{ width: '100%' }}>
|
<td style={{ width: '1%' }}>
|
||||||
<i className={`fa--permissions-list ${item.icon}`} />
|
<ItemAvatar item={item} />
|
||||||
<span dangerouslySetInnerHTML={{ __html: item.nameHtml }} />
|
|
||||||
</td>
|
</td>
|
||||||
|
<td style={{ width: '90%' }}>{item.name}</td>
|
||||||
<td>
|
<td>
|
||||||
{item.inherited &&
|
{item.inherited &&
|
||||||
folderInfo && (
|
folderInfo && (
|
||||||
|
|||||||
@@ -231,19 +231,14 @@ const prepareItem = (item, dashboardId: number, isFolder: boolean, isInRoot: boo
|
|||||||
|
|
||||||
item.sortRank = 0;
|
item.sortRank = 0;
|
||||||
if (item.userId > 0) {
|
if (item.userId > 0) {
|
||||||
item.icon = 'fa fa-fw fa-user';
|
item.name = item.userLogin;
|
||||||
item.nameHtml = item.userLogin;
|
|
||||||
item.sortName = item.userLogin;
|
|
||||||
item.sortRank = 10;
|
item.sortRank = 10;
|
||||||
} else if (item.teamId > 0) {
|
} else if (item.teamId > 0) {
|
||||||
item.icon = 'fa fa-fw fa-users';
|
item.name = item.team;
|
||||||
item.nameHtml = item.team;
|
|
||||||
item.sortName = item.team;
|
|
||||||
item.sortRank = 20;
|
item.sortRank = 20;
|
||||||
} else if (item.role) {
|
} else if (item.role) {
|
||||||
item.icon = 'fa fa-fw fa-street-view';
|
item.icon = 'fa fa-fw fa-street-view';
|
||||||
item.nameHtml = `Everyone with <span class="query-keyword">${item.role}</span> Role`;
|
item.name = item.role;
|
||||||
item.sortName = item.role;
|
|
||||||
item.sortRank = 30;
|
item.sortRank = 30;
|
||||||
if (item.role === 'Viewer') {
|
if (item.role === 'Viewer') {
|
||||||
item.sortRank += 1;
|
item.sortRank += 1;
|
||||||
|
|||||||
@@ -14,8 +14,9 @@ export const PermissionsStoreItem = types
|
|||||||
inherited: types.maybe(types.boolean),
|
inherited: types.maybe(types.boolean),
|
||||||
sortRank: types.maybe(types.number),
|
sortRank: types.maybe(types.number),
|
||||||
icon: types.maybe(types.string),
|
icon: types.maybe(types.string),
|
||||||
nameHtml: types.maybe(types.string),
|
name: types.maybe(types.string),
|
||||||
sortName: types.maybe(types.string),
|
teamAvatarUrl: types.maybe(types.string),
|
||||||
|
userAvatarUrl: types.maybe(types.string),
|
||||||
})
|
})
|
||||||
.actions(self => ({
|
.actions(self => ({
|
||||||
updateRole: role => {
|
updateRole: role => {
|
||||||
|
|||||||
Reference in New Issue
Block a user