@@ -13,13 +13,14 @@ defmodule AlgoraWeb.JobsLive do
13
13
14
14
@ impl true
15
15
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 )
17
18
changeset = JobPosting . changeset ( % JobPosting { } , % { } )
18
19
19
20
{ :ok ,
20
21
socket
21
22
|> assign ( :page_title , "Jobs" )
22
- |> assign ( :jobs , jobs )
23
+ |> assign ( :jobs_by_user , jobs_by_user )
23
24
|> assign ( :form , to_form ( changeset ) )
24
25
|> assign ( :user_metadata , AsyncResult . loading ( ) )
25
26
|> assign_user_applications ( ) }
@@ -30,7 +31,7 @@ defmodule AlgoraWeb.JobsLive do
30
31
~H"""
31
32
< div class = "container mx-auto max-w-7xl space-y-6 p-4 md:p-6 lg:px-8 " >
32
33
< . section title = "Jobs " subtitle = "Open positions at top companies " >
33
- <%= if Enum . empty? ( @ jobs ) do %>
34
+ <%= if Enum . empty? ( @ jobs_by_user ) do %>
34
35
< . card class = "rounded-lg bg-card py-12 text-center lg:rounded-[2rem] " >
35
36
< . card_header >
36
37
< div class = "mx-auto mb-2 rounded-full bg-muted p-4 " >
@@ -43,49 +44,58 @@ defmodule AlgoraWeb.JobsLive do
43
44
</ . card_header >
44
45
</ . card >
45
46
<% 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 }
71
63
</ div >
72
64
</ 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 }
85
65
</ 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 >
89
99
<% end %>
90
100
</ div >
91
101
</ . card >
0 commit comments