モバイルの最新情報でトピックを装飾する

カスタムユーザーフィールドに含まれるキーワードを含む投稿をブロックするテーマコンポーネントに取り組んでいます。これは、デスクトップ表示の最新またはトップにリストされているときに、返信とトピックの両方を非表示にするのに役立ちますが、アプリまたはモバイルで表示すると、トピックがブロックされたという通知が追加されますが、コンテンツにブロックされたクラスが適用されません。トピック内の返信のブロックは、モバイルまたはアプリで問題なく機能します。

components を確認したところ、モバイルで異なる .hbs が使用されているようには見えませんでしたが、他に何か見落としていることはありますか?

const discourseComputed = require("discourse-common/utils/decorators").default;

function addIgnoredTopicClass() {
    if (currentUser) {
        api.container.lookup('store:main').find('user', currentUser.username).then((user) => {
            const blocklist = user.user_fields[1];
            const case_sensitive = user.user_fields[2];
            const whole_words = user.user_fields[3];

            const blocked = blocklist.split(",").map(function(item) {
                if (case_sensitive) {
                    return item.trim();
                } else {
                    return item.trim().toLowerCase();
                }
            });
            let classList = this._super(...arguments);
            let elem = document.querySelectorAll("[data-topic-id='" + this.topic.id.toString() + "']")[0];
            console.log(elem);
            const title = (case_sensitive) ? this.topic.fancy_title : this.topic.fancy_title.toLowerCase();
            const excerpt = (case_sensitive) ? this.topic.excerpt : this.topic.excerpt.toLowerCase();
            let result = "";

            for (let index = 0; index < blocked.length; ++index) {
                    let pattern = (whole_words) ? new RegExp('(?:\\b|\\s|^)' + blocked[index] + '(?:\\b|\\s|$)') : new RegExp(blocked[index]);
                    // console.log(pattern)
                    if (pattern.test(title)) {
                        classList += "blocker-blocked"
                        const found = blocked.filter(text => title.includes(text));
                        if (found.length >= 2) {
                            const last = found.pop();
                            result = found.join(', ') + ' and ' + last;
                        } else {
                            result = found.join(', ');
                        }
                        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.children[0].insertBefore(newNode, elem.children[0].children[0]);
                        for (let index = 0; index < elem.children.length; ++index) {
                            if (elem.children[index].classList.contains('main-link')) {
                                elem.children[index].classList.add("blocker-blocked");
                            }
                        }
                        newNode.classList.remove("blocker-blocked");
                    }
                }

            // console.log(classList);
            return classList;
        });
    }
}

api.modifyClass("component:topic-list-item", {
    @discourseComputed()
    unboundClassNames() {
        return addIgnoredTopicClass.call(this);
    }
});

api.modifyClass("component:latest-topic-list-item", {

    @discourseComputed()
    unboundClassNames() {
        return addIgnoredTopicClass.call(this);
    }
});

少なくとも、これが機能していると思っていました。少し別の作業をしてから、もう機能しなくなりました:thinking: api.modifyClassの問題を抱えているのかもしれませんか?

興味本位ですが、これは組み込みのWatch Words機能とどう違うのですか?

「いいね!」 1

私の理解では、Watched Words はすべてのユーザーに適用される管理者設定で正しいですか?私がやろうとしているのは、ユーザーが基本的に独自の watched words フィルターを持てるようにすることです。これにより、フォーラムのルール内にある投稿を、ユーザーが自身の理由で表示したくない場合に除外できます。

偽のシナリオ:ペットフォーラムでは、ペットの毛の対処法に関する一般的なスレッドがあり、メインのトピックは特定の種類の動物でタグ付けされていません。ユーザーAが犬について返信し、ユーザーBが猫について返信しますが、ユーザーAは猫に関するものは一切見たくありません。このテーマコンポーネントは、ユーザーAが「cat」をブロックリストに入れられるようにし、トピックや返信のどこかに「cat」が表示された場合、それを「猫が含まれているためブロックされました」に置き換え、クリックすると表示できるようにします。

これは、トピックに沿っていてフォーラム全体のルール内にあるものの、タグ付けされていない、またはユーザーAが見たいものではないスレッドの返信で発生する可能性のあるものに使用されます。私が移行元のフォーラムでは、読み込み後にページをスキャンする簡単なブラウザユーザースクリプトを使用していましたが、Discourse の魅力の 1 つは、ブロック機能を組み込んでモバイルでも機能するようにできる可能性でした(私たちが使用していたユーザースクリプトはモバイルブラウザでは実行されません)。ユーザーがルール違反ではなく X を見たくないことを決定できる場合、フラグ付けや一般的なスレッドに何が属するかについての議論を減らすことができます。

これは適切なテーマコンポーネントとして投稿しないと思います。なぜなら、管理者パネルに 3 つのユーザーフィールドを作成する必要があるからです(これは自動的に作成するにはプラグインが必要だと思いますか?)。私は基本的なホストプランを使用しており、プラグインをいじっていませんが、完成したテーマコンポーネントコードとユーザーフィールドの設定は完了後に投稿できます。

「いいね!」 4

それは素晴らしいですね。:slight_smile: いくつかのフォーラムで役立つと思います。

「いいね!」 3

ええ、可能性は理解できます。ミュート機能の修正版を拡張して使用することさえできます。ミュートしたユーザーへの他の人の返信がまだ見えると不満を言うユーザーが一人いるからです :man_facepalming: 。笑

たくさんの興味深い可能性。あなたのプロジェクトに注目していきます。
:vulcan_salute::smiling_face_with_sunglasses::+1:

「いいね!」 1

問題がどこにあるのかを特定するにはどうすればよいですか? Chrome開発者ツールのモバイルモードを使用すると正常に動作しますが、実際の電話のChromeやAndroidアプリでは動作しません。Plugin Outletsテーマコンポーネントを使用していますが、topic-list-item自体を変更しようとしているため、関連するアウトレットは見当たらないようです。

これは基本的な質問かもしれませんが、Emberを扱うのは初めてなので、ご容赦ください。

「いいね!」 1

これをモバイルで動作させ、参加の承認が得られたら Theme component に投稿します。モバイルでのこの問題は、「main-link」クラスを持つトピックリストの子要素にクラスを追加していたことですが、モバイルではそのmain-linkの子要素がデスクトップよりも階層が数ステップ下にあったことです。

「いいね!」 1