5
0
Fork 0
mirror of https://0xacab.org/sutty/sutty synced 2024-11-26 00:06:21 +00:00
panel/app/views/posts/_htmx_form.haml

79 lines
3.3 KiB
Text

-#
El formulario del artículo, con HTMX activado.
@param :site [Site]
@param :post [Post]
@param :locale [Symbol, String]
@param :dir [Symbol, String]
@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
:ruby
except = %i[date]
if (inverse = pluck_param(:inverse, optional: true))
except << inverse.to_sym
end
options = {
id: pluck_param(:form),
multipart: true,
class: 'form post ',
'hx-swap': pluck_param(:swap),
'hx-target': "##{pluck_param(:target)}",
'hx-validate': true,
data: {
controller: 'unsaved-changes form-validation',
action: 'unsaved-changes#submit form-validation#submit beforeunload@window->unsaved-changes#unsaved turbolinks:before-visit@window->unsaved-changes#unsavedTurbolinks',
'form-validation-submitting-id-value': pluck_param(:submitting, optional: true),
'form-validation-invalid-id-value': pluck_param(:invalid, optional: true),
}
}
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
= render 'errors', post: post
-# Parámetros para HTMX
%input{ type: 'hidden', name: 'hide', value: pluck_param((post.errors.empty? ? :show : :hide), optional: true) }
%input{ type: 'hidden', name: 'show', value: pluck_param((post.errors.empty? ? :hide : :show), optional: true) }
%input{ type: 'hidden', name: 'name', value: pluck_param(:name) }
%input{ type: 'hidden', name: 'base', value: pluck_param(:base) }
%input{ type: 'hidden', name: 'form', value: options[:id] }
%input{ type: 'hidden', name: 'dir', value: dir }
%input{ type: 'hidden', name: 'locale', value: locale }
%input{ type: 'hidden', name: 'attribute', value: pluck_param(:attribute) }
%input{ type: 'hidden', name: 'target', value: pluck_param(:target) }
%input{ type: 'hidden', name: 'swap', value: pluck_param(:swap) }
- if params[:inverse].present?
%input{ type: 'hidden', name: 'inverse', value: pluck_param(:inverse) }
- if params[:saved].present?
%input{ type: 'hidden', name: 'saved', value: pluck_param(:saved) }
= hidden_field_tag "#{base}[layout]", post.layout.name
-# Dibuja cada atributo, excepto algunos
= render 'posts/attributes', site: site, post: post, dir: dir, base: base, locale: locale, except: except
-#
Enviamos valores vacíos o arrastrados desde el formulario anterior
para los atributos ignorados
- except.each do |attr|
%input{ type: 'hidden', name: "#{base}[#{attr}]", value: pluck_param(attr, optional: true) }
= yield(:post_form)