Dieses Plugin ist jetzt Teil des Discourse-Kerns im Rahmen von Bundling more popular plugins with Discourse core. Wenn Sie selbst hosten und das Plugin verwenden, müssen Sie es vor Ihrem nächsten Upgrade aus Ihrer app.yml entfernen.
Gerne – hier ist die überarbeitete, etwas freundlichere und offenere Version für deinen Beitrag auf Englisch:
Wir brauchen wirklich die Möglichkeit, die Anzahl der Teilnehmer für Veranstaltungen zu begrenzen, da viele unserer Veranstaltungen eine begrenzte Kapazität haben.
Derzeit erlaubt uns das Veranstaltungssystem nicht:
- eine maximale Anzahl von Teilnehmern festzulegen,
- zu sehen, wer sich zuerst angemeldet hat (keine Registrierungs-Zeitstempel),
- eine Warteliste zu verwalten oder Personen zu benachrichtigen, wenn ein Platz frei wird.
Folgende Funktionen wären für uns sehr hilfreich:
- Eine Teilnehmerbegrenzung (Obergrenze), die verhindert, dass sich weitere Benutzer anmelden, sobald sie voll ist.
- Eine Warteliste für diejenigen, die nach ausgebuchter Veranstaltung noch teilnehmen möchten.
- Automatische Benachrichtigungen, wenn ein Platz frei wird.
- Optionale Zeitstempel, um die Reihenfolge der Anmeldungen zu sehen (nützlich für eine faire Priorisierung).
Dies wäre unglaublich nützlich für Communities, die Präsenzveranstaltungen oder Veranstaltungen mit begrenzter Kapazität durchführen.
Ist so etwas bereits geplant oder in der Entwicklung?
Oder gibt es bekannte Workarounds für diesen Anwendungsfall?
Vielen Dank im Voraus!
Danke Aurora – ich freue mich sehr zu hören, dass die native Kalenderarbeit wieder aktiv ist!
Wir möchten auch eine zusätzliche, wirkungsvolle Anfrage hervorheben, die in einer Reihe von Community-Diskussionen aufgetaucht ist: iCal-Feed-Synchronisierung.
Diese wurde hier in ein eigenes Thema aufgeteilt:
Die Möglichkeit, externe .ics-Feeds (wie Stundenpläne, städtische Kalender oder organisatorische Veranstaltungen) zu abonnieren und diese in einem Discourse-Themenkalender widerspiegeln zu lassen, würde diese Funktion für viele reale Einsätze erheblich nützlicher machen. Ohne sie sind wir gezwungen, Ereignisse manuell zu kopieren, was fehleranfällig und schwer zu warten ist.
Wir würden uns sehr über einen Kommentar des Discourse-Teams freuen, ob Teile dieses Vorschlags – wie die einseitige iCal-Synchronisierung, Einstellungen für das Intervall der Feed-Aktualisierung oder optionales Tagging von Ereignissen – im Rahmen der bevorstehenden Implementierung berücksichtigt werden.
Auf jeden Fall nochmals vielen Dank, dass Sie dem Discourse Calendar neues Leben eingehaucht haben – wir freuen uns auf das, was vor uns liegt!
Wenn Sie den Button “Event erstellen” direkt aus dem Composer anzeigen möchten, wie unten gezeigt, verwenden Sie den folgenden Code im Header Ihres Themes. admin\u003eappearance\u003etheme\u003eedit\u003eedit code\u003ehead (stellen Sie sicher, dass er zwischen den Tags platziert ist)
Getestet auf Discourse 3.5.0.beta9-dev auf dem Desktop in Firefox
<!-- Benutzerdefinierter Button "Event erstellen" (Symbolbasiert, sprachunabhängig) -->
<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 modalSelector = ".d-modal.fk-d-menu-modal";
const getCreateEventButton = (editor) => {
const calendarIcon = editor.querySelector('svg use[href="#calendar-day"]');
return calendarIcon ? calendarIcon.closest("button") : null;
};
const waitForElement = (selector, findFn, timeout = 4000) =>
new Promise((resolve, reject) => {
const element = findFn(selector);
if (element) return resolve(element);
const observer = new MutationObserver(() => {
const foundElement = findFn(selector);
if (foundElement) {
observer.disconnect();
resolve(foundElement);
}
});
observer.observe(document.body, { childList: true, subtree: true });
setTimeout(() => {
observer.disconnect();
reject(new Error("Element not found within timeout"));
}, timeout);
});
const waitForModal = (timeout = 4000) => {
const observer = new MutationObserver(() => {
if (document.querySelector(modalSelector)) {
observer.disconnect();
}
});
observer.observe(document.body, { childList: true, subtree: true });
setTimeout(() => observer.disconnect(), timeout);
};
const addCreateEventButton = (editor) => {
if (editor.querySelector(".custom-create-event-btn")) return;
const button = document.createElement("button");
button.className = "btn no-text btn-icon toolbar__button link custom-create-event-btn";
button.title = "Create event";
button.innerHTML = `<svg class="fa d-icon d-icon-calendar-day svg-icon"><use href="#calendar-day"></use></svg>`;
editor.appendChild(button);
button.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 observer = new MutationObserver(() => {
menuContent = document.querySelector(menuContentSelector);
if (menuContent) {
observer.disconnect();
resolve();
}
});
observer.observe(document.body, { childList: true, subtree: true });
setTimeout(() => {
observer.disconnect();
reject(new Error("Menu content not found within timeout"));
}, 2000);
});
}
try {
await waitForElement(menuContent, getCreateEventButton);
const createEventButton = document.querySelector(menuContentSelector + ' button[title="Create event"]'); // Adjust selector if needed
if (createEventButton) {
createEventButton.click();
waitForModal();
}
} catch (error) {
console.error("Error clicking create event button:", error);
}
});
};
const observer = new MutationObserver(() => {
const editor = document.querySelector(composerSelector);
if (editor) {
addCreateEventButton(editor);
}
});
observer.observe(document.body, { childList: true, subtree: true });
const initialEditor = document.querySelector(composerSelector);
if (initialEditor) {
addCreateEventButton(initialEditor);
}
})();
</script>
Ich habe das Skript ausprobiert, der Button „Ereignis erstellen“ wird gut erstellt, aber wenn ich darauf klicke, erhalte ich das gleiche Kontextmenü wie beim Plus-Button. Vielleicht habe ich etwas falsch gemacht
Nach dem Update hat es sich verbessert, es erscheint zumindest nur „Ereignis erstellen“
Screenshot ist deutsch, sorry.
Hallo,
Das funktioniert mit der neuesten Version 3.5.0.beta9-dev. Ich kenne Ihre Version nicht?
Und das ist JavaScript, daher sollten Sie den JS-Fehler aus der Konsole bereitstellen, wenn Sie F12 in Ihrem Browser drücken.
Ich habe die gleiche Version 3.5.0.beta9-dev
Hier ist die Konsolennachricht
Ich muss etwas falsch machen
Ich benutze Edge nicht. Können Sie es noch einmal mit dem Skript versuchen, das ich gerade im ursprünglichen Beitrag aktualisiert habe, da ich Fehler gefunden und korrigiert habe? Wenn es nicht funktioniert, werde ich es später aktualisieren, nachdem ich Edge installiert habe.
Ich habe das Skript gerade aktualisiert, um es besser mit Mobilgeräten kompatibel zu machen. Es sollte jetzt funktionieren. Bitte kopieren Sie das Skript aus dem ursprünglichen Beitrag.
Ich bestätige, dass der aktualisierte Code im Edge gut funktioniert. Wenn Sie etwas wie ublock haben, können Sie es jederzeit für Ihre Discourse-Seite deaktivieren, aber ich glaube nicht, dass es damit zusammenhängt.
Entschuldigung, immer noch das gleiche Problem für mich, ich muss etwas falsch machen
Dabei füge ich dein Skript hier ein
Dank Gilles’ Situation konnte ich einen Selektor basierend auf der .svg-Klasse des Icons einrichten, der eindeutig ist, anstatt eines Titels-Attributs, das je nach Sprache variieren würde. Das Skript ist jetzt auch minimiert und IIFE-umhüllt.
Sie finden das aktualisierte Skript hier Discourse Calendar (and Event) - #535 by opcourdis
Danke für deine Hilfe ![]()
Es wäre sehr hilfreich, wenn Ihr Skript als Theme component verpackt wäre und die Kategorien, für die es gilt, auswählbar wären.
Der Anwendungsfall, den ich im Sinn habe, ist eine “Events”-Kategorie, in der ich das Posten von Events super-duper offensichtlich machen möchte.
Sie können das Folgende verwenden und die ersten Bedingungen ändern, um Ihre Kategorien anzugeben. Damit der Button besser sichtbar ist, wird dies mit CSS erledigt: .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.querySelector('svg use[href="#calendar-day"]')?e.querySelector('svg use[href="#calendar-day"]').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>
Vielen Dank für den Vorschlag. Ich bin noch etwas neu bei Discourse und werde mir die Theme-Komponente ansehen. Die Platzierung des Buttons ist tatsächlich besser, aber mein anderes Skript für das Teilnehmerlimit für Veranstaltungen ist möglicherweise bald nicht mehr notwendig, da dies FEATURE: introduce max attendees for events by SamSaffron · Pull Request #34313 · discourse/discourse · GitHub
Nach dem Upgrade auf die neueste Version von Discourse und das discourse-calendar-Plugin sehe ich als Administrator die folgende Warnung:
⚠️ Beiträge werden möglicherweise nicht korrekt angezeigt, da einer der Beitragsdekoratoren auf Ihrer Website einen Fehler verursacht hat.
Verursacht durch Plugin 'discourse-calendar'
(diese Nachricht wird nur Website-Administratoren angezeigt)
- Das Kalender-Plugin funktioniert nicht mehr: Kalenderinhalte und Ereignisse werden in Themen nicht angezeigt.
- Das Plugin funktionierte vor dem letzten Upgrade einwandfrei.
- Meine Discourse-Site und alle offiziellen Plugins sind jetzt auf dem neuesten Stand.
Wir verwenden das Discourse Post Event-Plugin in unserem Forum.
Derzeit wird das Thema automatisch auf „Beobachten“ gesetzt, wenn ein Benutzer an einer Veranstaltung teilnimmt (RSVP). Das bedeutet, dass jede neue Antwort auf das Veranstaltungsthema eine Benachrichtigung an alle Teilnehmer auslöst.
Wir möchten die Benachrichtigungsstufe nach der Teilnahme an einer Veranstaltung standardmäßig auf „Normal“ belassen.
Ich habe die Website-Einstellungen überprüft, konnte aber keine passende Option finden.
Gibt es eine Möglichkeit, dieses automatische „Beobachten“-Verhalten beim RSVP zu einer Veranstaltung zu deaktivieren oder zu ändern?
Ich glaube nicht. Aber das wäre eine nützliche Funktionsanfrage.
Eine nützliche Problemumgehung könnte darin bestehen, das Thema zu schließen, um Antworten zu stoppen, aber einen Chat-Kanal damit zu verknüpfen (diese benachrichtigen standardmäßig nicht).
Die Beschriftung der Schaltfläche „Heute“ kann irreführend sein.
Die Schaltfläche navigiert nicht tatsächlich zum aktuellen Tag, sondern zur aktuellen Ansicht des aktiven Zeitrahmen-Tabs (Tag/Woche/Monat/Jahr). Bei Tag, Woche und Monat wird dadurch der aktuelle Tag angezeigt. Bei Jahr navigiert sie jedoch nur zum aktuellen Jahr (das immer im Januar beginnt).
Sie sollte wahrscheinlich:
- umbenannt werden, um ihre Funktionalität genauer zu beschreiben, z. B. „Aktuell“.
- oder, vielleicht besser, nicht nur zum aktuellen Jahr navigieren, sondern in der Jahresliste zum aktuellen Tag scrollen.








