From 2272f9b41a7e419c46f3b90d0ea56b6c2dafb47d Mon Sep 17 00:00:00 2001 From: Arnaud Levy <contact@arnaudlevy.com> Date: Thu, 2 Jun 2022 17:41:57 +0200 Subject: [PATCH] wip --- app/models/communication/block.rb | 13 ++---------- .../communication/block/component/base.rb | 20 +++++++++++++++++++ .../block/component/rich_text.rb | 2 ++ .../block/{template.rb => template/base.rb} | 12 ++++++++--- .../block/template/call_to_action.rb | 2 +- .../communication/block/template/chapter.rb | 2 +- .../communication/block/template/datatable.rb | 2 +- .../block/template/definition.rb | 2 +- .../communication/block/template/embed.rb | 2 +- .../communication/block/template/file.rb | 2 +- .../communication/block/template/gallery.rb | 2 +- .../communication/block/template/image.rb | 2 +- .../block/template/key_figure.rb | 2 +- .../block/template/organization_chart.rb | 2 +- .../communication/block/template/page.rb | 2 +- .../communication/block/template/partner.rb | 2 +- .../communication/block/template/post.rb | 2 +- .../block/template/testimonial.rb | 2 +- .../communication/block/template/timeline.rb | 2 +- .../communication/block/template/video.rb | 2 +- 20 files changed, 49 insertions(+), 30 deletions(-) create mode 100644 app/models/communication/block/component/base.rb create mode 100644 app/models/communication/block/component/rich_text.rb rename app/models/communication/block/{template.rb => template/base.rb} (89%) diff --git a/app/models/communication/block.rb b/app/models/communication/block.rb index 44c0606c0..27dc22dc0 100644 --- a/app/models/communication/block.rb +++ b/app/models/communication/block.rb @@ -62,14 +62,11 @@ class Communication::Block < ApplicationRecord after_commit :save_and_sync_about, on: [:update, :destroy] def data=(value) - # Symbol does not work (:data) - attributes['data'] = default_data - # Template data setter will write properly sanitized values to block data - template.data = value + attributes['data'] = template.parse(value).to_json end def data - attributes['data'] ||= default_data + template.to_json end def git_dependencies @@ -91,12 +88,6 @@ class Communication::Block < ApplicationRecord protected - def default_data - { - 'elements': [] - } - end - def attach_template_blobs self.template_images = template.active_storage_blobs end diff --git a/app/models/communication/block/component/base.rb b/app/models/communication/block/component/base.rb new file mode 100644 index 000000000..f27eeead1 --- /dev/null +++ b/app/models/communication/block/component/base.rb @@ -0,0 +1,20 @@ +class Communication::Block::Component::Base + attr_reader :property, :template + + def initialize(property, template) + @property = property.to_s + @template = template + end + + def value + data[property] + end + + def value=(v) + data[property] = v + end + + def data + template.data + end +end diff --git a/app/models/communication/block/component/rich_text.rb b/app/models/communication/block/component/rich_text.rb new file mode 100644 index 000000000..587c0b946 --- /dev/null +++ b/app/models/communication/block/component/rich_text.rb @@ -0,0 +1,2 @@ +class Communication::Block::Component::RichText < Communication::Block::Component::Base +end diff --git a/app/models/communication/block/template.rb b/app/models/communication/block/template/base.rb similarity index 89% rename from app/models/communication/block/template.rb rename to app/models/communication/block/template/base.rb index 0f3ba1c87..59922847b 100644 --- a/app/models/communication/block/template.rb +++ b/app/models/communication/block/template/base.rb @@ -1,4 +1,4 @@ -class Communication::Block::Template +class Communication::Block::Template::Base class_attribute :fields attr_reader :block @@ -36,11 +36,11 @@ class Communication::Block::Template sanitizer_type = sanitizers[kind] class_eval <<-CODE, __FILE__, __LINE__ + 1 def #{property} - #{ kind == :image ? "extract_image_alt_and_credit(data, '#{property}')" : "data['#{property}']" } + Communication::Block::Component::#{kind.classify}.new(property, self).value end def #{property}=(value) - data['#{property}'] = #{ sanitizer_type ? "Osuny::Sanitizer.sanitize(value, '#{sanitizer_type}')" : "value" } + Communication::Block::Component::#{kind.classify}.new(property, self).value = value end CODE end @@ -73,6 +73,12 @@ class Communication::Block::Template protected + def default_data + { + 'elements': [] + } + end + def update_field(field, json) name = field[:name] value = json["#{name}"] diff --git a/app/models/communication/block/template/call_to_action.rb b/app/models/communication/block/template/call_to_action.rb index 0bbdb6071..4d82b7985 100644 --- a/app/models/communication/block/template/call_to_action.rb +++ b/app/models/communication/block/template/call_to_action.rb @@ -1,4 +1,4 @@ -class Communication::Block::Template::CallToAction < Communication::Block::Template +class Communication::Block::Template::CallToAction < Communication::Block::Template::Base def sanitized_data { "text" => Osuny::Sanitizer.sanitize(text), diff --git a/app/models/communication/block/template/chapter.rb b/app/models/communication/block/template/chapter.rb index d2e850c06..a744759c1 100644 --- a/app/models/communication/block/template/chapter.rb +++ b/app/models/communication/block/template/chapter.rb @@ -1,4 +1,4 @@ -class Communication::Block::Template::Chapter < Communication::Block::Template +class Communication::Block::Template::Chapter < Communication::Block::Template::Base has_rich_text :text has_rich_text :notes has_image :image diff --git a/app/models/communication/block/template/datatable.rb b/app/models/communication/block/template/datatable.rb index 6a764e8e1..579750d21 100644 --- a/app/models/communication/block/template/datatable.rb +++ b/app/models/communication/block/template/datatable.rb @@ -1,4 +1,4 @@ -class Communication::Block::Template::Datatable < Communication::Block::Template +class Communication::Block::Template::Datatable < Communication::Block::Template::Base def build_git_dependencies end end diff --git a/app/models/communication/block/template/definition.rb b/app/models/communication/block/template/definition.rb index 63b6777e5..2b9e596ee 100644 --- a/app/models/communication/block/template/definition.rb +++ b/app/models/communication/block/template/definition.rb @@ -1,4 +1,4 @@ -class Communication::Block::Template::Definition < Communication::Block::Template +class Communication::Block::Template::Definition < Communication::Block::Template::Base def definitions @definitions ||= elements.map { |element| definition(element) } .compact diff --git a/app/models/communication/block/template/embed.rb b/app/models/communication/block/template/embed.rb index 69df31672..556f425af 100644 --- a/app/models/communication/block/template/embed.rb +++ b/app/models/communication/block/template/embed.rb @@ -1,4 +1,4 @@ -class Communication::Block::Template::Embed < Communication::Block::Template +class Communication::Block::Template::Embed < Communication::Block::Template::Base def build_git_dependencies end diff --git a/app/models/communication/block/template/file.rb b/app/models/communication/block/template/file.rb index ad69e9def..b1172690a 100644 --- a/app/models/communication/block/template/file.rb +++ b/app/models/communication/block/template/file.rb @@ -1,4 +1,4 @@ -class Communication::Block::Template::File < Communication::Block::Template +class Communication::Block::Template::File < Communication::Block::Template::Base def build_git_dependencies files.each do |file| add_dependency file.blob diff --git a/app/models/communication/block/template/gallery.rb b/app/models/communication/block/template/gallery.rb index 963063b9f..38c7d1b3d 100644 --- a/app/models/communication/block/template/gallery.rb +++ b/app/models/communication/block/template/gallery.rb @@ -1,4 +1,4 @@ -class Communication::Block::Template::Gallery < Communication::Block::Template +class Communication::Block::Template::Gallery < Communication::Block::Template::Base LAYOUTS = [:grid, :carousel].freeze diff --git a/app/models/communication/block/template/image.rb b/app/models/communication/block/template/image.rb index f6968d1ee..262bf513a 100644 --- a/app/models/communication/block/template/image.rb +++ b/app/models/communication/block/template/image.rb @@ -1,4 +1,4 @@ -class Communication::Block::Template::Image < Communication::Block::Template +class Communication::Block::Template::Image < Communication::Block::Template::Base def sanitized_data { "text" => Osuny::Sanitizer.sanitize(text), diff --git a/app/models/communication/block/template/key_figure.rb b/app/models/communication/block/template/key_figure.rb index 0c4abee7d..386547355 100644 --- a/app/models/communication/block/template/key_figure.rb +++ b/app/models/communication/block/template/key_figure.rb @@ -1,4 +1,4 @@ -class Communication::Block::Template::KeyFigure < Communication::Block::Template +class Communication::Block::Template::KeyFigure < Communication::Block::Template::Base def build_git_dependencies end diff --git a/app/models/communication/block/template/organization_chart.rb b/app/models/communication/block/template/organization_chart.rb index 0164c35af..aebeb9545 100644 --- a/app/models/communication/block/template/organization_chart.rb +++ b/app/models/communication/block/template/organization_chart.rb @@ -1,4 +1,4 @@ -class Communication::Block::Template::OrganizationChart < Communication::Block::Template +class Communication::Block::Template::OrganizationChart < Communication::Block::Template::Base def build_git_dependencies add_dependency persons persons.each do |person| diff --git a/app/models/communication/block/template/page.rb b/app/models/communication/block/template/page.rb index 103560f6d..ef482aa88 100644 --- a/app/models/communication/block/template/page.rb +++ b/app/models/communication/block/template/page.rb @@ -1,4 +1,4 @@ -class Communication::Block::Template::Page < Communication::Block::Template +class Communication::Block::Template::Page < Communication::Block::Template::Base has_rich_text :text LAYOUTS = [:grid, :list, :cards].freeze diff --git a/app/models/communication/block/template/partner.rb b/app/models/communication/block/template/partner.rb index 7a30863ea..4a19277ae 100644 --- a/app/models/communication/block/template/partner.rb +++ b/app/models/communication/block/template/partner.rb @@ -1,4 +1,4 @@ -class Communication::Block::Template::Partner < Communication::Block::Template +class Communication::Block::Template::Partner < Communication::Block::Template::Base def build_git_dependencies add_dependency active_storage_blobs add_dependency organizations diff --git a/app/models/communication/block/template/post.rb b/app/models/communication/block/template/post.rb index b25c07e1a..be7aa8961 100644 --- a/app/models/communication/block/template/post.rb +++ b/app/models/communication/block/template/post.rb @@ -1,4 +1,4 @@ -class Communication::Block::Template::Post < Communication::Block::Template +class Communication::Block::Template::Post < Communication::Block::Template::Base def build_git_dependencies add_dependency category unless category.nil? add_dependency selected_posts diff --git a/app/models/communication/block/template/testimonial.rb b/app/models/communication/block/template/testimonial.rb index 85a231cdd..4da01d1b9 100644 --- a/app/models/communication/block/template/testimonial.rb +++ b/app/models/communication/block/template/testimonial.rb @@ -1,4 +1,4 @@ -class Communication::Block::Template::Testimonial < Communication::Block::Template +class Communication::Block::Template::Testimonial < Communication::Block::Template::Base def build_git_dependencies add_dependency active_storage_blobs end diff --git a/app/models/communication/block/template/timeline.rb b/app/models/communication/block/template/timeline.rb index 94c030a84..8dcc3d98a 100644 --- a/app/models/communication/block/template/timeline.rb +++ b/app/models/communication/block/template/timeline.rb @@ -1,4 +1,4 @@ -class Communication::Block::Template::Timeline < Communication::Block::Template +class Communication::Block::Template::Timeline < Communication::Block::Template::Base def description "#{data['description']}" diff --git a/app/models/communication/block/template/video.rb b/app/models/communication/block/template/video.rb index 9420e9468..a1f8c3115 100644 --- a/app/models/communication/block/template/video.rb +++ b/app/models/communication/block/template/video.rb @@ -1,4 +1,4 @@ -class Communication::Block::Template::Video < Communication::Block::Template +class Communication::Block::Template::Video < Communication::Block::Template::Base has_string :url has_text :transcription -- GitLab