Move autocomplete_options from FilterComponent to filter classes. wp/74380

As per review feedback from oliverguenther.
This commit is contained in:
David F
2026-05-22 13:59:16 +02:00
committed by David.
parent 81275741ee
commit 3897c25139
16 changed files with 129 additions and 134 deletions
+2 -87
View File
@@ -100,22 +100,8 @@ module Filter
# @param filter [QueryFilter] the filter for which we want to pass additional attributes
# @return [Hash] the additional attributes for the filter, yielded in map_filter
def additional_filter_attributes(filter)
case filter
when Queries::Filters::Shared::ProjectFilter::Required,
Queries::Filters::Shared::ProjectFilter::Optional
{ autocomplete_options: project_autocomplete_options }
when Queries::Filters::Shared::CustomFields::User
{ autocomplete_options: user_autocomplete_options }
when Queries::Filters::Shared::CustomFields::ListOptional
{ autocomplete_options: custom_field_list_autocomplete_options(filter) }
when Queries::Filters::Shared::CustomFields::Hierarchy
{ autocomplete_options: custom_field_hierarchy_autocomplete_options(filter) }
when Queries::Projects::Filters::ProjectStatusFilter,
Queries::Projects::Filters::TypeFilter
{ autocomplete_options: list_autocomplete_options(filter) }
else
{}
end
opts = filter.autocomplete_options
opts.any? ? { autocomplete_options: opts } : {}
end
def filter_form_class(filter, additional_attributes)
@@ -131,76 +117,5 @@ module Filter
Filters::Inputs::TextForm
end
end
def custom_field_list_autocomplete_options(filter)
all_items = custom_field_allowed_items(filter)
selected = filter.values
options = { items: all_items }
options[:groupBy] = "project_name" if filter.custom_field.version?
autocomplete_options.merge(options).merge(model: all_items.select { |item| selected.include?(item[:id]) })
end
def custom_field_allowed_items(filter)
if filter.custom_field.version?
filter.allowed_values.map { |name, id, project_name| { name:, id:, project_name: } }
else
filter.allowed_values.map { |name, id| { name:, id: } }
end
end
def custom_field_hierarchy_autocomplete_options(filter)
items = filter.allowed_values.map do |name, id|
path = name.split(" / ")
{ name: path.last, id:, depth: path.length - 1 }
end
selected = filter.values
autocomplete_options.merge({ items: }).merge(model: items.select { |item| selected.include?(item[:id]) })
end
def list_autocomplete_options(filter)
all_items = filter.allowed_values.map { |name, id| { name:, id: } }
selected = filter.values
autocomplete_options.merge(
items: all_items,
model: all_items.select { |item| selected.include?(item[:id]) }
)
end
def autocomplete_options
{
component: "opce-autocompleter",
bindValue: "id",
bindLabel: "name",
hideSelected: true,
defaultData: false
}
end
def project_autocomplete_options
{
component: "opce-project-autocompleter",
resource: "projects",
filters: [
{ name: "active", operator: "=", values: ["t"] }
]
}
end
def user_autocomplete_options
{
component: "opce-user-autocompleter",
hideSelected: true,
defaultData: false,
placeholder: I18n.t(:label_user_search),
resource: "principals",
url: ::API::V3::Utilities::PathHelper::ApiV3Path.principals,
filters: [
{ name: "status", operator: "!", values: [Principal.statuses["locked"].to_s] }
],
searchKey: "any_name_attribute",
focusDirectly: false
}
end
end
end
@@ -38,28 +38,5 @@ module Users
.grep_v(Queries::Users::Filters::BlockedFilter)
.sort_by(&:human_name)
end
protected
def additional_filter_attributes(filter)
case filter
when Queries::Users::Filters::GroupFilter
{
autocomplete_options: {
component: "opce-user-autocompleter",
resource: "principals",
url: ::API::V3::Utilities::PathHelper::ApiV3Path.principals,
filters: [
{ name: "type", operator: "=", values: %w[Group] }
],
searchKey: "any_name_attribute",
inputValue: filter.values,
bindValue: "id"
}
}
else
super
end
end
end
end
+4
View File
@@ -182,6 +182,10 @@ class Queries::Filters::Base
errors.full_message(human_name, messages)
end
def autocomplete_options
{}
end
protected
def type_strategy
@@ -37,6 +37,23 @@ module Queries
true
end
def autocomplete_options
items = allowed_values.map do |name, id|
path = name.split(" / ")
{ name: path.last, id:, depth: path.length - 1 }
end
{
component: "opce-autocompleter",
bindValue: "id",
bindLabel: "name",
hideSelected: true,
defaultData: false,
items:,
model: items.select { |item| values.include?(item[:id]) }
}
end
def value_objects
CustomField::Hierarchy::Item
.where(id: @values)
@@ -59,6 +59,24 @@ module Queries::Filters::Shared
:list_optional
end
def autocomplete_options # rubocop:disable Metrics/AbcSize
all_items = if custom_field.version?
allowed_values.map { |name, id, project_name| { name:, id:, project_name: } }
else
allowed_values.map { |name, id| { name:, id: } }
end
options = { items: all_items }
options[:groupBy] = "project_name" if custom_field.version?
{
component: "opce-autocompleter",
bindValue: "id",
bindLabel: "name",
hideSelected: true,
defaultData: false
}.merge(options).merge(model: all_items.select { |item| values.include?(item[:id]) })
end
protected
def condition
@@ -75,8 +93,7 @@ module Queries::Filters::Shared
end
def customized_strategy?
operator_strategy == Queries::Operators::CustomFields::EqualsAll ||
operator_strategy == Queries::Operators::CustomFields::NotEqualsAll
[Queries::Operators::CustomFields::EqualsAll, Queries::Operators::CustomFields::NotEqualsAll].include?(operator_strategy)
end
def type_strategy_class
@@ -48,6 +48,22 @@ module Queries::Filters::Shared
vals + user_groups_added(vals)
end
def autocomplete_options
{
component: "opce-user-autocompleter",
hideSelected: true,
defaultData: false,
placeholder: I18n.t(:label_user_search),
resource: "principals",
url: ::API::V3::Utilities::PathHelper::ApiV3Path.principals,
filters: [
{ name: "status", operator: "!", values: [Principal.statuses["locked"].to_s] }
],
searchKey: "any_name_attribute",
focusDirectly: false
}
end
private
def group_members_added(vals)
@@ -51,6 +51,14 @@ module Queries::Filters::Shared::ProjectFilter::Optional
# harm.
@type_strategy ||= ::Queries::Filters::Strategies::IntegerListOptional.new(self)
end
def autocomplete_options
{
component: "opce-project-autocompleter",
resource: "projects",
filters: [{ name: "active", operator: "=", values: ["t"] }]
}
end
end
module ClassMethods
@@ -51,6 +51,14 @@ module Queries::Filters::Shared::ProjectFilter::Required
# harm.
@type_strategy ||= ::Queries::Filters::Strategies::IntegerList.new(self)
end
def autocomplete_options
{
component: "opce-project-autocompleter",
resource: "projects",
filters: [{ name: "active", operator: "=", values: ["t"] }]
}
end
end
module ClassMethods
@@ -41,6 +41,19 @@ class Queries::Projects::Filters::ProjectStatusFilter < Queries::Projects::Filte
:list_optional
end
def autocomplete_options
all_items = allowed_values.map { |name, id| { name:, id: } }
{
component: "opce-autocompleter",
bindValue: "id",
bindLabel: "name",
hideSelected: true,
defaultData: false,
items: all_items,
model: all_items.select { |item| values.include?(item[:id]) }
}
end
def where
operator_strategy.sql_for_field(values, model.table_name, :status_code)
end
@@ -45,6 +45,19 @@ class Queries::Projects::Filters::TypeFilter < Queries::Projects::Filters::Base
:list
end
def autocomplete_options
all_items = allowed_values.map { |name, id| { name:, id: } }
{
component: "opce-autocompleter",
bindValue: "id",
bindLabel: "name",
hideSelected: true,
defaultData: false,
items: all_items,
model: all_items.select { |item| values.include?(item[:id]) }
}
end
def self.key
:type_id
end
@@ -34,4 +34,16 @@ class Queries::Users::Filters::GroupFilter < Queries::Users::Filters::UserFilter
def human_name
I18n.t(:label_group)
end
def autocomplete_options
{
component: "opce-user-autocompleter",
resource: "principals",
url: ::API::V3::Utilities::PathHelper::ApiV3Path.principals,
filters: [{ name: "type", operator: "=", values: %w[Group] }],
searchKey: "any_name_attribute",
inputValue: values,
bindValue: "id"
}
end
end
@@ -28,9 +28,7 @@
# See COPYRIGHT and LICENSE files for more details.
# ++
module Meetings
# rubocop:disable OpenProject/AddPreviewForViewComponent
class MeetingFiltersComponent < Filter::FilterComponent
# rubocop:enable OpenProject/AddPreviewForViewComponent
options :project
def turbo_requests? = true
@@ -41,24 +39,6 @@ module Meetings
.sort_by(&:human_name)
end
protected
def additional_filter_attributes(filter)
case filter
when Queries::Meetings::Filters::AuthorFilter,
Queries::Meetings::Filters::AttendedUserFilter,
Queries::Meetings::Filters::InvitedUserFilter
{
autocomplete_options: {
component: "opce-user-autocompleter",
resource: "principals"
}
}
else
super
end
end
private
def allowed_filter?(filter)
@@ -1,4 +1,5 @@
# frozen_string_literal: true
#-- copyright
# OpenProject is an open source project management software.
# Copyright (C) the OpenProject GmbH
@@ -76,6 +77,10 @@ class Queries::Meetings::Filters::AttendedUserFilter < Queries::Meetings::Filter
:participants
end
def autocomplete_options
{ component: "opce-user-autocompleter", resource: "principals" }
end
def self.key
:attended_user_id
end
@@ -1,4 +1,5 @@
# frozen_string_literal: true
#-- copyright
# OpenProject is an open source project management software.
# Copyright (C) the OpenProject GmbH
@@ -38,6 +39,10 @@ class Queries::Meetings::Filters::AuthorFilter < Queries::Meetings::Filters::Mee
@type_strategy ||= ::Queries::Filters::Strategies::IntegerListOptional.new(self)
end
def autocomplete_options
{ component: "opce-user-autocompleter", resource: "principals" }
end
def self.key
:author_id
end
@@ -1,4 +1,5 @@
# frozen_string_literal: true
#-- copyright
# OpenProject is an open source project management software.
# Copyright (C) the OpenProject GmbH
@@ -76,6 +77,10 @@ class Queries::Meetings::Filters::InvitedUserFilter < Queries::Meetings::Filters
:participants
end
def autocomplete_options
{ component: "opce-user-autocompleter", resource: "principals" }
end
def self.key
:invited_user_id
end
+2 -2
View File
@@ -93,7 +93,7 @@ module Pages
def filter_by_group(value)
open_filter_panel
unless page.has_css?("li.advanced-filters--filter[data-filter-name='group']:not(.hidden)")
unless page.has_css?(".advanced-filters--filter[data-filter-name='group']:not([hidden])")
select "Group", from: "add_filter_select"
end
@@ -134,7 +134,7 @@ module Pages
end
def within_filter(name, &)
within("li.advanced-filters--filter[data-filter-name='#{name}']:not(.hidden)", &)
within(".advanced-filters--filter[data-filter-name='#{name}']:not([hidden])", &)
end
def order_by(key)