تحسين Oneboxes للأحداث

في الوقت الحالي، صناديق العرض للأحداث ليست جيدة جدًا. في الأساس، لا تختلف عن صناديق العرض العادية للمواضيع، ولا تتضمن التاريخ أو الوقت أو الوصف وما إلى ذلك (إلا إذا تم وضعها في عنوان الموضوع كحل بديل).

إليك مثال لحدث من موقعنا:

هل سيكون من الممكن ربطه بالبطاقات الجديدة (والممتازة) التي تظهر عند النقر في التقويم للأحداث، وتقديمها كصناديق عرض؟ على سبيل المثال:

قد لا يكون ذلك ممكنًا على الإطلاق، ولكني أتساءل عما إذا كان يمكن تعديل البيانات الوصفية لمنشورات الأحداث بحيث يتم عرضها كصناديق عرض بطريقة تسلط الضوء على معلومات الحدث الهامة (خاصة داخليًا).

7 إعجابات

ليس لدي أي أصوات متبقية ولكن لديك صوتي على أي حال :wink: ، هذا سيجعل الترويج للحدث يتألق أكثر بالفعل.

إعجابَين (2)

@chapoi / @j.jaffeux لقد كنت أفكر في هذا.

أعتقد أن تغييرًا جوهريًا نحتاج إليه هنا هو تقديم عناوين URL للأحداث المناسبة حتى تتمكن من استخدامها لـ onebox وبدلاً من oneboxing:

https://SITE/t/slug/123

سنقوم بعمل onebox لـ

https://SITE/event/slug/1234

إنه يفتح صندوق باندورا قليلاً (بطريقة جيدة على الرغم من ذلك)

  1. كيف يجد الأشخاص الرابط للحدث؟ (أعتقد أننا نضيف إلى قائمة السياق)
  2. ماذا يحدث إذا زاروا الحدث مباشرة من عنوان URL؟ (أعتقد أننا نعيد التوجيه إلى ما بعد الحدث في الوقت الحالي)
إعجابَين (2)

أتفق مع الفكرة - يمكن بالتأكيد القيام بشيء أفضل هنا

إذا كنت تقصد هذا:

هذا يبدو المكان المناسب لي أيضًا.

إعجابَين (2)

أثناء العبث بقائمة السياق تلك، أتساءل عما إذا كان “إضافة إلى التقويم” سيكون في مكان أفضل مباشرة على البطاقة. كل الأشياء الأخرى إدارية إلى حد ما، ولكن هذا الشيء مخصص لجميع المستخدمين وسيظهر بشكل جيد في واجهة المستخدم.

إعجاب واحد (1)

في منشورات الأحداث، أضع خيار “إضافة إلى التقويم” في مكان واضح؛ يمكنك إضافة هذا إلى رأس جافاسكريبت السمة الذي يمكن الوصول إليه من قائمة المظهر في لوحة الإدارة:

<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";

    // Add inline CSS to keep text and icon black on hover
    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);

    // Helper to wait for an element in the 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>
        `;

        // Inline styles for left alignment
        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";

        // Click logic: open menu and trigger original Add to Calendar
        button.addEventListener("click", async () => {
            const submenuButton = document.querySelector(submenuButtonSelector);
            if (!submenuButton) return;
            submenuButton.click(); // open menu

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

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

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

    // Observe DOM changes (Ember-safe)
    const observer = new MutationObserver(() => createAddToCalendarButton());
    observer.observe(document.body, { childList: true, subtree: true });

    // Initial attempt
    createAddToCalendarButton();
})();
</script>