Skip to content

Commit f5dd9f3

Browse files
committed
Merge branch 'develop' of github.com:Benevanio/Jobs_Scraper_Global into develop
2 parents 9e5e0d4 + 0b8c300 commit f5dd9f3

8 files changed

Lines changed: 96 additions & 44 deletions

File tree

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,7 @@ Recomendacoes:
169169
- `npm run test`: executa testes do backend
170170
- `npm run build`: build do frontend
171171
- `npm run validate`: teste backend + lint/build frontend
172-
- `npm run test:coverage`: coverage frontend + backend
172+
- `c`: coverage frontend + backend
173173

174174
### Backend
175175

frontend/index.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
<!doctype html>
2-
<html lang="en">
2+
<html lang="pt-br">
33
<head>
44
<meta charset="UTF-8" />
55
<!--C:\Users\benev\projetos\Node\vagas-full\frontend\src\assets\logo-painel-vagas.svg-->
6-
<link rel="icon" type="image/svg+xml" href="/asset/logo-painel-vagas.svg" />
6+
<link rel="icon" type="image/svg+xml" href="/logo.svg" />
77
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
88
<script>
99
(function () {

frontend/public/logo.svg

Lines changed: 10 additions & 0 deletions
Loading

frontend/src/App.tsx

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import { useJobsFiltering } from "@/hooks/useJobsFiltering";
77
import { useJobsPagination } from "@/hooks/useJobsPagination";
88
import type { JobsMeta } from "@/types/jobs";
99
import { useCallback, type SetStateAction } from "react";
10-
import { FiRefreshCw } from "react-icons/fi";
10+
import { FiRefreshCw } from "react-icons/fi";
1111

1212
function formatDate(timestamp: JobsMeta["modifiedAt"]): string {
1313
if (!timestamp) {
@@ -85,8 +85,7 @@ function App() {
8585
<Button
8686
onClick={handleScraper}
8787
disabled={scraping}
88-
className="h-12 rounded-2xl bg-[#0c6b35] px-5 text-white shadow-sm hover:bg-[#0a5b2d]"
89-
>
88+
className="h-12 md:h-14 w-full sm:w-auto rounded-xl md:rounded-2xl bg-[#0c6b35] px-6 text-base text-white shadow-sm hover:bg-[#0a5b2d] whitespace-nowrap flex items-center gap-2" >
9089
<FiRefreshCw className={`h-4 w-4 ${scraping ? "animate-spin" : ""}`} />
9190
{scraping ? "Buscando vagas..." : "Buscar vagas"}
9291
</Button>

frontend/src/components/JobsFiltersCard.tsx

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ export function JobsFiltersCard({
8282
<>
8383
<Card className="rounded-[24px] border border-slate-200 bg-white/95 shadow-[0_18px_45px_rgba(15,23,42,0.08)] backdrop-blur dark:border-[#2b3f58] dark:bg-[#131d31]/95 dark:shadow-[0_18px_45px_rgba(3,8,20,0.25)]">
8484
<CardContent className="flex flex-col gap-4 p-5 md:p-6">
85-
<div className="flex flex-col gap-3 xl:flex-row xl:items-center">
85+
<div className="flex flex-col md:flex-row gap-3 md:items-center">
8686
<div className="relative flex-1">
8787
<FiSearch className="pointer-events-none absolute left-4 top-1/2 h-4 w-4 -translate-y-1/2 text-slate-500 dark:text-slate-400" />
8888
<Input
@@ -96,7 +96,7 @@ export function JobsFiltersCard({
9696
</div>
9797

9898
<div className="flex flex-col gap-3 xl:flex-row xl:items-center xl:justify-between">
99-
<div className="flex flex-1 flex-wrap items-center gap-2">
99+
<div className="flex flex-1 flex-col gap-2 md:flex-row md:flex-wrap md:items-center">
100100
<select
101101
aria-label="Filtrar por palavra-chave"
102102
className="h-12 min-w-[220px] rounded-2xl border border-slate-300 bg-white px-3 text-sm text-slate-900 focus:outline-none focus:ring-2 focus:ring-[#14AE5C]/40 dark:border-[#35506f] dark:bg-[#0b1527] dark:text-slate-100"
@@ -124,15 +124,17 @@ export function JobsFiltersCard({
124124
))}
125125
</select>
126126

127-
<Badge variant="secondary" className="gap-1.5 rounded-full border border-slate-300 bg-slate-100 px-3 py-1 text-xs text-slate-700 dark:border-[#35506f] dark:bg-[#24324c] dark:text-slate-100">
128-
<FiFileText className="h-3.5 w-3.5" />
129-
{meta.file || "Sem arquivo"}
130-
</Badge>
131-
132-
<Badge className="gap-1.5 rounded-full bg-[#0c6b35] px-3 py-1 text-xs text-white">
133-
<FiBriefcase className="h-3.5 w-3.5" />
134-
{meta.total} vagas
135-
</Badge>
127+
<div>
128+
<Badge variant="secondary" className="gap-1.5 rounded-full border border-slate-300 bg-slate-100 px-3 py-1 text-xs text-slate-700 dark:border-[#35506f] dark:bg-[#24324c] dark:text-slate-100">
129+
<FiFileText className="h-3.5 w-3.5" />
130+
{meta.file || "Sem arquivo"}
131+
</Badge>
132+
133+
<Badge className="gap-1.5 rounded-full bg-[#0c6b35] px-3 py-1 text-xs text-white">
134+
<FiBriefcase className="h-3.5 w-3.5" />
135+
{meta.total} vagas
136+
</Badge>
137+
</div>
136138
</div>
137139

138140
<div className="flex items-center gap-2 self-start xl:self-auto">

frontend/src/components/JobsHeaderCard.tsx

Lines changed: 24 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,20 +8,34 @@ import { useTheme } from "@/hooks/useTheme";
88

99
export function JobsHeaderCard() {
1010
const { resolvedTheme, toggleTheme } = useTheme();
11+
1112
return (
12-
<>
13-
<div className="w-screen bg-[#004726] dark:bg-[#003318] p-6 -mx-8 flex items-end">
13+
<div className="w-screen bg-[#004726] dark:bg-[#003318] p-6 -mx-4 md:-mx-8 flex flex-col gap-4 md:flex-row md:items-end">
14+
<div className="flex items-start justify-between w-full md:w-auto">
1415
<CardTitle className="text-3xl text-white">
15-
<img src={Logo} alt="Painel de Vagas" />
16+
<img src={Logo} alt="Painel de Vagas" className="w-16 md:w-auto" />
1617
</CardTitle>
17-
<CardDescription className="text-white">
18-
Leitura automatica dos arquivos XLSX gerados em output.
19-
</CardDescription>
20-
<div className="ml-auto self-start mr-8">
21-
<ThemeToggle theme={resolvedTheme} onToggle={toggleTheme} />
18+
19+
<div className="md:hidden">
20+
<ThemeToggle
21+
theme={resolvedTheme}
22+
onToggle={toggleTheme}
23+
/>
2224
</div>
2325
</div>
24-
25-
</>
26+
27+
<CardDescription className="text-white text-sm md:text-base">
28+
Leitura automática dos arquivos
29+
<br />
30+
XLSX gerados em output.
31+
</CardDescription>
32+
33+
<div className="hidden md:block ml-auto self-start mr-8">
34+
<ThemeToggle
35+
theme={resolvedTheme}
36+
onToggle={toggleTheme}
37+
/>
38+
</div>
39+
</div>
2640
);
2741
}

frontend/tests/unit/components/JobsFiltersCard.test.tsx

Lines changed: 32 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,13 @@ describe("JobsFiltersCard", () => {
3232
/>,
3333
);
3434

35-
fireEvent.change(screen.getByPlaceholderText(/buscar/i), { target: { value: "node" } });
35+
fireEvent.change(screen.getByPlaceholderText(/buscar/i), {
36+
target: { value: "node" },
37+
});
38+
3639
fireEvent.click(screen.getByRole("button", { name: /atualizar/i }));
3740

38-
expect(setSearch).toHaveBeenCalled();
41+
expect(setSearch).toHaveBeenCalledWith("node");
3942
expect(onRefresh).toHaveBeenCalledTimes(1);
4043
});
4144

@@ -54,10 +57,16 @@ describe("JobsFiltersCard", () => {
5457
/>,
5558
);
5659

57-
expect(screen.getAllByText("vagas.xlsx").length).toBeGreaterThan(0);
58-
expect(screen.getByText("1 vagas")).toBeInTheDocument();
59-
expect(screen.getByText(/filtros selecionados/i)).toBeInTheDocument();
60-
expect(screen.getByText(/use o botão filtrar/i)).toBeInTheDocument();
60+
expect(screen.getAllByText(/vagas\.xlsx/i).length).toBeGreaterThan(0);
61+
expect(screen.getByText(/1 vagas/i)).toBeInTheDocument();
62+
63+
expect(
64+
screen.getByText(/filtros selecionados/i)
65+
).toBeInTheDocument();
66+
67+
expect(
68+
screen.getByText(/use o botão filtrar/i)
69+
).toBeInTheDocument();
6170
});
6271

6372
it("dispara mudancas nos filtros de keyword e arquivo", () => {
@@ -79,8 +88,14 @@ describe("JobsFiltersCard", () => {
7988
);
8089

8190
const selects = screen.getAllByRole("combobox");
82-
fireEvent.change(selects[0], { target: { value: "React" } });
83-
fireEvent.change(selects[1], { target: { value: "historico.xlsx" } });
91+
92+
fireEvent.change(selects[0], {
93+
target: { value: "React" },
94+
});
95+
96+
fireEvent.change(selects[1], {
97+
target: { value: "historico.xlsx" },
98+
});
8499

85100
expect(setKeywordFilter).toHaveBeenCalled();
86101
expect(setSelectedFile).toHaveBeenCalled();
@@ -105,12 +120,17 @@ describe("JobsFiltersCard", () => {
105120
);
106121

107122
fireEvent.click(screen.getByRole("button", { name: /^filtrar$/i }));
108-
expect(screen.getByText(/gerenciar filtros/i)).toBeInTheDocument();
109123

110-
fireEvent.click(screen.getByRole("button", { name: /limpar filtros/i }));
124+
expect(
125+
screen.getByText(/gerenciar filtros/i)
126+
).toBeInTheDocument();
127+
128+
fireEvent.click(
129+
screen.getByRole("button", { name: /limpar filtros/i })
130+
);
111131

112-
expect(screen.getAllByText("React").length).toBeGreaterThan(0);
132+
expect(screen.getAllByText(/react/i).length).toBeGreaterThan(0);
113133
expect(setSearch).toHaveBeenCalledWith("");
114134
expect(setKeywordFilter).toHaveBeenCalledWith([]);
115135
});
116-
});
136+
});

frontend/tests/unit/components/JobsHeaderCard.test.tsx

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,23 @@ vi.mock("@/hooks/useTheme", () => ({
77
}));
88

99
describe("JobsHeaderCard", () => {
10-
it("renderiza logo acessivel e descricao", () => {
10+
it("renderiza logo acessível e descrição", () => {
1111
render(<JobsHeaderCard />);
1212

1313
expect(screen.getByAltText("Painel de Vagas")).toBeInTheDocument();
14-
expect(screen.getByText("Leitura automatica dos arquivos XLSX gerados em output.")).toBeInTheDocument();
14+
15+
expect(
16+
screen.getByText(/leitura automática dos arquivos.*xlsx gerados em output/i)
17+
).toBeInTheDocument();
1518
});
1619

17-
it("renderiza o botao de alternar tema", () => {
20+
it("renderiza o botão de alternar tema", () => {
1821
render(<JobsHeaderCard />);
1922

20-
expect(screen.getByRole("button", { name: "Ativar tema escuro" })).toBeInTheDocument();
23+
const buttons = screen.getAllByRole("button", {
24+
name: /ativar tema escuro/i,
25+
});
26+
27+
expect(buttons).toHaveLength(2);
2128
});
22-
});
29+
});

0 commit comments

Comments
 (0)