feat: add user group info for domain page
1. Add user group column in domain list page 2. Add user group tab in domain detail page 3. Update detail path check in list page 4. Remove domain column for user/group list in domain detail page Change-Id: Ib81db9cac0d213c47c5f45fb8457728d0b96aa76
This commit is contained in:
parent
e15dc5f0d6
commit
ec2e85a551
@ -17,6 +17,7 @@ import { DomainStore } from 'stores/keystone/domain';
|
|||||||
import Base from 'containers/TabDetail';
|
import Base from 'containers/TabDetail';
|
||||||
import { enabledColumn } from 'resources/keystone/domain';
|
import { enabledColumn } from 'resources/keystone/domain';
|
||||||
import User from '../../User';
|
import User from '../../User';
|
||||||
|
import UserGroup from '../../UserGroup';
|
||||||
import Project from '../../Project';
|
import Project from '../../Project';
|
||||||
import actionConfigs from '../actions';
|
import actionConfigs from '../actions';
|
||||||
|
|
||||||
@ -44,13 +45,17 @@ export class DomainDetail extends Base {
|
|||||||
dataIndex: 'name',
|
dataIndex: 'name',
|
||||||
},
|
},
|
||||||
enabledColumn,
|
enabledColumn,
|
||||||
|
{
|
||||||
|
title: t('Project Num'),
|
||||||
|
dataIndex: 'projectCount',
|
||||||
|
},
|
||||||
{
|
{
|
||||||
title: t('User Num'),
|
title: t('User Num'),
|
||||||
dataIndex: 'userCount',
|
dataIndex: 'userCount',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: t('Project Num'),
|
title: t('User Group Num'),
|
||||||
dataIndex: 'projectCount',
|
dataIndex: 'groupCount',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: t('Description'),
|
title: t('Description'),
|
||||||
@ -61,15 +66,20 @@ export class DomainDetail extends Base {
|
|||||||
|
|
||||||
get tabs() {
|
get tabs() {
|
||||||
const tabs = [
|
const tabs = [
|
||||||
|
{
|
||||||
|
title: t('Projects'),
|
||||||
|
key: 'project',
|
||||||
|
component: Project,
|
||||||
|
},
|
||||||
{
|
{
|
||||||
title: t('Users'),
|
title: t('Users'),
|
||||||
key: 'user',
|
key: 'user',
|
||||||
component: User,
|
component: User,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: t('Projects'),
|
title: t('User Groups'),
|
||||||
key: 'project',
|
key: 'userGroup',
|
||||||
component: Project,
|
component: UserGroup,
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
return tabs;
|
return tabs;
|
||||||
|
@ -45,14 +45,19 @@ export class Domains extends Base {
|
|||||||
dataIndex: 'name',
|
dataIndex: 'name',
|
||||||
routeName: 'domainDetailAdmin',
|
routeName: 'domainDetailAdmin',
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
title: t('Project Num'),
|
||||||
|
dataIndex: 'projectCount',
|
||||||
|
isHideable: true,
|
||||||
|
},
|
||||||
{
|
{
|
||||||
title: t('User Num'),
|
title: t('User Num'),
|
||||||
dataIndex: 'userCount',
|
dataIndex: 'userCount',
|
||||||
isHideable: true,
|
isHideable: true,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: t('Project Num'),
|
title: t('User Group Num'),
|
||||||
dataIndex: 'projectCount',
|
dataIndex: 'groupCount',
|
||||||
isHideable: true,
|
isHideable: true,
|
||||||
},
|
},
|
||||||
enabledColumn,
|
enabledColumn,
|
||||||
|
@ -41,23 +41,19 @@ export class Projects extends Base {
|
|||||||
}
|
}
|
||||||
|
|
||||||
get inProject() {
|
get inProject() {
|
||||||
const { pathname } = this.props.location;
|
return this.path.includes('project-admin');
|
||||||
return pathname.includes('project-admin');
|
|
||||||
}
|
}
|
||||||
|
|
||||||
get inUserDetail() {
|
get inUserDetail() {
|
||||||
const { pathname } = this.props.location;
|
return this.inDetailPage && this.path.includes('user-admin/detail');
|
||||||
return this.inDetailPage && pathname.includes('user-admin/detail');
|
|
||||||
}
|
}
|
||||||
|
|
||||||
get inUserGroupDetail() {
|
get inUserGroupDetail() {
|
||||||
const { pathname } = this.props.location;
|
return this.inDetailPage && this.path.includes('user-group-admin/detail');
|
||||||
return this.inDetailPage && pathname.includes('user-group-admin/detail');
|
|
||||||
}
|
}
|
||||||
|
|
||||||
get inDomainDetail() {
|
get inDomainDetail() {
|
||||||
const { pathname } = this.props.location;
|
return this.inDetailPage && this.path.includes('domain-admin/detail');
|
||||||
return this.inDetailPage && pathname.includes('domain-admin/detail');
|
|
||||||
}
|
}
|
||||||
|
|
||||||
getUserProjectRole = (record) => {
|
getUserProjectRole = (record) => {
|
||||||
@ -237,11 +233,19 @@ export class Projects extends Base {
|
|||||||
getColumns() {
|
getColumns() {
|
||||||
const columns = this.getBaseColumns();
|
const columns = this.getBaseColumns();
|
||||||
|
|
||||||
if (this.inProject || this.inDomainDetail) {
|
if (this.inProject) {
|
||||||
return columns.filter(
|
return columns.filter(
|
||||||
(it) => !['userProjectRole', 'groupProjectRole'].includes(it.dataIndex)
|
(it) => !['userProjectRole', 'groupProjectRole'].includes(it.dataIndex)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
if (this.inDomainDetail) {
|
||||||
|
return columns.filter(
|
||||||
|
(it) =>
|
||||||
|
!['domainName', 'userProjectRole', 'groupProjectRole'].includes(
|
||||||
|
it.dataIndex
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
if (this.inUserDetail) {
|
if (this.inUserDetail) {
|
||||||
return columns.filter(
|
return columns.filter(
|
||||||
(it) => !['num', 'groupProjectRole'].includes(it.dataIndex)
|
(it) => !['num', 'groupProjectRole'].includes(it.dataIndex)
|
||||||
|
@ -146,7 +146,8 @@ export class User extends Base {
|
|||||||
}
|
}
|
||||||
if (this.inDomainDetail) {
|
if (this.inDomainDetail) {
|
||||||
return columns.filter(
|
return columns.filter(
|
||||||
(it) => !['domain', 'projects', 'projectRoles'].includes(it.dataIndex)
|
(it) =>
|
||||||
|
!['domainName', 'projects', 'projectRoles'].includes(it.dataIndex)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
if (this.inRoleDetail) {
|
if (this.inRoleDetail) {
|
||||||
|
@ -39,18 +39,19 @@ export class UserGroups extends Base {
|
|||||||
}
|
}
|
||||||
|
|
||||||
get inUserDetail() {
|
get inUserDetail() {
|
||||||
const { pathname } = this.props.location;
|
return this.inDetailPage && this.path.includes('user-admin/detail');
|
||||||
return this.inDetailPage && pathname.includes('user-admin/detail');
|
}
|
||||||
|
|
||||||
|
get inDomainDetail() {
|
||||||
|
return this.inDetailPage && this.path.includes('domain-admin/detail');
|
||||||
}
|
}
|
||||||
|
|
||||||
get inProjectDetail() {
|
get inProjectDetail() {
|
||||||
const { pathname } = this.props.location;
|
return this.inDetailPage && this.path.includes('project-admin/detail');
|
||||||
return this.inDetailPage && pathname.includes('project-admin/detail');
|
|
||||||
}
|
}
|
||||||
|
|
||||||
get inRoleDetail() {
|
get inRoleDetail() {
|
||||||
const { pathname } = this.props.location;
|
return this.inDetailPage && this.path.includes('role-admin/detail');
|
||||||
return this.inDetailPage && pathname.includes('role-admin/detail');
|
|
||||||
}
|
}
|
||||||
|
|
||||||
getBaseColumns() {
|
getBaseColumns() {
|
||||||
@ -187,20 +188,31 @@ export class UserGroups extends Base {
|
|||||||
getColumns() {
|
getColumns() {
|
||||||
const columns = this.getBaseColumns();
|
const columns = this.getBaseColumns();
|
||||||
if (!this.inDetailPage || this.inUserDetail) {
|
if (!this.inDetailPage || this.inUserDetail) {
|
||||||
return columns.filter((it) => !it.dataIndex.includes('DetailPage'));
|
return columns.filter(
|
||||||
|
(it) =>
|
||||||
|
!['rolesInProjectDetailPage', 'projectsInRoleDetailPage'].includes(
|
||||||
|
it.dataIndex
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
if (this.inDomainDetail) {
|
||||||
|
return columns.filter(
|
||||||
|
(it) =>
|
||||||
|
![
|
||||||
|
'domainName',
|
||||||
|
'rolesInProjectDetailPage',
|
||||||
|
'projectsInRoleDetailPage',
|
||||||
|
].includes(it.dataIndex)
|
||||||
|
);
|
||||||
}
|
}
|
||||||
if (this.inProjectDetail) {
|
if (this.inProjectDetail) {
|
||||||
return columns.filter(
|
return columns.filter(
|
||||||
(it) =>
|
(it) => !['projects', 'projectsInRoleDetailPage'].includes(it.dataIndex)
|
||||||
it.dataIndex !== 'projects' &&
|
|
||||||
it.dataIndex !== 'projectsInRoleDetailPage'
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
if (this.inRoleDetail) {
|
if (this.inRoleDetail) {
|
||||||
return columns.filter(
|
return columns.filter(
|
||||||
(it) =>
|
(it) => !['projects', 'rolesInProjectDetailPage'].includes(it.dataIndex)
|
||||||
it.dataIndex !== 'rolesInProjectDetailPage' &&
|
|
||||||
it.dataIndex !== 'projects'
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
return columns;
|
return columns;
|
||||||
@ -232,6 +244,8 @@ export class UserGroups extends Base {
|
|||||||
newParams.projectId = id;
|
newParams.projectId = id;
|
||||||
} else if (this.inRoleDetail) {
|
} else if (this.inRoleDetail) {
|
||||||
newParams.roleId = id;
|
newParams.roleId = id;
|
||||||
|
} else if (this.inDomainDetail) {
|
||||||
|
newParams.domainId = id;
|
||||||
}
|
}
|
||||||
return newParams;
|
return newParams;
|
||||||
};
|
};
|
||||||
|
@ -52,18 +52,15 @@ export class FloatingIps extends Base {
|
|||||||
}
|
}
|
||||||
|
|
||||||
get inQosDetail() {
|
get inQosDetail() {
|
||||||
const { pathname } = this.props.location;
|
return this.inDetailPage && this.path.includes('qos');
|
||||||
return this.inDetailPage && pathname.includes('qos');
|
|
||||||
}
|
}
|
||||||
|
|
||||||
get isRecycleBinDetail() {
|
get isRecycleBinDetail() {
|
||||||
const { pathname } = this.props.location;
|
return this.inDetailPage && this.path.includes('recycle-bin');
|
||||||
return this.inDetailPage && pathname.includes('recycle-bin');
|
|
||||||
}
|
}
|
||||||
|
|
||||||
get inInstanceDetail() {
|
get inInstanceDetail() {
|
||||||
const { pathname } = this.props.location;
|
return this.inDetailPage && this.path.includes('instance');
|
||||||
return this.inDetailPage && pathname.includes('instance');
|
|
||||||
}
|
}
|
||||||
|
|
||||||
async getData({ silent, ...params } = {}) {
|
async getData({ silent, ...params } = {}) {
|
||||||
|
@ -35,8 +35,7 @@ export class SecurityGroups extends Base {
|
|||||||
}
|
}
|
||||||
|
|
||||||
get isRecycleBinDetail() {
|
get isRecycleBinDetail() {
|
||||||
const { pathname } = this.props.location;
|
return this.inDetailPage && this.path.includes('recycle-bin');
|
||||||
return pathname.indexOf('recycle-bin') >= 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
get actionConfigs() {
|
get actionConfigs() {
|
||||||
|
@ -80,8 +80,7 @@ export class VirtualAdapter extends Base {
|
|||||||
}
|
}
|
||||||
|
|
||||||
get isRecycleBinDetail() {
|
get isRecycleBinDetail() {
|
||||||
const { pathname } = this.props.location;
|
return this.inDetailPage && this.path.includes('recycle-bin');
|
||||||
return pathname.indexOf('recycle-bin') >= 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
get actionConfigs() {
|
get actionConfigs() {
|
||||||
|
@ -37,23 +37,19 @@ export class Share extends Base {
|
|||||||
}
|
}
|
||||||
|
|
||||||
get inShareGroupDetailPage() {
|
get inShareGroupDetailPage() {
|
||||||
const { pathname } = this.props.location;
|
return this.inDetailPage && this.path.includes('share-group');
|
||||||
return this.inDetailPage && pathname.includes('share-group');
|
|
||||||
}
|
}
|
||||||
|
|
||||||
get inShareTypeDetailPage() {
|
get inShareTypeDetailPage() {
|
||||||
const { pathname } = this.props.location;
|
return this.inDetailPage && this.path.includes('share-type');
|
||||||
return this.inDetailPage && pathname.includes('share-type');
|
|
||||||
}
|
}
|
||||||
|
|
||||||
get inShareNetworkDetailPage() {
|
get inShareNetworkDetailPage() {
|
||||||
const { pathname } = this.props.location;
|
return this.inDetailPage && this.path.includes('share-network');
|
||||||
return this.inDetailPage && pathname.includes('share-network');
|
|
||||||
}
|
}
|
||||||
|
|
||||||
get inShareServerDetailPage() {
|
get inShareServerDetailPage() {
|
||||||
const { pathname } = this.props.location;
|
return this.inDetailPage && this.path.includes('share-server');
|
||||||
return this.inDetailPage && pathname.includes('share-server');
|
|
||||||
}
|
}
|
||||||
|
|
||||||
get isSortByBackend() {
|
get isSortByBackend() {
|
||||||
|
@ -44,8 +44,7 @@ export class Volume extends Base {
|
|||||||
}
|
}
|
||||||
|
|
||||||
get isRecycleBinDetail() {
|
get isRecycleBinDetail() {
|
||||||
const { pathname } = this.props.location;
|
return this.inDetailPage && this.path.includes('recycle-bin');
|
||||||
return pathname.indexOf('recycle-bin') >= 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
get actionConfigs() {
|
get actionConfigs() {
|
||||||
|
@ -28,6 +28,10 @@ export class DomainStore extends Base {
|
|||||||
return client.keystone.users;
|
return client.keystone.users;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
get userGroupClient() {
|
||||||
|
return client.keystone.groups;
|
||||||
|
}
|
||||||
|
|
||||||
get projectClient() {
|
get projectClient() {
|
||||||
return client.keystone.projects;
|
return client.keystone.projects;
|
||||||
}
|
}
|
||||||
@ -36,9 +40,10 @@ export class DomainStore extends Base {
|
|||||||
if (!items.length) {
|
if (!items.length) {
|
||||||
return items;
|
return items;
|
||||||
}
|
}
|
||||||
const [userResult, projectResult] = await Promise.all([
|
const [userResult, projectResult, userGroupResult] = await Promise.all([
|
||||||
this.userClient.list(),
|
this.userClient.list(),
|
||||||
this.projectClient.list(),
|
this.projectClient.list(),
|
||||||
|
this.userGroupClient.list(),
|
||||||
]);
|
]);
|
||||||
return items.map((it) => {
|
return items.map((it) => {
|
||||||
const users = (userResult.users || []).filter(
|
const users = (userResult.users || []).filter(
|
||||||
@ -47,30 +52,39 @@ export class DomainStore extends Base {
|
|||||||
const projects = (projectResult.projects || []).filter(
|
const projects = (projectResult.projects || []).filter(
|
||||||
(project) => project.domain_id === it.id
|
(project) => project.domain_id === it.id
|
||||||
);
|
);
|
||||||
|
const groups = (userGroupResult.groups || []).filter(
|
||||||
|
(group) => group.domain_id === it.id
|
||||||
|
);
|
||||||
return {
|
return {
|
||||||
...it,
|
...it,
|
||||||
users,
|
users,
|
||||||
userCount: users.length,
|
userCount: users.length,
|
||||||
projects,
|
projects,
|
||||||
projectCount: projects.length,
|
projectCount: projects.length,
|
||||||
|
groups,
|
||||||
|
groupCount: groups.length,
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
async detailDidFetch(item) {
|
async detailDidFetch(item) {
|
||||||
const { id } = item;
|
const { id } = item;
|
||||||
const [userResult, projectResult] = await Promise.all([
|
const [userResult, projectResult, groupResult] = await Promise.all([
|
||||||
this.userClient.list({ domain_id: id }),
|
this.userClient.list({ domain_id: id }),
|
||||||
this.projectClient.list({ domain_id: id }),
|
this.projectClient.list({ domain_id: id }),
|
||||||
|
this.userGroupClient.list({ domain_id: id }),
|
||||||
]);
|
]);
|
||||||
const { users = [] } = userResult || {};
|
const { users = [] } = userResult || {};
|
||||||
const { projects = [] } = projectResult || {};
|
const { projects = [] } = projectResult || {};
|
||||||
|
const { groups = [] } = groupResult || {};
|
||||||
return {
|
return {
|
||||||
...item,
|
...item,
|
||||||
users,
|
users,
|
||||||
userCount: users.length,
|
userCount: users.length,
|
||||||
projects,
|
projects,
|
||||||
projectCount: projects.length,
|
projectCount: projects.length,
|
||||||
|
groups,
|
||||||
|
groupCount: groups.length,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -62,6 +62,7 @@ export class GroupStore extends Base {
|
|||||||
groupId,
|
groupId,
|
||||||
roleId,
|
roleId,
|
||||||
projectId,
|
projectId,
|
||||||
|
domainId,
|
||||||
withRole,
|
withRole,
|
||||||
all_projects,
|
all_projects,
|
||||||
...rest
|
...rest
|
||||||
@ -182,7 +183,7 @@ export class GroupStore extends Base {
|
|||||||
if (!items.length) {
|
if (!items.length) {
|
||||||
return items;
|
return items;
|
||||||
}
|
}
|
||||||
const { projectId, roleId, withRole = true } = filters;
|
const { projectId, roleId, domainId, withRole = true } = filters;
|
||||||
const params = {};
|
const params = {};
|
||||||
if (projectId) {
|
if (projectId) {
|
||||||
params['project.id'] = projectId;
|
params['project.id'] = projectId;
|
||||||
@ -201,7 +202,11 @@ export class GroupStore extends Base {
|
|||||||
const { domains = [] } = domainResult;
|
const { domains = [] } = domainResult;
|
||||||
const { projects = [] } = projectsResult || {};
|
const { projects = [] } = projectsResult || {};
|
||||||
const { role_assignments: assigns = [] } = roleAssignmentResult || {};
|
const { role_assignments: assigns = [] } = roleAssignmentResult || {};
|
||||||
const newItems = items.map((group) => {
|
let newItems = items;
|
||||||
|
if (domainId) {
|
||||||
|
newItems = items.filter((it) => it.domain_id === domainId);
|
||||||
|
}
|
||||||
|
newItems = newItems.map((group) => {
|
||||||
return this.updateUserGroup(group, assigns, roles, domains, projects);
|
return this.updateUserGroup(group, assigns, roles, domains, projects);
|
||||||
});
|
});
|
||||||
if (projectId || roleId) {
|
if (projectId || roleId) {
|
||||||
|
Loading…
Reference in New Issue
Block a user