تقويم Discourse (والحدث)

إذا كنت ترغب في إظهار زر إنشاء حدث من المنشئ مباشرةً كما هو موضح أدناه، فاستخدم الكود أدناه في رأس السمة الخاصة بك. admin>appearance>theme>edit>edit code>head (تأكد من وضعه بين علامتي <head> و </head>)

تم الاختبار على discourse 3.5.0.beta9-dev على سطح المكتب في فايرفوكس

 <!-- زر إنشاء حدث مخصص (يعتمد على الأيقونة، مقاوم للغة) -->
<script>
(() => {
    const editorButtonContainerSelector = ".d-editor-button-bar";
    const calendarButtonSelector = ".btn.no-text.fk-d-menu__trigger.toolbar-menu__options-trigger.toolbar__button.options.toolbar-popup-menu-options";
    const menuInnerContentSelector = ".fk-d-menu__inner-content";
    const menuModalSelector = ".d-modal.fk-d-menu-modal";

    const getCalendarButton = (container) => {
        const svgIcon = container.querySelector('svg use[href="#calendar-day"]');
        return svgIcon ? svgIcon.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();
            }, timeout);
        });

    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);
    };

    const addCustomCreateEventButton = (container) => {
        if (container.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>';
        container.appendChild(button);

        button.addEventListener("click", async () => {
            const calendarButton = document.querySelector(calendarButtonSelector);
            if (!calendarButton) return;
            calendarButton.click();

            let menuContent = document.querySelector(menuInnerContentSelector);
            if (!menuContent) {
                await new Promise((resolve, reject) => {
                    const observer = new MutationObserver(() => {
                        menuContent = document.querySelector(menuInnerContentSelector);
                        if (menuContent) {
                            observer.disconnect();
                            resolve();
                        }
                    });
                    observer.observe(document.body, { childList: true, subtree: true });
                    setTimeout(() => {
                        observer.disconnect();
                        reject();
                    }, 2000);
                });
            }

            try {
                (await waitForElement(menuInnerContentSelector, (sel) => document.querySelector(sel)))
                    .click();
                waitForMenuModal();
            } catch {
                // Handle error if needed
            }
        });
    };

    const observer = new MutationObserver(() => {
        const editorContainer = document.querySelector(editorButtonContainerSelector);
        if (editorContainer) {
            addCustomCreateEventButton(editorContainer);
        }
    });
    observer.observe(document.body, { childList: true, subtree: true });

    const initialEditorContainer = document.querySelector(editorButtonContainerSelector);
    if (initialEditorContainer) {
        addCustomCreateEventButton(initialEditorContainer);
    }
})();
</script>