Gekochte Elemente in der Kompositionsansicht nicht dekorieren?

Ich arbeite an einer Theme-Komponente, um Beiträge zu blockieren, die Schlüsselwörter enthalten, die der Benutzer in einem benutzerdefinierten Feld angibt.

Ich habe die Blockierungs-/Anzeigefunktionalität zum Laufen gebracht, aber sie dekoriert auch die Vorschauansicht der Composer-Ansicht beim Tippen. Gibt es eine Möglichkeit, zu verhindern, dass api.decorateCookedElement in der Composer-Vorschau ausgeführt wird? Unten ist, was ich bisher zum Laufen gebracht habe.

<script type="text/discourse-plugin" version="0.8">
let currentUser = api.getCurrentUser();

if (currentUser) {
    api.container.lookup('store:main').find('user', currentUser.username).then((user) => {
        let blocklist = user.user_fields[1];

        const blocked = blocklist.split(",").map(function(item) {
            return item.trim();
        });
        
        api.decorateCookedElement(
            elem => {
                let textContent = elem.textContent;
                let result = "";
                if (blocked.find(text => textContent.includes(text))) {
                    const found = blocked.filter(text => textContent.includes(text));
                    if (found.length >= 2) {
                        const last = found.pop();
                        result = found.join(', ') + ' and ' + last;
                    } else {
                        result = found.join(', ');
                    }
                    const children = elem.childNodes;
                    const newNode = document.createElement("a");
                    const textNode = document.createTextNode("Blocked for containing " + result + ".");
                    newNode.classList.add("block-notice")
                    newNode.appendChild(textNode);
                    newNode.onclick = function() { showComment(this); };
                    
                    elem.insertBefore(newNode, elem.children[0]);
                    for (let index = 0; index < children.length; ++index) {
                        children[index].classList.add("blocker-blocked")
                    }
                    newNode.classList.remove("blocker-blocked");
                }
            },
            {"id": "blocker-blocked"}
        );
        
    });
}

function showComment(elem) {
    const cooked = elem.parentNode;
    elem.remove();
    const children = cooked.childNodes;
    for (let index = 0; index < children.length; ++index) {
        children[index].classList.remove("blocker-blocked")
    }
}
</script>

Hallo,

Das Hinzufügen von onlyStream kann es bewirken. Hier ist ein Beispiel aus einem anderen Thema. :slightly_smiling_face:

3 „Gefällt mir“

Perfekt, danke für den Link!

1 „Gefällt mir“

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.