Skip to content

Commit a0de7e9

Browse files
authored
add notification to admin dash if no stats generated yet (wasp-lang#346)
* add notification if no stats generated yet * Update main.wasp * fix app_diff * Update AnalyticsDashboardPage.tsx
1 parent f77e029 commit a0de7e9

File tree

5 files changed

+64
-50
lines changed

5 files changed

+64
-50
lines changed

opensaas-sh/app_diff/package-lock.json.diff

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

opensaas-sh/app_diff/src/admin/dashboards/analytics/AnalyticsDashboardPage.tsx.diff

Lines changed: 13 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -7,17 +7,12 @@
77
import { useQuery, getDailyStats } from 'wasp/client/operations';
88
import TotalSignupsCard from './TotalSignupsCard';
99
import TotalPageViewsCard from './TotalPageViewsCard';
10-
@@ -7,21 +9,68 @@
11-
import RevenueAndProfitChart from './RevenueAndProfitChart';
12-
import SourcesTable from './SourcesTable';
13-
import DefaultLayout from '../../layout/DefaultLayout';
14-
-import { useRedirectHomeUnlessUserIsAdmin } from '../../useRedirectHomeUnlessUserIsAdmin'
15-
+import { useRedirectHomeUnlessUserIsAdmin } from '../../useRedirectHomeUnlessUserIsAdmin';
10+
@@ -10,12 +12,54 @@
11+
import { useRedirectHomeUnlessUserIsAdmin } from '../../useRedirectHomeUnlessUserIsAdmin';
1612

1713
const Dashboard = ({ user }: { user: AuthUser }) => {
18-
- useRedirectHomeUnlessUserIsAdmin({ user })
1914
+ const [isDemoInfoVisible, setIsDemoInfoVisible] = useState(false);
20-
+ useRedirectHomeUnlessUserIsAdmin({ user });
15+
useRedirectHomeUnlessUserIsAdmin({ user });
2116

2217
const { data: stats, isLoading, error } = useQuery(getDailyStats);
2318

@@ -48,7 +43,6 @@
4843
+
4944
return (
5045
<DefaultLayout user={user}>
51-
+ {/* Floating Demo Announcement */}
5246
+ {isDemoInfoVisible && (
5347
+ <div className='fixed z-999 bottom-0 mb-2 left-1/2 -translate-x-1/2 lg:mb-4 bg-gray-700 rounded-full px-3.5 py-2 text-sm text-white duration-300 ease-in-out hover:bg-gray-800 focus-visible:outline focus-visible:outline-2 focus-visible:outline-indigo-600'>
5448
+ <div className='px-4 flex flex-row gap-2 items-center my-1'>
@@ -65,26 +59,15 @@
6559
+ </div>
6660
+ </div>
6761
+ )}
68-
<div className='grid grid-cols-1 gap-4 md:grid-cols-2 md:gap-6 xl:grid-cols-4 2xl:gap-7.5'>
69-
<TotalPageViewsCard
70-
totalPageViews={stats?.dailyStats.totalViews}
71-
prevDayViewsChangePercent={stats?.dailyStats.prevDayViewsChangePercent}
72-
/>
73-
- <TotalRevenueCard dailyStats={stats?.dailyStats} weeklyStats={stats?.weeklyStats} isLoading={isLoading} />
74-
+ <TotalRevenueCard
75-
+ dailyStats={stats?.dailyStats}
76-
+ weeklyStats={stats?.weeklyStats}
77-
+ isLoading={isLoading}
78-
+ />
79-
<TotalPayingUsersCard dailyStats={stats?.dailyStats} isLoading={isLoading} />
80-
<TotalSignupsCard dailyStats={stats?.dailyStats} isLoading={isLoading} />
81-
</div>
82-
@@ -30,7 +79,7 @@
83-
<RevenueAndProfitChart weeklyStats={stats?.weeklyStats} isLoading={isLoading} />
62+
<div className='relative'>
63+
<div className={`${!stats ? 'opacity-25' : ''}`}>
64+
<div className='grid grid-cols-1 gap-4 md:grid-cols-2 md:gap-6 xl:grid-cols-4 2xl:gap-7.5'>
65+
@@ -36,7 +80,7 @@
66+
<RevenueAndProfitChart weeklyStats={stats?.weeklyStats} isLoading={isLoading} />
8467

85-
<div className='col-span-12 xl:col-span-8'>
86-
- <SourcesTable sources={stats?.dailyStats?.sources} />
87-
+ <SourcesTable sources={sortedSources} />
68+
<div className='col-span-12 xl:col-span-8'>
69+
- <SourcesTable sources={stats?.dailyStats?.sources} />
70+
+ <SourcesTable sources={sortedSources} />
71+
</div>
72+
</div>
8873
</div>
89-
</div>
90-
</DefaultLayout>

opensaas-sh/app_diff/src/client/components/NavBar/NavBar.tsx.diff

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,13 @@
1919
</WaspRouterLink>
2020
</div>
2121
<div className='flex lg:hidden'>
22-
@@ -61,8 +60,8 @@
22+
@@ -56,13 +55,13 @@
23+
</div>
24+
<div className='hidden lg:flex lg:gap-x-12'>{renderNavigationItems(navigationItems)}</div>
25+
<div className='hidden lg:flex lg:flex-1 gap-3 justify-end items-center'>
26+
- <ul className='flex justify-center items-center gap-2 sm:gap-4'>
27+
+ <ul className='ml-4 flex justify-center items-center gap-2 sm:gap-4'>
28+
<DarkModeSwitcher />
2329
</ul>
2430
{isUserLoading ? null : !user ? (
2531
<WaspRouterLink to={routes.LoginRoute.to} className='text-sm font-semibold leading-6 ml-3'>

template/app/src/admin/dashboards/analytics/AnalyticsDashboardPage.tsx

Lines changed: 39 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -7,31 +7,55 @@ import TotalRevenueCard from './TotalRevenueCard';
77
import RevenueAndProfitChart from './RevenueAndProfitChart';
88
import SourcesTable from './SourcesTable';
99
import DefaultLayout from '../../layout/DefaultLayout';
10-
import { useRedirectHomeUnlessUserIsAdmin } from '../../useRedirectHomeUnlessUserIsAdmin'
10+
import { useRedirectHomeUnlessUserIsAdmin } from '../../useRedirectHomeUnlessUserIsAdmin';
11+
import { cn } from '../../../client/cn';
1112

1213
const Dashboard = ({ user }: { user: AuthUser }) => {
13-
useRedirectHomeUnlessUserIsAdmin({ user })
14+
useRedirectHomeUnlessUserIsAdmin({ user });
1415

1516
const { data: stats, isLoading, error } = useQuery(getDailyStats);
1617

1718
return (
1819
<DefaultLayout user={user}>
19-
<div className='grid grid-cols-1 gap-4 md:grid-cols-2 md:gap-6 xl:grid-cols-4 2xl:gap-7.5'>
20-
<TotalPageViewsCard
21-
totalPageViews={stats?.dailyStats.totalViews}
22-
prevDayViewsChangePercent={stats?.dailyStats.prevDayViewsChangePercent}
23-
/>
24-
<TotalRevenueCard dailyStats={stats?.dailyStats} weeklyStats={stats?.weeklyStats} isLoading={isLoading} />
25-
<TotalPayingUsersCard dailyStats={stats?.dailyStats} isLoading={isLoading} />
26-
<TotalSignupsCard dailyStats={stats?.dailyStats} isLoading={isLoading} />
27-
</div>
20+
<div className='relative'>
21+
<div className={cn({
22+
'opacity-25': !stats,
23+
})}>
24+
<div className='grid grid-cols-1 gap-4 md:grid-cols-2 md:gap-6 xl:grid-cols-4 2xl:gap-7.5'>
25+
<TotalPageViewsCard
26+
totalPageViews={stats?.dailyStats.totalViews}
27+
prevDayViewsChangePercent={stats?.dailyStats.prevDayViewsChangePercent}
28+
/>
29+
<TotalRevenueCard
30+
dailyStats={stats?.dailyStats}
31+
weeklyStats={stats?.weeklyStats}
32+
isLoading={isLoading}
33+
/>
34+
<TotalPayingUsersCard dailyStats={stats?.dailyStats} isLoading={isLoading} />
35+
<TotalSignupsCard dailyStats={stats?.dailyStats} isLoading={isLoading} />
36+
</div>
2837

29-
<div className='mt-4 grid grid-cols-12 gap-4 md:mt-6 md:gap-6 2xl:mt-7.5 2xl:gap-7.5'>
30-
<RevenueAndProfitChart weeklyStats={stats?.weeklyStats} isLoading={isLoading} />
38+
<div className='mt-4 grid grid-cols-12 gap-4 md:mt-6 md:gap-6 2xl:mt-7.5 2xl:gap-7.5'>
39+
<RevenueAndProfitChart weeklyStats={stats?.weeklyStats} isLoading={isLoading} />
3140

32-
<div className='col-span-12 xl:col-span-8'>
33-
<SourcesTable sources={stats?.dailyStats?.sources} />
41+
<div className='col-span-12 xl:col-span-8'>
42+
<SourcesTable sources={stats?.dailyStats?.sources} />
43+
</div>
44+
</div>
3445
</div>
46+
47+
{!stats && (
48+
<div className='absolute inset-0 flex items-start justify-center bg-white/50 dark:bg-boxdark-2/50'>
49+
<div className='rounded-lg bg-white p-8 shadow-lg dark:bg-boxdark'>
50+
<p className='text-2xl font-bold text-boxdark dark:text-white'>
51+
No daily stats generated yet
52+
</p>
53+
<p className='mt-2 text-sm text-bodydark2'>
54+
Stats will appear here once the daily stats job has run
55+
</p>
56+
</div>
57+
</div>
58+
)}
3559
</div>
3660
</DefaultLayout>
3761
);

template/app/src/analytics/operations.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ type DailyStatsValues = {
1111
weeklyStats: DailyStatsWithSources[];
1212
};
1313

14-
export const getDailyStats: GetDailyStats<void, DailyStatsValues> = async (_args, context) => {
14+
export const getDailyStats: GetDailyStats<void, DailyStatsValues | undefined> = async (_args, context) => {
1515
if (!context.user?.isAdmin) {
1616
throw new HttpError(401);
1717
}
@@ -24,7 +24,8 @@ export const getDailyStats: GetDailyStats<void, DailyStatsValues> = async (_args
2424
},
2525
});
2626
if (!dailyStats) {
27-
throw new HttpError(204, 'No daily stats generated yet.');
27+
console.log('\x1b[34mNote: No daily stats have been generated by the dailyStatsJob yet. \x1b[0m');
28+
return undefined;
2829
}
2930

3031
const weeklyStats = await context.entities.DailyStats.findMany({

0 commit comments

Comments
 (0)