-# 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)