Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Metadata Templates Selection UI #914

Open
wants to merge 75 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
75 commits
Select commit Hold shift + click to select a range
cffd703
feat: Enhance CreateService for metadata templates with authorization…
joshsadam Jan 15, 2025
b09f6b1
feat: Implement metadata template creation policy and service with au…
joshsadam Jan 17, 2025
2d9a069
feat: Enhance metadata template creation with validation and error ha…
joshsadam Jan 21, 2025
9d1bcb9
refactor: Improve metadata template creation service with enhanced er…
joshsadam Jan 21, 2025
c7c4d92
feat: Enhance activity components with metadata template handling
joshsadam Jan 21, 2025
2d8c4d1
feat: Enhance metadata template creation with improved validation and…
joshsadam Jan 21, 2025
59d7465
feat: Implement metadata template destruction service and policy enha…
joshsadam Jan 22, 2025
5cea4e1
feat: Update GroupPolicy with enhanced metadata template permissions
joshsadam Jan 22, 2025
7c04393
feat: Implement update service for metadata templates with enhanced p…
joshsadam Jan 22, 2025
e9eef25
Normalized i18n files
joshsadam Jan 22, 2025
d6070fd
refactor: Remove parameter validation from update service for metadat…
joshsadam Jan 22, 2025
32790db
fix: Improve error handling in metadata template update service
joshsadam Jan 22, 2025
1dbb78d
refactor: Remove unused method from CreateService
joshsadam Jan 22, 2025
8ef65ed
fix: Correct test descriptions and enhance assertions for metadata te…
joshsadam Jan 22, 2025
3fe1b0a
fix: Improve metadata template validation and error handling
joshsadam Jan 23, 2025
9226f36
refactor: Simplify activity parameter handling in TrackActivity concern
joshsadam Jan 23, 2025
30658cc
fix: Remove unnecessary whitespace in CreateService file
joshsadam Jan 23, 2025
84efac0
refactor: Improve readability of activity key assignment in CreateSer…
joshsadam Jan 23, 2025
e900cf1
refactor: Enhance readability of activity key assignment in DestroySe…
joshsadam Jan 23, 2025
d6ef307
fix: Improve error handling in metadata template creation and update …
joshsadam Jan 23, 2025
93c05bc
feat: Add template_name to activity components and refine metadata te…
joshsadam Jan 23, 2025
60a763b
refactor: Update access level requirements for metadata template actions
joshsadam Jan 23, 2025
ed67711
refactor: Update access level checks for metadata template actions
joshsadam Jan 23, 2025
55f5a4f
fix: Update test description for metadata template permission validation
joshsadam Jan 23, 2025
bab6670
fix: Update test description for metadata template permission validation
joshsadam Jan 23, 2025
fe7f7cd
fix: Update error assertion in metadata template update service test
joshsadam Jan 23, 2025
0e2dca6
refactor: Rename metadata template policy methods to plural form
joshsadam Jan 23, 2025
f2c70e9
fix: Update test user references in metadata template service tests
joshsadam Jan 24, 2025
e63e9cd
Enhance metadata handling in projects and samples using dropdown to s…
joshsadam Jan 24, 2025
0131fd2
Remove debug output from fields_for_namespace_or_template method in M…
joshsadam Jan 24, 2025
5324ffa
Refactor metadata template handling in Namespace model
joshsadam Jan 24, 2025
6c75472
chore: Fixed merged conflicts
joshsadam Jan 24, 2025
0d3002f
refactor: Improve search parameter handling in SamplesController
joshsadam Jan 28, 2025
dac65b4
refactor: Move metadata template method to Metadata concern
joshsadam Jan 28, 2025
2ecd24d
feat: Add metadata templates dropdown component
joshsadam Jan 28, 2025
068fa61
refactor: Remove metadata toggle partial
joshsadam Jan 28, 2025
96f3c62
refactor: Improve metadata templates dropdown component
joshsadam Jan 28, 2025
668cd81
fix: Handle blank metadata template in fields selection
joshsadam Jan 28, 2025
e98e750
feat: Add metadata templates to Groups::SamplesController
joshsadam Jan 28, 2025
4a00a75
feat: Update samples table filter with metadata templates dropdown
joshsadam Jan 28, 2025
05c3d9d
refactor: Remove debug print statement from metadata templates dropdown
joshsadam Jan 28, 2025
3ef144d
feat: Add screen reader label to metadata templates dropdown
joshsadam Jan 28, 2025
b84474f
refactor: Improve metadata templates dropdown component styling
joshsadam Jan 28, 2025
2d22eb9
refactor: Remove debug print statement from metadata templates dropdo…
joshsadam Jan 28, 2025
78b4a9d
style: Standardize locale file quote styles
joshsadam Jan 28, 2025
722bc33
refactor: Remove metadata toggle label from locale files
joshsadam Jan 29, 2025
fede3a1
refactor: Added back old method to handle submissions
joshsadam Jan 29, 2025
dec5ae1
refactor: Removed unused i18n strings
joshsadam Jan 29, 2025
bb215a0
refactor: Update namespace metadata field selection method
joshsadam Jan 29, 2025
aecccb9
test: Update samples test to check for metadata template select element
joshsadam Jan 29, 2025
df5d451
test: Update samples test to use metadata template select dropdown
joshsadam Jan 29, 2025
bc7ae82
refactor: Remove duplicate update_metadata_templates? method from pro…
joshsadam Jan 30, 2025
0d9cad6
refactor: Update group policy metadata template creation method
joshsadam Jan 30, 2025
3e9d3f1
reverted unnecessary changes
joshsadam Jan 30, 2025
572acc4
Formatted file
joshsadam Jan 30, 2025
8cf3d7f
test: Update samples test to use metadata template select dropdown
joshsadam Jan 30, 2025
68fcb27
test: Update samples test to use metadata template select dropdown
joshsadam Jan 30, 2025
a38f63a
refactor: Update samples search parameter handling for metadata template
joshsadam Feb 3, 2025
1d3128a
refactor: Removed old toggle check
joshsadam Feb 3, 2025
763d818
test: Update samples test metadata template selection logic
joshsadam Feb 3, 2025
e309968
test: Adjust samples test metadata template selection to 'none'
joshsadam Feb 3, 2025
ca0df4a
feat: Add list route for metadata templates in group and project routes
joshsadam Feb 3, 2025
ae5757f
chore: Working dropdown with turbo load
joshsadam Feb 5, 2025
3b78cd7
feat: Enhance metadata template dropdown with pagination and improved…
joshsadam Feb 5, 2025
40891ea
refactor: Unify metadata template dropdown across groups and projects
joshsadam Feb 5, 2025
e3cb3fd
fix: Update metadata template localization and dropdown styling
joshsadam Feb 5, 2025
49f3686
style: Enhance metadata template dropdown button with Tailwind CSS cl…
joshsadam Feb 5, 2025
50979f5
refactor: Improve metadata template list view and controller organiza…
joshsadam Feb 5, 2025
82be44d
feat: Improve metadata template dropdown UI and loading state
joshsadam Feb 5, 2025
49c8556
feat: Update localization keys for metadata template fields
joshsadam Feb 5, 2025
63b5040
feat: Add localization for metadata template dropdown label
joshsadam Feb 5, 2025
5590e35
style: Update metadata template dropdown color scheme
joshsadam Feb 5, 2025
7ae9527
refactor: Remove dynamic dropdown component
joshsadam Feb 6, 2025
9186fe9
feat: Add authorization and test coverage for metadata template list …
joshsadam Feb 6, 2025
2f811c0
test: Add comprehensive tests for Metadata concern methods
joshsadam Feb 6, 2025
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
3 changes: 3 additions & 0 deletions app/components/activities/project_activity_component.rb
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,13 @@ def initialize(activity: nil)
def sample_link
%w[sample_create sample_update attachment_create attachment_destroy
metadata_update].include?(@activity[:action])
%w[sample_create sample_update attachment_create attachment_destroy
metadata_update].include?(@activity[:action])
end

