Eventi di Discourse

Nessun errore appare nella console. Ma ho registrato un video a scopo di riferimento.
Questo accade su Chrome, Firefox e Safari. Su Safari mobile non si verifica.

1 Mi Piace

Il tuo link al video è rotto!

Scusa, non avevo capito bene. In effetti hai ragione: quando si clicca su una data nel calendario, si apre il modulo per la creazione dell’evento, ma con il pulsante «Vuoi abbandonare?». Sì, in effetti c’è un piccolo bug :sweat_smile:

2 Mi Piace

Per vostra informazione, dal mio lato ho aggiunto un pulsante + info per gli utenti che non pensano di cliccare sul titolo per accedere all’argomento. Ho ripreso l’idea di @nathank dal suo pulsante “Aggiungi al calendario”.

Inserisci lo script in un componente del tema nella sezione generale /head

<script>
(() => {
    const eventInfoSelector = ".event-header .event-info";
    const eventCardSelector = ".fc-popover, .event-preview, .discourse-post-event";
    // CSS iniettato pulito e adattato ai temi Discourse (Chiaro/Scuro)
    const style = document.createElement("style");
    style.innerHTML = `
    .custom-topic-info-btn {
        display: flex !important;
        align-items: center;
        justify-content: center;
        width: 40%; /* Occupa tutta la larghezza per un rendering pulito sotto il titolo */
        box-sizing: border-box;
        margin: 12px 0 6px 0;
        padding: 10px 16px;
        
        /* Utilizzo delle variabili native di Discourse */
        background-color: var(--tertiary) !important; /* Colore accentuato (es. blu) */
        color: var(--secondary) !important;          /* Colore del testo contrastato */
        
        border-radius: 8px;
        font-weight: 700;
        text-decoration: none !important;
        box-shadow: 0 2px 4px rgba(0, 0, 0, 0.15);
        transition: background-color 0.2s ease, transform 0.1s ease;
    }
    /* Effetto al passaggio del mouse */
    .custom-topic-info-btn:hover {
        background-color: var(--tertiary-hover) !important;
        color: var(--secondary) !important;
        transform: translateY(-1px);
        box-shadow: 0 4px 6px rgba(0, 0, 0, 0.2);
    }
    /* Effetto al clic */
    .custom-topic-info-btn:active {
        transform: translateY(0);
    }
    /* Stile dell'icona SVG */
    .custom-topic-info-btn .btn-icon-svg {
        margin-right: 8px;
        width: 16px;
        height: 16px;
        fill: currentColor;
    }
    `;
    document.head.appendChild(style);
    const findTopicLink = (container) => {
        if (!container) return null;
        const links = [...container.querySelectorAll('a[href*="/t/"]')];
        if (links.length) return links[0].href;
        return null;
    };
    const createTopicInfoButton = () => {
        const eventInfo = document.querySelector(eventInfoSelector);
        if (!eventInfo || eventInfo.querySelector(".custom-topic-info-btn")) return;
        const card = eventInfo.closest(eventCardSelector) || document;
        const topicUrl = findTopicLink(card);
        if (!topicUrl) return;
        const button = document.createElement("a");
        button.className = "btn custom-topic-info-btn";
        button.title = "Visualizza l'argomento completo";
        button.href = topicUrl;
        
        /* Aggiunta di un'icona Info SVG armonizzata */
        button.innerHTML = `
            <svg class="btn-icon-svg" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
                <path d="M256 512A256 256 0 1 0 256 0a256 256 0 1 0 0 512zM216 336h24V240h-24c-13.3 0-24-10.7-24-24s10.7-24 24-24h40c13.3 0 24 10.7 24 24v120h24c13.3 0 24 10.7 24 24s-10.7 24-24 24H216c-13.3 0-24-10.7-24-24s10.7-24 24-24zm40-144a32 32 0 1 1 0-64 32 32 0 1 1 0 64z"/>
            </svg>
            <span class="d-button-label">+ Info</span>
        `;
        if (eventInfo.firstElementChild) {
            eventInfo.insertBefore(button, eventInfo.firstElementChild.nextSibling);
        } else {
            eventInfo.appendChild(button);
        }
    };
    const observer = new MutationObserver(() => createTopicInfoButton());
    observer.observe(document.body, { childList: true, subtree: true });
    createTopicInfoButton();
})();
</script>

