Skip to content

Commit a935a85

Browse files
committed
Add Partials for custom field types in Administrate.
1 parent b91f1d4 commit a935a85

File tree

9 files changed

+153
-0
lines changed

9 files changed

+153
-0
lines changed
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
# frozen_string_literal: true
2+
3+
require 'administrate/field/base'
4+
5+
class ResultsSummaryField < Administrate::Field::Base
6+
def to_s
7+
"#{successful_count} successful, #{failed_count} failed"
8+
end
9+
10+
def successful_count
11+
data.dig('successful')&.count || 0
12+
end
13+
14+
def failed_count
15+
data.dig('failed')&.count || 0
16+
end
17+
18+
def total_count
19+
successful_count + failed_count
20+
end
21+
end

app/fields/status_field.rb

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
# frozen_string_literal: true
2+
3+
require 'administrate/field/base'
4+
5+
class StatusField < Administrate::Field::Base
6+
def to_s
7+
job_status
8+
end
9+
10+
def job_status
11+
return 'unknown' if data.blank?
12+
13+
job = GoodJob::Execution.find_by(active_job_id: data)
14+
return 'not_found' unless job
15+
16+
return 'failed' if job.error.present?
17+
return 'completed' if job.finished_at.present?
18+
return 'scheduled' if job.scheduled_at.present? && job.scheduled_at > Time.current
19+
return 'running' if job.performed_at.present? && job.finished_at.nil?
20+
21+
'queued'
22+
end
23+
24+
def status_class
25+
case job_status
26+
when 'completed' then 'status-completed'
27+
when 'failed' then 'status-failed'
28+
when 'running' then 'status-running'
29+
when 'queued', 'scheduled' then 'status-queued'
30+
else 'status-unknown'
31+
end
32+
end
33+
end

app/fields/user_info_field.rb

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
# frozen_string_literal: true
2+
3+
require 'administrate/field/base'
4+
5+
class UserInfoField < Administrate::Field::Base
6+
def to_s
7+
user_display
8+
end
9+
10+
def user_display
11+
return 'Unknown User' if data.blank?
12+
13+
user_info = fetch_user_info
14+
return data if user_info.nil?
15+
16+
if user_info[:name].present? && user_info[:email].present?
17+
"#{user_info[:name]} <#{user_info[:email]}>"
18+
elsif user_info[:name].present?
19+
user_info[:name]
20+
elsif user_info[:email].present?
21+
user_info[:email]
22+
else
23+
data
24+
end
25+
end
26+
27+
def user_name
28+
return nil if data.blank?
29+
30+
user_info = fetch_user_info
31+
user_info&.dig(:name)
32+
end
33+
34+
def user_email
35+
return nil if data.blank?
36+
37+
user_info = fetch_user_info
38+
user_info&.dig(:email)
39+
end
40+
41+
def user_id
42+
data
43+
end
44+
45+
private
46+
47+
def fetch_user_info
48+
return @user_info if defined?(@user_info)
49+
50+
@user_info = begin
51+
# Try to get from request-level cache first (set by controller)
52+
cache = RequestStore.store[:user_info_cache] || {}
53+
cached = cache[data]
54+
55+
if cached
56+
cached
57+
else
58+
# Fallback to individual API call if not in cache
59+
result = UserInfoApiClient.fetch_by_ids([data])
60+
result&.first
61+
end
62+
rescue StandardError => e
63+
Rails.logger.error("Failed to fetch user info for #{data}: #{e.message}")
64+
nil
65+
end
66+
end
67+
end
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
<%#
2+
Administrate field partial for ResultsSummaryField in index view
3+
%>
4+
<span style="color: green; font-weight: bold;"><%= field.successful_count %></span>
5+
/
6+
<span style="color: red; font-weight: bold;"><%= field.failed_count %></span>
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
<%#
2+
Administrate field partial for ResultsSummaryField in show view
3+
%>
4+
<span style="color: green; font-weight: bold;"><%= field.successful_count %></span>
5+
/
6+
<span style="color: red; font-weight: bold;"><%= field.failed_count %></span>
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
<%#
2+
Administrate field partial for StatusField in index view
3+
%>
4+
<span class="status-badge status-<%= field.job_status %>">
5+
<%= field.job_status.upcase %>
6+
</span>
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
<%#
2+
Administrate field partial for StatusField in show view
3+
%>
4+
<span class="status-badge status-<%= field.job_status %>">
5+
<%= field.job_status.upcase %>
6+
</span>
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
<%#
2+
Administrate field partial for UserInfoField in index view
3+
%>
4+
<%= field.user_display %>
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
<%#
2+
Administrate field partial for UserInfoField in show view
3+
%>
4+
<%= field.user_display %>

0 commit comments

Comments
 (0)