メールが無効になっている場合でも、メール設定が表示される

すべてのメールが無効化されている場合、UX の観点からいくつか奇妙なことが起こります。これらはバグとみなすべきです。

  1. スタッフ以外のユーザーを含む全員が「システムからメールが送信されていない」というメッセージを受け取ります。この通知を無効にする方法はないようです。なぜユーザーが常にこのアラートを受け取る必要があるのか、理由が思い浮かびません。スタッフや管理者には表示しても問題ないかもしれません。ある時点で意識的な決定だったのかもしれませんが、その議論は見つけられませんでした。

https://github.com/discourse/discourse/blob/master/app/assets/javascripts/discourse/app/components/global-notice.js#L99

   if (
        this.siteSettings.disable_emails === "yes" ||
        this.siteSettings.disable_emails === "non-staff"
      ) {
        notices.push(
          Notice.create({
            text: I18n.t("emails_are_disabled"), // "管理者によってすべての送信メールがグローバルに無効化されました。どのような種類のメール通知も送信されません。"
            id: "alert-emails-disabled",
          })
        );
      }

ガード条件を以下のように変更すべきだと思います。

if (
        this.get("currentUser.staff") && // または currentUser.admin
        (this.siteSettings.disable_emails === "yes" ||
        this.siteSettings.disable_emails === "non-staff") 
      ) {
          …

あるいは、誰がこの通知を受け取るかを決める設定を少なくとも用意すべきです(例:全員/スタッフ/管理者/誰も)。

また、FIX: Show 'emails disabled' to staff users when disabled for non-staf… · discourse/discourse@acc121f · GitHub のこの修正では、メール無効化の通知はスタッフのみに表示されるべきという意図が見受けられますが、テスト https://github.com/discourse/discourse/blob/master/app/assets/javascripts/discourse/tests/acceptance/email-notice-test.js#L24 では、全員が通知を表示することが検証されています。

minor note: すべての test("when … という表記が少し混乱を招きます。例えば、「有効化時」は実際には disable_emails = "yes" をテストしており、設定の変更に対するテストであることは理解できますが、実際には「メール無効化」をテストしており、逆も同様です(「無効化時」はメール有効化をテスト)。おそらく、これは最終的な効果ではなく、設定された値を指しているのでしょう。これはプロジェクトの慣習かもしれません。その場合、全く問題ありません。ただ、新規参入者にとっては少し奇妙に感じます。

  1. disable_emails が “yes” または “non-staff” に設定されていても、ユーザー設定ページにはメールセクションが全員に表示されます。これは奇妙です。テンプレート内では、ダイジェストやメーリングリストが無効化された場合にその一部を無効化するチェックがあるからです。

ご覧の通り、チェックはありません https://github.com/discourse/discourse/blob/master/app/assets/javascripts/discourse/app/templates/preferences.hbs#L18

    <li class="nav-emails">
      {{#link-to "preferences.emails"}}
        {{i18n "user.preferences_nav.emails"}}
      {{/link-to}}
    </li>

私のバージョンでは以下のような実装にしています(これが皆さんが採用する方法かどうかはわかりませんが)。ご提案があれば歓迎します :wink:

      {{#if (show-emails-preferences model siteSettings.disable_emails)}}
          <li class="nav-emails">
            {{#link-to "preferences.emails"}}
              {{i18n "user.preferences_nav.emails"}}
            {{/link-to}}
          </li>
      {{/if}}

ここで show-emails-preferences は、ヘルパーとして以下のように定義されています。

registerUnbound("show-emails-preferences", (model, disable_emails, args) => {
  let result = true;
  if(disable_emails === 'yes'){
    result = false;
  }else if(disable_emails === 'non-staff'){
    result = model.staff ? true : false;
  }else{
    result = true;
  }
    return result;
});

これらの改善案が価値があると思われるものがあれば、PR を作成します。

よろしくお願いいたします。

「いいね!」 1

ついでに、テンプレート全体を以下のコードでラップしていることも付け加えておきます。
https://github.com/discourse/discourse/blob/master/app/assets/javascripts/discourse/app/templates/preferences/emails.hbs#L1

  {{#if (show-emails-preferences model siteSettings.disable_emails)}}
    {{#unless siteSettings.disable_mailing_list_mode}}
…

Discourse はメールなしでは動作しません。

アカウントの登録、パスワードのリセット、通知の受信、メールによるログインはすべてできません。メールは不可欠な要素です。このバナーが表示されているのは、サイトが機能していないことを全員に知らせるためです。

この警告を無効化できないのはバグではなく、意図的な機能です。

SSO のみを認証に使用する場合はどうでしょうか?
Discourse の機能の一つに、メールによるログインを禁止し、SSO を唯一の認証システムとして許可するものがあります。
「ローカルログインを有効化」と「メールによるローカルログインを有効化」の両方を false に設定し、さらに「メールを無効化」を「はい」に設定できます。
これだけでは単独の製品として機能しないかもしれませんが、より大規模なシステムの一部として機能します。もし「Discourse はメールなしでは動作しない」のであれば、なぜシステムを破綻させるような設定が存在するのでしょうか?

「あのバナーは、サイトが破損していることを全員に知らせるために表示されています」
再度申し上げますが、「全員」が知る必要はないと思います。
少なくとも私の意見では、スタッフや管理者だけが知っていれば十分です。製品の利用者まで知らせる必要はありません。

ちなみに、私たちが Discourse を使用しているのはまさにこの方法です。ログイン、ログアウト、登録、パスワードリセットなどは、メインのウェブサイトで行います。
Discourse へのアクセスは SSO 経由のみです。これにより、グループを通じて権限を簡単にプロビジョニングできます。

「いいね!」 1

@pfaffman 別の件ですが、そのメソッドについてどう思われましたか?

それは正しいレベル/方法(Discourse流のやり方として)でしょうか?

コードを詳しく探り、厳密な「Discourse流」のコーディング方法を抽出する時間があまりありませんでした。

ああ、なるほどかもしれませんね。実際に、SSO が有効になっているにもかかわらず、「メールは無効です」というバナーが表示されている Discourse インスタンス を見かけました。しかも、私はまだログインしていません。

SSO を使用すればパスワードのリセットを気にする必要がなくなるため、メール通知が届かないという点以外に、SSO が有効な場合にこのバナーを全員に表示する必要がある理由がわかりません。

少なくとも、SSO が有効でかつログインしていない場合はバナーを表示しないように更新するのはどうでしょうか?

「いいね!」 2

@blake 個人的には、これはスタッフのみに表示されるべき通知だと思います。一般ユーザーはこれに対して何らかの対応を取ることはできず、せいぜい「なぜこのメッセージが表示されるのか」「その意味は何か」というトピックを作成することくらいです。単に表示対象が間違っているだけですね :wink:

余談ですが、私は自分のサイトでは CSS を使ってこれを非表示にしましたが、このメッセージを表示させるべきケースも考えられるため、ディストリビューションのコードにおける正しい解決策にはなりません。