From 7a4b15214a64478adad96bca1d4d63cc1755abfc Mon Sep 17 00:00:00 2001 From: Dennis Tang Date: Tue, 26 Mar 2019 00:03:48 +0000 Subject: Improve group list UI This updates the groups list UI to match the style of the project list: - New layout - Improve loading state when loading group children - Larger, responsive text - Icon and text colors changed to secondary - Smaller button sizes - Content list description colors were standardized to body text --- .../javascripts/groups/components/group_item.vue | 77 ++++++++++++++------- .../javascripts/groups/components/item_actions.vue | 28 ++++---- .../javascripts/groups/components/item_caret.vue | 2 +- .../javascripts/groups/components/item_stats.vue | 8 +-- .../groups/components/item_type_icon.vue | 2 +- app/assets/stylesheets/framework/lists.scss | 1 - app/assets/stylesheets/framework/mixins.scss | 2 +- app/assets/stylesheets/pages/groups.scss | 80 +++++++++------------- app/assets/stylesheets/pages/projects.scss | 5 -- .../unreleased/52366-improved-group-lists-ui.yml | 5 ++ .../groups/components/group_item_spec.js | 7 ++ .../groups/components/item_stats_spec.js | 12 ---- 12 files changed, 114 insertions(+), 115 deletions(-) create mode 100644 changelogs/unreleased/52366-improved-group-lists-ui.yml diff --git a/app/assets/javascripts/groups/components/group_item.vue b/app/assets/javascripts/groups/components/group_item.vue index d5130cd331d..9909f437fc8 100644 --- a/app/assets/javascripts/groups/components/group_item.vue +++ b/app/assets/javascripts/groups/components/group_item.vue @@ -1,12 +1,15 @@ diff --git a/app/assets/javascripts/groups/components/item_caret.vue b/app/assets/javascripts/groups/components/item_caret.vue index 43b9607ea8e..18ea4819878 100644 --- a/app/assets/javascripts/groups/components/item_caret.vue +++ b/app/assets/javascripts/groups/components/item_caret.vue @@ -21,5 +21,5 @@ export default { diff --git a/app/assets/javascripts/groups/components/item_stats.vue b/app/assets/javascripts/groups/components/item_stats.vue index bc6851ea2bf..734a9a89c72 100644 --- a/app/assets/javascripts/groups/components/item_stats.vue +++ b/app/assets/javascripts/groups/components/item_stats.vue @@ -48,7 +48,7 @@ export default { :title="__('Subgroups')" :value="item.subgroupCount" css-class="number-subgroups" - icon-name="folder" + icon-name="folder-o" /> -
diff --git a/app/assets/javascripts/groups/components/item_type_icon.vue b/app/assets/javascripts/groups/components/item_type_icon.vue index e1ebd03cb5f..ae69fbd7bde 100644 --- a/app/assets/javascripts/groups/components/item_type_icon.vue +++ b/app/assets/javascripts/groups/components/item_type_icon.vue @@ -20,7 +20,7 @@ export default { computed: { iconClass() { if (this.itemType === ITEM_TYPE.GROUP) { - return this.isGroupOpen ? 'folder-open' : 'folder'; + return this.isGroupOpen ? 'folder-open' : 'folder-o'; } return 'bookmark'; }, diff --git a/app/assets/stylesheets/framework/lists.scss b/app/assets/stylesheets/framework/lists.scss index 555a3fe0dc7..954551fef97 100644 --- a/app/assets/stylesheets/framework/lists.scss +++ b/app/assets/stylesheets/framework/lists.scss @@ -133,7 +133,6 @@ ul.content-list { .description { @include str-truncated; - color: $gl-text-color-secondary; } .controls { diff --git a/app/assets/stylesheets/framework/mixins.scss b/app/assets/stylesheets/framework/mixins.scss index ad5096761cd..bf0f1da6aa3 100644 --- a/app/assets/stylesheets/framework/mixins.scss +++ b/app/assets/stylesheets/framework/mixins.scss @@ -65,7 +65,7 @@ .stats { float: right; line-height: $list-text-height; - color: $gl-text-color; + color: $gl-text-color-secondary; span { margin-right: 15px; diff --git a/app/assets/stylesheets/pages/groups.scss b/app/assets/stylesheets/pages/groups.scss index 656202f4e58..cff2e274390 100644 --- a/app/assets/stylesheets/pages/groups.scss +++ b/app/assets/stylesheets/pages/groups.scss @@ -168,12 +168,6 @@ } } -.groups-listing { - .group-list-tree .group-row:first-child { - border-top: 0; - } -} - .card { .shared_runners_limit_under_quota { color: $green-500; @@ -260,7 +254,6 @@ table.pipeline-project-metrics tr td { color: $gl-text-color-secondary; font-size: 12px; line-height: 20px; - margin: -5px 3px; padding: 0 $label-padding; border: 1px solid $border-color; border-radius: $label-border-radius; @@ -294,39 +287,6 @@ table.pipeline-project-metrics tr td { } .group-list-tree { - .avatar-container.content-loading { - position: relative; - - > a, - > a .avatar { - height: 100%; - border-radius: 50%; - } - - > a { - padding: 2px; - - .avatar { - border: 2px solid $white-normal; - - &.identicon { - line-height: 15px; - } - } - } - - &::after { - content: ''; - position: absolute; - height: 100%; - width: 100%; - background-color: transparent; - border: 2px outset $gl-gray-200; - border-radius: 50%; - animation: spin-avatar 3s infinite linear; - } - } - .folder-toggle-wrap { font-size: 0; flex-shrink: 0; @@ -339,13 +299,14 @@ table.pipeline-project-metrics tr td { .folder-caret, .item-type-icon { display: inline-block; + color: $gl-text-color-secondary; } .folder-caret { - width: 15px; + width: $gl-font-size-large; svg { - margin-bottom: 1px; + margin-bottom: 2px; } } @@ -420,7 +381,7 @@ table.pipeline-project-metrics tr td { } .group-row-contents { - padding: $gl-padding-top; + padding: $gl-padding; &:hover { border-color: $blue-200; @@ -428,10 +389,15 @@ table.pipeline-project-metrics tr td { cursor: pointer; } + .group-text-container, .group-text { min-width: 0; // allows for truncated text within flex children } + .group-text { + flex-basis: 100%; + } + .avatar-container { flex-shrink: 0; @@ -441,6 +407,21 @@ table.pipeline-project-metrics tr td { } } + .title { + margin-top: -$gl-padding-8; // negative margin required for flex-wrap + font-size: $gl-font-size-large; + } + + .item-visibility { + color: $gl-text-color-secondary; + } + + @include media-breakpoint-down(md) { + .title { + font-size: $gl-font-size; + } + } + &.has-more-items { display: block; padding: 20px 10px; @@ -477,17 +458,18 @@ table.pipeline-project-metrics tr td { } .controls { - flex-shrink: 0; + flex-basis: 90px; > .btn { - margin: 0 0 0 $btn-margin-5; + margin: 0 $btn-side-margin 0 0; + color: $gl-text-color-secondary; } } - } - @include media-breakpoint-down(xs) { - .group-stats { - display: none; + .metadata { + @include media-breakpoint-up(md) { + flex-basis: 240px; + } } } diff --git a/app/assets/stylesheets/pages/projects.scss b/app/assets/stylesheets/pages/projects.scss index 151af843c95..c80beceae52 100644 --- a/app/assets/stylesheets/pages/projects.scss +++ b/app/assets/stylesheets/pages/projects.scss @@ -889,7 +889,6 @@ pre.light-well { @include basic-list-stats; display: flex; align-items: center; - color: $gl-text-color-secondary; padding: $gl-padding 0; @include media-breakpoint-up(lg) { @@ -952,10 +951,6 @@ pre.light-well { .description { line-height: 1.5; - - @include media-breakpoint-up(md) { - color: $gl-text-color; - } } @include media-breakpoint-down(md) { diff --git a/changelogs/unreleased/52366-improved-group-lists-ui.yml b/changelogs/unreleased/52366-improved-group-lists-ui.yml new file mode 100644 index 00000000000..99e5b67a56c --- /dev/null +++ b/changelogs/unreleased/52366-improved-group-lists-ui.yml @@ -0,0 +1,5 @@ +--- +title: Improve group list UI +merge_request: 26542 +author: +type: changed diff --git a/spec/javascripts/groups/components/group_item_spec.js b/spec/javascripts/groups/components/group_item_spec.js index 4d6d0c895b6..cc88a7ac6c1 100644 --- a/spec/javascripts/groups/components/group_item_spec.js +++ b/spec/javascripts/groups/components/group_item_spec.js @@ -156,6 +156,8 @@ describe('GroupItemComponent', () => { describe('template', () => { it('should render component template correctly', () => { + const visibilityIconEl = vm.$el.querySelector('.item-visibility'); + expect(vm.$el.getAttribute('id')).toBe('group-55'); expect(vm.$el.classList.contains('group-row')).toBeTruthy(); @@ -173,6 +175,11 @@ describe('GroupItemComponent', () => { expect(vm.$el.querySelector('.title')).toBeDefined(); expect(vm.$el.querySelector('.title a.no-expand')).toBeDefined(); + + expect(visibilityIconEl).not.toBe(null); + expect(visibilityIconEl.dataset.originalTitle).toBe(vm.visibilityTooltip); + expect(visibilityIconEl.querySelectorAll('svg').length).toBeGreaterThan(0); + expect(vm.$el.querySelector('.access-type')).toBeDefined(); expect(vm.$el.querySelector('.description')).toBeDefined(); diff --git a/spec/javascripts/groups/components/item_stats_spec.js b/spec/javascripts/groups/components/item_stats_spec.js index 00d6a4817d7..b2441babf3f 100644 --- a/spec/javascripts/groups/components/item_stats_spec.js +++ b/spec/javascripts/groups/components/item_stats_spec.js @@ -108,18 +108,6 @@ describe('ItemStatsComponent', () => { vm.$destroy(); }); - it('renders item visibility icon and tooltip correctly', () => { - const vm = createComponent(); - - const visibilityIconEl = vm.$el.querySelector('.item-visibility'); - - expect(visibilityIconEl).not.toBe(null); - expect(visibilityIconEl.dataset.originalTitle).toBe(vm.visibilityTooltip); - expect(visibilityIconEl.querySelectorAll('svg').length).toBeGreaterThan(0); - - vm.$destroy(); - }); - it('renders start count and last updated information for project item correctly', () => { const item = Object.assign({}, mockParentGroupItem, { type: ITEM_TYPE.PROJECT, -- cgit v1.2.1