From b8df4ef64c8aa0e1a3a1ee16c567d854344257b0 Mon Sep 17 00:00:00 2001
From: "Marc Saleiko (OOO - back on 07/31)" <msaleiko@gitlab.com>
Date: Mon, 24 Jul 2023 15:40:08 +0000
Subject: [PATCH] Applies frontend review suggestions

Removes unnecessary attributes and
adds snapshot spec.
---
 .../components/badges/beta_badge.stories.js   | 19 ++++++
 .../components/badges/beta_badge.vue          | 58 +++++++++++++++++++
 locale/gitlab.pot                             | 24 ++++++++
 .../__snapshots__/beta_badge_spec.js.snap     | 53 +++++++++++++++++
 .../components/badges/beta_badge_spec.js      | 12 ++++
 5 files changed, 166 insertions(+)
 create mode 100644 app/assets/javascripts/vue_shared/components/badges/beta_badge.stories.js
 create mode 100644 app/assets/javascripts/vue_shared/components/badges/beta_badge.vue
 create mode 100644 spec/frontend/vue_shared/components/badges/__snapshots__/beta_badge_spec.js.snap
 create mode 100644 spec/frontend/vue_shared/components/badges/beta_badge_spec.js

diff --git a/app/assets/javascripts/vue_shared/components/badges/beta_badge.stories.js b/app/assets/javascripts/vue_shared/components/badges/beta_badge.stories.js
new file mode 100644
index 0000000000000..3cef1bf4ba5a7
--- /dev/null
+++ b/app/assets/javascripts/vue_shared/components/badges/beta_badge.stories.js
@@ -0,0 +1,19 @@
+import BetaBadge from './beta_badge.vue';
+
+export default {
+  component: BetaBadge,
+  title: 'vue_shared/beta-badge',
+};
+
+const template = `
+    <div style="height:600px;" class="gl-display-flex gl-justify-content-center gl-align-items-center">
+      <beta-badge />
+    </div>
+  `;
+
+const Template = () => ({
+  components: { BetaBadge },
+  template,
+});
+
+export const Default = Template.bind({});
diff --git a/app/assets/javascripts/vue_shared/components/badges/beta_badge.vue b/app/assets/javascripts/vue_shared/components/badges/beta_badge.vue
new file mode 100644
index 0000000000000..198b658027704
--- /dev/null
+++ b/app/assets/javascripts/vue_shared/components/badges/beta_badge.vue
@@ -0,0 +1,58 @@
+<script>
+import { GlBadge, GlPopover } from '@gitlab/ui';
+import { s__ } from '~/locale';
+
+export default {
+  name: 'BetaBadge',
+  components: { GlBadge, GlPopover },
+  i18n: {
+    badgeLabel: s__('BetaBadge|Beta'),
+    popoverTitle: s__("BetaBadge|What's Beta?"),
+    descriptionParagraph: s__(
+      "BetaBadge|A Beta feature is not production-ready, but is unlikely to change drastically before it's released. We encourage users to try Beta features and provide feedback.",
+    ),
+    listIntroduction: s__('BetaBadge|A Beta feature:'),
+    listItemStability: s__('BetaBadge|May have performance or stability issues.'),
+    listItemDataLoss: s__('BetaBadge|Should not cause data loss.'),
+    listItemReasonableEffort: s__('BetaBadge|Is supported by a commercially reasonable effort.'),
+    listItemNearCompletion: s__('BetaBadge|Is complete or near completion.'),
+  },
+  methods: {
+    target() {
+      /**
+       * BVPopover retrieves the target during the `beforeDestroy` hook to deregister attached
+       * events. Since during `beforeDestroy` refs are `undefined`, it throws a warning in the
+       * console because we're trying to access the `$el` property of `undefined`. Optional
+       * chaining is not working in templates, which is why the method is used.
+       *
+       * See more on https://gitlab.com/gitlab-org/gitlab/-/merge_requests/49628#note_464803276
+       */
+      return this.$refs.badge?.$el;
+    },
+  },
+};
+</script>
+
+<template>
+  <div>
+    <gl-badge ref="badge" class="gl-cursor-pointer">{{ $options.i18n.badgeLabel }}</gl-badge>
+    <gl-popover
+      triggers="hover focus click"
+      :show-close-button="true"
+      :target="target"
+      :title="$options.i18n.popoverTitle"
+      data-testid="beta-badge"
+    >
+      <p>{{ $options.i18n.descriptionParagraph }}</p>
+
+      <p class="gl-mb-0">{{ $options.i18n.listIntroduction }}</p>
+
+      <ul class="gl-pl-4">
+        <li>{{ $options.i18n.listItemStability }}</li>
+        <li>{{ $options.i18n.listItemDataLoss }}</li>
+        <li>{{ $options.i18n.listItemReasonableEffort }}</li>
+        <li>{{ $options.i18n.listItemNearCompletion }}</li>
+      </ul>
+    </gl-popover>
+  </div>
+</template>
diff --git a/locale/gitlab.pot b/locale/gitlab.pot
index 600b49e62f158..60752ce271846 100644
--- a/locale/gitlab.pot
+++ b/locale/gitlab.pot
@@ -7235,6 +7235,30 @@ msgstr ""
 msgid "Beta"
 msgstr ""
 