def samples_link
%w[sample_clone sample_transfer].include?(@activity[:action])
%w[sample_clone sample_transfer].include?(@activity[:action])
end

def samples_tab
Expand Down
25 changes: 25 additions & 0 deletions app/components/metadata_templates_dropdown_component.html.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
<div class="relative">
<label for="metadata_template_select" class="sr-only">
<%= t("components.metadata_templates_dropdown.templates") %>
</label>
<%= form.select :metadata_template,
grouped_options_for_select(formatted_options, selected),
{},
{
id: "metadata_template_select",
data: {
action: "change->metadata-toggle#submit",
},
class: [
# Base styles
"block text-sm rounded-lg p-2.5",
# Colors - Light mode
"bg-slate-50 border-slate-300 text-slate-900",
# Colors - Dark mode
"dark:bg-slate-700 dark:border-slate-600 dark:text-white dark:placeholder-slate-400",
# Focus states
"focus:ring-primary-500 focus:border-primary-500",
"dark:focus:ring-primary-500 dark:focus:border-primary-500",
].join(" "),
} %>
</div>
28 changes: 28 additions & 0 deletions app/components/metadata_templates_dropdown_component.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
# frozen_string_literal: true

# Render a dropdown for metadata templates
class MetadataTemplatesDropdownComponent < Component
attr_reader :options, :form, :selected

