Mejores Oneboxes para Eventos

Por el momento, los Oneboxes para eventos son un poco sosos. Básicamente, no son diferentes a los Oneboxes de temas normales y no incluyen la fecha, hora, descripción, etc. (a menos que se incluyan en el Título del Tema como solución alternativa).

Aquí tienes un ejemplo de evento de nuestro sitio:

¿Sería posible conectarse a las nuevas (y brillantes) tarjetas que aparecen al hacer clic en el calendario para los eventos y servirlas como oneboxes? Por ejemplo:

Puede que eso no sea factible en absoluto, pero me pregunto si los metadatos podrían modificarse para las publicaciones de eventos de modo que se muestren en Onebox de una manera que resalte la información crítica del evento (especialmente internamente).

7 Me gusta

Me quedan 0 votos, pero de todos modos tienes mi voto :wink:, esto haría que la promoción del evento brillara más.

2 Me gusta

@chapoi / @j.jaffeux He estado pensando en esto.

Creo que un cambio fundamental que necesitamos aquí es introducir URL de eventos adecuadas para que puedas usarlas para onebox y, en lugar de onebox:

https://SITE/t/slug/123

Haríamos onebox:

https://SITE/event/slug/1234

Abre un poco la caja de Pandora (en el buen sentido, eso sí)

  1. ¿Cómo encuentra la gente el enlace al evento? (Supongo que lo añadimos al menú contextual)
  2. ¿Qué sucede si visitan el evento directamente desde la URL? (Supongo que por ahora redirigimos a la publicación del evento)
2 Me gusta

Estoy de acuerdo con la idea – definitivamente se puede hacer algo mejor aquí

Si te refieres a esto:

A mí también me parece el lugar adecuado.

2 Me gusta

Mientras jugaba con ese menú contextual, me pregunto si “Añadir al calendario” estaría mejor ubicado directamente en la tarjeta. Las otras opciones son bastante administrativas, pero esa es una función para todos los usuarios que quedaría bien destacada en la interfaz de usuario.

1 me gusta

En las publicaciones de eventos, coloco la opción “agregar al calendario” en un lugar obvio; puedes agregar esto al encabezado de JavaScript del tema accesible desde el menú de apariencia del administrador:

<script>
(() => {
    const eventInfoSelector = ".event-header .event-info";
    const submenuButtonSelector = "button.fk-d-menu__trigger.discourse-post-event-more-menu-trigger";
    const menuContentSelector = ".fk-d-menu__inner-content";
    const addToCalendarSelector = "li.add-to-calendar > button";

    // Añadir CSS en línea para mantener el texto y el icono en negro al pasar el ratón
    const style = document.createElement("style");
    style.innerHTML = `
    .btn.btn-icon-text.custom-add-to-calendar-btn,
    .btn.btn-icon-text.custom-add-to-calendar-btn:hover {
        color: black !important;
    }
    .btn.btn-icon-text.custom-add-to-calendar-btn svg,
    .btn.btn-icon-text.custom-add-to-calendar-btn:hover svg {
        fill: black !important;
    }
    `;
    document.head.appendChild(style);

    // Ayudante para esperar un elemento en el DOM
    const waitForElement = (selector, timeout = 3000) => {
        return new Promise((resolve, reject) => {
            const el = document.querySelector(selector);
            if (el) return resolve(el);

            const observer = new MutationObserver(() => {
                const found = document.querySelector(selector);
                if (found) {
                    observer.disconnect();
                    resolve(found);
                }
            });
            observer.observe(document.body, { childList: true, subtree: true });
            setTimeout(() => {
                observer.disconnect();
                reject();
            }, timeout);
        });
    };

    const createAddToCalendarButton = async () => {
        const eventInfo = document.querySelector(eventInfoSelector);
        if (!eventInfo || eventInfo.querySelector(".custom-add-to-calendar-btn")) return;

        const button = document.createElement("button");
        button.className = "btn btn-icon-text custom-add-to-calendar-btn";
        button.title = "Add to calendar";
        button.innerHTML = `
            <svg class="fa d-icon d-icon-file svg-icon" aria-hidden="true" xmlns="http://www.w3.org/2000/svg">
                <use href="#file"></use>
            </svg>
            <span class="d-button-label">Add to calendar</span>
        `;

        // Estilos en línea para alineación a la izquierda
        button.style.display = "inline-flex";
        button.style.justifyContent = "flex-start";
        button.style.marginLeft = "0";
        button.style.marginBottom = "4px";
        button.style.backgroundColor = "#f0f0f0";
        button.style.borderRadius = "6px";
        button.style.transition = "transform 0.2s";
        button.style.cursor = "pointer";

        // Lógica de clic: abrir menú y activar el botón original "Agregar al calendario"
        button.addEventListener("click", async () => {
            const submenuButton = document.querySelector(submenuButtonSelector);
            if (!submenuButton) return;
            submenuButton.click(); // abrir menú

            let menuContent;
            try {
                menuContent = await waitForElement(menuContentSelector, 2000);
            } catch {
                return;
            }

            const originalButton = menuContent.querySelector(addToCalendarSelector);
            originalButton?.click();
        });

        // Insertar en event-info
        if (eventInfo.firstElementChild) {
            eventInfo.insertBefore(button, eventInfo.firstElementChild.nextSibling);
        } else {
            eventInfo.appendChild(button);
        }
    };

    // Observar cambios en el DOM (seguro para Ember)
    const observer = new MutationObserver(() => createAddToCalendarButton());
    observer.observe(document.body, { childList: true, subtree: true });

    // Intento inicial
    createAddToCalendarButton();
})();
</script>