From 41ad7d806e5448c5297c6ac10e222ef00728d040 Mon Sep 17 00:00:00 2001 From: f Date: Tue, 4 Jun 2024 17:07:05 -0300 Subject: [PATCH 1/6] fix: correr htmx junto a turbolinks --- app/javascript/packs/application.js | 2 +- package.json | 2 +- yarn.lock | 10 +++++----- 3 files changed, 7 insertions(+), 7 deletions(-) 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/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" From 3983f17ba225680cb02d531bcbd9b94cc3dd1c36 Mon Sep 17 00:00:00 2001 From: f Date: Tue, 4 Jun 2024 17:07:43 -0300 Subject: [PATCH 2/6] fix: no cambiar el post si lo asignamos antes --- app/services/post_service.rb | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/services/post_service.rb b/app/services/post_service.rb index 93daaa45..3045bd9c 100644 --- a/app/services/post_service.rb +++ b/app/services/post_service.rb @@ -7,8 +7,7 @@ PostService = Struct.new(:site, :usuarie, :post, :params, keyword_init: true) do # # @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) From 74ed69d52c0c33f3fe11968d0c3c11ca3fbd82a8 Mon Sep 17 00:00:00 2001 From: f Date: Tue, 4 Jun 2024 17:08:31 -0300 Subject: [PATCH 3/6] feat: poder actualizar el post si sabemos el uuid --- app/controllers/posts_controller.rb | 2 +- app/services/post_service.rb | 20 ++++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/app/controllers/posts_controller.rb b/app/controllers/posts_controller.rb index 282a784a..8b103422 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 diff --git a/app/services/post_service.rb b/app/services/post_service.rb index 3045bd9c..bb49c5bd 100644 --- a/app/services/post_service.rb +++ b/app/services/post_service.rb @@ -3,6 +3,26 @@ # Este servicio se encarga de crear artículos y guardarlos en git, # asignándoselos a une usuarie PostService = Struct.new(:site, :usuarie, :post, :params, keyword_init: true) do + + # 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 From 5a6ee375b1e52a36b28acc3c00d13f38bf3fd1fc Mon Sep 17 00:00:00 2001 From: f Date: Tue, 4 Jun 2024 17:09:04 -0300 Subject: [PATCH 4/6] feat: soportar htmx al actualizar posts --- app/controllers/posts_controller.rb | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/app/controllers/posts_controller.rb b/app/controllers/posts_controller.rb index 8b103422..0f3c24d5 100644 --- a/app/controllers/posts_controller.rb +++ b/app/controllers/posts_controller.rb @@ -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' From 0e83b09bf01a9903feb9629b5986e29219f7155c Mon Sep 17 00:00:00 2001 From: f Date: Tue, 4 Jun 2024 17:11:32 -0300 Subject: [PATCH 5/6] fix: new_has_one --- app/views/posts/attributes/_new_has_one.haml | 6 ++++-- config/locales/en.yml | 3 +++ config/locales/es.yml | 3 +++ 3 files changed, 10 insertions(+), 2 deletions(-) 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 b432f11b..c9d988a4 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -756,6 +756,8 @@ en: empty: "(Empty)" draft: label: Draft + new_has_one: + edit: "Edit" reorder: submit: 'Save order' select: 'Select this post' @@ -944,6 +946,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 7ffe4f90..8d3d7f74 100644 --- a/config/locales/es.yml +++ b/config/locales/es.yml @@ -764,6 +764,8 @@ es: empty: "(Vacío)" draft: label: Borrador + new_has_one: + edit: "Editar" reorder: submit: 'Guardar orden' select: 'Seleccionar este artículo' @@ -952,6 +954,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" From a2275d8654c59b5e9e85fe3fb834990bb0915163 Mon Sep 17 00:00:00 2001 From: f Date: Tue, 4 Jun 2024 17:12:18 -0300 Subject: [PATCH 6/6] fix: traducciones --- config/locales/en.yml | 10 ++++++++++ config/locales/es.yml | 10 ++++++++++ 2 files changed, 20 insertions(+) diff --git a/config/locales/en.yml b/config/locales/en.yml index c9d988a4..3eb0cc24 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -756,8 +756,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' diff --git a/config/locales/es.yml b/config/locales/es.yml index 8d3d7f74..d69a88b7 100644 --- a/config/locales/es.yml +++ b/config/locales/es.yml @@ -764,8 +764,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'