|
| 1 | +import {exampleData} from "./exampleData.js"; |
| 2 | +import { |
| 3 | + CFDGraph, |
| 4 | + CFDRenderer, |
| 5 | + ScatterplotGraph, |
| 6 | + MovingRangeGraph, |
| 7 | + MovingRangeRenderer, |
| 8 | + ControlRenderer, |
| 9 | + HistogramRenderer, |
| 10 | + SimpleScatterplotRenderer, |
| 11 | + ObservationLoggingService, |
| 12 | + processServiceData, |
| 13 | + eventBus |
| 14 | +} from "../dist/graphs-renderer.js"; |
| 15 | +import {initializeForm, toggleRightSidebar, warningField} from "./sidebars.js" |
| 16 | + |
| 17 | + |
| 18 | +let removedTicketTypes = ["task"]; |
| 19 | +let removedRepos = ["wizard-lambda"]; |
| 20 | +let serviceData = exampleData |
| 21 | +let serviceId = "0a95c-9151-448e" |
| 22 | +let data = processServiceData(serviceData, removedRepos, removedTicketTypes); |
| 23 | +if (!data || data.length === 0) { |
| 24 | + console.log("There is no data for this service!"); |
| 25 | +} else { |
| 26 | + renderGraphs(data, serviceId); |
| 27 | +} |
| 28 | + |
| 29 | +function renderCfdGraph(data, controlsElementSelector, loadConfigInputSelector, resetConfigInputSelector) { |
| 30 | + //The cfd area chart and brush window elements css selectors |
| 31 | + const cfdGraphElementSelector = "#cfd-area-div"; |
| 32 | + const cfdBrushElementSelector = "#cfd-brush-div"; |
| 33 | + //Declare the states array for the cfd graph data |
| 34 | + const states = ['analysis_active', 'analysis_done', 'in_progress', 'dev_complete', 'verification_start', 'delivered']; |
| 35 | + //Declare the states in reversed order for the CFD (stacked area chart) to render correctly the areas |
| 36 | + const reversedStates = [...states].reverse(); |
| 37 | + //Create a CFDGraph |
| 38 | + const cfdGraph = new CFDGraph(data, states); |
| 39 | + //Compute the dataset for a cfd graph |
| 40 | + const cfdGraphDataSet = cfdGraph.computeDataSet(); |
| 41 | + //Create a CFDRenderer with the reversed states |
| 42 | + const cfdRenderer = new CFDRenderer(cfdGraphDataSet, reversedStates); |
| 43 | + //Pass the created event bus to the cfd graph |
| 44 | + cfdRenderer.setupEventBus(eventBus); |
| 45 | + const reportingRangeDays = 0.75 * cfdGraphDataSet.length; |
| 46 | + if (document.querySelector(cfdGraphElementSelector)) { |
| 47 | + if (cfdGraphDataSet.length > 0) { |
| 48 | + cfdRenderer.renderGraph(cfdGraphElementSelector); |
| 49 | + cfdRenderer.reportingRangeDays = reportingRangeDays |
| 50 | + cfdRenderer.setupXAxisControl() |
| 51 | + cfdRenderer.enableMetrics() |
| 52 | + document.querySelector(cfdBrushElementSelector) && cfdRenderer.setupBrush(cfdBrushElementSelector); |
| 53 | + document.querySelector(loadConfigInputSelector) && cfdRenderer.setupConfigLoader(loadConfigInputSelector, resetConfigInputSelector); |
| 54 | + } else { |
| 55 | + cfdRenderer.clearGraph(cfdGraphElementSelector, cfdBrushElementSelector); |
| 56 | + } |
| 57 | + } |
| 58 | + return {cfdRenderer, reportingRangeDays}; |
| 59 | +} |
| 60 | + |
| 61 | +function renderScatterplotAndHistogramGraphs(data, reportingRangeDays, controlsElementSelector, loadConfigInputSelector, resetConfigInputSelector) { |
| 62 | + //The scatterplot area chart, histogram area chart and scatterplot brush window elements css selectors |
| 63 | + const scatterplotGraphElementSelector = "#scatterplot-area-div"; |
| 64 | + const movingRangeGraphElementSelector = "#moving-range-area-div"; |
| 65 | + const controlGraphElementSelector = "#control-area-div"; |
| 66 | + const histogramGraphElementSelector = "#histogram-area-div"; |
| 67 | + const timeScaleSelector = "#time-scale-select"; |
| 68 | + const baseJiraURL = ""; |
| 69 | + const scatterplotBrushElementSelector = "#scatterplot-brush-div"; |
| 70 | + const controlBrushElementSelector = "#control-brush-div"; |
| 71 | + const movingRangeBrushElementSelector = "#moving-range-brush-div"; |
| 72 | + //Create a ScatterplotGraph |
| 73 | + const scatterplotGraph = new ScatterplotGraph(data); |
| 74 | + // //Compute the dataset for the scatterplot and histogram graphs |
| 75 | + const leadTimeDataSet = scatterplotGraph.computeDataSet(data); |
| 76 | + //Create a ScatterplotRenderer |
| 77 | + const scatterplotRenderer = new SimpleScatterplotRenderer(leadTimeDataSet, baseJiraURL); |
| 78 | + //Pass the created event bus to teh cfd graph |
| 79 | + scatterplotRenderer.setupEventBus(eventBus); |
| 80 | + //Create a HistogramRenderer |
| 81 | + const histogramRenderer = new HistogramRenderer(leadTimeDataSet, eventBus); |
| 82 | + if (document.querySelector(scatterplotGraphElementSelector)) { |
| 83 | + if (leadTimeDataSet.length > 0) { |
| 84 | + scatterplotRenderer.setTimeScaleListener(timeScaleSelector) |
| 85 | + scatterplotRenderer.renderGraph(scatterplotGraphElementSelector); |
| 86 | + scatterplotRenderer.reportingRangeDays = reportingRangeDays |
| 87 | + scatterplotRenderer.setupXAxisControl() |
| 88 | + scatterplotRenderer.enableMetrics() |
| 89 | + document.querySelector(histogramGraphElementSelector) && histogramRenderer.renderGraph(histogramGraphElementSelector); |
| 90 | + document.querySelector(scatterplotBrushElementSelector) && scatterplotRenderer.setupBrush(scatterplotBrushElementSelector); |
| 91 | + document.querySelector(loadConfigInputSelector) && scatterplotRenderer.setupConfigLoader(loadConfigInputSelector, resetConfigInputSelector); |
| 92 | + } else { |
| 93 | + scatterplotRenderer.clearGraph(scatterplotGraphElementSelector, scatterplotBrushElementSelector); |
| 94 | + histogramRenderer.clearGraph(histogramGraphElementSelector); |
| 95 | + } |
| 96 | + } |
| 97 | + |
| 98 | + //filter leadTimeDataSet values to not exceed 80 days lead time |
| 99 | + const filteredLeadTimeDataSet = leadTimeDataSet.filter((d) => d.leadTime <= 80); |
| 100 | + |
| 101 | + //Moving range chart |
| 102 | + const movingRangeGraph = new MovingRangeGraph(filteredLeadTimeDataSet); |
| 103 | + const movingRangeGraphDataSet = movingRangeGraph.computeDataSet(); |
| 104 | + const avgMovingRange = movingRangeGraph.getAvgMovingRange() |
| 105 | + const movingRangeRenderer = new MovingRangeRenderer(movingRangeGraphDataSet, avgMovingRange); |
| 106 | + movingRangeRenderer.renderGraph(movingRangeGraphElementSelector); |
| 107 | + movingRangeRenderer.reportingRangeDays = reportingRangeDays; |
| 108 | + movingRangeRenderer.setupEventBus(eventBus) |
| 109 | + document.querySelector(movingRangeBrushElementSelector) && movingRangeRenderer.setupBrush(movingRangeBrushElementSelector); |
| 110 | + movingRangeRenderer.setupXAxisControl() |
| 111 | + |
| 112 | + |
| 113 | + //Control chart |
| 114 | + const controlRenderer = new ControlRenderer(filteredLeadTimeDataSet, avgMovingRange); |
| 115 | + controlRenderer.renderGraph(controlGraphElementSelector); |
| 116 | + controlRenderer.reportingRangeDays = reportingRangeDays; |
| 117 | + controlRenderer.setupEventBus(eventBus) |
| 118 | + document.querySelector(controlBrushElementSelector) && controlRenderer.setupBrush(controlBrushElementSelector); |
| 119 | + controlRenderer.setupXAxisControl() |
| 120 | + |
| 121 | + return scatterplotRenderer; |
| 122 | +} |
| 123 | + |
| 124 | +async function renderGraphs(data, serviceId) { |
| 125 | + //The Load and reset config input buttons css selectors |
| 126 | + const loadConfigInputSelector = "#load-config-input"; |
| 127 | + const resetConfigInputSelector = "#reset-config-input"; |
| 128 | + //The controls div css selector that contains the reporting range days input and the x axes labeling units dropdown |
| 129 | + const controlsElementSelector = "#controls-div"; |
| 130 | + |
| 131 | + const { |
| 132 | + cfdRenderer, |
| 133 | + reportingRangeDays |
| 134 | + } = renderCfdGraph(data, controlsElementSelector, loadConfigInputSelector, resetConfigInputSelector); |
| 135 | + const scatterplotRenderer = renderScatterplotAndHistogramGraphs(data, reportingRangeDays, controlsElementSelector, loadConfigInputSelector, resetConfigInputSelector); |
| 136 | + const useObservationLogging = false; |
| 137 | + useObservationLogging && await useObservationLogging(scatterplotRenderer, cfdRenderer, serviceId); |
| 138 | +} |
| 139 | + |
| 140 | +async function useObservationLogging(scatterplotRenderer, cfdRenderer, serviceId) { |
| 141 | + const loggingServiceURL = ""; |
| 142 | + const btoaToken = ""; |
| 143 | + const observationLoggingService = new ObservationLoggingService(loggingServiceURL, btoaToken, serviceId); |
| 144 | + let observations = []; |
| 145 | + try { |
| 146 | + await observationLoggingService.loadObservations(); |
| 147 | + observations = observationLoggingService.observationsByService; |
| 148 | + } catch (e) { |
| 149 | + console.error(e); |
| 150 | + } |
| 151 | + |
| 152 | + scatterplotRenderer.setupObservationLogging(observations); |
| 153 | + cfdRenderer.setupObservationLogging(observations); |
| 154 | + eventBus.addEventListener("scatterplot-click", (event) => { |
| 155 | + initializeForm({...event, chartType: "SCATTERPLOT", serviceId}); |
| 156 | + toggleRightSidebar(true); |
| 157 | + }); |
| 158 | + eventBus.addEventListener("cfd-click", (event) => { |
| 159 | + initializeForm({...event, chartType: "CFD", serviceId}); |
| 160 | + toggleRightSidebar(true); |
| 161 | + }); |
| 162 | + eventBus.addEventListener("submit-observation-form", async (observation) => { |
| 163 | + let observationResponse; |
| 164 | + const observationId = observation.observation_id; |
| 165 | + delete observation.observation_id; |
| 166 | + try { |
| 167 | + if (observationId) { |
| 168 | + observationResponse = await observationLoggingService.updateObservation(observation, observationId); |
| 169 | + } else { |
| 170 | + observationResponse = await observationLoggingService.addObservation(observation); |
| 171 | + } |
| 172 | + if (observationResponse) { |
| 173 | + toggleRightSidebar(false); |
| 174 | + if (observation.chart_type === "SCATTERPLOT") { |
| 175 | + scatterplotRenderer.hideTooltip(); |
| 176 | + scatterplotRenderer.displayObservationMarkers(observationLoggingService.observationsByService); |
| 177 | + } |
| 178 | + if (observation.chart_type === "CFD") { |
| 179 | + cfdRenderer.hideTooltipAndMovingLine(); |
| 180 | + cfdRenderer.displayObservationMarkers(observationLoggingService.observationsByService); |
| 181 | + } |
| 182 | + } |
| 183 | + } catch (e) { |
| 184 | + warningField.textContent = "Error submitting the observation: " + e.message; |
| 185 | + console.log("Error submitting the observation: " + e.message); |
| 186 | + } |
| 187 | + }); |
| 188 | +} |
0 commit comments