¿Cómo personalizar la barra de herramientas del compositor?

Me pregunto si hay alguna forma de personalizar qué botones se muestran (y en qué orden) en la barra de herramientas de Nuevo Tema.

Específicamente, quiero reemplazar el botón de Fecha/Hora con el botón Agregar Evento. La Fecha/Hora solo causa confusión a los nuevos usuarios y, en nuestro contexto, los Eventos son lo que queremos destacar. Instruir a los usuarios a ignorar primero el botón con aspecto de calendario, hacer clic en el icono del engranaje y luego hacer clic en el otro icono con aspecto de calendario no es lo mejor, considerando que nuestra comunidad tiene muchas personas mayores y no orientadas a la tecnología usándola.

Veo que hay temas sobre la personalización del botón de nuevo tema, pero no de la barra de herramientas en sí.

3 Me gusta

También tengo curiosidad sobre esto. Recientemente agregamos una herramienta a la barra de herramientas del editor y eso hizo que el :gear: pasara a la siguiente línea.

1 me gusta

No hay una configuración para personalizar la barra de herramientas, pero es posible hacerlo a través de temas y plugins.

Sería bueno tener esta función, así que la reclasificaré como una solicitud de función.

Por ahora, los botones se pueden ocultar con CSS… por ejemplo:

.d-editor-button-bar {
  .local-dates {  // oculta el botón de fecha
    display: none;
  }
}

o para ocultar una opción del menú de :engranaje:

.toolbar-popup-menu-options {
  [data-name="Build Poll"] {
    display: none;
  }
}

Con CSS también es bastante sencillo reordenar elementos en estos menús… puedes hacer algo como:

.d-editor-button-bar {
  .local-dates {  // mueve el botón de fecha al principio
    order: -1;
  }
}

Tenemos una guía para averiguar cómo cambiar CSS aquí:

Dicho todo esto, el cambio más difícil es mover algo del menú desplegable a la barra de herramientas principal (o viceversa). Necesitarías ocultar el botón original con CSS y luego agregar un botón duplicado usando la API.

Mirar un componente de tema de ejemplo, como Discourse Gifs da una idea general de cómo se hace… aunque esto se complica si no eres desarrollador.

9 Me gusta

para el menú :gear:

Cuando intenté escribir de esta manera, el orden de visualización no cambió.
PD: display: none; tampoco funcionó.

.toolbar-popup-menu-options {
  [data-name="Create event"] {
    order: -1;
  }
}

La siguiente sintaxis funciona como se esperaba, moviendo “Crear evento” a la parte superior.

.select-kit-collection {
  display: flex;
  flex-direction: column;
}

.select-kit-row[data-name="Create event"] {
  order: -1;
}

No estoy familiarizado con CSS, ChatGPT me ayudó a crear el código anterior.

1 me gusta

Sí, esto es realmente necesario. No solo una opción “predeterminada” para todos los usuarios, sino que luego cada usuario podría personalizarla, porque no todos necesitan tener un botón para poner el texto en “Negrita”, “Cursiva” o incluso “Preguntar a la IA”.

Pero por ahora, poder al menos mover cosas globalmente y agregarlas al menú oculto/rueda dentada, ayudaría.

En mi pantalla de 13 pulgadas, las cosas empiezan a estar un poco apretadas (siempre me gusta tener visible parte del tema original para citar secciones, etc.):

Tengo curiosidad: ¿cómo añadiste esa nota “se requieren 20 caracteres” y luego muestra cuántos ha escrito ya la persona?

¿Qué tal para el título?

Para ser sincero, no estoy completamente seguro. Eso se instaló en una comunidad que administraba anteriormente (pero ya no lo hago). Parece que se puede encontrar aquí.

2 Me gusta

¡Gracias! ¡Eso es exactamente! :raising_hands:

1 me gusta

Yo también tengo personas mayores en mi foro y me siento tonto explicándoles esto.

El engranaje también es un símbolo muy poco obvio para “hay más”. ¿Quizás una elipsis sería más apropiada? ¿Hay alguna forma sencilla de cambiar el icono?

Otro obstáculo que encontré aquí es que en el móvil hay un pequeño icono de hamburguesa que oculta/muestra la barra de herramientas, y parece estar desactivado por defecto. Esto causa mucha más confusión que cualquier beneficio que pudiera ofrecer. Lo desactivé:

