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
|
# 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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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'
|
||||||
|
|
Loading…
Reference in a new issue