|
79 | 79 | </template>
|
80 | 80 |
|
81 | 81 | <script lang="ts">
|
82 |
| -import { defineComponent, ref, toRef } from 'vue'; |
| 82 | +import { defineComponent, ref, toRef, watch } from 'vue'; |
83 | 83 | import type { Metrics } from '@/model/Metrics';
|
84 | 84 | import { Breakdown } from '@/model/Breakdown';
|
85 | 85 | import { Pie } from 'vue-chartjs'
|
@@ -161,76 +161,87 @@ export default defineComponent({
|
161 | 161 | '#7CFC00' // Lawn Green
|
162 | 162 | ]);
|
163 | 163 |
|
164 |
| - const data = toRef(props, 'metrics').value; |
| 164 | + // Function to process breakdown data |
| 165 | + const processBreakdownData = (data: Metrics[]) => { |
| 166 | + // Reset the breakdown list |
| 167 | + breakdownList.value = []; |
| 168 | + |
| 169 | + // Process the breakdown separately |
| 170 | + data.forEach((m: Metrics) => m.breakdown.forEach(breakdownData => |
| 171 | + { |
| 172 | + const breakdownName = breakdownData[props.breakdownKey as keyof typeof breakdownData] as string; |
| 173 | + let breakdown = breakdownList.value.find(b => b.name === breakdownName); |
165 | 174 |
|
166 |
| - // Process the breakdown separately |
167 |
| - data.forEach((m: Metrics) => m.breakdown.forEach(breakdownData => |
168 |
| - { |
169 |
| - const breakdownName = breakdownData[props.breakdownKey as keyof typeof breakdownData] as string; |
170 |
| - let breakdown = breakdownList.value.find(b => b.name === breakdownName); |
| 175 | + if (!breakdown) { |
| 176 | + // Create a new breakdown object if it does not exist |
| 177 | + breakdown = new Breakdown({ |
| 178 | + name: breakdownName, |
| 179 | + acceptedPrompts: breakdownData.acceptances_count, |
| 180 | + suggestedPrompts: breakdownData.suggestions_count, |
| 181 | + suggestedLinesOfCode: breakdownData.lines_suggested, |
| 182 | + acceptedLinesOfCode: breakdownData.lines_accepted, |
| 183 | + }); |
| 184 | + breakdownList.value.push(breakdown); |
| 185 | + } else { |
| 186 | + // Update the existing breakdown object |
| 187 | + breakdown.acceptedPrompts += breakdownData.acceptances_count; |
| 188 | + breakdown.suggestedPrompts += breakdownData.suggestions_count; |
| 189 | + breakdown.suggestedLinesOfCode += breakdownData.lines_suggested; |
| 190 | + breakdown.acceptedLinesOfCode += breakdownData.lines_accepted; |
| 191 | + } |
| 192 | + // Recalculate the acceptance rates |
| 193 | + breakdown.acceptanceRateByCount = breakdown.suggestedPrompts !== 0 ? (breakdown.acceptedPrompts / breakdown.suggestedPrompts) * 100 : 0; |
| 194 | + breakdown.acceptanceRateByLines = breakdown.suggestedLinesOfCode !== 0 ? (breakdown.acceptedLinesOfCode / breakdown.suggestedLinesOfCode) * 100 : 0; |
171 | 195 |
|
172 |
| - if (!breakdown) { |
173 |
| - // Create a new breakdown object if it does not exist |
174 |
| - breakdown = new Breakdown({ |
175 |
| - name: breakdownName, |
176 |
| - acceptedPrompts: breakdownData.acceptances_count, |
177 |
| - suggestedPrompts: breakdownData.suggestions_count, |
178 |
| - suggestedLinesOfCode: breakdownData.lines_suggested, |
179 |
| - acceptedLinesOfCode: breakdownData.lines_accepted, |
180 |
| - }); |
181 |
| - breakdownList.value.push(breakdown); |
182 |
| - } else { |
183 |
| - // Update the existing breakdown object |
184 |
| - breakdown.acceptedPrompts += breakdownData.acceptances_count; |
185 |
| - breakdown.suggestedPrompts += breakdownData.suggestions_count; |
186 |
| - breakdown.suggestedLinesOfCode += breakdownData.lines_suggested; |
187 |
| - breakdown.acceptedLinesOfCode += breakdownData.lines_accepted; |
188 |
| - } |
189 |
| - // Recalculate the acceptance rates |
190 |
| - breakdown.acceptanceRateByCount = breakdown.suggestedPrompts !== 0 ? (breakdown.acceptedPrompts / breakdown.suggestedPrompts) * 100 : 0; |
191 |
| - breakdown.acceptanceRateByLines = breakdown.suggestedLinesOfCode !== 0 ? (breakdown.acceptedLinesOfCode / breakdown.suggestedLinesOfCode) * 100 : 0; |
| 196 | + // Log each breakdown for debugging |
| 197 | + // console.log('Breakdown:', breakdown); |
| 198 | + })); |
192 | 199 |
|
193 |
| - // Log each breakdown for debugging |
194 |
| - // console.log('Breakdown:', breakdown); |
195 |
| - })); |
| 200 | + //Sort breakdowns map by accepted prompts |
| 201 | + breakdownList.value.sort((a, b) => b.acceptedPrompts - a.acceptedPrompts); |
196 | 202 |
|
197 |
| - //Sort breakdowns map by accepted prompts |
198 |
| - breakdownList.value.sort((a, b) => b.acceptedPrompts - a.acceptedPrompts); |
| 203 | + // Get the top 5 breakdowns by accepted prompts |
| 204 | + const top5BreakdownsAcceptedPrompts = breakdownList.value.slice(0, 5); |
| 205 | + |
| 206 | + breakdownsChartDataTop5AcceptedPrompts.value = { |
| 207 | + labels: top5BreakdownsAcceptedPrompts.map(breakdown => breakdown.name), |
| 208 | + datasets: [ |
| 209 | + { |
| 210 | + data: top5BreakdownsAcceptedPrompts.map(breakdown => breakdown.acceptedPrompts), |
| 211 | + backgroundColor: pieChartColors.value, |
| 212 | + }, |
| 213 | + ], |
| 214 | + }; |
199 | 215 |
|
200 |
| - // Get the top 5 breakdowns by accepted prompts |
201 |
| - const top5BreakdownsAcceptedPrompts = breakdownList.value.slice(0, 5); |
202 |
| - |
203 |
| - breakdownsChartDataTop5AcceptedPrompts.value = { |
204 |
| - labels: top5BreakdownsAcceptedPrompts.map(breakdown => breakdown.name), |
205 |
| - datasets: [ |
206 |
| - { |
207 |
| - data: top5BreakdownsAcceptedPrompts.map(breakdown => breakdown.acceptedPrompts), |
208 |
| - backgroundColor: pieChartColors.value, |
209 |
| - }, |
210 |
| - ], |
211 |
| - }; |
| 216 | + breakdownsChartDataTop5AcceptedPromptsByLines.value = { |
| 217 | + labels: top5BreakdownsAcceptedPrompts.map(breakdown => breakdown.name), |
| 218 | + datasets: [ |
| 219 | + { |
| 220 | + data: top5BreakdownsAcceptedPrompts.map(breakdown => breakdown.acceptanceRateByLines.toFixed(2)), |
| 221 | + backgroundColor: pieChartColors.value, |
| 222 | + }, |
| 223 | + ], |
| 224 | + }; |
212 | 225 |
|
213 |
| - breakdownsChartDataTop5AcceptedPromptsByLines.value = { |
214 |
| - labels: top5BreakdownsAcceptedPrompts.map(breakdown => breakdown.name), |
215 |
| - datasets: [ |
216 |
| - { |
217 |
| - data: top5BreakdownsAcceptedPrompts.map(breakdown => breakdown.acceptanceRateByLines.toFixed(2)), |
218 |
| - backgroundColor: pieChartColors.value, |
219 |
| - }, |
220 |
| - ], |
221 |
| - }; |
| 226 | + breakdownsChartDataTop5AcceptedPromptsByCounts.value = { |
| 227 | + labels: top5BreakdownsAcceptedPrompts.map(breakdown => breakdown.name), |
| 228 | + datasets: [ |
| 229 | + { |
| 230 | + data: top5BreakdownsAcceptedPrompts.map(breakdown => breakdown.acceptanceRateByCount.toFixed(2)), |
| 231 | + backgroundColor: pieChartColors.value, |
| 232 | + }, |
| 233 | + ], |
| 234 | + }; |
222 | 235 |
|
223 |
| - breakdownsChartDataTop5AcceptedPromptsByCounts.value = { |
224 |
| - labels: top5BreakdownsAcceptedPrompts.map(breakdown => breakdown.name), |
225 |
| - datasets: [ |
226 |
| - { |
227 |
| - data: top5BreakdownsAcceptedPrompts.map(breakdown => breakdown.acceptanceRateByCount.toFixed(2)), |
228 |
| - backgroundColor: pieChartColors.value, |
229 |
| - }, |
230 |
| - ], |
| 236 | + numberOfBreakdowns.value = breakdownList.value.length; |
231 | 237 | };
|
232 | 238 |
|
233 |
| - numberOfBreakdowns.value = breakdownList.value.length; |
| 239 | + // Watch for changes in metrics prop and re-process data |
| 240 | + watch(() => props.metrics, (newMetrics) => { |
| 241 | + if (newMetrics && Array.isArray(newMetrics)) { |
| 242 | + processBreakdownData(newMetrics); |
| 243 | + } |
| 244 | + }, { immediate: true, deep: true }); |
234 | 245 |
|
235 | 246 | return { chartOptions, breakdownList, numberOfBreakdowns,
|
236 | 247 | breakdownsChartData, breakdownsChartDataTop5AcceptedPrompts, breakdownsChartDataTop5AcceptedPromptsByLines, breakdownsChartDataTop5AcceptedPromptsByCounts };
|
|
0 commit comments