@@ -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