def initialize(metadata_templates: nil, form: nil, selected: 'none')
@metadata_templates = metadata_templates
@form = form
@selected = selected
end

def formatted_options
options = [
[
t('components.metadata_templates_dropdown.fields'),
[[t('components.metadata_templates_dropdown.all'), 'all'],
[t('components.metadata_templates_dropdown.none'), 'none']]
]
]

if @metadata_templates.present?
options << [t('components.metadata_templates_dropdown.templates'),
@metadata_templates]
end
options
end
end
18 changes: 16 additions & 2 deletions app/controllers/concerns/metadata.rb
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,14 @@ def pagy_with_metadata_sort(result) # rubocop:disable Metrics/AbcSize
pagy(result)
end

def fields_for_namespace(namespace: nil, show_fields: false)
@fields = !show_fields || namespace.nil? ? [] : namespace.metadata_fields
def fields_for_namespace_or_template(namespace: nil, template: nil)
@fields = if template.blank? || template == 'none' || namespace.nil?
[]
elsif template == 'all'
namespace.metadata_fields
else
MetadataTemplate.find_by(id: template).fields
end
end

def advanced_search_fields(namespace)
Expand All @@ -25,4 +31,12 @@ def advanced_search_fields(namespace)
metadata_fields.map! { |field| "metadata.#{field}" }
@advanced_search_fields = sample_fields.concat(metadata_fields)
end

def current_metadata_template(params)
params[:metadata_template] = params[:metadata_template].presence || 'none'
end

def metadata_templates_for_namespace(namespace: nil)
@metadata_templates = namespace.metadata_templates.map { |template| [template.name, template.id] }
end
end
39 changes: 39 additions & 0 deletions app/controllers/concerns/metadata_template_actions.rb
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ module MetadataTemplateActions # rubocop:disable Metrics/ModuleLength
included do
before_action proc { namespace }
before_action proc { metadata_template }, only: %i[destroy edit show update]
before_action proc { metadata_templates }, only: %i[list]
end

def index
Expand Down Expand Up @@ -97,6 +98,20 @@ def update
end
end

def list
authorize! @namespace, to: :view_metadata_templates?
set_template_name
set_pagination_params
set_search_url

respond_to do |format|
format.turbo_stream do
render turbo_stream: turbo_stream.replace('metadata_templates_dropdown',
partial: 'shared/samples/metadata_templates_list')
end
end
end

protected

def metadata_templates_path
Expand All @@ -105,6 +120,12 @@ def metadata_templates_path

private

def metadata_templates
@metadata_templates = authorized_scope(MetadataTemplate, type: :relation,
scope_options: { namespace: @namespace,
include_ancestral_templates: true })
end

def load_metadata_templates
authorized_scope(MetadataTemplate, type: :relation, scope_options: { namespace: @namespace })
end
Expand All @@ -131,4 +152,22 @@ def render_error(message)
def set_default_sort
@q.sorts = 'name asc' if @q.sorts.empty?
end

def set_template_name
default_values = %w[none all]
@name = if default_values.include?(params[:metadata_template])
I18n.t("shared.samples.metadata_templates.fields.#{params[:metadata_template]}")
else
MetadataTemplate.find(params[:metadata_template]).name
end
end

