diff --git a/app/controllers/posts_controller.rb b/app/controllers/posts_controller.rb index 282a784a..0f3c24d5 100644 --- a/app/controllers/posts_controller.rb +++ b/app/controllers/posts_controller.rb @@ -117,7 +117,7 @@ class PostsController < ApplicationController service = PostService.new(site: site, usuarie: current_usuarie, params: params) - @post = service.create + @post = service.create_or_update if post.persisted? site.touch @@ -165,7 +165,24 @@ class PostsController < ApplicationController if service.update.persisted? site.touch forget_content + end + if htmx? + if post.persisted? + swap_modals + + @value = post.title.value + @uuid = post.uuid.value + @name = params.require(:name) + + render render_path_from_attribute, layout: false + else + headers['HX-Retarget'] = "##{params.require(:form)}" + headers['HX-Reswap'] = 'outerHTML' + + render 'posts/form', layout: false, post: post, site: site, **params.permit(:form, :base, :dir, :locale) + end + elsif post.persisted? redirect_to site_post_path(site, post) else render 'posts/edit' diff --git a/app/javascript/packs/application.js b/app/javascript/packs/application.js index c523b0f0..dc87b1c3 100644 --- a/app/javascript/packs/application.js +++ b/app/javascript/packs/application.js @@ -41,5 +41,5 @@ Rails.start() Turbolinks.start() ActiveStorage.start() -window.htmx = require('htmx.org/dist/htmx.js') +window.htmx = require("@suttyweb/htmx.org/dist/htmx.js"); window.htmx.config.selfRequestsOnly = true; diff --git a/app/services/post_service.rb b/app/services/post_service.rb index 83aa9aeb..60c75c1e 100644 --- a/app/services/post_service.rb +++ b/app/services/post_service.rb @@ -5,12 +5,30 @@ PostService = Struct.new(:site, :usuarie, :post, :params, keyword_init: true) do include AutoPublishConcern + # Si estamos pasando el UUID con los parámetros, el post quizás + # existe. + # + # @return [Post] + def create_or_update + uuid = params.require(base).permit(:uuid).values.first + + binding.pry + + if uuid.blank? + create + elsif (indexed_post = site.indexed_posts.find_by(post_id: uuid)).present? + self.post = indexed_post.post + update + else + create + end + end + # Crea un artículo nuevo # # @return Post def create - self.post = site.posts(lang: locale) - .build(layout: layout) + self.post ||= site.posts(lang: locale).build(layout: layout) post.usuaries << usuarie post.draft.value = true if site.invitade? usuarie post.assign_attributes(post_params) diff --git a/app/views/posts/attributes/_new_has_one.haml b/app/views/posts/attributes/_new_has_one.haml index 5a614990..4235b9b3 100644 --- a/app/views/posts/attributes/_new_has_one.haml +++ b/app/views/posts/attributes/_new_has_one.haml @@ -38,7 +38,8 @@ datos y recibir su UUID en respuesta. - content_for :post_form do %div{ id: modal_id, data: { controller: 'modal' }} - - if layout.is_a?(String) + -# Si hay un solo layout o el post asociado ya existía + - if layout.is_a?(String) || metadata.has_one.present? = render 'bootstrap/modal', id: id, modal_content_attributes: { class: 'h-100' } do - content_for :"#{id}_body" do -# @todo ocultar el modal después de guardar @@ -47,7 +48,8 @@ - content_for :"#{id}_footer" do = render 'bootstrap/btn', form: form_id, content: t('.save'), type: 'submit', class: 'm-0 mt-1 mr-1' - = render 'bootstrap/btn', content: t('.cancel'), action: 'modal#hide', class: 'm-0 mt-1 mr-1' + = render 'bootstrap/btn', content: t('.close'), action: 'modal#hide', class: 'm-0 mt-1 mr-1' - else + -# @todo Implementar selección de layout para cargar el formulario correcto Nada diff --git a/config/locales/en.yml b/config/locales/en.yml index 7d0cf8de..3f0f3b4b 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -758,6 +758,18 @@ en: empty: "(Empty)" draft: label: Draft + new_has_many: + edit: "Edit" + new_has_and_belongs_to_many: + edit: "Edit" + new_predefined_array: + edit: "Edit" + new_array: + edit: "Edit" + new_has_one: + edit: "Edit" + new_belongs_to: + edit: "Edit" reorder: submit: 'Save order' select: 'Select this post' @@ -946,6 +958,7 @@ en: add: "Add %{layout}" add_new: "Add new option" cancel: "Cancel" + close: "Close" edit: "Edit" filter: "Start typing to filter..." save: "Save" diff --git a/config/locales/es.yml b/config/locales/es.yml index d208f1bd..91e9e7a6 100644 --- a/config/locales/es.yml +++ b/config/locales/es.yml @@ -766,6 +766,18 @@ es: empty: "(Vacío)" draft: label: Borrador + new_has_many: + edit: "Editar" + new_has_and_belongs_to_many: + edit: "Editar" + new_predefined_array: + edit: "Editar" + new_array: + edit: "Editar" + new_has_one: + edit: "Editar" + new_belongs_to: + edit: "Editar" reorder: submit: 'Guardar orden' select: 'Seleccionar este artículo' @@ -954,6 +966,7 @@ es: add: "Agregar %{layout}" add_new: "Agregar nueva opción" cancel: "Cancelar" + close: "Cerrar" edit: "Editar" filter: "Empezá a escribir para filtrar..." save: "Guardar" diff --git a/package.json b/package.json index 088316bc..73cfd589 100644 --- a/package.json +++ b/package.json @@ -14,6 +14,7 @@ "@rails/ujs": "^6.1.3-1", "@rails/webpacker": "5.4.4", "@suttyweb/editor": "^0.1.29", + "@suttyweb/htmx.org": "^1.9.13", "babel-loader": "^8.2.2", "bs-custom-file-input": "^1.3.4", "chart.js": "^3.5.1", @@ -22,7 +23,6 @@ "commonmark": "^0.29.0", "fork-awesome": "^1.1.7", "fork-ts-checker-webpack-plugin": "^6.1.0", - "htmx.org": "^1.9.11", "input-map": "git+https://0xacab.org/sutty/input-map.git", "input-tag": "git+https://0xacab.org/sutty/input-tag.git", "leaflet": "^1.7.1", diff --git a/yarn.lock b/yarn.lock index fc6ae7cb..d181bebe 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1984,6 +1984,11 @@ linkifyjs "^4.1.1" prosemirror-svelte-nodeview "^1.0.2" +"@suttyweb/htmx.org@^1.9.13": + version "1.9.13" + resolved "https://registry.yarnpkg.com/@suttyweb/htmx.org/-/htmx.org-1.9.13.tgz#bc67a5e2947d7cc125649b829610da8ee61f21af" + integrity sha512-/2x3AGXT2CFOmp8Nf59XY2brah5wSo4YvcctYA2zD4BByNft4XE0rUk4VM7TjPxR1LOzg6VK1crZmdiy3JyzxQ== + "@types/caseless@*": version "0.12.2" resolved "https://registry.npmjs.org/@types/caseless/-/caseless-0.12.2.tgz" @@ -4575,11 +4580,6 @@ html-entities@^1.3.1: resolved "https://registry.npmjs.org/html-entities/-/html-entities-1.4.0.tgz" integrity sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA== -htmx.org@^1.9.11: - version "1.9.11" - resolved "https://registry.yarnpkg.com/htmx.org/-/htmx.org-1.9.11.tgz#00192041ee682d6ca7146d0fbd901169ffe72d87" - integrity sha512-WlVuICn8dfNOOgYmdYzYG8zSnP3++AdHkMHooQAzGZObWpVXYathpz/I37ycF4zikR6YduzfCvEcxk20JkIUsw== - http-deceiver@^1.2.7: version "1.2.7" resolved "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz"