Skip to content

Commit 8077bbb

Browse files
authored
refactor(resources): define icons in metadata (#243)
1 parent bca4f83 commit 8077bbb

10 files changed

Lines changed: 100 additions & 84 deletions

File tree

Lines changed: 2 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,4 @@
1-
import {
2-
Link,
3-
ScrollText,
4-
Settings,
5-
ShieldUser,
6-
UsersRound,
7-
} from "lucide-react";
1+
import { Settings } from "lucide-react";
82

93
import { DashboardButton } from "@/components/presentation/dashboard-button";
104
import {
@@ -26,30 +20,22 @@ export default function AboutUsPage(_props: ResourcePageProps) {
2620
/>
2721
<DashboardButton
2822
resource={Resource.AboutUsLinks}
29-
icon={Link}
3023
label={getManagingResourceLabel(Resource.AboutUsLinks, {
3124
firstWordOnly: false,
3225
})}
3326
variant="outline"
3427
/>
3528
<DashboardButton
3629
resource={Resource.Milestones}
37-
icon={ScrollText}
3830
longLabel
3931
variant="outline"
4032
/>
4133
<DashboardButton
4234
resource={Resource.Contributors}
43-
icon={UsersRound}
44-
longLabel
45-
variant="outline"
46-
/>
47-
<DashboardButton
48-
resource={Resource.Roles}
49-
icon={ShieldUser}
5035
longLabel
5136
variant="outline"
5237
/>
38+
<DashboardButton resource={Resource.Roles} longLabel variant="outline" />
5339
</AbstractResourceGroup>
5440
);
5541
}

src/app/(private)/(resources)/map/(map)/page.tsx

Lines changed: 0 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,3 @@
1-
import {
2-
Building,
3-
Map,
4-
MapPin,
5-
Slice,
6-
Train,
7-
UtensilsCrossed,
8-
} from "lucide-react";
9-
101
import { DashboardButton } from "@/components/presentation/dashboard-button";
112
import { AbstractResourceGroup, Resource } from "@/features/resources";
123
import type { ResourcePageProps } from "@/types/components";
@@ -16,50 +7,42 @@ export default function MapPage(_props: ResourcePageProps) {
167
<AbstractResourceGroup>
178
<DashboardButton
189
resource={Resource.Campuses}
19-
icon={Map}
2010
longLabel
2111
variant="outline"
2212
/>
2313
<DashboardButton
2414
resource={Resource.Buildings}
25-
icon={Building}
2615
longLabel
2716
variant="outline"
2817
/>
2918
<DashboardButton
3019
resource={Resource.PolinkaStations}
31-
icon={Train}
3220
longLabel
3321
variant="outline"
3422
/>
3523
<DashboardButton
3624
resource={Resource.FoodSpots}
37-
icon={UtensilsCrossed}
3825
longLabel
3926
variant="outline"
4027
/>
4128
<DashboardButton
4229
resource={Resource.Libraries}
43-
icon={MapPin}
4430
longLabel
4531
variant="outline"
4632
/>
4733
<DashboardButton
4834
resource={Resource.BicycleShowers}
49-
icon={MapPin}
5035
longLabel
5136
variant="outline"
5237
/>
5338
<DashboardButton
5439
resource={Resource.Aeds}
55-
icon={MapPin}
5640
longLabel
5741
variant="outline"
5842
preserveCase={true}
5943
/>
6044
<DashboardButton
6145
resource={Resource.PinkBoxes}
62-
icon={Slice}
6346
longLabel
6447
variant="outline"
6548
/>

src/app/(private)/(resources)/misc/(misc)/page.tsx

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
import { Clock, Wrench } from "lucide-react";
2-
31
import { DashboardButton } from "@/components/presentation/dashboard-button";
42
import {
53
AbstractResourceGroup,
@@ -13,14 +11,12 @@ export default function MobileConfigPage(_props: ResourcePageProps) {
1311
<AbstractResourceGroup>
1412
<DashboardButton
1513
resource={Resource.MobileConfig}
16-
icon={Wrench}
1714
href={`/${Resource.MobileConfig}/edit`}
1815
label="Zarządzanie ustawieniami"
1916
variant="outline"
2017
/>
2118
<DashboardButton
2219
resource={Resource.SksOpeningHours}
23-
icon={Clock}
2420
label={getManagingResourceLabel(Resource.SksOpeningHours, {
2521
firstWordOnly: false,
2622
})}

src/app/(private)/(resources)/notifications/(notifications)/page.tsx

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { BellPlus, BellRing } from "lucide-react";
1+
import { BellRing } from "lucide-react";
22

33
import { DashboardButton } from "@/components/presentation/dashboard-button";
44
import { GrammaticalCase, declineNoun } from "@/features/polish";
@@ -10,7 +10,6 @@ export default function NotificationsPage() {
1010
<DashboardButton
1111
resource={Resource.NotificationTopics}
1212
variant="outline"
13-
icon={BellPlus}
1413
longLabel
1514
/>
1615
<DashboardButton

src/app/(private)/page.tsx

Lines changed: 12 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,4 @@
1-
import {
2-
Bell,
3-
BookOpen,
4-
Building,
5-
Calendar,
6-
CalendarCog,
7-
CircleQuestionMark,
8-
Map,
9-
Megaphone,
10-
Notebook,
11-
RefreshCcw,
12-
University,
13-
Wrench,
14-
} from "lucide-react";
1+
import { RefreshCcw } from "lucide-react";
152

163
import { DashboardButton } from "@/components/presentation/dashboard-button";
174
import { getUserDisplayName } from "@/features/authentication";
@@ -41,27 +28,17 @@ export default async function Home() {
4128
/>
4229
</div>
4330
<div className="col-span-full grid grid-cols-subgrid gap-4">
44-
<DashboardButton
45-
resource={Resource.StudentOrganizations}
46-
icon={Building}
47-
/>
48-
<DashboardButton resource={Resource.GuideArticles} icon={BookOpen} />
49-
<DashboardButton resource={Resource.Banners} icon={Megaphone} />
50-
<DashboardButton resource={Resource.CalendarEvents} icon={Calendar} />
51-
<DashboardButton resource={Resource.Departments} icon={University} />
52-
<DashboardButton resource={Resource.Map} icon={Map} />
53-
<DashboardButton resource={Resource.Versions} icon={Notebook} />
54-
<DashboardButton
55-
resource={Resource.AboutUs}
56-
icon={CircleQuestionMark}
57-
label="Sekcja o nas"
58-
/>
59-
<DashboardButton resource={Resource.Notifications} icon={Bell} />
60-
<DashboardButton
61-
resource={Resource.AcademicSemesters}
62-
icon={CalendarCog}
63-
/>
64-
<DashboardButton resource={Resource.MobileConfig} icon={Wrench} />
31+
<DashboardButton resource={Resource.StudentOrganizations} />
32+
<DashboardButton resource={Resource.GuideArticles} />
33+
<DashboardButton resource={Resource.Banners} />
34+
<DashboardButton resource={Resource.CalendarEvents} />
35+
<DashboardButton resource={Resource.Departments} />
36+
<DashboardButton resource={Resource.Map} />
37+
<DashboardButton resource={Resource.Versions} />
38+
<DashboardButton resource={Resource.AboutUs} label="Sekcja o nas" />
39+
<DashboardButton resource={Resource.Notifications} />
40+
<DashboardButton resource={Resource.AcademicSemesters} />
41+
<DashboardButton resource={Resource.MobileConfig} />
6542
</div>
6643
</div>
6744
</div>

src/components/presentation/dashboard-button.tsx

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,19 @@ import { Button } from "@/components/ui/button";
77
import { permit } from "@/features/authentication/server";
88
import type { RoutePermission } from "@/features/authentication/types";
99
import { GrammaticalCase, declineNoun } from "@/features/polish";
10-
import { getManagingResourceLabel } from "@/features/resources";
11-
import type { RoutableResource } from "@/features/resources/types";
10+
import {
11+
getManagingResourceLabel,
12+
getResourceMetadata,
13+
} from "@/features/resources";
14+
import type {
15+
DisplayableResource,
16+
RoutableResource,
17+
} from "@/features/resources/types";
1218
import { cn } from "@/lib/utils";
1319
import { toTitleCase } from "@/utils";
1420

1521
export async function DashboardButton({
16-
icon: Icon,
22+
icon,
1723
variant = "default",
1824
className,
1925
href: hrefOverride,
@@ -22,27 +28,28 @@ export async function DashboardButton({
2228
longLabel = false,
2329
preserveCase = false,
2430
}: VariantProps<typeof Button> & {
25-
icon: LucideIcon;
2631
className?: string;
2732
} & (
2833
| {
2934
href?: Route;
3035
label?: string;
31-
resource: RoutableResource;
36+
icon?: LucideIcon;
37+
resource: RoutableResource & DisplayableResource;
3238
longLabel?: boolean;
3339
preserveCase?: boolean;
3440
}
3541
| {
3642
href: Route & RoutePermission;
3743
label: string;
44+
icon: LucideIcon;
3845
resource?: never;
3946
longLabel?: never;
4047
preserveCase?: never;
4148
}
4249
)) {
43-
const [route, label] =
50+
const [route, label, Icon] =
4451
resource == null
45-
? [hrefOverride, labelOverride]
52+
? [hrefOverride, labelOverride, icon]
4653
: [
4754
`/${resource}` as const,
4855
longLabel
@@ -52,7 +59,13 @@ export async function DashboardButton({
5259
case: GrammaticalCase.Nominative,
5360
plural: true,
5461
})),
62+
icon ?? getResourceMetadata(resource).icon,
5563
];
64+
if (Icon == null) {
65+
throw new Error(
66+
`Displayable resource ${resource ?? route} has no icon defined in metadata`,
67+
);
68+
}
5669

5770
const hasPermission = await permit(route);
5871
if (!hasPermission) {

src/features/resources/components/create-button.tsx

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,15 @@ export function CreateButton<T extends CreatableResource>({
1717
}) {
1818
const searchParameters = new URLSearchParams(
1919
prefillAttributes as Record<string, string>,
20-
).toString();
20+
);
2121

22+
const searchQuery =
23+
searchParameters.size === 0
24+
? ""
25+
: (`?${searchParameters.toString()}` as const);
2226
return (
2327
<Button className={className} asChild>
24-
<Link href={`/${resource}/create?${searchParameters}`}>
28+
<Link href={`/${resource}/create${searchQuery}`}>
2529
<CreateButtonLabel resource={resource} plural={plural} />
2630
</Link>
2731
</Button>

0 commit comments

Comments
 (0)