diff --git a/ui/app/helpers/tabs-for-identity-show.js b/ui/app/helpers/tabs-for-identity-show.js
index a1c808ca1422..ced7696cfff1 100644
--- a/ui/app/helpers/tabs-for-identity-show.js
+++ b/ui/app/helpers/tabs-for-identity-show.js
@@ -4,9 +4,9 @@ export const TABS = {
entity: ['details', 'aliases', 'policies', 'groups', 'metadata'],
'entity-alias': ['details', 'metadata'],
//group will be used in the model hook of the route
- group: ['details', 'aliases', 'policies', 'members', 'metadata'],
- 'group-internal': ['details', 'policies', 'members', 'metadata'],
- 'group-external': ['details', 'aliases', 'policies', 'members', 'metadata'],
+ group: ['details', 'aliases', 'policies', 'members', 'parent-groups', 'metadata'],
+ 'group-internal': ['details', 'policies', 'members', 'parent-groups', 'metadata'],
+ 'group-external': ['details', 'aliases', 'policies', 'members', 'parent-groups', 'metadata'],
'group-alias': ['details'],
};
diff --git a/ui/app/models/identity/group.js b/ui/app/models/identity/group.js
index 47483dd529a2..d8f3bb275bcb 100644
--- a/ui/app/models/identity/group.js
+++ b/ui/app/models/identity/group.js
@@ -26,6 +26,12 @@ export default IdentityModel.extend({
lastUpdateTime: attr('string', {
readOnly: true,
}),
+ numMemberEntities: attr('number', {
+ readOnly: true
+ }),
+ numParentGroups: attr('number', {
+ readOnly: true
+ }),
metadata: attr('object', {
editType: 'kv',
}),
@@ -36,6 +42,10 @@ export default IdentityModel.extend({
label: 'Member Group IDs',
editType: 'stringArray',
}),
+ parentGroupIds: attr({
+ label: 'Parent Group IDs',
+ editType: 'stringArray',
+ }),
memberEntityIds: attr({
label: 'Member Entity IDs',
editType: 'stringArray',
diff --git a/ui/app/serializers/identity/_base.js b/ui/app/serializers/identity/_base.js
new file mode 100644
index 000000000000..217d13331221
--- /dev/null
+++ b/ui/app/serializers/identity/_base.js
@@ -0,0 +1,27 @@
+import ApplicationSerializer from '../application';
+import Ember from 'ember';
+
+export default ApplicationSerializer.extend({
+ normalizeItems(payload) {
+ if (payload.data.keys && Array.isArray(payload.data.keys)) {
+ return payload.data.keys;
+ }
+ Ember.assign(payload, payload.data);
+ delete payload.data;
+ return payload;
+ },
+
+ extractLazyPaginatedData(payload) {
+ let list;
+ list = payload.data.keys.map(key => {
+ let model = payload.data.key_info[key];
+ model.id = key;
+ return model;
+ });
+ delete payload.data.key_info;
+ return list.sort((a,b) => {
+ return a.name.localeCompare(b.name);
+ });
+ },
+
+});
diff --git a/ui/app/serializers/identity/entity-alias.js b/ui/app/serializers/identity/entity-alias.js
new file mode 100644
index 000000000000..c7246dba8a23
--- /dev/null
+++ b/ui/app/serializers/identity/entity-alias.js
@@ -0,0 +1,2 @@
+import IdentitySerializer from './_base';
+export default IdentitySerializer.extend();
diff --git a/ui/app/serializers/identity/entity.js b/ui/app/serializers/identity/entity.js
index 03aee2693371..4ff22baac6d9 100644
--- a/ui/app/serializers/identity/entity.js
+++ b/ui/app/serializers/identity/entity.js
@@ -1,7 +1,7 @@
import DS from 'ember-data';
-import ApplicationSerializer from '../application';
+import IdentitySerializer from './_base';
-export default ApplicationSerializer.extend(DS.EmbeddedRecordsMixin, {
+export default IdentitySerializer.extend(DS.EmbeddedRecordsMixin, {
attrs: {
aliases: { embedded: 'always' },
},
diff --git a/ui/app/serializers/identity/group-alias.js b/ui/app/serializers/identity/group-alias.js
new file mode 100644
index 000000000000..c7246dba8a23
--- /dev/null
+++ b/ui/app/serializers/identity/group-alias.js
@@ -0,0 +1,2 @@
+import IdentitySerializer from './_base';
+export default IdentitySerializer.extend();
diff --git a/ui/app/serializers/identity/group.js b/ui/app/serializers/identity/group.js
index c2df2fdf865f..37cb633f262f 100644
--- a/ui/app/serializers/identity/group.js
+++ b/ui/app/serializers/identity/group.js
@@ -1,7 +1,7 @@
import DS from 'ember-data';
-import ApplicationSerializer from '../application';
+import IdentitySerializer from './_base';
-export default ApplicationSerializer.extend(DS.EmbeddedRecordsMixin, {
+export default IdentitySerializer.extend(DS.EmbeddedRecordsMixin, {
attrs: {
alias: { embedded: 'always' },
},
diff --git a/ui/app/styles/components/sub-nav.scss b/ui/app/styles/components/sub-nav.scss
index 9c336fa77d48..630ac3398ef9 100644
--- a/ui/app/styles/components/sub-nav.scss
+++ b/ui/app/styles/components/sub-nav.scss
@@ -14,13 +14,17 @@
border-color: $blue;
color: $blue;
}
+ &:first-child a {
+ margin-left: $size-5;
+ }
}
a {
color: $grey-dark;
font-weight: $font-weight-semibold;
text-decoration: none;
- padding: $size-6 $size-8 $size-8;
+ padding: $size-6 0;
+ margin: 0 $size-4;
border-bottom: 2px solid transparent;
transition: border-color $speed;
diff --git a/ui/app/templates/components/identity/item-aliases.hbs b/ui/app/templates/components/identity/item-aliases.hbs
index afe3f7cddf65..c2aa2c68d9f4 100644
--- a/ui/app/templates/components/identity/item-aliases.hbs
+++ b/ui/app/templates/components/identity/item-aliases.hbs
@@ -13,9 +13,14 @@
glyph='role'
size=14
class="has-text-grey-light"
- }}{{item.name}}
- {{item.mountType}}
- {{item.mountAccessor}}
+ }}{{item.name}}
+
+ This group has no parent groups. +
+