Questo plugin è ora incluso nel core di Discourse come parte di Bundling more popular plugins with Discourse core. Se stai auto-ospitando e utilizzi il plugin, devi rimuoverlo dal tuo app.yml prima del tuo prossimo aggiornamento.
Certamente – ecco la versione rivista, un po’ più amichevole e aperta per il tuo post in inglese:
Abbiamo davvero bisogno della possibilità di limitare il numero di partecipanti per gli eventi, poiché molti dei nostri eventi hanno una capacità limitata.
Attualmente, il sistema eventi non ci consente di:
- impostare un numero massimo di partecipanti,
- vedere chi si è iscritto per primo (nessun timestamp di registrazione),
- gestire una lista d’attesa o notificare le persone quando si libera un posto.
Troveremmo molto utili le seguenti funzionalità:
- Un limite di partecipanti (cap) che impedisca a più utenti di iscriversi una volta raggiunto il limite.
- Una lista d’attesa per coloro che desiderano ancora partecipare dopo che l’evento è al completo.
- Notifiche automatiche quando si rende disponibile un posto.
- Timestamp opzionali per vedere l’ordine delle iscrizioni (utile per una prioritizzazione equa).
Questo sarebbe incredibilmente utile per le community che gestiscono eventi di persona o con capacità limitata.
È già previsto o in fase di sviluppo qualcosa di simile?
O ci sono delle soluzioni alternative note per questo caso d’uso?
Grazie mille in anticipo!
Grazie Aurora — siamo davvero entusiasti di sapere che il lavoro sul calendario nativo è di nuovo attivo!
Vorremmo anche segnalare un’ulteriore richiesta ad alto impatto emersa in diverse discussioni della community: la sincronizzazione dei feed iCal.
Questa è stata separata in un argomento dedicato qui:
La possibilità di iscriversi a feed .ics esterni (come orari scolastici, calendari civici o eventi organizzativi) e vederli riflessi in un calendario di argomenti di Discourse renderebbe questa funzionalità molto più utile per molte implementazioni reali. Senza di essa, siamo costretti a copiare manualmente gli eventi, il che è soggetto a errori e difficile da mantenere.
Apprezzeremmo molto qualsiasi commento dal team di Discourse riguardo al fatto se parti di quella proposta — come la sincronizzazione iCal unidirezionale, le impostazioni dell’intervallo di aggiornamento del feed o il tagging opzionale degli eventi — rientrino nell’ambito dell’implementazione imminente.
In ogni caso, grazie ancora per aver ridato vita a Discourse Calendar — non vediamo l’ora di scoprire cosa ci riserva il futuro!
Se vuoi mostrare il pulsante “Crea evento” direttamente dall’editor come mostrato di seguito, usa il codice seguente nell’intestazione del tuo tema. admin > aspetto > tema > modifica > modifica codice > head (assicurati che sia posizionato tra i tag <head>)
Testato su discourse 3.5.0.beta9-dev su desktop in firefox
<!-- Pulsante Crea Evento Personalizzato (Basato su Icona, Indipendente dalla Lingua) -->
<script>
(() => {
const composerSelector = ".d-editor-button-bar";
const menuTriggerSelector = ".btn.no-text.fk-d-menu__trigger.toolbar-menu__options-trigger.toolbar__button.options.toolbar-popup-menu-options";
const menuContentSelector = ".fk-d-menu__inner-content";
const menuModalSelector = ".d-modal.fk-d-menu-modal";
// Funzione per trovare il pulsante del calendario nell'editor
const findCalendarButton = (editor) => {
const calendarIcon = editor.querySelector('svg use[href="#calendar-day"]');
return calendarIcon ? calendarIcon.closest("button") : null;
};
// Funzione per attendere che un elemento sia presente nel DOM
const waitForElement = (selector, getElementFn, timeout = 4000) =>
new Promise((resolve, reject) => {
const element = getElementFn(selector);
if (element) return resolve(element);
const observer = new MutationObserver(() => {
const foundElement = getElementFn(selector);
if (foundElement) {
observer.disconnect();
resolve(foundElement);
}
});
observer.observe(document.body, { childList: true, subtree: true });
setTimeout(() => {
observer.disconnect();
reject(new Error("Timeout waiting for element"));
}, timeout);
});
// Funzione per attendere che la modale del menu si apra
const waitForMenuModal = (timeout = 4000) => {
const observer = new MutationObserver(() => {
if (document.querySelector(menuModalSelector)) {
observer.disconnect();
}
});
observer.observe(document.body, { childList: true, subtree: true });
setTimeout(() => observer.disconnect(), timeout);
};
// Funzione per aggiungere il pulsante "Crea evento" personalizzato
const addCustomCreateEventButton = (editor) => {
if (editor.querySelector(".custom-create-event-btn")) return;
const newButton = document.createElement("button");
newButton.className = "btn no-text btn-icon toolbar__button link custom-create-event-btn";
newButton.title = "Create event";
newButton.innerHTML = `
<svg class="fa d-icon d-icon-calendar-day svg-icon">
<use href="#calendar-day"></use>
</svg>
`;
editor.appendChild(newButton);
newButton.addEventListener("click", async () => {
const trigger = document.querySelector(menuTriggerSelector);
if (!trigger) return;
trigger.click();
let menuContent = document.querySelector(menuContentSelector);
if (!menuContent) {
await new Promise((resolve, reject) => {
const c = new MutationObserver(() => {
menuContent = document.querySelector(menuContentSelector);
if (menuContent) {
c.disconnect();
resolve();
}
});
c.observe(document.body, { childList: true, subtree: true });
setTimeout(() => {
c.disconnect();
reject(new Error("Timeout waiting for menu content"));
}, 2000);
});
}
try {
(await waitForElement(menuContentSelector, (sel) => document.querySelector(sel))).click();
waitForMenuModal();
} catch (error) {
console.error("Error clicking create event option:", error);
}
});
};
// Osserva le mutazioni del DOM per trovare il composer e aggiungere il pulsante
const observer = new MutationObserver(() => {
const composer = document.querySelector(composerSelector);
if (composer) {
addCustomCreateEventButton(composer);
}
});
observer.observe(document.body, { childList: true, subtree: true });
// Aggiungi il pulsante se il composer è già presente al caricamento della pagina
const initialComposer = document.querySelector(composerSelector);
if (initialComposer) {
addCustomCreateEventButton(initialComposer);
}
})();
</script>
Ho provato lo script, il pulsante creation evenement è stato creato correttamente ma quando ci clicco sopra ho lo stesso menu contestuale del pulsante più. Forse ho fatto una manipolazione errata
Ciao,
Questo funziona sull’ultima versione con 3.5.0.beta9-dev, non conosco la tua versione?
E questo è javascript, quindi dovresti fornire l’errore JS dalla console quando premi F12 nel tuo browser.
Ho la stessa versione 3.5.0.beta9-dev
questo è il messaggio della console
Devo per forza fare qualcosa di sbagliato
Non uso Edge, puoi riprovare con lo script che ho appena aggiornato nel post originale poiché ho riscontrato degli errori che ho corretto. Se non funziona, aggiornerò più tardi dopo aver installato Edge.
Ho appena aggiornato lo script per renderlo più compatibile con i dispositivi mobili, ora dovrebbe funzionare, per favore copia incolla lo script dal post originale
Confermo che il codice aggiornato funziona correttamente in edge. Se hai qualcosa come ublock, puoi sempre disabilitarlo per la tua pagina discourse, ma non credo sia correlato.
Mi dispiace, ho ancora lo stesso problema, devo fare qualcosa di sbagliato
Eppure incollo qui il tuo script
Va bene, grazie alla situazione di Gilles, ho potuto impostare un selettore basato sulla classe .svg dell’icona che è unica invece di un attributo title che varierebbe in base alla lingua, lo script è ora anche minificato e racchiuso in una IIFE.
Puoi trovare lo script aggiornato qui Discourse Calendar (and Event) - #535 by opcourdis
Grazie per il tuo aiuto ![]()
Sarebbe molto utile avere il tuo script impacchettato come Theme component, e che le categorie in cui si applica siano selezionabili.
Il caso d’uso che ho in mente è una categoria “Eventi”, dove voglio rendere la pubblicazione di eventi super-evidente.
Puoi usare quanto segue e modificare le prime condizioni per specificare le tue categorie, e per rendere il pulsante più visibile, il CSS farà questo: .btn.no-text.btn-icon.toolbar__button.link.custom-create-event-btn {
order: -1;
}
<script>(()=>{if(!(document.body.classList.contains("category-events")||document.body.classList.contains("category-event2")||document.body.classList.contains("category-event3")))return;const e=".d-editor-button-bar",t=".btn.no-text.fk-d-menu__trigger.toolbar-menu__options-trigger.toolbar__button.options.toolbar-popup-menu-options",n=".fk-d-menu__inner-content",o=".d-modal.fk-d-menu-modal",c=e=>((e=e.querySelector('svg use[href="#calendar-day"]'))?e.closest("button"):null),r=(e,t,n=4e3)=>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)}),l=(e=4e3)=>{const t=new MutationObserver(()=>{document.querySelector(o)&&t.disconnect()});t.observe(document.body,{childList:!0,subtree:!0}),setTimeout(()=>t.disconnect(),e)},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",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);o||(await new Promise((e,t)=>{const c=new MutationObserver(()=>{o=document.querySelector(n)&&c.disconnect(),e()});c.observe(document.body,{childList:!0,subtree:!0}),setTimeout(()=>c.disconnect(),t)},2e3)}));try{(await r(o,c)).click(),l()}catch{}})},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>
Grazie per il suggerimento, sono ancora un po' nuovo a Discourse e controllerò il componente del tema, il posizionamento del pulsante è effettivamente migliore, ma il mio altro script per il limite di partecipanti all'evento potrebbe presto non essere necessario a causa di questo https://github.com/discourse/discourse/pull/34313
Dopo l’aggiornamento all’ultima versione di Discourse e del plugin discourse-calendar, sto vedendo il seguente avviso come amministratore:
⚠️ I post potrebbero non essere visualizzati correttamente perché uno dei decoratori di contenuto dei post sul tuo sito ha generato un errore.
Causato dal plugin 'discourse-calendar'
(questo messaggio viene mostrato solo agli amministratori del sito)
- Il plugin del calendario non funziona più: il contenuto del calendario e gli eventi non vengono visualizzati negli argomenti.
- Il plugin funzionava correttamente prima del recente aggiornamento.
- Il mio sito Discourse e tutti i plugin ufficiali sono ora aggiornati.
Stiamo utilizzando il plugin Discourse Post Event sul nostro forum.
Attualmente, quando un utente si unisce (RSVP) a un evento, l’argomento viene automaticamente impostato su “Seguendo”, il che significa che ogni nuova risposta all’argomento dell’evento attiva una notifica per tutti i partecipanti.
Vorremmo mantenere il livello di notifica come “Normale” per impostazione predefinita, anche dopo che qualcuno si è unito a un evento.
Ho controllato le impostazioni del sito ma non sono riuscito a trovare un’opzione che funzioni.
C’è un modo per disabilitare o modificare questo comportamento automatico di “Seguendo” quando gli utenti confermano la loro partecipazione a un evento?
Non credo. Ma questa sarebbe una richiesta di funzionalità utile.
Una utile soluzione potrebbe essere quella di chiudere l’argomento per interrompere le risposte, ma avere un canale di chat associato (questi non notificano per impostazione predefinita).
L’etichetta del pulsante “Oggi” può essere fuorviante.
Il pulsante in realtà non naviga al giorno corrente, ma alla vista corrente della scheda del periodo di tempo attivo (Giorno/Settimana/Mese/Anno). Su Giorno, Settimana e Mese questo porta effettivamente alla vista del giorno corrente. Ma su Anno, naviga solo all’anno corrente (che inizia sempre a gennaio).
Probabilmente dovrebbe essere
- rinominato per descrivere più accuratamente la sua funzionalità, come “Corrente”
- o, forse meglio, non solo navigare all’anno corrente, ma scorrere fino al giorno corrente nell’elenco Anno.








