Skip to content

Commit

Permalink
Merge pull request #589 from datosgobar/579-parametro-last-en-graphic
Browse files Browse the repository at this point in the history
579 - Parámetro last en Graphic
  • Loading branch information
pepeciavirella authored Nov 26, 2019
2 parents 56dbd3a + 5e625d1 commit 57e504a
Show file tree
Hide file tree
Showing 6 changed files with 137 additions and 23 deletions.
7 changes: 4 additions & 3 deletions src/components/exportable/GraphicExportable.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@ import { IAdjustmentOptions, PropsAdjuster } from "../../helpers/graphic/propsAd
import { GraphicURLValidator } from "../../helpers/graphic/URLValidation";
import { getColorArray } from "../style/Colors/Color";
import ExportableGraphicContainer from "../style/Graphic/ExportableGraphicContainer";
import Graphic, { IChartTypeProps, ILegendLabel, INumberPropsPerId, ISeriesAxisSides } from "../viewpage/graphic/Graphic";
import { chartExtremes } from "../viewpage/graphic/GraphicAndShare";
import Graphic, { IChartTypeProps, ILegendLabel, ISeriesAxisSides, INumberPropsPerId } from "../viewpage/graphic/Graphic";
import { chartExtremes } from "../../helpers/graphic/chartExtremes";
import { seriesConfigByUrl } from "../viewpage/ViewPage";

