Skip to content

Commit 1168e75

Browse files
authored
Merge pull request #52 from pfizer-opensource/baseline-and-brush-adjustments
Adjust baseline and brush
2 parents 6648efd + 22dd8e6 commit 1168e75

File tree

3 files changed

+79
-10
lines changed

3 files changed

+79
-10
lines changed

src/graphs/Renderer.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ export default class Renderer {
2828
* @returns {d3.Selection} The created SVG element.
2929
*/
3030
createSvg(selector, height = this.height, width = this.width) {
31+
this.graphElementSelector = selector;
3132
const htmlElement = document.querySelector(selector);
3233
if (htmlElement) {
3334
htmlElement.innerHTML = '';

src/graphs/UIControlsRenderer.js

Lines changed: 35 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -47,9 +47,41 @@ export default class UIControlsRenderer extends Renderer {
4747
updateBrushSelection(newTimeRange) {
4848
if (newTimeRange) {
4949
this.isManualBrushUpdate = false;
50-
const maxX = newTimeRange[1] > this.x.domain()[1] ? this.x.domain()[1] : newTimeRange[1];
51-
const minX = newTimeRange[0] < this.x.domain()[0] ? this.x.domain()[0] : newTimeRange[0];
52-
this.selectedTimeRange = [minX, maxX];
50+
const [newStart, newEnd] = newTimeRange;
51+
const [domainStart, domainEnd] = this.x.domain();
52+
const duration = newEnd - newStart;
53+
let selectedMin = newStart;
54+
let selectedMax = newEnd;
55+
// Ensure selectedMin does not go before domainStart
56+
const adjustSelectedMin = (calculatedMin) => {
57+
if (calculatedMin < domainStart) {
58+
return domainStart;
59+
}
60+
return calculatedMin;
61+
};
62+
63+
// Check if newTimeRange exceeds the domain
64+
if (newStart < domainStart || newEnd > domainEnd) {
65+
selectedMax = domainEnd;
66+
67+
// Calculate selectedMin based on the duration
68+
selectedMin = new Date(domainEnd.getTime() - duration);
69+
70+
// Ensure selectedMin does not go before domainStart
71+
selectedMin = adjustSelectedMin(selectedMin);
72+
73+
if (selectedMin === domainStart) {
74+
selectedMax = new Date(selectedMin.getTime() + duration);
75+
76+
// Ensure selectedMax does not exceed domainEnd
77+
if (selectedMax > domainEnd) {
78+
selectedMax = domainEnd;
79+
}
80+
}
81+
}
82+
83+
this.selectedTimeRange = [selectedMin, selectedMax];
84+
5385
// Set the flag before emitting an event
5486
this.preventEventLoop = true;
5587

src/graphs/scatterplot/ScatterplotRenderer.js

Lines changed: 43 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -226,18 +226,54 @@ class ScatterplotRenderer extends UIControlsRenderer {
226226
}
227227
}
228228

229-
setBaselineListener(baselineStartDateSelector, baselineEndDateSelector) {
230-
this.baselineStartDateElement = document.querySelector(baselineStartDateSelector);
229+
setBaselineListener(baselineStartDateSelector, baselineEndDateSelector, baselineErrorSelector, namespace) {
230+
const lastIndex = this.data.length - 1;
231+
this.baselineStartDateElement = d3.select(baselineStartDateSelector);
231232
if (this.baselineStartDateElement) {
232-
this.baselineStartDateElement.addEventListener('change', (event) => {
233-
this.baselineStartDate = new Date(event.target.value);
233+
this.baselineStartDateElement.attr('min', new Date(this.data[0].deliveredDate).toISOString().split('T')[0]);
234+
this.baselineStartDateElement.attr('max', new Date(this.data[lastIndex].deliveredDate).toISOString().split('T')[0]);
235+
this.baselineStartDateElement.on(`change.${namespace}`, (event) => {
236+
const selectedValue = d3.select(event.target).property('value');
237+
this.baselineStartDate = new Date(selectedValue);
238+
239+
if (this.baselineEndDate && this.baselineStartDate > this.baselineEndDate) {
240+
d3.select(baselineErrorSelector).style('display', 'block').text('Start date cannot be later than end date.');
241+
242+
// Reset the end date to the start date
243+
this.baselineEndDateElement.property('value', selectedValue);
244+
this.baselineEndDate = new Date(selectedValue);
245+
246+
// Hide the error message after 3 seconds
247+
setTimeout(() => {
248+
d3.select(baselineErrorSelector).style('display', 'none');
249+
}, 3000);
250+
}
251+
234252
this.updateGraph(this.selectedTimeRange);
235253
});
236254
}
237-
this.baselineEndDateElement = document.querySelector(baselineEndDateSelector);
255+
256+
this.baselineEndDateElement = d3.select(baselineEndDateSelector);
238257
if (this.baselineEndDateElement) {
239-
this.baselineEndDateElement.addEventListener('change', (event) => {
240-
this.baselineEndDate = new Date(event.target.value);
258+
this.baselineEndDateElement.attr('min', new Date(this.data[0].deliveredDate).toISOString().split('T')[0]);
259+
this.baselineEndDateElement.attr('max', new Date(this.data[lastIndex].deliveredDate).toISOString().split('T')[0]);
260+
this.baselineEndDateElement.on(`change.${namespace}`, (event) => {
261+
const selectedValue = d3.select(event.target).property('value');
262+
this.baselineEndDate = new Date(selectedValue);
263+
264+
if (this.baselineStartDate && this.baselineStartDate > this.baselineEndDate) {
265+
d3.select(baselineErrorSelector).style('display', 'block').text('End date cannot be earlier than start date.');
266+
267+
// Reset the start date to the end date
268+
this.baselineStartDateElement.property('value', selectedValue);
269+
this.baselineStartDate = new Date(selectedValue);
270+
271+
// Hide the error message after 3 seconds
272+
setTimeout(() => {
273+
d3.select(baselineErrorSelector).style('display', 'none');
274+
}, 3000);
275+
}
276+
241277
this.updateGraph(this.selectedTimeRange);
242278
});
243279
}

0 commit comments

Comments
 (0)