Enfoca el editor cuando el título esté prellenado

Tengo una URL similar a esta:

https://forum.example.com/new-message?groupname=moderators&title=Ayúdame+con+una+tarea+por+favor

A la que enlazo en mi sitio, para llevar a los usuarios al foro a hacer una pregunta. Uso varios valores para el título para pre-rellenar el título con el tema que les interese, y me gustaría que el editor tuviera el foco.

Estaba buscando cómo modificar esto y encontré el archivo composer.js con la definición de focusTarget, que sería bastante fácil de modificar para soportar este comportamiento si el título se pasara.

El problema que encuentro es que no veo dónde se llama realmente a focusTarget. He estado programando durante muchos años, pero soy nuevo en Ember y he hecho relativamente poca programación en javascript.

Cualquier consejo sobre cómo abordar esto sería muy apreciado (incluso se agradecería un rtfm con un puntero a un manual razonable).

Saludos.

Creo que esto es lo que buscas:

https://github.com/discourse/discourse/blob/main/app/assets/javascripts/discourse/app/components/composer-editor.js#L159-L164

Cada vez que cambia el valor de focusTarget, se llama a esta función setFocus.

De acuerdo, ese código es lo que hace que funcione. Lo que no tengo claro es qué código necesito modificar para que este método obtenga el título, para poder enfocar adecuadamente el editor allí…

https://github.com/discourse/discourse/blob/main/app/assets/javascripts/discourse/app/services/composer.js#L218-L243

Creo que puedes hacer algo así. Esto debería funcionar.

import putCursorAtEnd from "discourse/lib/put-cursor-at-end";

api.onAppEvent("composer:open", ({ model }) => {
  if (model.title !== "") {
    scheduleOnce("afterRender", () => {
      putCursorAtEnd(document.querySelector("textarea.d-editor-input"));
    });
  }
});
1 me gusta

Casi lo tengo funcionando: cuando el código se está ejecutando, recibo un error de que scheduleOnce no está definido. Intenté api.scheduleOnce, pero parece que scheduleOnce es una cosa de Ember. Intenté añadir esta importación a mi componente, pero obtuve un error de que las importaciones solo están permitidas en el nivel superior.
import { scheduleOnce } from "@ember/runloop";

Supongo que me falta algo pequeño y seguiré intentándolo, pero pensé en ver si era obvio para ti.

Gracias de nuevo :slight_smile:

Sí, la importación es correcta. Coloca ambas importaciones al principio del archivo y deberías estar bien.

1 me gusta

¿En qué archivo debería ponerlos? Lo que intentaba hacer era simplemente usarlo en <head> – como un componente – esto es lo que hice, lo que resulta en el registro “scheduling afterRender” que aparece, luego un error sobre scheduleOnce no existente. He intentado usar la importación de algunas maneras, pero no funciona. Sospecho que mi inexperiencia con los módulos en javascript me está causando problemas. Quizás no pueda hacerlo a través de un componente y necesite hacer un plugin más completo. Le echaré un vistazo – gracias de nuevo por tu ayuda :slight_smile:

<script type="text/discourse-plugin" version="1.8.0">
    api.onAppEvent("composer:open", ({ model }) => {
      console.log("composer open happened, model is: ", model);
      if (model.title !== "") {
        console.log("scheduling afterRender");
        scheduleOnce("afterRender", () => {
          console.log("after render happening");
          api.putCursorAtEnd(document.querySelector("textarea.d-editor-input"));
        });
      }
    });
</script>

Oh, ya veo. Asumí que usabas JS en sus archivos.

Desde la interfaz de administración, entonces, escribirías:

<script type="text/discourse-plugin" version="1.8.0">
    const putCursorAtEnd = require("discourse/lib/put-cursor-at-end").default;
    const { scheduleOnce } = require("@ember/runloop");

    api.onAppEvent("composer:open", ({ model }) => {
      if (model.title !== "") {
        scheduleOnce("afterRender", () => {
          putCursorAtEnd(document.querySelector("textarea.d-editor-input"));
        });
      }
    });
</script>

Por cierto, te animo encarecidamente a que utilices la Theme CLI. Puedes crear un componente de tema a partir de una plantilla, sincronizarlo con un Discourse con actualización en vivo y actualizar cualquier cambio usando tu editor. ¡Es mucho más fácil que usar la interfaz de usuario!

2 Me gusta

Muchas gracias, sabía que me faltaba algo. Definitivamente lo configuraré para usar la CLI del tema y editarlos de esa manera :slight_smile: :slight_smile:

1 me gusta

Gracias de nuevo Arkshine, he creado mi primer componente usando discourse_theme ahora :slight_smile:
Para cualquiera que encuentre este hilo, básicamente solo tuve que ejecutar unos pocos comandos:

gem install discourse_theme
npm install -g yarn
discourse_theme new <nombre-del-componente>

luego edita el archivo: javascripts/discourse/api-initializers/.js
cárgalo en github, y podrás instalar / compartir.
El mío está aquí.
Parece tener una función donde puedes actualizar automáticamente la versión en tu servidor también, a medida que modificas los archivos. Suena bien y útil a medida que me adentré en componentes más complejos.

Saludos

1 me gusta

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.