algunos layouts pueden estar escondidos
This commit is contained in:
parent
1ac4e02bf9
commit
227e48681e
3 changed files with 46 additions and 9 deletions
|
@ -1,8 +1,35 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
# Una plantilla agrupa metadatos que va a tener un artículo
|
||||
Layout = Struct.new(:site, :name, :metadata, keyword_init: true) do
|
||||
# Una plantilla agrupa metadatos que va a tener un artículo.
|
||||
#
|
||||
# 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
|
||||
name.to_s
|
||||
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
|
||||
|
|
|
@ -193,6 +193,14 @@ class Site < ApplicationRecord
|
|||
def data
|
||||
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
|
||||
end
|
||||
|
||||
|
@ -259,19 +267,21 @@ class Site < ApplicationRecord
|
|||
|
||||
# Obtiene todas las plantillas de artículos
|
||||
#
|
||||
# @return { post: Layout }
|
||||
# @return [Hash] { post: Layout }
|
||||
def layouts
|
||||
# Crea un Struct dinámico cuyas llaves son los nombres de todos los
|
||||
# layouts. Si pasamos un layout que no existe, obtenemos un
|
||||
# NoMethodError
|
||||
@layouts_struct ||= Struct.new(*layout_keys, keyword_init: true)
|
||||
@layouts ||= @layouts_struct.new(**data.fetch('layouts', {}).map do |name, metadata|
|
||||
[name.to_sym, Layout.new(site: self, name: name.to_sym, metadata: metadata.with_indifferent_access)]
|
||||
@layouts ||= @layouts_struct.new(**data['layouts'].map do |name, metadata|
|
||||
[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
|
||||
|
||||
# TODO: Si la estructura de datos no existe, vamos a producir una
|
||||
# excepción.
|
||||
def layout_keys
|
||||
@layout_keys ||= data.fetch('layouts', {}).keys.map(&:to_sym)
|
||||
@layout_keys ||= data['layouts'].keys.map(&:to_sym)
|
||||
end
|
||||
|
||||
# Consulta si el Layout existe
|
||||
|
|
|
@ -12,9 +12,9 @@
|
|||
|
||||
%h3= t('posts.new')
|
||||
%ul
|
||||
- @site.layouts.to_h.keys.each do |layout|
|
||||
%li= link_to @site.i18n.dig('layouts', layout.to_s) || layout.to_s.humanize,
|
||||
new_site_post_path(@site, layout: layout)
|
||||
- @site.layouts.each do |layout|
|
||||
- next if layout.hidden?
|
||||
%li= link_to layout.humanized_name, new_site_post_path(@site, layout: layout.name)
|
||||
|
||||
- if policy(@site).edit?
|
||||
= link_to t('sites.edit.btn', site: @site.title), edit_site_path(@site), class: 'btn'
|
||||
|
|
Loading…
Reference in a new issue