From dca0b2eca16ed614701c8f6da711be6766c34a86 Mon Sep 17 00:00:00 2001 From: Dan Labrecque Date: Mon, 7 Oct 2024 13:57:03 -0400 Subject: [PATCH] Custom date range fix --- src/routes/explorer/explorer.tsx | 50 ++++++++++------------ src/routes/explorer/explorerChart.tsx | 21 ++++----- src/routes/explorer/explorerDatePicker.tsx | 18 +++++--- src/routes/explorer/explorerFilter.tsx | 40 ++++++++++------- src/routes/explorer/explorerHeader.tsx | 7 ++- src/routes/explorer/explorerTable.tsx | 30 ++++++------- src/routes/utils/dateRange.ts | 30 ++++++------- 7 files changed, 98 insertions(+), 98 deletions(-) diff --git a/src/routes/explorer/explorer.tsx b/src/routes/explorer/explorer.tsx index 859038f22..5d8d5a2af 100644 --- a/src/routes/explorer/explorer.tsx +++ b/src/routes/explorer/explorer.tsx @@ -25,8 +25,7 @@ import { ProviderDetails } from 'routes/details/components/providerDetails'; import { getIdKeyForGroupBy } from 'routes/utils/computedReport/getComputedExplorerReportItems'; import type { ComputedReportItem } from 'routes/utils/computedReport/getComputedReportItems'; import { getUnsortedComputedReportItems } from 'routes/utils/computedReport/getComputedReportItems'; -import { DateRangeType, getDateRange } from 'routes/utils/dateRange'; -import { getDateRangeTypeDefault } from 'routes/utils/dateRange'; +import { DateRangeType, getDateRangeFromQuery } from 'routes/utils/dateRange'; import { getGroupByCostCategory, getGroupById, getGroupByOrgValue, getGroupByTagKey } from 'routes/utils/groupBy'; import { filterProviders, hasData } from 'routes/utils/providers'; import { getRouteForQuery } from 'routes/utils/query'; @@ -83,6 +82,7 @@ interface ExplorerStateProps { costType?: string; currency?: string; dateRangeType: DateRangeType; + endDate?: Date; gcpProviders: Providers; ibmProviders: Providers; isAccountInfoEmptyStateToggleEnabled?: boolean; @@ -103,6 +103,7 @@ interface ExplorerStateProps { reportFetchStatus: FetchStatus; reportQueryString: string; rhelProviders: Providers; + startDate?: Date; userAccess: UserAccess; userAccessError: AxiosError; userAccessFetchStatus: FetchStatus; @@ -115,13 +116,10 @@ interface ExplorerDispatchProps { interface ExplorerState { columns?: any[]; - endDate?: Date; isAllSelected?: boolean; - isDateRangeSelected?: boolean; isExportModalOpen?: boolean; rows?: any[]; selectedItems?: ComputedReportItem[]; - startDate?: Date; } type ExplorerOwnProps = RouterComponentProps & WrappedComponentProps; @@ -132,7 +130,6 @@ class Explorer extends React.Component { protected defaultState: ExplorerState = { columns: [], isAllSelected: false, - isDateRangeSelected: false, isExportModalOpen: false, rows: [], selectedItems: [], @@ -297,7 +294,7 @@ class Explorer extends React.Component { }; private getTable = () => { - const { costDistribution, dateRangeType, perspective, query, report, reportFetchStatus, router } = this.props; + const { costDistribution, endDate, perspective, query, report, reportFetchStatus, router, startDate } = this.props; const { isAllSelected, selectedItems } = this.state; const groupById = getIdKeyForGroupBy(query.group_by); @@ -308,7 +305,7 @@ class Explorer extends React.Component { return ( { query={query} report={report} selectedItems={selectedItems} + startDate={startDate} /> ); }; @@ -377,18 +375,6 @@ class Explorer extends React.Component { } }; - private handleOnDatePickerSelect = (startDate: Date, endDate: Date) => { - const { query, router } = this.props; - - this.setState({ startDate, endDate }, () => { - router.navigate(getRouteForQuery(query, router.location, true), { replace: true }); - }); - }; - - private handleOnDateRangeSelect = () => { - this.setState({ isDateRangeSelected: true }); - }; - private handleOnExportModalClose = (isOpen: boolean) => { this.setState({ isExportModalOpen: isOpen }); }; @@ -494,6 +480,7 @@ class Explorer extends React.Component { costType, currency, dateRangeType, + endDate, gcpProviders, ibmProviders, intl, @@ -510,8 +497,8 @@ class Explorer extends React.Component { reportError, reportFetchStatus, router, + startDate, } = this.props; - const { isDateRangeSelected } = this.state; // Note: No need to test OCP on cloud here, since that requires at least one provider const noAwsProviders = !this.isAwsAvailable() && providersFetchStatus === FetchStatus.complete; @@ -561,6 +548,8 @@ class Explorer extends React.Component { return ; } + const isDateRangeSelected = query.dateRangeType !== undefined; + return (
{ costType={costType} currency={currency} dateRangeType={dateRangeType} + endDate={endDate} groupBy={ groupByCostCategory ? `${awsCategoryPrefix}${groupByCostCategory}` @@ -579,14 +569,13 @@ class Explorer extends React.Component { onCostDistributionSelect={() => handleOnCostDistributionSelect(query, router)} onCostTypeSelect={() => handleOnCostTypeSelect(query, router)} onCurrencySelect={() => handleOnCurrencySelect(query, router)} - onDatePickerSelect={this.handleOnDatePickerSelect} - onDateRangeSelect={this.handleOnDateRangeSelect} onFilterAdded={filter => handleOnFilterAdded(query, router, filter)} onFilterRemoved={filter => handleOnFilterRemoved(query, router, filter)} onGroupBySelect={this.handleOnGroupBySelect} onPerspectiveClicked={this.handleOnPerspectiveClick} perspective={perspective} report={report} + startDate={startDate} /> {!isDataAvailable && isDetailsDateRangeToggleEnabled ? ( this.getEmptyProviderState() @@ -610,6 +599,7 @@ class Explorer extends React.Component { costType={costType} currency={currency} dateRangeType={dateRangeType} + endDate={endDate} groupBy={ groupByCostCategory ? `${awsCategoryPrefix}${groupByCostCategory}` @@ -618,6 +608,7 @@ class Explorer extends React.Component { : groupById } perspective={perspective} + startDate={startDate} />
@@ -630,6 +621,7 @@ class Explorer extends React.Component { costType={costType} currency={currency} dateRangeType={dateRangeType} + endDate={endDate} groupBy={ groupByCostCategory ? `${awsCategoryPrefix}${groupByCostCategory}` @@ -638,6 +630,7 @@ class Explorer extends React.Component { : groupById } perspective={perspective} + startDate={startDate} /> @@ -729,11 +722,10 @@ const mapStateToProps = createMapStateToProps { - const { end_date, start_date } = this.props; + const { endDate, startDate } = this.props; const result = []; items.map(datums => { @@ -215,8 +213,8 @@ class ExplorerChartBase extends React.Component( - (state, { costType, currency, dateRangeType, perspective, router }) => { + (state, { costType, currency, endDate, perspective, router, startDate }) => { const queryFromRoute = parseQuery(router.location.search); const groupBy = queryFromRoute.group_by ? getGroupById(queryFromRoute) : getGroupByDefault(perspective); @@ -286,7 +284,6 @@ const mapStateToProps = createMapStateToProps(); public componentDidMount() { - const { dateRangeType } = this.props; - const { end_date, start_date } = getDateRange(dateRangeType); + const { dateRangeType, endDate, startDate } = this.props; + // const queryFromRoute = parseQuery(router.location.search); + // + // // Query dates are undefined until a selection is made + // const end_date = queryFromRoute.end_date; + // const start_date = queryFromRoute.start_date; if (this.startDateRef?.current) { this.startDateRef.current.setCalendarOpen(dateRangeType !== DateRangeType.custom); } - if (dateRangeType === DateRangeType.custom) { + if (dateRangeType === DateRangeType.custom && endDate && startDate) { this.setState({ - startDate: new Date(start_date + 'T00:00:00'), - endDate: new Date(end_date + 'T00:00:00'), + startDate: new Date(startDate + 'T00:00:00'), + endDate: new Date(endDate + 'T00:00:00'), }); } } diff --git a/src/routes/explorer/explorerFilter.tsx b/src/routes/explorer/explorerFilter.tsx index 91a59d9a4..eb188a75e 100644 --- a/src/routes/explorer/explorerFilter.tsx +++ b/src/routes/explorer/explorerFilter.tsx @@ -16,7 +16,7 @@ import { injectIntl } from 'react-intl'; import { connect } from 'react-redux'; import { DataToolbar } from 'routes/components/dataToolbar'; import { DateRange } from 'routes/components/dateRange'; -import { DateRangeType, getDateRange, getDateRangeById } from 'routes/utils/dateRange'; +import { DateRangeType, getDateRangeById } from 'routes/utils/dateRange'; import { isEqual } from 'routes/utils/equal'; import type { Filter } from 'routes/utils/filter'; import { getRouteForQuery } from 'routes/utils/query'; @@ -43,6 +43,7 @@ import { interface ExplorerFilterOwnProps extends RouterComponentProps, WrappedComponentProps { dateRangeType: DateRangeType; + endDate?: boolean; groupBy: string; isCurrentMonthData?: boolean; isDisabled?: boolean; @@ -52,6 +53,7 @@ interface ExplorerFilterOwnProps extends RouterComponentProps, WrappedComponentP perspective: PerspectiveType; pagination?: React.ReactNode; query?: Query; + startDate?: boolean; } interface ExplorerFilterStateProps { @@ -100,6 +102,7 @@ export class ExplorerFilterBase extends React.Component { this.updateDateRange(currentDateRange); }); @@ -183,12 +187,17 @@ export class ExplorerFilterBase extends React.Component { - const { dateRangeType } = this.props; + const { dateRangeType, endDate, startDate } = this.props; const { showDatePicker } = this.state; return showDatePicker ? ( - - ) : undefined; + + ) : null; }; private handleOnDatePickerSelect = (startDate: Date, endDate: Date) => { @@ -213,10 +222,11 @@ export class ExplorerFilterBase extends React.Component { if (!showDatePicker) { this.updateDateRange(currentDateRange); - } - // Clear inline alert - if (onDateRangeSelect) { - onDateRangeSelect(currentDateRange); + + // Clear inline alert + if (onDateRangeSelect) { + onDateRangeSelect(currentDateRange); + } } }); }; @@ -298,13 +308,11 @@ export class ExplorerFilterBase extends React.Component( - (state, { dateRangeType, perspective }) => { - const { end_date, start_date } = getDateRange(dateRangeType); - + (state, { endDate, perspective, startDate }) => { // Omitting key_only to share a single request -- the toolbar needs key values const orgQueryString = getQuery({ - end_date, - start_date, + end_date: endDate, + start_date: startDate, limit: 1000, }); @@ -335,8 +343,8 @@ const mapStateToProps = createMapStateToProps ); diff --git a/src/routes/explorer/explorerTable.tsx b/src/routes/explorer/explorerTable.tsx index f8e5fe07f..9497ac551 100644 --- a/src/routes/explorer/explorerTable.tsx +++ b/src/routes/explorer/explorerTable.tsx @@ -35,7 +35,6 @@ import { ComputedReportItemType, ComputedReportItemValueType } from 'routes/comp import { EmptyFilterState } from 'routes/components/state/emptyFilterState'; import type { ComputedReportItem } from 'routes/utils/computedReport/getComputedReportItems'; import { getUnsortedComputedReportItems } from 'routes/utils/computedReport/getComputedReportItems'; -import { type DateRangeType, getDateRange } from 'routes/utils/dateRange'; import { createMapStateToProps } from 'store/common'; import { formatCurrency } from 'utils/format'; import { classificationDefault, classificationUnallocated, noPrefix } from 'utils/props'; @@ -47,7 +46,7 @@ import { PerspectiveType } from './explorerUtils'; interface ExplorerTableOwnProps extends RouterComponentProps, WrappedComponentProps { costDistribution?: string; - dateRangeType?: DateRangeType; + endDate?: string; groupBy: string; groupByCostCategory?: string; groupByOrg?: string; @@ -60,11 +59,11 @@ interface ExplorerTableOwnProps extends RouterComponentProps, WrappedComponentPr query: Query; report: Report; selectedItems?: ComputedReportItem[]; + startDate?: string; } interface ExplorerTableStateProps { - end_date?: string; - start_date?: string; + // TBD... } interface ExplorerTableDispatchProps { @@ -118,7 +117,7 @@ class ExplorerTableBase extends React.Component { const { costDistribution, - end_date, + endDate, groupBy, groupByCostCategory, groupByOrg, @@ -127,7 +126,7 @@ class ExplorerTableBase extends React.Component( - (state, { dateRangeType }) => { - const { end_date, start_date } = getDateRange(dateRangeType); - - return { - end_date, - start_date, - }; - } -); +const mapStateToProps = createMapStateToProps(() => { + return { + // TBD + }; +}); const mapDispatchToProps: ExplorerTableDispatchProps = {}; diff --git a/src/routes/utils/dateRange.ts b/src/routes/utils/dateRange.ts index f27fbbbd7..34a331320 100644 --- a/src/routes/utils/dateRange.ts +++ b/src/routes/utils/dateRange.ts @@ -75,24 +75,22 @@ export const getDateRange = (dateRangeType: DateRangeType, isFormatted = true) = return dateRange; }; -export const getDateRangeTypeDefault = (queryFromRoute: Query) => { - return queryFromRoute.dateRangeType || DateRangeType.currentMonthToDate; +export const getDateRangeTypeDefault = (queryFromRoute: Query, defaultToPreviousMonth: boolean): DateRangeType => { + if (queryFromRoute.dateRangeType) { + return queryFromRoute.dateRangeType; + } + return defaultToPreviousMonth ? DateRangeType.previousMonth : DateRangeType.currentMonthToDate; }; -export const getDateRangeFromQuery = (queryFromRoute: Query) => { - let end_date; - let start_date; - - if (queryFromRoute.dateRangeType === DateRangeType.custom) { - end_date = queryFromRoute.end_date; - start_date = queryFromRoute.start_date; - } - if (!(end_date && start_date)) { - const dateRangeType = getDateRangeTypeDefault(queryFromRoute); - return getDateRange(dateRangeType); - } +export const getDateRangeFromQuery = (queryFromRoute: Query, defaultToPreviousMonth: boolean = false) => { + const dateRangeType = getDateRangeTypeDefault(queryFromRoute, defaultToPreviousMonth); + const dateRange = + dateRangeType === DateRangeType.custom + ? { start_date: queryFromRoute.start_date, end_date: queryFromRoute.end_date } + : getDateRange(dateRangeType); return { - end_date, - start_date, + dateRangeType, + end_date: dateRange.end_date, + start_date: dateRange.start_date, }; };