Ecco un’anteprima

oppure

questo codice

<script>
(() => {
    const eventCardSelector = ".fc-popover, .event-preview, .discourse-post-event";

    // CSS iniettato per un rendering pulito e moderno
    const style = document.createElement("style");
    style.innerHTML = `
    .custom-topic-info-wrapper {
        margin-top: 16px;
        padding-top: 16px;
        border-top: 1px solid var(--primary-low); /* Linea di separazione sottile */
        width: 100%;
        display: flex;
        justify-content: center;
    }

    .custom-topic-info-btn {
        display: flex !important;
        align-items: center;
        justify-content: center;
        width: 100%;
        box-sizing: border-box;
        padding: 8px 16px;
        
        /* Stile Outline elegante */
        background-color: transparent !important;
        color: var(--tertiary) !important;
        border: 1px solid var(--tertiary) !important;
        
        border-radius: 6px;
        font-weight: 600;
        text-decoration: none !important;
        transition: all 0.2s ease;
        cursor: pointer;
    }

    /* Effetto al passaggio del mouse: il pulsante si riempie */
    .custom-topic-info-btn:hover {
        background-color: var(--tertiary) !important;
        color: var(--secondary) !important;
        border-color: var(--tertiary) !important;
    }

    /* Allineamento del logo informazioni */
    .custom-topic-info-btn .btn-icon-svg {
        margin-right: 8px;
        width: 16px;
        height: 16px;
        fill: currentColor;
    }
    `;
    document.head.appendChild(style);

    const findTopicLink = (container) => {
        if (!container) return null;
        const links = [...container.querySelectorAll('a[href*="/t/"]')];
        if (links.length) return links[0].href;
        return null;
    };

    const createTopicInfoButton = () => {
        const cards = document.querySelectorAll(eventCardSelector);
        
        cards.forEach(card => {
            if (card.querySelector(".custom-topic-info-btn")) return;

            const topicUrl = findTopicLink(card);
            if (!topicUrl) return;

            const wrapper = document.createElement("div");
            wrapper.className = "custom-topic-info-wrapper";

            const button = document.createElement("a");
            button.className = "btn custom-topic-info-btn";
            button.title = "Consulta l'argomento completo";
            button.href = topicUrl;
            
            /* Icona "i" Informazioni + Nuovo testo azionabile */
            button.innerHTML = `
                <svg class="btn-icon-svg" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
                    <path d="M256 512A256 256 0 1 0 256 0a256 256 0 1 0 0 512zM216 336h24V240h-24c-13.3 0-24-10.7-24-24s10.7-24 24-24h40c13.3 0 24 10.7 24 24v120h24c13.3 0 24 10.7 24 24s-10.7 24-24 24H216c-13.3 0-24-10.7-24-24s10.7-24 24-24zm40-144a32 32 0 1 1 0-64 32 32 0 1 1 0 64z"/>
                </svg>
                <span class="d-button-label">Consulta l'argomento</span>
            `;

            wrapper.appendChild(button);

            /* Posizionamento sopra le opzioni di risposta (Parteciperò, ecc.) */
            const actionsContainer = card.querySelector(".status-and-options, .event-actions");
            const infoContainer = card.querySelector(".event-info");
            
            if (actionsContainer && actionsContainer.parentNode) {
                actionsContainer.parentNode.insertBefore(wrapper, actionsContainer);
            } else if (infoContainer) {
                infoContainer.appendChild(wrapper);
            } else {
                card.appendChild(wrapper);
            }
        });
    };

    const observer = new MutationObserver(() => createTopicInfoButton());
    observer.observe(document.body, { childList: true, subtree: true });

    createTopicInfoButton();
})();
</script>

