Skip to content

Commit 8506ba2

Browse files
committed
style(dashboard): better "no data" handling
1 parent a457c83 commit 8506ba2

File tree

1 file changed

+38
-29
lines changed

1 file changed

+38
-29
lines changed

frontend/src/routes/dashboard/+page.svelte

Lines changed: 38 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
let dashboardData = $derived(data);
3030
let lastUpdatedAt = $state(new Date());
3131
let selectedRange = $derived(data?.range || 'month');
32+
let loadedRange = $state('today');
3233
3334
const rangeOptions = [
3435
{ value: 'day', label: 'Today' },
@@ -45,6 +46,8 @@
4546
selectedRange = newRange;
4647
// eslint-disable-next-line svelte/no-navigation-without-resolve
4748
await goto(`/dashboard?range=${newRange}`, { keepFocus: true });
49+
loadedRange =
50+
rangeOptions.find((opt) => opt.value === newRange)?.label.toLowerCase() || 'today';
4851
};
4952
5053
setupVisibilityRefresh({
@@ -99,34 +102,34 @@
99102
<ToggleGroup options={rangeOptions} selected={selectedRange} onchange={handleRangeChange} />
100103
</Container>
101104

102-
<!-- Top Stats -->
103-
<div class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-4 mb-4">
104-
<StatCard
105-
title="Total Time"
106-
value={dashboardData?.human_readable_total || 'None'}
107-
valueClass="text-xl font-semibold text-ctp-text"
108-
/>
109-
<StatCard
110-
title="Top Project"
111-
value={safeText(dashboardData?.projects?.[0]?.name) || 'None'}
112-
valueClass="text-xl font-semibold text-ctp-text"
113-
/>
114-
<StatCard
115-
title="Top Language"
116-
value={safeText(dashboardData?.languages?.[0]?.name) || 'None'}
117-
valueClass="text-xl font-semibold text-ctp-text"
118-
/>
119-
<StatCard
120-
title="Total Heartbeats"
121-
value={dashboardData?.total_heartbeats
122-
? dashboardData.total_heartbeats.toLocaleString()
123-
: '0'}
124-
valueClass="text-xl font-semibold text-ctp-text"
125-
/>
126-
</div>
127-
128-
<!-- Dashboard Statistics -->
129105
{#if dashboardData.projects.length || dashboardData.languages.length || dashboardData.editors.length || dashboardData.operating_systems.length}
106+
<!-- Top Stats -->
107+
<div class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-4 mb-4">
108+
<StatCard
109+
title="Total Time"
110+
value={dashboardData?.human_readable_total || 'None'}
111+
valueClass="text-xl font-semibold text-ctp-text"
112+
/>
113+
<StatCard
114+
title="Top Project"
115+
value={safeText(dashboardData?.projects?.[0]?.name) || 'None'}
116+
valueClass="text-xl font-semibold text-ctp-text"
117+
/>
118+
<StatCard
119+
title="Top Language"
120+
value={safeText(dashboardData?.languages?.[0]?.name) || 'None'}
121+
valueClass="text-xl font-semibold text-ctp-text"
122+
/>
123+
<StatCard
124+
title="Total Heartbeats"
125+
value={dashboardData?.total_heartbeats
126+
? dashboardData.total_heartbeats.toLocaleString()
127+
: '0'}
128+
valueClass="text-xl font-semibold text-ctp-text"
129+
/>
130+
</div>
131+
132+
<!-- Dashboard Statistics -->
130133
<Container className="mb-4">
131134
<div class="grid grid-cols-1 lg:grid-cols-2 gap-8">
132135
<!-- Top Projects (Horizontal Bar Chart) -->
@@ -170,10 +173,16 @@
170173
</div>
171174
</div>
172175
</Container>
173-
{:else}
176+
{:else if loadedRange === 'all'}
174177
<EmptyState
175178
title="No data to display :("
176-
description="Complete the setup bellow to start tracking your time!"
179+
description="Complete the setup in the settings page and start coding to see your stats here!"
180+
className="mb-4"
181+
/>
182+
{:else}
183+
<EmptyState
184+
title={`No time tracked ${loadedRange}`}
185+
description="Get coding or change the time range to see your stats."
177186
className="mb-4"
178187
/>
179188
{/if}

0 commit comments

Comments
 (0)