+msgid "BetaBadge|A Beta feature is not production-ready, but is unlikely to change drastically before it's released. We encourage users to try Beta features and provide feedback."
+msgstr ""
+
+msgid "BetaBadge|A Beta feature:"
+msgstr ""
+
+msgid "BetaBadge|Beta"
+msgstr ""
+
+msgid "BetaBadge|Is complete or near completion."
+msgstr ""
+
+msgid "BetaBadge|Is supported by a commercially reasonable effort."
+msgstr ""
+
+msgid "BetaBadge|May have performance or stability issues."
+msgstr ""
+
+msgid "BetaBadge|Should not cause data loss."
+msgstr ""
+
+msgid "BetaBadge|What's Beta?"
+msgstr ""
+
 msgid "Bi-weekly code coverage"
 msgstr ""
 
diff --git a/spec/frontend/vue_shared/components/badges/__snapshots__/beta_badge_spec.js.snap b/spec/frontend/vue_shared/components/badges/__snapshots__/beta_badge_spec.js.snap
new file mode 100644
index 0000000000000..5c49ea1b9f404
--- /dev/null
+++ b/spec/frontend/vue_shared/components/badges/__snapshots__/beta_badge_spec.js.snap
@@ -0,0 +1,53 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`Beta badge component renders the badge 1`] = `
+<div>
+  <gl-badge-stub
+    class="gl-cursor-pointer"
+    iconsize="md"
+    size="md"
+    variant="muted"
+  >
+    Beta
+  </gl-badge-stub>
+   
+  <gl-popover-stub
+    cssclasses=""
+    data-testid="beta-badge"
+    showclosebutton="true"
+    target="[Function]"
+    title="What's Beta?"
+    triggers="hover focus click"
+  >
+    <p>
+      A Beta feature is not production-ready, but is unlikely to change drastically before it's released. We encourage users to try Beta features and provide feedback.
+    </p>
+     
+    <p
+      class="gl-mb-0"
+    >
+      A Beta feature:
+    </p>
+     
+    <ul
+      class="gl-pl-4"
+    >
+      <li>
+        May have performance or stability issues.
+      </li>
+       
+      <li>
+        Should not cause data loss.
+      </li>
+       
+      <li>
+        Is supported by a commercially reasonable effort.
+      </li>
+       
+      <li>
+        Is complete or near completion.
+      </li>
+    </ul>
+  </gl-popover-stub>
+</div>
+`;
diff --git a/spec/frontend/vue_shared/components/badges/beta_badge_spec.js b/spec/frontend/vue_shared/components/badges/beta_badge_spec.js
new file mode 100644
index 0000000000000..6109fad931044
--- /dev/null
+++ b/spec/frontend/vue_shared/components/badges/beta_badge_spec.js
@@ -0,0 +1,12 @@
+import { shallowMount } from '@vue/test-utils';
+import BetaBadge from '~/vue_shared/components/badges/beta_badge.vue';
+
+describe('Beta badge component', () => {
+  let wrapper;
+
+  it('renders the badge', () => {
+    wrapper = shallowMount(BetaBadge);
+
+    expect(wrapper.element).toMatchSnapshot();
+  });
+});
-- 
GitLab