l’anteprima del risultato

Avete la scelta :rofl:

4 Mi Piace

Avete davvero migliorato la facilità di creazione di un evento dalle ultime aggiornamenti :+1:

Tuttavia, volevo sapere se esiste un’impostazione che impedisce la creazione di un evento quando un utente clicca sul calendario. A volte, invece di cliccare sull’evento, clicca accanto, aprendo così una finestra modale per creare un evento :sweat_smile:

Grazie

2 Mi Piace

So che sono un po’ pesante, ma ho un’altra domanda o suggerimento riguardo agli eventi scaduti. Potrebbero essere eliminati automaticamente, dato che non ha più senso tenerli presenti; mi sembra che il plugin eventi lo facesse già in automatico.

Al momento lo faccio manualmente, quindi se c’è un modo per risparmiare tempo :sweat_smile:

Grazie al team

1 Mi Piace

Esiste un modo per cui il luogo dell’evento possa effettuare una ricerca, come avviene in Google Calendar o negli eventi di Facebook, sia per aiutare l’utente a scegliere il luogo, sia per rendere il luogo cliccabile e aprire un’applicazione di mappe?

(Non sono riuscito a trovare alcuna soluzione cercando, ma forse le mie query di ricerca non erano appropriate)

2 Mi Piace

Locations Plugin 🌍 ha effettivamente questo tipo di funzionalità, ma si integra solo con l’alternativa Events Plugin 📅.

Lo sviluppatore (@merefield) potrebbe essere disponibile a integrarlo con il plugin ufficiale, ma immagino che stabilire e mantenere tale integrazione richieda un lavoro considerevole: quindi sarebbe necessario sponsorizzare il lavoro affinché ciò avvenga.

3 Mi Piace

Ho cercato di dare un’occhiata al plugin Eventi, ma mi sono bloccato su

poiché il sito è offline da mesi.

1 Mi Piace

Potrebbe valere la pena presentare una richiesta formale di funzionalità in Contribute > Feature (contrassegnata con calendar-and-events) per la valutazione. Posso immaginare che sarebbe una cosa fattibile e ha il potenziale per essere di alto valore per molti.


più tardi…
@lou lo ha effettivamente fatto qui:

3 Mi Piace

Un post è stato unito a un argomento esistente: Supporto per la mappa della località dell’evento

Ho intenzione di esportare gli eventi pubblici su un sito WordPress utilizzando un plugin che sappia leggere il feed ICS da /discourse-post-event/events.ics. Fin qui tutto bene.

Ci sono alcune pagine su questo sito che dovrebbero mostrare un sottoinsieme di questi eventi; ogni pagina vuole visualizzare un sottoinsieme diverso.

Speravo di poter taggare gli eventi con un tag associato a ciascuna pagina, in modo che questo apparisse nella riga CATEGORIES del file ICS per consentire il filtraggio in base alla destinazione, ma sembra che non funzioni.

Sarei disposto a usare ?tag=[tag] nell’URL e far sì che le diverse pagine utilizzino URL diversi, anche se non ho trovato conferma che questa sia una funzionalità leggendo quanto ho potuto reperire.

C’è qualcosa che non sto considerando?

No, non stai perdendo nulla (per quanto ne so).

La possibilità di filtrare il feed .ics del calendario per categoria e/o tag sarebbe comunque una degna richiesta di feature per Contribute!

1 Mi Piace

Alla fine ho dovuto creare il mio filtro tag, ma penso di aver capito che gli eventi “scaduti” non vengono scaricati tramite /discourse-post-event/events.ics. Inoltre, non vedo alcun modo per controllare quando un evento diventa “scaduto”. Potrei dover ricorrere a una query su Data Explorer invece di usare /…/events.ics

[anche se penso di aver trovato un modo migliore per farlo usando /discourse-post-event/event]

1 Mi Piace

