{"version":3,"sources":["webpack:///./analytics/shared/components/value_stream_metrics.vue","webpack:///./analytics/shared/components/value_streams_dashboard_link.vue?75f8","webpack:///analytics/shared/components/value_streams_dashboard_link.vue","webpack:///./analytics/shared/components/value_streams_dashboard_link.vue?fb35","webpack:///./analytics/shared/components/value_streams_dashboard_link.vue","webpack:///./analytics/shared/components/metric_popover.vue?b78b","webpack:///analytics/shared/components/metric_popover.vue","webpack:///./analytics/shared/components/metric_popover.vue?1374","webpack:///./analytics/shared/components/metric_popover.vue","webpack:///analytics/shared/components/metric_tile.vue","webpack:///./analytics/shared/components/metric_tile.vue?175b","webpack:///./analytics/shared/components/metric_tile.vue?35ea","webpack:///./analytics/shared/components/metric_tile.vue","webpack:///analytics/shared/components/value_stream_metrics.vue","webpack:///./analytics/shared/components/value_stream_metrics.vue?7fd3","webpack:///./analytics/shared/components/value_stream_metrics.vue?f4fb","webpack:////build/source/node_modules/core-js/internals/array-method-is-strict.js","webpack:///./analytics/shared/graphql/foss.flow_metrics.query.graphql","webpack:////build/source/node_modules/core-js/modules/esnext.array.group-by.js","webpack:///./analytics/shared/graphql/commits.flow_metrics.query.graphql"],"names":["name","components","GlIcon","GlLink","props","requestPath","type","String","required","i18n","title","__","linkText","_vm","this","_c","_self","staticClass","attrs","_v","_s","$options","GlPopover","metric","Object","target","computed","metricLink","_this$metric$links","links","find","link","docs_link","docsLink","_this$metric$links2","metricPopoverLabel","METRIC_POPOVER_LABEL","scopedSlots","_u","key","fn","label","url","_e","proxy","description","GlSingleStat","MetricPopover","decimalPlaces","value","parsedFloat","parseFloat","Number","isNaN","isInteger","Math","min","countFloatingPointDigits","hasLinks","length","methods","clickHandler","visitUrl","_b","$attrs","class","identifier","unit","on","$event","extractMetricsGroupData","keyList","data","dataKeys","map","some","includes","reduce","acc","curr","item","GlSkeletonLoader","MetricTile","ValueStreamsDashboardLink","requestParams","queryType","default","ALL_METRICS_QUERY_TYPE","filterFn","Function","groupBy","Array","dashboardsPath","isProjectNamespace","Boolean","isLicensed","flowMetricsCommits","flowMetrics","doraMetrics","queryDateRange","created_after","startDate","created_before","endDate","toYmd","flowMetricsVariables","_this","additionalParams","keys","FLOW_METRICS_QUERY_FILTERS","graphqlField","fullPath","hasGroupedMetrics","isLoading","$apollo","queries","loading","groupedMetrics","groups","rawData","rest","groupRawMetrics","metrics","isFlowMetricsQuery","FLOW_METRICS_QUERY_TYPE","isDoraMetricsQuery","DORA_METRICS_QUERY_TYPE","displayableMetrics","VALUE_STREAM_METRIC_TILE_METADATA","flowMetricsCommitsResponse","_this$flowMetricsComm","_this2","combined","filter","rawMetricToMetricTile","watch","newVal","oldVal","_isEqual","Promise","all","refetch","apollo","query","FlowMetricsCommitsQuery","variables","skip","update","FlowMetricsQuery","FOSSFlowMetricsQuery","extractQueryResponseFromNamespace","result","resultKey","values","error","createAlert","message","s__","DoraMetricsQuery","interval","BUCKETING_INTERVAL_ALL","responseData","rawMetrics","entries","shouldDisplayDashboardLink","index","_l","group","groupIndex","fails","module","exports","METHOD_NAME","argument","method","call","doc","loc","source","names","definitions","concat","def","kind","definitionRefs","findOperation","i","element","forEach","refs","Set","collectFragmentReferences","node","add","selectionSet","selections","selection","variableDefinitions","operationName","newDoc","hasOwnProperty","opRefs","allRefs","newRefs","refName","size","prevRefs","has","childRef","op","push","oneQuery","$","$group","arrayMethodIsStrict","addToUnscopables","proto","forced","callbackfn","thisArg","arguments","undefined"],"mappings":"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","file":"129.70a506a0.chunk.js","sourcesContent":["var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"gl-flex\",class:_vm.isLoading ? 'gl-my-6' : 'gl-mt-6',attrs:{\"data-testid\":\"vsa-metrics\"}},[(_vm.isLoading)?_c('gl-skeleton-loader'):[(_vm.hasGroupedMetrics)?_c('div',{staticClass:\"gl-flex-col\"},_vm._l((_vm.groupedMetrics),function(group,groupIndex){return _c('div',{key:group.key,staticClass:\"gl-mb-7\",attrs:{\"data-testid\":\"vsa-metrics-group\"}},[_c('h4',{staticClass:\"gl-my-0\"},[_vm._v(_vm._s(group.title))]),_vm._v(\" \"),_c('div',{staticClass:\"gl-flex gl-flex-wrap\"},[_vm._l((group.data),function(metric){return _c('metric-tile',{key:metric.identifier,staticClass:\"gl-mt-5 gl-pr-10\",attrs:{\"metric\":metric}})}),_vm._v(\" \"),(_vm.shouldDisplayDashboardLink(groupIndex))?_c('value-streams-dashboard-link',{staticClass:\"gl-mt-5\",attrs:{\"request-path\":_vm.dashboardsPath}}):_vm._e()],2)])}),0):_c('div',{staticClass:\"gl-mb-7 gl-flex gl-flex-wrap\"},_vm._l((_vm.metrics),function(metric){return _c('metric-tile',{key:metric.identifier,staticClass:\"gl-mt-5 gl-pr-10\",attrs:{\"metric\":metric}})}),1)]],2)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../../../node_modules/thread-loader/dist/cjs.js??ref--13-0!../../../../../../node_modules/babel-loader/lib/index.js??ref--13-1!../../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./value_streams_dashboard_link.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../../../../../node_modules/thread-loader/dist/cjs.js??ref--13-0!../../../../../../node_modules/babel-loader/lib/index.js??ref--13-1!../../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./value_streams_dashboard_link.vue?vue&type=script&lang=js\"","<script>\nimport { GlIcon, GlLink } from '@gitlab/ui';\nimport { __ } from '~/locale';\n\nexport default {\n  name: 'ValueStreamsDashboardLink',\n  components: { GlIcon, GlLink },\n  props: {\n    requestPath: {\n      type: String,\n      required: true,\n    },\n  },\n  i18n: {\n    title: __('Related'),\n    // eslint-disable-next-line @gitlab/require-valid-i18n-helpers\n    linkText: __('Value Streams Dashboard | DORA'),\n  },\n};\n</script>\n<template>\n  <div class=\"gl-flex gl-flex-col\" data-testid=\"vsd-link\">\n    <div class=\"gl-mb-2 gl-flex\">\n      <span>{{ $options.i18n.title }}</span>\n    </div>\n    <div class=\"gl-flex gl-items-baseline\">\n      <gl-link :href=\"requestPath\">{{ $options.i18n.linkText }}</gl-link\n      >&nbsp;<gl-icon name=\"dashboard\" />\n    </div>\n  </div>\n</template>\n","import { render, staticRenderFns } from \"./value_streams_dashboard_link.vue?vue&type=template&id=19b2ac6a\"\nimport script from \"./value_streams_dashboard_link.vue?vue&type=script&lang=js\"\nexport * from \"./value_streams_dashboard_link.vue?vue&type=script&lang=js\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  null,\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"gl-flex gl-flex-col\",attrs:{\"data-testid\":\"vsd-link\"}},[_c('div',{staticClass:\"gl-mb-2 gl-flex\"},[_c('span',[_vm._v(_vm._s(_vm.$options.i18n.title))])]),_vm._v(\" \"),_c('div',{staticClass:\"gl-flex gl-items-baseline\"},[_c('gl-link',{attrs:{\"href\":_vm.requestPath}},[_vm._v(_vm._s(_vm.$options.i18n.linkText))]),_vm._v(\" \"),_c('gl-icon',{attrs:{\"name\":\"dashboard\"}})],1)])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../../../node_modules/thread-loader/dist/cjs.js??ref--13-0!../../../../../../node_modules/babel-loader/lib/index.js??ref--13-1!../../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./metric_popover.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../../../../../node_modules/thread-loader/dist/cjs.js??ref--13-0!../../../../../../node_modules/babel-loader/lib/index.js??ref--13-1!../../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./metric_popover.vue?vue&type=script&lang=js\"","<script>\nimport { GlPopover, GlLink, GlIcon } from '@gitlab/ui';\nimport { METRIC_POPOVER_LABEL } from '../constants';\n\nexport default {\n  name: 'MetricPopover',\n  components: {\n    GlPopover,\n    GlLink,\n    GlIcon,\n  },\n  props: {\n    metric: {\n      type: Object,\n      required: true,\n    },\n    target: {\n      type: String,\n      required: true,\n    },\n  },\n  computed: {\n    metricLink() {\n      return this.metric.links?.find((link) => !link.docs_link);\n    },\n    docsLink() {\n      return this.metric.links?.find((link) => link.docs_link);\n    },\n  },\n  metricPopoverLabel: METRIC_POPOVER_LABEL,\n};\n</script>\n\n<template>\n  <gl-popover :target=\"target\" placement=\"top\">\n    <template #title>\n      <div class=\"gl-flex gl-items-center gl-justify-between gl-py-1 gl-text-right\">\n        <span data-testid=\"metric-label\">{{ metric.label }}</span>\n        <gl-link\n          v-if=\"metricLink\"\n          :href=\"metricLink.url\"\n          class=\"gl-text-sm gl-font-normal\"\n          data-testid=\"metric-link\"\n          >{{ $options.metricPopoverLabel }}\n          <gl-icon name=\"chart\" />\n        </gl-link>\n      </div>\n    </template>\n    <span v-if=\"metric.description\" data-testid=\"metric-description\">{{ metric.description }}</span>\n    <gl-link\n      v-if=\"docsLink\"\n      :href=\"docsLink.url\"\n      class=\"gl-text-sm\"\n      target=\"_blank\"\n      data-testid=\"metric-docs-link\"\n      >{{ docsLink.label }}\n      <gl-icon name=\"external-link\" class=\"gl-align-middle\" />\n    </gl-link>\n  </gl-popover>\n</template>\n","import { render, staticRenderFns } from \"./metric_popover.vue?vue&type=template&id=5c035578\"\nimport script from \"./metric_popover.vue?vue&type=script&lang=js\"\nexport * from \"./metric_popover.vue?vue&type=script&lang=js\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  null,\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('gl-popover',{attrs:{\"target\":_vm.target,\"placement\":\"top\"},scopedSlots:_vm._u([{key:\"title\",fn:function(){return [_c('div',{staticClass:\"gl-flex gl-items-center gl-justify-between gl-py-1 gl-text-right\"},[_c('span',{attrs:{\"data-testid\":\"metric-label\"}},[_vm._v(_vm._s(_vm.metric.label))]),_vm._v(\" \"),(_vm.metricLink)?_c('gl-link',{staticClass:\"gl-text-sm gl-font-normal\",attrs:{\"href\":_vm.metricLink.url,\"data-testid\":\"metric-link\"}},[_vm._v(_vm._s(_vm.$options.metricPopoverLabel)+\"\\n        \"),_c('gl-icon',{attrs:{\"name\":\"chart\"}})],1):_vm._e()],1)]},proxy:true}])},[_vm._v(\" \"),(_vm.metric.description)?_c('span',{attrs:{\"data-testid\":\"metric-description\"}},[_vm._v(_vm._s(_vm.metric.description))]):_vm._e(),_vm._v(\" \"),(_vm.docsLink)?_c('gl-link',{staticClass:\"gl-text-sm\",attrs:{\"href\":_vm.docsLink.url,\"target\":\"_blank\",\"data-testid\":\"metric-docs-link\"}},[_vm._v(_vm._s(_vm.docsLink.label)+\"\\n    \"),_c('gl-icon',{staticClass:\"gl-align-middle\",attrs:{\"name\":\"external-link\"}})],1):_vm._e()],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<script>\nimport { GlSingleStat } from '@gitlab/ui/dist/charts';\nimport { countFloatingPointDigits } from '~/lib/utils/number_utils';\nimport { visitUrl } from '~/lib/utils/url_utility';\nimport MetricPopover from './metric_popover.vue';\n\nconst MAX_DISPLAYED_DECIMAL_PRECISION = 2;\n\nexport default {\n  name: 'MetricTile',\n  components: {\n    GlSingleStat,\n    MetricPopover,\n  },\n  props: {\n    metric: {\n      type: Object,\n      required: true,\n    },\n  },\n  computed: {\n    decimalPlaces() {\n      const { value } = this.metric;\n      const parsedFloat = parseFloat(value);\n\n      if (!Number.isNaN(parsedFloat) && !Number.isInteger(parsedFloat)) {\n        return Math.min(countFloatingPointDigits(value), MAX_DISPLAYED_DECIMAL_PRECISION);\n      }\n      return 0;\n    },\n    hasLinks() {\n      return this.metric.links?.length && this.metric.links[0].url;\n    },\n  },\n  methods: {\n    clickHandler({ links }) {\n      if (this.hasLinks) {\n        visitUrl(links[0].url);\n      }\n    },\n  },\n};\n</script>\n<template>\n  <div v-bind=\"$attrs\">\n    <gl-single-stat\n      :id=\"metric.identifier\"\n      :value=\"`${metric.value}`\"\n      :title=\"metric.label\"\n      :unit=\"metric.unit || ''\"\n      :should-animate=\"true\"\n      :animation-decimal-places=\"decimalPlaces\"\n      :class=\"{ 'hover:gl-cursor-pointer': hasLinks }\"\n      data-testid=\"metric-tile\"\n      tabindex=\"0\"\n      use-delimiters\n      @click=\"clickHandler(metric)\"\n    />\n    <metric-popover :metric=\"metric\" :target=\"metric.identifier\" />\n  </div>\n</template>\n","import mod from \"-!../../../../../../node_modules/thread-loader/dist/cjs.js??ref--13-0!../../../../../../node_modules/babel-loader/lib/index.js??ref--13-1!../../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./metric_tile.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../../../../../node_modules/thread-loader/dist/cjs.js??ref--13-0!../../../../../../node_modules/babel-loader/lib/index.js??ref--13-1!../../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./metric_tile.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./metric_tile.vue?vue&type=template&id=9e66c58c\"\nimport script from \"./metric_tile.vue?vue&type=script&lang=js\"\nexport * from \"./metric_tile.vue?vue&type=script&lang=js\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  null,\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',_vm._b({},'div',_vm.$attrs,false),[_c('gl-single-stat',{class:{ 'hover:gl-cursor-pointer': _vm.hasLinks },attrs:{\"id\":_vm.metric.identifier,\"value\":`${_vm.metric.value}`,\"title\":_vm.metric.label,\"unit\":_vm.metric.unit || '',\"should-animate\":true,\"animation-decimal-places\":_vm.decimalPlaces,\"data-testid\":\"metric-tile\",\"tabindex\":\"0\",\"use-delimiters\":\"\"},on:{\"click\":function($event){return _vm.clickHandler(_vm.metric)}}}),_vm._v(\" \"),_c('metric-popover',{attrs:{\"metric\":_vm.metric,\"target\":_vm.metric.identifier}})],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<script>\nimport { GlSkeletonLoader } from '@gitlab/ui';\nimport { isEqual } from 'lodash';\nimport { createAlert } from '~/alert';\nimport { s__ } from '~/locale';\nimport {\n  DORA_METRICS_QUERY_TYPE,\n  FLOW_METRICS_QUERY_TYPE,\n  ALL_METRICS_QUERY_TYPE,\n  VALUE_STREAM_METRIC_TILE_METADATA,\n} from '../constants';\nimport { rawMetricToMetricTile, extractQueryResponseFromNamespace, toYmd } from '../utils';\nimport { BUCKETING_INTERVAL_ALL, FLOW_METRICS_QUERY_FILTERS } from '../graphql/constants';\nimport FlowMetricsQuery from '../graphql/flow_metrics.query.graphql';\nimport FOSSFlowMetricsQuery from '../graphql/foss.flow_metrics.query.graphql';\nimport DoraMetricsQuery from '../graphql/dora_metrics.query.graphql';\nimport FlowMetricsCommitsQuery from '../graphql/commits.flow_metrics.query.graphql';\nimport ValueStreamsDashboardLink from './value_streams_dashboard_link.vue';\nimport MetricTile from './metric_tile.vue';\n\nconst extractMetricsGroupData = (keyList = [], data = []) => {\n  const dataKeys = data.map(({ identifier }) => identifier);\n  if (!keyList.length || !dataKeys.some((key) => keyList.includes(key))) return [];\n\n  return keyList.reduce((acc, curr) => {\n    const metric = data.find((item) => item.identifier === curr);\n    return metric ? [...acc, metric] : acc;\n  }, []);\n};\n\nconst groupRawMetrics = (groups = [], rawData = []) => {\n  return groups.map((curr) => {\n    const { keys, ...rest } = curr;\n    return {\n      data: extractMetricsGroupData(keys, rawData),\n      keys,\n      ...rest,\n    };\n  });\n};\n\nexport default {\n  name: 'ValueStreamMetrics',\n  components: {\n    GlSkeletonLoader,\n    MetricTile,\n    ValueStreamsDashboardLink,\n  },\n  props: {\n    requestPath: {\n      type: String,\n      required: true,\n    },\n    requestParams: {\n      type: Object,\n      required: true,\n    },\n    queryType: {\n      type: String,\n      required: false,\n      default: ALL_METRICS_QUERY_TYPE,\n    },\n    filterFn: {\n      type: Function,\n      required: false,\n      default: null,\n    },\n    groupBy: {\n      type: Array,\n      required: false,\n      default: () => [],\n    },\n    dashboardsPath: {\n      type: String,\n      required: false,\n      default: null,\n    },\n    isProjectNamespace: {\n      type: Boolean,\n      required: false,\n      default: false,\n    },\n    isLicensed: {\n      type: Boolean,\n      required: false,\n      default: false,\n    },\n  },\n  data() {\n    return {\n      flowMetricsCommits: {},\n      flowMetrics: [],\n      doraMetrics: [],\n    };\n  },\n  computed: {\n    queryDateRange() {\n      const { created_after: startDate, created_before: endDate } = this.requestParams;\n      return { startDate: toYmd(startDate), endDate: toYmd(endDate) };\n    },\n    flowMetricsVariables() {\n      const additionalParams = Object.keys(FLOW_METRICS_QUERY_FILTERS).reduce((acc, key) => {\n        if (this.requestParams[key]) {\n          const graphqlField = FLOW_METRICS_QUERY_FILTERS[key];\n          return { ...acc, [graphqlField]: this.requestParams[key] };\n        }\n        return acc;\n      }, {});\n      return { fullPath: this.requestPath, ...this.queryDateRange, ...additionalParams };\n    },\n    hasGroupedMetrics() {\n      return Boolean(this.groupBy.length);\n    },\n    isLoading() {\n      return Boolean(\n        this.$apollo.queries.doraMetrics.loading ||\n          this.$apollo.queries.flowMetrics.loading ||\n          this.$apollo.queries.flowMetricsCommits.loading,\n      );\n    },\n    groupedMetrics() {\n      return groupRawMetrics(this.groupBy, this.metrics);\n    },\n    isFlowMetricsQuery() {\n      return [ALL_METRICS_QUERY_TYPE, FLOW_METRICS_QUERY_TYPE].includes(this.queryType);\n    },\n    isDoraMetricsQuery() {\n      return [ALL_METRICS_QUERY_TYPE, DORA_METRICS_QUERY_TYPE].includes(this.queryType);\n    },\n    displayableMetrics() {\n      // NOTE: workaround while the flowMetrics/doraMetrics dont support including/excluding unwanted metrics from the response\n      // it would be useful to return this to the frontend with relevant permissions checks having occurred on the backend\n      return Object.keys(VALUE_STREAM_METRIC_TILE_METADATA);\n    },\n    flowMetricsCommitsResponse() {\n      return this.flowMetricsCommits?.identifier ? [this.flowMetricsCommits] : [];\n    },\n    metrics() {\n      const combined = [\n        ...this.flowMetrics,\n        ...this.doraMetrics,\n        ...this.flowMetricsCommitsResponse,\n      ].filter(({ identifier }) => this.displayableMetrics.includes(identifier));\n      const filtered = this.filterFn ? this.filterFn(combined) : combined;\n      return filtered.map((metric) => rawMetricToMetricTile(metric));\n    },\n  },\n  watch: {\n    async requestParams(newVal, oldVal) {\n      if (!isEqual(newVal, oldVal)) {\n        await Promise.all([\n          this.$apollo.queries.doraMetrics.refetch(),\n          this.$apollo.queries.flowMetrics.refetch(),\n          this.$apollo.queries.flowMetricsCommits.refetch(),\n        ]);\n      }\n    },\n  },\n  apollo: {\n    flowMetricsCommits: {\n      query: FlowMetricsCommitsQuery,\n      variables() {\n        return this.flowMetricsVariables;\n      },\n      skip() {\n        return !this.isFlowMetricsQuery || !this.isProjectNamespace;\n      },\n      update(data) {\n        return data?.flowMetricsCommits ? data.flowMetricsCommits : {};\n      },\n    },\n    flowMetrics: {\n      query() {\n        // NOTE: we don't have a way to include/exclude fields from the query, the queries\n        //      subsequently fail if we query fields that arent available / applicable\n        //      Related issue created: https://gitlab.com/gitlab-org/gitlab/-/issues/506282\n        return this.isLicensed ? FlowMetricsQuery : FOSSFlowMetricsQuery;\n      },\n      variables() {\n        return this.flowMetricsVariables;\n      },\n      skip() {\n        return !this.isFlowMetricsQuery;\n      },\n      update(data) {\n        const metrics = extractQueryResponseFromNamespace({\n          result: { data },\n          resultKey: 'flowMetrics',\n        });\n\n        return Object.values(metrics).filter((metric) => metric?.identifier);\n      },\n      error() {\n        createAlert({\n          message: s__('ValueStreamAnalytics|There was an error while fetching flow metrics data.'),\n        });\n      },\n    },\n    doraMetrics: {\n      query: DoraMetricsQuery,\n      variables() {\n        return {\n          ...this.queryDateRange,\n          fullPath: this.requestPath,\n          interval: BUCKETING_INTERVAL_ALL,\n        };\n      },\n      skip() {\n        return !this.isLicensed || !this.isDoraMetricsQuery;\n      },\n      update(data) {\n        const responseData = extractQueryResponseFromNamespace({\n          result: { data },\n          resultKey: 'dora',\n        });\n\n        const [rawMetrics] = responseData.metrics;\n        return Object.entries(rawMetrics).reduce((acc, [identifier, value]) => {\n          return [...acc, { identifier, value }];\n        }, []);\n      },\n      error() {\n        createAlert({\n          message: s__('ValueStreamAnalytics|There was an error while fetching DORA metrics data.'),\n        });\n      },\n    },\n  },\n  methods: {\n    shouldDisplayDashboardLink(index) {\n      // When we have groups of metrics, we should only display the link for the first group\n      return index === 0 && this.dashboardsPath;\n    },\n  },\n};\n</script>\n<template>\n  <div class=\"gl-flex\" data-testid=\"vsa-metrics\" :class=\"isLoading ? 'gl-my-6' : 'gl-mt-6'\">\n    <gl-skeleton-loader v-if=\"isLoading\" />\n    <template v-else>\n      <div v-if=\"hasGroupedMetrics\" class=\"gl-flex-col\">\n        <div\n          v-for=\"(group, groupIndex) in groupedMetrics\"\n          :key=\"group.key\"\n          class=\"gl-mb-7\"\n          data-testid=\"vsa-metrics-group\"\n        >\n          <h4 class=\"gl-my-0\">{{ group.title }}</h4>\n          <div class=\"gl-flex gl-flex-wrap\">\n            <metric-tile\n              v-for=\"metric in group.data\"\n              :key=\"metric.identifier\"\n              :metric=\"metric\"\n              class=\"gl-mt-5 gl-pr-10\"\n            />\n            <value-streams-dashboard-link\n              v-if=\"shouldDisplayDashboardLink(groupIndex)\"\n              class=\"gl-mt-5\"\n              :request-path=\"dashboardsPath\"\n            />\n          </div>\n        </div>\n      </div>\n      <div v-else class=\"gl-mb-7 gl-flex gl-flex-wrap\">\n        <metric-tile\n          v-for=\"metric in metrics\"\n          :key=\"metric.identifier\"\n          :metric=\"metric\"\n          class=\"gl-mt-5 gl-pr-10\"\n        />\n      </div>\n    </template>\n  </div>\n</template>\n","import mod from \"-!../../../../../../node_modules/thread-loader/dist/cjs.js??ref--13-0!../../../../../../node_modules/babel-loader/lib/index.js??ref--13-1!../../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./value_stream_metrics.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../../../../../node_modules/thread-loader/dist/cjs.js??ref--13-0!../../../../../../node_modules/babel-loader/lib/index.js??ref--13-1!../../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./value_stream_metrics.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./value_stream_metrics.vue?vue&type=template&id=6720ab96\"\nimport script from \"./value_stream_metrics.vue?vue&type=script&lang=js\"\nexport * from \"./value_stream_metrics.vue?vue&type=script&lang=js\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  null,\n  null\n  \n)\n\nexport default component.exports","'use strict';\nvar fails = require('../internals/fails');\n\nmodule.exports = function (METHOD_NAME, argument) {\n  var method = [][METHOD_NAME];\n  return !!method && fails(function () {\n    // eslint-disable-next-line no-useless-call -- required for testing\n    method.call(null, argument || function () { return 1; }, 1);\n  });\n};\n","\n    var doc = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"query\",\"name\":{\"kind\":\"Name\",\"value\":\"fossFlowMetricsQuery\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"fullPath\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"ID\"}}},\"directives\":[]},{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"startDate\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Time\"}}},\"directives\":[]},{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"endDate\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Time\"}}},\"directives\":[]},{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"labelNames\"}},\"type\":{\"kind\":\"ListType\",\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"String\"}}}},\"directives\":[]}],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"project\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"fullPath\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"fullPath\"}}}],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"flowMetrics\"},\"arguments\":[],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"alias\":{\"kind\":\"Name\",\"value\":\"issues\"},\"name\":{\"kind\":\"Name\",\"value\":\"issueCount\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"from\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"startDate\"}}},{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"to\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"endDate\"}}},{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"labelNames\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"labelNames\"}}}],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"FlowMetricItem\"},\"directives\":[]}]}},{\"kind\":\"Field\",\"alias\":{\"kind\":\"Name\",\"value\":\"deploys\"},\"name\":{\"kind\":\"Name\",\"value\":\"deploymentCount\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"from\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"startDate\"}}},{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"to\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"endDate\"}}}],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"FlowMetricItem\"},\"directives\":[]}]}}]}}]}}]}}],\"loc\":{\"start\":0,\"end\":446}};\n    doc.loc.source = {\"body\":\"#import \\\"./flow_metric_item.fragment.graphql\\\"\\n\\nquery fossFlowMetricsQuery(\\n  $fullPath: ID!\\n  $startDate: Time!\\n  $endDate: Time!\\n  $labelNames: [String!]\\n) {\\n  project(fullPath: $fullPath) {\\n    id\\n    flowMetrics {\\n      issues: issueCount(from: $startDate, to: $endDate, labelNames: $labelNames) {\\n        ...FlowMetricItem\\n      }\\n      deploys: deploymentCount(from: $startDate, to: $endDate) {\\n        ...FlowMetricItem\\n      }\\n    }\\n  }\\n}\\n\",\"name\":\"GraphQL request\",\"locationOffset\":{\"line\":1,\"column\":1}};\n  \n\n    var names = {};\n    function unique(defs) {\n      return defs.filter(\n        function(def) {\n          if (def.kind !== 'FragmentDefinition') return true;\n          var name = def.name.value\n          if (names[name]) {\n            return false;\n          } else {\n            names[name] = true;\n            return true;\n          }\n        }\n      )\n    }\n  doc.definitions = doc.definitions.concat(unique(require(\"./flow_metric_item.fragment.graphql\").definitions));\n\n\n    // Collect any fragment/type references from a node, adding them to the refs Set\n    function collectFragmentReferences(node, refs) {\n      if (node.kind === \"FragmentSpread\") {\n        refs.add(node.name.value);\n      } else if (node.kind === \"VariableDefinition\") {\n        var type = node.type;\n        if (type.kind === \"NamedType\") {\n          refs.add(type.name.value);\n        }\n      }\n\n      if (node.selectionSet) {\n        node.selectionSet.selections.forEach(function(selection) {\n          collectFragmentReferences(selection, refs);\n        });\n      }\n\n      if (node.variableDefinitions) {\n        node.variableDefinitions.forEach(function(def) {\n          collectFragmentReferences(def, refs);\n        });\n      }\n\n      if (node.definitions) {\n        node.definitions.forEach(function(def) {\n          collectFragmentReferences(def, refs);\n        });\n      }\n    }\n\n    var definitionRefs = {};\n    (function extractReferences() {\n      doc.definitions.forEach(function(def) {\n        if (def.name) {\n          var refs = new Set();\n          collectFragmentReferences(def, refs);\n          definitionRefs[def.name.value] = refs;\n        }\n      });\n    })();\n\n    function findOperation(doc, name) {\n      for (var i = 0; i < doc.definitions.length; i++) {\n        var element = doc.definitions[i];\n        if (element.name && element.name.value == name) {\n          return element;\n        }\n      }\n    }\n\n    function oneQuery(doc, operationName) {\n      // Copy the DocumentNode, but clear out the definitions\n      var newDoc = {\n        kind: doc.kind,\n        definitions: [findOperation(doc, operationName)]\n      };\n      if (doc.hasOwnProperty(\"loc\")) {\n        newDoc.loc = doc.loc;\n      }\n\n      // Now, for the operation we're running, find any fragments referenced by\n      // it or the fragments it references\n      var opRefs = definitionRefs[operationName] || new Set();\n      var allRefs = new Set();\n      var newRefs = new Set();\n\n      // IE 11 doesn't support \"new Set(iterable)\", so we add the members of opRefs to newRefs one by one\n      opRefs.forEach(function(refName) {\n        newRefs.add(refName);\n      });\n\n      while (newRefs.size > 0) {\n        var prevRefs = newRefs;\n        newRefs = new Set();\n\n        prevRefs.forEach(function(refName) {\n          if (!allRefs.has(refName)) {\n            allRefs.add(refName);\n            var childRefs = definitionRefs[refName] || new Set();\n            childRefs.forEach(function(childRef) {\n              newRefs.add(childRef);\n            });\n          }\n        });\n      }\n\n      allRefs.forEach(function(refName) {\n        var op = findOperation(doc, refName);\n        if (op) {\n          newDoc.definitions.push(op);\n        }\n      });\n\n      return newDoc;\n    }\n    \n    module.exports = doc;\n    \n        module.exports[\"fossFlowMetricsQuery\"] = oneQuery(doc, \"fossFlowMetricsQuery\");\n        \n","'use strict';\n// TODO: Remove from `core-js@4`\nvar $ = require('../internals/export');\nvar $group = require('../internals/array-group');\nvar arrayMethodIsStrict = require('../internals/array-method-is-strict');\nvar addToUnscopables = require('../internals/add-to-unscopables');\n\n// `Array.prototype.groupBy` method\n// https://github.com/tc39/proposal-array-grouping\n// https://bugs.webkit.org/show_bug.cgi?id=236541\n$({ target: 'Array', proto: true, forced: !arrayMethodIsStrict('groupBy') }, {\n  groupBy: function groupBy(callbackfn /* , thisArg */) {\n    var thisArg = arguments.length > 1 ? arguments[1] : undefined;\n    return $group(this, callbackfn, thisArg);\n  }\n});\n\naddToUnscopables('groupBy');\n","\n    var doc = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"query\",\"name\":{\"kind\":\"Name\",\"value\":\"flowMetricsCommitsQuery\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"fullPath\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"ID\"}}},\"directives\":[]},{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"startDate\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Time\"}}},\"directives\":[]},{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"endDate\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Time\"}}},\"directives\":[]},{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"labelNames\"}},\"type\":{\"kind\":\"ListType\",\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"String\"}}}},\"directives\":[]}],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"flowMetricsCommits\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"fullPath\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"fullPath\"}}},{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"startDate\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"startDate\"}}},{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"endDate\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"endDate\"}}},{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"labelNames\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"labelNames\"}}}],\"directives\":[{\"kind\":\"Directive\",\"name\":{\"kind\":\"Name\",\"value\":\"client\"},\"arguments\":[]}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"value\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"identifier\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"links\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"title\"},\"arguments\":[],\"directives\":[]}]}}]}}],\"loc\":{\"start\":0,\"end\":361}};\n    doc.loc.source = {\"body\":\"# NOTE: Commits can only be queried for project namespaces\\nquery flowMetricsCommitsQuery(\\n  $fullPath: ID!\\n  $startDate: Time!\\n  $endDate: Time!\\n  $labelNames: [String!]\\n) {\\n  flowMetricsCommits(\\n    fullPath: $fullPath\\n    startDate: $startDate\\n    endDate: $endDate\\n    labelNames: $labelNames\\n  ) @client {\\n    value\\n    identifier\\n    links\\n    title\\n  }\\n}\\n\",\"name\":\"GraphQL request\",\"locationOffset\":{\"line\":1,\"column\":1}};\n  \n\n    var names = {};\n    function unique(defs) {\n      return defs.filter(\n        function(def) {\n          if (def.kind !== 'FragmentDefinition') return true;\n          var name = def.name.value\n          if (names[name]) {\n            return false;\n          } else {\n            names[name] = true;\n            return true;\n          }\n        }\n      )\n    }\n  \n\n    // Collect any fragment/type references from a node, adding them to the refs Set\n    function collectFragmentReferences(node, refs) {\n      if (node.kind === \"FragmentSpread\") {\n        refs.add(node.name.value);\n      } else if (node.kind === \"VariableDefinition\") {\n        var type = node.type;\n        if (type.kind === \"NamedType\") {\n          refs.add(type.name.value);\n        }\n      }\n\n      if (node.selectionSet) {\n        node.selectionSet.selections.forEach(function(selection) {\n          collectFragmentReferences(selection, refs);\n        });\n      }\n\n      if (node.variableDefinitions) {\n        node.variableDefinitions.forEach(function(def) {\n          collectFragmentReferences(def, refs);\n        });\n      }\n\n      if (node.definitions) {\n        node.definitions.forEach(function(def) {\n          collectFragmentReferences(def, refs);\n        });\n      }\n    }\n\n    var definitionRefs = {};\n    (function extractReferences() {\n      doc.definitions.forEach(function(def) {\n        if (def.name) {\n          var refs = new Set();\n          collectFragmentReferences(def, refs);\n          definitionRefs[def.name.value] = refs;\n        }\n      });\n    })();\n\n    function findOperation(doc, name) {\n      for (var i = 0; i < doc.definitions.length; i++) {\n        var element = doc.definitions[i];\n        if (element.name && element.name.value == name) {\n          return element;\n        }\n      }\n    }\n\n    function oneQuery(doc, operationName) {\n      // Copy the DocumentNode, but clear out the definitions\n      var newDoc = {\n        kind: doc.kind,\n        definitions: [findOperation(doc, operationName)]\n      };\n      if (doc.hasOwnProperty(\"loc\")) {\n        newDoc.loc = doc.loc;\n      }\n\n      // Now, for the operation we're running, find any fragments referenced by\n      // it or the fragments it references\n      var opRefs = definitionRefs[operationName] || new Set();\n      var allRefs = new Set();\n      var newRefs = new Set();\n\n      // IE 11 doesn't support \"new Set(iterable)\", so we add the members of opRefs to newRefs one by one\n      opRefs.forEach(function(refName) {\n        newRefs.add(refName);\n      });\n\n      while (newRefs.size > 0) {\n        var prevRefs = newRefs;\n        newRefs = new Set();\n\n        prevRefs.forEach(function(refName) {\n          if (!allRefs.has(refName)) {\n            allRefs.add(refName);\n            var childRefs = definitionRefs[refName] || new Set();\n            childRefs.forEach(function(childRef) {\n              newRefs.add(childRef);\n            });\n          }\n        });\n      }\n\n      allRefs.forEach(function(refName) {\n        var op = findOperation(doc, refName);\n        if (op) {\n          newDoc.definitions.push(op);\n        }\n      });\n\n      return newDoc;\n    }\n    \n    module.exports = doc;\n    \n        module.exports[\"flowMetricsCommitsQuery\"] = oneQuery(doc, \"flowMetricsCommitsQuery\");\n        \n"],"sourceRoot":""}