FIX: Prioritize names and usernames consistently (#16686)
The prioritize_username_in_ux site settings controls if the username or name will be prioritized in the user interface. On the user directory page the name was never displayed if the user and username were very similar, being completely different from all the other places where the username or name is displayed.
This commit is contained in:
parent
618a1ba571
commit
3206452d78
|
@ -1,7 +1,5 @@
|
||||||
import Component from "@ember/component";
|
import Component from "@ember/component";
|
||||||
import { computed } from "@ember/object";
|
import { computed } from "@ember/object";
|
||||||
import { formatUsername } from "discourse/lib/utilities";
|
|
||||||
import { normalize } from "discourse/components/user-info";
|
|
||||||
import { prioritizeNameInUx } from "discourse/lib/settings";
|
import { prioritizeNameInUx } from "discourse/lib/settings";
|
||||||
import { renderAvatar } from "discourse/helpers/user-avatar";
|
import { renderAvatar } from "discourse/helpers/user-avatar";
|
||||||
import { userPath } from "discourse/lib/url";
|
import { userPath } from "discourse/lib/url";
|
||||||
|
@ -9,13 +7,7 @@ import { userPath } from "discourse/lib/url";
|
||||||
export default Component.extend({
|
export default Component.extend({
|
||||||
usersTemplates: computed("users.[]", function () {
|
usersTemplates: computed("users.[]", function () {
|
||||||
return (this.users || []).map((user) => {
|
return (this.users || []).map((user) => {
|
||||||
let name = user.name;
|
const { name, username } = user;
|
||||||
let username = user.username;
|
|
||||||
let prioritizeName = prioritizeNameInUx(name);
|
|
||||||
let hideName = false;
|
|
||||||
if (name && normalize(username) === normalize(name)) {
|
|
||||||
hideName = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return {
|
return {
|
||||||
name,
|
name,
|
||||||
|
@ -26,9 +18,7 @@ export default Component.extend({
|
||||||
siteSettings: this.siteSettings,
|
siteSettings: this.siteSettings,
|
||||||
}),
|
}),
|
||||||
title: user.title || "",
|
title: user.title || "",
|
||||||
formatedUsername: formatUsername(username),
|
prioritizeName: prioritizeNameInUx(name),
|
||||||
prioritizeName,
|
|
||||||
hideName,
|
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
}),
|
}),
|
||||||
|
|
|
@ -4,10 +4,6 @@ import discourseComputed from "discourse-common/utils/decorators";
|
||||||
import { userPath } from "discourse/lib/url";
|
import { userPath } from "discourse/lib/url";
|
||||||
import { prioritizeNameInUx } from "discourse/lib/settings";
|
import { prioritizeNameInUx } from "discourse/lib/settings";
|
||||||
|
|
||||||
export function normalize(name) {
|
|
||||||
return name.replace(/[\-\_ \.]/g, "").toLowerCase();
|
|
||||||
}
|
|
||||||
|
|
||||||
export default Component.extend({
|
export default Component.extend({
|
||||||
classNameBindings: [":user-info", "size"],
|
classNameBindings: [":user-info", "size"],
|
||||||
attributeBindings: ["data-username"],
|
attributeBindings: ["data-username"],
|
||||||
|
@ -21,13 +17,6 @@ export default Component.extend({
|
||||||
return userPath(username);
|
return userPath(username);
|
||||||
},
|
},
|
||||||
|
|
||||||
@discourseComputed("user.name", "user.username")
|
|
||||||
name(name, username) {
|
|
||||||
if (name && normalize(username) !== normalize(name)) {
|
|
||||||
return name;
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
@discourseComputed("user.name")
|
@discourseComputed("user.name")
|
||||||
nameFirst(name) {
|
nameFirst(name) {
|
||||||
return prioritizeNameInUx(name);
|
return prioritizeNameInUx(name);
|
||||||
|
|
|
@ -15,9 +15,7 @@
|
||||||
</a>
|
</a>
|
||||||
</span>
|
</span>
|
||||||
<span class="name">
|
<span class="name">
|
||||||
{{#unless userTemplate.hideName}}
|
|
||||||
{{#if userTemplate.prioritizeName}}{{userTemplate.username}}{{else}}{{userTemplate.name}}{{/if}}
|
{{#if userTemplate.prioritizeName}}{{userTemplate.username}}{{else}}{{userTemplate.name}}{{/if}}
|
||||||
{{/unless}}
|
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="title">{{userTemplate.title}}</div>
|
<div class="title">{{userTemplate.title}}</div>
|
||||||
|
|
|
@ -12,19 +12,19 @@
|
||||||
<span class={{if nameFirst "name bold" "username bold"}}>
|
<span class={{if nameFirst "name bold" "username bold"}}>
|
||||||
{{#if includeLink}}
|
{{#if includeLink}}
|
||||||
<a href={{this.userPath}} data-user-card={{@user.username}}>
|
<a href={{this.userPath}} data-user-card={{@user.username}}>
|
||||||
{{if nameFirst this.name (format-username @user.username)}}
|
{{if nameFirst @user.name (format-username @user.username)}}
|
||||||
</a>
|
</a>
|
||||||
{{else}}
|
{{else}}
|
||||||
{{if nameFirst this.name (format-username @user.username)}}
|
{{if nameFirst @user.name (format-username @user.username)}}
|
||||||
{{/if}}
|
{{/if}}
|
||||||
</span>
|
</span>
|
||||||
<span class={{if nameFirst "username margin" "name margin"}}>
|
<span class={{if nameFirst "username margin" "name margin"}}>
|
||||||
{{#if includeLink}}
|
{{#if includeLink}}
|
||||||
<a href={{this.userPath}} data-user-card={{@user.username}}>
|
<a href={{this.userPath}} data-user-card={{@user.username}}>
|
||||||
{{if nameFirst (format-username @user.username) this.name}}
|
{{if nameFirst (format-username @user.username) @user.name}}
|
||||||
</a>
|
</a>
|
||||||
{{else}}
|
{{else}}
|
||||||
{{if nameFirst (format-username @user.username) this.name}}
|
{{if nameFirst (format-username @user.username) @user.name}}
|
||||||
{{/if}}
|
{{/if}}
|
||||||
</span>
|
</span>
|
||||||
{{plugin-outlet name="after-user-name" tagName="span" connectorTagName="span" args=(hash user=user)}}
|
{{plugin-outlet name="after-user-name" tagName="span" connectorTagName="span" args=(hash user=user)}}
|
||||||
|
|
|
@ -2,11 +2,43 @@ import componentTest, {
|
||||||
setupRenderingTest,
|
setupRenderingTest,
|
||||||
} from "discourse/tests/helpers/component-test";
|
} from "discourse/tests/helpers/component-test";
|
||||||
import hbs from "htmlbars-inline-precompile";
|
import hbs from "htmlbars-inline-precompile";
|
||||||
import { discourseModule, exists } from "discourse/tests/helpers/qunit-helpers";
|
import {
|
||||||
|
discourseModule,
|
||||||
|
exists,
|
||||||
|
query,
|
||||||
|
} from "discourse/tests/helpers/qunit-helpers";
|
||||||
|
|
||||||
discourseModule("Integration | Component | user-info", function (hooks) {
|
discourseModule("Integration | Component | user-info", function (hooks) {
|
||||||
setupRenderingTest(hooks);
|
setupRenderingTest(hooks);
|
||||||
|
|
||||||
|
componentTest("prioritized name", {
|
||||||
|
template: hbs`{{user-info user=currentUser}}`,
|
||||||
|
|
||||||
|
beforeEach() {
|
||||||
|
this.siteSettings.prioritize_username_in_ux = false;
|
||||||
|
this.currentUser.name = "Evil Trout";
|
||||||
|
},
|
||||||
|
|
||||||
|
async test(assert) {
|
||||||
|
assert.equal(query(".name.bold").innerText.trim(), "Evil Trout");
|
||||||
|
assert.equal(query(".username.margin").innerText.trim(), "eviltrout");
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
componentTest("prioritized username", {
|
||||||
|
template: hbs`{{user-info user=currentUser}}`,
|
||||||
|
|
||||||
|
beforeEach() {
|
||||||
|
this.siteSettings.prioritize_username_in_ux = true;
|
||||||
|
this.currentUser.name = "Evil Trout";
|
||||||
|
},
|
||||||
|
|
||||||
|
async test(assert) {
|
||||||
|
assert.equal(query(".username.bold").innerText.trim(), "eviltrout");
|
||||||
|
assert.equal(query(".name.margin").innerText.trim(), "Evil Trout");
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
componentTest("includeLink", {
|
componentTest("includeLink", {
|
||||||
template: hbs`{{user-info user=currentUser includeLink=includeLink}}`,
|
template: hbs`{{user-info user=currentUser includeLink=includeLink}}`,
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue