jirametrics 2.22 → 2.30
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/bin/jirametrics-mcp +5 -0
- data/lib/jirametrics/aggregate_config.rb +10 -2
- data/lib/jirametrics/aging_work_bar_chart.rb +26 -10
- data/lib/jirametrics/aging_work_in_progress_chart.rb +43 -11
- data/lib/jirametrics/aging_work_table.rb +9 -7
- data/lib/jirametrics/anonymizer.rb +74 -1
- data/lib/jirametrics/atlassian_document_format.rb +93 -93
- data/lib/jirametrics/blocked_stalled_change.rb +5 -3
- data/lib/jirametrics/board.rb +28 -8
- data/lib/jirametrics/board_feature.rb +14 -0
- data/lib/jirametrics/board_movement_calculator.rb +2 -2
- data/lib/jirametrics/cfd_data_builder.rb +108 -0
- data/lib/jirametrics/change_item.rb +4 -3
- data/lib/jirametrics/chart_base.rb +107 -3
- data/lib/jirametrics/css_variable.rb +1 -1
- data/lib/jirametrics/cumulative_flow_diagram.rb +208 -0
- data/lib/jirametrics/{cycletime_config.rb → cycle_time_config.rb} +1 -2
- data/lib/jirametrics/cycletime_histogram.rb +15 -103
- data/lib/jirametrics/cycletime_scatterplot.rb +13 -98
- data/lib/jirametrics/daily_view.rb +38 -13
- data/lib/jirametrics/daily_wip_by_age_chart.rb +1 -1
- data/lib/jirametrics/daily_wip_by_blocked_stalled_chart.rb +1 -1
- data/lib/jirametrics/daily_wip_by_parent_chart.rb +4 -2
- data/lib/jirametrics/daily_wip_chart.rb +29 -7
- data/lib/jirametrics/data_quality_report.rb +38 -12
- data/lib/jirametrics/dependency_chart.rb +2 -2
- data/lib/jirametrics/download_config.rb +15 -0
- data/lib/jirametrics/downloader.rb +87 -5
- data/lib/jirametrics/downloader_for_cloud.rb +107 -22
- data/lib/jirametrics/downloader_for_data_center.rb +3 -2
- data/lib/jirametrics/estimate_accuracy_chart.rb +42 -4
- data/lib/jirametrics/examples/aggregated_project.rb +2 -2
- data/lib/jirametrics/examples/standard_project.rb +32 -19
- data/lib/jirametrics/expedited_chart.rb +3 -1
- data/lib/jirametrics/exporter.rb +15 -2
- data/lib/jirametrics/file_config.rb +9 -11
- data/lib/jirametrics/file_system.rb +35 -2
- data/lib/jirametrics/flow_efficiency_scatterplot.rb +5 -1
- data/lib/jirametrics/github_gateway.rb +115 -0
- data/lib/jirametrics/groupable_issue_chart.rb +4 -0
- data/lib/jirametrics/grouping_rules.rb +26 -4
- data/lib/jirametrics/html/aging_work_bar_chart.erb +3 -4
- data/lib/jirametrics/html/aging_work_table.erb +3 -0
- data/lib/jirametrics/html/cumulative_flow_diagram.erb +503 -0
- data/lib/jirametrics/html/daily_wip_chart.erb +38 -5
- data/lib/jirametrics/html/estimate_accuracy_chart.erb +2 -12
- data/lib/jirametrics/html/expedited_chart.erb +3 -13
- data/lib/jirametrics/html/flow_efficiency_scatterplot.erb +2 -8
- data/lib/jirametrics/html/index.css +228 -60
- data/lib/jirametrics/html/index.erb +6 -0
- data/lib/jirametrics/html/index.js +53 -3
- data/lib/jirametrics/html/legacy_colors.css +174 -0
- data/lib/jirametrics/html/sprint_burndown.erb +7 -13
- data/lib/jirametrics/html/throughput_chart.erb +40 -9
- data/lib/jirametrics/html/{cycletime_histogram.erb → time_based_histogram.erb} +59 -59
- data/lib/jirametrics/html/{cycletime_scatterplot.erb → time_based_scatterplot.erb} +11 -7
- data/lib/jirametrics/html/wip_by_column_chart.erb +250 -0
- data/lib/jirametrics/html_generator.rb +2 -1
- data/lib/jirametrics/html_report_config.rb +45 -33
- data/lib/jirametrics/issue.rb +197 -99
- data/lib/jirametrics/issue_printer.rb +97 -0
- data/lib/jirametrics/jira_gateway.rb +32 -10
- data/lib/jirametrics/mcp_server.rb +531 -0
- data/lib/jirametrics/project_config.rb +87 -8
- data/lib/jirametrics/pull_request.rb +30 -0
- data/lib/jirametrics/pull_request_cycle_time_histogram.rb +77 -0
- data/lib/jirametrics/pull_request_cycle_time_scatterplot.rb +88 -0
- data/lib/jirametrics/pull_request_review.rb +13 -0
- data/lib/jirametrics/raw_javascript.rb +4 -0
- data/lib/jirametrics/settings.json +3 -1
- data/lib/jirametrics/sprint_burndown.rb +4 -2
- data/lib/jirametrics/status.rb +1 -1
- data/lib/jirametrics/stitcher.rb +7 -1
- data/lib/jirametrics/throughput_by_completed_resolution_chart.rb +22 -0
- data/lib/jirametrics/throughput_chart.rb +73 -23
- data/lib/jirametrics/time_based_histogram.rb +139 -0
- data/lib/jirametrics/time_based_scatterplot.rb +107 -0
- data/lib/jirametrics/wip_by_column_chart.rb +236 -0
- data/lib/jirametrics.rb +58 -0
- metadata +52 -5
|
@@ -7,71 +7,78 @@
|
|
|
7
7
|
--cycletime-scatterplot-overall-trendline-color: gray;
|
|
8
8
|
|
|
9
9
|
--non-working-days-color: #F0F0F0;
|
|
10
|
-
--expedited-color:
|
|
11
|
-
--blocked-color: #
|
|
12
|
-
--stalled-color: orange
|
|
10
|
+
--expedited-color: #D55E00; /* Okabe-Ito vermilion */
|
|
11
|
+
--blocked-color: #D55E00; /* Okabe-Ito vermilion */
|
|
12
|
+
--stalled-color: #E69F00; /* Okabe-Ito orange */
|
|
13
13
|
--dead-color: black;
|
|
14
14
|
|
|
15
|
-
--type-story-color: #
|
|
16
|
-
--type-task-color: blue
|
|
17
|
-
--type-bug-color:
|
|
18
|
-
--type-spike-color: #
|
|
15
|
+
--type-story-color: #009E73; /* Okabe-Ito bluish green */
|
|
16
|
+
--type-task-color: #0072B2; /* Okabe-Ito blue */
|
|
17
|
+
--type-bug-color: #D55E00; /* Okabe-Ito vermilion */
|
|
18
|
+
--type-spike-color: #CC79A7; /* Okabe-Ito reddish purple */
|
|
19
19
|
|
|
20
20
|
--status-category-todo-color: gray;
|
|
21
|
-
--status-category-inprogress-color: #
|
|
22
|
-
--status-category-done-color: #
|
|
21
|
+
--status-category-inprogress-color: #0072B2; /* Okabe-Ito blue */
|
|
22
|
+
--status-category-done-color: #009E73; /* Okabe-Ito bluish green */
|
|
23
23
|
--status-category-unknown-color: black;
|
|
24
24
|
|
|
25
|
-
--aging-work-bar-chart-percentage-line-color:
|
|
25
|
+
--aging-work-bar-chart-percentage-line-color: #D55E00; /* Okabe-Ito vermilion */
|
|
26
26
|
--aging-work-bar-chart-separator-color: white;
|
|
27
27
|
|
|
28
28
|
--throughput_chart_total_line_color: gray;
|
|
29
|
-
|
|
29
|
+
|
|
30
30
|
--aging-work-in-progress-chart-shading-color: lightgray;
|
|
31
|
-
--aging-work-in-progress-chart-shading-50-color: #
|
|
32
|
-
--aging-work-in-progress-chart-shading-85-color: #
|
|
33
|
-
--aging-work-in-progress-chart-shading-98-color: #
|
|
34
|
-
--aging-work-in-progress-chart-shading-100-color: #
|
|
35
|
-
|
|
31
|
+
--aging-work-in-progress-chart-shading-50-color: #56B4E9; /* Okabe-Ito sky blue */
|
|
32
|
+
--aging-work-in-progress-chart-shading-85-color: #F0E442; /* Okabe-Ito yellow */
|
|
33
|
+
--aging-work-in-progress-chart-shading-98-color: #E69F00; /* Okabe-Ito orange */
|
|
34
|
+
--aging-work-in-progress-chart-shading-100-color: #D55E00; /* Okabe-Ito vermilion */
|
|
35
|
+
|
|
36
36
|
--aging-work-in-progress-by-age-trend-line-color: gray;
|
|
37
|
-
|
|
38
|
-
--aging-work-table-date-in-jeopardy: yellow
|
|
39
|
-
--aging-work-table-date-overdue:
|
|
37
|
+
|
|
38
|
+
--aging-work-table-date-in-jeopardy: #F0E442; /* Okabe-Ito yellow */
|
|
39
|
+
--aging-work-table-date-overdue: #D55E00; /* Okabe-Ito vermilion */
|
|
40
40
|
|
|
41
41
|
--hierarchy-table-inactive-item-text-color: gray;
|
|
42
42
|
|
|
43
|
-
--wip-chart-completed-color: #
|
|
44
|
-
--wip-chart-completed-but-not-started-color: #
|
|
45
|
-
--wip-chart-duration-less-than-day-color: #
|
|
46
|
-
--wip-chart-duration-week-or-less-color: #
|
|
47
|
-
--wip-chart-duration-two-weeks-or-less-color: #
|
|
48
|
-
--wip-chart-duration-four-weeks-or-less-color: #
|
|
49
|
-
--wip-chart-duration-more-than-four-weeks-color: #
|
|
50
|
-
--wip-chart-active-color: #
|
|
43
|
+
--wip-chart-completed-color: #009E73; /* Okabe-Ito bluish green */
|
|
44
|
+
--wip-chart-completed-but-not-started-color: #92D9C0; /* light bluish green */
|
|
45
|
+
--wip-chart-duration-less-than-day-color: #56B4E9; /* Okabe-Ito sky blue */
|
|
46
|
+
--wip-chart-duration-week-or-less-color: #F0E442; /* Okabe-Ito yellow */
|
|
47
|
+
--wip-chart-duration-two-weeks-or-less-color: #E69F00; /* Okabe-Ito orange */
|
|
48
|
+
--wip-chart-duration-four-weeks-or-less-color: #D55E00; /* Okabe-Ito vermilion */
|
|
49
|
+
--wip-chart-duration-more-than-four-weeks-color: #CC79A7; /* Okabe-Ito reddish purple */
|
|
50
|
+
--wip-chart-active-color: #0072B2; /* Okabe-Ito blue */
|
|
51
51
|
--wip-chart-border-color: gray;
|
|
52
52
|
|
|
53
|
-
--
|
|
54
|
-
--
|
|
55
|
-
--
|
|
56
|
-
--
|
|
53
|
+
--wip-by-column-chart-bar-fill-color: #0072B2; /* Okabe-Ito blue */
|
|
54
|
+
--wip-by-column-chart-bar-text-color: #ffffff;
|
|
55
|
+
--wip-by-column-chart-limit-line-color: #D55E00; /* Okabe-Ito vermilion */
|
|
56
|
+
--wip-by-column-chart-recommendation-color: #009E73; /* Okabe-Ito bluish green */
|
|
57
|
+
|
|
58
|
+
--estimate-accuracy-chart-completed-fill-color: #92D9C0; /* light bluish green */
|
|
59
|
+
--estimate-accuracy-chart-completed-border-color: #009E73; /* Okabe-Ito bluish green */
|
|
60
|
+
--estimate-accuracy-chart-active-fill-color: #F4C6AD; /* light vermilion */
|
|
61
|
+
--estimate-accuracy-chart-active-border-color: #D55E00; /* Okabe-Ito vermilion */
|
|
57
62
|
|
|
58
63
|
--expedited-chart-no-longer-expedited: gray;
|
|
59
|
-
--expedited-chart-dot-issue-started-color: orange
|
|
60
|
-
--expedited-chart-dot-issue-stopped-color: green
|
|
61
|
-
--expedited-chart-dot-expedite-started-color:
|
|
62
|
-
--expedited-chart-dot-expedite-stopped-color: green
|
|
64
|
+
--expedited-chart-dot-issue-started-color: #E69F00; /* Okabe-Ito orange */
|
|
65
|
+
--expedited-chart-dot-issue-stopped-color: #009E73; /* Okabe-Ito bluish green */
|
|
66
|
+
--expedited-chart-dot-expedite-started-color: #D55E00; /* Okabe-Ito vermilion */
|
|
67
|
+
--expedited-chart-dot-expedite-stopped-color: #009E73; /* Okabe-Ito bluish green */
|
|
63
68
|
|
|
64
|
-
--sprint-burndown-sprint-color-1: blue
|
|
65
|
-
--sprint-burndown-sprint-color-2: orange
|
|
66
|
-
--sprint-burndown-sprint-color-3: green
|
|
67
|
-
--sprint-burndown-sprint-color-4:
|
|
68
|
-
--sprint-burndown-sprint-color-5:
|
|
69
|
+
--sprint-burndown-sprint-color-1: #0072B2; /* Okabe-Ito blue */
|
|
70
|
+
--sprint-burndown-sprint-color-2: #E69F00; /* Okabe-Ito orange */
|
|
71
|
+
--sprint-burndown-sprint-color-3: #009E73; /* Okabe-Ito bluish green */
|
|
72
|
+
--sprint-burndown-sprint-color-4: #D55E00; /* Okabe-Ito vermilion */
|
|
73
|
+
--sprint-burndown-sprint-color-5: #CC79A7; /* Okabe-Ito reddish purple */
|
|
74
|
+
--sprint-burndown-sprint-color-6: #56B4E9; /* Okabe-Ito sky blue */
|
|
75
|
+
--sprint-burndown-sprint-color-7: #F0E442; /* Okabe-Ito yellow */
|
|
69
76
|
|
|
70
|
-
--sprint-color:
|
|
77
|
+
--sprint-color: #56B4E9; /* Okabe-Ito sky blue */
|
|
71
78
|
|
|
72
79
|
--daily-view-selected-issue-background: lightgray;
|
|
73
|
-
--daily-view-issue-border: green
|
|
74
|
-
--daily-view-selected-issue-border:
|
|
80
|
+
--daily-view-issue-border: #009E73; /* Okabe-Ito bluish green */
|
|
81
|
+
--daily-view-selected-issue-border: #D55E00; /* Okabe-Ito vermilion */
|
|
75
82
|
|
|
76
83
|
/* The first five are the standard priorities that Jira creates by default. */
|
|
77
84
|
--priority-color-highest: #dc2626; /* red-600 - urgent red */
|
|
@@ -87,6 +94,9 @@
|
|
|
87
94
|
body {
|
|
88
95
|
background-color: var(--body-background);
|
|
89
96
|
color: var(--default-text-color);
|
|
97
|
+
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
|
|
98
|
+
font-size: 14px;
|
|
99
|
+
line-height: 1.5;
|
|
90
100
|
}
|
|
91
101
|
|
|
92
102
|
dl, dd, dt {
|
|
@@ -214,46 +224,204 @@ div.child_issue {
|
|
|
214
224
|
padding: 0.5em;
|
|
215
225
|
}
|
|
216
226
|
|
|
227
|
+
/* Dark CSS variables — shared by the media query and the forced dark theme */
|
|
228
|
+
html[data-theme="dark"] {
|
|
229
|
+
--warning-banner: #9F2B00;
|
|
230
|
+
--non-working-days-color: #2f2f2f;
|
|
231
|
+
--type-story-color: #2DCB9A; /* lighter bluish green for dark bg */
|
|
232
|
+
--type-task-color: #56B4E9; /* sky blue for dark bg */
|
|
233
|
+
--type-bug-color: #E69F00; /* orange instead of vermilion for dark bg */
|
|
234
|
+
--body-background: #343434;
|
|
235
|
+
--default-text-color: #aaa;
|
|
236
|
+
--grid-line-color: #424242;
|
|
237
|
+
--expedited-color: #E69F00; /* Okabe-Ito orange for dark bg */
|
|
238
|
+
--blocked-color: #E69F00; /* Okabe-Ito orange for dark bg */
|
|
239
|
+
--stalled-color: #F0E442; /* Okabe-Ito yellow — distinct from blocked */
|
|
240
|
+
--wip-chart-active-color: #56B4E9; /* sky blue for dark bg */
|
|
241
|
+
--status-category-inprogress-color: #56B4E9; /* sky blue for dark bg */
|
|
242
|
+
--status-category-done-color: #2DCB9A; /* lighter bluish green for dark bg */
|
|
243
|
+
--hierarchy-table-inactive-item-text-color: #939393;
|
|
244
|
+
--wip-by-column-chart-bar-fill-color: #56B4E9; /* Okabe-Ito sky blue */
|
|
245
|
+
--wip-by-column-chart-bar-text-color: #000000;
|
|
246
|
+
--wip-by-column-chart-limit-line-color: #E69F00; /* Okabe-Ito orange */
|
|
247
|
+
--wip-by-column-chart-recommendation-color: #2DCB9A; /* lighter bluish green for dark bg */
|
|
248
|
+
--wip-chart-completed-color: #2DCB9A; /* lighter bluish green */
|
|
249
|
+
--wip-chart-duration-more-than-four-weeks-color: #DE9AC4; /* lighter reddish purple */
|
|
250
|
+
--estimate-accuracy-chart-completed-border-color: #2DCB9A;
|
|
251
|
+
--estimate-accuracy-chart-active-border-color: #E69F00;
|
|
252
|
+
--expedited-chart-dot-issue-stopped-color: #2DCB9A;
|
|
253
|
+
--expedited-chart-dot-expedite-started-color: #E69F00;
|
|
254
|
+
--expedited-chart-dot-expedite-stopped-color: #2DCB9A;
|
|
255
|
+
--sprint-burndown-sprint-color-1: #56B4E9; /* sky blue */
|
|
256
|
+
--sprint-burndown-sprint-color-3: #2DCB9A; /* lighter bluish green */
|
|
257
|
+
--sprint-burndown-sprint-color-4: #CC79A7; /* reddish purple (vermilion → orange conflicts with color-2) */
|
|
258
|
+
--sprint-burndown-sprint-color-5: #F0E442; /* yellow */
|
|
259
|
+
--sprint-burndown-sprint-color-6: #D55E00; /* vermilion (sky blue conflicts with color-1) */
|
|
260
|
+
--sprint-burndown-sprint-color-7: #92D9C0; /* light teal (yellow conflicts with color-5) */
|
|
261
|
+
--daily-view-selected-issue-background: #474747;
|
|
262
|
+
--daily-view-issue-border: #2DCB9A;
|
|
263
|
+
--daily-view-selected-issue-border: #E69F00;
|
|
264
|
+
--priority-color-highest: #ef4444;
|
|
265
|
+
--priority-color-high: #f97316;
|
|
266
|
+
--priority-color-low: #06b6d4;
|
|
267
|
+
--priority-color-lowest: #94a3b8;
|
|
268
|
+
|
|
269
|
+
a[href] { color: #1e8ad6; }
|
|
270
|
+
a[href]:hover { color: #3ba0e6; }
|
|
271
|
+
.chart { background: var(--body-background); }
|
|
272
|
+
table.standard {
|
|
273
|
+
th { background: var(--body-background); }
|
|
274
|
+
tr:nth-child(odd) { background-color: #656565; }
|
|
275
|
+
}
|
|
276
|
+
div.color_block { border: 1px solid lightgray; }
|
|
277
|
+
div.daily_issue {
|
|
278
|
+
.field { color: var(--default-text-color); }
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
/* Force light mode — overrides the dark media query when user explicitly picks light */
|
|
283
|
+
html[data-theme="light"] {
|
|
284
|
+
--warning-banner: yellow;
|
|
285
|
+
--non-working-days-color: #F0F0F0;
|
|
286
|
+
--type-story-color: #009E73; /* Okabe-Ito bluish green */
|
|
287
|
+
--type-task-color: #0072B2; /* Okabe-Ito blue */
|
|
288
|
+
--type-bug-color: #D55E00; /* Okabe-Ito vermilion */
|
|
289
|
+
--body-background: white;
|
|
290
|
+
--default-text-color: black;
|
|
291
|
+
--grid-line-color: lightgray;
|
|
292
|
+
--expedited-color: #D55E00; /* Okabe-Ito vermilion */
|
|
293
|
+
--blocked-color: #D55E00; /* Okabe-Ito vermilion */
|
|
294
|
+
--stalled-color: #E69F00; /* Okabe-Ito orange */
|
|
295
|
+
--wip-chart-active-color: #0072B2; /* Okabe-Ito blue */
|
|
296
|
+
--status-category-inprogress-color: #0072B2; /* Okabe-Ito blue */
|
|
297
|
+
--status-category-done-color: #009E73; /* Okabe-Ito bluish green */
|
|
298
|
+
--hierarchy-table-inactive-item-text-color: gray;
|
|
299
|
+
--wip-by-column-chart-bar-fill-color: #0072B2;
|
|
300
|
+
--wip-by-column-chart-bar-text-color: #ffffff;
|
|
301
|
+
--wip-by-column-chart-limit-line-color: #D55E00;
|
|
302
|
+
--wip-by-column-chart-recommendation-color: #009E73;
|
|
303
|
+
--wip-chart-completed-color: #009E73; /* Okabe-Ito bluish green */
|
|
304
|
+
--wip-chart-completed-but-not-started-color: #92D9C0;
|
|
305
|
+
--wip-chart-duration-less-than-day-color: #56B4E9;
|
|
306
|
+
--wip-chart-duration-week-or-less-color: #F0E442;
|
|
307
|
+
--wip-chart-duration-two-weeks-or-less-color: #E69F00;
|
|
308
|
+
--wip-chart-duration-four-weeks-or-less-color: #D55E00;
|
|
309
|
+
--wip-chart-duration-more-than-four-weeks-color: #CC79A7;
|
|
310
|
+
--daily-view-selected-issue-background: lightgray;
|
|
311
|
+
--daily-view-issue-border: #009E73;
|
|
312
|
+
--daily-view-selected-issue-border: #D55E00;
|
|
313
|
+
--priority-color-highest: #dc2626;
|
|
314
|
+
--priority-color-high: #ea580c;
|
|
315
|
+
--priority-color-low: #0891b2;
|
|
316
|
+
--priority-color-lowest: #64748b;
|
|
317
|
+
|
|
318
|
+
a[href] { color: revert; }
|
|
319
|
+
a[href]:hover { color: revert; }
|
|
320
|
+
.chart { background: white; }
|
|
321
|
+
table.standard {
|
|
322
|
+
th { background: white; }
|
|
323
|
+
tr:nth-child(odd) { background-color: #eee; }
|
|
324
|
+
}
|
|
325
|
+
div.color_block { border: 1px solid black; }
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
/* Theme toggle widget */
|
|
329
|
+
#theme-toggle {
|
|
330
|
+
position: fixed;
|
|
331
|
+
top: 0.5rem;
|
|
332
|
+
right: 0.5rem;
|
|
333
|
+
display: flex;
|
|
334
|
+
gap: 2px;
|
|
335
|
+
background: var(--body-background);
|
|
336
|
+
border: 1px solid var(--grid-line-color);
|
|
337
|
+
border-radius: 6px;
|
|
338
|
+
padding: 3px;
|
|
339
|
+
z-index: 1000;
|
|
340
|
+
|
|
341
|
+
button {
|
|
342
|
+
background: none;
|
|
343
|
+
border: none;
|
|
344
|
+
cursor: pointer;
|
|
345
|
+
padding: 2px 6px;
|
|
346
|
+
border-radius: 4px;
|
|
347
|
+
font-size: 1rem;
|
|
348
|
+
color: var(--default-text-color);
|
|
349
|
+
opacity: 0.5;
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
button:hover {
|
|
353
|
+
opacity: 1;
|
|
354
|
+
background: var(--grid-line-color);
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
button.active {
|
|
358
|
+
opacity: 1;
|
|
359
|
+
background: var(--grid-line-color);
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
|
|
217
363
|
@media screen and (prefers-color-scheme: dark) {
|
|
218
364
|
:root {
|
|
219
365
|
--warning-banner: #9F2B00;
|
|
220
366
|
|
|
221
367
|
--non-working-days-color: #2f2f2f;
|
|
222
|
-
--type-story-color: #
|
|
223
|
-
--type-task-color: #
|
|
224
|
-
--type-bug-color: #
|
|
368
|
+
--type-story-color: #2DCB9A; /* lighter bluish green for dark bg */
|
|
369
|
+
--type-task-color: #56B4E9; /* sky blue for dark bg */
|
|
370
|
+
--type-bug-color: #E69F00; /* orange instead of vermilion for dark bg */
|
|
225
371
|
|
|
226
372
|
--body-background: #343434;
|
|
227
373
|
--default-text-color: #aaa;
|
|
228
374
|
--grid-line-color: #424242;
|
|
229
375
|
|
|
230
|
-
--expedited-color: #
|
|
231
|
-
--blocked-color: #
|
|
232
|
-
--stalled-color: #
|
|
376
|
+
--expedited-color: #E69F00; /* Okabe-Ito orange for dark bg */
|
|
377
|
+
--blocked-color: #E69F00; /* Okabe-Ito orange for dark bg */
|
|
378
|
+
--stalled-color: #F0E442; /* Okabe-Ito yellow — distinct from blocked */
|
|
233
379
|
--dead-color: black;
|
|
234
|
-
--wip-chart-active-color: #
|
|
380
|
+
--wip-chart-active-color: #56B4E9; /* sky blue for dark bg */
|
|
381
|
+
|
|
382
|
+
--status-category-inprogress-color: #56B4E9; /* sky blue for dark bg */
|
|
383
|
+
--status-category-done-color: #2DCB9A; /* lighter bluish green for dark bg */
|
|
235
384
|
|
|
236
|
-
--
|
|
385
|
+
--wip-by-column-chart-bar-fill-color: #56B4E9;
|
|
386
|
+
--wip-by-column-chart-bar-text-color: #000000;
|
|
387
|
+
--wip-by-column-chart-limit-line-color: #E69F00;
|
|
388
|
+
--wip-by-column-chart-recommendation-color: #2DCB9A;
|
|
237
389
|
|
|
238
390
|
--cycletime-scatterplot-overall-trendline-color: gray;
|
|
239
391
|
|
|
240
392
|
--hierarchy-table-inactive-item-text-color: #939393;
|
|
241
393
|
|
|
242
|
-
--wip-chart-completed-color: #
|
|
243
|
-
--wip-chart-completed-but-not-started-color: #
|
|
244
|
-
--wip-chart-duration-less-than-day-color: #
|
|
245
|
-
--wip-chart-duration-week-or-less-color: #
|
|
246
|
-
--wip-chart-duration-two-weeks-or-less-color: #
|
|
247
|
-
--wip-chart-duration-four-weeks-or-less-color: #
|
|
248
|
-
--wip-chart-duration-more-than-four-weeks-color: #
|
|
394
|
+
--wip-chart-completed-color: #2DCB9A; /* lighter bluish green */
|
|
395
|
+
--wip-chart-completed-but-not-started-color: #92D9C0;
|
|
396
|
+
--wip-chart-duration-less-than-day-color: #56B4E9;
|
|
397
|
+
--wip-chart-duration-week-or-less-color: #F0E442;
|
|
398
|
+
--wip-chart-duration-two-weeks-or-less-color: #E69F00;
|
|
399
|
+
--wip-chart-duration-four-weeks-or-less-color: #D55E00;
|
|
400
|
+
--wip-chart-duration-more-than-four-weeks-color: #DE9AC4; /* lighter reddish purple */
|
|
401
|
+
|
|
402
|
+
--estimate-accuracy-chart-completed-border-color: #2DCB9A;
|
|
403
|
+
--estimate-accuracy-chart-active-border-color: #E69F00;
|
|
404
|
+
|
|
405
|
+
--expedited-chart-dot-issue-stopped-color: #2DCB9A;
|
|
406
|
+
--expedited-chart-dot-expedite-started-color: #E69F00;
|
|
407
|
+
--expedited-chart-dot-expedite-stopped-color: #2DCB9A;
|
|
408
|
+
|
|
409
|
+
--sprint-burndown-sprint-color-1: #56B4E9; /* sky blue */
|
|
410
|
+
--sprint-burndown-sprint-color-3: #2DCB9A; /* lighter bluish green */
|
|
411
|
+
--sprint-burndown-sprint-color-4: #CC79A7; /* reddish purple (vermilion → orange conflicts with color-2) */
|
|
412
|
+
--sprint-burndown-sprint-color-5: #F0E442; /* yellow */
|
|
413
|
+
--sprint-burndown-sprint-color-6: #D55E00; /* vermilion (sky blue conflicts with color-1) */
|
|
414
|
+
--sprint-burndown-sprint-color-7: #92D9C0; /* light teal (yellow conflicts with color-5) */
|
|
249
415
|
|
|
250
416
|
--daily-view-selected-issue-background: #474747;
|
|
417
|
+
--daily-view-issue-border: #2DCB9A;
|
|
418
|
+
--daily-view-selected-issue-border: #E69F00;
|
|
251
419
|
|
|
252
420
|
--priority-color-highest: #ef4444; /* red-500 - bright urgent red */
|
|
253
421
|
--priority-color-high: #f97316; /* orange-500 - bright orange */
|
|
254
422
|
--priority-color-medium: #9ca3af; /* gray-400 - neutral light gray */
|
|
255
423
|
--priority-color-low: #06b6d4; /* cyan-500 - bright calm blue */
|
|
256
|
-
--priority-color-lowest: #94a3b8; /* slate-400 - muted light slate */
|
|
424
|
+
--priority-color-lowest: #94a3b8; /* slate-400 - muted light slate */
|
|
257
425
|
}
|
|
258
426
|
|
|
259
427
|
a[href] {
|
|
@@ -289,4 +457,4 @@ div.child_issue {
|
|
|
289
457
|
}
|
|
290
458
|
}
|
|
291
459
|
|
|
292
|
-
}
|
|
460
|
+
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
<html>
|
|
2
2
|
<head>
|
|
3
3
|
<meta charset="UTF-8">
|
|
4
|
+
<title><%= project_name.empty? ? 'JiraMetrics' : "JiraMetrics - #{project_name}" %></title>
|
|
4
5
|
<link rel="icon" type="image/png" href="https://github.com/mikebowler/jirametrics/blob/main/favicon.png?raw=true" />
|
|
5
6
|
<script src="https://cdn.jsdelivr.net/npm/moment@2.29.1/moment.js"></script>
|
|
6
7
|
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
|
|
@@ -17,6 +18,11 @@
|
|
|
17
18
|
</script>
|
|
18
19
|
</head>
|
|
19
20
|
<body>
|
|
21
|
+
<div id="theme-toggle">
|
|
22
|
+
<button id="theme-btn-system" title="Use system preference">⊙</button>
|
|
23
|
+
<button id="theme-btn-light" title="Light mode">☀</button>
|
|
24
|
+
<button id="theme-btn-dark" title="Dark mode">☾</button>
|
|
25
|
+
</div>
|
|
20
26
|
<noscript>
|
|
21
27
|
<div style="padding: 1em; background: red; color: white; font-size: 2em;">
|
|
22
28
|
Javascript is currently disabled and that means that almost all of the charts in this report won't render. If you've loaded this from a folder on SharePoint then save it locally and load it again.
|
|
@@ -1,3 +1,12 @@
|
|
|
1
|
+
// Apply saved theme immediately (before Chart.js reads CSS variables) so charts
|
|
2
|
+
// initialize with the correct colour scheme.
|
|
3
|
+
(function () {
|
|
4
|
+
const saved = localStorage.getItem('jirametrics:theme');
|
|
5
|
+
if (saved) {
|
|
6
|
+
document.documentElement.setAttribute('data-theme', saved);
|
|
7
|
+
}
|
|
8
|
+
}());
|
|
9
|
+
|
|
1
10
|
function makeFoldable() {
|
|
2
11
|
// Get all elements with the "foldable" class
|
|
3
12
|
const foldableElements = document.querySelectorAll('.foldable');
|
|
@@ -26,7 +35,7 @@ function makeFoldable() {
|
|
|
26
35
|
const toggleButton = document.createElement(element.tagName); //'button');
|
|
27
36
|
toggleButton.id = toggleId;
|
|
28
37
|
toggleButton.className = 'foldable-toggle-btn';
|
|
29
|
-
toggleButton.innerHTML = '▼ ' + element.
|
|
38
|
+
toggleButton.innerHTML = '▼ ' + element.innerHTML;
|
|
30
39
|
|
|
31
40
|
// Create a content container
|
|
32
41
|
const contentContainer = document.createElement('div');
|
|
@@ -77,16 +86,57 @@ function makeFoldable() {
|
|
|
77
86
|
});
|
|
78
87
|
}
|
|
79
88
|
|
|
89
|
+
function initThemeToggle() {
|
|
90
|
+
const html = document.documentElement;
|
|
91
|
+
const saved = localStorage.getItem('jirametrics:theme');
|
|
92
|
+
if (saved) {
|
|
93
|
+
html.setAttribute('data-theme', saved);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
function updateActiveButton(theme) {
|
|
97
|
+
['system', 'light', 'dark'].forEach(t => {
|
|
98
|
+
const btn = document.getElementById(`theme-btn-${t}`);
|
|
99
|
+
if (btn) {
|
|
100
|
+
btn.classList.toggle('active', t === theme);
|
|
101
|
+
}
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
function setTheme(theme) {
|
|
106
|
+
if (theme === 'system') {
|
|
107
|
+
html.removeAttribute('data-theme');
|
|
108
|
+
localStorage.removeItem('jirametrics:theme');
|
|
109
|
+
} else {
|
|
110
|
+
html.setAttribute('data-theme', theme);
|
|
111
|
+
localStorage.setItem('jirametrics:theme', theme);
|
|
112
|
+
}
|
|
113
|
+
updateActiveButton(theme);
|
|
114
|
+
location.reload();
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
updateActiveButton(saved || 'system');
|
|
118
|
+
|
|
119
|
+
['system', 'light', 'dark'].forEach(theme => {
|
|
120
|
+
const btn = document.getElementById(`theme-btn-${theme}`);
|
|
121
|
+
if (btn) {
|
|
122
|
+
btn.addEventListener('click', () => setTheme(theme));
|
|
123
|
+
}
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
|
|
80
127
|
// Auto-initialize when DOM is loaded
|
|
81
128
|
document.addEventListener('DOMContentLoaded', function() {
|
|
82
129
|
makeFoldable();
|
|
130
|
+
initThemeToggle();
|
|
83
131
|
});
|
|
84
132
|
|
|
85
133
|
|
|
86
134
|
// If we switch between light/dark mode then force a refresh so all charts will redraw correctly
|
|
87
|
-
// in the other colour scheme.
|
|
135
|
+
// in the other colour scheme. Skip reload if a manual theme override is set.
|
|
88
136
|
window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', event => {
|
|
89
|
-
|
|
137
|
+
if (!document.documentElement.hasAttribute('data-theme')) {
|
|
138
|
+
location.reload();
|
|
139
|
+
}
|
|
90
140
|
})
|
|
91
141
|
|
|
92
142
|
// Draw a diagonal pattern to highlight sections of a bar chart. Based on code found at:
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
/* Legacy color scheme for jirametrics
|
|
2
|
+
*
|
|
3
|
+
* The default colors were updated to improve accessibility for people with
|
|
4
|
+
* color vision deficiencies. If you prefer the original colors, add this to
|
|
5
|
+
* your project config:
|
|
6
|
+
*
|
|
7
|
+
* setting['include_css'] = './legacy_colors.css'
|
|
8
|
+
*
|
|
9
|
+
* and copy this file to the same directory as your config file.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
/* Light mode */
|
|
13
|
+
:root,
|
|
14
|
+
html[data-theme="light"] {
|
|
15
|
+
--body-background: white;
|
|
16
|
+
--default-text-color: black;
|
|
17
|
+
--grid-line-color: lightgray;
|
|
18
|
+
--warning-banner: yellow;
|
|
19
|
+
|
|
20
|
+
--cycletime-scatterplot-overall-trendline-color: gray;
|
|
21
|
+
|
|
22
|
+
--non-working-days-color: #F0F0F0;
|
|
23
|
+
--expedited-color: red;
|
|
24
|
+
--blocked-color: #FF7400;
|
|
25
|
+
--stalled-color: orange;
|
|
26
|
+
--dead-color: black;
|
|
27
|
+
|
|
28
|
+
--type-story-color: #4bc14b;
|
|
29
|
+
--type-task-color: blue;
|
|
30
|
+
--type-bug-color: orange;
|
|
31
|
+
--type-spike-color: #9400D3;
|
|
32
|
+
|
|
33
|
+
--status-category-todo-color: gray;
|
|
34
|
+
--status-category-inprogress-color: #2663ff;
|
|
35
|
+
--status-category-done-color: #00ff00;
|
|
36
|
+
--status-category-unknown-color: black;
|
|
37
|
+
|
|
38
|
+
--aging-work-bar-chart-percentage-line-color: red;
|
|
39
|
+
--aging-work-bar-chart-separator-color: white;
|
|
40
|
+
|
|
41
|
+
--throughput_chart_total_line_color: gray;
|
|
42
|
+
|
|
43
|
+
--aging-work-in-progress-chart-shading-color: lightgray;
|
|
44
|
+
--aging-work-in-progress-chart-shading-50-color: #2E8BC0;
|
|
45
|
+
--aging-work-in-progress-chart-shading-85-color: #ADD8E6;
|
|
46
|
+
--aging-work-in-progress-chart-shading-98-color: #FF8A8A;
|
|
47
|
+
--aging-work-in-progress-chart-shading-100-color: #FF2E2E;
|
|
48
|
+
|
|
49
|
+
--aging-work-in-progress-by-age-trend-line-color: gray;
|
|
50
|
+
|
|
51
|
+
--aging-work-table-date-in-jeopardy: yellow;
|
|
52
|
+
--aging-work-table-date-overdue: red;
|
|
53
|
+
|
|
54
|
+
--hierarchy-table-inactive-item-text-color: gray;
|
|
55
|
+
|
|
56
|
+
--wip-chart-completed-color: #00ff00;
|
|
57
|
+
--wip-chart-completed-but-not-started-color: #99FF99;
|
|
58
|
+
--wip-chart-duration-less-than-day-color: #ffef41;
|
|
59
|
+
--wip-chart-duration-week-or-less-color: #dcc900;
|
|
60
|
+
--wip-chart-duration-two-weeks-or-less-color: #dfa000;
|
|
61
|
+
--wip-chart-duration-four-weeks-or-less-color: #eb7200;
|
|
62
|
+
--wip-chart-duration-more-than-four-weeks-color: #e70000;
|
|
63
|
+
--wip-chart-active-color: #326cff;
|
|
64
|
+
--wip-chart-border-color: gray;
|
|
65
|
+
|
|
66
|
+
--wip-by-column-chart-bar-fill-color: #0072B2;
|
|
67
|
+
--wip-by-column-chart-bar-text-color: #ffffff;
|
|
68
|
+
--wip-by-column-chart-limit-line-color: #D55E00;
|
|
69
|
+
--wip-by-column-chart-recommendation-color: #009E73;
|
|
70
|
+
|
|
71
|
+
--estimate-accuracy-chart-completed-fill-color: #00ff00;
|
|
72
|
+
--estimate-accuracy-chart-completed-border-color: green;
|
|
73
|
+
--estimate-accuracy-chart-active-fill-color: #FFCCCB;
|
|
74
|
+
--estimate-accuracy-chart-active-border-color: red;
|
|
75
|
+
|
|
76
|
+
--expedited-chart-no-longer-expedited: gray;
|
|
77
|
+
--expedited-chart-dot-issue-started-color: orange;
|
|
78
|
+
--expedited-chart-dot-issue-stopped-color: green;
|
|
79
|
+
--expedited-chart-dot-expedite-started-color: red;
|
|
80
|
+
--expedited-chart-dot-expedite-stopped-color: green;
|
|
81
|
+
|
|
82
|
+
--sprint-burndown-sprint-color-1: blue;
|
|
83
|
+
--sprint-burndown-sprint-color-2: orange;
|
|
84
|
+
--sprint-burndown-sprint-color-3: green;
|
|
85
|
+
--sprint-burndown-sprint-color-4: red;
|
|
86
|
+
--sprint-burndown-sprint-color-5: brown;
|
|
87
|
+
--sprint-burndown-sprint-color-6: blue; /* wraps back to color-1 (legacy had only 5) */
|
|
88
|
+
--sprint-burndown-sprint-color-7: orange; /* wraps back to color-2 (legacy had only 5) */
|
|
89
|
+
|
|
90
|
+
--sprint-color: lightblue;
|
|
91
|
+
|
|
92
|
+
--daily-view-selected-issue-background: lightgray;
|
|
93
|
+
--daily-view-issue-border: green;
|
|
94
|
+
--daily-view-selected-issue-border: red;
|
|
95
|
+
|
|
96
|
+
--priority-color-highest: #dc2626;
|
|
97
|
+
--priority-color-high: #ea580c;
|
|
98
|
+
--priority-color-medium: #9ca3af;
|
|
99
|
+
--priority-color-low: #0891b2;
|
|
100
|
+
--priority-color-lowest: #64748b;
|
|
101
|
+
--priority-color-notset: gray;
|
|
102
|
+
--priority-color-critical: red;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/* Dark mode */
|
|
106
|
+
html[data-theme="dark"] {
|
|
107
|
+
--warning-banner: #9F2B00;
|
|
108
|
+
--non-working-days-color: #2f2f2f;
|
|
109
|
+
--type-story-color: #6fb86f;
|
|
110
|
+
--type-task-color: #0021b3;
|
|
111
|
+
--type-bug-color: #bb5603;
|
|
112
|
+
--body-background: #343434;
|
|
113
|
+
--default-text-color: #aaa;
|
|
114
|
+
--grid-line-color: #424242;
|
|
115
|
+
--expedited-color: #b90000;
|
|
116
|
+
--blocked-color: #c75b02;
|
|
117
|
+
--stalled-color: #ae7202;
|
|
118
|
+
--wip-chart-active-color: #2551c1;
|
|
119
|
+
--status-category-inprogress-color: #1c49bb;
|
|
120
|
+
--hierarchy-table-inactive-item-text-color: #939393;
|
|
121
|
+
--wip-by-column-chart-bar-fill-color: #56B4E9;
|
|
122
|
+
--wip-by-column-chart-bar-text-color: #000000;
|
|
123
|
+
--wip-by-column-chart-limit-line-color: #E69F00;
|
|
124
|
+
--wip-by-column-chart-recommendation-color: #2DCB9A;
|
|
125
|
+
--wip-chart-completed-color: #03cb03;
|
|
126
|
+
--wip-chart-duration-less-than-day-color: #d2d988;
|
|
127
|
+
--wip-chart-duration-week-or-less-color: #dfcd00;
|
|
128
|
+
--wip-chart-duration-two-weeks-or-less-color: #cf9400;
|
|
129
|
+
--wip-chart-duration-four-weeks-or-less-color: #c25e00;
|
|
130
|
+
--wip-chart-duration-more-than-four-weeks-color: #8e0000;
|
|
131
|
+
--daily-view-selected-issue-background: #474747;
|
|
132
|
+
--priority-color-highest: #ef4444;
|
|
133
|
+
--priority-color-high: #f97316;
|
|
134
|
+
--priority-color-low: #06b6d4;
|
|
135
|
+
--priority-color-lowest: #94a3b8;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
@media screen and (prefers-color-scheme: dark) {
|
|
139
|
+
:root {
|
|
140
|
+
--warning-banner: #9F2B00;
|
|
141
|
+
--non-working-days-color: #2f2f2f;
|
|
142
|
+
--type-story-color: #6fb86f;
|
|
143
|
+
--type-task-color: #0021b3;
|
|
144
|
+
--type-bug-color: #bb5603;
|
|
145
|
+
--body-background: #343434;
|
|
146
|
+
--default-text-color: #aaa;
|
|
147
|
+
--grid-line-color: #424242;
|
|
148
|
+
--expedited-color: #b90000;
|
|
149
|
+
--blocked-color: #c75b02;
|
|
150
|
+
--stalled-color: #ae7202;
|
|
151
|
+
--dead-color: black;
|
|
152
|
+
--wip-chart-active-color: #2551c1;
|
|
153
|
+
--status-category-inprogress-color: #1c49bb;
|
|
154
|
+
--cycletime-scatterplot-overall-trendline-color: gray;
|
|
155
|
+
--hierarchy-table-inactive-item-text-color: #939393;
|
|
156
|
+
--wip-by-column-chart-bar-fill-color: #56B4E9;
|
|
157
|
+
--wip-by-column-chart-bar-text-color: #000000;
|
|
158
|
+
--wip-by-column-chart-limit-line-color: #E69F00;
|
|
159
|
+
--wip-by-column-chart-recommendation-color: #2DCB9A;
|
|
160
|
+
--wip-chart-completed-color: #03cb03;
|
|
161
|
+
--wip-chart-completed-but-not-started-color: #99FF99;
|
|
162
|
+
--wip-chart-duration-less-than-day-color: #d2d988;
|
|
163
|
+
--wip-chart-duration-week-or-less-color: #dfcd00;
|
|
164
|
+
--wip-chart-duration-two-weeks-or-less-color: #cf9400;
|
|
165
|
+
--wip-chart-duration-four-weeks-or-less-color: #c25e00;
|
|
166
|
+
--wip-chart-duration-more-than-four-weeks-color: #8e0000;
|
|
167
|
+
--daily-view-selected-issue-background: #474747;
|
|
168
|
+
--priority-color-highest: #ef4444;
|
|
169
|
+
--priority-color-high: #f97316;
|
|
170
|
+
--priority-color-medium: #9ca3af;
|
|
171
|
+
--priority-color-low: #06b6d4;
|
|
172
|
+
--priority-color-lowest: #94a3b8;
|
|
173
|
+
}
|
|
174
|
+
}
|