Ciao, sto cercando feedback su un aspetto relativo all’integrazione degli eventi con l’audio e lo streaming live. Consulta l’ultima risposta qui → https://meta.discourse.org/t/discourse-desktop-mac-app/406912/10?u=nicolsdennis

Qualcuno ha avuto successo nell’implementare VDO.Ninja nelle trasmissioni in diretta degli eventi? Vedo l’integrazione con Zoom e sto pensando che ci potrebbe essere un modo per aggirarla invece di usare Zoom :thinking:

3 post sono stati spostati in un nuovo argomento: Domande sull’integrazione del livestream Zoom

Sembra che le rotte Eventi futuri del Calendario/Eventi di Discourse omettano tutti i metadati Open Graph e Twitter-card dalla risposta HTML iniziale renderizzata dal server.

Questo è riproducibile su un sito Discourse ospitato, dove le pagine normali emettono correttamente i metadati social e è configurata un’immagine OpenGraph del sito valida.

Esempio di rotta interessata:

https://www.mbacommons.com/upcoming-events/month/2026/8/1

Passaggi per riprodurre il problema

  1. Configurare un’immagine OpenGraph del sito valida.
  2. Verificare che la homepage o un argomento normale emetta i metadati Open Graph standard nell’HTML grezzo.
  3. Aprire /upcoming-events/month/2026/8/1.
  4. Ispezionare la view-source: grezza / la risposta iniziale del server, non il DOM post-JavaScript.

Risultato effettivo

La rotta degli Eventi futuri restituisce HTTP 200, ma l’HTML grezzo contiene:

  • nessun og:image
  • nessun og:title
  • nessun og:description
  • nessun og:url
  • nessuna twitter:card
  • nessuna twitter:image

Ho anche testato usando LinkedInBot/1.0; il risultato è identico.

Un audit di produzione sull’HTML grezzo dello stesso sito ha contato:

  • homepage: 11 tag di metadati social
  • argomento normale: 14
  • Eventi futuri: 0

La homepage e gli argomenti normali utilizzano correttamente l’immagine OpenGraph del sito configurata, quindi la configurazione del branding a livello di sito funziona correttamente.

Risultato atteso

Le rotte degli Eventi futuri dovrebbero emettere metadati social visibili ai crawler e renderizzati dal server, includendo almeno:

  • og:title
  • og:description
  • og:url
  • og:image, con fallback all’immagine OpenGraph del sito configurata
  • corrispondenti metadati Twitter-card

Questo deve essere presente nell’HTML iniziale perché LinkedIn e crawler social simili non possono affidarsi al JavaScript del tema lato client.

L’Ispezionatore post di LinkedIn riporta attualmente:

Aggiungi un tag og:image alla pagina per avere il controllo sull'immagine del contenuto su LinkedIn.

Un’iniezione globale di head_tag nel tema non sembra appropriata, poiché le pagine normali hanno già metadati corretti e potrebbero creare tag duplicati o in conflitto. Questo sembra richiedere una gestione lato server consapevole della rotta per gli Eventi futuri o l’uso del percorso di rendering dei metadati social standard di Discourse.

2 Mi Piace

Peertube Live con Calendario e Eventi di Discourse

Lo scorso estate (2025) funzionava perfettamente con Peertube, fornendo l’interfaccia chat con l’argomento (utilizzando l’URL del video /embed/xxx per visualizzare il video in diretta e tenendo conto del ritardo di circa 30 secondi dovuto al P2P in Peertube) quando si usava il tag #livestream.

Ma ho provato di nuovo oggi e la chat non sembra essere incorporata nel layout come prima (almeno secondo il mio ricordo). Inoltre, non c’è alcun pulsante “Livestream” nell’interfaccia dell’evento. È normale?

2 Mi Piace

Hai visto le istruzioni aggiornate di recente? Credo che l’interfaccia utente sia cambiata un po’ quando tutto è stato integrato in questo plugin.

1 Mi Piace