Skip to content

Commit add67f9

Browse files
updated the resources to make the icons consistent, added styling (#117)
1 parent b4bb18b commit add67f9

2 files changed

Lines changed: 142 additions & 5 deletions

File tree

frontend/src/components/ResourcesList.test.tsx

Lines changed: 124 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { axe } from "jest-axe";
22
import { render, screen } from "tests/react-utils";
33
import { Resource } from "@/types/resources";
4-
import ResourcesList from "./ResourcesList";
4+
import ResourcesList, { getCardBorderClass } from "./ResourcesList";
55

66
const mockResource: Resource = {
77
name: "Test Resource",
@@ -131,6 +131,129 @@ describe("ResourcesList", () => {
131131
expect(screen.queryByText("External")).not.toBeInTheDocument();
132132
});
133133

134+
describe("Card border styling", () => {
135+
it("applies blue border class for goodwill referral type", () => {
136+
const resource: Resource = {
137+
name: "Goodwill Center",
138+
referral_type: "goodwill",
139+
};
140+
141+
render(
142+
<ResourcesList
143+
resources={[resource]}
144+
handleRemoveResource={mockHandleRemoveResource}
145+
/>,
146+
);
147+
148+
const expectedClasses = getCardBorderClass("goodwill");
149+
const card = screen.getByTestId("resource-card-goodwill-0");
150+
expect(card).toBeInTheDocument();
151+
expectedClasses.split(" ").forEach((className) => {
152+
expect(card).toHaveClass(className);
153+
});
154+
});
155+
156+
it("applies gray border class for government referral type", () => {
157+
const resource: Resource = {
158+
name: "Government Service",
159+
referral_type: "government",
160+
};
161+
162+
render(
163+
<ResourcesList
164+
resources={[resource]}
165+
handleRemoveResource={mockHandleRemoveResource}
166+
/>,
167+
);
168+
169+
const expectedClasses = getCardBorderClass("government");
170+
const card = screen.getByTestId("resource-card-government-0");
171+
expect(card).toBeInTheDocument();
172+
expectedClasses.split(" ").forEach((className) => {
173+
expect(card).toHaveClass(className);
174+
});
175+
});
176+
177+
it("applies green border class for external referral type", () => {
178+
const resource: Resource = {
179+
name: "Community Center",
180+
referral_type: "external",
181+
};
182+
183+
render(
184+
<ResourcesList
185+
resources={[resource]}
186+
handleRemoveResource={mockHandleRemoveResource}
187+
/>,
188+
);
189+
190+
const expectedClasses = getCardBorderClass("external");
191+
const card = screen.getByTestId("resource-card-external-0");
192+
expect(card).toBeInTheDocument();
193+
expectedClasses.split(" ").forEach((className) => {
194+
expect(card).toHaveClass(className);
195+
});
196+
});
197+
198+
it("does not apply border classes when referral type is undefined", () => {
199+
const resource: Resource = {
200+
name: "Generic Resource",
201+
description: "No type specified",
202+
};
203+
204+
render(
205+
<ResourcesList
206+
resources={[resource]}
207+
handleRemoveResource={mockHandleRemoveResource}
208+
/>,
209+
);
210+
211+
const expectedClasses = getCardBorderClass(undefined);
212+
expect(expectedClasses).toBe("");
213+
214+
const card = screen.getByTestId("resource-card-0");
215+
expect(card).toBeInTheDocument();
216+
217+
// Verify no colored border classes are applied
218+
expect(card).not.toHaveClass("border-t-blue-600");
219+
expect(card).not.toHaveClass("border-t-gray-600");
220+
expect(card).not.toHaveClass("border-t-green-600");
221+
});
222+
223+
it("applies correct border classes to multiple resources with different types", () => {
224+
const resources: Resource[] = [
225+
{ name: "Goodwill Center", referral_type: "goodwill" },
226+
{ name: "Government Service", referral_type: "government" },
227+
{ name: "Community Center", referral_type: "external" },
228+
];
229+
230+
render(
231+
<ResourcesList
232+
resources={resources}
233+
handleRemoveResource={mockHandleRemoveResource}
234+
/>,
235+
);
236+
237+
const goodwillClasses = getCardBorderClass("goodwill");
238+
const governmentClasses = getCardBorderClass("government");
239+
const externalClasses = getCardBorderClass("external");
240+
241+
const goodwillCard = screen.getByTestId("resource-card-goodwill-0");
242+
const govCard = screen.getByTestId("resource-card-government-1");
243+
const externalCard = screen.getByTestId("resource-card-external-2");
244+
245+
goodwillClasses.split(" ").forEach((className) => {
246+
expect(goodwillCard).toHaveClass(className);
247+
});
248+
governmentClasses.split(" ").forEach((className) => {
249+
expect(govCard).toHaveClass(className);
250+
});
251+
externalClasses.split(" ").forEach((className) => {
252+
expect(externalCard).toHaveClass(className);
253+
});
254+
});
255+
});
256+
134257
it("renders website link with proper attributes", () => {
135258
render(
136259
<ResourcesList

frontend/src/components/ResourcesList.tsx

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { Resource } from "@/types/resources";
22
import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card";
33
import Link from "next/link";
44
import React from "react";
5-
import { HandHeart, Landmark, X } from "lucide-react";
5+
import { Building, Users, X } from "lucide-react";
66

77
const referralTypeIndicator = (referralType: string | undefined) => {
88
switch (referralType) {
@@ -27,7 +27,7 @@ const referralTypeIndicator = (referralType: string | undefined) => {
2727
data-testid="government_referral"
2828
className="inline-flex items-center gap-1.5 bg-transparent text-gray-800 ml-4 mt-3 px-2.5 py-1 max-w-[15rem] text-sm font-bold"
2929
>
30-
<Landmark className="h-4 w-4 shrink-0" />
30+
<Building className="h-4 w-4 shrink-0" />
3131
<span className="truncate">Government</span>
3232
</span>
3333
);
@@ -38,7 +38,7 @@ const referralTypeIndicator = (referralType: string | undefined) => {
3838
data-testid="external_referral"
3939
className="inline-flex items-center gap-1.5 bg-transparent text-green-800 ml-4 mt-3 px-2.5 py-1 max-w-[15rem] text-sm font-bold"
4040
>
41-
<HandHeart className="h-4 w-4 shrink-0" />
41+
<Users className="h-4 w-4 shrink-0" />
4242
<span className="truncate">External</span>
4343
</span>
4444
);
@@ -49,6 +49,19 @@ const referralTypeIndicator = (referralType: string | undefined) => {
4949
}
5050
};
5151

52+
export const getCardBorderClass = (referralType: string | undefined) => {
53+
switch (referralType) {
54+
case "goodwill":
55+
return "border-t-4 border-t-blue-600 rounded-t-lg";
56+
case "government":
57+
return "border-t-4 border-t-gray-600 rounded-t-lg";
58+
case "external":
59+
return "border-t-4 border-t-green-600 rounded-t-lg";
60+
default:
61+
return "";
62+
}
63+
};
64+
5265
const normalizeUrl = (url: string) => {
5366
const trimmed = url.trim();
5467
if (/^(https?:)?\/\//i.test(trimmed) || /^(mailto:|tel:)/i.test(trimmed)) {
@@ -75,7 +88,8 @@ const ResourcesList = ({
7588
{resources.map((r, i) => (
7689
<Card
7790
key={i}
78-
className="relative bg-white shadow-sm mb-5 min-w-[16rem]"
91+
className={`relative bg-white shadow-sm mb-5 min-w-[16rem] ${getCardBorderClass(r.referral_type)}`}
92+
data-testid={`resource-card${r.referral_type ? `-${r.referral_type}` : ""}-${i}`}
7993
>
8094
{referralTypeIndicator(r.referral_type)}
8195
{/* Remove button */}

0 commit comments

Comments
 (0)