Commit dc061823 authored by GitLab Bot's avatar GitLab Bot

Automatic merge of gitlab-org/gitlab master

parents a192b689 6bf61eb6
...@@ -760,7 +760,7 @@ GEM ...@@ -760,7 +760,7 @@ GEM
mini_histogram (0.3.1) mini_histogram (0.3.1)
mini_magick (4.10.1) mini_magick (4.10.1)
mini_mime (1.0.2) mini_mime (1.0.2)
mini_portile2 (2.5.0) mini_portile2 (2.5.1)
minitest (5.11.3) minitest (5.11.3)
mixlib-cli (2.1.8) mixlib-cli (2.1.8)
mixlib-config (3.0.9) mixlib-config (3.0.9)
...@@ -798,7 +798,7 @@ GEM ...@@ -798,7 +798,7 @@ GEM
netrc (0.11.0) netrc (0.11.0)
nio4r (2.5.4) nio4r (2.5.4)
no_proxy_fix (0.1.2) no_proxy_fix (0.1.2)
nokogiri (1.11.4) nokogiri (1.11.5)
mini_portile2 (~> 2.5.0) mini_portile2 (~> 2.5.0)
racc (~> 1.4) racc (~> 1.4)
nokogumbo (2.0.2) nokogumbo (2.0.2)
......
...@@ -72,9 +72,8 @@ ...@@ -72,9 +72,8 @@
.checkbox-icon-inline-wrapper .checkbox-icon-inline-wrapper
= status_form.check_box :availability, { data: { testid: "user-availability-checkbox" }, label: s_("Profiles|Busy"), wrapper_class: 'gl-mr-0 gl-font-weight-bold' }, availability["busy"], availability["not_set"] = status_form.check_box :availability, { data: { testid: "user-availability-checkbox" }, label: s_("Profiles|Busy"), wrapper_class: 'gl-mr-0 gl-font-weight-bold' }, availability["busy"], availability["not_set"]
.gl-text-gray-600.gl-ml-5= s_('Profiles|"Busy" will be shown next to your name') .gl-text-gray-600.gl-ml-5= s_('Profiles|"Busy" will be shown next to your name')
- if Feature.enabled?(:user_time_settings) .col-lg-12
.col-lg-12 %hr
%hr
.row.user-time-preferences.js-search-settings-section .row.user-time-preferences.js-search-settings-section
.col-lg-4.profile-settings-sidebar .col-lg-4.profile-settings-sidebar
%h4.gl-mt-0= s_("Profiles|Time settings") %h4.gl-mt-0= s_("Profiles|Time settings")
......
...@@ -41,7 +41,6 @@ export default { ...@@ -41,7 +41,6 @@ export default {
}, },
computed: { computed: {
...mapState([ ...mapState([
'featureFlags',
'isLoading', 'isLoading',
'isLoadingStage', 'isLoadingStage',
'currentGroup', 'currentGroup',
...@@ -74,9 +73,6 @@ export default { ...@@ -74,9 +73,6 @@ export default {
shouldDisplayFilters() { shouldDisplayFilters() {
return !this.errorCode && !this.hasNoAccessError; return !this.errorCode && !this.hasNoAccessError;
}, },
shouldDisplayDurationChart() {
return this.featureFlags.hasDurationChart;
},
selectedStageReady() { selectedStageReady() {
return !this.hasNoAccessError && this.selectedStage; return !this.hasNoAccessError && this.selectedStage;
}, },
...@@ -200,11 +196,7 @@ export default { ...@@ -200,11 +196,7 @@ export default {
<template v-else> <template v-else>
<template v-if="isOverviewStageSelected"> <template v-if="isOverviewStageSelected">
<metrics :group-path="currentGroupPath" :request-params="cycleAnalyticsRequestParams" /> <metrics :group-path="currentGroupPath" :request-params="cycleAnalyticsRequestParams" />
<duration-chart <duration-chart class="gl-mt-3" :stages="activeStages" />
v-if="shouldDisplayDurationChart"
class="gl-mt-3"
:stages="activeStages"
/>
<type-of-work-charts /> <type-of-work-charts />
</template> </template>
<stage-table <stage-table
......
...@@ -19,7 +19,6 @@ export default () => { ...@@ -19,7 +19,6 @@ export default () => {
const { emptyStateSvgPath, noDataSvgPath, noAccessSvgPath } = el.dataset; const { emptyStateSvgPath, noDataSvgPath, noAccessSvgPath } = el.dataset;
const initialData = buildCycleAnalyticsInitialData(el.dataset); const initialData = buildCycleAnalyticsInitialData(el.dataset);
const store = createStore(); const store = createStore();
const { cycleAnalyticsScatterplotEnabled: hasDurationChart = false } = gon?.features;
const { const {
author_username = null, author_username = null,
...@@ -37,7 +36,6 @@ export default () => { ...@@ -37,7 +36,6 @@ export default () => {
selectedMilestone: milestone_title, selectedMilestone: milestone_title,
selectedAssigneeList: assignee_username, selectedAssigneeList: assignee_username,
selectedLabelList: label_name, selectedLabelList: label_name,
featureFlags: { hasDurationChart },
pagination: { pagination: {
sort: sort?.value || null, sort: sort?.value || null,
direction: direction?.value || null, direction: direction?.value || null,
......
...@@ -13,7 +13,6 @@ class Groups::Analytics::CycleAnalyticsController < Groups::Analytics::Applicati ...@@ -13,7 +13,6 @@ class Groups::Analytics::CycleAnalyticsController < Groups::Analytics::Applicati
before_action :request_params, only: :show before_action :request_params, only: :show
before_action do before_action do
push_frontend_feature_flag(:cycle_analytics_scatterplot_enabled, default_enabled: true)
render_403 unless can?(current_user, :read_group_cycle_analytics, @group) render_403 unless can?(current_user, :read_group_cycle_analytics, @group)
end end
......
---
name: cycle_analytics_scatterplot_enabled
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/20290
rollout_issue_url:
milestone: '12.6'
type: development
group: group::optimize
default_enabled: true
# frozen_string_literal: true
require 'spec_helper'
RSpec.describe 'Group value stream analytics' do
let_it_be(:group) { create(:group) }
let_it_be(:user) { create(:user) }
before do
stub_licensed_features(cycle_analytics_for_groups: true)
group.add_owner(user)
sign_in(user)
end
it 'pushes frontend feature flags' do
visit group_analytics_cycle_analytics_path(group)
expect(page).to have_pushed_frontend_feature_flags(cycleAnalyticsScatterplotEnabled: true)
end
end
...@@ -58,10 +58,6 @@ const defaultStubs = { ...@@ -58,10 +58,6 @@ const defaultStubs = {
UrlSync, UrlSync,
}; };
const defaultFeatureFlags = {
hasDurationChart: true,
};
const [selectedValueStream] = valueStreams; const [selectedValueStream] = valueStreams;
const initialCycleAnalyticsState = { const initialCycleAnalyticsState = {
...@@ -127,7 +123,6 @@ describe('EE Value Stream Analytics component', () => { ...@@ -127,7 +123,6 @@ describe('EE Value Stream Analytics component', () => {
await store.dispatch('initializeCycleAnalytics', { await store.dispatch('initializeCycleAnalytics', {
...initialState, ...initialState,
featureFlags: { featureFlags: {
...defaultFeatureFlags,
...featureFlags, ...featureFlags,
}, },
}); });
......
...@@ -54,9 +54,7 @@ describe('Value Stream Analytics actions', () => { ...@@ -54,9 +54,7 @@ describe('Value Stream Analytics actions', () => {
createdAfter, createdAfter,
createdBefore, createdBefore,
stages: [], stages: [],
featureFlags: { featureFlags: {},
hasDurationChart: true,
},
activeStages, activeStages,
selectedValueStream, selectedValueStream,
...mockGetters, ...mockGetters,
...@@ -71,7 +69,7 @@ describe('Value Stream Analytics actions', () => { ...@@ -71,7 +69,7 @@ describe('Value Stream Analytics actions', () => {
it.each` it.each`
action | type | stateKey | payload action | type | stateKey | payload
${'setFeatureFlags'} | ${'SET_FEATURE_FLAGS'} | ${'featureFlags'} | ${{ hasDurationChart: true }} ${'setFeatureFlags'} | ${'SET_FEATURE_FLAGS'} | ${'featureFlags'} | ${{ someFeatureFlag: true }}
${'setSelectedProjects'} | ${'SET_SELECTED_PROJECTS'} | ${'selectedProjectIds'} | ${[10, 20, 30, 40]} ${'setSelectedProjects'} | ${'SET_SELECTED_PROJECTS'} | ${'selectedProjectIds'} | ${[10, 20, 30, 40]}
`('$action should set $stateKey with $payload and type $type', ({ action, type, payload }) => { `('$action should set $stateKey with $payload and type $type', ({ action, type, payload }) => {
return testAction( return testAction(
......
...@@ -30,9 +30,7 @@ const rootState = { ...@@ -30,9 +30,7 @@ const rootState = {
stages: [...activeStages, hiddenStage], stages: [...activeStages, hiddenStage],
selectedGroup, selectedGroup,
selectedValueStream, selectedValueStream,
featureFlags: { featureFlags: {},
hasDurationChart: true,
},
}; };
describe('DurationChart actions', () => { describe('DurationChart actions', () => {
......
...@@ -86,7 +86,6 @@ describe('Value Stream Analytics mutations', () => { ...@@ -86,7 +86,6 @@ describe('Value Stream Analytics mutations', () => {
it.each` it.each`
mutation | payload | expectedState mutation | payload | expectedState
${types.SET_FEATURE_FLAGS} | ${{ hasDurationChart: true }} | ${{ featureFlags: { hasDurationChart: true } }}
${types.SET_SELECTED_PROJECTS} | ${selectedProjects} | ${{ selectedProjects }} ${types.SET_SELECTED_PROJECTS} | ${selectedProjects} | ${{ selectedProjects }}
${types.SET_DATE_RANGE} | ${{ createdAfter, createdBefore }} | ${{ createdAfter, createdBefore }} ${types.SET_DATE_RANGE} | ${{ createdAfter, createdBefore }} | ${{ createdAfter, createdBefore }}
${types.SET_SELECTED_STAGE} | ${{ id: 'first-stage' }} | ${{ selectedStage: { id: 'first-stage' } }} ${types.SET_SELECTED_STAGE} | ${{ id: 'first-stage' }} | ${{ selectedStage: { id: 'first-stage' } }}
......
...@@ -6,7 +6,7 @@ import PolicyList from 'ee/threat_monitoring/components/policy_list.vue'; ...@@ -6,7 +6,7 @@ import PolicyList from 'ee/threat_monitoring/components/policy_list.vue';
import networkPoliciesQuery from 'ee/threat_monitoring/graphql/queries/network_policies.query.graphql'; import networkPoliciesQuery from 'ee/threat_monitoring/graphql/queries/network_policies.query.graphql';
import scanExecutionPoliciesQuery from 'ee/threat_monitoring/graphql/queries/scan_execution_policies.query.graphql'; import scanExecutionPoliciesQuery from 'ee/threat_monitoring/graphql/queries/scan_execution_policies.query.graphql';
import createStore from 'ee/threat_monitoring/store'; import createStore from 'ee/threat_monitoring/store';
import createMockApolloProvider from 'helpers/mock_apollo_helper'; import createMockApollo from 'helpers/mock_apollo_helper';
import { mountExtended, shallowMountExtended } from 'helpers/vue_test_utils_helper'; import { mountExtended, shallowMountExtended } from 'helpers/vue_test_utils_helper';
import waitForPromises from 'helpers/wait_for_promises'; import waitForPromises from 'helpers/wait_for_promises';
import { networkPolicies, scanExecutionPolicies } from '../mocks/mock_apollo'; import { networkPolicies, scanExecutionPolicies } from '../mocks/mock_apollo';
...@@ -59,7 +59,7 @@ describe('PolicyList component', () => { ...@@ -59,7 +59,7 @@ describe('PolicyList component', () => {
provide: { provide: {
projectPath: fullPath, projectPath: fullPath,
}, },
apolloProvider: createMockApolloProvider([ apolloProvider: createMockApollo([
[networkPoliciesQuery, requestHandlers.networkPolicies], [networkPoliciesQuery, requestHandlers.networkPolicies],
[scanExecutionPoliciesQuery, requestHandlers.scanExecutionPolicies], [scanExecutionPoliciesQuery, requestHandlers.scanExecutionPolicies],
]), ]),
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment