Ajouter un bouton au composant thème TOC

J’espère que vous pourrez ajouter la fonction de répertoire caché.

Plugins personnalisés

Ceci est fait en référence à votre plugin, ajoutant principalement un bouton supplémentaire, puis en utilisant JavaScript pour le rendu dynamique.

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

CSS / JavaScript

css

// Styles liés au répertoire affiché dans l'éditeur

// Définit les styles pour afficher le répertoire dans l'aperçu de l'éditeur
.edit-title .d-editor-preview [data-theme-toc="false"],
body.toc-for-replies-enabled .d-editor-preview [data-theme-toc="false"] {
  // Définit la couleur d'arrière-plan sur la troisième couleur du thème
  background: var(--tertiary);
  // Définit la couleur du texte sur la deuxième couleur du thème
  color: var(--secondary);
  // Définit l'élément comme positionné de manière fixe, le maintenant en haut de la fenêtre d'affichage lors du défilement
  position: sticky;
  // Définit z-index sur 1 pour s'assurer que cet élément s'affiche au-dessus des autres éléments
  z-index: 1;
  // Définit la distance de l'élément par rapport au haut de la fenêtre d'affichage à 0
  top: 0;
  // Définit la hauteur de l'élément à 30 pixels
  height: 30px;
  // Définit la manière dont l'élément est affiché comme flexbox, afin de faciliter l'alignement du contenu
  display: flex;
  // Centre verticalement les éléments dans la flexbox
  align-items: center;
  // Centre horizontalement les éléments dans la flexbox
  justify-content: center;
  
  // Utilise le pseudo-élément :before pour insérer du contenu avant l'élément
  &:before {
    // Définit le contenu inséré sur la valeur de la variable $composer_toc_text
    // content: "#{$composer_toc_text}";
    content: "Ce message n'affichera pas de répertoire";
  }
}

JavaScript

    // Définit une fonction pour définir le style d'un élément
    function setStyle(selector, styles) {
        // Recherche l'élément correspondant au sélecteur spécifié
        const element = document.querySelector(selector);
        // Si l'élément est trouvé, applique le style
        if (element) {
            Object.assign(element.style, styles);
        }
    }

    // Définit une fonction pour vérifier si le contenu de la page contient des balises TOC spécifiques
    function checkForTOCMarkup() {
        // Vérifie si le contenu de la page contient une chaîne de caractères spécifique
        if (document.body.innerHTML.includes('<div data-theme-toc="false">')) {
            // Masque l'élément de chronologie
            setStyle('.with-timeline', { display: 'none' });
            // Modifie le style de colonne du conteneur de message pour qu'il soit de 100%
            setStyle('.container.posts', { gridTemplateColumns: '100%' });
            // Définit la largeur du corps du sujet à 100%
            setStyle('.topic-body', { width: '100%' });
            // Définit la largeur maximale et le padding gauche de la carte du sujet
            setStyle('.topic-map', { maxWidth: '100%', paddingLeft: '0px' });
            // Masque l'élément d'avatar du sujet
            setStyle('.topic-avatar', { display: 'none' });
            // Définit la largeur maximale et le padding gauche de l'élément d'espacement
            setStyle('.gap', { maxWidth: '100%', paddingLeft: '0px' });
            // Définit la largeur maximale et le padding gauche des boutons du pied de page du sujet
            setStyle('#topic-footer-buttons', { maxWidth: '100%', paddingLeft: '0px' });

        } else {
            // N'oubliez pas de ne pas utiliser le code par défaut avant la modification, car il affectera le mobile, laissez le système le gérer automatiquement
            // setStyle('.topic-body', { width: 'calc(var(--topic-body-width) + var(--topic-body-width-padding)*2)' }); // Restaure la largeur par défaut
            
            setStyle('.with-timeline', { display: '' }); // Restaure le style par défaut
            setStyle('.container.posts', { gridTemplateColumns: '' }); // Restaure le style de colonne par défaut
            setStyle('.topic-body', { width: '' }); // Restaure la largeur par défaut
            setStyle('.topic-map', { maxWidth: '', paddingLeft: '' }); // Restaure le style par défaut
            setStyle('.topic-avatar', { display: '' }); // Restaure l'affichage par défaut
            setStyle('.gap', { maxWidth: '', paddingLeft: '' }); // Restaure le style par défaut
            setStyle('#topic-footer-buttons', { maxWidth: '', paddingLeft: '' }); // Restaure le style par défaut
        }
        
    }

    // Crée une instance d'observateur pour surveiller les changements dans le DOM
    const observer = new MutationObserver(checkForTOCMarkup);
    // Configure les options de l'observateur pour surveiller les changements dans les nœuds enfants et tous les descendants
    const config = { childList: true, subtree: true };

    // Commence à observer les changements dans le document
    observer.observe(document.body, config);

    // Exécute une vérification immédiatement au chargement de la page
    checkForTOCMarkup();

1 « J'aime »

si vous voulez dire masquer la table des matières, vous pouvez déjà le faire en cliquant sur le bouton de la chronologie en bas à droite.

Vous obtiendrez alors la chronologie habituelle avec un bouton « Contents » qui vous permettra de réactiver la table des matières.

2 « J'aime »

Non, il s’agit de masquer toute la barre latérale et d’agrandir la zone de contenu, car votre plugin sera mieux compatible si vous le faites sur cette base, et vous pouvez l’ajouter comme vous le souhaitez.

2 « J'aime »

@Lilly peux-tu suggérer ce qui pourrait me manquer, car je ne trouve pas ce bouton Timeline sur mes sites, par ex.

2 « J'aime »

Je pense que c’est parce que le sujet n’a pas de réponses.
Je ne peux pas voir ce bouton sur Customizing your site with existing theme components. Mais il est visible sur Understanding stats for 'topic views', 'posts read', and 'reading time', qui a une réponse.

3 « J'aime »

Merci @Moin, c’était ça ! J’ai ajouté une réponse de test à ce sujet et maintenant le bouton de commutation Timeline / TOC apparaît bien !

3 « J'aime »

[citation=“Lilly, post:2, topic:335200”]
Vous obtiendrez alors le calendrier habituel avec un bouton « Contenu » qui vous permettra de réactiver la table des matières.
[/citation]

pourquoi je n’ai pas ce bouton ?

Votre sujet a-t-il une réponse ?

2 « J'aime »

ahha tu as raison !
incroyable

mais je pense que c’est un bug, car sans ce bouton nous n’avons pas accès aux notifications et aux options du sujet (et au mode lecture)

2 « J'aime »

De plus, ce n’est pas intuitif. J’ai dit à mon collègue, nouveau sur Discourse, d’épingler un sujet. Il a dit qu’il n’y avait pas de bouton. Je suis donc allé le voir pour lui montrer et, eh bien, pas de bouton, juste une table des matières (TOC). Je faisais défiler de haut en bas et la clé à molette est apparue brièvement puis a disparu. J’ai donc encore fait défiler au hasard jusqu’à ce que j’atteigne la première réponse et nous avons réalisé comment cela fonctionnait. Ce n’était pas du tout évident. Surtout sur les sujets longs (qui sont exactement ceux qui ont une TOC), cela peut être un défi.

1 « J'aime »