Skip to content

Commit c5986f6

Browse files
authored
Merge pull request #41 from pfizer-opensource/pbc-baseline
Add baseline for the pbc charts
2 parents 058a909 + f3051c0 commit c5986f6

File tree

6 files changed

+45
-11
lines changed

6 files changed

+45
-11
lines changed

examples/example.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ async function renderGraphs(data, serviceId) {
125125
//The Load and reset config input buttons css selectors
126126
const loadConfigInputSelector = "#load-config-input";
127127
const resetConfigInputSelector = "#reset-config-input";
128-
//The controls div css selector that contains the reporting range days input and the x axis labeling units dropdown
128+
//The controls div css selector that contains the reporting range days input and the x axes labeling units dropdown
129129
const controlsElementSelector = "#controls-div";
130130

131131
const {

package-lock.json

Lines changed: 4 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/graphs/control-chart/ControlRenderer.js

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,11 @@ class ControlRenderer extends ScatterplotRenderer {
66
timeScale = 'linear';
77
connectDots = false;
88

9-
constructor(data, avgMovingRange, chartName) {
9+
constructor(data, avgMovingRangeFunc, chartName) {
1010
super(data);
1111
this.chartName = chartName;
1212
this.chartType = 'CONTROL';
13-
this.avgMovingRange = avgMovingRange;
13+
this.avgMovingRangeFunc = avgMovingRangeFunc;
1414
this.dotClass = 'control-dot';
1515
this.yAxisLabel = 'Days';
1616
}
@@ -27,6 +27,7 @@ class ControlRenderer extends ScatterplotRenderer {
2727
drawGraphLimits(yScale) {
2828
this.drawHorizontalLine(yScale, this.topLimit, 'purple', 'top-pb', `UPL=${this.topLimit}`);
2929
this.drawHorizontalLine(yScale, this.avgLeadTime, 'orange', 'mid-pb', `Avg=${this.avgLeadTime}`);
30+
3031
if (this.bottomLimit > 0) {
3132
this.drawHorizontalLine(yScale, this.bottomLimit, 'purple', 'bottom-pb', `LPL=${this.bottomLimit}`);
3233
} else {
@@ -36,9 +37,10 @@ class ControlRenderer extends ScatterplotRenderer {
3637

3738
computeGraphLimits() {
3839
this.avgLeadTime = this.getAvgLeadTime();
39-
this.topLimit = Math.ceil(this.avgLeadTime + this.avgMovingRange * 2.66);
40+
const avgMovingRange = this.avgMovingRangeFunc(this.baselineStartDate, this.baselineEndDate);
41+
this.topLimit = Math.ceil(this.avgLeadTime + avgMovingRange * 2.66);
4042

41-
this.bottomLimit = Math.ceil(this.avgLeadTime - this.avgMovingRange * 2.66);
43+
this.bottomLimit = Math.ceil(this.avgLeadTime - avgMovingRange * 2.66);
4244
const maxY = this.y.domain()[1] > this.topLimit ? this.y.domain()[1] : this.topLimit + 5;
4345
let minY = this.y.domain()[0];
4446
if (this.bottomLimit > 5) {
@@ -106,6 +108,7 @@ class ControlRenderer extends ScatterplotRenderer {
106108
.y((d) => this.applyYScale(this.currentYScale, d.leadTime));
107109
this.chartArea.selectAll('.dot-line').attr('d', line);
108110
}
111+
this.computeGraphLimits();
109112
this.drawGraphLimits(this.currentYScale);
110113
this.displayObservationMarkers(this.observations);
111114
}

src/graphs/moving-range/MovingRangeGraph.js

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
class MovingRangeGraph {
22
dataSet = [];
3+
34
constructor(data) {
45
this.data = data;
56
}
@@ -21,11 +22,14 @@ class MovingRangeGraph {
2122
return this.dataSet;
2223
}
2324

24-
getAvgMovingRange() {
25+
getAvgMovingRange(startDate, endDate) {
2526
if (this.dataSet.length <= 0) {
2627
throw new Error('Data set is empty');
2728
}
28-
return Math.ceil(this.dataSet.reduce((acc, curr) => acc + curr.leadTime, 0) / this.dataSet.length);
29+
return Math.ceil(
30+
this.dataSet.filter((d) => d.deliveredDate >= startDate && d.deliveredDate <= endDate).reduce((acc, curr) => acc + curr.leadTime, 0) /
31+
this.dataSet.length
32+
);
2933
}
3034
}
3135

src/graphs/moving-range/MovingRangeRenderer.js

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@ class MovingRangeRenderer extends ScatterplotRenderer {
55
color = '#0ea5e9';
66
timeScale = 'linear';
77

8-
constructor(data, avgMovingRange, workTicketsURL, chartName) {
8+
constructor(data, avgMovingRangeFunc, workTicketsURL, chartName) {
99
super(data);
10-
this.avgMovingRange = avgMovingRange;
10+
this.avgMovingRangeFunc = avgMovingRangeFunc;
1111
this.workTicketsURL = workTicketsURL;
1212
this.chartName = chartName;
1313
this.chartType = 'MOVING_RANGE';
@@ -25,12 +25,13 @@ class MovingRangeRenderer extends ScatterplotRenderer {
2525
}
2626

2727
drawGraphLimits(yScale) {
28+
const avgMovingRange = this.avgMovingRangeFunc(this.baselineStartDate, this.baselineEndDate);
2829
this.drawHorizontalLine(yScale, this.topLimit, 'purple', 'top-mr', `UPL=${this.topLimit}`);
29-
this.drawHorizontalLine(yScale, this.avgMovingRange, 'orange', 'mid-mr', `Avg=${this.avgMovingRange}`);
30+
this.drawHorizontalLine(yScale, avgMovingRange, 'orange', 'mid-mr', `Avg=${avgMovingRange}`);
3031
}
3132

3233
computeGraphLimits() {
33-
this.topLimit = 3.27 * this.avgMovingRange;
34+
this.topLimit = 3.27 * this.avgMovingRangeFunc(this.baselineStartDate, this.baselineEndDate);
3435
const maxY = this.y.domain()[1] > this.topLimit ? this.y.domain()[1] : this.topLimit + 5;
3536
this.y.domain([this.y.domain()[0], maxY]);
3637
}
@@ -93,6 +94,7 @@ class MovingRangeRenderer extends ScatterplotRenderer {
9394
.x((d) => this.currentXScale(d.deliveredDate))
9495
.y((d) => this.applyYScale(this.currentYScale, d.leadTime));
9596
this.chartArea.selectAll('.dot-line').attr('d', line);
97+
this.computeGraphLimits();
9698
this.drawGraphLimits(this.currentYScale);
9799
}
98100
}

src/graphs/scatterplot/ScatterplotRenderer.js

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ class ScatterplotRenderer extends UIControlsRenderer {
1717
yAxisLabel = '# of delivery days';
1818
timeScale = 'logarithmic';
1919
workTicketsURL = '#';
20+
baselineStartDate;
21+
baselineEndDate;
2022

2123
/**
2224
* Creates a ScatterplotRenderer instance
@@ -39,6 +41,8 @@ class ScatterplotRenderer extends UIControlsRenderer {
3941
*/
4042
constructor(data) {
4143
super(data);
44+
this.baselineStartDate = this.data[0].deliveredDate;
45+
this.baselineEndDate = this.data[this.data.length - 1].deliveredDate;
4246
}
4347

4448
/**
@@ -222,6 +226,23 @@ class ScatterplotRenderer extends UIControlsRenderer {
222226
}
223227
}
224228

229+
setBaselineListener(baselineStartDateSelector, baselineEndDateSelector) {
230+
this.baselineStartDateElement = document.querySelector(baselineStartDateSelector);
231+
if (this.baselineStartDateElement) {
232+
this.baselineStartDateElement.addEventListener('change', (event) => {
233+
this.baselineStartDate = new Date(event.target.value);
234+
this.updateGraph(this.selectedTimeRange);
235+
});
236+
}
237+
this.baselineEndDateElement = document.querySelector(baselineEndDateSelector);
238+
if (this.baselineEndDateElement) {
239+
this.baselineEndDateElement.addEventListener('change', (event) => {
240+
this.baselineEndDate = new Date(event.target.value);
241+
this.updateGraph(this.selectedTimeRange);
242+
});
243+
}
244+
}
245+
225246
//region Axes rendering
226247

227248
/**

0 commit comments

Comments
 (0)