إضافة زر إلى مكون سمة TOC

آمل أن تتمكن من إضافة وظيفة الدليل المخفي.

إضافات مخصصة

تم إنشاء هذا بالرجوع إلى إضافتك، مع إضافة زر واحد بشكل أساسي، ثم استخدام JavaScript للعرض الديناميكي.

discourse-----------------------hide-toc (1).zip (3.3 KB)

CSS / JavaScript

css

// عرض الأنماط المتعلقة بالدليل في المحرر

// تحديد الأنماط لعرض الدليل في معاينة المحرر
.edit-title .d-editor-preview [data-theme-toc="false"],
body.toc-for-replies-enabled .d-editor-preview [data-theme-toc="false"] {
  // تعيين لون الخلفية إلى اللون الثالث للموضوع
  background: var(--tertiary);
  // تعيين لون النص إلى اللون الثاني للموضوع
  color: var(--secondary);
  // تعيين العنصر إلى موضع ثابت، بحيث يبقى في أعلى نافذة العرض عند التمرير
  position: sticky;
  // تعيين z-index إلى 1، لضمان ظهور هذا العنصر فوق العناصر الأخرى
  z-index: 1;
  // تعيين مسافة العنصر من أعلى نافذة العرض إلى 0
  top: 0;
  // تعيين ارتفاع العنصر إلى 30 بكسل
  height: 30px;
  // تعيين طريقة عرض العنصر كـ flexbox، لتسهيل محاذاة المحتوى
  display: flex;
  // محاذاة العناصر عمودياً في flexbox
  align-items: center;
  // محاذاة العناصر أفقياً في flexbox
  justify-content: center;
  
  // استخدام العنصر الزائف :before لإدراج محتوى قبل العنصر
  
  &:before {
    // تعيين المحتوى المدرج إلى قيمة المتغير $composer_toc_text
    // content: "#{$composer_toc_text}";
    content: "لن يعرض هذا المنشور دليلاً";
  }
}

JavaScript

<script>
    // تعريف دالة لتعيين نمط العنصر
    function setStyle(selector, styles) {
        // البحث عن العنصر المحدد بواسطة المحدد
        const element = document.querySelector(selector);
        // إذا تم العثور على العنصر، فقم بتطبيق النمط
        if (element) {
            Object.assign(element.style, styles);
        }
    }

    // تعريف دالة للتحقق مما إذا كان محتوى الصفحة يحتوي على علامة TOC محددة
    function checkForTOCMarkup() {
        // التحقق مما إذا كان محتوى الصفحة يحتوي على سلسلة محددة
        if (document.body.innerHTML.includes('<div data-theme-toc="false">')) {
            // إخفاء عنصر الخط الزمني
            setStyle('.with-timeline', { display: 'none' });
            // تعديل نمط أعمدة حاوية المنشور إلى 100%
            setStyle('.container.posts', { gridTemplateColumns: '100%' });
            // تعيين عرض محتوى الموضوع إلى 100%
            setStyle('.topic-body', { width: '100%' });
            // تعيين الحد الأقصى للعرض والمسافة البادئة اليسرى لخريطة الموضوع
            setStyle('.topic-map', { maxWidth: '100%', paddingLeft: '0px' });
            // إخفاء عنصر صورة رمز الموضوع
            setStyle('.topic-avatar', { display: 'none' });
            // تعيين الحد الأقصى للعرض والمسافة البادئة اليسرى لعنصر الفجوة
            setStyle('.gap', { maxWidth: '100%', paddingLeft: '0px' });
            // تعيين الحد الأقصى للعرض والمسافة البادئة اليسرى لأزرار تذييل الموضوع
            setStyle('#topic-footer-buttons', { maxWidth: '100%', paddingLeft: '0px' });

        } else {
            // تذكر عدم استخدام الكود الافتراضي قبل التعديل، لأنه سيؤثر على الهاتف المحمول، ودعه يتعامل مع النظام تلقائيًا
            // setStyle('.topic-body', { width: 'calc(var(--topic-body-width) + var(--topic-body-width-padding)*2)' }); // استعادة العرض الافتراضي
            
            setStyle('.with-timeline', { display: '' }); // استعادة النمط الافتراضي
            setStyle('.container.posts', { gridTemplateColumns: '' }); // استعادة نمط الأعمدة الافتراضي
            setStyle('.topic-body', { width: '' }); // استعادة العرض الافتراضي
            setStyle('.topic-map', { maxWidth: '', paddingLeft: '' }); // استعادة النمط الافتراضي
            setStyle('.topic-avatar', { display: '' }); // استعادة العرض الافتراضي
            setStyle('.gap', { maxWidth: '', paddingLeft: '' }); // استعادة النمط الافتراضي
            setStyle('#topic-footer-buttons', { maxWidth: '', paddingLeft: '' }); // استعادة النمط الافتراضي
        }
        
    }

    // إنشاء مثيل مراقب لمراقبة تغييرات DOM
    const observer = new MutationObserver(checkForTOCMarkup);
    // تكوين خيارات المراقب، ومراقبة تغييرات العقد الفرعية وجميع العقد اللاحقة
    const config = { childList: true, subtree: true };

    // بدء مراقبة تغييرات المستند
    observer.observe(document.body, config);

    // إجراء فحص فوري عند تحميل الصفحة
    checkForTOCMarkup();
</script>

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

إذا كنت تقصد إخفاء جدول المحتويات، فيمكنك القيام بذلك بالفعل عن طريق النقر على زر المخطط الزمني في أسفل اليمين.

بعد ذلك، ستحصل على المخطط الزمني المعتاد مع زر “Contents” (المحتويات) الذي سيمكنك من إعادة تمكين جدول المحتويات.

إعجابَين (2)

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

إعجابَين (2)

@Lilly هل يمكنك اقتراح ما قد أكون أفتقده، حيث لا يبدو أنني أجد زر Timeline هذا على مواقعي، على سبيل المثال:

إعجابَين (2)

أعتقد أن السبب هو أن الموضوع لا يحتوي على ردود.
لا يمكنني رؤية هذا الزر في Customizing your site with existing theme components. ولكنه مرئي في https://meta.discourse.org/t/understanding-stats-for-topic-views-posts-read-and-reading-time/254542، والذي يحتوي على رد.

3 إعجابات

شكرا @Moin كان هذا هو السبب! لقد أضفت رد اختبار إلى هذا الموضوع والآن يظهر زر التبديل بين المخطط الزمني / جدول المحتويات بالفعل!

3 إعجابات

[اقتباس=“Lilly, المشاركة: 2، الموضوع: 335200”]
إذًا ستحصل على التسلسل الزمني المعتاد مع زر “المحتويات” الذي سيسمح لك بإعادة تمكين جدول المحتويات.
[/اقتباس]

لماذا ليس لدي هذا الزر؟

هل لدى موضوعك رد؟

إعجابَين (2)

أها أنت على حق!
لا يصدق

لكن أعتقد أن هذا خطأ، لأنه بدون هذا الزر ليس لدينا وصول إلى الإشعارات وخيارات الموضوع (ووضع القارئ)

إعجابَين (2)

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

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