Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions app/assets/javascripts/audit_logs.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
document.addEventListener('DOMContentLoaded', () => {
document.querySelectorAll('.js-log-type-select, .js-event-type-select').forEach((el) => {
$(el).select2();
});
});
21 changes: 21 additions & 0 deletions app/assets/stylesheets/audit_logs.scss
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
@import 'variables';

.audit-log-filters {
.select2-container {
height: 37px;
margin: 4px 0px;

.selection {
.select2-selection {
border-color: $muted-graphic;
height: 100%;
padding: 4px 0;
}

.select2-selection__arrow {
top: 50%;
translate: 0 -50%;
}
}
}
}
14 changes: 12 additions & 2 deletions app/assets/stylesheets/forms.scss
Original file line number Diff line number Diff line change
Expand Up @@ -20,17 +20,23 @@ select.form-element {
}

& > .form-group {
margin: 0.5em 0;
margin: 0 0 1em 0;

@media screen and (min-width: $screen-md) {
margin: 0 0.5em;
margin: 0 1em 0 0;
flex: 1;
}
}

& > .actions {
display: flex;
align-items: flex-end;
margin-bottom: 4px; // to match bottom margin on .form-element

button, input[type="submit"] {
margin: unset;
padding: 9.5px 12px; // because for some reason it has to be 9.5px to match .form-elements' height
}
}
}

Expand All @@ -49,6 +55,10 @@ select.form-element {
z-index: 8999;
}

.select2-results__option {
min-height: 2em;
}

@for $i from 1 through 25 {
textarea.has-rows[rows="#{$i}"] {
min-height: (1.2em * $i) + 1.2em;
Expand Down
27 changes: 23 additions & 4 deletions app/controllers/admin_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -83,14 +83,33 @@ def audit_log
@page = helpers.safe_page(params)
@per_page = helpers.safe_per_page(params)

@log_types = AuditLog.unscoped.select(:log_type).distinct.map(&:log_type) - ['user_annotation', 'user_history']
@event_types = AuditLog.unscoped.select(:event_type).distinct.map(&:event_type)

@logs = if current_user.is_global_admin
AuditLog.unscoped.where.not(log_type: ['user_annotation', 'user_history'])
else
AuditLog.where.not(log_type: ['block_log', 'user_annotation', 'user_history'])
end.user_sort({ term: params[:sort], default: :created_at },
age: :created_at, type: :log_type, event: :event_type,
related: Arel.sql('related_type DESC, related_id DESC'), user: :user_id)
.paginate(page: @page, per_page: @per_page)
end

[:log_type, :event_type].each do |key|
if params[key].present?
@logs = @logs.where(key => params[key])
end
end

if params[:from].present?
@logs = @logs.where('date(created_at) >= ?', params[:from])
end

if params[:to].present?
@logs = @logs.where('date(created_at) <= ?', params[:to])
end

@logs = @logs.user_sort({ term: params[:sort], default: :created_at },
age: :created_at, type: :log_type, event: :event_type,
related: Arel.sql('related_type DESC, related_id DESC'), user: :user_id)
.paginate(page: @page, per_page: @per_page)

render layout: 'without_sidebar'
end
Expand Down
31 changes: 31 additions & 0 deletions app/views/admin/audit_log.html.erb
Original file line number Diff line number Diff line change
@@ -1,7 +1,38 @@
<h1><%= t 'admin.tools.audit_log' %></h1>

<div>
<h3>Filters</h3>
<%= form_tag audit_log_path, method: :get, class: 'form-inline audit-log-filters' do %>
<div class="form-group-horizontal">
<div class="form-group">
<%= label_tag :log_type, 'Log category', class: 'form-element' %>
<%= select_tag :log_type, options_for_select(@log_types.map { |lt| [lt, lt] }, selected: params[:log_type]),
include_blank: true, class: 'form-element js-log-type-select' %>
</div>
<div class="form-group">
<%= label_tag :event_type, 'Event', class: 'form-element' %>
<%= select_tag :event_type, options_for_select(@event_types.map { |et| [et, et] },
selected: params[:event_type]),
include_blank: true, class: 'form-element js-event-type-select' %>
</div>
<div class="form-group">
<%= label_tag :from, 'From date', class: 'form-element' %>
<%= date_field_tag :from, params[:from], class: 'form-element' %>
</div>
<div class="form-group">
<%= label_tag :to, 'To date', class: 'form-element' %>
<%= date_field_tag :to, params[:to], class: 'form-element' %>
</div>
<div class="actions">
<%= submit_tag 'Filter', class: 'button is-filled' %>
</div>
</div>
<% end %>
</div>

<div class="category-meta">
<h3><%= pluralize(@logs.count, t('g.log')) %></h3>

<div class="button-list is-gutterless">
<% classes = 'button is-outlined is-muted' %>
<%= link_to t('g.age'), request.params.merge(sort: 'age'),
Expand Down
8 changes: 8 additions & 0 deletions test/controllers/admin_controller_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -157,4 +157,12 @@ class AdminControllerTest < ActionController::TestCase
assert_not_nil flash[:success]
end
end

test 'audit log should work with filter params' do
sign_in users(:admin)
get :audit_log, params: { log_type: 'admin_audit', event_type: 'setting_update', from: '2025-04-13',
to: '2025-04-13' }
assert_response(:success)
assert_not_nil assigns(:logs)
end
end