Skip to content

Commit c78796a

Browse files
committed
group jobs from same user
1 parent c882f94 commit c78796a

File tree

1 file changed

+53
-43
lines changed

1 file changed

+53
-43
lines changed

lib/algora_web/live/jobs_live.ex

Lines changed: 53 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,14 @@ defmodule AlgoraWeb.JobsLive do
1313

1414
@impl true
1515
def mount(_params, _session, socket) do
16-
jobs = Jobs.list_jobs()
16+
# Group jobs by user
17+
jobs_by_user = Enum.group_by(Jobs.list_jobs(), & &1.user)
1718
changeset = JobPosting.changeset(%JobPosting{}, %{})
1819

1920
{:ok,
2021
socket
2122
|> assign(:page_title, "Jobs")
22-
|> assign(:jobs, jobs)
23+
|> assign(:jobs_by_user, jobs_by_user)
2324
|> assign(:form, to_form(changeset))
2425
|> assign(:user_metadata, AsyncResult.loading())
2526
|> assign_user_applications()}
@@ -30,7 +31,7 @@ defmodule AlgoraWeb.JobsLive do
3031
~H"""
3132
<div class="container mx-auto max-w-7xl space-y-6 p-4 md:p-6 lg:px-8">
3233
<.section title="Jobs" subtitle="Open positions at top companies">
33-
<%= if Enum.empty?(@jobs) do %>
34+
<%= if Enum.empty?(@jobs_by_user) do %>
3435
<.card class="rounded-lg bg-card py-12 text-center lg:rounded-[2rem]">
3536
<.card_header>
3637
<div class="mx-auto mb-2 rounded-full bg-muted p-4">
@@ -43,49 +44,58 @@ defmodule AlgoraWeb.JobsLive do
4344
</.card_header>
4445
</.card>
4546
<% else %>
46-
<div class="grid gap-4">
47-
<%= for job <- @jobs do %>
48-
<.card class="flex flex-col gap-4 p-6">
49-
<div class="flex items-start justify-between gap-4">
50-
<div class="flex gap-4">
51-
<.avatar class="h-12 w-12">
52-
<.avatar_image src={job.user.avatar_url} />
53-
<.avatar_fallback>
54-
{Algora.Util.initials(job.user.name)}
55-
</.avatar_fallback>
56-
</.avatar>
57-
<div>
58-
<.link
59-
href={job.url}
60-
class="text-lg font-semibold hover:underline"
61-
target="_blank"
62-
>
63-
{job.title}
64-
</.link>
65-
<div class="text-sm text-muted-foreground">
66-
{job.company_name}
67-
<.link href={job.company_url} rel="noopener" target="_blank">
68-
{job.company_url |> String.replace("https://", "")}
69-
</.link>
70-
</div>
47+
<div class="grid gap-12">
48+
<%= for {user, jobs} <- @jobs_by_user do %>
49+
<.card class="flex flex-col gap-6 p-6">
50+
<div class="flex items-center gap-4">
51+
<.avatar class="h-12 w-12">
52+
<.avatar_image src={user.avatar_url} />
53+
<.avatar_fallback>
54+
{Algora.Util.initials(user.name)}
55+
</.avatar_fallback>
56+
</.avatar>
57+
<div>
58+
<div class="text-lg font-semibold">
59+
{user.name}
60+
</div>
61+
<div class="text-sm text-muted-foreground">
62+
{user.bio}
7163
</div>
7264
</div>
73-
<%= if MapSet.member?(@user_applications, job.id) do %>
74-
<.button disabled class="opacity-50">
75-
<.icon name="tabler-check" class="h-4 w-4 mr-2 -ml-1" /> Applied
76-
</.button>
77-
<% else %>
78-
<.button phx-click="apply_job" phx-value-job-id={job.id}>
79-
<.icon name="github" class="h-4 w-4 mr-2" /> Apply with GitHub
80-
</.button>
81-
<% end %>
82-
</div>
83-
<div class="text-sm text-muted-foreground">
84-
{job.description}
8565
</div>
86-
<div class="flex flex-wrap gap-2">
87-
<%= for tech <- job.tech_stack do %>
88-
<.badge variant="outline">{tech}</.badge>
66+
67+
<div class="grid gap-4">
68+
<%= for job <- jobs do %>
69+
<div class="flex flex-col gap-2">
70+
<div class="flex items-start justify-between gap-4">
71+
<div>
72+
<.link
73+
href={job.url}
74+
class="text-lg font-semibold hover:underline"
75+
target="_blank"
76+
>
77+
{job.title}
78+
</.link>
79+
</div>
80+
<%= if MapSet.member?(@user_applications, job.id) do %>
81+
<.button disabled class="opacity-50">
82+
<.icon name="tabler-check" class="h-4 w-4 mr-2 -ml-1" /> Applied
83+
</.button>
84+
<% else %>
85+
<.button phx-click="apply_job" phx-value-job-id={job.id}>
86+
<.icon name="github" class="h-4 w-4 mr-2" /> Apply with GitHub
87+
</.button>
88+
<% end %>
89+
</div>
90+
<div class="text-sm text-muted-foreground">
91+
{job.description}
92+
</div>
93+
<div class="flex flex-wrap gap-2">
94+
<%= for tech <- job.tech_stack do %>
95+
<.badge variant="outline">{tech}</.badge>
96+
<% end %>
97+
</div>
98+
</div>
8999
<% end %>
90100
</div>
91101
</.card>

0 commit comments

Comments
 (0)