Compare commits

...
3 Commits
Author SHA1 Message Date
ajandClaude Fable 5 d12839d6ba fix(web): show empty-state message when analytics charts have no data
Charts previously rendered as blank boxes when no context events
existed in the selected range, which looked broken.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-17 21:12:43 -04:00
ajandClaude Fable 5 9b2625de10 chore(api): pin Microsoft.OpenApi 2.11.0 to fix GHSA-v5pm-xwqc-g5wc
Swashbuckle 10.1.4 pulls in Microsoft.OpenApi 2.4.1, which has a known
high-severity vulnerability. Pin the latest patched 2.x directly; 3.x
is binary-incompatible with Swashbuckle (swagger.json returns 500).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-17 21:12:43 -04:00
ajandClaude Fable 5 2c91e0360a fix(web): add SVG favicon to stop 404 on every page load
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-17 21:12:43 -04:00
4 changed files with 27 additions and 2 deletions
+15 -2
View File
@@ -126,8 +126,19 @@
@section Scripts { @section Scripts {
<script> <script>
function showChartEmptyState(canvasId, message) {
var canvas = document.getElementById(canvasId);
var container = canvas.closest('.chart-container');
container.innerHTML = '<div class="search-empty">' + message + '</div>';
container.style.display = 'flex';
container.style.alignItems = 'center';
container.style.justifyContent = 'center';
}
// Timeline bar chart // Timeline bar chart
if (timelineData.length > 0) { if (timelineData.length === 0) {
showChartEmptyState('timeline-chart', 'No activity recorded in this time range.');
} else {
new Chart(document.getElementById('timeline-chart'), { new Chart(document.getElementById('timeline-chart'), {
type: 'bar', type: 'bar',
data: { data: {
@@ -169,7 +180,9 @@
} }
// Category donut chart // Category donut chart
if (categoryData.length > 0) { if (categoryData.length === 0) {
showChartEmptyState('category-chart', 'No categorized activity in this time range.');
} else {
new Chart(document.getElementById('category-chart'), { new Chart(document.getElementById('category-chart'), {
type: 'doughnut', type: 'doughnut',
data: { data: {
@@ -4,6 +4,7 @@
<meta charset="utf-8" /> <meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>TaskTracker</title> <title>TaskTracker</title>
<link rel="icon" type="image/svg+xml" href="~/favicon.svg" />
<link rel="stylesheet" href="~/css/site.css" /> <link rel="stylesheet" href="~/css/site.css" />
</head> </head>
<body class="app"> <body class="app">
+1
View File
@@ -10,6 +10,7 @@
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets> <PrivateAssets>all</PrivateAssets>
</PackageReference> </PackageReference>
<PackageReference Include="Microsoft.OpenApi" Version="2.11.0" />
<PackageReference Include="Swashbuckle.AspNetCore" Version="10.1.4" /> <PackageReference Include="Swashbuckle.AspNetCore" Version="10.1.4" />
</ItemGroup> </ItemGroup>
+10
View File
@@ -0,0 +1,10 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32">
<defs>
<linearGradient id="g" x1="0" y1="0" x2="1" y2="1">
<stop offset="0" stop-color="#8b5cf6"/>
<stop offset="1" stop-color="#6366f1"/>
</linearGradient>
</defs>
<rect width="32" height="32" rx="7" fill="url(#g)"/>
<text x="16" y="23" text-anchor="middle" font-family="Segoe UI, Arial, sans-serif" font-size="19" font-weight="700" fill="#fff">T</text>
</svg>

After

Width:  |  Height:  |  Size: 451 B