From 75354a6d5b6630f1276161dbb7886b4ba8f95c60 Mon Sep 17 00:00:00 2001 From: zhephyn Date: Wed, 9 Apr 2025 01:44:29 +0300 Subject: [PATCH 1/9] Add pretty_generated option for code fields --- lib/avo/fields/base_field.rb | 1 + lib/avo/fields/code_field.rb | 10 ++++++++++ 2 files changed, 11 insertions(+) diff --git a/lib/avo/fields/base_field.rb b/lib/avo/fields/base_field.rb index 7c1aa055d7..84235d28ad 100644 --- a/lib/avo/fields/base_field.rb +++ b/lib/avo/fields/base_field.rb @@ -89,6 +89,7 @@ def initialize(id, **args, &block) @for_attribute = args[:for_attribute] @meta = args[:meta] @copyable = args[:copyable] || false + @pretty_generated = args[:pretty_generated] || false @args = args diff --git a/lib/avo/fields/code_field.rb b/lib/avo/fields/code_field.rb index 68c0d66180..d7f08cb5b6 100644 --- a/lib/avo/fields/code_field.rb +++ b/lib/avo/fields/code_field.rb @@ -12,6 +12,16 @@ def initialize(id, **args, &block) hide_on :index super(id, **args, &block) + + if @pretty_generated + format_using = -> { + JSON.pretty_generate(JSON.parse(value.to_json)) + } + + update_using = -> { + JSON.parse(value) + } + end @language = args[:language].present? ? args[:language].to_s : "javascript" @theme = args[:theme].present? ? args[:theme].to_s : "default" From f5d5baa66e8fd8bccc6a8f69078a276d2aa7693e Mon Sep 17 00:00:00 2001 From: zhephyn Date: Wed, 9 Apr 2025 03:39:01 +0300 Subject: [PATCH 2/9] Fix Linting Errors --- lib/avo/fields/code_field.rb | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/lib/avo/fields/code_field.rb b/lib/avo/fields/code_field.rb index d7f08cb5b6..e6e1fbde31 100644 --- a/lib/avo/fields/code_field.rb +++ b/lib/avo/fields/code_field.rb @@ -11,18 +11,18 @@ class CodeField < BaseField def initialize(id, **args, &block) hide_on :index - super(id, **args, &block) - - if @pretty_generated - format_using = -> { - JSON.pretty_generate(JSON.parse(value.to_json)) - } - - update_using = -> { + if args[:pretty_generated] + args[:format_using] ||= lambda do + JSON.pretty_generate(JSON.parse(value.to_json)) + end + + args[:update_using] ||= lambda do JSON.parse(value) - } + end end + super(id, **args, &block) + @language = args[:language].present? ? args[:language].to_s : "javascript" @theme = args[:theme].present? ? args[:theme].to_s : "default" @height = args[:height].present? ? args[:height].to_s : "auto" From 2a01109ebb4bcf6d49f22c1b2c2e617010930ad9 Mon Sep 17 00:00:00 2001 From: zhephyn Date: Wed, 9 Apr 2025 03:49:52 +0300 Subject: [PATCH 3/9] Fix Trailing WhiteSpace Lint Error --- lib/avo/fields/code_field.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/avo/fields/code_field.rb b/lib/avo/fields/code_field.rb index e6e1fbde31..6af316ea4f 100644 --- a/lib/avo/fields/code_field.rb +++ b/lib/avo/fields/code_field.rb @@ -15,7 +15,7 @@ def initialize(id, **args, &block) args[:format_using] ||= lambda do JSON.pretty_generate(JSON.parse(value.to_json)) end - + args[:update_using] ||= lambda do JSON.parse(value) end From 7c270fdc703c654bad3f6a08243a4d6829b5ed1d Mon Sep 17 00:00:00 2001 From: zhephyn Date: Mon, 14 Apr 2025 07:29:18 +0300 Subject: [PATCH 4/9] Refactor to remove lambda and add tests --- lib/avo/fields/base_field.rb | 1 - lib/avo/fields/code_field.rb | 9 ++---- spec/system/avo/code_field_spec.rb | 45 ++++++++++++++++++++++++++++++ 3 files changed, 47 insertions(+), 8 deletions(-) diff --git a/lib/avo/fields/base_field.rb b/lib/avo/fields/base_field.rb index 84235d28ad..7c1aa055d7 100644 --- a/lib/avo/fields/base_field.rb +++ b/lib/avo/fields/base_field.rb @@ -89,7 +89,6 @@ def initialize(id, **args, &block) @for_attribute = args[:for_attribute] @meta = args[:meta] @copyable = args[:copyable] || false - @pretty_generated = args[:pretty_generated] || false @args = args diff --git a/lib/avo/fields/code_field.rb b/lib/avo/fields/code_field.rb index 6af316ea4f..e1f3014e86 100644 --- a/lib/avo/fields/code_field.rb +++ b/lib/avo/fields/code_field.rb @@ -12,13 +12,8 @@ def initialize(id, **args, &block) hide_on :index if args[:pretty_generated] - args[:format_using] ||= lambda do - JSON.pretty_generate(JSON.parse(value.to_json)) - end - - args[:update_using] ||= lambda do - JSON.parse(value) - end + args[:format_using] ||= -> {JSON.pretty_generate(JSON.parse(value.to_json))} + args[:update_using] ||= -> {JSON.parse(value)} end super(id, **args, &block) diff --git a/spec/system/avo/code_field_spec.rb b/spec/system/avo/code_field_spec.rb index 595a61c333..b46f4cebdf 100644 --- a/spec/system/avo/code_field_spec.rb +++ b/spec/system/avo/code_field_spec.rb @@ -77,6 +77,51 @@ end end + describe "with pretty_generated option for a JSON code field" do + before do + Avo::Resources::City.with_temporary_items do + field :metadata, as: :code, pretty_generated: true + end + end + + after do + Avo::Resources::City.restore_items_from_backup + end + + let (:metadata) do + '{ + "name": "New York", + "country": "United States", + "population": 8419600, + "coordinates": { + "latitude": 40.7128, + "longitude": -74.006 + }, + "timezone": "America/New_York", + "climate": { + "type": "humid subtropical", + "average_temperature_celsius": 13.1 + }, + "points_of_interest": [ + "Statue of Liberty", + "Central Park", + "Empire State Building" + ] + }' + end + it "correctly formats JSON code on create and displays it in a pretty way on the show page" do + visit "/admin/resources/cities/new" + wait_for_loaded + + within find_field_element("metadata") do + fill_in_editor_field(metadata.to_json) + end + save + expect(find_field_value_element("metadata")).to have_text(JSON.pretty_generate(metadata)) + end + + end + def fill_in_editor_field(text) within ".CodeMirror" do current_scope.click From a9e5c3645004a1e249cb5b2d1f127704be89da1c Mon Sep 17 00:00:00 2001 From: zhephyn Date: Mon, 14 Apr 2025 08:31:04 +0300 Subject: [PATCH 5/9] Fix Linter issues --- lib/avo/fields/code_field.rb | 4 ++-- spec/system/avo/code_field_spec.rb | 7 +++---- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/lib/avo/fields/code_field.rb b/lib/avo/fields/code_field.rb index e1f3014e86..ef9364579a 100644 --- a/lib/avo/fields/code_field.rb +++ b/lib/avo/fields/code_field.rb @@ -12,8 +12,8 @@ def initialize(id, **args, &block) hide_on :index if args[:pretty_generated] - args[:format_using] ||= -> {JSON.pretty_generate(JSON.parse(value.to_json))} - args[:update_using] ||= -> {JSON.parse(value)} + args[:format_using] ||= -> { JSON.pretty_generate(JSON.parse(value.to_json)) } + args[:update_using] ||= -> { JSON.parse(value) } end super(id, **args, &block) diff --git a/spec/system/avo/code_field_spec.rb b/spec/system/avo/code_field_spec.rb index b46f4cebdf..c551c353ee 100644 --- a/spec/system/avo/code_field_spec.rb +++ b/spec/system/avo/code_field_spec.rb @@ -78,17 +78,17 @@ end describe "with pretty_generated option for a JSON code field" do - before do + before do Avo::Resources::City.with_temporary_items do field :metadata, as: :code, pretty_generated: true end end - after do + after do Avo::Resources::City.restore_items_from_backup end - let (:metadata) do + let(:metadata) do '{ "name": "New York", "country": "United States", @@ -119,7 +119,6 @@ save expect(find_field_value_element("metadata")).to have_text(JSON.pretty_generate(metadata)) end - end def fill_in_editor_field(text) From abb79243ffb5f584de911c256cbbfbf3f8532c1a Mon Sep 17 00:00:00 2001 From: Paul Bob Date: Mon, 14 Apr 2025 10:40:57 +0300 Subject: [PATCH 6/9] quick fix --- lib/avo/fields/code_field.rb | 2 +- spec/dummy/app/avo/resources/city.rb | 14 +------------- spec/system/avo/code_field_spec.rb | 19 ++++++++++++++----- 3 files changed, 16 insertions(+), 19 deletions(-) diff --git a/lib/avo/fields/code_field.rb b/lib/avo/fields/code_field.rb index ef9364579a..6de470c133 100644 --- a/lib/avo/fields/code_field.rb +++ b/lib/avo/fields/code_field.rb @@ -12,7 +12,7 @@ def initialize(id, **args, &block) hide_on :index if args[:pretty_generated] - args[:format_using] ||= -> { JSON.pretty_generate(JSON.parse(value.to_json)) } + args[:format_using] ||= -> { value.blank? ? value : JSON.pretty_generate(value) } args[:update_using] ||= -> { JSON.parse(value) } end diff --git a/spec/dummy/app/avo/resources/city.rb b/spec/dummy/app/avo/resources/city.rb index 2ccbeb66b7..5c4e5ff097 100644 --- a/spec/dummy/app/avo/resources/city.rb +++ b/spec/dummy/app/avo/resources/city.rb @@ -61,19 +61,7 @@ def base_fields as: :trix, attachment_key: :description_file, visible: -> { resource.params[:show_native_fields].blank? } - field :metadata, - as: :code, - format_using: -> { - if view.edit? - JSON.generate(value) - else - value - end - }, - update_using: -> do - ActiveSupport::JSON.decode(value) - rescue JSON::ParserError - end + field :metadata, as: :code, pretty_generated: true field :created_at, as: :date_time, filterable: true end diff --git a/spec/system/avo/code_field_spec.rb b/spec/system/avo/code_field_spec.rb index c551c353ee..a7530fd778 100644 --- a/spec/system/avo/code_field_spec.rb +++ b/spec/system/avo/code_field_spec.rb @@ -89,7 +89,7 @@ end let(:metadata) do - '{ + { "name": "New York", "country": "United States", "population": 8419600, @@ -107,17 +107,26 @@ "Central Park", "Empire State Building" ] - }' + } end - it "correctly formats JSON code on create and displays it in a pretty way on the show page" do + + it "correctly formats JSON code on create / edit and displays it in a pretty way on the show page" do visit "/admin/resources/cities/new" wait_for_loaded within find_field_element("metadata") do - fill_in_editor_field(metadata.to_json) + fill_in_editor_field(JSON.pretty_generate(metadata)) end + save - expect(find_field_value_element("metadata")).to have_text(JSON.pretty_generate(metadata)) + + json_text = page.evaluate_script('document.querySelector(".CodeMirror").CodeMirror.getValue()') + expect(JSON.parse(json_text, symbolize_names: true)).to eq(metadata) + + click_on "Edit" + + json_text = page.evaluate_script('document.querySelector(".CodeMirror").CodeMirror.getValue()') + expect(JSON.parse(json_text, symbolize_names: true)).to eq(metadata) end end From 7756cb825aa7059fd6ed970c818b94d8f4b93ad9 Mon Sep 17 00:00:00 2001 From: Paul Bob Date: Mon, 14 Apr 2025 10:46:53 +0300 Subject: [PATCH 7/9] lint --- spec/system/avo/code_field_spec.rb | 30 +++++++++++------------------- 1 file changed, 11 insertions(+), 19 deletions(-) diff --git a/spec/system/avo/code_field_spec.rb b/spec/system/avo/code_field_spec.rb index a7530fd778..e8f1243fed 100644 --- a/spec/system/avo/code_field_spec.rb +++ b/spec/system/avo/code_field_spec.rb @@ -78,31 +78,23 @@ end describe "with pretty_generated option for a JSON code field" do - before do - Avo::Resources::City.with_temporary_items do - field :metadata, as: :code, pretty_generated: true - end - end - after do - Avo::Resources::City.restore_items_from_backup - end let(:metadata) do { - "name": "New York", - "country": "United States", - "population": 8419600, - "coordinates": { - "latitude": 40.7128, - "longitude": -74.006 + name: "New York", + country: "United States", + population: 8419600, + coordinates: { + latitude: 40.7128, + longitude: -74.006 }, - "timezone": "America/New_York", - "climate": { - "type": "humid subtropical", - "average_temperature_celsius": 13.1 + timezone: "America/New_York", + climate: { + type: "humid subtropical", + average_temperature_celsius: 13.1 }, - "points_of_interest": [ + points_of_interest: [ "Statue of Liberty", "Central Park", "Empire State Building" From 652f419a600a3844a08f9b3b5025bc8e3214f36c Mon Sep 17 00:00:00 2001 From: Paul Bob Date: Mon, 14 Apr 2025 10:51:12 +0300 Subject: [PATCH 8/9] lint --- spec/system/avo/code_field_spec.rb | 1 - 1 file changed, 1 deletion(-) diff --git a/spec/system/avo/code_field_spec.rb b/spec/system/avo/code_field_spec.rb index e8f1243fed..d445c235d1 100644 --- a/spec/system/avo/code_field_spec.rb +++ b/spec/system/avo/code_field_spec.rb @@ -79,7 +79,6 @@ describe "with pretty_generated option for a JSON code field" do - let(:metadata) do { name: "New York", From 1e2f90bb47cb43b5ae224cab4e5f75c49aed753d Mon Sep 17 00:00:00 2001 From: Paul Bob Date: Mon, 14 Apr 2025 10:53:38 +0300 Subject: [PATCH 9/9] lint --- spec/system/avo/code_field_spec.rb | 1 - 1 file changed, 1 deletion(-) diff --git a/spec/system/avo/code_field_spec.rb b/spec/system/avo/code_field_spec.rb index d445c235d1..ce05da05f3 100644 --- a/spec/system/avo/code_field_spec.rb +++ b/spec/system/avo/code_field_spec.rb @@ -78,7 +78,6 @@ end describe "with pretty_generated option for a JSON code field" do - let(:metadata) do { name: "New York",