从用户体验(UX)角度来看,当所有电子邮件功能被禁用时,会出现一些奇怪的情况。我认为这些可以被视为缺陷。
- 包括非工作人员在内的所有用户都会收到一条关于系统不发送邮件的消息。似乎没有办法屏蔽此通知。我想不出用户需要一直收到此类提醒的理由。也许只对工作人员或管理员显示这条消息是可以接受的。这也许是某时的有意决定,但我找不到相关的讨论记录。
if (
this.siteSettings.disable_emails === "yes" ||
this.siteSettings.disable_emails === "non-staff"
) {
notices.push(
Notice.create({
text: I18n.t("emails_are_disabled"), // "All outgoing email has been globally disabled by an administrator. No email notifications of any kind will be sent."
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 却验证了所有人都会看到该通知。
顺便提一个小问题:我觉得所有的 test("when … 测试命名有点令人困惑。例如:“当启用时”实际上测试的是 disable_emails = "yes",虽然我知道这是为了测试设置变更,但这实际上测试的是“电子邮件已禁用”的情况,反之亦然,“当禁用时”测试的却是“电子邮件已启用”。我猜它们指的是设置的值而非最终效果,这可能是项目中的惯例。如果是这样,那完全没问题。只是对新来者来说有点奇怪。
- 无论
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>
在我的版本中,我做了类似这样的处理(我不确定你们是否会这样做,顺便一提):欢迎提出建议 ![]()
{{#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;
});
如果这些改进看起来值得采纳,请告诉我,我可以提交一个 Pull Request。
祝好