export interface IGraphicExportableProps {
Expand All @@ -37,6 +37,7 @@ export interface IGraphicExportableProps {
decimalTooltip?: number;
startDate?: string;
endDate?: string;
last?: number;
numbersAbbreviate?: boolean;
decimalsBillion?: number;
decimalsMillion?: number;
Expand Down Expand Up @@ -111,7 +112,7 @@ export default class GraphicExportable extends React.Component<IGraphicExportabl
return (
<ExportableGraphicContainer>
<Graphic series={this.state.series}
range={chartExtremes(this.state.series, this.state.dateRange)}
range={chartExtremes(this.state.series, this.state.dateRange, this.props.last)}
seriesConfig={seriesConfigByUrl(this.props.graphicUrl)(this.state.series)}
chartOptions={chartOptions}
formatUnits={true}
Expand Down
19 changes: 1 addition & 18 deletions src/components/viewpage/graphic/GraphicAndShare.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ import * as moment from "moment";
import * as React from 'react';
import { connect } from "react-redux";
import { setDate } from "../../../actions/seriesActions";
import { IDataPoint } from "../../../api/DataPoint";
import { IDateRange } from "../../../api/DateSerie";
import QueryParams from '../../../api/QueryParams';
import { ISerie } from "../../../api/Serie";
Expand All @@ -16,6 +15,7 @@ import GraphContainer from "../../style/Graphic/GraphContainer";
import { getQueryParams } from '../ViewPage';
import Graphic, { IChartExtremeProps } from "./Graphic";
import GraphicComplements from "./GraphicComplements";
import { chartExtremes } from '../../../helpers/graphic/chartExtremes';


const DEFAULT_CHART_TYPE: string = 'line';
Expand Down Expand Up @@ -208,23 +208,6 @@ function findSerieDate(series: ISerie[], timestamp: number): string {
return serieData !== undefined ? serieData.date : '';
}


export function chartExtremes(series: ISerie[], dateRange: { start: string, end: string }): IChartExtremeProps {
if (series.length === 0) {return {min: 0, max: 0}}

const firstSerieData = series[0].data;
let minDataIndex = firstSerieData.findIndex((data: IDataPoint) => data.date >= dateRange.start);
let maxDataIndex = firstSerieData.findIndex((data: IDataPoint) => data.date >= dateRange.end);
if (minDataIndex <= 0) { minDataIndex = 0 }
if (maxDataIndex <= 0) { maxDataIndex = firstSerieData.length - 1}

const min = new Date(firstSerieData[minDataIndex].date).getTime();
const max = new Date(firstSerieData[maxDataIndex].date).getTime();

return {min, max};
}


function mapStateToProps(state: IStore) {
return {
date: state.date,
Expand Down
3 changes: 2 additions & 1 deletion src/helpers/graphic/chartConfigBuilder.ts
Original file line number Diff line number Diff line change
Expand Up @@ -139,7 +139,8 @@ export class ChartConfigBuilder {
this.props.onZoom({min: Math.ceil(e.min), max: Math.ceil(e.max)});
}
}
}
},
minRange: 2
},

yAxis: yAxisArray,
Expand Down
30 changes: 30 additions & 0 deletions src/helpers/graphic/chartExtremes.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
import { IDataPoint } from "../../api/DataPoint";
import { ISerie } from "../../api/Serie";
import { IChartExtremeProps } from "../../components/viewpage/graphic/Graphic";

export function chartExtremes(series: ISerie[], dateRange: { start: string; end: string; }, last?: number): IChartExtremeProps {

if (series.length === 0) {
return { min: 0, max: 0 };
}

const firstSerieData = series[0].data;
let minDataIndex = firstSerieData.findIndex((data: IDataPoint) => data.date >= dateRange.start);
let maxDataIndex = firstSerieData.findIndex((data: IDataPoint) => data.date >= dateRange.end);

if (minDataIndex <= 0) {
minDataIndex = 0;
}
if (maxDataIndex <= 0) {
maxDataIndex = firstSerieData.length - 1;
}
if (last !== undefined) {
minDataIndex = Math.max(minDataIndex, maxDataIndex - last + 1);
}

const min = new Date(firstSerieData[minDataIndex].date).getTime();
const max = new Date(firstSerieData[maxDataIndex].date).getTime();

return { min, max };

}
3 changes: 2 additions & 1 deletion src/indexGraphic.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,8 @@ export function render(selector: string, config: IGraphicExportableProps) {
decimalTooltip={config.decimalTooltip}
decimalTooltips={config.decimalTooltips || {}}
startDate={config.startDate}
endDate={config.endDate}
endDate={config.endDate}
last={config.last}
numbersAbbreviate={abbreviationProps.numbersAbbreviate}
decimalsBillion={abbreviationProps.decimalsBillion}
decimalsMillion={abbreviationProps.decimalsMillion} />,
Expand Down
98 changes: 98 additions & 0 deletions src/tests/components/helpers/ChartExtremes.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
import { ISerie } from "../../../api/Serie";
import { IChartExtremeProps } from "../../../components/viewpage/graphic/Graphic";
import { chartExtremes } from "../../../helpers/graphic/chartExtremes";
import { generateCommonMockSerieEMAE, generateCommonMockSerieMotos } from "../../support/mockers/seriesMockers";

let series: ISerie[];
let dateRange: { start: string; end: string; };

function evaluateTimestamps(startDate: string, endDate: string, last?: number) {

const expectedStartTimestamp = new Date(startDate).getTime();
const expectedEndTimestamp = new Date(endDate).getTime();
const extremes = chartExtremes(series, dateRange, last);
expect(extremes.min).toEqual(expectedStartTimestamp);
expect(extremes.max).toEqual(expectedEndTimestamp);

}

describe("Tests for obtainment of a chart's time axis extremes", () => {

let extremes: IChartExtremeProps;

let expectedTimestamp: number;
let serieOne: ISerie;
let serieTwo: ISerie;

beforeAll(() => {
serieOne = generateCommonMockSerieEMAE();
serieTwo = generateCommonMockSerieMotos();
})

describe("Obtainment of the extremes without the 'last' parameter taken into account", () => {

it("If no series are involved, the interval starts at zero an has no length", () => {
series = [];
dateRange = {
start: "2019-04-02",
end: "2019-06-05"
};
extremes = chartExtremes(series, dateRange);
expect(extremes.min).toEqual(0);
expect(extremes.max).toEqual(0);
});
it("If there is no data subsequent to the range start, the interval starts at the first date's timestamp", () => {
series = [serieOne, serieTwo];
dateRange = {
start: "2019-08-01",
end: "2019-10-01"
};
expectedTimestamp = new Date(serieOne.data[0].date).getTime();
extremes = chartExtremes(series, dateRange);
expect(extremes.min).toEqual(expectedTimestamp);
});
it("If there is no data subsequent to the range ending, the interval ends at the last date's timestamp", () => {
series = [serieOne, serieTwo];
dateRange = {
start: "2018-07-01",
end: "2019-12-01"
};
expectedTimestamp = new Date(serieOne.data[serieOne.data.length - 1].date).getTime();
extremes = chartExtremes(series, dateRange);
expect(extremes.max).toEqual(expectedTimestamp);
});
it("If the range extremes are lesser and greater than the first and last date, the interval equals the range", () => {
series = [serieOne, serieTwo];
dateRange = {
start: "2018-11-01",
end: "2019-02-01"
};
evaluateTimestamps(dateRange.start, dateRange.end);
});

})

describe("Obtainment of the extremes upon the last n values of the original range, which is inside the dates", () => {

let last: number;

beforeAll(() => {
series = [serieOne, serieTwo];
dateRange = {
start: "2018-09-01",
end: "2019-02-01"
};
})

it("If the amount of last values asked for is smaller than the interval's length, the interval starts there", () => {
last = 3;
evaluateTimestamps("2018-12-01", dateRange.end, last);
});
it("If the amount of last values asked for is bigger than the interval's length, the interval is kept the same", () => {
last = 20;
evaluateTimestamps(dateRange.start, dateRange.end, last);
});

})

})

0 comments on commit 57e504a

Please sign in to comment.