diff --git a/app/assets/stylesheets/files.css b/app/assets/stylesheets/files.css
index 03de9e2d..058f6a00 100644
--- a/app/assets/stylesheets/files.css
+++ b/app/assets/stylesheets/files.css
@@ -45,3 +45,7 @@
.box-metadata {
padding-right: 1rem;
}
+
+#uploaded-file-filters > li.list-inline-item.active {
+ font-weight: bold;
+}
diff --git a/app/controllers/streams_controller.rb b/app/controllers/streams_controller.rb
index c9ab064c..2b745368 100644
--- a/app/controllers/streams_controller.rb
+++ b/app/controllers/streams_controller.rb
@@ -7,9 +7,27 @@ class StreamsController < ApplicationController
skip_authorize_resource only: %i[normalized_dump resourcelist]
protect_from_forgery with: :null_session, if: :jwt_token
+ # rubocop:disable Metrics/AbcSize
+ # GET /organizations/1/streams/2
def show
- @uploads = @stream.uploads.active.order(created_at: :desc).page(params[:page])
+ @uploads = @stream.uploads.active
+ @current_filter = params[:filter]
+
+ if params[:filter].present?
+ filter_status = params[:filter].to_sym
+
+ filtered_ids = @uploads.select do |upload|
+ upload.files.any? { |file| file.pod_metadata_status == filter_status }
+ end.map(&:id)
+
+ @uploads = Upload.where(id: filtered_ids)
+ end
+
+ # Reset to page 1 if a filter is applied
+ page_number = params[:filter].present? ? 1 : params[:page]
+ @uploads = @uploads.order(created_at: :desc).page(page_number)
end
+ # rubocop:enable Metrics/AbcSize
def resourcelist
authorize! :read, @stream
diff --git a/app/views/streams/_stream_uploads.html.erb b/app/views/streams/_stream_uploads.html.erb
index daee116e..5102264f 100644
--- a/app/views/streams/_stream_uploads.html.erb
+++ b/app/views/streams/_stream_uploads.html.erb
@@ -1,7 +1,9 @@
-<%= render 'uploads/file_table' do %>
- <% uploads.each do |upload| %>
- <%= render 'uploads/file_rows', upload: upload %>
- <% end %>
-<% end %>
+
+ <%= render 'uploads/file_table', filtering_enabled: true do %>
+ <% uploads.each do |upload| %>
+ <%= render 'uploads/file_rows', upload: upload %>
+ <% end %>
+ <% end %>
-<%= paginate uploads %>
+ <%= paginate uploads %>
+
diff --git a/app/views/uploads/_file_rows.html.erb b/app/views/uploads/_file_rows.html.erb
index 864a8007..1362e886 100644
--- a/app/views/uploads/_file_rows.html.erb
+++ b/app/views/uploads/_file_rows.html.erb
@@ -27,7 +27,14 @@
<%= render 'uploads/file_rows', upload: u %>
<% end %>
<% end %>
-<% upload.files.each do |file| %>
+<% files_to_render = if params[:filter].present?
+ upload.files.select { |f| f.pod_metadata_status.to_s == params[:filter].to_s }
+ else
+ upload.files
+ end %>
+
+<% files_to_render.each do |file| %>
+
<%= render(MetadataStatusIconComponent.new(status: file.pod_metadata_status)) %>
diff --git a/app/views/uploads/_file_table.html.erb b/app/views/uploads/_file_table.html.erb
index 2498056a..0aad22d2 100644
--- a/app/views/uploads/_file_table.html.erb
+++ b/app/views/uploads/_file_table.html.erb
@@ -1,9 +1,21 @@
-
- <% Settings.metadata_status.keys.each do |status| %>
- -
- <%= render(MetadataStatusIconComponent.new(status: status, show_label: true)) %>
+
+ <% Settings.metadata_status.each do |status, _values| %>
+ -
+ <% if local_assigns[:filtering_enabled] %>
+ <%= link_to organization_stream_path(@organization, @stream, filter: status), data: { turbo_frame: 'stream-upload-files' } do %>
+ <%= render(MetadataStatusIconComponent.new(status: status, show_label: true)) %>
+ <% end %>
+ <% else %>
+ <%= render(MetadataStatusIconComponent.new(status: status, show_label: true)) %>
+ <% end %>
<% end %>
+
+<% if local_assigns[:filtering_enabled] %>
+ -
+ <%= link_to "Clear filter", organization_stream_path(@organization, @stream), data: { turbo_frame: 'stream-upload-files' }, class: 'btn btn-link btn-sm' %>
+
+<% end %>
diff --git a/spec/features/upload_spec.rb b/spec/features/upload_spec.rb
index 6a763e6d..e10e78b8 100644
--- a/spec/features/upload_spec.rb
+++ b/spec/features/upload_spec.rb
@@ -16,7 +16,7 @@
it 'allows an org owner to upload a file to the default stream' do
visit '/'
- click_on 'Best University home'
+ visit organization_stream_path(organization, stream)
click_on 'New upload'
attach_file('file', Rails.root.join('spec/fixtures/stanford-50.mrc.gz'))
click_on 'Create upload'
|