def set_pagination_params
@limit = params[:limit]
@page = params[:page]
end

def set_search_url
@url = @namespace.is_a?(Group) ? search_group_samples_url : search_namespace_project_samples_url
end
end
26 changes: 22 additions & 4 deletions app/controllers/groups/samples_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ class SamplesController < Groups::ApplicationController

before_action :group, :current_page
before_action :query, only: %i[index search select]
before_action :current_metadata_template, only: %i[index]

def index
@timestamp = DateTime.current
Expand Down Expand Up @@ -74,15 +75,15 @@ def current_page
@current_page = t(:'groups.sidebar.samples')
end

def set_metadata_fields
fields_for_namespace(namespace: @group, show_fields: @search_params && @search_params[:metadata].to_i == 1)
def metadata_fields(template)
fields_for_namespace_or_template(namespace: @group, template:)
end

def query
authorize! @group, to: :sample_listing?

@search_params = search_params
set_metadata_fields
metadata_fields(@search_params['metadata_template'])
advanced_search_fields(@group)

project_ids =
Expand All @@ -95,7 +96,7 @@ def search_params
updated_params = update_store(search_key, params[:q].present? ? params[:q].to_unsafe_h : {})

if !updated_params.key?(:sort) ||
(updated_params[:metadata].to_i.zero? && updated_params[:sort]&.match?(/metadata_/))
(updated_params[:metadata_template] == 'none' && updated_params[:sort]&.match?(/metadata_/))
updated_params[:sort] = 'updated_at desc'
update_store(search_key, updated_params)
end
Expand All @@ -105,5 +106,22 @@ def search_params
def search_key
:"#{controller_name}_#{group.id}_search_params"
end

def current_metadata_template
current_value = @search_params[:metadata_template] || 'none'

@metadata_template = if %w[none all].include?(current_value)
{
id: current_value,
name: t("shared.samples.metadata_templates.fields.#{current_value}")
}
else
template = MetadataTemplate.find_by(id: current_value)
{
id: template.id,
name: template.name
}
end
end
end
end
30 changes: 25 additions & 5 deletions app/controllers/projects/samples_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ class SamplesController < Projects::ApplicationController # rubocop:disable Metr
before_action :sample, only: %i[show edit update view_history_version]
before_action :current_page
before_action :query, only: %i[index search select]
before_action :current_metadata_template, only: %i[index]

def index
@timestamp = DateTime.current
Expand Down Expand Up @@ -134,10 +135,10 @@ def current_page
@current_page = t(:'projects.sidebar.samples')
end

def set_metadata_fields
fields_for_namespace(
def metadata_fields(template)
fields_for_namespace_or_template(
namespace: @project.namespace,
show_fields: @search_params && @search_params[:metadata].to_i == 1
template: template
)
end

Expand All @@ -149,7 +150,9 @@ def query
authorize! @project, to: :sample_listing?

@search_params = search_params
set_metadata_fields

metadata_fields(@search_params['metadata_template'])

advanced_search_fields(@project.namespace)

@query = Sample::Query.new(@search_params.except(:metadata).merge({ project_ids: [@project.id] }))
Expand All @@ -160,11 +163,28 @@ def search_params
params[:q].present? ? params[:q].to_unsafe_h : {}).with_indifferent_access

if !updated_params.key?(:sort) ||
(updated_params[:metadata].to_i.zero? && updated_params[:sort]&.match?(/metadata_/))
(updated_params[:metadata_template] == 'none' && updated_params[:sort]&.match?(/metadata_/))
updated_params[:sort] = 'updated_at desc'
update_store(search_key, updated_params)
end
updated_params
end

def current_metadata_template
current_value = @search_params[:metadata_template] || 'none'

@metadata_template = if %w[none all].include?(current_value)
{
id: current_value,
name: t("shared.samples.metadata_templates.fields.#{current_value}")
}
else
template = MetadataTemplate.find_by(id: current_value)
{
id: template.id,
name: template.name
}
end
end
end
end
5 changes: 2 additions & 3 deletions app/controllers/workflow_executions/submissions_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,8 @@ def pipeline_selection
end

