diff --git a/app/assets/javascripts/api/analytics_api.js b/app/assets/javascripts/api/analytics_api.js index fd9b0160b0d..11786f6c365 100644 --- a/app/assets/javascripts/api/analytics_api.js +++ b/app/assets/javascripts/api/analytics_api.js @@ -1,33 +1,32 @@ import axios from '~/lib/utils/axios_utils'; import { buildApiUrl } from './api_utils'; -const GROUP_VSA_PATH_BASE = - '/groups/:id/-/analytics/value_stream_analytics/value_streams/:value_stream_id/stages/:stage_id'; -const PROJECT_VSA_PATH_BASE = '/:project_path/-/analytics/value_stream_analytics/value_streams'; +const PROJECT_VSA_PATH_BASE = '/:request_path/-/analytics/value_stream_analytics/value_streams'; const PROJECT_VSA_STAGES_PATH = `${PROJECT_VSA_PATH_BASE}/:value_stream_id/stages`; +const PROJECT_VSA_STAGE_DATA_PATH = `${PROJECT_VSA_STAGES_PATH}/:stage_id`; -const buildProjectValueStreamPath = (projectPath, valueStreamId = null) => { +const buildProjectValueStreamPath = (requestPath, valueStreamId = null) => { if (valueStreamId) { return buildApiUrl(PROJECT_VSA_STAGES_PATH) - .replace(':project_path', projectPath) + .replace(':request_path', requestPath) .replace(':value_stream_id', valueStreamId); } - return buildApiUrl(PROJECT_VSA_PATH_BASE).replace(':project_path', projectPath); + return buildApiUrl(PROJECT_VSA_PATH_BASE).replace(':request_path', requestPath); }; -const buildGroupValueStreamPath = ({ groupId, valueStreamId = null, stageId = null }) => - buildApiUrl(GROUP_VSA_PATH_BASE) - .replace(':id', groupId) +const buildValueStreamStageDataPath = ({ requestPath, valueStreamId = null, stageId = null }) => + buildApiUrl(PROJECT_VSA_STAGE_DATA_PATH) + .replace(':request_path', requestPath) .replace(':value_stream_id', valueStreamId) .replace(':stage_id', stageId); -export const getProjectValueStreams = (projectPath) => { - const url = buildProjectValueStreamPath(projectPath); +export const getProjectValueStreams = (requestPath) => { + const url = buildProjectValueStreamPath(requestPath); return axios.get(url); }; -export const getProjectValueStreamStages = (projectPath, valueStreamId) => { - const url = buildProjectValueStreamPath(projectPath, valueStreamId); +export const getProjectValueStreamStages = (requestPath, valueStreamId) => { + const url = buildProjectValueStreamPath(requestPath, valueStreamId); return axios.get(url); }; @@ -45,7 +44,15 @@ export const getProjectValueStreamMetrics = (requestPath, params) => * When used for project level VSA, requests should include the `project_id` in the params object */ -export const getValueStreamStageMedian = ({ groupId, valueStreamId, stageId }, params = {}) => { - const stageBase = buildGroupValueStreamPath({ groupId, valueStreamId, stageId }); +export const getValueStreamStageMedian = ({ requestPath, valueStreamId, stageId }, params = {}) => { + const stageBase = buildValueStreamStageDataPath({ requestPath, valueStreamId, stageId }); return axios.get(`${stageBase}/median`, { params }); }; + +export const getValueStreamStageRecords = ( + { requestPath, valueStreamId, stageId }, + params = {}, +) => { + const stageBase = buildValueStreamStageDataPath({ requestPath, valueStreamId, stageId }); + return axios.get(`${stageBase}/records`, { params }); +}; diff --git a/app/assets/javascripts/cycle_analytics/components/base.vue b/app/assets/javascripts/cycle_analytics/components/base.vue index e637bd0d819..0dc221abb61 100644 --- a/app/assets/javascripts/cycle_analytics/components/base.vue +++ b/app/assets/javascripts/cycle_analytics/components/base.vue @@ -42,7 +42,7 @@ export default { 'selectedStageError', 'stages', 'summary', - 'startDate', + 'daysInPast', 'permissions', ]), ...mapGetters(['pathNavigationData']), @@ -51,13 +51,15 @@ export default { return selectedStageEvents.length && !isLoadingStage && !isEmptyStage; }, displayNotEnoughData() { - return this.selectedStageReady && this.isEmptyStage; + return !this.isLoadingStage && this.isEmptyStage; }, displayNoAccess() { - return this.selectedStageReady && !this.isUserAllowed(this.selectedStage.id); + return ( + !this.isLoadingStage && this.selectedStage?.id && !this.isUserAllowed(this.selectedStage.id) + ); }, - selectedStageReady() { - return !this.isLoadingStage && this.selectedStage; + displayPathNavigation() { + return this.isLoading || (this.selectedStage && this.pathNavigationData.length); }, emptyStageTitle() { if (this.displayNoAccess) { @@ -83,8 +85,8 @@ export default { 'setSelectedStage', 'setDateRange', ]), - handleDateSelect(startDate) { - this.setDateRange({ startDate }); + handleDateSelect(daysInPast) { + this.setDateRange(daysInPast); }, onSelectStage(stage) { this.setSelectedStage(stage); @@ -101,15 +103,18 @@ export default { dayRangeOptions: [7, 30, 90], i18n: { dropdownText: __('Last %{days} days'), + pageTitle: __('Value Stream Analytics'), + recentActivity: __('Recent Project Activity'), }, };