|
29 | 29 | let dashboardData = $derived(data); |
30 | 30 | let lastUpdatedAt = $state(new Date()); |
31 | 31 | let selectedRange = $derived(data?.range || 'month'); |
| 32 | + let loadedRange = $state('today'); |
32 | 33 |
|
33 | 34 | const rangeOptions = [ |
34 | 35 | { value: 'day', label: 'Today' }, |
|
45 | 46 | selectedRange = newRange; |
46 | 47 | // eslint-disable-next-line svelte/no-navigation-without-resolve |
47 | 48 | await goto(`/dashboard?range=${newRange}`, { keepFocus: true }); |
| 49 | + loadedRange = |
| 50 | + rangeOptions.find((opt) => opt.value === newRange)?.label.toLowerCase() || 'today'; |
48 | 51 | }; |
49 | 52 |
|
50 | 53 | setupVisibilityRefresh({ |
|
99 | 102 | <ToggleGroup options={rangeOptions} selected={selectedRange} onchange={handleRangeChange} /> |
100 | 103 | </Container> |
101 | 104 |
|
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 --> |
129 | 105 | {#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 --> |
130 | 133 | <Container className="mb-4"> |
131 | 134 | <div class="grid grid-cols-1 lg:grid-cols-2 gap-8"> |
132 | 135 | <!-- Top Projects (Horizontal Bar Chart) --> |
|
170 | 173 | </div> |
171 | 174 | </div> |
172 | 175 | </Container> |
173 | | - {:else} |
| 176 | + {:else if loadedRange === 'all'} |
174 | 177 | <EmptyState |
175 | 178 | 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." |
177 | 186 | className="mb-4" |
178 | 187 | /> |
179 | 188 | {/if} |
|
0 commit comments