diff --git a/src/components/DateNavigator/DateNavigatorFormat.tsx b/src/components/DateNavigator/DateNavigatorFormat.tsx index d13361f6e38964276732aa2fa5b079bfea3e04c2..7b206615476ff2c9e875f46682907f09900026ad 100644 --- a/src/components/DateNavigator/DateNavigatorFormat.tsx +++ b/src/components/DateNavigator/DateNavigatorFormat.tsx @@ -1,6 +1,6 @@ -import React from 'react' -import { DateTime } from 'luxon' import { TimeStep } from 'enum/timeStep.enum' +import { DateTime } from 'luxon' +import React from 'react' import './datenavigatorformat.scss' interface DateNavigatorFormatProps { @@ -44,11 +44,20 @@ const DateNavigatorFormat: React.FC<DateNavigatorFormatProps> = ({ }), ] case TimeStep.HALF_AN_HOUR: + /** + * Format date to range: + * 9:00 - 9:30 + * Day 0X Month + */ return [ - date.toLocaleString({ + `${date.toLocaleString({ hour: 'numeric', minute: 'numeric', - }), + })} - + ${date.plus({ minutes: 30 }).toLocaleString({ + hour: 'numeric', + minute: 'numeric', + })}`, date.toLocaleString({ weekday: 'long', day: '2-digit', @@ -74,7 +83,7 @@ const DateNavigatorFormat: React.FC<DateNavigatorFormatProps> = ({ ) : ( <> {formatedDate[0] && ( - <div className="date-navigator-format-date text-16-bold"> + <div className="date-navigator-format-date text-16-bold timeRange"> {formatedDate[0]} </div> )} diff --git a/src/components/DateNavigator/datenavigatorformat.scss b/src/components/DateNavigator/datenavigatorformat.scss index 4fc1f721d638c846873da03c0715f42313ce4c42..e964a71685463124326cc49aed07041b4b130125 100644 --- a/src/components/DateNavigator/datenavigatorformat.scss +++ b/src/components/DateNavigator/datenavigatorformat.scss @@ -16,5 +16,8 @@ &::first-letter { text-transform: uppercase; } + &.timeRange { + white-space: normal; + } } } diff --git a/src/services/consumptionFormatter.service.spec.ts b/src/services/consumptionFormatter.service.spec.ts index fd43404f4dee9a2ca8057d7a413ccb71854b1509..085dab6fb05aa93daec27a81908119c69e7c82c5 100644 --- a/src/services/consumptionFormatter.service.spec.ts +++ b/src/services/consumptionFormatter.service.spec.ts @@ -1,10 +1,10 @@ -import ConsumptionFormatterService from './consumptionFormatter.service' +import { DataloadState } from 'enum/dataload.enum' +import { FluidType } from 'enum/fluid.enum' import { TimeStep } from 'enum/timeStep.enum' import { DateTime } from 'luxon' import { Dataload, FluidStatus, TimePeriod } from 'models' -import { DataloadState } from 'enum/dataload.enum' -import { FluidType } from 'enum/fluid.enum' import { fluidStatusConnectedData } from '../../tests/__mocks__/fluidStatusData.mock' +import ConsumptionFormatterService from './consumptionFormatter.service' const localSpy = jest.spyOn(DateTime, 'local') @@ -121,10 +121,10 @@ describe('ConsumptionFormatter service', () => { }) it('should return a formattedData for HALF_AN_HOUR', () => { mockTimePeriod = { - startDate: DateTime.fromISO('2020-10-01T00:00:00.000Z', { + startDate: DateTime.fromISO('2020-10-01T00:30:00.000Z', { zone: 'utc', }), - endDate: DateTime.fromISO('2020-10-01T01:00:00.000Z', { + endDate: DateTime.fromISO('2020-10-01T01:30:00.000Z', { zone: 'utc', }), } diff --git a/src/services/consumptionFormatter.service.ts b/src/services/consumptionFormatter.service.ts index 885e527285727aec350c7ea9fccfb38655e4fba4..36c32a784e0f51da74ccb45ed2279132b19a8b54 100644 --- a/src/services/consumptionFormatter.service.ts +++ b/src/services/consumptionFormatter.service.ts @@ -17,13 +17,16 @@ export default class ConsumptionFormatterService { ): Dataload[] { // Sort data data.sort((dataA, dataB) => compareDates(dataA.date, dataB.date)) - // Set status of data and complete missing/empty data const filledData = [] let parsingDate = timePeriod.startDate - + let endDate = timePeriod.endDate + if (timeStep === TimeStep.HALF_AN_HOUR) { + parsingDate = parsingDate.minus({ minutes: 30 }) + endDate = endDate.minus({ minutes: 30 }) + } const dateChartService = new DateChartService() - while (parsingDate <= timePeriod.endDate) { + while (parsingDate <= endDate) { const filtereddata = data.filter(dt => dateChartService.compareStepDate(timeStep, dt.date, parsingDate) ) @@ -43,7 +46,6 @@ export default class ConsumptionFormatterService { filledData.push({ ...newElement }) parsingDate = parsingDate.plus(this.getTimeFromStepTime(timeStep)) } - return filledData } diff --git a/src/services/dateChart.service.ts b/src/services/dateChart.service.ts index 7f7ecc1507f9ad5541546ab7eff5a5413dfbfad4..8e97757b0fba44980828c71cd96c0b389521ef81 100644 --- a/src/services/dateChart.service.ts +++ b/src/services/dateChart.service.ts @@ -151,7 +151,7 @@ export default class DateChartService { date1.month === date2.month && date1.day === date2.day && date1.hour === date2.hour && - Math.abs(date1.minute - date2.minute) < 30 + Math.abs(date1.minute - date2.minute) === 0 ) default: throw new Error('TimeStep unknown') diff --git a/src/services/queryRunner.service.spec.ts b/src/services/queryRunner.service.spec.ts index d31b29f14b017a83ed22c399cd5bd589ad1dc8b6..1df6754513965e79afd155b966282dc5889d0d6d 100644 --- a/src/services/queryRunner.service.spec.ts +++ b/src/services/queryRunner.service.spec.ts @@ -1,15 +1,15 @@ import { QueryResult } from 'cozy-client' +import { DataloadState } from 'enum/dataload.enum' import { FluidType } from 'enum/fluid.enum' import { TimeStep } from 'enum/timeStep.enum' import { DateTime } from 'luxon' import { Dataload, DataloadEntity } from 'models' -import QueryRunner from './queryRunner.service' import mockClient from '../../tests/__mocks__/client' -import { loadYearData } from '../../tests/__mocks__/loadYearData.mock' -import { loadMonthData } from '../../tests/__mocks__/loadMonthData.mock' import { loadDayData } from '../../tests/__mocks__/loadDayData.mock' import { loadMinuteData } from '../../tests/__mocks__/loadMinuteData.mock' -import { DataloadState } from 'enum/dataload.enum' +import { loadMonthData } from '../../tests/__mocks__/loadMonthData.mock' +import { loadYearData } from '../../tests/__mocks__/loadYearData.mock' +import QueryRunner from './queryRunner.service' describe('queryRunner service', () => { const queryRunner = new QueryRunner(mockClient) @@ -244,20 +244,12 @@ describe('queryRunner service', () => { date: DateTime.fromISO('2020-11-02T00:00:00.000Z', { zone: 'utc', }), - value: 4.5, - state: DataloadState.VALID, - valueDetail: null, - }, - { - date: DateTime.fromISO('2020-11-02T00:30:00.000Z', { - zone: 'utc', - }), value: 1.33, state: DataloadState.VALID, valueDetail: null, }, { - date: DateTime.fromISO('2020-11-02T01:00:00.000Z', { + date: DateTime.fromISO('2020-11-02T00:30:00.000Z', { zone: 'utc', }), value: 3.22, @@ -265,7 +257,7 @@ describe('queryRunner service', () => { valueDetail: null, }, { - date: DateTime.fromISO('2020-11-02T01:30:00.000Z', { + date: DateTime.fromISO('2020-11-02T01:00:00.000Z', { zone: 'utc', }), value: 7.82, @@ -273,7 +265,7 @@ describe('queryRunner service', () => { valueDetail: null, }, { - date: DateTime.fromISO('2020-11-02T02:00:00.000Z', { + date: DateTime.fromISO('2020-11-02T01:30:00.000Z', { zone: 'utc', }), value: 1.23, diff --git a/src/services/queryRunner.service.ts b/src/services/queryRunner.service.ts index f559a5a1c28aea594ca1cf7529063c177a3d0604..5c5e91866ca356039084959118180b298aced9f9 100644 --- a/src/services/queryRunner.service.ts +++ b/src/services/queryRunner.service.ts @@ -1,5 +1,4 @@ import { Client, Q, QueryDefinition } from 'cozy-client' -import { QueryResult } from 'cozy-client/types/types' import { EGL_DAY_DOCTYPE, EGL_MONTH_DOCTYPE, @@ -108,33 +107,43 @@ export default class QueryRunner { } private filterDataList(data: any, timePeriod: TimePeriod) { + // increase timeperiod range because the last data for a day is actually stored the next day at 00:00 + if (timePeriod.endDate.day === timePeriod.startDate.day) { + timePeriod.startDate = timePeriod.startDate.plus({ minutes: 30 }) + timePeriod.endDate = timePeriod.endDate.plus({ minutes: 30 }) + } const filteredResult = data.data.filter((entry: any) => this.withinDateBoundaries( DateTime.local( entry.year, - entry.month === 0 ? 1 : entry.month, - entry.day === 0 ? 1 : entry.day + entry.month || 1, + entry.day || 1, + entry.hour, + entry.minute ).setZone('utc', { keepLocalTime: true, }), timePeriod ) ) - return filteredResult } - private mapDataList(data: any): Dataload[] { + private mapDataList(data: any, timeStep?: TimeStep): Dataload[] { + // set back every half hour data at -30 minutes so it is displayed as 23:30 instead of 00:00 etc.. + const minusValue = timeStep === TimeStep.HALF_AN_HOUR ? 30 : 0 const mappedResult = data.map((entry: any) => ({ date: DateTime.local( entry.year, - entry.month == 0 ? 1 : entry.month, - entry.day === 0 ? 1 : entry.day, + entry.month || 1, + entry.day || 1, entry.hour, entry.minute - ).setZone('utc', { - keepLocalTime: true, - }), + ) + .setZone('utc', { + keepLocalTime: true, + }) + .minus({ minutes: minusValue }), value: entry.load, state: DataloadState.VALID, price: entry.price, @@ -187,7 +196,6 @@ export default class QueryRunner { private getPredicate(timePeriod: TimePeriod, timeStep: TimeStep) { let predicate = {} - switch (timeStep) { case TimeStep.HALF_AN_HOUR: predicate = { @@ -198,7 +206,7 @@ export default class QueryRunner { $eq: timePeriod.startDate.month, }, day: { - $eq: timePeriod.startDate.day, + $in: [timePeriod.startDate.day, timePeriod.startDate.day + 1], }, } break @@ -325,7 +333,10 @@ export default class QueryRunner { if (result?.data) { const filteredResult = this.filterDataList(result, timePeriod) - const mappedResult: Dataload[] = this.mapDataList(filteredResult) + const mappedResult: Dataload[] = this.mapDataList( + filteredResult, + timeStep + ) return mappedResult } return null @@ -381,7 +392,7 @@ export default class QueryRunner { } if (result?.data) { const filteredResult = this.filterDataList(result, maxTimePeriod) - const mappedResult = this.mapDataList(filteredResult) + const mappedResult = this.mapDataList(filteredResult, timeStep) if (withDate) { return mappedResult && mappedResult[0] && mappedResult[0] } @@ -408,7 +419,7 @@ export default class QueryRunner { return DateTime.local( result.data[0].year, result.data[0].month, - result.data[0].day === 0 ? 1 : result.data[0].day, + result.data[0].day || 1, result.data[0].hour || 0, result.data[0].minute || 0 ).setZone('utc', { @@ -436,7 +447,7 @@ export default class QueryRunner { return DateTime.local( result.data[0].year, result.data[0].month, - result.data[0].day === 0 ? 1 : result.data[0].day, + result.data[0].day || 1, result.data[0].hour || 0, result.data[0].minute || 0 ).setZone('utc', {