7
7
getIncByCategory ,
8
8
getCategoriesArray ,
9
9
addCategory ,
10
+ getIncCountForCategoryByWeek
10
11
} from "./db.js" ;
11
12
import QuickChart from "quickchart-js" ;
12
13
@@ -175,13 +176,26 @@ app.command("/inc_stats", async ({ ack, body, client }) => {
175
176
const chartUrlByWeek = await generateIncByWeekChart ( numberOfDays ) ;
176
177
const chartUrlByCategory = await generateIncByCategoryChart ( numberOfDays ) ;
177
178
179
+ const categories = await getCategoriesArray ( ) ;
180
+
181
+
182
+ // Format the options
183
+ const categoryOptions = categories . map ( ( category ) => ( {
184
+ text : {
185
+ type : "plain_text" ,
186
+ text : category ,
187
+ } ,
188
+ value : category ,
189
+ } ) ) ;
190
+
178
191
// Post a response in the channel where the command was invoked
179
192
try {
180
193
await client . views . open ( {
181
194
trigger_id : body . trigger_id ,
182
195
view : {
183
196
type : "modal" ,
184
197
callback_id : "inc_stats_modal" ,
198
+ private_metadata : JSON . stringify ( { numberOfDays } ) , // Store the number of days in the metadata
185
199
title : {
186
200
type : "plain_text" ,
187
201
text : `Inc stats ${ numberOfDays ? `siste ${ numberOfDays } dager` : "" } ` ,
@@ -205,14 +219,99 @@ app.command("/inc_stats", async ({ ack, body, client }) => {
205
219
image_url : chartUrlByWeek ,
206
220
alt_text : "Incidents per Week" ,
207
221
} ,
222
+ {
223
+ type : "input" ,
224
+ block_id : "category_select" ,
225
+ element : {
226
+ type : "static_select" ,
227
+ action_id : "category_modal" ,
228
+ placeholder : {
229
+ type : "plain_text" ,
230
+ text : "Select a category" ,
231
+ } ,
232
+ options : categoryOptions ,
233
+ } ,
234
+ label : {
235
+ type : "plain_text" ,
236
+ text : "Category" ,
237
+ } ,
238
+ } ,
208
239
] ,
240
+ submit : {
241
+ type : "plain_text" ,
242
+ text : "Submit" ,
243
+ } ,
209
244
} ,
210
245
} ) ;
211
246
} catch ( error ) {
212
247
console . error ( "Error posting message:" , error ) ;
213
248
}
214
249
} ) ;
215
250
251
+ app . view ( "inc_stats_modal" , async ( { ack, body, view, client } ) => {
252
+ await ack ( ) ;
253
+ console . log ( "view" , view ) ;
254
+ const selectedCategory = view . state . values . category_select . category_modal . selected_option . value ;
255
+ console . log ( "selectedCategory" , selectedCategory ) ;
256
+ const numberOfDays = view ?. metadata ?. numberOfDays ;
257
+ console . log ( "numberOfDays" , numberOfDays ) ;
258
+ const chartUrl = await generateIncByCategoryOverWeeksChart ( selectedCategory , numberOfDays ) ;
259
+
260
+ try {
261
+ await client . views . update ( {
262
+ view_id : view . id ,
263
+ view : {
264
+ type : "modal" ,
265
+ callback_id : "inc_stats_modal" ,
266
+ private_metadata : JSON . stringify ( { numberOfDays } ) , // Store the number of days in the metadata
267
+ title : {
268
+ type : "plain_text" ,
269
+ text : "Inc stats" ,
270
+ } ,
271
+ blocks : [
272
+ ...body . view . blocks . filter ( block => block . block_id !== "chart_block_category_by_week" ) ,
273
+ {
274
+ type : "input" ,
275
+ block_id : "category_select" ,
276
+ element : {
277
+ type : "static_select" ,
278
+ action_id : "category_modal" ,
279
+ placeholder : {
280
+ type : "plain_text" ,
281
+ text : "Select a category" ,
282
+ } ,
283
+ options : body . view . blocks [ 0 ] . element . options ,
284
+ initial_option : {
285
+ text : {
286
+ type : "plain_text" ,
287
+ text : selectedCategory ,
288
+ } ,
289
+ value : selectedCategory ,
290
+ } ,
291
+ } ,
292
+ label : {
293
+ type : "plain_text" ,
294
+ text : "Category" ,
295
+ } ,
296
+ } ,
297
+ {
298
+ type : "image" ,
299
+ block_id : "chart_block_category_by_week" ,
300
+ image_url : chartUrl ,
301
+ alt_text : "Incidents per Week" ,
302
+ } ,
303
+ ] ,
304
+ submit : {
305
+ type : "plain_text" ,
306
+ text : "Submit" ,
307
+ } ,
308
+ } ,
309
+ } ) ;
310
+ } catch ( error ) {
311
+ console . error ( "Error updating modal:" , error ) ;
312
+ }
313
+ } ) ;
314
+
216
315
( async ( ) => {
217
316
await app . start ( process . env . PORT || 3000 ) ;
218
317
console . log ( "⚡️ Bolt app started" ) ;
@@ -301,3 +400,44 @@ async function generateIncByCategoryChart(numberOfDays) {
301
400
console . log ( "url" , chart . getUrl ( ) ) ;
302
401
return chart . getUrl ( ) ;
303
402
}
403
+
404
+ async function generateIncByCategoryOverWeeksChart ( category , numberOfDays ) {
405
+ const dbResponse = await getIncCountForCategoryByWeek ( category , numberOfDays ) ;
406
+
407
+ const labels = dbResponse . rows . map ( ( row ) => row . category ) ;
408
+ const data = dbResponse . rows . map ( ( row ) => parseInt ( row . count , 10 ) ) ;
409
+
410
+ // Generate the bar chart URL using QuickChart
411
+ const chart = new QuickChart ( ) ;
412
+ chart . setConfig ( {
413
+ type : "line" ,
414
+ data : {
415
+ labels : labels ,
416
+ datasets : [
417
+ {
418
+ label : `Incidents for ${ category } ` ,
419
+ data : data ,
420
+ backgroundColor : "rgba(75, 192, 192, 0.2)" ,
421
+ borderColor : "rgba(75, 192, 192, 1)" ,
422
+ borderWidth : 1 ,
423
+ } ,
424
+ ] ,
425
+ } ,
426
+ options : {
427
+ scales : {
428
+ yAxes : [ {
429
+ ticks : {
430
+ beginAtZero : true ,
431
+ min : 0 ,
432
+ stepSize : 1 ,
433
+ precision : 0
434
+ }
435
+ } ]
436
+ }
437
+ }
438
+ } ) ;
439
+ chart . setWidth ( 800 ) ;
440
+ chart . setHeight ( 400 ) ;
441
+ console . log ( "url" , chart . getUrl ( ) ) ;
442
+ return chart . getUrl ( ) ;
443
+ }
0 commit comments