Skip to content

Commit bb50312

Browse files
authored
DEV: Add transformers for customizing post users popup display names (discourse#40954)
- Adds value transformers to allow plugins to customize how user names and usernames are displayed in the post users popup.
1 parent fc5b4e1 commit bb50312

3 files changed

Lines changed: 73 additions & 3 deletions

File tree

frontend/discourse/app/components/post/menu/post-users-menu.gjs

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import didInsert from "@ember/render-modifiers/modifiers/did-insert";
55
import { schedule } from "@ember/runloop";
66
import { service } from "@ember/service";
77
import { trustHTML } from "@ember/template";
8+
import { applyValueTransformer } from "discourse/lib/transformer";
89
import DLoadMore from "discourse/ui-kit/d-load-more";
910
import DUserAvatar from "discourse/ui-kit/d-user-avatar";
1011
import DUserLink from "discourse/ui-kit/d-user-link";
@@ -39,10 +40,20 @@ export default class PostUsersMenu extends Component {
3940
@tracked bodyMinHeight = null;
4041

4142
displayName = (user) => {
43+
let defaultName;
4244
if (user.name && !this.siteSettings.prioritize_username_in_ux) {
43-
return user.name;
45+
defaultName = user.name;
46+
} else {
47+
defaultName = user.username;
4448
}
45-
return user.username;
49+
return applyValueTransformer("post-user-display-name", defaultName, {
50+
user,
51+
});
52+
};
53+
displayUsername = (user) => {
54+
return applyValueTransformer("post-user-display-username", user.username, {
55+
user,
56+
});
4657
};
4758
resetAndReload = () => {
4859
this.users = [];
@@ -150,7 +161,7 @@ export default class PostUsersMenu extends Component {
150161
@username={{user.username}}
151162
class="post-users-popup__username"
152163
>
153-
@{{user.username}}
164+
@{{this.displayUsername user}}
154165
</DUserLink>
155166
{{/unless}}
156167
</div>

frontend/discourse/app/lib/registry/transformers.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,8 @@ export const VALUE_TRANSFORMERS = Object.freeze([
104104
"post-small-action-class",
105105
"post-small-action-custom-component",
106106
"post-small-action-icon",
107+
"post-user-display-name",
108+
"post-user-display-username",
107109
"poster-name-class",
108110
"poster-name-icons",
109111
"poster-name-user-title",

frontend/discourse/tests/integration/components/post/menu/post-users-menu-test.gjs

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { render, settled, waitFor, waitUntil } from "@ember/test-helpers";
22
import { module, test } from "qunit";
33
import PostUsersMenu from "discourse/components/post/menu/post-users-menu";
4+
import { withPluginApi } from "discourse/lib/plugin-api";
45
import { setupRenderingTest } from "discourse/tests/helpers/component-test";
56
import stubIntersectionObserver from "discourse/tests/helpers/stub-intersection-observer";
67
import {
@@ -183,5 +184,61 @@ module(
183184
await renderPromise;
184185
await settled();
185186
});
187+
188+
test("can transform the display name via post-user-display-name transformer", async function (assert) {
189+
this.siteSettings.prioritize_username_in_ux = false;
190+
191+
withPluginApi((api) => {
192+
api.registerValueTransformer(
193+
"post-user-display-name",
194+
({ value, context }) => {
195+
if (context.user.id === 1) {
196+
return "Custom Name";
197+
}
198+
return value;
199+
}
200+
);
201+
});
202+
203+
const fetchUsers = () =>
204+
Promise.resolve({ users: makeUsers(2), canLoadMore: false });
205+
206+
await renderMenu({ fetchUsers });
207+
208+
assert
209+
.dom(".post-users-popup__item:nth-child(1) .post-users-popup__name")
210+
.hasText("Custom Name", "first user has custom name");
211+
assert
212+
.dom(".post-users-popup__item:nth-child(2) .post-users-popup__name")
213+
.hasText("User 2", "second user has default name");
214+
});
215+
216+
test("can transform the username via post-user-display-username transformer", async function (assert) {
217+
this.siteSettings.prioritize_username_in_ux = false;
218+
219+
withPluginApi((api) => {
220+
api.registerValueTransformer(
221+
"post-user-display-username",
222+
({ value, context }) => {
223+
if (context.user.id === 1) {
224+
return "custom_username";
225+
}
226+
return value;
227+
}
228+
);
229+
});
230+
231+
const fetchUsers = () =>
232+
Promise.resolve({ users: makeUsers(2), canLoadMore: false });
233+
234+
await renderMenu({ fetchUsers });
235+
236+
assert
237+
.dom(".post-users-popup__item:nth-child(1) .post-users-popup__username")
238+
.hasText("@custom_username", "first user has custom username");
239+
assert
240+
.dom(".post-users-popup__item:nth-child(2) .post-users-popup__username")
241+
.hasText("@u2", "second user has default username");
242+
});
186243
}
187244
);

0 commit comments

Comments
 (0)