def create
fields_for_namespace(
namespace: Namespace.find_by(id: @namespace_id),
show_fields: true
fields_for_namespace_or_template(
namespace: Namespace.find_by(id: @namespace_id)
)
render status: :ok
end
Expand Down
4 changes: 4 additions & 0 deletions app/models/namespace.rb
Original file line number Diff line number Diff line change
Expand Up @@ -261,6 +261,10 @@ def metadata_fields
metadata_summary.keys
end

def metadata_templates
MetadataTemplate.where(namespace: self)
end

private

# Method to restore namespace routes when the namespace is restored
Expand Down
1 change: 0 additions & 1 deletion app/models/project.rb
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,6 @@ class Project < ApplicationRecord
delegate :parent, to: :namespace
delegate :puid, to: :namespace
delegate :metadata_summary, to: :namespace

ransack_alias :name, :namespace_name
ransack_alias :puid, :namespace_puid

Expand Down
1 change: 1 addition & 0 deletions app/models/sample/query.rb
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ class Sample::Query # rubocop:disable Style/ClassAndModuleChildren, Metrics/Clas
attribute :name_or_puid_cont, :string
attribute :name_or_puid_in, default: -> { [] }
attribute :project_ids, default: -> { [] }
attribute :metadata_template, :string, default: 'none'
attribute :groups, default: lambda {
[Sample::SearchGroup.new(conditions: [Sample::SearchCondition.new(field: '', operator: '', value: '')])]
}
Expand Down
1 change: 1 addition & 0 deletions app/policies/metadata_template_policy.rb
Original file line number Diff line number Diff line change
Expand Up @@ -40,3 +40,4 @@
relation.joins(:created_by).where(namespace_id: namespace_ids)
end
end

Check warning on line 43 in app/policies/metadata_template_policy.rb

View workflow job for this annotation

GitHub Actions / runner / rubocop

[rubocop] reported by reviewdog 🐶 1 trailing blank lines detected. Raw Output: app/policies/metadata_template_policy.rb:43:1: C: Layout/TrailingEmptyLines: 1 trailing blank lines detected.
2 changes: 1 addition & 1 deletion app/services/metadata_templates/destroy_service.rb
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ def initialize(user = nil, metadata_template = nil, params = {})
end

def execute
authorize! @metadata_template, to: :destroy_metadata_template?
authorize! @metadata_template.namespace, to: :destroy_metadata_templates?

@metadata_template.destroy

Expand Down
5 changes: 5 additions & 0 deletions app/views/groups/metadata_templates/list.turbo_stream.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
<ul>
<% @metadata_templates.each do |metadata_template| %>
<li><%= metadata_template.name %></li>
<% end %>
</ul>
6 changes: 5 additions & 1 deletion app/views/groups/samples/_table_filter.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,10 @@
open: @query.errors.any?,
status: @query.advanced_query?,
) %>
<%= render partial: "projects/samples/shared/metadata_toggle", locals: { form: f } %>
<%= render MetadataTemplatesDropdownComponent.new(
metadata_templates: @metadata_templates,
form: f,
selected: @search_params[:metadata_template],
) %>
<%= f.submit hidden: true %>
<% end %>
9 changes: 8 additions & 1 deletion app/views/groups/samples/index.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@
},
class:
"flex items-center px-4 py-2 bg-slate-100 text-slate-600 dark:bg-slate-600 dark:text-slate-300
border-slate-100 dark:border-slate-600 pointer-events-none cursor-not-allowed",
border-slate-100 dark:border-slate-600 pointer-events-none cursor-not-allowed",
) %>
<% else %>
<% dropdown.with_item(
Expand Down Expand Up @@ -92,6 +92,13 @@
<div id="table-filter" class="flex grow-0">
<%= render partial: "table_filter", locals: { query: @query } %>
</div>

<%= render partial: "shared/samples/metadata_template_dropdown",
locals: {
url: list_group_metadata_templates_url(@group),
metadata_template: @metadata_template,
pagy: @pagy,
} %>
</div>

<%= render partial: "table",
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
<button class="btn btn-primary"><%= @metadata_template.name %></button>
Loading
Loading