algunos layouts pueden estar escondidos

This commit is contained in:
f 2020-11-27 20:53:14 -03:00
parent 1ac4e02bf9
commit 227e48681e
3 changed files with 46 additions and 9 deletions

View file

@ -1,8 +1,35 @@
# frozen_string_literal: true # frozen_string_literal: true
# Una plantilla agrupa metadatos que va a tener un artículo # Una plantilla agrupa metadatos que va a tener un artículo.
Layout = Struct.new(:site, :name, :metadata, keyword_init: true) do #
# TODO: Renombrar metadatos a atributos o campos, ahora se llaman de
# varias formas por todo el código.
Layout = Struct.new(:site, :name, :meta, :metadata, keyword_init: true) do
def value def value
name.to_s name.to_s
end end
# Busca la traducción del Layout en el sitio o intenta humanizarlo
# según Rails.
#
# @return [String]
def humanized_name
@humanized_name ||= site.i18n.dig('layouts', name.to_s) || name.to_s.humanize
end
# Detecta si el Layout no debería mostrarse
#
# @return [Boolean]
def hidden?
meta[:hidden].present?
end
# Los metadatos del Layout.
#
# TODO: Inicializar con valores por defecto o usar Hash#default_proc
#
# @return [Hash]
def meta
@meta ||= self[:meta] || {}
end
end end

View file

@ -193,6 +193,14 @@ class Site < ApplicationRecord
def data def data
read read
# Define los valores por defecto según la llave buscada
@jekyll.data.default_proc = proc do |data, key|
data[key] = case key
when 'layout' then {}
else nil
end
end
@jekyll.data @jekyll.data
end end
@ -259,19 +267,21 @@ class Site < ApplicationRecord
# Obtiene todas las plantillas de artículos # Obtiene todas las plantillas de artículos
# #
# @return { post: Layout } # @return [Hash] { post: Layout }
def layouts def layouts
# Crea un Struct dinámico cuyas llaves son los nombres de todos los # Crea un Struct dinámico cuyas llaves son los nombres de todos los
# layouts. Si pasamos un layout que no existe, obtenemos un # layouts. Si pasamos un layout que no existe, obtenemos un
# NoMethodError # NoMethodError
@layouts_struct ||= Struct.new(*layout_keys, keyword_init: true) @layouts_struct ||= Struct.new(*layout_keys, keyword_init: true)
@layouts ||= @layouts_struct.new(**data.fetch('layouts', {}).map do |name, metadata| @layouts ||= @layouts_struct.new(**data['layouts'].map do |name, metadata|
[name.to_sym, Layout.new(site: self, name: name.to_sym, metadata: metadata.with_indifferent_access)] [name.to_sym, Layout.new(site: self, name: name.to_sym, meta: metadata.delete('meta')&.with_indifferent_access, metadata: metadata.with_indifferent_access)]
end.to_h) end.to_h)
end end
# TODO: Si la estructura de datos no existe, vamos a producir una
# excepción.
def layout_keys def layout_keys
@layout_keys ||= data.fetch('layouts', {}).keys.map(&:to_sym) @layout_keys ||= data['layouts'].keys.map(&:to_sym)
end end
# Consulta si el Layout existe # Consulta si el Layout existe

View file

@ -12,9 +12,9 @@
%h3= t('posts.new') %h3= t('posts.new')
%ul %ul
- @site.layouts.to_h.keys.each do |layout| - @site.layouts.each do |layout|
%li= link_to @site.i18n.dig('layouts', layout.to_s) || layout.to_s.humanize, - next if layout.hidden?
new_site_post_path(@site, layout: layout) %li= link_to layout.humanized_name, new_site_post_path(@site, layout: layout.name)
- if policy(@site).edit? - if policy(@site).edit?
= link_to t('sites.edit.btn', site: @site.title), edit_site_path(@site), class: 'btn' = link_to t('sites.edit.btn', site: @site.title), edit_site_path(@site), class: 'btn'