From 565851b2185113bfe7f462a9ce7c9f4c95ec6d29 Mon Sep 17 00:00:00 2001 From: Paul Bob <69730720+Paul-Bob@users.noreply.github.com> Date: Wed, 22 Jan 2025 17:39:42 +0200 Subject: [PATCH] fix: tags field in select mode (#3603) * fix: tags field in select mode * fix test * fix test * fix test * add test * lint --- .../fields/tags_field/edit_component.html.erb | 2 +- lib/avo/fields/tags_field.rb | 4 +- spec/dummy/app/models/project.rb | 5 ++ spec/dummy/db/schema.rb | 2 +- spec/system/avo/tags_spec.rb | 52 +++++++++++++++++++ 5 files changed, 61 insertions(+), 4 deletions(-) diff --git a/app/components/avo/fields/tags_field/edit_component.html.erb b/app/components/avo/fields/tags_field/edit_component.html.erb index a798d2ea61..4ae0ffb319 100644 --- a/app/components/avo/fields/tags_field/edit_component.html.erb +++ b/app/components/avo/fields/tags_field/edit_component.html.erb @@ -30,6 +30,6 @@ disabled: disabled?, placeholder: @field.placeholder, style: @field.get_html(:style, view: view, element: :input), - value: @field.select_mode? ? @field.field_value.first : @field.field_value.to_json + value: @field.field_value.to_json %> <% end %> diff --git a/lib/avo/fields/tags_field.rb b/lib/avo/fields/tags_field.rb index 550acd3e0d..da598949fb 100644 --- a/lib/avo/fields/tags_field.rb +++ b/lib/avo/fields/tags_field.rb @@ -39,7 +39,7 @@ def field_value acts_as_taggable_on_values.map { |value| {value:} }.as_json else # Wrap the value on Array to ensure select mode compatibility - Array(value) || [] + Array.wrap(value) || [] end end @@ -78,7 +78,7 @@ def fill_acts_as_taggable(record, key, value, params) def whitelist_items return suggestions.to_json if enforce_suggestions - (suggestions + field_value).to_json + (suggestions + field_value).uniq.to_json end def suggestions diff --git a/spec/dummy/app/models/project.rb b/spec/dummy/app/models/project.rb index 454fe3aa34..45e137be48 100644 --- a/spec/dummy/app/models/project.rb +++ b/spec/dummy/app/models/project.rb @@ -51,4 +51,9 @@ class Project < ApplicationRecord def self.ransackable_attributes(auth_object = nil) ["budget", "country", "created_at", "description", "id", "meta", "name", "progress", "stage", "started_at", "status", "updated_at", "users_required"] end + + # Used to test tags on select mode with {value:,label:} + def dummy_field=(value) + TestBuddy.hi("dummy_field value is '#{value}'") + end end diff --git a/spec/dummy/db/schema.rb b/spec/dummy/db/schema.rb index 4dfeba42ca..04326b29e1 100644 --- a/spec/dummy/db/schema.rb +++ b/spec/dummy/db/schema.rb @@ -12,7 +12,7 @@ ActiveRecord::Schema[8.0].define(version: 2024_11_14_165947) do # These are extensions that must be enabled in order to support this database - enable_extension "plpgsql" + enable_extension "pg_catalog.plpgsql" create_table "action_text_rich_texts", force: :cascade do |t| t.string "name", null: false diff --git a/spec/system/avo/tags_spec.rb b/spec/system/avo/tags_spec.rb index d932d1ab78..76a320eed1 100644 --- a/spec/system/avo/tags_spec.rb +++ b/spec/system/avo/tags_spec.rb @@ -241,24 +241,76 @@ it "on index" do Avo::Resources::Project.with_temporary_items do field :stage, as: :tags, mode: :select + field :dummy_field, as: :tags, + mode: :select, + close_on_select: true, + format_using: -> { [{value: "a_c2", label: "activity_category2"}] }, + suggestions: [ + {value: "a_c1", label: "activity_category1"}, + {value: "a_c2", label: "activity_category2"}, + {value: "a_c3", label: "activity_category3"} + ] end visit avo.resources_projects_path + expect(page).to have_text("activity_category2") + expect(page).not_to have_text("a_c2") + projects.each do |project| expect(page).to have_text(project.stage) end + + Avo::Resources::Project.restore_items_from_backup end it "on show" do + Avo::Resources::Project.with_temporary_items do + field :stage, as: :tags, mode: :select + field :dummy_field, as: :tags, + mode: :select, + close_on_select: true, + format_using: -> { [{value: "a_c2", label: "activity_category2"}] }, + suggestions: [ + {value: "a_c1", label: "activity_category1"}, + {value: "a_c2", label: "activity_category2"}, + {value: "a_c3", label: "activity_category3"} + ] + end + visit avo.resources_project_path(projects.first) + expect(page).to have_text("activity_category2") + expect(page).not_to have_text("a_c2") + expect(page).to have_text(projects.first.stage) + + Avo::Resources::Project.restore_items_from_backup end it "on edit / update" do + expect(TestBuddy).to receive(:hi).with("dummy_field value is 'a_c2'").at_least :once + + Avo::Resources::Project.with_temporary_items do + field :stage, as: :tags, mode: :select + field :dummy_field, as: :tags, + mode: :select, + close_on_select: true, + format_using: -> { [{value: "a_c2", label: "activity_category2"}] }, + suggestions: [ + {value: "a_c1", label: "activity_category1"}, + {value: "a_c2", label: "activity_category2"}, + {value: "a_c3", label: "activity_category3"} + ] + end + visit avo.edit_resources_project_path(projects.first) + sleep 1 + + expect(page).not_to have_text("a_c2") + expect(page).to have_text("activity_category2") + expect(page).to have_text(projects.first.stage) click_on "Save"