.composer-controls .toggle-toolbar {
  display: none;
}

.d-editor-button-bar {
  display: grid !important;
}

Hola, me preguntaba si este método todavía es recomendable, o si se ve afectado por esto:

1 me gusta

El uso de api.onToolbarCreate desde un inicializador .js todavía es compatible :+1:

El tema que enlazaste solo se refiere a la inclusión de javascript en etiquetas <script type="text/discourse-plugin">.

3 Me gusta

Hola,

Tengo el “icono de crear evento” colocado a la derecha y fuera del menú +, pero puedes colocarlo a la izquierda con estas instrucciones:

1° En el encabezado de tu tema en admin > apariencia > tema > editar > editar código > head, añade este javascript:

<!-- Botón personalizado de creación de eventos (basado en iconos, a prueba de idiomas) -->
<script>
(() => {
  const e = ".d-editor-button-bar"; // Barra de botones del editor
  const t = ".btn.no-text.fk-d-menu__trigger.toolbar-menu__options-trigger.toolbar__button.options.toolbar-popup-menu-options"; // Botón del menú de opciones
  const n = ".fk-d-menu__inner-content"; // Contenido interno del menú
  const o = ".d-modal.fk-d-menu-modal"; // Modal del menú

  // Función para obtener el botón del icono del calendario
  const c = (e) => {
    const t = e.querySelector('svg use[href="#calendar-day"]');
    return t ? t.closest("button") : null;
  };

  // Función para esperar a que un elemento exista
  const r = (e, t, n = 4000) => new Promise((o, c) => {
    const r = t(e);
    if (r) return o(r);
    const l = new MutationObserver(() => {
      const n = t(e);
      n && (l.disconnect(), o(n));
    });
    l.observe(e, { childList: !0, subtree: !0 });
    setTimeout(() => {
      l.disconnect();
      c();
    }, n);
  });

  // Función para esperar a que aparezca el modal del menú
  const l = (e = 4000) => {
    const t = new MutationObserver(() => {
      document.querySelector(o) && t.disconnect();
    });
    t.observe(document.body, { childList: !0, subtree: !0 });
    setTimeout(() => {
      t.disconnect();
    }, e);
  };

  // Función para crear y añadir el botón de crear evento
  const s = (e) => {
    if (e.querySelector(".custom-create-event-btn")) return;
    const o = document.createElement("button");
    o.className = "btn no-text btn-icon toolbar__button link custom-create-event-btn";
    o.title = "Create event"; // Título del botón
    o.innerHTML = '<svg class="fa d-icon d-icon-calendar-day svg-icon"><use href="#calendar-day"></use></svg>';
    e.appendChild(o);

    o.addEventListener("click", async () => {
      const e = document.querySelector(t);
      if (!e) return;
      e.click();
      let o = document.querySelector(n);
      if (!o) {
        await new Promise((e, t) => {
          const c = new MutationObserver(() => {
            o = document.querySelector(n);
            o && (c.disconnect(), e());
          });
          c.observe(document.body, { childList: !0, subtree: !0 });
          setTimeout(() => {
            c.disconnect();
            t();
          }, 2000);
        });
      }
      try {
        (await r(o, c)).click();
        l();
      } catch {}
    });
  };

  // Observador para detectar la aparición de la barra de botones del editor
  const u = new MutationObserver(() => {
    const t = document.querySelector(e);
    t && s(t);
  });
  u.observe(document.body, { childList: !0, subtree: !0 });

  const d = document.querySelector(e);
  d && s(d);
})();
</script>

2° Si quieres el icono a la izquierda y no a la derecha: en la misma página de administración encontrarás una pestaña de CSS donde puedes añadir esto:

.btn.no-text.btn-icon.toolbar__button.link.custom-create-event-btn { order: -1; }

3° Bonus: si quieres que este botón sea visible en este lugar solo en ciertas categorías, usa el script de allí y modifica las condiciones con los nombres de tus categorías Discourse Calendar (and Event) - #547 by opcourdis

1 me gusta

Muchas gracias a @david y @opcourdis por sus útiles respuestas.

2 Me gusta