From 04c0dffb26c639bd15ed1c934f2b3de587eea370 Mon Sep 17 00:00:00 2001 From: f Date: Fri, 19 Apr 2024 15:00:48 -0300 Subject: [PATCH 1/4] fix: ignorar has_one_nested --- app/models/metadata_has_one_nested.rb | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/app/models/metadata_has_one_nested.rb b/app/models/metadata_has_one_nested.rb index ed509013..2f3e8e02 100644 --- a/app/models/metadata_has_one_nested.rb +++ b/app/models/metadata_has_one_nested.rb @@ -8,4 +8,9 @@ class MetadataHasOneNested < MetadataHasOne def nested? true end + + # No tener conflictos con related + def related_methods + @related_methods ||= [].freeze + end end From b05e0356c17623c83967110111249619c313176a Mon Sep 17 00:00:00 2001 From: f Date: Fri, 19 Apr 2024 15:01:16 -0300 Subject: [PATCH 2/4] fix: incluir el post en la cache --- app/views/posts/_attributes_nested.haml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/app/views/posts/_attributes_nested.haml b/app/views/posts/_attributes_nested.haml index 33996aa3..83bcc51c 100644 --- a/app/views/posts/_attributes_nested.haml +++ b/app/views/posts/_attributes_nested.haml @@ -10,10 +10,9 @@ - next if attribute == :draft - next if attribute == inverse - metadata = post[attribute] - - type = metadata.type - - cache [metadata, I18n.locale] do - = render "posts/attributes/#{type}", + - cache [post, metadata, I18n.locale] do + = render "posts/attributes/#{metadata.type}", base: base, post: post, attribute: attribute, metadata: metadata, site: site, dir: dir, locale: locale, autofocus: false From bcf3925d9bb87089a14047f7b4a6f13897bd57af Mon Sep 17 00:00:00 2001 From: f Date: Fri, 19 Apr 2024 15:06:17 -0300 Subject: [PATCH 3/4] feat: poder modificar posts anidados --- app/services/post_service.rb | 3 ++- app/views/posts/attributes/_has_one_nested.haml | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/app/services/post_service.rb b/app/services/post_service.rb index 08a46ae7..90aa9401 100644 --- a/app/services/post_service.rb +++ b/app/services/post_service.rb @@ -52,6 +52,7 @@ PostService = Struct.new(:site, :usuarie, :post, :params, keyword_init: true) do rm = [] rm << post.path.value_was if post.path.changed? + create_nested_posts! post, params[:post] update_related_posts # Es importante que el artículo se guarde primero y luego los @@ -181,7 +182,7 @@ PostService = Struct.new(:site, :usuarie, :post, :params, keyword_init: true) do post.nested_attributes.each do |nested_attribute| nested_metadata = post[nested_attribute] # @todo find_or_initialize - nested_post = site.posts(lang: post.lang.value).build(layout: nested_metadata.nested) + nested_post = nested_metadata.has_one || site.posts(lang: post.lang.value).build(layout: nested_metadata.nested) nested_params = params.require(nested_attribute).permit(nested_post.params).to_hash # Completa la relación 1:1 diff --git a/app/views/posts/attributes/_has_one_nested.haml b/app/views/posts/attributes/_has_one_nested.haml index e98bff47..4aabf386 100644 --- a/app/views/posts/attributes/_has_one_nested.haml +++ b/app/views/posts/attributes/_has_one_nested.haml @@ -1,6 +1,6 @@ -- new_post = site.posts(lang: locale).build(layout: metadata.nested) +- nested_post = metadata.has_one || site.posts(lang: locale).build(layout: metadata.nested) - base = "#{base}[#{metadata.name}]" .form-group = render 'layouts/details', id: metadata.nested, summary: site.layouts[metadata.nested].humanized_name do - = render 'posts/attributes_nested', site: site, post: new_post, dir: dir, base: base, locale: locale, inverse: metadata.inverse + = render 'posts/attributes_nested', site: site, post: nested_post, dir: dir, base: base, locale: locale, inverse: metadata.inverse From 382f0545d128cb277a9d89b31fc88052bf1ae7fa Mon Sep 17 00:00:00 2001 From: f Date: Fri, 19 Apr 2024 15:06:56 -0300 Subject: [PATCH 4/4] feat: mostrar detalles como desplegable --- app/views/layouts/_details.haml | 17 ++++++++++ app/views/posts/_table.haml | 34 +++++++++++++++++++ .../posts/attribute_ro/_has_one_nested.haml | 10 +++--- app/views/posts/show.haml | 28 ++------------- 4 files changed, 58 insertions(+), 31 deletions(-) create mode 100644 app/views/layouts/_details.haml create mode 100644 app/views/posts/_table.haml diff --git a/app/views/layouts/_details.haml b/app/views/layouts/_details.haml new file mode 100644 index 00000000..9f8a4658 --- /dev/null +++ b/app/views/layouts/_details.haml @@ -0,0 +1,17 @@ +-# + Detail Cola de Moderación + + @param :id [String] El ID opcional sirve para mantener el historial de + cuál estaba abierto y recuperarlo al cargar la página + @param :summary [String] El resumen + @param :summary_class [String] Clases para el summary + +- local_assigns[:summary_class] ||= 'h3' +- local_assigns[:details_class] ||= 'py-2' + +%details.details{ id: local_assigns[:id], class: local_assigns[:details_class], data: { controller: 'details', action: 'toggle->details#store' } } + %summary.d-flex.flex-row.align-items-center.justify-content-between{ class: local_assigns[:summary_class] } + %span= summary + %span.hide-when-open ▶ + %span.show-when-open ▼ + = yield diff --git a/app/views/posts/_table.haml b/app/views/posts/_table.haml new file mode 100644 index 00000000..ff35aace --- /dev/null +++ b/app/views/posts/_table.haml @@ -0,0 +1,34 @@ +-# + Muestra una tabla con todos los atributos de un post + + @param site [Site] + @param locale [Symbol] + @param dir [String] + @param post [Post] + @param title [String] + +%table.table.table-condensed + %thead + %tr + %th.text-center{ colspan: 2 }= title + %tbody + - post.attributes.each do |attr| + - metadata = post[attr] + - next unless metadata.front_matter? + + - cache [post, metadata, I18n.locale] do + = render("posts/attribute_ro/#{metadata.type}", + post: post, attribute: attr, + metadata: metadata, + site: site, + locale: locale, + dir: dir) + +-# Mostrar todo lo que no va en el front_matter (el contenido) +- post.attributes.each do |attr| + - metadata = post[attr] + - next if metadata.front_matter? + + - cache [post, metadata, I18n.locale] do + %section.content.pb-3{ id: attr, dir: dir } + = metadata.to_s.html_safe diff --git a/app/views/posts/attribute_ro/_has_one_nested.haml b/app/views/posts/attribute_ro/_has_one_nested.haml index 425e659e..1c89474e 100644 --- a/app/views/posts/attribute_ro/_has_one_nested.haml +++ b/app/views/posts/attribute_ro/_has_one_nested.haml @@ -1,6 +1,6 @@ %tr{ id: attribute } - %th= post_label_t(attribute, post: post) - %td{ dir: dir, lang: locale } - - p = metadata.has_one - - if p - = link_to p.title.value, site_post_path(site, p.id) + %td{ dir: dir, lang: locale, colspan: 2 } + - if (p = metadata.has_one) + = render 'layouts/details', details_class: '', summary_class: 'font-weight-bold', summary: post_label_t(attribute, post: post) do + .mt-3 + = render 'posts/table', site: site, post: p, dir: dir, locale: locale, title: p.layout.humanized_name diff --git a/app/views/posts/show.haml b/app/views/posts/show.haml index 10900d67..6798c41c 100644 --- a/app/views/posts/show.haml +++ b/app/views/posts/show.haml @@ -1,4 +1,5 @@ - dir = @site.data.dig(params[:locale], 'dir') + .row.justify-content-center .col-md-8 %article.content.table-responsive-md @@ -6,29 +7,4 @@ edit_site_post_path(@site, @post.id), class: 'btn btn-secondary btn-block' - %table.table.table-condensed - %thead - %tr - %th.text-center{ colspan: 2 }= t('.front_matter') - %tbody - - @post.attributes.each do |attr| - - metadata = @post[attr] - - next unless metadata.front_matter? - - - cache [metadata, I18n.locale] do - = render("posts/attribute_ro/#{metadata.type}", - post: @post, attribute: attr, - metadata: metadata, - site: @site, - tags: all_html_tags, - locale: @locale, - dir: dir) - - -# Mostrar todo lo que no va en el front_matter (el contenido) - - @post.attributes.each do |attr| - - metadata = @post[attr] - - next if metadata.front_matter? - - - cache [metadata, I18n.locale] do - %section.content.pb-3{ id: attr, dir: dir } - = @post.public_send(attr).to_s.html_safe + = render 'table', dir: dir, site: @site, locale: @locale, post: @post, title: t('.front_matter')