From e12e518a978bdd8631a1f38895b9736b3abd508c Mon Sep 17 00:00:00 2001
From: Florie Guibert <fguibert@gitlab.com>
Date: Thu, 25 Aug 2022 00:43:39 +0000
Subject: [PATCH] Display health status on issue board cards

Changelog: added
---
 .../javascripts/boards/components/board_card_inner.vue |  3 +++
 app/assets/stylesheets/page_bundles/boards.scss        |  6 ++----
 .../javascripts/boards/graphql/issue.fragment.graphql  |  1 +
 .../components/issue_health_status.vue                 |  1 +
 ee/spec/frontend/boards/board_card_inner_spec.js       | 10 ++++++++++
 5 files changed, 17 insertions(+), 4 deletions(-)

diff --git a/app/assets/javascripts/boards/components/board_card_inner.vue b/app/assets/javascripts/boards/components/board_card_inner.vue
index f7e881defb78..098d429a62a9 100644
--- a/app/assets/javascripts/boards/components/board_card_inner.vue
+++ b/app/assets/javascripts/boards/components/board_card_inner.vue
@@ -38,6 +38,8 @@ export default {
     GlSprintf,
     BoardCardMoveToPosition,
     WorkItemTypeIcon,
+    IssueHealthStatus: () =>
+      import('ee_component/related_items_tree/components/issue_health_status.vue'),
   },
   directives: {
     GlTooltip: GlTooltipDirective,
@@ -381,6 +383,7 @@ export default {
               :weight="item.weight"
               @click="filterByWeight(item.weight)"
             />
+            <issue-health-status v-if="item.healthStatus" :health-status="item.healthStatus" />
           </span>
         </span>
       </div>
diff --git a/app/assets/stylesheets/page_bundles/boards.scss b/app/assets/stylesheets/page_bundles/boards.scss
index 2b55a87f04a1..d45bc865da56 100644
--- a/app/assets/stylesheets/page_bundles/boards.scss
+++ b/app/assets/stylesheets/page_bundles/boards.scss
@@ -182,10 +182,8 @@
 }
 
 .board-card-number {
-  font-size: $gl-font-size-xs;
-
-  @include media-breakpoint-up(md) {
-    font-size: $label-font-size;
+  @include media-breakpoint-down(md) {
+    font-size: $gl-font-size-sm;
   }
 }
 
diff --git a/ee/app/assets/javascripts/boards/graphql/issue.fragment.graphql b/ee/app/assets/javascripts/boards/graphql/issue.fragment.graphql
index 3279fabf77a8..133930df2199 100644
--- a/ee/app/assets/javascripts/boards/graphql/issue.fragment.graphql
+++ b/ee/app/assets/javascripts/boards/graphql/issue.fragment.graphql
@@ -17,4 +17,5 @@ fragment Issue on Issue {
       title
     }
   }
+  healthStatus
 }
diff --git a/ee/app/assets/javascripts/related_items_tree/components/issue_health_status.vue b/ee/app/assets/javascripts/related_items_tree/components/issue_health_status.vue
index de414e1ad037..2c9dee4231a5 100644
--- a/ee/app/assets/javascripts/related_items_tree/components/issue_health_status.vue
+++ b/ee/app/assets/javascripts/related_items_tree/components/issue_health_status.vue
@@ -10,6 +10,7 @@ export default {
     healthStatus: {
       type: String,
       required: true,
+      validator: (value) => Object.keys(issueHealthStatus).includes(value),
     },
   },
   computed: {
diff --git a/ee/spec/frontend/boards/board_card_inner_spec.js b/ee/spec/frontend/boards/board_card_inner_spec.js
index b928aac8a1b8..52eccab49776 100644
--- a/ee/spec/frontend/boards/board_card_inner_spec.js
+++ b/ee/spec/frontend/boards/board_card_inner_spec.js
@@ -2,6 +2,7 @@ import { GlLabel } from '@gitlab/ui';
 import { shallowMount } from '@vue/test-utils';
 import Vuex from 'vuex';
 import IssueCardWeight from 'ee/boards/components/issue_card_weight.vue';
+import IssueHealthStatus from 'ee/related_items_tree/components/issue_health_status.vue';
 import BoardCardInner from '~/boards/components/board_card_inner.vue';
 import { issuableTypes } from '~/boards/constants';
 import defaultStore from '~/boards/stores';
@@ -72,6 +73,7 @@ describe('Board card component', () => {
       weight: 1,
       blocked: true,
       blockedByCount: 2,
+      healthStatus: 'onTrack',
     };
   });
 
@@ -134,4 +136,12 @@ describe('Board card component', () => {
       expect(wrapper.findComponent(IssueCardWeight).exists()).toBe(true);
     });
   });
+
+  describe('health status', () => {
+    it('shows healthStatus component', () => {
+      createComponent();
+
+      expect(wrapper.findComponent(IssueHealthStatus).props('healthStatus')).toBe('onTrack');
+    });
+  });
 });
-- 
GitLab