2024-05-20 17:12:53 +00:00
|
|
|
-#
|
|
|
|
El formulario del artículo, con HTMX activado.
|
|
|
|
|
|
|
|
@param :site [Site]
|
|
|
|
@param :post [Post]
|
|
|
|
@param :locale [Symbol, String]
|
|
|
|
@param :dir [Symbol, String]
|
2024-06-03 20:50:48 +00:00
|
|
|
|
|
|
|
@param [ActionController::StrongParameters] params
|
|
|
|
@option params [String] :inverse La relación inversa (opcional)
|
|
|
|
@option params [String] :form El ID del formulario actual, si tiene botones externos, tiene que estar compartido
|
|
|
|
@option params [String] :swap Método de intercambio del resultado (HTMX)
|
|
|
|
@option params [String] :target Elemento donde se carga el resultado (HTMX)
|
|
|
|
@option params [String] :hide ID del modal a esconder vía evento
|
|
|
|
@option params [String] :show ID del modal a mostrar vía evento
|
|
|
|
@option params [String] :base La base del formulario, que luego se envía como parámetro a PostService
|
|
|
|
@option params [String] :attribute El tipo de atributo, para saber qué respuesta generar
|
2024-05-20 17:12:53 +00:00
|
|
|
:ruby
|
2024-05-23 21:19:59 +00:00
|
|
|
except = %i[date]
|
|
|
|
|
|
|
|
if (inverse = params.permit(:inverse).try(:[], :inverse).presence)
|
|
|
|
except << inverse.to_sym
|
|
|
|
end
|
|
|
|
|
2024-05-20 17:12:53 +00:00
|
|
|
options = {
|
2024-05-27 18:12:03 +00:00
|
|
|
id: params.require(:form),
|
2024-05-20 17:12:53 +00:00
|
|
|
multipart: true,
|
|
|
|
class: 'form post ',
|
|
|
|
'hx-swap': params.require(:swap),
|
2024-06-19 21:20:05 +00:00
|
|
|
'hx-target': "##{params.require(:target)}",
|
|
|
|
'hx-validate': true,
|
|
|
|
data: {
|
|
|
|
controller: 'form-validation',
|
2024-06-19 21:21:44 +00:00
|
|
|
action: 'form-validation#submit',
|
|
|
|
'form-validation-submitting-id-value': params.permit(:submitting).values.first,
|
|
|
|
'form-validation-invalid-id-value': params.permit(:invalid).values.first,
|
2024-06-19 21:20:05 +00:00
|
|
|
}
|
2024-05-20 17:12:53 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if post.new?
|
|
|
|
url = options[:'hx-post'] = site_posts_path(site, locale: locale)
|
|
|
|
options[:class] += 'new'
|
|
|
|
else
|
|
|
|
url = options[:'hx-patch'] = site_post_path(site, post.id, locale: locale)
|
|
|
|
options[:method] = :patch
|
|
|
|
options[:class] += 'edit'
|
|
|
|
end
|
|
|
|
|
|
|
|
= form_tag url, **options do
|
2024-05-27 18:13:11 +00:00
|
|
|
- unless post.errors.empty?
|
|
|
|
- title = t('.errors.title')
|
|
|
|
- help = t('.errors.help')
|
|
|
|
= render 'bootstrap/alert' do
|
|
|
|
%h4= title
|
|
|
|
%p= help
|
|
|
|
|
|
|
|
%ul
|
|
|
|
- post.errors.each do |attribute, errors|
|
|
|
|
- if errors.size > 1
|
|
|
|
%li
|
|
|
|
%strong= post_label_t attribute, post: post
|
|
|
|
%ul
|
|
|
|
- errors.each do |error|
|
|
|
|
%li= error
|
|
|
|
- else
|
|
|
|
%li
|
|
|
|
%strong= post_label_t attribute, post: post
|
|
|
|
= errors.first
|
|
|
|
|
2024-05-20 17:12:53 +00:00
|
|
|
-# Parámetros para HTMX
|
2024-06-03 20:52:53 +00:00
|
|
|
%input{ type: 'hidden', name: 'hide', value: params.permit((post.errors.empty? ? :show : :hide)).try(:values).try(:first) }
|
|
|
|
%input{ type: 'hidden', name: 'show', value: params.permit((post.errors.empty? ? :hide : :show)).try(:values).try(:first) }
|
2024-05-20 17:12:53 +00:00
|
|
|
%input{ type: 'hidden', name: 'name', value: params.require(:name) }
|
|
|
|
%input{ type: 'hidden', name: 'base', value: params.require(:base) }
|
2024-05-27 18:13:11 +00:00
|
|
|
%input{ type: 'hidden', name: 'form', value: options[:id] }
|
|
|
|
%input{ type: 'hidden', name: 'dir', value: dir }
|
|
|
|
%input{ type: 'hidden', name: 'locale', value: locale }
|
2024-05-27 18:15:55 +00:00
|
|
|
%input{ type: 'hidden', name: 'attribute', value: params.require(:attribute) }
|
2024-05-27 18:13:11 +00:00
|
|
|
%input{ type: 'hidden', name: 'target', value: params.require(:target) }
|
|
|
|
%input{ type: 'hidden', name: 'swap', value: params.require(:swap) }
|
|
|
|
- if params[:inverse].present?
|
|
|
|
%input{ type: 'hidden', name: 'inverse', value: params.require(:inverse) }
|
2024-06-19 21:21:44 +00:00
|
|
|
- if params[:saved].present?
|
|
|
|
%input{ type: 'hidden', name: 'saved', value: params.require(:saved) }
|
2024-05-20 17:12:53 +00:00
|
|
|
|
|
|
|
= hidden_field_tag "#{base}[layout]", post.layout.name
|
|
|
|
|
2024-07-02 16:02:32 +00:00
|
|
|
-# Dibuja cada atributo, excepto algunos
|
2024-05-23 21:19:59 +00:00
|
|
|
= render 'posts/attributes', site: site, post: post, dir: dir, base: base, locale: locale, except: except
|
2024-05-24 16:10:55 +00:00
|
|
|
|
2024-07-02 16:02:32 +00:00
|
|
|
-#
|
|
|
|
Enviamos valores vacíos o arrastrados desde el formulario anterior
|
|
|
|
para los atributos ignorados
|
2024-05-27 18:28:17 +00:00
|
|
|
- except.each do |attr|
|
2024-07-02 16:02:32 +00:00
|
|
|
%input{ type: 'hidden', name: "#{base}[#{attr}]", value: params[attr].presence }
|
2024-05-27 18:28:17 +00:00
|
|
|
|
2024-05-24 16:10:55 +00:00
|
|
|
= yield(:post_form)
|