diff --git a/app/assets/javascripts/observability/client.js b/app/assets/javascripts/observability/client.js index 1ce8cde54a97b54f53d12bc66e08db156b536478..3785f42a769f06a8a2ae07522a523732fdf3d319 100644 --- a/app/assets/javascripts/observability/client.js +++ b/app/assets/javascripts/observability/client.js @@ -2,7 +2,7 @@ import { isValidDate } from '~/lib/utils/datetime_utility'; import * as Sentry from '~/sentry/sentry_browser_wrapper'; import axios from '~/lib/utils/axios_utils'; import { logError } from '~/lib/logger'; -import { DEFAULT_SORTING_OPTION, SORTING_OPTIONS } from './constants'; +import { DEFAULT_SORTING_OPTION, SORTING_OPTIONS, CUSTOM_DATE_RANGE_OPTION } from './constants'; function reportErrorAndThrow(e) { logError(e); @@ -358,7 +358,7 @@ function addMetricsDateRangeFilterToQueryParams(dateRangeFilter, params) { if (!dateRangeFilter || !params) return; const { value, endDate, startDate } = dateRangeFilter; - if (value === 'custom') { + if (value === CUSTOM_DATE_RANGE_OPTION) { if (isValidDate(startDate) && isValidDate(endDate)) { params.append('start_time', startDate.toISOString()); params.append('end_time', endDate.toISOString()); diff --git a/app/assets/javascripts/observability/constants.js b/app/assets/javascripts/observability/constants.js index dbbec3678e879e96fe5517503eefb785298f2c33..5d6bd4faed603fd5902a75f63c380e4883a464b4 100644 --- a/app/assets/javascripts/observability/constants.js +++ b/app/assets/javascripts/observability/constants.js @@ -9,17 +9,30 @@ export const SORTING_OPTIONS = { Object.freeze(SORTING_OPTIONS); export const DEFAULT_SORTING_OPTION = SORTING_OPTIONS.TIMESTAMP_DESC; +export const TIME_RANGE_OPTIONS_VALUES = { + FIVE_MIN: '5m', + FIFTEEN_MIN: '15m', + THIRTY_MIN: '30m', + ONE_HOUR: '1h', + FOUR_HOURS: '4h', + TWELVE_HOURS: '12h', + ONE_DAY: '24h', + ONE_WEEK: '7d', + TWO_WEEKS: '14d', + ONE_MONTH: '30d', +}; + export const TIME_RANGE_OPTIONS = [ - { value: '5m', title: s__('Observability|Last 5 minutes') }, - { value: '15m', title: s__('Observability|Last 15 minutes') }, - { value: '30m', title: s__('Observability|Last 30 minutes') }, - { value: '1h', title: s__('Observability|Last 1 hour') }, - { value: '4h', title: s__('Observability|Last 4 hours') }, - { value: '12h', title: s__('Observability|Last 12 hours') }, - { value: '24h', title: s__('Observability|Last 24 hours') }, - { value: '7d', title: s__('Observability|Last 7 days') }, - { value: '14d', title: s__('Observability|Last 14 days') }, - { value: '30d', title: s__('Observability|Last 30 days') }, + { value: TIME_RANGE_OPTIONS_VALUES.FIVE_MIN, title: s__('Observability|Last 5 minutes') }, + { value: TIME_RANGE_OPTIONS_VALUES.FIFTEEN_MIN, title: s__('Observability|Last 15 minutes') }, + { value: TIME_RANGE_OPTIONS_VALUES.THIRTY_MIN, title: s__('Observability|Last 30 minutes') }, + { value: TIME_RANGE_OPTIONS_VALUES.ONE_HOUR, title: s__('Observability|Last 1 hour') }, + { value: TIME_RANGE_OPTIONS_VALUES.FOUR_HOURS, title: s__('Observability|Last 4 hours') }, + { value: TIME_RANGE_OPTIONS_VALUES.TWELVE_HOURS, title: s__('Observability|Last 12 hours') }, + { value: TIME_RANGE_OPTIONS_VALUES.ONE_DAY, title: s__('Observability|Last 24 hours') }, + { value: TIME_RANGE_OPTIONS_VALUES.ONE_WEEK, title: s__('Observability|Last 7 days') }, + { value: TIME_RANGE_OPTIONS_VALUES.TWO_WEEKS, title: s__('Observability|Last 14 days') }, + { value: TIME_RANGE_OPTIONS_VALUES.ONE_MONTH, title: s__('Observability|Last 30 days') }, ]; Object.freeze(TIME_RANGE_OPTIONS); @@ -31,3 +44,5 @@ const OPERERATOR_NOT_LIKE_TEXT = s__('ObservabilityMetrics|is not like'); const OPERATORS_LIKE = [{ value: OPERERATOR_LIKE, description: OPERERATOR_LIKE_TEXT }]; const OPERATORS_NOT_LIKE = [{ value: OPERERATOR_NOT_LIKE, description: OPERERATOR_NOT_LIKE_TEXT }]; export const OPERATORS_LIKE_NOT = [...OPERATORS_LIKE, ...OPERATORS_NOT_LIKE]; + +export const CUSTOM_DATE_RANGE_OPTION = 'custom'; diff --git a/ee/app/assets/javascripts/metrics/details/filter_bar/date_range_filter.vue b/ee/app/assets/javascripts/metrics/details/filter_bar/date_range_filter.vue index cdeaa49d2c7ae6b1c7e50bd0b5e596e53116fc98..a8abd3cf9f0c055ddb2ceedf69298077a72ae079 100644 --- a/ee/app/assets/javascripts/metrics/details/filter_bar/date_range_filter.vue +++ b/ee/app/assets/javascripts/metrics/details/filter_bar/date_range_filter.vue @@ -2,7 +2,11 @@ import { GlDaterangePicker } from '@gitlab/ui'; import { periodToDate } from '~/observability/utils'; import DateRangesDropdown from '~/analytics/shared/components/date_ranges_dropdown.vue'; -import { TIME_RANGE_OPTIONS } from '~/observability/constants'; +import { + TIME_RANGE_OPTIONS, + TIME_RANGE_OPTIONS_VALUES, + CUSTOM_DATE_RANGE_OPTION, +} from '~/observability/constants'; export default { components: { @@ -18,11 +22,10 @@ export default { }, data() { return { - shouldShowDateRangePicker: false, dateRange: this.selected ?? { value: '', - min: null, - max: null, + startDate: null, + endDate: null, }, }; }, @@ -38,10 +41,12 @@ export default { }; }); }, + shouldShowDateRangePicker() { + return this.dateRange.value === CUSTOM_DATE_RANGE_OPTION; + }, }, methods: { onSelectPredefinedDateRange({ value, startDate, endDate }) { - this.shouldShowDateRangePicker = false; this.dateRange = { value, startDate: new Date(startDate), @@ -50,11 +55,17 @@ export default { this.$emit('onDateRangeSelected', this.dateRange); }, onSelectCustomDateRange() { - this.shouldShowDateRangePicker = true; + const defaultDateRange = periodToDate(TIME_RANGE_OPTIONS_VALUES.ONE_MONTH); + this.dateRange = { + value: CUSTOM_DATE_RANGE_OPTION, + startDate: defaultDateRange.min, + endDate: defaultDateRange.max, + }; + this.$emit('onDateRangeSelected', this.dateRange); }, onCustomRangeSelected({ startDate, endDate }) { this.dateRange = { - value: 'custom', + value: CUSTOM_DATE_RANGE_OPTION, startDate: new Date(startDate), endDate: new Date(endDate), }; @@ -77,7 +88,8 @@ export default { /> <gl-daterange-picker v-if="shouldShowDateRangePicker" - start-opened + :default-start-date="dateRange.startDate" + :default-end-date="dateRange.endDate" @input="onCustomRangeSelected" /> </div> diff --git a/ee/spec/frontend/metrics/details/filter_bar/date_range_filter_spec.js b/ee/spec/frontend/metrics/details/filter_bar/date_range_filter_spec.js index 1cdb38df60b0c2d10c390555cf37229079f2a06f..6009594b93fa580c6a6cd8c0d81bb596eb3d8e89 100644 --- a/ee/spec/frontend/metrics/details/filter_bar/date_range_filter_spec.js +++ b/ee/spec/frontend/metrics/details/filter_bar/date_range_filter_spec.js @@ -102,10 +102,24 @@ describe('DateRangeFilter', () => { expect(findDateRangesDropdown().props('selected')).toBe(''); }); - it('renders the daterange-picker only if custom option is selected', async () => { + it('renders the daterange-picker with default 30d date range when customDateRangeSelected is emitteed', async () => { expect(findDateRangesPicker().exists()).toBe(false); await findDateRangesDropdown().vm.$emit('customDateRangeSelected'); expect(findDateRangesPicker().exists()).toBe(true); + // mocked 30d date range + expect(findDateRangesPicker().props('defaultStartDate')).toEqual(new Date('2020-06-06')); + expect(findDateRangesPicker().props('defaultEndDate')).toEqual(new Date('2020-07-06')); + }); + + it('renders the daterange-picker if custom option is selected', () => { + const timeRange = { + startDate: new Date('2022-01-01'), + endDate: new Date('2022-01-02'), + }; + mount({ value: 'custom', startDate: timeRange.startDate, endDate: timeRange.endDate }); + expect(findDateRangesPicker().exists()).toBe(true); + expect(findDateRangesPicker().props('defaultStartDate')).toBe(timeRange.startDate); + expect(findDateRangesPicker().props('defaultEndDate')).toBe(timeRange.endDate); }); it('emits the onDateRangeSelected event when the time range is selected', async () => { @@ -119,12 +133,38 @@ describe('DateRangeFilter', () => { }); it('emits the onDateRangeSelected event when a custom time range is selected', async () => { + const defaultCustomTimeRange = { + // last30d + endDate: new Date('2020-07-06T00:00:00.000Z'), + startDate: new Date('2020-06-06T00:00:00.000Z'), + }; const timeRange = { startDate: new Date('2021-01-01'), endDate: new Date('2021-01-02'), }; await findDateRangesDropdown().vm.$emit('customDateRangeSelected'); + expect(wrapper.emitted('onDateRangeSelected')).toEqual([ + [ + { + ...defaultCustomTimeRange, + value: 'custom', + }, + ], + ]); await findDateRangesPicker().vm.$emit('input', timeRange); - expect(wrapper.emitted('onDateRangeSelected')).toEqual([[{ value: 'custom', ...timeRange }]]); + expect(wrapper.emitted('onDateRangeSelected')).toEqual([ + [ + { + ...defaultCustomTimeRange, + value: 'custom', + }, + ], + [ + { + ...timeRange, + value: 'custom', + }, + ], + ]); }); });